aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/libata-eh.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-07-16 01:29:40 -0400
committerJeff Garzik <jeff@garzik.org>2007-07-20 08:02:11 -0400
commit5335b729064e03319cd2d5219770451dbb1d7f67 (patch)
tree72bd078bd714d06d55c555edcf183f2bdf30c9e8 /drivers/ata/libata-eh.c
parentb64bbc39f2122a2276578e40144af69ef01decd4 (diff)
libata: implement AC_ERR_NCQ
When an NCQ command fails, all commands in flight are aborted and the offending one is reported using log page 10h. Depending on controller characteristics and LLD implementation, all commands may appear as having a device error due to shared TF status making it hard to determine what's actually going on. This patch adds AC_ERR_NCQ, marks the command reported by log page 10h with it and print extra "<F>" after the error report for the command to help distinguishing the offending command. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/libata-eh.c')
-rw-r--r--drivers/ata/libata-eh.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 96b184ebf708..19f9947bd96b 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -1195,7 +1195,7 @@ static void ata_eh_analyze_ncq_error(struct ata_port *ap)
1195 /* we've got the perpetrator, condemn it */ 1195 /* we've got the perpetrator, condemn it */
1196 qc = __ata_qc_from_tag(ap, tag); 1196 qc = __ata_qc_from_tag(ap, tag);
1197 memcpy(&qc->result_tf, &tf, sizeof(tf)); 1197 memcpy(&qc->result_tf, &tf, sizeof(tf));
1198 qc->err_mask |= AC_ERR_DEV; 1198 qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ;
1199 ehc->i.err_mask &= ~AC_ERR_DEV; 1199 ehc->i.err_mask &= ~AC_ERR_DEV;
1200} 1200}
1201 1201
@@ -1616,7 +1616,7 @@ static void ata_eh_report(struct ata_port *ap)
1616 "cmd %02x/%02x:%02x:%02x:%02x:%02x/%02x:%02x:%02x:%02x:%02x/%02x " 1616 "cmd %02x/%02x:%02x:%02x:%02x:%02x/%02x:%02x:%02x:%02x:%02x/%02x "
1617 "tag %d cdb 0x%x data %u %s\n " 1617 "tag %d cdb 0x%x data %u %s\n "
1618 "res %02x/%02x:%02x:%02x:%02x:%02x/%02x:%02x:%02x:%02x:%02x/%02x " 1618 "res %02x/%02x:%02x:%02x:%02x:%02x/%02x:%02x:%02x:%02x:%02x/%02x "
1619 "Emask 0x%x (%s)\n", 1619 "Emask 0x%x (%s)%s\n",
1620 cmd->command, cmd->feature, cmd->nsect, 1620 cmd->command, cmd->feature, cmd->nsect,
1621 cmd->lbal, cmd->lbam, cmd->lbah, 1621 cmd->lbal, cmd->lbam, cmd->lbah,
1622 cmd->hob_feature, cmd->hob_nsect, 1622 cmd->hob_feature, cmd->hob_nsect,
@@ -1627,7 +1627,8 @@ static void ata_eh_report(struct ata_port *ap)
1627 res->lbal, res->lbam, res->lbah, 1627 res->lbal, res->lbam, res->lbah,
1628 res->hob_feature, res->hob_nsect, 1628 res->hob_feature, res->hob_nsect,
1629 res->hob_lbal, res->hob_lbam, res->hob_lbah, 1629 res->hob_lbal, res->hob_lbam, res->hob_lbah,
1630 res->device, qc->err_mask, ata_err_string(qc->err_mask)); 1630 res->device, qc->err_mask, ata_err_string(qc->err_mask),
1631 qc->err_mask & AC_ERR_NCQ ? " <F>" : "");
1631 } 1632 }
1632} 1633}
1633 1634