diff options
author | Albert Lee <albertcc@tw.ibm.com> | 2007-06-07 04:01:17 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-06-09 23:08:12 -0400 |
commit | 2c3d2a46f1ccf591850b20f4fdde12bcf2bf3dfd (patch) | |
tree | 148a2cd32ae40185bb547cb96cd17bcd920b8ab0 | |
parent | fa4453c4c94a61bbefe470b16ddbb6218481c6dc (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.c | 22 | ||||
-rw-r--r-- | include/linux/ata.h | 1 |
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, |