aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/libata-eh.c
diff options
context:
space:
mode:
authorRobert Hancock <hancockr@shaw.ca>2007-10-02 11:22:02 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-12 14:55:45 -0400
commit1333e19434da116bc832e1b8925359d1565fedc9 (patch)
tree581785c8864f55347e1de0eb10850cc374b79b6e /drivers/ata/libata-eh.c
parent6949b9148d3656afc13a2ccc06d13c071ec71bdc (diff)
libata: add human-readable error value decoding
This adds human-readable decoding of the ATA status and error registers (similar to what drivers/ide does) as well as the SATA Serror register to libata error handling output. This prevents the need to pore through standards documents to figure out the meaning of the bits in these registers when looking at error reports. Some bits that drivers/ide decoded are not decoded here, since the bits are either command-dependent or obsolete, and properly parsing them would add too much complexity. Signed-off-by: Robert Hancock <hancockr@shaw.ca> [edited slightly to make output a bit more symmetric] Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/libata-eh.c')
-rw-r--r--drivers/ata/libata-eh.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 5f2c0f376f74..0bd3898793a7 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -1911,6 +1911,27 @@ static void ata_eh_link_report(struct ata_link *link)
1911 ata_link_printk(link, KERN_ERR, "%s\n", desc); 1911 ata_link_printk(link, KERN_ERR, "%s\n", desc);
1912 } 1912 }
1913 1913
1914 if (ehc->i.serror)
1915 ata_port_printk(ap, KERN_ERR,
1916 "SError: { %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s}\n",
1917 ehc->i.serror & SERR_DATA_RECOVERED ? "RecovData " : "",
1918 ehc->i.serror & SERR_COMM_RECOVERED ? "RecovComm " : "",
1919 ehc->i.serror & SERR_DATA ? "UnrecovData " : "",
1920 ehc->i.serror & SERR_PERSISTENT ? "Persist " : "",
1921 ehc->i.serror & SERR_PROTOCOL ? "Proto " : "",
1922 ehc->i.serror & SERR_INTERNAL ? "HostInt " : "",
1923 ehc->i.serror & SERR_PHYRDY_CHG ? "PHYRdyChg " : "",
1924 ehc->i.serror & SERR_PHY_INT_ERR ? "PHYInt " : "",
1925 ehc->i.serror & SERR_COMM_WAKE ? "CommWake " : "",
1926 ehc->i.serror & SERR_10B_8B_ERR ? "10B8B " : "",
1927 ehc->i.serror & SERR_DISPARITY ? "Dispar " : "",
1928 ehc->i.serror & SERR_CRC ? "BadCRC " : "",
1929 ehc->i.serror & SERR_HANDSHAKE ? "Handshk " : "",
1930 ehc->i.serror & SERR_LINK_SEQ_ERR ? "LinkSeq " : "",
1931 ehc->i.serror & SERR_TRANS_ST_ERROR ? "TrStaTrns " : "",
1932 ehc->i.serror & SERR_UNRECOG_FIS ? "UnrecFIS " : "",
1933 ehc->i.serror & SERR_DEV_XCHG ? "DevExch " : "" );
1934
1914 for (tag = 0; tag < ATA_MAX_QUEUE; tag++) { 1935 for (tag = 0; tag < ATA_MAX_QUEUE; tag++) {
1915 static const char *dma_str[] = { 1936 static const char *dma_str[] = {
1916 [DMA_BIDIRECTIONAL] = "bidi", 1937 [DMA_BIDIRECTIONAL] = "bidi",
@@ -1942,6 +1963,30 @@ static void ata_eh_link_report(struct ata_link *link)
1942 res->hob_lbal, res->hob_lbam, res->hob_lbah, 1963 res->hob_lbal, res->hob_lbam, res->hob_lbah,
1943 res->device, qc->err_mask, ata_err_string(qc->err_mask), 1964 res->device, qc->err_mask, ata_err_string(qc->err_mask),
1944 qc->err_mask & AC_ERR_NCQ ? " <F>" : ""); 1965 qc->err_mask & AC_ERR_NCQ ? " <F>" : "");
1966
1967 if (res->command & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ |
1968 ATA_ERR) ) {
1969 if (res->command & ATA_BUSY)
1970 ata_dev_printk(qc->dev, KERN_ERR,
1971 "status: { Busy }\n" );
1972 else
1973 ata_dev_printk(qc->dev, KERN_ERR,
1974 "status: { %s%s%s%s}\n",
1975 res->command & ATA_DRDY ? "DRDY " : "",
1976 res->command & ATA_DF ? "DF " : "",
1977 res->command & ATA_DRQ ? "DRQ " : "",
1978 res->command & ATA_ERR ? "ERR " : "" );
1979 }
1980
1981 if (cmd->command != ATA_CMD_PACKET &&
1982 (res->feature & (ATA_ICRC | ATA_UNC | ATA_IDNF |
1983 ATA_ABORTED)))
1984 ata_dev_printk(qc->dev, KERN_ERR,
1985 "error: { %s%s%s%s}\n",
1986 res->feature & ATA_ICRC ? "ICRC " : "",
1987 res->feature & ATA_UNC ? "UNC " : "",
1988 res->feature & ATA_IDNF ? "IDNF " : "",
1989 res->feature & ATA_ABORTED ? "ABRT " : "" );
1945 } 1990 }
1946} 1991}
1947 1992