diff options
author | Andrew Vasquez <andrew.vasquez@qlogic.com> | 2011-02-23 18:27:14 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2011-02-25 12:59:13 -0500 |
commit | 97dec564fd4948e0e560869c80b76e166ca2a83e (patch) | |
tree | 33588cc8b6bdc3c94979f56ae3a1edd247777981 /drivers | |
parent | 6aef87bea9d37d5adf45f3d1c674ccf6f95799ca (diff) |
[SCSI] qla2xxx: Adjust FCP_RSP response-info field check after TMF completion.
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index b4a82b5f0f8b..7a7c0ecfe7dd 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -2462,22 +2462,19 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, | |||
2462 | "-- completion status (%x).\n", __func__, | 2462 | "-- completion status (%x).\n", __func__, |
2463 | vha->host_no, le16_to_cpu(sts->comp_status))); | 2463 | vha->host_no, le16_to_cpu(sts->comp_status))); |
2464 | rval = QLA_FUNCTION_FAILED; | 2464 | rval = QLA_FUNCTION_FAILED; |
2465 | } else if (!(le16_to_cpu(sts->scsi_status) & | 2465 | } else if (le16_to_cpu(sts->scsi_status) & |
2466 | SS_RESPONSE_INFO_LEN_VALID)) { | 2466 | SS_RESPONSE_INFO_LEN_VALID) { |
2467 | DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " | 2467 | if (le32_to_cpu(sts->rsp_data_len) < 4) { |
2468 | "-- no response info (%x).\n", __func__, vha->host_no, | 2468 | DEBUG2_3_11(printk("%s(%ld): ignoring inconsistent " |
2469 | le16_to_cpu(sts->scsi_status))); | 2469 | "data length -- not enough response info (%d).\n", |
2470 | rval = QLA_FUNCTION_FAILED; | 2470 | __func__, vha->host_no, |
2471 | } else if (le32_to_cpu(sts->rsp_data_len) < 4) { | 2471 | le32_to_cpu(sts->rsp_data_len))); |
2472 | DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " | 2472 | } else if (sts->data[3]) { |
2473 | "-- not enough response info (%d).\n", __func__, | 2473 | DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " |
2474 | vha->host_no, le32_to_cpu(sts->rsp_data_len))); | 2474 | "-- response (%x).\n", __func__, |
2475 | rval = QLA_FUNCTION_FAILED; | 2475 | vha->host_no, sts->data[3])); |
2476 | } else if (sts->data[3]) { | 2476 | rval = QLA_FUNCTION_FAILED; |
2477 | DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " | 2477 | } |
2478 | "-- response (%x).\n", __func__, | ||
2479 | vha->host_no, sts->data[3])); | ||
2480 | rval = QLA_FUNCTION_FAILED; | ||
2481 | } | 2478 | } |
2482 | 2479 | ||
2483 | /* Issue marker IOCB. */ | 2480 | /* Issue marker IOCB. */ |