diff options
author | Jeff Garzik <jeff@garzik.org> | 2007-09-21 06:23:42 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-10-12 14:55:40 -0400 |
commit | 453941455218a81eedcea5dbafa38b8815920a8c (patch) | |
tree | b2f21afae3beb39da13f089c02f0f09bfc4de697 | |
parent | ad355b4628a19ba2af30409e13083edda221a5c9 (diff) |
[libata] Slightly improved no-op REQUEST SENSE, SEND DIAGNOSTIC
A few pedantic apps care about missing or lame "mandatory" SCSI
commands, so
REQUEST SENSE -- as we autosense, R.S. just returns zeroes
SEND DIAGNOSTIC -- our default (no-op) self-test succeeds, all
other requests for testing fail.
Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r-- | drivers/ata/libata-scsi.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index b39966299e7b..79550908adcc 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -2912,6 +2912,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, | |||
2912 | { | 2912 | { |
2913 | struct ata_scsi_args args; | 2913 | struct ata_scsi_args args; |
2914 | const u8 *scsicmd = cmd->cmnd; | 2914 | const u8 *scsicmd = cmd->cmnd; |
2915 | u8 tmp8; | ||
2915 | 2916 | ||
2916 | args.dev = dev; | 2917 | args.dev = dev; |
2917 | args.id = dev->id; | 2918 | args.id = dev->id; |
@@ -2926,7 +2927,6 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, | |||
2926 | case SEEK_10: | 2927 | case SEEK_10: |
2927 | case TEST_UNIT_READY: | 2928 | case TEST_UNIT_READY: |
2928 | case FORMAT_UNIT: /* FIXME: correct? */ | 2929 | case FORMAT_UNIT: /* FIXME: correct? */ |
2929 | case SEND_DIAGNOSTIC: /* FIXME: correct? */ | ||
2930 | ata_scsi_rbuf_fill(&args, ata_scsiop_noop); | 2930 | ata_scsi_rbuf_fill(&args, ata_scsiop_noop); |
2931 | break; | 2931 | break; |
2932 | 2932 | ||
@@ -2979,8 +2979,19 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, | |||
2979 | ata_scsi_rbuf_fill(&args, ata_scsiop_report_luns); | 2979 | ata_scsi_rbuf_fill(&args, ata_scsiop_report_luns); |
2980 | break; | 2980 | break; |
2981 | 2981 | ||
2982 | /* mandatory commands we haven't implemented yet */ | ||
2983 | case REQUEST_SENSE: | 2982 | case REQUEST_SENSE: |
2983 | ata_scsi_set_sense(cmd, 0, 0, 0); | ||
2984 | cmd->result = (DRIVER_SENSE << 24); | ||
2985 | done(cmd); | ||
2986 | break; | ||
2987 | |||
2988 | case SEND_DIAGNOSTIC: | ||
2989 | tmp8 = scsicmd[1] & ~(1 << 3); | ||
2990 | if ((tmp8 == 0x4) && (!scsicmd[3]) && (!scsicmd[4])) | ||
2991 | ata_scsi_rbuf_fill(&args, ata_scsiop_noop); | ||
2992 | else | ||
2993 | ata_scsi_invalid_field(cmd, done); | ||
2994 | break; | ||
2984 | 2995 | ||
2985 | /* all other commands */ | 2996 | /* all other commands */ |
2986 | default: | 2997 | default: |