aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libata-scsi.c
diff options
context:
space:
mode:
authorzhao, forrest <forrest.zhao@intel.com>2006-06-12 00:01:34 -0400
committerJeff Garzik <jeff@garzik.org>2006-06-12 00:18:35 -0400
commit3057ac3c1a992ee135cbb7b7d1a12e58d81f0739 (patch)
tree38d83a88ee949b9db8f6655f90f98d88f8a5f2fd /drivers/scsi/libata-scsi.c
parent39b07ce6d9f7cd4da8567baed844801e0aaa7b1a (diff)
[PATCH] Snoop SET FEATURES - WRITE CACHE ENABLE/DISABLE command(v5)
This patch makes libata snoop 'SET FEATURES - WRITE CACHE ENABLE/DISABLE' command, executing requisite revalidation processes to update cached data. Signed-off-by: Forrest Zhao <forrest.zhao@intel.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/scsi/libata-scsi.c')
-rw-r--r--drivers/scsi/libata-scsi.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
index 5f90d8e33546..45a49be65042 100644
--- a/drivers/scsi/libata-scsi.c
+++ b/drivers/scsi/libata-scsi.c
@@ -1306,6 +1306,17 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
1306 u8 *cdb = cmd->cmnd; 1306 u8 *cdb = cmd->cmnd;
1307 int need_sense = (qc->err_mask != 0); 1307 int need_sense = (qc->err_mask != 0);
1308 1308
1309 /* We snoop the SET_FEATURES - Write Cache ON/OFF command, and
1310 * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE
1311 * cache
1312 */
1313 if (!need_sense && (qc->tf.command == ATA_CMD_SET_FEATURES) &&
1314 ((qc->tf.feature == SETFEATURES_WC_ON) ||
1315 (qc->tf.feature == SETFEATURES_WC_OFF))) {
1316 qc->ap->eh_info.action |= ATA_EH_REVALIDATE;
1317 ata_port_schedule_eh(qc->ap);
1318 }
1319
1309 /* For ATA pass thru (SAT) commands, generate a sense block if 1320 /* For ATA pass thru (SAT) commands, generate a sense block if
1310 * user mandated it or if there's an error. Note that if we 1321 * user mandated it or if there's an error. Note that if we
1311 * generate because the user forced us to, a check condition 1322 * generate because the user forced us to, a check condition
@@ -2992,3 +3003,28 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
2992 3003
2993 return rc; 3004 return rc;
2994} 3005}
3006
3007/**
3008 * ata_scsi_dev_rescan - initiate scsi_rescan_device()
3009 * @data: Pointer to ATA port to perform scsi_rescan_device()
3010 *
3011 * After ATA pass thru (SAT) commands are executed successfully,
3012 * libata need to propagate the changes to SCSI layer.
3013 *
3014 * LOCKING:
3015 * Kernel thread context (may sleep).
3016 */
3017void ata_scsi_dev_rescan(void *data)
3018{
3019 struct ata_port *ap = data;
3020 struct ata_device *dev;
3021 unsigned int i;
3022
3023 for (i = 0; i < ATA_MAX_DEVICES; i++) {
3024 dev = &ap->device[i];
3025
3026 if (ata_dev_enabled(dev))
3027 scsi_rescan_device(&(dev->sdev->sdev_gendev));
3028 }
3029}
3030