diff options
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_isr.c | 57 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_version.h | 2 |
2 files changed, 33 insertions, 26 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c index b47bd85f114d..4a154beb0d39 100644 --- a/drivers/scsi/qla4xxx/ql4_isr.c +++ b/drivers/scsi/qla4xxx/ql4_isr.c | |||
| @@ -93,9 +93,29 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha, | |||
| 93 | break; | 93 | break; |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | if (sts_entry->iscsiFlags & | 96 | if (sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_OVER) { |
| 97 | (ISCSI_FLAG_RESIDUAL_OVER|ISCSI_FLAG_RESIDUAL_UNDER)) | 97 | cmd->result = DID_ERROR << 16; |
| 98 | break; | ||
| 99 | } | ||
| 100 | |||
| 101 | if (sts_entry->iscsiFlags &ISCSI_FLAG_RESIDUAL_UNDER) { | ||
| 98 | scsi_set_resid(cmd, residual); | 102 | scsi_set_resid(cmd, residual); |
| 103 | if (!scsi_status && ((scsi_bufflen(cmd) - residual) < | ||
| 104 | cmd->underflow)) { | ||
| 105 | |||
| 106 | cmd->result = DID_ERROR << 16; | ||
| 107 | |||
| 108 | DEBUG2(printk("scsi%ld:%d:%d:%d: %s: " | ||
| 109 | "Mid-layer Data underrun0, " | ||
| 110 | "xferlen = 0x%x, " | ||
| 111 | "residual = 0x%x\n", ha->host_no, | ||
| 112 | cmd->device->channel, | ||
| 113 | cmd->device->id, | ||
| 114 | cmd->device->lun, __func__, | ||
| 115 | scsi_bufflen(cmd), residual)); | ||
| 116 | break; | ||
| 117 | } | ||
| 118 | } | ||
| 99 | 119 | ||
| 100 | cmd->result = DID_OK << 16 | scsi_status; | 120 | cmd->result = DID_OK << 16 | scsi_status; |
| 101 | 121 | ||
| @@ -164,7 +184,8 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha, | |||
| 164 | 184 | ||
| 165 | case SCS_DATA_UNDERRUN: | 185 | case SCS_DATA_UNDERRUN: |
| 166 | case SCS_DATA_OVERRUN: | 186 | case SCS_DATA_OVERRUN: |
| 167 | if (sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_OVER) { | 187 | if ((sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_OVER) || |
| 188 | (sts_entry->completionStatus == SCS_DATA_OVERRUN)) { | ||
| 168 | DEBUG2(printk("scsi%ld:%d:%d:%d: %s: " "Data overrun, " | 189 | DEBUG2(printk("scsi%ld:%d:%d:%d: %s: " "Data overrun, " |
| 169 | "residual = 0x%x\n", ha->host_no, | 190 | "residual = 0x%x\n", ha->host_no, |
| 170 | cmd->device->channel, cmd->device->id, | 191 | cmd->device->channel, cmd->device->id, |
| @@ -174,21 +195,7 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha, | |||
| 174 | break; | 195 | break; |
| 175 | } | 196 | } |
| 176 | 197 | ||
| 177 | if ((sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_UNDER) == 0) { | 198 | scsi_set_resid(cmd, residual); |
| 178 | /* | ||
| 179 | * Firmware detected a SCSI transport underrun | ||
| 180 | * condition | ||
| 181 | */ | ||
| 182 | scsi_set_resid(cmd, residual); | ||
| 183 | DEBUG2(printk("scsi%ld:%d:%d:%d: %s: UNDERRUN status " | ||
| 184 | "detected, xferlen = 0x%x, residual = " | ||
| 185 | "0x%x\n", | ||
| 186 | ha->host_no, cmd->device->channel, | ||
| 187 | cmd->device->id, | ||
| 188 | cmd->device->lun, __func__, | ||
| 189 | scsi_bufflen(cmd), | ||
| 190 | residual)); | ||
| 191 | } | ||
| 192 | 199 | ||
| 193 | /* | 200 | /* |
| 194 | * If there is scsi_status, it takes precedense over | 201 | * If there is scsi_status, it takes precedense over |
| @@ -245,13 +252,13 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha, | |||
| 245 | * will return DID_ERROR. | 252 | * will return DID_ERROR. |
| 246 | */ | 253 | */ |
| 247 | DEBUG2(printk("scsi%ld:%d:%d:%d: %s: " | 254 | DEBUG2(printk("scsi%ld:%d:%d:%d: %s: " |
| 248 | "Mid-layer Data underrun, " | 255 | "Mid-layer Data underrun1, " |
| 249 | "xferlen = 0x%x, " | 256 | "xferlen = 0x%x, " |
| 250 | "residual = 0x%x\n", ha->host_no, | 257 | "residual = 0x%x\n", ha->host_no, |
| 251 | cmd->device->channel, | 258 | cmd->device->channel, |
| 252 | cmd->device->id, | 259 | cmd->device->id, |
| 253 | cmd->device->lun, __func__, | 260 | cmd->device->lun, __func__, |
| 254 | scsi_bufflen(cmd), residual)); | 261 | scsi_bufflen(cmd), residual)); |
| 255 | 262 | ||
| 256 | cmd->result = DID_ERROR << 16; | 263 | cmd->result = DID_ERROR << 16; |
| 257 | } else { | 264 | } else { |
diff --git a/drivers/scsi/qla4xxx/ql4_version.h b/drivers/scsi/qla4xxx/ql4_version.h index 2149069689bd..ab984cb89cea 100644 --- a/drivers/scsi/qla4xxx/ql4_version.h +++ b/drivers/scsi/qla4xxx/ql4_version.h | |||
| @@ -5,5 +5,5 @@ | |||
| 5 | * See LICENSE.qla4xxx for copyright and licensing details. | 5 | * See LICENSE.qla4xxx for copyright and licensing details. |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #define QLA4XXX_DRIVER_VERSION "5.01.00-k7" | 8 | #define QLA4XXX_DRIVER_VERSION "5.01.00-k8" |
| 9 | 9 | ||
