diff options
| author | Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com> | 2015-08-28 06:38:37 -0400 |
|---|---|---|
| committer | James Bottomley <JBottomley@Odin.com> | 2015-11-09 19:02:57 -0500 |
| commit | 55b8760847a6e593ab67448ca79f83c4b1a9f012 (patch) | |
| tree | 72d51c24c7d55676fdcf68d6831b1f5da576223c /drivers/scsi/aacraid | |
| parent | c6992781d9e8086d592f95870092a59042d111a2 (diff) | |
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: Murthy Bhat <Murthy.Bhat@pmcs.com>
Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
Diffstat (limited to 'drivers/scsi/aacraid')
| -rw-r--r-- | drivers/scsi/aacraid/aachba.c | 259 |
1 files changed, 137 insertions, 122 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 05f2a0295f4d..e4c243748a97 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
| @@ -2977,11 +2977,16 @@ static void aac_srb_callback(void *context, struct fib * fibptr) | |||
| 2977 | return; | 2977 | return; |
| 2978 | 2978 | ||
| 2979 | BUG_ON(fibptr == NULL); | 2979 | BUG_ON(fibptr == NULL); |
| 2980 | |||
| 2981 | dev = fibptr->dev; | 2980 | dev = fibptr->dev; |
| 2982 | 2981 | ||
| 2983 | srbreply = (struct aac_srb_reply *) fib_data(fibptr); | 2982 | scsi_dma_unmap(scsicmd); |
| 2984 | 2983 | ||
| 2984 | /* expose physical device if expose_physicald flag is on */ | ||
| 2985 | if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01) | ||
| 2986 | && expose_physicals > 0) | ||
| 2987 | aac_expose_phy_device(scsicmd); | ||
| 2988 | |||
| 2989 | srbreply = (struct aac_srb_reply *) fib_data(fibptr); | ||
| 2985 | scsicmd->sense_buffer[0] = '\0'; /* Initialize sense valid flag to false */ | 2990 | scsicmd->sense_buffer[0] = '\0'; /* Initialize sense valid flag to false */ |
| 2986 | 2991 | ||
| 2987 | if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) { | 2992 | if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) { |
| @@ -2994,147 +2999,157 @@ static void aac_srb_callback(void *context, struct fib * fibptr) | |||
| 2994 | */ | 2999 | */ |
| 2995 | scsi_set_resid(scsicmd, scsi_bufflen(scsicmd) | 3000 | scsi_set_resid(scsicmd, scsi_bufflen(scsicmd) |
| 2996 | - le32_to_cpu(srbreply->data_xfer_length)); | 3001 | - le32_to_cpu(srbreply->data_xfer_length)); |
| 2997 | } | 3002 | /* |
| 2998 | 3003 | * First check the fib status | |
| 2999 | scsi_dma_unmap(scsicmd); | 3004 | */ |
| 3000 | |||
| 3001 | /* expose physical device if expose_physicald flag is on */ | ||
| 3002 | if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01) | ||
| 3003 | && expose_physicals > 0) | ||
| 3004 | aac_expose_phy_device(scsicmd); | ||
| 3005 | 3005 | ||
| 3006 | /* | 3006 | if (le32_to_cpu(srbreply->status) != ST_OK) { |
| 3007 | * First check the fib status | 3007 | int len; |
| 3008 | */ | ||
| 3009 | 3008 | ||
| 3010 | if (le32_to_cpu(srbreply->status) != ST_OK){ | 3009 | printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status)); |
| 3011 | int len; | 3010 | len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), |
| 3012 | printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status)); | 3011 | SCSI_SENSE_BUFFERSIZE); |
| 3013 | len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), | 3012 | scsicmd->result = DID_ERROR << 16 |
| 3014 | SCSI_SENSE_BUFFERSIZE); | 3013 | | COMMAND_COMPLETE << 8 |
| 3015 | scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION; | 3014 | | SAM_STAT_CHECK_CONDITION; |
| 3016 | memcpy(scsicmd->sense_buffer, srbreply->sense_data, len); | 3015 | memcpy(scsicmd->sense_buffer, |
| 3017 | } | 3016 | srbreply->sense_data, len); |
| 3017 | } | ||
| 3018 | 3018 | ||
| 3019 | /* | 3019 | /* |
| 3020 | * Next check the srb status | 3020 | * Next check the srb status |
| 3021 | */ | 3021 | */ |
| 3022 | switch( (le32_to_cpu(srbreply->srb_status))&0x3f){ | 3022 | switch ((le32_to_cpu(srbreply->srb_status))&0x3f) { |
| 3023 | case SRB_STATUS_ERROR_RECOVERY: | 3023 | case SRB_STATUS_ERROR_RECOVERY: |
| 3024 | case SRB_STATUS_PENDING: | 3024 | case SRB_STATUS_PENDING: |
| 3025 | case SRB_STATUS_SUCCESS: | 3025 | case SRB_STATUS_SUCCESS: |
| 3026 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | 3026 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; |
| 3027 | break; | 3027 | break; |
| 3028 | case SRB_STATUS_DATA_OVERRUN: | 3028 | case SRB_STATUS_DATA_OVERRUN: |
| 3029 | switch(scsicmd->cmnd[0]){ | 3029 | switch (scsicmd->cmnd[0]) { |
| 3030 | case READ_6: | 3030 | case READ_6: |
| 3031 | case WRITE_6: | 3031 | case WRITE_6: |
| 3032 | case READ_10: | 3032 | case READ_10: |
| 3033 | case WRITE_10: | 3033 | case WRITE_10: |
| 3034 | case READ_12: | 3034 | case READ_12: |
| 3035 | case WRITE_12: | 3035 | case WRITE_12: |
| 3036 | case READ_16: | 3036 | case READ_16: |
| 3037 | case WRITE_16: | 3037 | case WRITE_16: |
| 3038 | if (le32_to_cpu(srbreply->data_xfer_length) < scsicmd->underflow) { | 3038 | if (le32_to_cpu(srbreply->data_xfer_length) |
| 3039 | printk(KERN_WARNING"aacraid: SCSI CMD underflow\n"); | 3039 | < scsicmd->underflow) |
| 3040 | } else { | 3040 | printk(KERN_WARNING"aacraid: SCSI CMD underflow\n"); |
| 3041 | printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n"); | 3041 | else |
| 3042 | printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n"); | ||
| 3043 | scsicmd->result = DID_ERROR << 16 | ||
| 3044 | | COMMAND_COMPLETE << 8; | ||
| 3045 | break; | ||
| 3046 | case INQUIRY: { | ||
| 3047 | scsicmd->result = DID_OK << 16 | ||
| 3048 | | COMMAND_COMPLETE << 8; | ||
| 3049 | break; | ||
| 3050 | } | ||
| 3051 | default: | ||
| 3052 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | ||
| 3053 | break; | ||
| 3042 | } | 3054 | } |
| 3043 | scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8; | ||
| 3044 | break; | 3055 | break; |
| 3045 | case INQUIRY: { | 3056 | case SRB_STATUS_ABORTED: |
| 3046 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | 3057 | scsicmd->result = DID_ABORT << 16 | ABORT << 8; |
| 3047 | break; | 3058 | break; |
| 3048 | } | 3059 | case SRB_STATUS_ABORT_FAILED: |
| 3049 | default: | 3060 | /* |
| 3050 | scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | 3061 | * Not sure about this one - but assuming the |
| 3062 | * hba was trying to abort for some reason | ||
| 3063 | */ | ||
| 3064 | scsicmd->result = DID_ERROR << 16 | ABORT << 8; | ||
| 3065 | break; | ||
| 3066 | case SRB_STATUS_PARITY_ERROR: | ||
| 3067 | scsicmd->result = DID_PARITY << 16 | ||
| 3068 | | MSG_PARITY_ERROR << 8; | ||
| 3069 | break; | ||
| 3070 | case SRB_STATUS_NO_DEVICE: | ||
| 3071 | case SRB_STATUS_INVALID_PATH_ID: | ||
| 3072 | case SRB_STATUS_INVALID_TARGET_ID: | ||
| 3073 | case SRB_STATUS_INVALID_LUN: | ||
| 3074 | case SRB_STATUS_SELECTION_TIMEOUT: | ||
| 3075 | scsicmd->result = DID_NO_CONNECT << 16 | ||
| 3076 | | COMMAND_COMPLETE << 8; | ||
| 3051 | break; | 3077 | break; |
| 3052 | } | ||
| 3053 | break; | ||
| 3054 | case SRB_STATUS_ABORTED: | ||
| 3055 | scsicmd->result = DID_ABORT << 16 | ABORT << 8; | ||
| 3056 | break; | ||
| 3057 | case SRB_STATUS_ABORT_FAILED: | ||
| 3058 | // Not sure about this one - but assuming the hba was trying to abort for some reason | ||
| 3059 | scsicmd->result = DID_ERROR << 16 | ABORT << 8; | ||
| 3060 | break; | ||
| 3061 | case SRB_STATUS_PARITY_ERROR: | ||
| 3062 | scsicmd->result = DID_PARITY << 16 | MSG_PARITY_ERROR << 8; | ||
| 3063 | break; | ||
| 3064 | case SRB_STATUS_NO_DEVICE: | ||
| 3065 | case SRB_STATUS_INVALID_PATH_ID: | ||
| 3066 | case SRB_STATUS_INVALID_TARGET_ID: | ||
| 3067 | case SRB_STATUS_INVALID_LUN: | ||
| 3068 | case SRB_STATUS_SELECTION_TIMEOUT: | ||
| 3069 | scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8; | ||
| 3070 | break; | ||
| 3071 | 3078 | ||
| 3072 | case SRB_STATUS_COMMAND_TIMEOUT: | 3079 | case SRB_STATUS_COMMAND_TIMEOUT: |
| 3073 | case SRB_STATUS_TIMEOUT: | 3080 | case SRB_STATUS_TIMEOUT: |
| 3074 | scsicmd->result = DID_TIME_OUT << 16 | COMMAND_COMPLETE << 8; | 3081 | scsicmd->result = DID_TIME_OUT << 16 |
| 3075 | break; | 3082 | | COMMAND_COMPLETE << 8; |
| 3083 | break; | ||
| 3076 | 3084 | ||
| 3077 | case SRB_STATUS_BUSY: | 3085 | case SRB_STATUS_BUSY: |
| 3078 | scsicmd->result = DID_BUS_BUSY << 16 | COMMAND_COMPLETE << 8; | 3086 | scsicmd->result = DID_BUS_BUSY << 16 |
| 3079 | break; | 3087 | | COMMAND_COMPLETE << 8; |
| 3088 | break; | ||
| 3080 | 3089 | ||
| 3081 | case SRB_STATUS_BUS_RESET: | 3090 | case SRB_STATUS_BUS_RESET: |
| 3082 | scsicmd->result = DID_RESET << 16 | COMMAND_COMPLETE << 8; | 3091 | scsicmd->result = DID_RESET << 16 |
| 3083 | break; | 3092 | | COMMAND_COMPLETE << 8; |
| 3093 | break; | ||
| 3084 | 3094 | ||
| 3085 | case SRB_STATUS_MESSAGE_REJECTED: | 3095 | case SRB_STATUS_MESSAGE_REJECTED: |
| 3086 | scsicmd->result = DID_ERROR << 16 | MESSAGE_REJECT << 8; | 3096 | scsicmd->result = DID_ERROR << 16 |
| 3087 | break; | 3097 | | MESSAGE_REJECT << 8; |
| 3088 | case SRB_STATUS_REQUEST_FLUSHED: | 3098 | break; |
| 3089 | case SRB_STATUS_ERROR: | 3099 | case SRB_STATUS_REQUEST_FLUSHED: |
| 3090 | case SRB_STATUS_INVALID_REQUEST: | 3100 | case SRB_STATUS_ERROR: |
| 3091 | case SRB_STATUS_REQUEST_SENSE_FAILED: | 3101 | case SRB_STATUS_INVALID_REQUEST: |
| 3092 | case SRB_STATUS_NO_HBA: | 3102 | case SRB_STATUS_REQUEST_SENSE_FAILED: |
| 3093 | case SRB_STATUS_UNEXPECTED_BUS_FREE: | 3103 | case SRB_STATUS_NO_HBA: |
| 3094 | case SRB_STATUS_PHASE_SEQUENCE_FAILURE: | 3104 | case SRB_STATUS_UNEXPECTED_BUS_FREE: |
| 3095 | case SRB_STATUS_BAD_SRB_BLOCK_LENGTH: | 3105 | case SRB_STATUS_PHASE_SEQUENCE_FAILURE: |
| 3096 | case SRB_STATUS_DELAYED_RETRY: | 3106 | case SRB_STATUS_BAD_SRB_BLOCK_LENGTH: |
| 3097 | case SRB_STATUS_BAD_FUNCTION: | 3107 | case SRB_STATUS_DELAYED_RETRY: |
| 3098 | case SRB_STATUS_NOT_STARTED: | 3108 | case SRB_STATUS_BAD_FUNCTION: |
| 3099 | case SRB_STATUS_NOT_IN_USE: | 3109 | case SRB_STATUS_NOT_STARTED: |
| 3100 | case SRB_STATUS_FORCE_ABORT: | 3110 | case SRB_STATUS_NOT_IN_USE: |
| 3101 | case SRB_STATUS_DOMAIN_VALIDATION_FAIL: | 3111 | case SRB_STATUS_FORCE_ABORT: |
| 3102 | default: | 3112 | case SRB_STATUS_DOMAIN_VALIDATION_FAIL: |
| 3113 | default: | ||
| 3103 | #ifdef AAC_DETAILED_STATUS_INFO | 3114 | #ifdef AAC_DETAILED_STATUS_INFO |
| 3104 | printk("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n", | 3115 | printk(KERN_INFO "aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n", |
| 3105 | le32_to_cpu(srbreply->srb_status) & 0x3F, | 3116 | le32_to_cpu(srbreply->srb_status) & 0x3F, |
| 3106 | aac_get_status_string( | 3117 | aac_get_status_string( |
| 3107 | le32_to_cpu(srbreply->srb_status) & 0x3F), | 3118 | le32_to_cpu(srbreply->srb_status) & 0x3F), |
| 3108 | scsicmd->cmnd[0], | 3119 | scsicmd->cmnd[0], |
| 3109 | le32_to_cpu(srbreply->scsi_status)); | 3120 | le32_to_cpu(srbreply->scsi_status)); |
| 3110 | #endif | 3121 | #endif |
| 3111 | if ((scsicmd->cmnd[0] == ATA_12) | 3122 | if ((scsicmd->cmnd[0] == ATA_12) |
| 3112 | || (scsicmd->cmnd[0] == ATA_16)) { | 3123 | || (scsicmd->cmnd[0] == ATA_16)) { |
| 3113 | if (scsicmd->cmnd[2] & (0x01 << 5)) { | 3124 | if (scsicmd->cmnd[2] & (0x01 << 5)) { |
| 3114 | scsicmd->result = DID_OK << 16 | 3125 | scsicmd->result = DID_OK << 16 |
| 3115 | | COMMAND_COMPLETE << 8; | 3126 | | COMMAND_COMPLETE << 8; |
| 3116 | break; | 3127 | break; |
| 3128 | } else { | ||
| 3129 | scsicmd->result = DID_ERROR << 16 | ||
| 3130 | | COMMAND_COMPLETE << 8; | ||
| 3131 | break; | ||
| 3132 | } | ||
| 3117 | } else { | 3133 | } else { |
| 3118 | scsicmd->result = DID_ERROR << 16 | 3134 | scsicmd->result = DID_ERROR << 16 |
| 3119 | | COMMAND_COMPLETE << 8; | 3135 | | COMMAND_COMPLETE << 8; |
| 3120 | break; | 3136 | break; |
| 3121 | } | 3137 | } |
| 3122 | } else { | ||
| 3123 | scsicmd->result = DID_ERROR << 16 | ||
| 3124 | | COMMAND_COMPLETE << 8; | ||
| 3125 | break; | ||
| 3126 | } | 3138 | } |
| 3127 | } | 3139 | if (le32_to_cpu(srbreply->scsi_status) |
| 3128 | if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) { | 3140 | == SAM_STAT_CHECK_CONDITION) { |
| 3129 | int len; | 3141 | int len; |
| 3130 | scsicmd->result |= SAM_STAT_CHECK_CONDITION; | 3142 | |
| 3131 | len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), | 3143 | scsicmd->result |= SAM_STAT_CHECK_CONDITION; |
| 3132 | SCSI_SENSE_BUFFERSIZE); | 3144 | len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), |
| 3145 | SCSI_SENSE_BUFFERSIZE); | ||
| 3133 | #ifdef AAC_DETAILED_STATUS_INFO | 3146 | #ifdef AAC_DETAILED_STATUS_INFO |
| 3134 | printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n", | 3147 | printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n", |
| 3135 | le32_to_cpu(srbreply->status), len); | 3148 | le32_to_cpu(srbreply->status), len); |
| 3136 | #endif | 3149 | #endif |
| 3137 | memcpy(scsicmd->sense_buffer, srbreply->sense_data, len); | 3150 | memcpy(scsicmd->sense_buffer, |
| 3151 | srbreply->sense_data, len); | ||
| 3152 | } | ||
| 3138 | } | 3153 | } |
| 3139 | /* | 3154 | /* |
| 3140 | * OR in the scsi status (already shifted up a bit) | 3155 | * OR in the scsi status (already shifted up a bit) |
