diff options
Diffstat (limited to 'drivers/scsi/lpfc')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_logmsg.h | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 35 |
3 files changed, 24 insertions, 15 deletions
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index f05ef3011307..73d3afc72de2 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
@@ -806,7 +806,7 @@ static CLASS_DEVICE_ATTR(lpfc_devloss_tmo, S_IRUGO | S_IWUSR, | |||
806 | # LOG_NODE 0x80 Node table events | 806 | # LOG_NODE 0x80 Node table events |
807 | # LOG_MISC 0x400 Miscellaneous events | 807 | # LOG_MISC 0x400 Miscellaneous events |
808 | # LOG_SLI 0x800 SLI events | 808 | # LOG_SLI 0x800 SLI events |
809 | # LOG_CHK_COND 0x1000 FCP Check condition flag | 809 | # LOG_FCP_ERROR 0x1000 Only log FCP errors |
810 | # LOG_LIBDFC 0x2000 LIBDFC events | 810 | # LOG_LIBDFC 0x2000 LIBDFC events |
811 | # LOG_ALL_MSG 0xffff LOG all messages | 811 | # LOG_ALL_MSG 0xffff LOG all messages |
812 | */ | 812 | */ |
diff --git a/drivers/scsi/lpfc/lpfc_logmsg.h b/drivers/scsi/lpfc/lpfc_logmsg.h index 62c8ca862e9e..438cbcd9eb13 100644 --- a/drivers/scsi/lpfc/lpfc_logmsg.h +++ b/drivers/scsi/lpfc/lpfc_logmsg.h | |||
@@ -28,7 +28,7 @@ | |||
28 | #define LOG_NODE 0x80 /* Node table events */ | 28 | #define LOG_NODE 0x80 /* Node table events */ |
29 | #define LOG_MISC 0x400 /* Miscellaneous events */ | 29 | #define LOG_MISC 0x400 /* Miscellaneous events */ |
30 | #define LOG_SLI 0x800 /* SLI events */ | 30 | #define LOG_SLI 0x800 /* SLI events */ |
31 | #define LOG_CHK_COND 0x1000 /* FCP Check condition flag */ | 31 | #define LOG_FCP_ERROR 0x1000 /* log errors, not underruns */ |
32 | #define LOG_LIBDFC 0x2000 /* Libdfc events */ | 32 | #define LOG_LIBDFC 0x2000 /* Libdfc events */ |
33 | #define LOG_ALL_MSG 0xffff /* LOG all messages */ | 33 | #define LOG_ALL_MSG 0xffff /* LOG all messages */ |
34 | 34 | ||
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 97ae98dc95d0..125179af470c 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -297,8 +297,10 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf *lpfc_cmd) | |||
297 | uint32_t fcpi_parm = lpfc_cmd->cur_iocbq.iocb.un.fcpi.fcpi_parm; | 297 | uint32_t fcpi_parm = lpfc_cmd->cur_iocbq.iocb.un.fcpi.fcpi_parm; |
298 | uint32_t resp_info = fcprsp->rspStatus2; | 298 | uint32_t resp_info = fcprsp->rspStatus2; |
299 | uint32_t scsi_status = fcprsp->rspStatus3; | 299 | uint32_t scsi_status = fcprsp->rspStatus3; |
300 | uint32_t *lp; | ||
300 | uint32_t host_status = DID_OK; | 301 | uint32_t host_status = DID_OK; |
301 | uint32_t rsplen = 0; | 302 | uint32_t rsplen = 0; |
303 | uint32_t logit = LOG_FCP | LOG_FCP_ERROR; | ||
302 | 304 | ||
303 | /* | 305 | /* |
304 | * If this is a task management command, there is no | 306 | * If this is a task management command, there is no |
@@ -310,10 +312,25 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf *lpfc_cmd) | |||
310 | goto out; | 312 | goto out; |
311 | } | 313 | } |
312 | 314 | ||
313 | lpfc_printf_log(phba, KERN_WARNING, LOG_FCP, | 315 | if ((resp_info & SNS_LEN_VALID) && fcprsp->rspSnsLen) { |
314 | "%d:0730 FCP command failed: RSP " | 316 | uint32_t snslen = be32_to_cpu(fcprsp->rspSnsLen); |
315 | "Data: x%x x%x x%x x%x x%x x%x\n", | 317 | if (snslen > SCSI_SENSE_BUFFERSIZE) |
316 | phba->brd_no, resp_info, scsi_status, | 318 | snslen = SCSI_SENSE_BUFFERSIZE; |
319 | |||
320 | if (resp_info & RSP_LEN_VALID) | ||
321 | rsplen = be32_to_cpu(fcprsp->rspRspLen); | ||
322 | memcpy(cmnd->sense_buffer, &fcprsp->rspInfo0 + rsplen, snslen); | ||
323 | } | ||
324 | lp = (uint32_t *)cmnd->sense_buffer; | ||
325 | |||
326 | if (!scsi_status && (resp_info & RESID_UNDER)) | ||
327 | logit = LOG_FCP; | ||
328 | |||
329 | lpfc_printf_log(phba, KERN_WARNING, logit, | ||
330 | "%d:0730 FCP command x%x failed: x%x SNS x%x x%x " | ||
331 | "Data: x%x x%x x%x x%x x%x\n", | ||
332 | phba->brd_no, cmnd->cmnd[0], scsi_status, | ||
333 | be32_to_cpu(*lp), be32_to_cpu(*(lp + 3)), resp_info, | ||
317 | be32_to_cpu(fcprsp->rspResId), | 334 | be32_to_cpu(fcprsp->rspResId), |
318 | be32_to_cpu(fcprsp->rspSnsLen), | 335 | be32_to_cpu(fcprsp->rspSnsLen), |
319 | be32_to_cpu(fcprsp->rspRspLen), | 336 | be32_to_cpu(fcprsp->rspRspLen), |
@@ -328,14 +345,6 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf *lpfc_cmd) | |||
328 | } | 345 | } |
329 | } | 346 | } |
330 | 347 | ||
331 | if ((resp_info & SNS_LEN_VALID) && fcprsp->rspSnsLen) { | ||
332 | uint32_t snslen = be32_to_cpu(fcprsp->rspSnsLen); | ||
333 | if (snslen > SCSI_SENSE_BUFFERSIZE) | ||
334 | snslen = SCSI_SENSE_BUFFERSIZE; | ||
335 | |||
336 | memcpy(cmnd->sense_buffer, &fcprsp->rspInfo0 + rsplen, snslen); | ||
337 | } | ||
338 | |||
339 | cmnd->resid = 0; | 348 | cmnd->resid = 0; |
340 | if (resp_info & RESID_UNDER) { | 349 | if (resp_info & RESID_UNDER) { |
341 | cmnd->resid = be32_to_cpu(fcprsp->rspResId); | 350 | cmnd->resid = be32_to_cpu(fcprsp->rspResId); |
@@ -378,7 +387,7 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf *lpfc_cmd) | |||
378 | */ | 387 | */ |
379 | } else if ((scsi_status == SAM_STAT_GOOD) && fcpi_parm && | 388 | } else if ((scsi_status == SAM_STAT_GOOD) && fcpi_parm && |
380 | (cmnd->sc_data_direction == DMA_FROM_DEVICE)) { | 389 | (cmnd->sc_data_direction == DMA_FROM_DEVICE)) { |
381 | lpfc_printf_log(phba, KERN_WARNING, LOG_FCP, | 390 | lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_FCP_ERROR, |
382 | "%d:0734 FCP Read Check Error Data: " | 391 | "%d:0734 FCP Read Check Error Data: " |
383 | "x%x x%x x%x x%x\n", phba->brd_no, | 392 | "x%x x%x x%x x%x\n", phba->brd_no, |
384 | be32_to_cpu(fcpcmd->fcpDl), | 393 | be32_to_cpu(fcpcmd->fcpDl), |