aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-01-26 14:13:03 -0500
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-01-26 14:13:03 -0500
commit795d74b51a853e1f5f2c81baf6666836a3866f08 (patch)
tree85e83e27ea864be51959774f8a3a00dae814a5e6 /drivers/ide/ide.c
parentf01393e48c44e30f7c9a36c8b98a07b0232580fe (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/ide.c')
-rw-r--r--drivers/ide/ide.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index 0d7328e0fb96..8ef521f66f87 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 *),
694 int index, retry = 1; 694 int index, retry = 1;
695 ide_hwif_t *hwif; 695 ide_hwif_t *hwif;
696 696
697 if (initializing) {
698 hwif = ide_find_port(hw->io_ports[IDE_DATA_OFFSET]);
699 if (hwif) {
700 index = hwif->index;
701 goto found;
702 }
703 return -1;
704 }
705
697 do { 706 do {
698 for (index = 0; index < MAX_HWIFS; ++index) { 707 for (index = 0; index < MAX_HWIFS; ++index) {
699 hwif = &ide_hwifs[index]; 708 hwif = &ide_hwifs[index];
@@ -704,8 +713,7 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *),
704 hwif = &ide_hwifs[index]; 713 hwif = &ide_hwifs[index];
705 if (hwif->hold) 714 if (hwif->hold)
706 continue; 715 continue;
707 if ((!hwif->present && !hwif->mate && !initializing) || 716 if (!hwif->present && hwif->mate == NULL)
708 (!hwif->io_ports[IDE_DATA_OFFSET] && initializing))
709 goto found; 717 goto found;
710 } 718 }
711 for (index = 0; index < MAX_HWIFS; index++) 719 for (index = 0; index < MAX_HWIFS; index++)