[SCSI] qla2xxx: Adjust FCP_RSP response-info field check after TMF completion.
Andrew Vasquez [Wed, 23 Feb 2011 23:27:14 +0000 (15:27 -0800)]
Based on reading of the FCP2/4 specification, the driver cannot
expect the storage device to send FCP_RSP information. Instead,
the driver should interpret the data which is present in the frame
to base decisions on the success or failure of the system.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: Madhuranath Iyengar <Madhu.Iyengar@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>

drivers/scsi/qla2xxx/qla_mbx.c

index b4a82b5..7a7c0ec 100644 (file)
@@ -2462,22 +2462,19 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport,
                    "-- completion status (%x).\n", __func__,
                    vha->host_no, le16_to_cpu(sts->comp_status)));
                rval = QLA_FUNCTION_FAILED;
-       } else if (!(le16_to_cpu(sts->scsi_status) &
-           SS_RESPONSE_INFO_LEN_VALID)) {
-               DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
-                   "-- no response info (%x).\n", __func__, vha->host_no,
-                   le16_to_cpu(sts->scsi_status)));
-               rval = QLA_FUNCTION_FAILED;
-       } else if (le32_to_cpu(sts->rsp_data_len) < 4) {
-               DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
-                   "-- not enough response info (%d).\n", __func__,
-                   vha->host_no, le32_to_cpu(sts->rsp_data_len)));
-               rval = QLA_FUNCTION_FAILED;
-       } else if (sts->data[3]) {
-               DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
-                   "-- response (%x).\n", __func__,
-                   vha->host_no, sts->data[3]));
-               rval = QLA_FUNCTION_FAILED;
+       } else if (le16_to_cpu(sts->scsi_status) &
+           SS_RESPONSE_INFO_LEN_VALID) {
+               if (le32_to_cpu(sts->rsp_data_len) < 4) {
+                       DEBUG2_3_11(printk("%s(%ld): ignoring inconsistent "
+                           "data length -- not enough response info (%d).\n",
+                           __func__, vha->host_no,
+                           le32_to_cpu(sts->rsp_data_len)));
+               } else if (sts->data[3]) {
+                       DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "
+                           "-- response (%x).\n", __func__,
+                           vha->host_no, sts->data[3]));
+                       rval = QLA_FUNCTION_FAILED;
+               }
        }
 
        /* Issue marker IOCB. */