aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2008-06-27 12:39:43 -0400
committerJeff Garzik <jgarzik@redhat.com>2008-07-04 09:06:02 -0400
commita836d3e882161c562b3ddacee5d8842a033c5b2c (patch)
tree8bcec0610b77bf4b7772f97b54af6aa80dca0a81 /drivers/ata
parentea0c62f7cf70f13a67830471b613337bd0c9a62e (diff)
libata-sff: improve HSM violation reporting
Improve SFF HSM violation reporting such that each HSM violation can be distinguished using ehi_desc. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-sff.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 215d18672a5a..c0908c225483 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -1094,6 +1094,7 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
1094int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, 1094int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
1095 u8 status, int in_wq) 1095 u8 status, int in_wq)
1096{ 1096{
1097 struct ata_eh_info *ehi = &ap->link.eh_info;
1097 unsigned long flags = 0; 1098 unsigned long flags = 0;
1098 int poll_next; 1099 int poll_next;
1099 1100
@@ -1125,9 +1126,12 @@ fsm_start:
1125 if (likely(status & (ATA_ERR | ATA_DF))) 1126 if (likely(status & (ATA_ERR | ATA_DF)))
1126 /* device stops HSM for abort/error */ 1127 /* device stops HSM for abort/error */
1127 qc->err_mask |= AC_ERR_DEV; 1128 qc->err_mask |= AC_ERR_DEV;
1128 else 1129 else {
1129 /* HSM violation. Let EH handle this */ 1130 /* HSM violation. Let EH handle this */
1131 ata_ehi_push_desc(ehi,
1132 "ST_FIRST: !(DRQ|ERR|DF)");
1130 qc->err_mask |= AC_ERR_HSM; 1133 qc->err_mask |= AC_ERR_HSM;
1134 }
1131 1135
1132 ap->hsm_task_state = HSM_ST_ERR; 1136 ap->hsm_task_state = HSM_ST_ERR;
1133 goto fsm_start; 1137 goto fsm_start;
@@ -1146,9 +1150,9 @@ fsm_start:
1146 * the CDB. 1150 * the CDB.
1147 */ 1151 */
1148 if (!(qc->dev->horkage & ATA_HORKAGE_STUCK_ERR)) { 1152 if (!(qc->dev->horkage & ATA_HORKAGE_STUCK_ERR)) {
1149 ata_port_printk(ap, KERN_WARNING, 1153 ata_ehi_push_desc(ehi, "ST_FIRST: "
1150 "DRQ=1 with device error, " 1154 "DRQ=1 with device error, "
1151 "dev_stat 0x%X\n", status); 1155 "dev_stat 0x%X", status);
1152 qc->err_mask |= AC_ERR_HSM; 1156 qc->err_mask |= AC_ERR_HSM;
1153 ap->hsm_task_state = HSM_ST_ERR; 1157 ap->hsm_task_state = HSM_ST_ERR;
1154 goto fsm_start; 1158 goto fsm_start;
@@ -1205,9 +1209,9 @@ fsm_start:
1205 * let the EH abort the command or reset the device. 1209 * let the EH abort the command or reset the device.
1206 */ 1210 */
1207 if (unlikely(status & (ATA_ERR | ATA_DF))) { 1211 if (unlikely(status & (ATA_ERR | ATA_DF))) {
1208 ata_port_printk(ap, KERN_WARNING, "DRQ=1 with " 1212 ata_ehi_push_desc(ehi, "ST-ATAPI: "
1209 "device error, dev_stat 0x%X\n", 1213 "DRQ=1 with device error, "
1210 status); 1214 "dev_stat 0x%X", status);
1211 qc->err_mask |= AC_ERR_HSM; 1215 qc->err_mask |= AC_ERR_HSM;
1212 ap->hsm_task_state = HSM_ST_ERR; 1216 ap->hsm_task_state = HSM_ST_ERR;
1213 goto fsm_start; 1217 goto fsm_start;
@@ -1226,13 +1230,17 @@ fsm_start:
1226 if (likely(status & (ATA_ERR | ATA_DF))) 1230 if (likely(status & (ATA_ERR | ATA_DF)))
1227 /* device stops HSM for abort/error */ 1231 /* device stops HSM for abort/error */
1228 qc->err_mask |= AC_ERR_DEV; 1232 qc->err_mask |= AC_ERR_DEV;
1229 else 1233 else {
1230 /* HSM violation. Let EH handle this. 1234 /* HSM violation. Let EH handle this.
1231 * Phantom devices also trigger this 1235 * Phantom devices also trigger this
1232 * condition. Mark hint. 1236 * condition. Mark hint.
1233 */ 1237 */
1238 ata_ehi_push_desc(ehi, "ST-ATA: "
1239 "DRQ=1 with device error, "
1240 "dev_stat 0x%X", status);
1234 qc->err_mask |= AC_ERR_HSM | 1241 qc->err_mask |= AC_ERR_HSM |
1235 AC_ERR_NODEV_HINT; 1242 AC_ERR_NODEV_HINT;
1243 }
1236 1244
1237 ap->hsm_task_state = HSM_ST_ERR; 1245 ap->hsm_task_state = HSM_ST_ERR;
1238 goto fsm_start; 1246 goto fsm_start;
@@ -1257,8 +1265,12 @@ fsm_start:
1257 status = ata_wait_idle(ap); 1265 status = ata_wait_idle(ap);
1258 } 1266 }
1259 1267
1260 if (status & (ATA_BUSY | ATA_DRQ)) 1268 if (status & (ATA_BUSY | ATA_DRQ)) {
1269 ata_ehi_push_desc(ehi, "ST-ATA: "
1270 "BUSY|DRQ persists on ERR|DF, "
1271 "dev_stat 0x%X", status);
1261 qc->err_mask |= AC_ERR_HSM; 1272 qc->err_mask |= AC_ERR_HSM;
1273 }
1262 1274
1263 /* ata_pio_sectors() might change the 1275 /* ata_pio_sectors() might change the
1264 * state to HSM_ST_LAST. so, the state 1276 * state to HSM_ST_LAST. so, the state