be2iscsi : Fix the retry count for boot targets
authorJohn Soni Jose <sony.john-n@emulex.com>
Sat, 25 Apr 2015 02:46:57 +0000 (08:16 +0530)
committerJames Bottomley <JBottomley@Odin.com>
Mon, 25 May 2015 15:46:31 +0000 (08:46 -0700)
 Increment the retry count to get the boot target info when
 port async event is received by the driver. Update sysfs enteries
 with the boot target  parameters.

Signed-off-by: Minh Tran <minhduc.tran@emulex.com>
Signed-off-by: John Soni Jose <sony.john-n@emulex.com>
Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
Reviewed-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
drivers/scsi/be2iscsi/be_cmds.c
drivers/scsi/be2iscsi/be_main.c
drivers/scsi/be2iscsi/be_main.h

index 447cf7c..185391a 100644 (file)
@@ -452,6 +452,7 @@ void beiscsi_async_link_state_process(struct beiscsi_hba *phba,
                    ((evt->port_link_status & ASYNC_EVENT_LOGICAL) &&
                     (evt->port_fault == BEISCSI_PHY_LINK_FAULT_NONE))) {
                phba->state = BE_ADAPTER_LINK_UP | BE_ADAPTER_CHECK_BOOT;
+               phba->get_boot = BE_GET_BOOT_RETRIES;
 
                beiscsi_log(phba, KERN_ERR,
                            BEISCSI_LOG_CONFIG | BEISCSI_LOG_INIT,
@@ -480,6 +481,7 @@ int beiscsi_process_mcc(struct beiscsi_hba *phba)
                                case ASYNC_EVENT_NEW_ISCSI_CONN:
                                case ASYNC_EVENT_NEW_TCP_CONN:
                                        phba->state |= BE_ADAPTER_CHECK_BOOT;
+                                       phba->get_boot = BE_GET_BOOT_RETRIES;
                                        beiscsi_log(phba, KERN_ERR,
                                                    BEISCSI_LOG_CONFIG |
                                                    BEISCSI_LOG_MBOX,
@@ -488,6 +490,8 @@ int beiscsi_process_mcc(struct beiscsi_hba *phba)
                                                    compl->flags);
                                        break;
                                default:
+                                       phba->state |= BE_ADAPTER_CHECK_BOOT;
+                                       phba->get_boot = BE_GET_BOOT_RETRIES;
                                        beiscsi_log(phba, KERN_ERR,
                                                    BEISCSI_LOG_CONFIG |
                                                    BEISCSI_LOG_MBOX,
index 1f74760..a8c2cd6 100644 (file)
@@ -2037,11 +2037,16 @@ static void  beiscsi_process_mcc_isr(struct beiscsi_hba *phba)
                                /* Interpret compl as a async link evt */
                                beiscsi_async_link_state_process(phba,
                                (struct be_async_event_link_state *) mcc_compl);
-                       else
+                       else {
                                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_MBOX,
                                            "BM_%d :  Unsupported Async Event, flags"
                                            " = 0x%08x\n",
                                            mcc_compl->flags);
+                               if (phba->state & BE_ADAPTER_LINK_UP) {
+                                       phba->state |= BE_ADAPTER_CHECK_BOOT;
+                                       phba->get_boot = BE_GET_BOOT_RETRIES;
+                               }
+                       }
                } else if (mcc_compl->flags & CQE_FLAGS_COMPLETED_MASK) {
                        be_mcc_compl_process_isr(&phba->ctrl, mcc_compl);
                        atomic_dec(&phba->ctrl.mcc_obj.q.used);
@@ -4328,8 +4333,14 @@ static int beiscsi_get_boot_info(struct beiscsi_hba *phba)
                beiscsi_log(phba, KERN_ERR,
                            BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
                            "BM_%d : No boot session\n");
+
+               if (ret == -ENXIO)
+                       phba->get_boot = 0;
+
+
                return ret;
        }
+       phba->get_boot = 0;
        nonemb_cmd.va = pci_zalloc_consistent(phba->ctrl.pdev,
                                              sizeof(*session_resp),
                                              &nonemb_cmd.dma);
@@ -5374,8 +5385,14 @@ beiscsi_hw_health_check(struct work_struct *work)
        be_eqd_update(phba);
 
        if (phba->state & BE_ADAPTER_CHECK_BOOT) {
-               phba->state &= ~BE_ADAPTER_CHECK_BOOT;
-               be_check_boot_session(phba);
+               if ((phba->get_boot > 0) && (!phba->boot_kset)) {
+                       phba->get_boot--;
+                       if (!(phba->get_boot % BE_GET_BOOT_TO))
+                               be_check_boot_session(phba);
+               } else {
+                       phba->state &= ~BE_ADAPTER_CHECK_BOOT;
+                       phba->get_boot = 0;
+               }
        }
 
        beiscsi_ue_detect(phba);
index e70ea26..ce7c663 100644 (file)
 
 #define BEISCSI_CLEAN_UNLOAD   0x01
 #define BEISCSI_EEH_UNLOAD     0x02
+
+#define BE_GET_BOOT_RETRIES    45
+#define BE_GET_BOOT_TO         20
 /**
  * hardware needs the async PDU buffers to be posted in multiples of 8
  * So have atleast 8 of them by default
@@ -413,6 +416,7 @@ struct beiscsi_hba {
        } fw_config;
 
        unsigned int state;
+       int get_boot;
        bool fw_timeout;
        bool ue_detected;
        struct delayed_work beiscsi_hw_check_task;