mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
[SCSI] bfa: Driver initialization and model description fix
- 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>
This commit is contained in:
parent
e2187d7f38
commit
75332a70a8
6 changed files with 101 additions and 40 deletions
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue