aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-02-21 02:34:25 -0500
committerJeff Garzik <jeff@garzik.org>2007-02-23 05:37:10 -0500
commita2bbd0c923708a23c6fcc6bbc492f2eecadc676f (patch)
tree3a425c8a8268ce1ca6ccf5fd31fb8af494596456
parent16728da99861bdb6e44f066d536287990e752d7b (diff)
ahci: consider SDB FIS containing spurious NCQ completions HSM violation (regenerated)
SDB FIS containing spurious NCQ completions is a clear protocol violation. Currently, only some Maxtors with early firmware revisions are showing this problem. Those firmwares have other NCQ related problems including buggy NCQ error reporting and occasional lock up after NCQ errors. Consider spurious NCQ completions HSM violation and freeze the port after it. EH will turn off NCQ after this happens several times. Eventually drives which show this behavior should be blacklisted for NCQ. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/ata/ahci.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 6a3543e06241..334f54c99fd8 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -198,7 +198,6 @@ struct ahci_port_priv {
198 void *rx_fis; 198 void *rx_fis;
199 dma_addr_t rx_fis_dma; 199 dma_addr_t rx_fis_dma;
200 /* for NCQ spurious interrupt analysis */ 200 /* for NCQ spurious interrupt analysis */
201 int ncq_saw_spurious_sdb_cnt;
202 unsigned int ncq_saw_d2h:1; 201 unsigned int ncq_saw_d2h:1;
203 unsigned int ncq_saw_dmas:1; 202 unsigned int ncq_saw_dmas:1;
204}; 203};
@@ -1160,23 +1159,24 @@ static void ahci_host_intr(struct ata_port *ap)
1160 known_irq = 1; 1159 known_irq = 1;
1161 } 1160 }
1162 1161
1163 if (status & PORT_IRQ_SDB_FIS && 1162 if (status & PORT_IRQ_SDB_FIS) {
1164 pp->ncq_saw_spurious_sdb_cnt < 10) {
1165 /* SDB FIS containing spurious completions might be 1163 /* SDB FIS containing spurious completions might be
1166 * dangerous, we need to know more about them. Print 1164 * dangerous, whine and fail commands with HSM
1167 * more of it. 1165 * violation. EH will turn off NCQ after several such
1168 */ 1166 * failures.
1167 */
1169 const __le32 *f = pp->rx_fis + RX_FIS_SDB; 1168 const __le32 *f = pp->rx_fis + RX_FIS_SDB;
1170 1169
1171 ata_port_printk(ap, KERN_INFO, "Spurious SDB FIS during NCQ " 1170 ata_ehi_push_desc(ehi, "spurious completion during NCQ "
1172 "issue=0x%x SAct=0x%x FIS=%08x:%08x%s\n", 1171 "issue=0x%x SAct=0x%x FIS=%08x:%08x",
1173 readl(port_mmio + PORT_CMD_ISSUE), 1172 readl(port_mmio + PORT_CMD_ISSUE),
1174 readl(port_mmio + PORT_SCR_ACT), 1173 readl(port_mmio + PORT_SCR_ACT),
1175 le32_to_cpu(f[0]), le32_to_cpu(f[1]), 1174 le32_to_cpu(f[0]), le32_to_cpu(f[1]));
1176 pp->ncq_saw_spurious_sdb_cnt < 10 ? 1175
1177 "" : ", shutting up"); 1176 ehi->err_mask |= AC_ERR_HSM;
1177 ehi->action |= ATA_EH_SOFTRESET;
1178 ata_port_freeze(ap);
1178 1179
1179 pp->ncq_saw_spurious_sdb_cnt++;
1180 known_irq = 1; 1180 known_irq = 1;
1181 } 1181 }
1182 1182