]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/scsi/lpfc/lpfc_init.c
lpfc: Modularize and cleanup FDMI code in driver
[mirror_ubuntu-artful-kernel.git] / drivers / scsi / lpfc / lpfc_init.c
index db9446c612dadf1ffebb3de4803eb4a59ec6442f..d9753e3e9737540370e463604839f178e1f0886c 100644 (file)
@@ -1184,8 +1184,10 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba)
 
        vports = lpfc_create_vport_work_array(phba);
        if (vports != NULL)
-               for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++)
+               for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
                        lpfc_rcv_seq_check_edtov(vports[i]);
+                       lpfc_fdmi_num_disc_check(vports[i]);
+               }
        lpfc_destroy_vport_work_array(phba, vports);
 
        if ((phba->link_state == LPFC_HBA_ERROR) ||
@@ -1290,6 +1292,10 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba)
                                jiffies +
                                msecs_to_jiffies(1000 * LPFC_HB_MBOX_TIMEOUT));
                }
+       } else {
+                       mod_timer(&phba->hb_tmofunc,
+                               jiffies +
+                               msecs_to_jiffies(1000 * LPFC_HB_MBOX_INTERVAL));
        }
 }
 
@@ -2621,7 +2627,6 @@ void
 lpfc_stop_vport_timers(struct lpfc_vport *vport)
 {
        del_timer_sync(&vport->els_tmofunc);
-       del_timer_sync(&vport->fc_fdmitmo);
        del_timer_sync(&vport->delayed_disc_tmo);
        lpfc_can_disctmo(vport);
        return;
@@ -3340,10 +3345,6 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
        vport->fc_disctmo.function = lpfc_disc_timeout;
        vport->fc_disctmo.data = (unsigned long)vport;
 
-       init_timer(&vport->fc_fdmitmo);
-       vport->fc_fdmitmo.function = lpfc_fdmi_tmo;
-       vport->fc_fdmitmo.data = (unsigned long)vport;
-
        init_timer(&vport->els_tmofunc);
        vport->els_tmofunc.function = lpfc_els_timeout;
        vport->els_tmofunc.data = (unsigned long)vport;
@@ -6159,6 +6160,20 @@ lpfc_create_shost(struct lpfc_hba *phba)
        /* Put reference to SCSI host to driver's device private data */
        pci_set_drvdata(phba->pcidev, shost);
 
+       /*
+        * At this point we are fully registered with PSA. In addition,
+        * any initial discovery should be completed.
+        */
+       vport->load_flag |= FC_ALLOW_FDMI;
+       if (phba->cfg_fdmi_on > LPFC_FDMI_NO_SUPPORT) {
+
+               /* Setup appropriate attribute masks */
+               vport->fdmi_hba_mask = LPFC_FDMI2_HBA_ATTR;
+               if (phba->cfg_fdmi_on == LPFC_FDMI_SMART_SAN)
+                       vport->fdmi_port_mask = LPFC_FDMI2_SMART_ATTR;
+               else
+                       vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR;
+       }
        return 0;
 }
 
@@ -8833,9 +8848,12 @@ found:
                                 * already mapped to this phys_id.
                                 */
                                if (cpup->irq != LPFC_VECTOR_MAP_EMPTY) {
-                                       chann[saved_chann] =
-                                               cpup->channel_id;
-                                       saved_chann++;
+                                       if (saved_chann <=
+                                           LPFC_FCP_IO_CHAN_MAX) {
+                                               chann[saved_chann] =
+                                                       cpup->channel_id;
+                                               saved_chann++;
+                                       }
                                        goto out;
                                }