Commit 6ea7e33e authored by David C Somayajulu's avatar David C Somayajulu Committed by James Bottomley

[SCSI] qla4xxx: Fix underrun/overrun conditions

On Wed, 2007-06-06 at 11:55 -0700, David C Somayajulu wrote:
This patch fixes the code handling underrun and overrun conditions.
Also fixed coding style as per Mike Christie's advice.
Signed-off-by: default avatarDavid Somayajulu <david.somayajulu@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 0c2cc433
...@@ -93,9 +93,29 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha, ...@@ -93,9 +93,29 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
break; break;
} }
if (sts_entry->iscsiFlags & if (sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_OVER) {
(ISCSI_FLAG_RESIDUAL_OVER|ISCSI_FLAG_RESIDUAL_UNDER)) cmd->result = DID_ERROR << 16;
break;
}
if (sts_entry->iscsiFlags &ISCSI_FLAG_RESIDUAL_UNDER) {
scsi_set_resid(cmd, residual); scsi_set_resid(cmd, residual);
if (!scsi_status && ((scsi_bufflen(cmd) - residual) <
cmd->underflow)) {
cmd->result = DID_ERROR << 16;
DEBUG2(printk("scsi%ld:%d:%d:%d: %s: "
"Mid-layer Data underrun0, "
"xferlen = 0x%x, "
"residual = 0x%x\n", ha->host_no,
cmd->device->channel,
cmd->device->id,
cmd->device->lun, __func__,
scsi_bufflen(cmd), residual));
break;
}
}
cmd->result = DID_OK << 16 | scsi_status; cmd->result = DID_OK << 16 | scsi_status;
...@@ -164,7 +184,8 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha, ...@@ -164,7 +184,8 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
case SCS_DATA_UNDERRUN: case SCS_DATA_UNDERRUN:
case SCS_DATA_OVERRUN: case SCS_DATA_OVERRUN:
if (sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_OVER) { if ((sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_OVER) ||
(sts_entry->completionStatus == SCS_DATA_OVERRUN)) {
DEBUG2(printk("scsi%ld:%d:%d:%d: %s: " "Data overrun, " DEBUG2(printk("scsi%ld:%d:%d:%d: %s: " "Data overrun, "
"residual = 0x%x\n", ha->host_no, "residual = 0x%x\n", ha->host_no,
cmd->device->channel, cmd->device->id, cmd->device->channel, cmd->device->id,
...@@ -174,21 +195,7 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha, ...@@ -174,21 +195,7 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
break; break;
} }
if ((sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_UNDER) == 0) { scsi_set_resid(cmd, residual);
/*
* Firmware detected a SCSI transport underrun
* condition
*/
scsi_set_resid(cmd, residual);
DEBUG2(printk("scsi%ld:%d:%d:%d: %s: UNDERRUN status "
"detected, xferlen = 0x%x, residual = "
"0x%x\n",
ha->host_no, cmd->device->channel,
cmd->device->id,
cmd->device->lun, __func__,
scsi_bufflen(cmd),
residual));
}
/* /*
* If there is scsi_status, it takes precedense over * If there is scsi_status, it takes precedense over
...@@ -245,13 +252,13 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha, ...@@ -245,13 +252,13 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
* will return DID_ERROR. * will return DID_ERROR.
*/ */
DEBUG2(printk("scsi%ld:%d:%d:%d: %s: " DEBUG2(printk("scsi%ld:%d:%d:%d: %s: "
"Mid-layer Data underrun, " "Mid-layer Data underrun1, "
"xferlen = 0x%x, " "xferlen = 0x%x, "
"residual = 0x%x\n", ha->host_no, "residual = 0x%x\n", ha->host_no,
cmd->device->channel, cmd->device->channel,
cmd->device->id, cmd->device->id,
cmd->device->lun, __func__, cmd->device->lun, __func__,
scsi_bufflen(cmd), residual)); scsi_bufflen(cmd), residual));
cmd->result = DID_ERROR << 16; cmd->result = DID_ERROR << 16;
} else { } else {
......
...@@ -5,5 +5,5 @@ ...@@ -5,5 +5,5 @@
* See LICENSE.qla4xxx for copyright and licensing details. * See LICENSE.qla4xxx for copyright and licensing details.
*/ */
#define QLA4XXX_DRIVER_VERSION "5.01.00-k7" #define QLA4XXX_DRIVER_VERSION "5.01.00-k8"
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