diff options
author | Gwendal Grignou <gwendal@google.com> | 2013-01-18 13:56:43 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2013-02-20 17:13:17 -0500 |
commit | 84a9a8cd9d0aa93c17e5815ab8a9cc4c0a765c63 (patch) | |
tree | ac32afc022d5885e278b61a0f6eaf7730ccc2a92 /drivers/ata | |
parent | 9b2b1ca5b738727707d1c9d5dbc70b1a0a813467 (diff) |
[libata] Set proper SK when CK_COND is set.
When the user application sends a ATA_12 or ATA_16 PASSTHROUGH
scsi command, put the task file register in the sense data with the
proper Sense Key. Instead of NO SENSE, set RECOVERED, as
specified in [SAT2]12.2.5 Table 92.
Tested:
Using udev ata_id to generate a passthrough command, IDENTIFY:
before:
sd 0:0:0:0: [sda] CDB: ATA command pass through(12)/Blank: \
a1 08 2e 00 01 00 00 00 00 ec 00 00
sd 0:0:0:0: [sda] Sense Key : No Sense [current] [descriptor]
Descriptor sense data with sense descriptors (in hex):
72 00 00 00 00 00 00 0e 09 0c 00 00 00 00 00 3f
00 18 00 a6 e0 50
after
sd 0:0:0:0: [sda] CDB: ATA command pass through(12)/Blank: \
a1 08 2e 00 01 00 00 00 00 ec 00 00
sd 0:0:0:0: [sda] Sense Key : Recovered Error [current] [descriptor]
Descriptor sense data with sense descriptors (in hex):
72 01 00 1d 00 00 00 0e 09 0c 00 00 00 01 00 00
00 00 00 00 00 50
Signed-off-by: Gwendal Grignou <gwendal@google.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-scsi.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 1ff018525e3b..318b41358187 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -933,7 +933,11 @@ static void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, | |||
933 | * block specified for the ATA pass through commands. Regardless | 933 | * block specified for the ATA pass through commands. Regardless |
934 | * of whether the command errored or not, return a sense | 934 | * of whether the command errored or not, return a sense |
935 | * block. Copy all controller registers into the sense | 935 | * block. Copy all controller registers into the sense |
936 | * block. Clear sense key, ASC & ASCQ if there is no error. | 936 | * block. If there was no error, we get the request from an ATA |
937 | * passthrough command, so we use the following sense data: | ||
938 | * sk = RECOVERED ERROR | ||
939 | * asc,ascq = ATA PASS-THROUGH INFORMATION AVAILABLE | ||
940 | * | ||
937 | * | 941 | * |
938 | * LOCKING: | 942 | * LOCKING: |
939 | * None. | 943 | * None. |
@@ -959,6 +963,10 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc) | |||
959 | ata_to_sense_error(qc->ap->print_id, tf->command, tf->feature, | 963 | ata_to_sense_error(qc->ap->print_id, tf->command, tf->feature, |
960 | &sb[1], &sb[2], &sb[3], verbose); | 964 | &sb[1], &sb[2], &sb[3], verbose); |
961 | sb[1] &= 0x0f; | 965 | sb[1] &= 0x0f; |
966 | } else { | ||
967 | sb[1] = RECOVERED_ERROR; | ||
968 | sb[2] = 0; | ||
969 | sb[3] = 0x1D; | ||
962 | } | 970 | } |
963 | 971 | ||
964 | /* | 972 | /* |
@@ -1733,10 +1741,12 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) | |||
1733 | 1741 | ||
1734 | /* For ATA pass thru (SAT) commands, generate a sense block if | 1742 | /* For ATA pass thru (SAT) commands, generate a sense block if |
1735 | * user mandated it or if there's an error. Note that if we | 1743 | * user mandated it or if there's an error. Note that if we |
1736 | * generate because the user forced us to, a check condition | 1744 | * generate because the user forced us to [CK_COND =1], a check |
1737 | * is generated and the ATA register values are returned | 1745 | * condition is generated and the ATA register values are returned |
1738 | * whether the command completed successfully or not. If there | 1746 | * whether the command completed successfully or not. If there |
1739 | * was no error, SK, ASC and ASCQ will all be zero. | 1747 | * was no error, we use the following sense data: |
1748 | * sk = RECOVERED ERROR | ||
1749 | * asc,ascq = ATA PASS-THROUGH INFORMATION AVAILABLE | ||
1740 | */ | 1750 | */ |
1741 | if (((cdb[0] == ATA_16) || (cdb[0] == ATA_12)) && | 1751 | if (((cdb[0] == ATA_16) || (cdb[0] == ATA_12)) && |
1742 | ((cdb[2] & 0x20) || need_sense)) { | 1752 | ((cdb[2] & 0x20) || need_sense)) { |