[SCSI] bfa: Driver initialization and model description fix
authorKrishna Gudipati <kgudipat@brocade.com>
Mon, 13 Jun 2011 22:54:31 +0000 (15:54 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Wed, 29 Jun 2011 20:56:05 +0000 (15:56 -0500)
- Moved FCS initialization, which internally does the im_port creation
  as well as the scsi_host creation before bfa_init.

Once the bfa_init is complete & successful:
- Reset the FCS base port cfg params such as pwwn/nwwn and setup fc host
  params - based on the values learned during the ioc getattr request.
- Change needed to support BSG commands even on bfa init failure.
- Model description fixes for Brocade adapters.

Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/bfa/bfa_fcs.c
drivers/scsi/bfa/bfa_fcs.h
drivers/scsi/bfa/bfa_ioc.h
drivers/scsi/bfa/bfad.c
drivers/scsi/bfa/bfad_attr.c
drivers/scsi/bfa/bfad_im.c

index 6c8a27e7897431f8237c49e0965363e82ef68743..b9f9e15a02a15e6cbcb96289ac3569f62ab20a31 100644 (file)
@@ -92,25 +92,49 @@ bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad,
 void
 bfa_fcs_init(struct bfa_fcs_s *fcs)
 {
-       int             i, npbc_vports;
+       int     i;
        struct bfa_fcs_mod_s  *mod;
-       struct bfi_pbc_vport_s pbc_vports[BFI_PBC_MAX_VPORTS];
 
        for (i = 0; i < sizeof(fcs_modules) / sizeof(fcs_modules[0]); i++) {
                mod = &fcs_modules[i];
                if (mod->modinit)
                        mod->modinit(fcs);
        }
+}
+
+/*
+ * FCS update cfg - reset the pwwn/nwwn of fabric base logical port
+ * with values learned during bfa_init firmware GETATTR REQ.
+ */
+void
+bfa_fcs_update_cfg(struct bfa_fcs_s *fcs)
+{
+       struct bfa_fcs_fabric_s *fabric = &fcs->fabric;
+       struct bfa_lport_cfg_s *port_cfg = &fabric->bport.port_cfg;
+       struct bfa_ioc_s *ioc = &fabric->fcs->bfa->ioc;
+
+       port_cfg->nwwn = ioc->attr->nwwn;
+       port_cfg->pwwn = ioc->attr->pwwn;
+}
+
+/*
+ * fcs pbc vport initialization
+ */
+void
+bfa_fcs_pbc_vport_init(struct bfa_fcs_s *fcs)
+{
+       int i, npbc_vports;
+       struct bfi_pbc_vport_s pbc_vports[BFI_PBC_MAX_VPORTS];
+
        /* Initialize pbc vports */
        if (!fcs->min_cfg) {
                npbc_vports =
-                   bfa_iocfc_get_pbc_vports(fcs->bfa, pbc_vports);
+                       bfa_iocfc_get_pbc_vports(fcs->bfa, pbc_vports);
                for (i = 0; i < npbc_vports; i++)
                        bfa_fcb_pbc_vport_create(fcs->bfa->bfad, pbc_vports[i]);
        }
 }
 
-
 /*
  *     brief
  *             FCS driver details initialization.
index 4cfd2e949ce2c6167f026d003f30245b8c311f63..c418c31a490cc23e8de9e574adb92795a4d9ccb2 100644 (file)
@@ -721,6 +721,8 @@ void bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa,
                    struct bfad_s *bfad,
                    bfa_boolean_t min_cfg);
 void bfa_fcs_init(struct bfa_fcs_s *fcs);
+void bfa_fcs_pbc_vport_init(struct bfa_fcs_s *fcs);
+void bfa_fcs_update_cfg(struct bfa_fcs_s *fcs);
 void bfa_fcs_driver_info_init(struct bfa_fcs_s *fcs,
                              struct bfa_fcs_driver_info_s *driver_info);
 void bfa_fcs_exit(struct bfa_fcs_s *fcs);
index 527e613530e33be7c8e0534d26c845c5231cef21..c717b2035573a7711433f1316858587d89de24fd 100644 (file)
@@ -287,8 +287,8 @@ struct bfa_ioc_hwif_s {
 #define bfa_ioc_portid(__ioc)          ((__ioc)->port_id)
 #define bfa_ioc_asic_gen(__ioc)                ((__ioc)->asic_gen)
 #define bfa_ioc_is_cna(__ioc)  \
-       ((bfa_ioc_get_type(ioc) == BFA_IOC_TYPE_FCoE) ||        \
-        (bfa_ioc_get_type(ioc) == BFA_IOC_TYPE_LL))
+       ((bfa_ioc_get_type(__ioc) == BFA_IOC_TYPE_FCoE) ||      \
+        (bfa_ioc_get_type(__ioc) == BFA_IOC_TYPE_LL))
 #define bfa_ioc_fetch_stats(__ioc, __stats) \
                (((__stats)->drv_stats) = (__ioc)->stats)
 #define bfa_ioc_clr_stats(__ioc)       \
index cdf84f67f0c2ea64c0a23df8d7d6df9a1186b34f..0db583c50ba29ee1d00758b7bf230fae85bdc6e3 100644 (file)
@@ -915,12 +915,29 @@ bfad_drv_init(struct bfad_s *bfad)
        bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE);
        bfad->bfa_fcs.fdmi_enabled = fdmi_enable;
        bfad->bfa_fcs.bbscn_enabled = fc_credit_recovery;
+       bfa_fcs_init(&bfad->bfa_fcs);
        spin_unlock_irqrestore(&bfad->bfad_lock, flags);
 
        bfad->bfad_flags |= BFAD_DRV_INIT_DONE;
 
+       /* configure base port */
+       rc = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM);
+       if (rc != BFA_STATUS_OK)
+               goto out_cfg_pport_fail;
+
        return BFA_STATUS_OK;
 
+out_cfg_pport_fail:
+       /* fcs exit - on cfg pport failure */
+       spin_lock_irqsave(&bfad->bfad_lock, flags);
+       init_completion(&bfad->comp);
+       bfad->pport.flags |= BFAD_PORT_DELETE;
+       bfa_fcs_exit(&bfad->bfa_fcs);
+       spin_unlock_irqrestore(&bfad->bfad_lock, flags);
+       wait_for_completion(&bfad->comp);
+       /* bfa detach - free hal memory */
+       bfa_detach(&bfad->bfa);
+       bfad_hal_mem_release(bfad);
 out_hal_mem_alloc_failure:
        return BFA_STATUS_FAILED;
 }
@@ -952,6 +969,7 @@ bfad_drv_start(struct bfad_s *bfad)
 
        spin_lock_irqsave(&bfad->bfad_lock, flags);
        bfa_iocfc_start(&bfad->bfa);
+       bfa_fcs_pbc_vport_init(&bfad->bfa_fcs);
        bfa_fcs_fabric_modstart(&bfad->bfa_fcs);
        bfad->bfad_flags |= BFAD_HAL_START_DONE;
        spin_unlock_irqrestore(&bfad->bfad_lock, flags);
@@ -1056,19 +1074,19 @@ bfad_start_ops(struct bfad_s *bfad) {
        strncpy(driver_info.os_device_name, bfad->pci_name,
                sizeof(driver_info.os_device_name - 1));
 
-       /* FCS INIT */
+       /* FCS driver info init */
        spin_lock_irqsave(&bfad->bfad_lock, flags);
        bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info);
-       bfa_fcs_init(&bfad->bfa_fcs);
        spin_unlock_irqrestore(&bfad->bfad_lock, flags);
 
-       retval = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM);
-       if (retval != BFA_STATUS_OK) {
-               if (bfa_sm_cmp_state(bfad, bfad_sm_initializing))
-                       bfa_sm_set_state(bfad, bfad_sm_failed);
-               bfad_stop(bfad);
-               return BFA_STATUS_FAILED;
-       }
+       /*
+        * FCS update cfg - reset the pwwn/nwwn of fabric base logical port
+        * with values learned during bfa_init firmware GETATTR REQ.
+        */
+       bfa_fcs_update_cfg(&bfad->bfa_fcs);
+
+       /* Setup fc host fixed attribute if the lk supports */
+       bfad_fc_host_init(bfad->pport.im_port);
 
        /* BFAD level FC4 IM specific resource allocation */
        retval = bfad_im_probe(bfad);
index 3127df2951e61e20883ce94788087d95b00d0a91..97391cc727b32e46c4cbae83807135a83a6ee49b 100644 (file)
@@ -677,8 +677,10 @@ bfad_im_model_desc_show(struct device *dev, struct device_attribute *attr,
        struct bfad_s *bfad = im_port->bfad;
        char model[BFA_ADAPTER_MODEL_NAME_LEN];
        char model_descr[BFA_ADAPTER_MODEL_DESCR_LEN];
+       int nports = 0;
 
        bfa_get_adapter_model(&bfad->bfa, model);
+       nports = bfa_get_nports(&bfad->bfa);
        if (!strcmp(model, "Brocade-425"))
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
                        "Brocade 4Gbps PCIe dual port FC HBA");
@@ -687,10 +689,10 @@ bfad_im_model_desc_show(struct device *dev, struct device_attribute *attr,
                        "Brocade 8Gbps PCIe dual port FC HBA");
        else if (!strcmp(model, "Brocade-42B"))
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
-                       "HP 4Gbps PCIe dual port FC HBA");
+                       "Brocade 4Gbps PCIe dual port FC HBA for HP");
        else if (!strcmp(model, "Brocade-82B"))
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
-                       "HP 8Gbps PCIe dual port FC HBA");
+                       "Brocade 8Gbps PCIe dual port FC HBA for HP");
        else if (!strcmp(model, "Brocade-1010"))
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
                        "Brocade 10Gbps single port CNA");
@@ -699,7 +701,7 @@ bfad_im_model_desc_show(struct device *dev, struct device_attribute *attr,
                        "Brocade 10Gbps dual port CNA");
        else if (!strcmp(model, "Brocade-1007"))
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
-                       "Brocade 10Gbps CNA");
+                       "Brocade 10Gbps CNA for IBM Blade Center");
        else if (!strcmp(model, "Brocade-415"))
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
                        "Brocade 4Gbps PCIe single port FC HBA");
@@ -708,17 +710,45 @@ bfad_im_model_desc_show(struct device *dev, struct device_attribute *attr,
                        "Brocade 8Gbps PCIe single port FC HBA");
        else if (!strcmp(model, "Brocade-41B"))
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
-                       "HP 4Gbps PCIe single port FC HBA");
+                       "Brocade 4Gbps PCIe single port FC HBA for HP");
        else if (!strcmp(model, "Brocade-81B"))
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
-                       "HP 8Gbps PCIe single port FC HBA");
+                       "Brocade 8Gbps PCIe single port FC HBA for HP");
        else if (!strcmp(model, "Brocade-804"))
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
-                       "HP Bladesystem C-class 8Gbps FC HBA");
-       else if (!strcmp(model, "Brocade-902"))
+                       "Brocade 8Gbps FC HBA for HP Bladesystem C-class");
+       else if (!strcmp(model, "Brocade-902") ||
+                !strcmp(model, "Brocade-1741"))
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
-                       "Brocade 10Gbps CNA");
-       else
+                       "Brocade 10Gbps CNA for Dell M-Series Blade Servers");
+       else if (strstr(model, "Brocade-1560")) {
+               if (nports == 1)
+                       snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
+                               "Brocade 16Gbps PCIe single port FC HBA");
+               else
+                       snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
+                               "Brocade 16Gbps PCIe dual port FC HBA");
+       } else if (strstr(model, "Brocade-1710")) {
+               if (nports == 1)
+                       snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
+                               "Brocade 10Gbps single port CNA");
+               else
+                       snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
+                               "Brocade 10Gbps dual port CNA");
+       } else if (strstr(model, "Brocade-1860")) {
+               if (nports == 1 && bfa_ioc_is_cna(&bfad->bfa.ioc))
+                       snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
+                               "Brocade 10Gbps single port CNA");
+               else if (nports == 1 && !bfa_ioc_is_cna(&bfad->bfa.ioc))
+                       snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
+                               "Brocade 16Gbps PCIe single port FC HBA");
+               else if (nports == 2 && bfa_ioc_is_cna(&bfad->bfa.ioc))
+                       snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
+                               "Brocade 10Gbps dual port CNA");
+               else if (nports == 2 && !bfa_ioc_is_cna(&bfad->bfa.ioc))
+                       snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
+                               "Brocade 16Gbps PCIe dual port FC HBA");
+       } else
                snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
                        "Invalid Model");
 
index 451ff556625dfbeaec697f42d620160b11464537..06cd113f890aef866b4ec20c755306f2323e3d37 100644 (file)
@@ -175,21 +175,11 @@ bfad_im_info(struct Scsi_Host *shost)
        struct bfad_im_port_s *im_port =
                        (struct bfad_im_port_s *) shost->hostdata[0];
        struct bfad_s *bfad = im_port->bfad;
-       struct bfa_s *bfa = &bfad->bfa;
-       struct bfa_ioc_s *ioc = &bfa->ioc;
-       char model[BFA_ADAPTER_MODEL_NAME_LEN];
-
-       bfa_get_adapter_model(bfa, model);
 
        memset(bfa_buf, 0, sizeof(bfa_buf));
-       if (bfa_ioc_is_cna(ioc))
-               snprintf(bfa_buf, sizeof(bfa_buf),
-               "Brocade FCOE Adapter, " "model: %s hwpath: %s driver: %s",
-                model, bfad->pci_name, BFAD_DRIVER_VERSION);
-       else
-               snprintf(bfa_buf, sizeof(bfa_buf),
-               "Brocade FC Adapter, " "model: %s hwpath: %s driver: %s",
-               model, bfad->pci_name, BFAD_DRIVER_VERSION);
+       snprintf(bfa_buf, sizeof(bfa_buf),
+               "Brocade FC/FCOE Adapter, " "hwpath: %s driver: %s",
+               bfad->pci_name, BFAD_DRIVER_VERSION);
 
        return bfa_buf;
 }
@@ -572,9 +562,6 @@ bfad_im_scsi_host_alloc(struct bfad_s *bfad, struct bfad_im_port_s *im_port,
                goto out_fc_rel;
        }
 
-       /* setup host fixed attribute if the lk supports */
-       bfad_fc_host_init(im_port);
-
        return 0;
 
 out_fc_rel: