Commit a2bbd0c9 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

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: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 16728da9
...@@ -198,7 +198,6 @@ struct ahci_port_priv { ...@@ -198,7 +198,6 @@ struct ahci_port_priv {
void *rx_fis; void *rx_fis;
dma_addr_t rx_fis_dma; dma_addr_t rx_fis_dma;
/* for NCQ spurious interrupt analysis */ /* for NCQ spurious interrupt analysis */
int ncq_saw_spurious_sdb_cnt;
unsigned int ncq_saw_d2h:1; unsigned int ncq_saw_d2h:1;
unsigned int ncq_saw_dmas:1; unsigned int ncq_saw_dmas:1;
}; };
...@@ -1160,23 +1159,24 @@ static void ahci_host_intr(struct ata_port *ap) ...@@ -1160,23 +1159,24 @@ static void ahci_host_intr(struct ata_port *ap)
known_irq = 1; known_irq = 1;
} }
if (status & PORT_IRQ_SDB_FIS && if (status & PORT_IRQ_SDB_FIS) {
pp->ncq_saw_spurious_sdb_cnt < 10) {
/* SDB FIS containing spurious completions might be /* SDB FIS containing spurious completions might be
* dangerous, we need to know more about them. Print * dangerous, whine and fail commands with HSM
* more of it. * violation. EH will turn off NCQ after several such
* failures.
*/ */
const __le32 *f = pp->rx_fis + RX_FIS_SDB; const __le32 *f = pp->rx_fis + RX_FIS_SDB;
ata_port_printk(ap, KERN_INFO, "Spurious SDB FIS during NCQ " ata_ehi_push_desc(ehi, "spurious completion during NCQ "
"issue=0x%x SAct=0x%x FIS=%08x:%08x%s\n", "issue=0x%x SAct=0x%x FIS=%08x:%08x",
readl(port_mmio + PORT_CMD_ISSUE), readl(port_mmio + PORT_CMD_ISSUE),
readl(port_mmio + PORT_SCR_ACT), readl(port_mmio + PORT_SCR_ACT),
le32_to_cpu(f[0]), le32_to_cpu(f[1]), le32_to_cpu(f[0]), le32_to_cpu(f[1]));
pp->ncq_saw_spurious_sdb_cnt < 10 ?
"" : ", shutting up"); ehi->err_mask |= AC_ERR_HSM;
ehi->action |= ATA_EH_SOFTRESET;
ata_port_freeze(ap);
pp->ncq_saw_spurious_sdb_cnt++;
known_irq = 1; known_irq = 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment