aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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