Commit ed17c71b authored by Ravi Anand's avatar Ravi Anand Committed by James Bottomley

[SCSI] qla2xxx: Use FW calculated residual count for underrun handling.

With ISP24XX and ISP54XX parts.
Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 45aeaf1e
...@@ -463,7 +463,7 @@ struct sts_entry_24xx { ...@@ -463,7 +463,7 @@ struct sts_entry_24xx {
uint16_t comp_status; /* Completion status. */ uint16_t comp_status; /* Completion status. */
uint16_t ox_id; /* OX_ID used by the firmware. */ uint16_t ox_id; /* OX_ID used by the firmware. */
uint32_t residual_len; /* Residual transfer length. */ uint32_t residual_len; /* FW calc residual transfer length. */
uint16_t reserved_1; uint16_t reserved_1;
uint16_t state_flags; /* State flags. */ uint16_t state_flags; /* State flags. */
......
...@@ -805,7 +805,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) ...@@ -805,7 +805,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
uint16_t scsi_status; uint16_t scsi_status;
uint8_t lscsi_status; uint8_t lscsi_status;
int32_t resid; int32_t resid;
uint32_t sense_len, rsp_info_len, resid_len; uint32_t sense_len, rsp_info_len, resid_len, fw_resid_len;
uint8_t *rsp_info, *sense_data; uint8_t *rsp_info, *sense_data;
sts = (sts_entry_t *) pkt; sts = (sts_entry_t *) pkt;
...@@ -859,11 +859,12 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) ...@@ -859,11 +859,12 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
fcport = sp->fcport; fcport = sp->fcport;
sense_len = rsp_info_len = resid_len = 0; sense_len = rsp_info_len = resid_len = fw_resid_len = 0;
if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) {
sense_len = le32_to_cpu(sts24->sense_len); sense_len = le32_to_cpu(sts24->sense_len);
rsp_info_len = le32_to_cpu(sts24->rsp_data_len); rsp_info_len = le32_to_cpu(sts24->rsp_data_len);
resid_len = le32_to_cpu(sts24->rsp_residual_count); resid_len = le32_to_cpu(sts24->rsp_residual_count);
fw_resid_len = le32_to_cpu(sts24->residual_len);
rsp_info = sts24->data; rsp_info = sts24->data;
sense_data = sts24->data; sense_data = sts24->data;
host_to_fcp_swap(sts24->data, sizeof(sts24->data)); host_to_fcp_swap(sts24->data, sizeof(sts24->data));
...@@ -963,14 +964,21 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) ...@@ -963,14 +964,21 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
case CS_DATA_UNDERRUN: case CS_DATA_UNDERRUN:
resid = resid_len; resid = resid_len;
/* Use F/W calculated residual length. */
if (IS_QLA24XX(ha) || IS_QLA54XX(ha))
resid = fw_resid_len;
if (scsi_status & SS_RESIDUAL_UNDER) { if (scsi_status & SS_RESIDUAL_UNDER) {
cp->resid = resid; cp->resid = resid;
CMD_RESID_LEN(cp) = resid; CMD_RESID_LEN(cp) = resid;
} else { } else {
DEBUG2(printk(KERN_INFO DEBUG2(printk(KERN_INFO
"scsi(%ld:%d:%d) UNDERRUN status detected " "scsi(%ld:%d:%d) UNDERRUN status detected "
"0x%x-0x%x.\n", ha->host_no, cp->device->id, "0x%x-0x%x. resid=0x%x fw_resid=0x%x cdb=0x%x "
cp->device->lun, comp_status, scsi_status)); "os_underflow=0x%x\n", ha->host_no,
cp->device->id, cp->device->lun, comp_status,
scsi_status, resid_len, resid, cp->cmnd[0],
cp->underflow));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment