|
@@ -561,7 +561,7 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost, int relogin)
|
|
struct ibmvfc_target *tgt;
|
|
struct ibmvfc_target *tgt;
|
|
|
|
|
|
if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
|
|
if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
|
|
- if (++vhost->init_retries > IBMVFC_MAX_INIT_RETRIES) {
|
|
|
|
|
|
+ if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) {
|
|
dev_err(vhost->dev,
|
|
dev_err(vhost->dev,
|
|
"Host initialization retries exceeded. Taking adapter offline\n");
|
|
"Host initialization retries exceeded. Taking adapter offline\n");
|
|
ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
|
|
ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
|
|
@@ -845,11 +845,12 @@ static void ibmvfc_reset_host(struct ibmvfc_host *vhost)
|
|
static void ibmvfc_retry_host_init(struct ibmvfc_host *vhost)
|
|
static void ibmvfc_retry_host_init(struct ibmvfc_host *vhost)
|
|
{
|
|
{
|
|
if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
|
|
if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
|
|
- if (++vhost->init_retries > IBMVFC_MAX_INIT_RETRIES) {
|
|
|
|
|
|
+ vhost->delay_init = 1;
|
|
|
|
+ if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) {
|
|
dev_err(vhost->dev,
|
|
dev_err(vhost->dev,
|
|
"Host initialization retries exceeded. Taking adapter offline\n");
|
|
"Host initialization retries exceeded. Taking adapter offline\n");
|
|
ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
|
|
ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
|
|
- } else if (vhost->init_retries == IBMVFC_MAX_INIT_RETRIES)
|
|
|
|
|
|
+ } else if (vhost->init_retries == IBMVFC_MAX_HOST_INIT_RETRIES)
|
|
__ibmvfc_reset_host(vhost);
|
|
__ibmvfc_reset_host(vhost);
|
|
else
|
|
else
|
|
ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
|
|
ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
|
|
@@ -2756,7 +2757,7 @@ static void ibmvfc_init_tgt(struct ibmvfc_target *tgt,
|
|
static void ibmvfc_retry_tgt_init(struct ibmvfc_target *tgt,
|
|
static void ibmvfc_retry_tgt_init(struct ibmvfc_target *tgt,
|
|
void (*job_step) (struct ibmvfc_target *))
|
|
void (*job_step) (struct ibmvfc_target *))
|
|
{
|
|
{
|
|
- if (++tgt->init_retries > IBMVFC_MAX_INIT_RETRIES) {
|
|
|
|
|
|
+ if (++tgt->init_retries > IBMVFC_MAX_TGT_INIT_RETRIES) {
|
|
ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
|
|
ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
|
|
wake_up(&tgt->vhost->work_wait_q);
|
|
wake_up(&tgt->vhost->work_wait_q);
|
|
} else
|
|
} else
|
|
@@ -3613,7 +3614,13 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
|
|
break;
|
|
break;
|
|
case IBMVFC_HOST_ACTION_INIT:
|
|
case IBMVFC_HOST_ACTION_INIT:
|
|
BUG_ON(vhost->state != IBMVFC_INITIALIZING);
|
|
BUG_ON(vhost->state != IBMVFC_INITIALIZING);
|
|
- vhost->job_step(vhost);
|
|
|
|
|
|
+ if (vhost->delay_init) {
|
|
|
|
+ vhost->delay_init = 0;
|
|
|
|
+ spin_unlock_irqrestore(vhost->host->host_lock, flags);
|
|
|
|
+ ssleep(5);
|
|
|
|
+ return;
|
|
|
|
+ } else
|
|
|
|
+ vhost->job_step(vhost);
|
|
break;
|
|
break;
|
|
case IBMVFC_HOST_ACTION_QUERY:
|
|
case IBMVFC_HOST_ACTION_QUERY:
|
|
list_for_each_entry(tgt, &vhost->targets, queue)
|
|
list_for_each_entry(tgt, &vhost->targets, queue)
|