linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / ide / ide-probe.c
index 9cadf01..427d1c2 100644 (file)
@@ -33,6 +33,7 @@
 
 #undef REALLY_SLOW_IO          /* most systems can safely undef this */
 
+#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/string.h>
@@ -46,6 +47,7 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/ide.h>
+#include <linux/devfs_fs_kernel.h>
 #include <linux/spinlock.h>
 #include <linux/kmod.h>
 #include <linux/pci.h>
@@ -856,15 +858,6 @@ static void probe_hwif(ide_hwif_t *hwif)
                        }
                }
        }
-
-       for (unit = 0; unit < MAX_DRIVES; ++unit) {
-               ide_drive_t *drive = &hwif->drives[unit];
-
-               if (hwif->no_io_32bit)
-                       drive->no_io_32bit = 1;
-               else
-                       drive->no_io_32bit = drive->id->dword_io ? 1 : 0;
-       }
 }
 
 static int hwif_init(ide_hwif_t *hwif);
@@ -1004,7 +997,7 @@ static int ide_init_queue(ide_drive_t *drive)
  * and irq serialization situations.  This is somewhat complex because
  * it handles static as well as dynamic (PCMCIA) IDE interfaces.
  *
- * The IRQF_DISABLED in sa_flags means ide_intr() is always entered with
+ * The SA_INTERRUPT in sa_flags means ide_intr() is always entered with
  * interrupts completely disabled.  This can be bad for interrupt latency,
  * but anything else has led to problems on some machines.  We re-enable
  * interrupts as much as we can safely do in most places.
@@ -1090,15 +1083,15 @@ static int init_irq (ide_hwif_t *hwif)
         * Allocate the irq, if not already obtained for another hwif
         */
        if (!match || match->irq != hwif->irq) {
-               int sa = IRQF_DISABLED;
+               int sa = SA_INTERRUPT;
 #if defined(__mc68000__) || defined(CONFIG_APUS)
-               sa = IRQF_SHARED;
+               sa = SA_SHIRQ;
 #endif /* __mc68000__ || CONFIG_APUS */
 
                if (IDE_CHIPSET_IS_PCI(hwif->chipset)) {
-                       sa = IRQF_SHARED;
+                       sa = SA_SHIRQ;
 #ifndef CONFIG_IDEPCI_SHARE_IRQ
-                       sa |= IRQF_DISABLED;
+                       sa |= SA_INTERRUPT;
 #endif /* CONFIG_IDEPCI_SHARE_IRQ */
                }
 
@@ -1136,11 +1129,16 @@ static int init_irq (ide_hwif_t *hwif)
                spin_unlock_irq(&ide_lock);
        }
 
-#if !defined(__mc68000__) && !defined(CONFIG_APUS)
+#if !defined(__mc68000__) && !defined(CONFIG_APUS) && !defined(__sparc__)
        printk("%s at 0x%03lx-0x%03lx,0x%03lx on irq %d", hwif->name,
                hwif->io_ports[IDE_DATA_OFFSET],
                hwif->io_ports[IDE_DATA_OFFSET]+7,
                hwif->io_ports[IDE_CONTROL_OFFSET], hwif->irq);
+#elif defined(__sparc__)
+       printk("%s at 0x%03lx-0x%03lx,0x%03lx on irq %s", hwif->name,
+               hwif->io_ports[IDE_DATA_OFFSET],
+               hwif->io_ports[IDE_DATA_OFFSET]+7,
+               hwif->io_ports[IDE_CONTROL_OFFSET], __irq_itoa(hwif->irq));
 #else
        printk("%s at 0x%08lx on irq %d", hwif->name,
                hwif->io_ports[IDE_DATA_OFFSET], hwif->irq);
@@ -1277,6 +1275,10 @@ static void drive_release_dev (struct device *dev)
        ide_drive_t *drive = container_of(dev, ide_drive_t, gendev);
 
        spin_lock_irq(&ide_lock);
+       if (drive->devfs_name[0] != '\0') {
+               devfs_remove(drive->devfs_name);
+               drive->devfs_name[0] = '\0';
+       }
        ide_remove_drive_from_hwgroup(drive);
        kfree(drive->id);
        drive->id = NULL;
@@ -1310,6 +1312,12 @@ static void init_gendisk (ide_hwif_t *hwif)
                drive->gendev.bus = &ide_bus_type;
                drive->gendev.driver_data = drive;
                drive->gendev.release = drive_release_dev;
+               if (drive->present) {
+                       sprintf(drive->devfs_name, "ide/host%d/bus%d/target%d/lun%d",
+                               (hwif->channel && hwif->mate) ?
+                               hwif->mate->index : hwif->index,
+                               hwif->channel, unit, drive->lun);
+               }
        }
        blk_register_region(MKDEV(hwif->major, 0), MAX_DRIVES << PARTN_BITS,
                        THIS_MODULE, ata_probe, ata_lock, hwif);