Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+32 −25
Original line number Diff line number Diff line
@@ -93,9 +93,29 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
			break;
		}

		if (sts_entry->iscsiFlags &
		    (ISCSI_FLAG_RESIDUAL_OVER|ISCSI_FLAG_RESIDUAL_UNDER))
		if (sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_OVER) {
			cmd->result = DID_ERROR << 16;
			break;
		}

		if (sts_entry->iscsiFlags &ISCSI_FLAG_RESIDUAL_UNDER) {
			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;

@@ -164,7 +184,8 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,

	case SCS_DATA_UNDERRUN:
	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, "
				      "residual = 0x%x\n", ha->host_no,
				      cmd->device->channel, cmd->device->id,
@@ -174,21 +195,7 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
			break;
		}

		if ((sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_UNDER) == 0) {
			/*
			 * 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
@@ -245,7 +252,7 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
				 * will return DID_ERROR.
				 */
				DEBUG2(printk("scsi%ld:%d:%d:%d: %s: "
					      "Mid-layer Data underrun, "
					"Mid-layer Data underrun1, "
					"xferlen = 0x%x, "
					"residual = 0x%x\n", ha->host_no,
					cmd->device->channel,
+1 −1
Original line number Diff line number Diff line
@@ -5,5 +5,5 @@
 * See LICENSE.qla4xxx for copyright and licensing details.
 */

#define QLA4XXX_DRIVER_VERSION	"5.01.00-k7"
#define QLA4XXX_DRIVER_VERSION	"5.01.00-k8"