diff options
-rw-r--r-- | drivers/ide/ide-probe.c | 16 | ||||
-rw-r--r-- | drivers/ide/ide-xfer-mode.c | 6 | ||||
-rw-r--r-- | include/linux/ide.h | 6 |
3 files changed, 27 insertions, 1 deletions
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index f371b0de314f..fdd04bcd5568 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -1378,6 +1378,9 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
1378 | 1378 | ||
1379 | ide_init_port(hwif, i & 1, d); | 1379 | ide_init_port(hwif, i & 1, d); |
1380 | ide_port_cable_detect(hwif); | 1380 | ide_port_cable_detect(hwif); |
1381 | |||
1382 | hwif->port_flags |= IDE_PFLAG_PROBING; | ||
1383 | |||
1381 | ide_port_init_devices(hwif); | 1384 | ide_port_init_devices(hwif); |
1382 | } | 1385 | } |
1383 | 1386 | ||
@@ -1388,6 +1391,8 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
1388 | if (ide_probe_port(hwif) == 0) | 1391 | if (ide_probe_port(hwif) == 0) |
1389 | hwif->present = 1; | 1392 | hwif->present = 1; |
1390 | 1393 | ||
1394 | hwif->port_flags &= ~IDE_PFLAG_PROBING; | ||
1395 | |||
1391 | if ((hwif->host_flags & IDE_HFLAG_4DRIVES) == 0 || | 1396 | if ((hwif->host_flags & IDE_HFLAG_4DRIVES) == 0 || |
1392 | hwif->mate == NULL || hwif->mate->present == 0) { | 1397 | hwif->mate == NULL || hwif->mate->present == 0) { |
1393 | if (ide_register_port(hwif)) { | 1398 | if (ide_register_port(hwif)) { |
@@ -1569,11 +1574,20 @@ EXPORT_SYMBOL_GPL(ide_host_remove); | |||
1569 | 1574 | ||
1570 | void ide_port_scan(ide_hwif_t *hwif) | 1575 | void ide_port_scan(ide_hwif_t *hwif) |
1571 | { | 1576 | { |
1577 | int rc; | ||
1578 | |||
1572 | ide_port_apply_params(hwif); | 1579 | ide_port_apply_params(hwif); |
1573 | ide_port_cable_detect(hwif); | 1580 | ide_port_cable_detect(hwif); |
1581 | |||
1582 | hwif->port_flags |= IDE_PFLAG_PROBING; | ||
1583 | |||
1574 | ide_port_init_devices(hwif); | 1584 | ide_port_init_devices(hwif); |
1575 | 1585 | ||
1576 | if (ide_probe_port(hwif) < 0) | 1586 | rc = ide_probe_port(hwif); |
1587 | |||
1588 | hwif->port_flags &= ~IDE_PFLAG_PROBING; | ||
1589 | |||
1590 | if (rc < 0) | ||
1577 | return; | 1591 | return; |
1578 | 1592 | ||
1579 | hwif->present = 1; | 1593 | hwif->present = 1; |
diff --git a/drivers/ide/ide-xfer-mode.c b/drivers/ide/ide-xfer-mode.c index 0b47ca139079..46d203ce60cc 100644 --- a/drivers/ide/ide-xfer-mode.c +++ b/drivers/ide/ide-xfer-mode.c | |||
@@ -109,6 +109,12 @@ EXPORT_SYMBOL_GPL(ide_get_best_pio_mode); | |||
109 | 109 | ||
110 | int ide_pio_need_iordy(ide_drive_t *drive, const u8 pio) | 110 | int ide_pio_need_iordy(ide_drive_t *drive, const u8 pio) |
111 | { | 111 | { |
112 | /* | ||
113 | * IORDY may lead to controller lock up on certain controllers | ||
114 | * if the port is not occupied. | ||
115 | */ | ||
116 | if (pio == 0 && (drive->hwif->port_flags & IDE_PFLAG_PROBING)) | ||
117 | return 0; | ||
112 | return ata_id_pio_need_iordy(drive->id, pio); | 118 | return ata_id_pio_need_iordy(drive->id, pio); |
113 | } | 119 | } |
114 | EXPORT_SYMBOL_GPL(ide_pio_need_iordy); | 120 | EXPORT_SYMBOL_GPL(ide_pio_need_iordy); |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 8c7f5e50e912..8771d49aa874 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -661,6 +661,10 @@ struct ide_dma_ops { | |||
661 | u8 (*dma_sff_read_status)(struct hwif_s *); | 661 | u8 (*dma_sff_read_status)(struct hwif_s *); |
662 | }; | 662 | }; |
663 | 663 | ||
664 | enum { | ||
665 | IDE_PFLAG_PROBING = (1 << 0), | ||
666 | }; | ||
667 | |||
664 | struct ide_host; | 668 | struct ide_host; |
665 | 669 | ||
666 | typedef struct hwif_s { | 670 | typedef struct hwif_s { |
@@ -677,6 +681,8 @@ typedef struct hwif_s { | |||
677 | 681 | ||
678 | ide_drive_t *devices[MAX_DRIVES + 1]; | 682 | ide_drive_t *devices[MAX_DRIVES + 1]; |
679 | 683 | ||
684 | unsigned long port_flags; | ||
685 | |||
680 | u8 major; /* our major number */ | 686 | u8 major; /* our major number */ |
681 | u8 index; /* 0 for ide0; 1 for ide1; ... */ | 687 | u8 index; /* 0 for ide0; 1 for ide1; ... */ |
682 | u8 channel; /* for dual-port chips: 0=primary, 1=secondary */ | 688 | u8 channel; /* for dual-port chips: 0=primary, 1=secondary */ |