diff options
Diffstat (limited to 'drivers/scsi/ibmvscsi/ibmvfc.c')
-rw-r--r-- | drivers/scsi/ibmvscsi/ibmvfc.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c index da233256e9aa..b4b805e8d7db 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.c +++ b/drivers/scsi/ibmvscsi/ibmvfc.c | |||
@@ -1485,6 +1485,27 @@ static void ibmvfc_log_error(struct ibmvfc_event *evt) | |||
1485 | } | 1485 | } |
1486 | 1486 | ||
1487 | /** | 1487 | /** |
1488 | * ibmvfc_relogin - Log back into the specified device | ||
1489 | * @sdev: scsi device struct | ||
1490 | * | ||
1491 | **/ | ||
1492 | static void ibmvfc_relogin(struct scsi_device *sdev) | ||
1493 | { | ||
1494 | struct ibmvfc_host *vhost = shost_priv(sdev->host); | ||
1495 | struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); | ||
1496 | struct ibmvfc_target *tgt; | ||
1497 | |||
1498 | list_for_each_entry(tgt, &vhost->targets, queue) { | ||
1499 | if (rport == tgt->rport) { | ||
1500 | ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT); | ||
1501 | break; | ||
1502 | } | ||
1503 | } | ||
1504 | |||
1505 | ibmvfc_reinit_host(vhost); | ||
1506 | } | ||
1507 | |||
1508 | /** | ||
1488 | * ibmvfc_scsi_done - Handle responses from commands | 1509 | * ibmvfc_scsi_done - Handle responses from commands |
1489 | * @evt: ibmvfc event to be handled | 1510 | * @evt: ibmvfc event to be handled |
1490 | * | 1511 | * |
@@ -1516,7 +1537,7 @@ static void ibmvfc_scsi_done(struct ibmvfc_event *evt) | |||
1516 | if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len && rsp_len <= 8) | 1537 | if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len && rsp_len <= 8) |
1517 | memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len); | 1538 | memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len); |
1518 | if ((vfc_cmd->status & IBMVFC_VIOS_FAILURE) && (vfc_cmd->error == IBMVFC_PLOGI_REQUIRED)) | 1539 | if ((vfc_cmd->status & IBMVFC_VIOS_FAILURE) && (vfc_cmd->error == IBMVFC_PLOGI_REQUIRED)) |
1519 | ibmvfc_reinit_host(evt->vhost); | 1540 | ibmvfc_relogin(cmnd->device); |
1520 | 1541 | ||
1521 | if (!cmnd->result && (!scsi_get_resid(cmnd) || (rsp->flags & FCP_RESID_OVER))) | 1542 | if (!cmnd->result && (!scsi_get_resid(cmnd) || (rsp->flags & FCP_RESID_OVER))) |
1522 | cmnd->result = (DID_ERROR << 16); | 1543 | cmnd->result = (DID_ERROR << 16); |
@@ -2181,6 +2202,7 @@ static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq, | |||
2181 | struct ibmvfc_host *vhost) | 2202 | struct ibmvfc_host *vhost) |
2182 | { | 2203 | { |
2183 | const char *desc = ibmvfc_get_ae_desc(crq->event); | 2204 | const char *desc = ibmvfc_get_ae_desc(crq->event); |
2205 | struct ibmvfc_target *tgt; | ||
2184 | 2206 | ||
2185 | ibmvfc_log(vhost, 3, "%s event received. scsi_id: %llx, wwpn: %llx," | 2207 | ibmvfc_log(vhost, 3, "%s event received. scsi_id: %llx, wwpn: %llx," |
2186 | " node_name: %llx\n", desc, crq->scsi_id, crq->wwpn, crq->node_name); | 2208 | " node_name: %llx\n", desc, crq->scsi_id, crq->wwpn, crq->node_name); |
@@ -2218,9 +2240,23 @@ static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq, | |||
2218 | case IBMVFC_AE_SCN_NPORT: | 2240 | case IBMVFC_AE_SCN_NPORT: |
2219 | case IBMVFC_AE_SCN_GROUP: | 2241 | case IBMVFC_AE_SCN_GROUP: |
2220 | vhost->events_to_log |= IBMVFC_AE_RSCN; | 2242 | vhost->events_to_log |= IBMVFC_AE_RSCN; |
2243 | ibmvfc_reinit_host(vhost); | ||
2244 | break; | ||
2221 | case IBMVFC_AE_ELS_LOGO: | 2245 | case IBMVFC_AE_ELS_LOGO: |
2222 | case IBMVFC_AE_ELS_PRLO: | 2246 | case IBMVFC_AE_ELS_PRLO: |
2223 | case IBMVFC_AE_ELS_PLOGI: | 2247 | case IBMVFC_AE_ELS_PLOGI: |
2248 | list_for_each_entry(tgt, &vhost->targets, queue) { | ||
2249 | if (!crq->scsi_id && !crq->wwpn && !crq->node_name) | ||
2250 | break; | ||
2251 | if (crq->scsi_id && tgt->scsi_id != crq->scsi_id) | ||
2252 | continue; | ||
2253 | if (crq->wwpn && tgt->ids.port_name != crq->wwpn) | ||
2254 | continue; | ||
2255 | if (crq->node_name && tgt->ids.node_name != crq->node_name) | ||
2256 | continue; | ||
2257 | ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT); | ||
2258 | } | ||
2259 | |||
2224 | ibmvfc_reinit_host(vhost); | 2260 | ibmvfc_reinit_host(vhost); |
2225 | break; | 2261 | break; |
2226 | case IBMVFC_AE_LINK_DOWN: | 2262 | case IBMVFC_AE_LINK_DOWN: |