aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/ata/libata-eh.c7
-rw-r--r--include/linux/libata.h1
2 files changed, 5 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
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 94b37d180680..cb181713d9b5 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -323,6 +323,7 @@ enum ata_completion_errors {
323 AC_ERR_INVALID = (1 << 7), /* invalid argument */ 323 AC_ERR_INVALID = (1 << 7), /* invalid argument */
324 AC_ERR_OTHER = (1 << 8), /* unknown */ 324 AC_ERR_OTHER = (1 << 8), /* unknown */
325 AC_ERR_NODEV_HINT = (1 << 9), /* polling device detection hint */ 325 AC_ERR_NODEV_HINT = (1 << 9), /* polling device detection hint */
326 AC_ERR_NCQ = (1 << 10), /* marker for offending NCQ qc */
326}; 327};
327 328
328/* forward declarations */ 329/* forward declarations */