aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2009-06-15 12:52:54 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2009-06-15 12:52:54 -0400
commit5880b5de7101cc123778c5d17d4f3986351f3122 (patch)
tree30deb7cee9dd1efadb2a2b27c6b5d38a0c055fd6
parentc9ef59ff01b6bd1c7360a64fcc8556a1193c2ed0 (diff)
ide: don't enable IORDY at a probe time
* Add 'unsigned long port_flags' field to ide_hwif_t. * Add IDE_PFLAG_PROBING port flag and keep it set during probing. * Fix ide_pio_need_iordy() to not enable IORDY at a probe time (IORDY may lead to controller lock up on certain controllers if the port is not occupied). Loosely based on the recent libata's fix by Tejun, thanks to Alan for the hint that IDE may also need it. Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-rw-r--r--drivers/ide/ide-probe.c16
-rw-r--r--drivers/ide/ide-xfer-mode.c6
-rw-r--r--include/linux/ide.h6
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
1570void ide_port_scan(ide_hwif_t *hwif) 1575void 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
110int ide_pio_need_iordy(ide_drive_t *drive, const u8 pio) 110int 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}
114EXPORT_SYMBOL_GPL(ide_pio_need_iordy); 120EXPORT_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
664enum {
665 IDE_PFLAG_PROBING = (1 << 0),
666};
667
664struct ide_host; 668struct ide_host;
665 669
666typedef struct hwif_s { 670typedef 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 */