aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc.c17
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc.h4
2 files changed, 15 insertions, 6 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 8715a7b140cc..2aa3d695d548 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -561,7 +561,7 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost, int relogin)
561 struct ibmvfc_target *tgt; 561 struct ibmvfc_target *tgt;
562 562
563 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) { 563 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
564 if (++vhost->init_retries > IBMVFC_MAX_INIT_RETRIES) { 564 if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) {
565 dev_err(vhost->dev, 565 dev_err(vhost->dev,
566 "Host initialization retries exceeded. Taking adapter offline\n"); 566 "Host initialization retries exceeded. Taking adapter offline\n");
567 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); 567 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
@@ -845,11 +845,12 @@ static void ibmvfc_reset_host(struct ibmvfc_host *vhost)
845static void ibmvfc_retry_host_init(struct ibmvfc_host *vhost) 845static void ibmvfc_retry_host_init(struct ibmvfc_host *vhost)
846{ 846{
847 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) { 847 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
848 if (++vhost->init_retries > IBMVFC_MAX_INIT_RETRIES) { 848 vhost->delay_init = 1;
849 if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) {
849 dev_err(vhost->dev, 850 dev_err(vhost->dev,
850 "Host initialization retries exceeded. Taking adapter offline\n"); 851 "Host initialization retries exceeded. Taking adapter offline\n");
851 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); 852 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
852 } else if (vhost->init_retries == IBMVFC_MAX_INIT_RETRIES) 853 } else if (vhost->init_retries == IBMVFC_MAX_HOST_INIT_RETRIES)
853 __ibmvfc_reset_host(vhost); 854 __ibmvfc_reset_host(vhost);
854 else 855 else
855 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); 856 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
@@ -2756,7 +2757,7 @@ static void ibmvfc_init_tgt(struct ibmvfc_target *tgt,
2756static void ibmvfc_retry_tgt_init(struct ibmvfc_target *tgt, 2757static void ibmvfc_retry_tgt_init(struct ibmvfc_target *tgt,
2757 void (*job_step) (struct ibmvfc_target *)) 2758 void (*job_step) (struct ibmvfc_target *))
2758{ 2759{
2759 if (++tgt->init_retries > IBMVFC_MAX_INIT_RETRIES) { 2760 if (++tgt->init_retries > IBMVFC_MAX_TGT_INIT_RETRIES) {
2760 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT); 2761 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
2761 wake_up(&tgt->vhost->work_wait_q); 2762 wake_up(&tgt->vhost->work_wait_q);
2762 } else 2763 } else
@@ -3613,7 +3614,13 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
3613 break; 3614 break;
3614 case IBMVFC_HOST_ACTION_INIT: 3615 case IBMVFC_HOST_ACTION_INIT:
3615 BUG_ON(vhost->state != IBMVFC_INITIALIZING); 3616 BUG_ON(vhost->state != IBMVFC_INITIALIZING);
3616 vhost->job_step(vhost); 3617 if (vhost->delay_init) {
3618 vhost->delay_init = 0;
3619 spin_unlock_irqrestore(vhost->host->host_lock, flags);
3620 ssleep(5);
3621 return;
3622 } else
3623 vhost->job_step(vhost);
3617 break; 3624 break;
3618 case IBMVFC_HOST_ACTION_QUERY: 3625 case IBMVFC_HOST_ACTION_QUERY:
3619 list_for_each_entry(tgt, &vhost->targets, queue) 3626 list_for_each_entry(tgt, &vhost->targets, queue)
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h
index d6bae941c566..cf02216dc8db 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.h
+++ b/drivers/scsi/ibmvscsi/ibmvfc.h
@@ -43,7 +43,8 @@
43#define IBMVFC_MAX_DISC_THREADS 4 43#define IBMVFC_MAX_DISC_THREADS 4
44#define IBMVFC_TGT_MEMPOOL_SZ 64 44#define IBMVFC_TGT_MEMPOOL_SZ 64
45#define IBMVFC_MAX_CMDS_PER_LUN 64 45#define IBMVFC_MAX_CMDS_PER_LUN 64
46#define IBMVFC_MAX_INIT_RETRIES 3 46#define IBMVFC_MAX_HOST_INIT_RETRIES 6
47#define IBMVFC_MAX_TGT_INIT_RETRIES 3
47#define IBMVFC_DEV_LOSS_TMO (5 * 60) 48#define IBMVFC_DEV_LOSS_TMO (5 * 60)
48#define IBMVFC_DEFAULT_LOG_LEVEL 2 49#define IBMVFC_DEFAULT_LOG_LEVEL 2
49#define IBMVFC_MAX_CDB_LEN 16 50#define IBMVFC_MAX_CDB_LEN 16
@@ -673,6 +674,7 @@ struct ibmvfc_host {
673 int discovery_threads; 674 int discovery_threads;
674 int client_migrated; 675 int client_migrated;
675 int reinit; 676 int reinit;
677 int delay_init;
676 int events_to_log; 678 int events_to_log;
677#define IBMVFC_AE_LINKUP 0x0001 679#define IBMVFC_AE_LINKUP 0x0001
678#define IBMVFC_AE_LINKDOWN 0x0002 680#define IBMVFC_AE_LINKDOWN 0x0002