Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1fc8010a authored by Rajashekhara, Mahesh's avatar Rajashekhara, Mahesh Committed by James Bottomley
Browse files

[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: default avatarMahesh Rajashekhara <aacraid@adaptec.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent e3cc268f
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -2693,9 +2693,23 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
			scsicmd->cmnd[0],
			le32_to_cpu(srbreply->scsi_status));
#endif
		scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
		if ((scsicmd->cmnd[0] == ATA_12)
		  || (scsicmd->cmnd[0] == ATA_16)) {
			if (scsicmd->cmnd[2] & (0x01 << 5)) {
				scsicmd->result = DID_OK << 16
						| COMMAND_COMPLETE << 8;
				break;
			} else {
				scsicmd->result = DID_ERROR << 16
						| COMMAND_COMPLETE << 8;
				break;
			}
		} else {
			scsicmd->result = DID_ERROR << 16
					| COMMAND_COMPLETE << 8;
			break;
		}
	}
	if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) {
		int len;
		scsicmd->result |= SAM_STAT_CHECK_CONDITION;