|
@@ -556,11 +556,12 @@ static void ibmvfc_link_down(struct ibmvfc_host *vhost,
|
|
|
/**
|
|
|
* ibmvfc_init_host - Start host initialization
|
|
|
* @vhost: ibmvfc host struct
|
|
|
+ * @relogin: is this a re-login?
|
|
|
*
|
|
|
* Return value:
|
|
|
* nothing
|
|
|
**/
|
|
|
-static void ibmvfc_init_host(struct ibmvfc_host *vhost)
|
|
|
+static void ibmvfc_init_host(struct ibmvfc_host *vhost, int relogin)
|
|
|
{
|
|
|
struct ibmvfc_target *tgt;
|
|
|
|
|
@@ -574,6 +575,11 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost)
|
|
|
}
|
|
|
|
|
|
if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) {
|
|
|
+ if (!relogin) {
|
|
|
+ memset(vhost->async_crq.msgs, 0, PAGE_SIZE);
|
|
|
+ vhost->async_crq.cur = 0;
|
|
|
+ }
|
|
|
+
|
|
|
list_for_each_entry(tgt, &vhost->targets, queue)
|
|
|
tgt->need_login = 1;
|
|
|
scsi_block_requests(vhost->host);
|
|
@@ -2084,11 +2090,11 @@ static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq,
|
|
|
case IBMVFC_AE_LINK_UP:
|
|
|
case IBMVFC_AE_RESUME:
|
|
|
vhost->events_to_log |= IBMVFC_AE_LINKUP;
|
|
|
- ibmvfc_init_host(vhost);
|
|
|
+ ibmvfc_init_host(vhost, 1);
|
|
|
break;
|
|
|
case IBMVFC_AE_SCN_FABRIC:
|
|
|
vhost->events_to_log |= IBMVFC_AE_RSCN;
|
|
|
- ibmvfc_init_host(vhost);
|
|
|
+ ibmvfc_init_host(vhost, 1);
|
|
|
break;
|
|
|
case IBMVFC_AE_SCN_NPORT:
|
|
|
case IBMVFC_AE_SCN_GROUP:
|
|
@@ -2134,13 +2140,13 @@ static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost)
|
|
|
/* Send back a response */
|
|
|
rc = ibmvfc_send_crq_init_complete(vhost);
|
|
|
if (rc == 0)
|
|
|
- ibmvfc_init_host(vhost);
|
|
|
+ ibmvfc_init_host(vhost, 0);
|
|
|
else
|
|
|
dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc);
|
|
|
break;
|
|
|
case IBMVFC_CRQ_INIT_COMPLETE:
|
|
|
dev_info(vhost->dev, "Partner initialization complete\n");
|
|
|
- ibmvfc_init_host(vhost);
|
|
|
+ ibmvfc_init_host(vhost, 0);
|
|
|
break;
|
|
|
default:
|
|
|
dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format);
|
|
@@ -3358,8 +3364,6 @@ static void ibmvfc_npiv_login(struct ibmvfc_host *vhost)
|
|
|
mad->buffer.va = vhost->login_buf_dma;
|
|
|
mad->buffer.len = sizeof(*vhost->login_buf);
|
|
|
|
|
|
- memset(vhost->async_crq.msgs, 0, PAGE_SIZE);
|
|
|
- vhost->async_crq.cur = 0;
|
|
|
ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT);
|
|
|
|
|
|
if (!ibmvfc_send_event(evt, vhost, default_timeout))
|