aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@pobox.com>2005-11-17 05:44:44 -0500
committerJeff Garzik <jgarzik@pobox.com>2005-11-17 05:44:44 -0500
commita2c91a8819e315e9fd1aef3ff57badb6c1be3f80 (patch)
tree0b75460b200383d341b8473fc187f5db2c681795
parent22374677d18c5eeefd3a283431d312b8c44fef02 (diff)
[libata sata_mv] handle lack of hardware nIEN support
Handle errata (it was unintentional on this h/w, whereas its intentional on others) whereby the nIEN bit in Device Control is ignored, leading to a situation where a hardware interrupt completes the qc before the polling code has a chance to. This will get fixed The Right Way(tm) once Albert Lee's irq-pio branch is merged, as the more natural PIO method on this hardware is interrupt-driven.
-rw-r--r--drivers/scsi/sata_mv.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c
index ee0634da087..ac184e60797 100644
--- a/drivers/scsi/sata_mv.c
+++ b/drivers/scsi/sata_mv.c
@@ -1219,6 +1219,10 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
1219 handled++; 1219 handled++;
1220 } 1220 }
1221 1221
1222 if (ap &&
1223 (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)))
1224 continue;
1225
1222 err_mask = ac_err_mask(ata_status); 1226 err_mask = ac_err_mask(ata_status);
1223 1227
1224 shift = port << 1; /* (port * 2) */ 1228 shift = port << 1; /* (port * 2) */
@@ -1237,7 +1241,8 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
1237 VPRINTK("port %u IRQ found for qc, " 1241 VPRINTK("port %u IRQ found for qc, "
1238 "ata_status 0x%x\n", port,ata_status); 1242 "ata_status 0x%x\n", port,ata_status);
1239 /* mark qc status appropriately */ 1243 /* mark qc status appropriately */
1240 ata_qc_complete(qc, err_mask); 1244 if (!(qc->tf.ctl & ATA_NIEN))
1245 ata_qc_complete(qc, err_mask);
1241 } 1246 }
1242 } 1247 }
1243 } 1248 }