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

Commit 55b87608 authored by Mahesh Rajashekhara's avatar Mahesh Rajashekhara Committed by James Bottomley
Browse files

aacraid: Tune response path if IsFastPath bit set



If 'IsFastPath' bit is set, then response path assumes no error and skips
error check.

Reviewed-by: default avatarMurthy Bhat <Murthy.Bhat@pmcs.com>
Reviewed-by: default avatarKarthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
Signed-off-by: default avatarMahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Odin.com>
parent c6992781
Loading
Loading
Loading
Loading
+137 −122
Original line number Diff line number Diff line
@@ -2977,11 +2977,16 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
		return;

	BUG_ON(fibptr == NULL);

	dev = fibptr->dev;

	srbreply = (struct aac_srb_reply *) fib_data(fibptr);
	scsi_dma_unmap(scsicmd);

	/* expose physical device if expose_physicald flag is on */
	if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
	  && expose_physicals > 0)
		aac_expose_phy_device(scsicmd);

	srbreply = (struct aac_srb_reply *) fib_data(fibptr);
	scsicmd->sense_buffer[0] = '\0';  /* Initialize sense valid flag to false */

	if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) {
@@ -2994,26 +2999,21 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
		 */
		scsi_set_resid(scsicmd, scsi_bufflen(scsicmd)
				   - le32_to_cpu(srbreply->data_xfer_length));
	}

	scsi_dma_unmap(scsicmd);

	/* expose physical device if expose_physicald flag is on */
	if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
	  && expose_physicals > 0)
		aac_expose_phy_device(scsicmd);

		/*
		 * First check the fib status
		 */

		if (le32_to_cpu(srbreply->status) != ST_OK) {
			int len;

			printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status));
			len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
				    SCSI_SENSE_BUFFERSIZE);
		scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
		memcpy(scsicmd->sense_buffer, srbreply->sense_data, len);
			scsicmd->result = DID_ERROR << 16
						| COMMAND_COMPLETE << 8
						| SAM_STAT_CHECK_CONDITION;
			memcpy(scsicmd->sense_buffer,
					srbreply->sense_data, len);
		}

		/*
@@ -3035,15 +3035,17 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
			case  WRITE_12:
			case  READ_16:
			case  WRITE_16:
			if (le32_to_cpu(srbreply->data_xfer_length) < scsicmd->underflow) {
				if (le32_to_cpu(srbreply->data_xfer_length)
							< scsicmd->underflow)
					printk(KERN_WARNING"aacraid: SCSI CMD underflow\n");
			} else {
				else
					printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n");
			}
			scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
				scsicmd->result = DID_ERROR << 16
							| COMMAND_COMPLETE << 8;
				break;
			case INQUIRY: {
			scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
				scsicmd->result = DID_OK << 16
							| COMMAND_COMPLETE << 8;
				break;
			}
			default:
@@ -3055,35 +3057,44 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
			scsicmd->result = DID_ABORT << 16 | ABORT << 8;
			break;
		case SRB_STATUS_ABORT_FAILED:
		// Not sure about this one - but assuming the hba was trying to abort for some reason
			/*
			 * Not sure about this one - but assuming the
			 * hba was trying to abort for some reason
			 */
			scsicmd->result = DID_ERROR << 16 | ABORT << 8;
			break;
		case SRB_STATUS_PARITY_ERROR:
		scsicmd->result = DID_PARITY << 16 | MSG_PARITY_ERROR << 8;
			scsicmd->result = DID_PARITY << 16
						| MSG_PARITY_ERROR << 8;
			break;
		case SRB_STATUS_NO_DEVICE:
		case SRB_STATUS_INVALID_PATH_ID:
		case SRB_STATUS_INVALID_TARGET_ID:
		case SRB_STATUS_INVALID_LUN:
		case SRB_STATUS_SELECTION_TIMEOUT:
		scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
			scsicmd->result = DID_NO_CONNECT << 16
						| COMMAND_COMPLETE << 8;
			break;

		case SRB_STATUS_COMMAND_TIMEOUT:
		case SRB_STATUS_TIMEOUT:
		scsicmd->result = DID_TIME_OUT << 16 | COMMAND_COMPLETE << 8;
			scsicmd->result = DID_TIME_OUT << 16
						| COMMAND_COMPLETE << 8;
			break;

		case SRB_STATUS_BUSY:
		scsicmd->result = DID_BUS_BUSY << 16 | COMMAND_COMPLETE << 8;
			scsicmd->result = DID_BUS_BUSY << 16
						| COMMAND_COMPLETE << 8;
			break;

		case SRB_STATUS_BUS_RESET:
		scsicmd->result = DID_RESET << 16 | COMMAND_COMPLETE << 8;
			scsicmd->result = DID_RESET << 16
						| COMMAND_COMPLETE << 8;
			break;

		case SRB_STATUS_MESSAGE_REJECTED:
		scsicmd->result = DID_ERROR << 16 | MESSAGE_REJECT << 8;
			scsicmd->result = DID_ERROR << 16
						| MESSAGE_REJECT << 8;
			break;
		case SRB_STATUS_REQUEST_FLUSHED:
		case SRB_STATUS_ERROR:
@@ -3101,7 +3112,7 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
		case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
		default:
#ifdef AAC_DETAILED_STATUS_INFO
		printk("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",
			printk(KERN_INFO "aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",
				le32_to_cpu(srbreply->srb_status) & 0x3F,
				aac_get_status_string(
					le32_to_cpu(srbreply->srb_status) & 0x3F),
@@ -3125,8 +3136,10 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
				break;
			}
		}
	if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) {
		if (le32_to_cpu(srbreply->scsi_status)
				== SAM_STAT_CHECK_CONDITION) {
			int len;

			scsicmd->result |= SAM_STAT_CHECK_CONDITION;
			len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
				    SCSI_SENSE_BUFFERSIZE);
@@ -3134,7 +3147,9 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
			printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n",
						le32_to_cpu(srbreply->status), len);
#endif
		memcpy(scsicmd->sense_buffer, srbreply->sense_data, len);
			memcpy(scsicmd->sense_buffer,
					srbreply->sense_data, len);
		}
	}
	/*
	 * OR in the scsi status (already shifted up a bit)