diff options
| author | Rajashekhara, Mahesh <Mahesh_Rajashekhara@adaptec.com> | 2010-05-10 07:17:57 -0400 |
|---|---|---|
| committer | James Bottomley <James.Bottomley@suse.de> | 2010-05-16 22:40:40 -0400 |
| commit | 1fc8010a5d9a27391db2be103b13f4ac80990cfc (patch) | |
| tree | 6943d7f3dbd2bf8435623b5f86e7a53163d4fadb | |
| parent | e3cc268fe4a0ad1cbefbc53cee35c80281e609b8 (diff) | |
[SCSI] aacraid: add support for handling ATA pass-through commands.
There are two conditions for ATA pass thru command that falls into
'SRB_STATUS_ERROR' condition.
1. When the "CC" bit is set by the host in ATA pass-through CDB
- Even for the successful completion, SCSI target shall generate
check condition.
- Driver returns a result code of SAM_STAT_CHECK_CONDITION, with a
driver byte of DID_OK to the mid layer.
Below is the snippet of existing code which fills a result code
of SAM_STAT_CHECK_CONDITION:
***********************************
if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) {
int len;
scsicmd->result |= SAM_STAT_CHECK_CONDITION;
..........
************************************
2. When the "CC" bit is reset by the host and if SCSI target generates
a check condition when an error occurs.
- Driver returns a result code of SAM_STAT_CHECK_CONDITION, with a
driver byte of DID_ERROR to the mid layer.
Signed-off-by: Mahesh Rajashekhara <aacraid@adaptec.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
| -rw-r--r-- | drivers/scsi/aacraid/aachba.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 24b1ba06ece4..fdc7d9935aeb 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
| @@ -2693,8 +2693,22 @@ static void aac_srb_callback(void *context, struct fib * fibptr) | |||
| 2693 | scsicmd->cmnd[0], | 2693 | scsicmd->cmnd[0], |
| 2694 | le32_to_cpu(srbreply->scsi_status)); | 2694 | le32_to_cpu(srbreply->scsi_status)); |
| 2695 | #endif | 2695 | #endif |
| 2696 | scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8; | 2696 | if ((scsicmd->cmnd[0] == ATA_12) |
| 2697 | break; | 2697 | || (scsicmd->cmnd[0] == ATA_16)) { |
| 2698 | if (scsicmd->cmnd[2] & (0x01 << 5)) { | ||
| 2699 | scsicmd->result = DID_OK << 16 | ||
| 2700 | | COMMAND_COMPLETE << 8; | ||
| 2701 | break; | ||
| 2702 | } else { | ||
| 2703 | scsicmd->result = DID_ERROR << 16 | ||
| 2704 | | COMMAND_COMPLETE << 8; | ||
| 2705 | break; | ||
| 2706 | } | ||
| 2707 | } else { | ||
| 2708 | scsicmd->result = DID_ERROR << 16 | ||
| 2709 | | COMMAND_COMPLETE << 8; | ||
| 2710 | break; | ||
| 2711 | } | ||
| 2698 | } | 2712 | } |
| 2699 | if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) { | 2713 | if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) { |
| 2700 | int len; | 2714 | int len; |
