diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_fw.h | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 16 |
2 files changed, 13 insertions, 5 deletions
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index 1ee58ad2f4dd..d2f5870628da 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h | |||
@@ -463,7 +463,7 @@ struct sts_entry_24xx { | |||
463 | uint16_t comp_status; /* Completion status. */ | 463 | uint16_t comp_status; /* Completion status. */ |
464 | uint16_t ox_id; /* OX_ID used by the firmware. */ | 464 | uint16_t ox_id; /* OX_ID used by the firmware. */ |
465 | 465 | ||
466 | uint32_t residual_len; /* Residual transfer length. */ | 466 | uint32_t residual_len; /* FW calc residual transfer length. */ |
467 | 467 | ||
468 | uint16_t reserved_1; | 468 | uint16_t reserved_1; |
469 | uint16_t state_flags; /* State flags. */ | 469 | uint16_t state_flags; /* State flags. */ |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 2003dbb70579..40325ec70056 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -805,7 +805,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
805 | uint16_t scsi_status; | 805 | uint16_t scsi_status; |
806 | uint8_t lscsi_status; | 806 | uint8_t lscsi_status; |
807 | int32_t resid; | 807 | int32_t resid; |
808 | uint32_t sense_len, rsp_info_len, resid_len; | 808 | uint32_t sense_len, rsp_info_len, resid_len, fw_resid_len; |
809 | uint8_t *rsp_info, *sense_data; | 809 | uint8_t *rsp_info, *sense_data; |
810 | 810 | ||
811 | sts = (sts_entry_t *) pkt; | 811 | sts = (sts_entry_t *) pkt; |
@@ -859,11 +859,12 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
859 | 859 | ||
860 | fcport = sp->fcport; | 860 | fcport = sp->fcport; |
861 | 861 | ||
862 | sense_len = rsp_info_len = resid_len = 0; | 862 | sense_len = rsp_info_len = resid_len = fw_resid_len = 0; |
863 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { | 863 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { |
864 | sense_len = le32_to_cpu(sts24->sense_len); | 864 | sense_len = le32_to_cpu(sts24->sense_len); |
865 | rsp_info_len = le32_to_cpu(sts24->rsp_data_len); | 865 | rsp_info_len = le32_to_cpu(sts24->rsp_data_len); |
866 | resid_len = le32_to_cpu(sts24->rsp_residual_count); | 866 | resid_len = le32_to_cpu(sts24->rsp_residual_count); |
867 | fw_resid_len = le32_to_cpu(sts24->residual_len); | ||
867 | rsp_info = sts24->data; | 868 | rsp_info = sts24->data; |
868 | sense_data = sts24->data; | 869 | sense_data = sts24->data; |
869 | host_to_fcp_swap(sts24->data, sizeof(sts24->data)); | 870 | host_to_fcp_swap(sts24->data, sizeof(sts24->data)); |
@@ -963,14 +964,21 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
963 | 964 | ||
964 | case CS_DATA_UNDERRUN: | 965 | case CS_DATA_UNDERRUN: |
965 | resid = resid_len; | 966 | resid = resid_len; |
967 | /* Use F/W calculated residual length. */ | ||
968 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) | ||
969 | resid = fw_resid_len; | ||
970 | |||
966 | if (scsi_status & SS_RESIDUAL_UNDER) { | 971 | if (scsi_status & SS_RESIDUAL_UNDER) { |
967 | cp->resid = resid; | 972 | cp->resid = resid; |
968 | CMD_RESID_LEN(cp) = resid; | 973 | CMD_RESID_LEN(cp) = resid; |
969 | } else { | 974 | } else { |
970 | DEBUG2(printk(KERN_INFO | 975 | DEBUG2(printk(KERN_INFO |
971 | "scsi(%ld:%d:%d) UNDERRUN status detected " | 976 | "scsi(%ld:%d:%d) UNDERRUN status detected " |
972 | "0x%x-0x%x.\n", ha->host_no, cp->device->id, | 977 | "0x%x-0x%x. resid=0x%x fw_resid=0x%x cdb=0x%x " |
973 | cp->device->lun, comp_status, scsi_status)); | 978 | "os_underflow=0x%x\n", ha->host_no, |
979 | cp->device->id, cp->device->lun, comp_status, | ||
980 | scsi_status, resid_len, resid, cp->cmnd[0], | ||
981 | cp->underflow)); | ||
974 | 982 | ||
975 | } | 983 | } |
976 | 984 | ||