aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/mpt2sas/mpt2sas_scsih.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_scsih.c')
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_scsih.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
index d4e890d8b992..efb6270cf261 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
@@ -3111,7 +3111,7 @@ _scsih_scsi_ioc_info(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
3111 if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) { 3111 if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) {
3112 response_info = le32_to_cpu(mpi_reply->ResponseInfo); 3112 response_info = le32_to_cpu(mpi_reply->ResponseInfo);
3113 response_bytes = (u8 *)&response_info; 3113 response_bytes = (u8 *)&response_info;
3114 _scsih_response_code(ioc, response_bytes[3]); 3114 _scsih_response_code(ioc, response_bytes[0]);
3115 } 3115 }
3116} 3116}
3117#endif 3117#endif
@@ -3229,7 +3229,7 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
3229 u8 scsi_status; 3229 u8 scsi_status;
3230 u32 log_info; 3230 u32 log_info;
3231 struct MPT2SAS_DEVICE *sas_device_priv_data; 3231 struct MPT2SAS_DEVICE *sas_device_priv_data;
3232 u32 response_code; 3232 u32 response_code = 0;
3233 3233
3234 mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); 3234 mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply);
3235 scmd = _scsih_scsi_lookup_get(ioc, smid); 3235 scmd = _scsih_scsi_lookup_get(ioc, smid);
@@ -3251,16 +3251,16 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
3251 } 3251 }
3252 3252
3253 /* turning off TLR */ 3253 /* turning off TLR */
3254 scsi_state = mpi_reply->SCSIState;
3255 if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID)
3256 response_code =
3257 le32_to_cpu(mpi_reply->ResponseInfo) & 0xFF;
3254 if (!sas_device_priv_data->tlr_snoop_check) { 3258 if (!sas_device_priv_data->tlr_snoop_check) {
3255 sas_device_priv_data->tlr_snoop_check++; 3259 sas_device_priv_data->tlr_snoop_check++;
3256 if (sas_device_priv_data->flags & MPT_DEVICE_TLR_ON) { 3260 if ((sas_device_priv_data->flags & MPT_DEVICE_TLR_ON) &&
3257 response_code = (le32_to_cpu(mpi_reply->ResponseInfo) 3261 response_code == MPI2_SCSITASKMGMT_RSP_INVALID_FRAME)
3258 >> 24); 3262 sas_device_priv_data->flags &=
3259 if (response_code == 3263 ~MPT_DEVICE_TLR_ON;
3260 MPI2_SCSITASKMGMT_RSP_INVALID_FRAME)
3261 sas_device_priv_data->flags &=
3262 ~MPT_DEVICE_TLR_ON;
3263 }
3264 } 3264 }
3265 3265
3266 xfer_cnt = le32_to_cpu(mpi_reply->TransferCount); 3266 xfer_cnt = le32_to_cpu(mpi_reply->TransferCount);
@@ -3271,7 +3271,6 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
3271 else 3271 else
3272 log_info = 0; 3272 log_info = 0;
3273 ioc_status &= MPI2_IOCSTATUS_MASK; 3273 ioc_status &= MPI2_IOCSTATUS_MASK;
3274 scsi_state = mpi_reply->SCSIState;
3275 scsi_status = mpi_reply->SCSIStatus; 3274 scsi_status = mpi_reply->SCSIStatus;
3276 3275
3277 if (ioc_status == MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN && xfer_cnt == 0 && 3276 if (ioc_status == MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN && xfer_cnt == 0 &&
@@ -3356,8 +3355,10 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
3356 case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR: 3355 case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR:
3357 case MPI2_IOCSTATUS_SUCCESS: 3356 case MPI2_IOCSTATUS_SUCCESS:
3358 scmd->result = (DID_OK << 16) | scsi_status; 3357 scmd->result = (DID_OK << 16) | scsi_status;
3359 if (scsi_state & (MPI2_SCSI_STATE_AUTOSENSE_FAILED | 3358 if (response_code ==
3360 MPI2_SCSI_STATE_NO_SCSI_STATUS)) 3359 MPI2_SCSITASKMGMT_RSP_INVALID_FRAME ||
3360 (scsi_state & (MPI2_SCSI_STATE_AUTOSENSE_FAILED |
3361 MPI2_SCSI_STATE_NO_SCSI_STATUS)))
3361 scmd->result = DID_SOFT_ERROR << 16; 3362 scmd->result = DID_SOFT_ERROR << 16;
3362 else if (scsi_state & MPI2_SCSI_STATE_TERMINATED) 3363 else if (scsi_state & MPI2_SCSI_STATE_TERMINATED)
3363 scmd->result = DID_RESET << 16; 3364 scmd->result = DID_RESET << 16;