This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / drivers / ide / ide-probe.c
index 56fd86f..24e8b03 100644 (file)
@@ -180,6 +180,12 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)
        if (cmd == WIN_PIDENTIFY) {
                u8 type = (id->config >> 8) & 0x1f;
                printk("ATAPI ");
+#ifdef CONFIG_BLK_DEV_PDC4030
+               if (hwif->channel == 1 && hwif->chipset == ide_pdc4030) {
+                       printk(" -- not supported on 2nd Promise port\n");
+                       goto err_misc;
+               }
+#endif /* CONFIG_BLK_DEV_PDC4030 */
                switch (type) {
                        case ide_floppy:
                                if (!strstr(id->model, "CD-ROM")) {
@@ -291,9 +297,13 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
                /* disable dma & overlap */
                hwif->OUTB(0, IDE_FEATURE_REG);
 
-       /* ask drive for ID */
-       hwif->OUTB(cmd, IDE_COMMAND_REG);
-
+       if (hwif->identify != NULL) {
+               if (hwif->identify(drive))
+                       return 1;
+       } else {
+               /* ask drive for ID */
+               hwif->OUTB(cmd, IDE_COMMAND_REG);
+       }
        timeout = ((cmd == WIN_IDENTIFY) ? WAIT_WORSTCASE : WAIT_PIDENTIFY) / 2;
        timeout += jiffies;
        do {
@@ -662,33 +672,32 @@ static int wait_hwif_ready(ide_hwif_t *hwif)
  *     and PCMCIA sometimes.
  */
 
-void ide_undecoded_slave(ide_hwif_t *hwif)
+void ide_undecoded_slave(ide_hwif_t *hwif) 
 {
        ide_drive_t *drive0 = &hwif->drives[0];
        ide_drive_t *drive1 = &hwif->drives[1];
-
+       
        if (drive0->present == 0 || drive1->present == 0)
-               return;
-
-       /* If the models don't match they are not the same product */
+                       return;
+               
+       /* If the models don't match they are not the same product */   
        if (strcmp(drive0->id->model, drive1->id->model))
                return;
-
        /* Serial numbers do not match */
-       if (strncmp(drive0->id->serial_no, drive1->id->serial_no, 20))
+       if(strncmp(drive0->id->serial_no, drive1->id->serial_no, 20))
                return;
-
        /* No serial number, thankfully very rare for CF */
        if (drive0->id->serial_no[0] == 0)
                return;
-
+       /* Has a serial number but is warped */
+       if (!strstr(drive0->id->model, "Integrated Technology Express"))
+               return;
        /* Appears to be an IDE flash adapter with decode bugs */
        printk(KERN_WARNING "ide-probe: ignoring undecoded slave\n");
-
        drive1->present = 0;
 }
 
-EXPORT_SYMBOL_GPL(ide_undecoded_slave);
+EXPORT_SYMBOL(ide_undecoded_slave);
 
 /*
  * This routine only knows how to look for drive units 0 and 1
@@ -704,6 +713,9 @@ static void probe_hwif(ide_hwif_t *hwif)
                return;
 
        if ((hwif->chipset != ide_4drives || !hwif->mate || !hwif->mate->present) &&
+#ifdef CONFIG_BLK_DEV_PDC4030
+           (hwif->chipset != ide_pdc4030 || hwif->channel == 0) &&
+#endif /* CONFIG_BLK_DEV_PDC4030 */
            (ide_hwif_request_regions(hwif))) {
                u16 msgout = 0;
                for (unit = 0; unit < MAX_DRIVES; ++unit) {
@@ -838,14 +850,14 @@ static int hwif_init(ide_hwif_t *hwif);
 int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
 {
        probe_hwif(hwif);
-
-       if (fixup)
+       if(fixup != NULL)
                fixup(hwif);
-
        hwif_init(hwif);
 
        if (hwif->present) {
                u16 unit = 0;
+
+                       
                for (unit = 0; unit < MAX_DRIVES; ++unit) {
                        ide_drive_t *drive = &hwif->drives[unit];
                        /* For now don't attach absent drives, we may
@@ -859,6 +871,8 @@ int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif)
        return 0;
 }
 
+EXPORT_SYMBOL(probe_hwif_init_with_fixup);
+
 int probe_hwif_init(ide_hwif_t *hwif)
 {
        return probe_hwif_init_with_fixup(hwif, NULL);
@@ -1150,7 +1164,7 @@ static int ata_lock(dev_t dev, void *data)
 
 extern ide_driver_t idedefault_driver;
 
-static struct kobject *ata_probe(dev_t dev, int *part, void *data)
+struct kobject *ata_probe(dev_t dev, int *part, void *data)
 {
        ide_hwif_t *hwif = data;
        int unit = *part >> PARTN_BITS;
@@ -1269,16 +1283,6 @@ static int hwif_init(ide_hwif_t *hwif)
        if (register_blkdev(hwif->major, hwif->name))
                return 0;
 
-       if (!hwif->sg_max_nents)
-               hwif->sg_max_nents = PRD_ENTRIES;
-
-       hwif->sg_table = kmalloc(sizeof(struct scatterlist)*hwif->sg_max_nents,
-                                GFP_KERNEL);
-       if (!hwif->sg_table) {
-               printk(KERN_ERR "%s: unable to allocate SG table.\n", hwif->name);
-               goto out;
-       }
-
        if (alloc_disks(hwif) < 0)
                goto out;
        
@@ -1328,6 +1332,9 @@ int ideprobe_init (void)
        for (index = 0; index < MAX_HWIFS; ++index)
                probe[index] = !ide_hwifs[index].present;
 
+       /*
+        * Probe for drives in the usual way.. CMOS/BIOS, then poke at ports
+        */
        for (index = 0; index < MAX_HWIFS; ++index)
                if (probe[index])
                        probe_hwif(&ide_hwifs[index]);