]> err.no Git - linux-2.6/commitdiff
ide: move hwif_register() call out of ide_probe_port()
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 1 Feb 2008 22:09:36 +0000 (23:09 +0100)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 1 Feb 2008 22:09:36 +0000 (23:09 +0100)
* Add BUG_ON(hwif->present) at the start of ide_probe_port().

* Move hwif_register() call (along with setting hwif->present) from
  ide_probe_port() to ide_device_add_all().

  As a result the port will be registered with the device tree _after_:
  - probing both devices (if both are present)
  - port reset (if hwif->reset is set)
  - restoring local IRQs state and re-enabling port IRQ

While at it:

* Rename hwif_register() to ide_register_port().

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-probe.c

index 298f398d0fd4ae095d7626e2f73430c91ea25bab..98a8af44bf644bea97343a4ee3071df19ddc9d57 100644 (file)
@@ -613,7 +613,7 @@ static void hwif_release_dev (struct device *dev)
        complete(&hwif->gendev_rel_comp);
 }
 
-static void hwif_register (ide_hwif_t *hwif)
+static void ide_register_port(ide_hwif_t *hwif)
 {
        int ret;
 
@@ -742,7 +742,9 @@ static int ide_probe_port(ide_hwif_t *hwif)
 {
        unsigned long flags;
        unsigned int irqd;
-       int unit;
+       int unit, rc = -ENODEV;
+
+       BUG_ON(hwif->present);
 
        if (hwif->noprobe)
                return -EACCES;
@@ -767,14 +769,8 @@ static int ide_probe_port(ide_hwif_t *hwif)
                ide_drive_t *drive = &hwif->drives[unit];
                drive->dn = (hwif->channel ? 2 : 0) + unit;
                (void) probe_for_drive(drive);
-               if (drive->present && !hwif->present) {
-                       hwif->present = 1;
-                       if (hwif->chipset != ide_4drives ||
-                           !hwif->mate || 
-                           !hwif->mate->present) {
-                               hwif_register(hwif);
-                       }
-               }
+               if (drive->present)
+                       rc = 0;
        }
        if (hwif->io_ports[IDE_CONTROL_OFFSET] && hwif->reset) {
                printk(KERN_WARNING "%s: reset\n", hwif->name);
@@ -791,10 +787,7 @@ static int ide_probe_port(ide_hwif_t *hwif)
        if (irqd)
                enable_irq(irqd);
 
-       if (!hwif->present)
-               return -ENODEV;
-
-       return 0;
+       return rc;
 }
 
 static void ide_port_tune_devices(ide_hwif_t *hwif)
@@ -1319,6 +1312,12 @@ int ide_device_add_all(u8 *idx)
                        continue;
                }
 
+               hwif->present = 1;
+
+               if (hwif->chipset != ide_4drives || !hwif->mate ||
+                   !hwif->mate->present)
+                       ide_register_port(hwif);
+
                ide_port_tune_devices(hwif);
        }