diff options
author | Brian King <brking@linux.vnet.ibm.com> | 2008-11-14 14:33:53 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-12-29 12:24:18 -0500 |
commit | 646d3857b95e8e310aae7a4594f43d7f3b100a1f (patch) | |
tree | 44423484257e5fb85fbddac81c116e45cb944664 /drivers/scsi | |
parent | 5919ce29085f4ca080054fde5feef8f8b3405261 (diff) |
[SCSI] ibmvfc: Handle port login required response
The virtual fibre channel stack can return a failure response for a command
indicating the port login has been invalidated without sending the client
an async event. Add code to handle this response and initiate a PLOGI.
Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/ibmvscsi/ibmvfc.c | 3 | ||||
-rw-r--r-- | drivers/scsi/ibmvscsi/ibmvfc.h | 1 |
2 files changed, 4 insertions, 0 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c index eb79f755dad0..8715a7b140cc 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.c +++ b/drivers/scsi/ibmvscsi/ibmvfc.c | |||
@@ -121,6 +121,7 @@ static const struct { | |||
121 | { IBMVFC_VIOS_FAILURE, IBMVFC_TRANS_CANCELLED, DID_ABORT, 0, 1, "transaction cancelled" }, | 121 | { IBMVFC_VIOS_FAILURE, IBMVFC_TRANS_CANCELLED, DID_ABORT, 0, 1, "transaction cancelled" }, |
122 | { IBMVFC_VIOS_FAILURE, IBMVFC_TRANS_CANCELLED_IMPLICIT, DID_ABORT, 0, 1, "transaction cancelled implicit" }, | 122 | { IBMVFC_VIOS_FAILURE, IBMVFC_TRANS_CANCELLED_IMPLICIT, DID_ABORT, 0, 1, "transaction cancelled implicit" }, |
123 | { IBMVFC_VIOS_FAILURE, IBMVFC_INSUFFICIENT_RESOURCE, DID_REQUEUE, 1, 1, "insufficient resources" }, | 123 | { IBMVFC_VIOS_FAILURE, IBMVFC_INSUFFICIENT_RESOURCE, DID_REQUEUE, 1, 1, "insufficient resources" }, |
124 | { IBMVFC_VIOS_FAILURE, IBMVFC_PLOGI_REQUIRED, DID_ERROR, 0, 1, "port login required" }, | ||
124 | { IBMVFC_VIOS_FAILURE, IBMVFC_COMMAND_FAILED, DID_ERROR, 1, 1, "command failed" }, | 125 | { IBMVFC_VIOS_FAILURE, IBMVFC_COMMAND_FAILED, DID_ERROR, 1, 1, "command failed" }, |
125 | 126 | ||
126 | { IBMVFC_FC_FAILURE, IBMVFC_INVALID_ELS_CMD_CODE, DID_ERROR, 0, 1, "invalid ELS command code" }, | 127 | { IBMVFC_FC_FAILURE, IBMVFC_INVALID_ELS_CMD_CODE, DID_ERROR, 0, 1, "invalid ELS command code" }, |
@@ -1475,6 +1476,8 @@ static void ibmvfc_scsi_done(struct ibmvfc_event *evt) | |||
1475 | sense_len = SCSI_SENSE_BUFFERSIZE - rsp_len; | 1476 | sense_len = SCSI_SENSE_BUFFERSIZE - rsp_len; |
1476 | if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len && rsp_len <= 8) | 1477 | if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len && rsp_len <= 8) |
1477 | memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len); | 1478 | memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len); |
1479 | if ((vfc_cmd->status & IBMVFC_VIOS_FAILURE) && (vfc_cmd->error == IBMVFC_PLOGI_REQUIRED)) | ||
1480 | ibmvfc_reinit_host(evt->vhost); | ||
1478 | 1481 | ||
1479 | if (!cmnd->result && (!scsi_get_resid(cmnd) || (rsp->flags & FCP_RESID_OVER))) | 1482 | if (!cmnd->result && (!scsi_get_resid(cmnd) || (rsp->flags & FCP_RESID_OVER))) |
1480 | cmnd->result = (DID_ERROR << 16); | 1483 | cmnd->result = (DID_ERROR << 16); |
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h index 526bca743c81..6b86e1f69f69 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.h +++ b/drivers/scsi/ibmvscsi/ibmvfc.h | |||
@@ -109,6 +109,7 @@ enum ibmvfc_vios_errors { | |||
109 | IBMVFC_TRANS_CANCELLED = 0x0006, | 109 | IBMVFC_TRANS_CANCELLED = 0x0006, |
110 | IBMVFC_TRANS_CANCELLED_IMPLICIT = 0x0007, | 110 | IBMVFC_TRANS_CANCELLED_IMPLICIT = 0x0007, |
111 | IBMVFC_INSUFFICIENT_RESOURCE = 0x0008, | 111 | IBMVFC_INSUFFICIENT_RESOURCE = 0x0008, |
112 | IBMVFC_PLOGI_REQUIRED = 0x0010, | ||
112 | IBMVFC_COMMAND_FAILED = 0x8000, | 113 | IBMVFC_COMMAND_FAILED = 0x8000, |
113 | }; | 114 | }; |
114 | 115 | ||