aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlbert Lee <albertcc@tw.ibm.com>2007-06-07 04:01:17 -0400
committerJeff Garzik <jeff@garzik.org>2007-06-09 23:08:12 -0400
commit2c3d2a46f1ccf591850b20f4fdde12bcf2bf3dfd (patch)
tree148a2cd32ae40185bb547cb96cd17bcd920b8ab0
parentfa4453c4c94a61bbefe470b16ddbb6218481c6dc (diff)
libata passthru: update cached device paramters
INIT_DEV_PARAMS and SET_MULTI_MODE change the device parameters cached by libata. Re-read IDENTIFY DEVICE info and update the cached device paramters when seeing these commands. Signed-off-by: Albert Lee <albertcc@tw.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/ata/libata-scsi.c22
-rw-r--r--include/linux/ata.h1
2 files changed, 17 insertions, 6 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 884f52f43f8f..c228df298bd8 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -1363,12 +1363,22 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
1363 * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE 1363 * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE
1364 * cache 1364 * cache
1365 */ 1365 */
1366 if (ap->ops->error_handler && 1366 if (ap->ops->error_handler && !need_sense) {
1367 !need_sense && (qc->tf.command == ATA_CMD_SET_FEATURES) && 1367 switch (qc->tf.command) {
1368 ((qc->tf.feature == SETFEATURES_WC_ON) || 1368 case ATA_CMD_SET_FEATURES:
1369 (qc->tf.feature == SETFEATURES_WC_OFF))) { 1369 if ((qc->tf.feature == SETFEATURES_WC_ON) ||
1370 ap->eh_info.action |= ATA_EH_REVALIDATE; 1370 (qc->tf.feature == SETFEATURES_WC_OFF)) {
1371 ata_port_schedule_eh(ap); 1371 ap->eh_info.action |= ATA_EH_REVALIDATE;
1372 ata_port_schedule_eh(ap);
1373 }
1374 break;
1375
1376 case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */
1377 case ATA_CMD_SET_MULTI: /* multi_count changed */
1378 ap->eh_info.action |= ATA_EH_REVALIDATE;
1379 ata_port_schedule_eh(ap);
1380 break;
1381 }
1372 } 1382 }
1373 1383
1374 /* For ATA pass thru (SAT) commands, generate a sense block if 1384 /* For ATA pass thru (SAT) commands, generate a sense block if
diff --git a/include/linux/ata.h b/include/linux/ata.h
index 3e95e5c402d4..703febb2df31 100644
--- a/include/linux/ata.h
+++ b/include/linux/ata.h
@@ -151,6 +151,7 @@ enum {
151 ATA_CMD_WRITE_MULTI_EXT = 0x39, 151 ATA_CMD_WRITE_MULTI_EXT = 0x39,
152 ATA_CMD_WRITE_MULTI_FUA_EXT = 0xCE, 152 ATA_CMD_WRITE_MULTI_FUA_EXT = 0xCE,
153 ATA_CMD_SET_FEATURES = 0xEF, 153 ATA_CMD_SET_FEATURES = 0xEF,
154 ATA_CMD_SET_MULTI = 0xC6,
154 ATA_CMD_PACKET = 0xA0, 155 ATA_CMD_PACKET = 0xA0,
155 ATA_CMD_VERIFY = 0x40, 156 ATA_CMD_VERIFY = 0x40,
156 ATA_CMD_VERIFY_EXT = 0x42, 157 ATA_CMD_VERIFY_EXT = 0x42,