Skip to contentSkip to conversation

ide: don't try to unregister interfaces if 'initializing' in ide_register_hw()

PATCH In review Bartlomiej Zolnierkiewicz 2 participants 2 messages Nov 18, 2007 – Dec 7, 2007 libata

lore
Share & tools
lore
#0 lore raw

PATCH 8/21 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.

---
 drivers/ide/ide.c |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/ide/ide.c +10 -2
Index: b/drivers/ide/ide.c
===================================================================
@@ -694,6 +694,15 @@ int ide_register_hw(hw_regs_t *hw, void 
 	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 
 			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++)
Acked-by on v1 8/21
#1 lore raw
Quoted 37 lines · Bartlomiej Zolnierkiewicz

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

Quoted 6 lines

* au1xxx-ide
- MIPS && SOC_AU1200 specific => no ISA

and use ide_find_port() helper to find free ide_hwifs[] slot.

MBR, Sergei