diff options
Diffstat (limited to 'drivers/ide/ide-probe.c')
-rw-r--r-- | drivers/ide/ide-probe.c | 104 |
1 files changed, 56 insertions, 48 deletions
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 237b9871f80a..57c741876536 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -121,7 +121,8 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd) | |||
121 | /* read 512 bytes of id info */ | 121 | /* read 512 bytes of id info */ |
122 | hwif->tp_ops->input_data(drive, NULL, id, SECTOR_SIZE); | 122 | hwif->tp_ops->input_data(drive, NULL, id, SECTOR_SIZE); |
123 | 123 | ||
124 | drive->id_read = 1; | 124 | drive->dev_flags |= IDE_DFLAG_ID_READ; |
125 | |||
125 | local_irq_enable(); | 126 | local_irq_enable(); |
126 | #ifdef DEBUG | 127 | #ifdef DEBUG |
127 | printk(KERN_INFO "%s: dumping identify data\n", drive->name); | 128 | printk(KERN_INFO "%s: dumping identify data\n", drive->name); |
@@ -153,8 +154,8 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd) | |||
153 | 154 | ||
154 | printk(KERN_INFO "%s: %s, ", drive->name, m); | 155 | printk(KERN_INFO "%s: %s, ", drive->name, m); |
155 | 156 | ||
156 | drive->present = 1; | 157 | drive->dev_flags |= IDE_DFLAG_PRESENT; |
157 | drive->dead = 0; | 158 | drive->dev_flags &= ~IDE_DFLAG_DEAD; |
158 | 159 | ||
159 | /* | 160 | /* |
160 | * Check for an ATAPI device | 161 | * Check for an ATAPI device |
@@ -172,14 +173,14 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd) | |||
172 | printk(KERN_CONT "cdrom or floppy?, assuming "); | 173 | printk(KERN_CONT "cdrom or floppy?, assuming "); |
173 | if (drive->media != ide_cdrom) { | 174 | if (drive->media != ide_cdrom) { |
174 | printk(KERN_CONT "FLOPPY"); | 175 | printk(KERN_CONT "FLOPPY"); |
175 | drive->removable = 1; | 176 | drive->dev_flags |= IDE_DFLAG_REMOVABLE; |
176 | break; | 177 | break; |
177 | } | 178 | } |
178 | } | 179 | } |
179 | /* Early cdrom models used zero */ | 180 | /* Early cdrom models used zero */ |
180 | type = ide_cdrom; | 181 | type = ide_cdrom; |
181 | case ide_cdrom: | 182 | case ide_cdrom: |
182 | drive->removable = 1; | 183 | drive->dev_flags |= IDE_DFLAG_REMOVABLE; |
183 | #ifdef CONFIG_PPC | 184 | #ifdef CONFIG_PPC |
184 | /* kludge for Apple PowerBook internal zip */ | 185 | /* kludge for Apple PowerBook internal zip */ |
185 | if (!strstr(m, "CD-ROM") && strstr(m, "ZIP")) { | 186 | if (!strstr(m, "CD-ROM") && strstr(m, "ZIP")) { |
@@ -195,7 +196,7 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd) | |||
195 | break; | 196 | break; |
196 | case ide_optical: | 197 | case ide_optical: |
197 | printk(KERN_CONT "OPTICAL"); | 198 | printk(KERN_CONT "OPTICAL"); |
198 | drive->removable = 1; | 199 | drive->dev_flags |= IDE_DFLAG_REMOVABLE; |
199 | break; | 200 | break; |
200 | default: | 201 | default: |
201 | printk(KERN_CONT "UNKNOWN (type %d)", type); | 202 | printk(KERN_CONT "UNKNOWN (type %d)", type); |
@@ -216,7 +217,7 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd) | |||
216 | 217 | ||
217 | /* CF devices are *not* removable in Linux definition of the term */ | 218 | /* CF devices are *not* removable in Linux definition of the term */ |
218 | if (is_cfa == 0 && (id[ATA_ID_CONFIG] & (1 << 7))) | 219 | if (is_cfa == 0 && (id[ATA_ID_CONFIG] & (1 << 7))) |
219 | drive->removable = 1; | 220 | drive->dev_flags |= IDE_DFLAG_REMOVABLE; |
220 | 221 | ||
221 | drive->media = ide_disk; | 222 | drive->media = ide_disk; |
222 | 223 | ||
@@ -226,7 +227,7 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd) | |||
226 | 227 | ||
227 | err_misc: | 228 | err_misc: |
228 | kfree(id); | 229 | kfree(id); |
229 | drive->present = 0; | 230 | drive->dev_flags &= ~IDE_DFLAG_PRESENT; |
230 | return; | 231 | return; |
231 | } | 232 | } |
232 | 233 | ||
@@ -426,16 +427,15 @@ static int do_probe (ide_drive_t *drive, u8 cmd) | |||
426 | ide_hwif_t *hwif = HWIF(drive); | 427 | ide_hwif_t *hwif = HWIF(drive); |
427 | const struct ide_tp_ops *tp_ops = hwif->tp_ops; | 428 | const struct ide_tp_ops *tp_ops = hwif->tp_ops; |
428 | int rc; | 429 | int rc; |
429 | u8 stat; | 430 | u8 present = !!(drive->dev_flags & IDE_DFLAG_PRESENT), stat; |
431 | |||
432 | /* avoid waiting for inappropriate probes */ | ||
433 | if (present && drive->media != ide_disk && cmd == ATA_CMD_ID_ATA) | ||
434 | return 4; | ||
430 | 435 | ||
431 | if (drive->present) { | ||
432 | /* avoid waiting for inappropriate probes */ | ||
433 | if (drive->media != ide_disk && cmd == ATA_CMD_ID_ATA) | ||
434 | return 4; | ||
435 | } | ||
436 | #ifdef DEBUG | 436 | #ifdef DEBUG |
437 | printk(KERN_INFO "probing for %s: present=%d, media=%d, probetype=%s\n", | 437 | printk(KERN_INFO "probing for %s: present=%d, media=%d, probetype=%s\n", |
438 | drive->name, drive->present, drive->media, | 438 | drive->name, present, drive->media, |
439 | (cmd == ATA_CMD_ID_ATA) ? "ATA" : "ATAPI"); | 439 | (cmd == ATA_CMD_ID_ATA) ? "ATA" : "ATAPI"); |
440 | #endif | 440 | #endif |
441 | 441 | ||
@@ -446,7 +446,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd) | |||
446 | SELECT_DRIVE(drive); | 446 | SELECT_DRIVE(drive); |
447 | msleep(50); | 447 | msleep(50); |
448 | 448 | ||
449 | if (ide_read_device(drive) != drive->select.all && !drive->present) { | 449 | if (ide_read_device(drive) != drive->select.all && present == 0) { |
450 | if (drive->select.b.unit != 0) { | 450 | if (drive->select.b.unit != 0) { |
451 | /* exit with drive0 selected */ | 451 | /* exit with drive0 selected */ |
452 | SELECT_DRIVE(&hwif->drives[0]); | 452 | SELECT_DRIVE(&hwif->drives[0]); |
@@ -460,7 +460,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd) | |||
460 | stat = tp_ops->read_status(hwif); | 460 | stat = tp_ops->read_status(hwif); |
461 | 461 | ||
462 | if (OK_STAT(stat, ATA_DRDY, ATA_BUSY) || | 462 | if (OK_STAT(stat, ATA_DRDY, ATA_BUSY) || |
463 | drive->present || cmd == ATA_CMD_ID_ATAPI) { | 463 | present || cmd == ATA_CMD_ID_ATAPI) { |
464 | /* send cmd and wait */ | 464 | /* send cmd and wait */ |
465 | if ((rc = try_to_identify(drive, cmd))) { | 465 | if ((rc = try_to_identify(drive, cmd))) { |
466 | /* failed: try again */ | 466 | /* failed: try again */ |
@@ -542,8 +542,8 @@ static void enable_nest (ide_drive_t *drive) | |||
542 | * and presents things to the user as needed. | 542 | * and presents things to the user as needed. |
543 | * | 543 | * |
544 | * Returns: 0 no device was found | 544 | * Returns: 0 no device was found |
545 | * 1 device was found (note: drive->present might | 545 | * 1 device was found |
546 | * still be 0) | 546 | * (note: IDE_DFLAG_PRESENT might still be not set) |
547 | */ | 547 | */ |
548 | 548 | ||
549 | static inline u8 probe_for_drive (ide_drive_t *drive) | 549 | static inline u8 probe_for_drive (ide_drive_t *drive) |
@@ -559,10 +559,10 @@ static inline u8 probe_for_drive (ide_drive_t *drive) | |||
559 | * Also note that 0 everywhere means "can't do X" | 559 | * Also note that 0 everywhere means "can't do X" |
560 | */ | 560 | */ |
561 | 561 | ||
562 | drive->dev_flags &= ~IDE_DFLAG_ID_READ; | ||
563 | |||
562 | drive->id = kzalloc(SECTOR_SIZE, GFP_KERNEL); | 564 | drive->id = kzalloc(SECTOR_SIZE, GFP_KERNEL); |
563 | drive->id_read = 0; | 565 | if (drive->id == NULL) { |
564 | if(drive->id == NULL) | ||
565 | { | ||
566 | printk(KERN_ERR "ide: out of memory for id data.\n"); | 566 | printk(KERN_ERR "ide: out of memory for id data.\n"); |
567 | return 0; | 567 | return 0; |
568 | } | 568 | } |
@@ -571,14 +571,14 @@ static inline u8 probe_for_drive (ide_drive_t *drive) | |||
571 | strcpy(m, "UNKNOWN"); | 571 | strcpy(m, "UNKNOWN"); |
572 | 572 | ||
573 | /* skip probing? */ | 573 | /* skip probing? */ |
574 | if (!drive->noprobe) { | 574 | if ((drive->dev_flags & IDE_DFLAG_NOPROBE) == 0) { |
575 | retry: | 575 | retry: |
576 | /* if !(success||timed-out) */ | 576 | /* if !(success||timed-out) */ |
577 | if (do_probe(drive, ATA_CMD_ID_ATA) >= 2) | 577 | if (do_probe(drive, ATA_CMD_ID_ATA) >= 2) |
578 | /* look for ATAPI device */ | 578 | /* look for ATAPI device */ |
579 | (void)do_probe(drive, ATA_CMD_ID_ATAPI); | 579 | (void)do_probe(drive, ATA_CMD_ID_ATAPI); |
580 | 580 | ||
581 | if (!drive->present) | 581 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) |
582 | /* drive not found */ | 582 | /* drive not found */ |
583 | return 0; | 583 | return 0; |
584 | 584 | ||
@@ -588,7 +588,7 @@ retry: | |||
588 | } | 588 | } |
589 | 589 | ||
590 | /* identification failed? */ | 590 | /* identification failed? */ |
591 | if (!drive->id_read) { | 591 | if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) { |
592 | if (drive->media == ide_disk) { | 592 | if (drive->media == ide_disk) { |
593 | printk(KERN_INFO "%s: non-IDE drive, CHS=%d/%d/%d\n", | 593 | printk(KERN_INFO "%s: non-IDE drive, CHS=%d/%d/%d\n", |
594 | drive->name, drive->cyl, | 594 | drive->name, drive->cyl, |
@@ -598,15 +598,17 @@ retry: | |||
598 | } else { | 598 | } else { |
599 | /* nuke it */ | 599 | /* nuke it */ |
600 | printk(KERN_WARNING "%s: Unknown device on bus refused identification. Ignoring.\n", drive->name); | 600 | printk(KERN_WARNING "%s: Unknown device on bus refused identification. Ignoring.\n", drive->name); |
601 | drive->present = 0; | 601 | drive->dev_flags &= ~IDE_DFLAG_PRESENT; |
602 | } | 602 | } |
603 | } | 603 | } |
604 | /* drive was found */ | 604 | /* drive was found */ |
605 | } | 605 | } |
606 | if(!drive->present) | 606 | |
607 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) | ||
607 | return 0; | 608 | return 0; |
609 | |||
608 | /* The drive wasn't being helpful. Add generic info only */ | 610 | /* The drive wasn't being helpful. Add generic info only */ |
609 | if (drive->id_read == 0) { | 611 | if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) { |
610 | generic_id(drive); | 612 | generic_id(drive); |
611 | return 1; | 613 | return 1; |
612 | } | 614 | } |
@@ -616,7 +618,7 @@ retry: | |||
616 | ide_disk_init_mult_count(drive); | 618 | ide_disk_init_mult_count(drive); |
617 | } | 619 | } |
618 | 620 | ||
619 | return drive->present; | 621 | return !!(drive->dev_flags & IDE_DFLAG_PRESENT); |
620 | } | 622 | } |
621 | 623 | ||
622 | static void hwif_release_dev(struct device *dev) | 624 | static void hwif_release_dev(struct device *dev) |
@@ -707,7 +709,8 @@ static int ide_port_wait_ready(ide_hwif_t *hwif) | |||
707 | ide_drive_t *drive = &hwif->drives[unit]; | 709 | ide_drive_t *drive = &hwif->drives[unit]; |
708 | 710 | ||
709 | /* Ignore disks that we will not probe for later. */ | 711 | /* Ignore disks that we will not probe for later. */ |
710 | if (!drive->noprobe || drive->present) { | 712 | if ((drive->dev_flags & IDE_DFLAG_NOPROBE) == 0 || |
713 | (drive->dev_flags & IDE_DFLAG_PRESENT)) { | ||
711 | SELECT_DRIVE(drive); | 714 | SELECT_DRIVE(drive); |
712 | hwif->tp_ops->set_irq(hwif, 1); | 715 | hwif->tp_ops->set_irq(hwif, 1); |
713 | mdelay(2); | 716 | mdelay(2); |
@@ -739,7 +742,7 @@ void ide_undecoded_slave(ide_drive_t *dev1) | |||
739 | { | 742 | { |
740 | ide_drive_t *dev0 = &dev1->hwif->drives[0]; | 743 | ide_drive_t *dev0 = &dev1->hwif->drives[0]; |
741 | 744 | ||
742 | if ((dev1->dn & 1) == 0 || dev0->present == 0) | 745 | if ((dev1->dn & 1) == 0 || (dev0->dev_flags & IDE_DFLAG_PRESENT) == 0) |
743 | return; | 746 | return; |
744 | 747 | ||
745 | /* If the models don't match they are not the same product */ | 748 | /* If the models don't match they are not the same product */ |
@@ -759,7 +762,7 @@ void ide_undecoded_slave(ide_drive_t *dev1) | |||
759 | /* Appears to be an IDE flash adapter with decode bugs */ | 762 | /* Appears to be an IDE flash adapter with decode bugs */ |
760 | printk(KERN_WARNING "ide-probe: ignoring undecoded slave\n"); | 763 | printk(KERN_WARNING "ide-probe: ignoring undecoded slave\n"); |
761 | 764 | ||
762 | dev1->present = 0; | 765 | dev1->dev_flags &= ~IDE_DFLAG_PRESENT; |
763 | } | 766 | } |
764 | 767 | ||
765 | EXPORT_SYMBOL_GPL(ide_undecoded_slave); | 768 | EXPORT_SYMBOL_GPL(ide_undecoded_slave); |
@@ -772,7 +775,8 @@ static int ide_probe_port(ide_hwif_t *hwif) | |||
772 | 775 | ||
773 | BUG_ON(hwif->present); | 776 | BUG_ON(hwif->present); |
774 | 777 | ||
775 | if (hwif->drives[0].noprobe && hwif->drives[1].noprobe) | 778 | if ((hwif->drives[0].dev_flags & IDE_DFLAG_NOPROBE) && |
779 | (hwif->drives[1].dev_flags & IDE_DFLAG_NOPROBE)) | ||
776 | return -EACCES; | 780 | return -EACCES; |
777 | 781 | ||
778 | /* | 782 | /* |
@@ -796,7 +800,7 @@ static int ide_probe_port(ide_hwif_t *hwif) | |||
796 | ide_drive_t *drive = &hwif->drives[unit]; | 800 | ide_drive_t *drive = &hwif->drives[unit]; |
797 | drive->dn = (hwif->channel ? 2 : 0) + unit; | 801 | drive->dn = (hwif->channel ? 2 : 0) + unit; |
798 | (void) probe_for_drive(drive); | 802 | (void) probe_for_drive(drive); |
799 | if (drive->present) | 803 | if (drive->dev_flags & IDE_DFLAG_PRESENT) |
800 | rc = 0; | 804 | rc = 0; |
801 | } | 805 | } |
802 | 806 | ||
@@ -820,17 +824,19 @@ static void ide_port_tune_devices(ide_hwif_t *hwif) | |||
820 | for (unit = 0; unit < MAX_DRIVES; unit++) { | 824 | for (unit = 0; unit < MAX_DRIVES; unit++) { |
821 | ide_drive_t *drive = &hwif->drives[unit]; | 825 | ide_drive_t *drive = &hwif->drives[unit]; |
822 | 826 | ||
823 | if (drive->present && port_ops && port_ops->quirkproc) | 827 | if (drive->dev_flags & IDE_DFLAG_PRESENT) { |
824 | port_ops->quirkproc(drive); | 828 | if (port_ops && port_ops->quirkproc) |
829 | port_ops->quirkproc(drive); | ||
830 | } | ||
825 | } | 831 | } |
826 | 832 | ||
827 | for (unit = 0; unit < MAX_DRIVES; ++unit) { | 833 | for (unit = 0; unit < MAX_DRIVES; ++unit) { |
828 | ide_drive_t *drive = &hwif->drives[unit]; | 834 | ide_drive_t *drive = &hwif->drives[unit]; |
829 | 835 | ||
830 | if (drive->present) { | 836 | if (drive->dev_flags & IDE_DFLAG_PRESENT) { |
831 | ide_set_max_pio(drive); | 837 | ide_set_max_pio(drive); |
832 | 838 | ||
833 | drive->nice1 = 1; | 839 | drive->dev_flags |= IDE_DFLAG_NICE1; |
834 | 840 | ||
835 | if (hwif->dma_ops) | 841 | if (hwif->dma_ops) |
836 | ide_set_dma(drive); | 842 | ide_set_dma(drive); |
@@ -840,10 +846,11 @@ static void ide_port_tune_devices(ide_hwif_t *hwif) | |||
840 | for (unit = 0; unit < MAX_DRIVES; ++unit) { | 846 | for (unit = 0; unit < MAX_DRIVES; ++unit) { |
841 | ide_drive_t *drive = &hwif->drives[unit]; | 847 | ide_drive_t *drive = &hwif->drives[unit]; |
842 | 848 | ||
843 | if (hwif->host_flags & IDE_HFLAG_NO_IO_32BIT) | 849 | if ((hwif->host_flags & IDE_HFLAG_NO_IO_32BIT) || |
844 | drive->no_io_32bit = 1; | 850 | drive->id[ATA_ID_DWORD_IO]) |
851 | drive->dev_flags |= IDE_DFLAG_NO_IO_32BIT; | ||
845 | else | 852 | else |
846 | drive->no_io_32bit = drive->id[ATA_ID_DWORD_IO] ? 1 : 0; | 853 | drive->dev_flags &= ~IDE_DFLAG_NO_IO_32BIT; |
847 | } | 854 | } |
848 | } | 855 | } |
849 | 856 | ||
@@ -957,7 +964,7 @@ static void ide_port_setup_devices(ide_hwif_t *hwif) | |||
957 | for (i = 0; i < MAX_DRIVES; i++) { | 964 | for (i = 0; i < MAX_DRIVES; i++) { |
958 | ide_drive_t *drive = &hwif->drives[i]; | 965 | ide_drive_t *drive = &hwif->drives[i]; |
959 | 966 | ||
960 | if (!drive->present) | 967 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) |
961 | continue; | 968 | continue; |
962 | 969 | ||
963 | if (ide_init_queue(drive)) { | 970 | if (ide_init_queue(drive)) { |
@@ -1151,12 +1158,13 @@ static struct kobject *ata_probe(dev_t dev, int *part, void *data) | |||
1151 | ide_hwif_t *hwif = data; | 1158 | ide_hwif_t *hwif = data; |
1152 | int unit = *part >> PARTN_BITS; | 1159 | int unit = *part >> PARTN_BITS; |
1153 | ide_drive_t *drive = &hwif->drives[unit]; | 1160 | ide_drive_t *drive = &hwif->drives[unit]; |
1154 | if (!drive->present) | 1161 | |
1162 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) | ||
1155 | return NULL; | 1163 | return NULL; |
1156 | 1164 | ||
1157 | if (drive->media == ide_disk) | 1165 | if (drive->media == ide_disk) |
1158 | request_module("ide-disk"); | 1166 | request_module("ide-disk"); |
1159 | if (drive->scsi) | 1167 | if (drive->dev_flags & IDE_DFLAG_SCSI) |
1160 | request_module("ide-scsi"); | 1168 | request_module("ide-scsi"); |
1161 | if (drive->media == ide_cdrom || drive->media == ide_optical) | 1169 | if (drive->media == ide_cdrom || drive->media == ide_optical) |
1162 | request_module("ide-cd"); | 1170 | request_module("ide-cd"); |
@@ -1246,7 +1254,7 @@ static void drive_release_dev (struct device *dev) | |||
1246 | ide_remove_drive_from_hwgroup(drive); | 1254 | ide_remove_drive_from_hwgroup(drive); |
1247 | kfree(drive->id); | 1255 | kfree(drive->id); |
1248 | drive->id = NULL; | 1256 | drive->id = NULL; |
1249 | drive->present = 0; | 1257 | drive->dev_flags &= ~IDE_DFLAG_PRESENT; |
1250 | /* Messed up locking ... */ | 1258 | /* Messed up locking ... */ |
1251 | spin_unlock_irq(&ide_lock); | 1259 | spin_unlock_irq(&ide_lock); |
1252 | blk_cleanup_queue(drive->queue); | 1260 | blk_cleanup_queue(drive->queue); |
@@ -1325,7 +1333,7 @@ static void hwif_register_devices(ide_hwif_t *hwif) | |||
1325 | struct device *dev = &drive->gendev; | 1333 | struct device *dev = &drive->gendev; |
1326 | int ret; | 1334 | int ret; |
1327 | 1335 | ||
1328 | if (!drive->present) | 1336 | if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) |
1329 | continue; | 1337 | continue; |
1330 | 1338 | ||
1331 | snprintf(dev->bus_id, BUS_ID_SIZE, "%u.%u", hwif->index, i); | 1339 | snprintf(dev->bus_id, BUS_ID_SIZE, "%u.%u", hwif->index, i); |
@@ -1352,9 +1360,9 @@ static void ide_port_init_devices(ide_hwif_t *hwif) | |||
1352 | if (hwif->host_flags & IDE_HFLAG_IO_32BIT) | 1360 | if (hwif->host_flags & IDE_HFLAG_IO_32BIT) |
1353 | drive->io_32bit = 1; | 1361 | drive->io_32bit = 1; |
1354 | if (hwif->host_flags & IDE_HFLAG_UNMASK_IRQS) | 1362 | if (hwif->host_flags & IDE_HFLAG_UNMASK_IRQS) |
1355 | drive->unmask = 1; | 1363 | drive->dev_flags |= IDE_DFLAG_UNMASK; |
1356 | if (hwif->host_flags & IDE_HFLAG_NO_UNMASK_IRQS) | 1364 | if (hwif->host_flags & IDE_HFLAG_NO_UNMASK_IRQS) |
1357 | drive->no_unmask = 1; | 1365 | drive->dev_flags |= IDE_DFLAG_NO_UNMASK; |
1358 | 1366 | ||
1359 | if (port_ops && port_ops->init_dev) | 1367 | if (port_ops && port_ops->init_dev) |
1360 | port_ops->init_dev(drive); | 1368 | port_ops->init_dev(drive); |