diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-01-26 20:13:03 +0100 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-01-26 20:13:03 +0100 |
commit | 795d74b51a853e1f5f2c81baf6666836a3866f08 (patch) | |
tree | 85e83e27ea864be51959774f8a3a00dae814a5e6 /drivers/ide | |
parent | f01393e48c44e30f7c9a36c8b98a07b0232580fe (diff) |
ide: don't try to unregister interfaces if 'initializing' in ide_register_hw()
Host drivers using ide_register_hw() and 'initializing == 1':
* ide-pnp
- depends on ISA
* ide_arm
- ARM arch specific
- initialized before all other host drivers
* ide-cris
- CRIS arch specific => IDE_ARCH_OBSOLETE_INIT is not defined
- broken
* ide-h8300
- H8300 arch specific => IDE_ARCH_OBSOLETE_INIT is not defined, no PCI
* buddha/q40/gayle/macide/falconide
- M68K arch specific => IDE_ARCH_OBSOLETE_INIT is not defined, no PCI
Since the only host drivers which probe interfaces before the above ones are:
* ali14xx/dtc2278/ht6560b/qd65xx/umc8672
- depend on ISA
- require IDE_ARCH_OBSOLETE_INIT=y to work
* PCI ones
- depend on PCI
don't try to unregister interfaces if 'initializing == 1' in ide_register_hw()
(it is possible that built-in host drivers will claim all IDE interfaces but
later ide-pnp host driver will try to unregister them - this change fixes it).
Also skip hwif->hold check if 'initializing == 1' since it is set only by:
* pmac
- PPC && PMAC specific => no ISA
* au1xxx-ide
- MIPS && SOC_AU1200 specific => no ISA
and use ide_find_port() helper to find free ide_hwifs[] slot.
Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/ide.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 0d7328e0fb9..8ef521f66f8 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -694,6 +694,15 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *), int index, retry = 1; ide_hwif_t *hwif; + if (initializing) { + hwif = ide_find_port(hw->io_ports[IDE_DATA_OFFSET]); + if (hwif) { + index = hwif->index; + goto found; + } + return -1; + } + do { for (index = 0; index < MAX_HWIFS; ++index) { hwif = &ide_hwifs[index]; @@ -704,8 +713,7 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *), hwif = &ide_hwifs[index]; if (hwif->hold) continue; - if ((!hwif->present && !hwif->mate && !initializing) || - (!hwif->io_ports[IDE_DATA_OFFSET] && initializing)) + if (!hwif->present && hwif->mate == NULL) goto found; } for (index = 0; index < MAX_HWIFS; index++) |