mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 00:21:59 +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
@ -92,25 +92,49 @@ bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad,
|
|||||||
void
|
void
|
||||||
bfa_fcs_init(struct bfa_fcs_s *fcs)
|
bfa_fcs_init(struct bfa_fcs_s *fcs)
|
||||||
{
|
{
|
||||||
int i, npbc_vports;
|
int i;
|
||||||
struct bfa_fcs_mod_s *mod;
|
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++) {
|
for (i = 0; i < sizeof(fcs_modules) / sizeof(fcs_modules[0]); i++) {
|
||||||
mod = &fcs_modules[i];
|
mod = &fcs_modules[i];
|
||||||
if (mod->modinit)
|
if (mod->modinit)
|
||||||
mod->modinit(fcs);
|
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 */
|
/* Initialize pbc vports */
|
||||||
if (!fcs->min_cfg) {
|
if (!fcs->min_cfg) {
|
||||||
npbc_vports =
|
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++)
|
for (i = 0; i < npbc_vports; i++)
|
||||||
bfa_fcb_pbc_vport_create(fcs->bfa->bfad, pbc_vports[i]);
|
bfa_fcb_pbc_vport_create(fcs->bfa->bfad, pbc_vports[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* brief
|
* brief
|
||||||
* FCS driver details initialization.
|
* 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,
|
struct bfad_s *bfad,
|
||||||
bfa_boolean_t min_cfg);
|
bfa_boolean_t min_cfg);
|
||||||
void bfa_fcs_init(struct bfa_fcs_s *fcs);
|
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,
|
void bfa_fcs_driver_info_init(struct bfa_fcs_s *fcs,
|
||||||
struct bfa_fcs_driver_info_s *driver_info);
|
struct bfa_fcs_driver_info_s *driver_info);
|
||||||
void bfa_fcs_exit(struct bfa_fcs_s *fcs);
|
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_portid(__ioc) ((__ioc)->port_id)
|
||||||
#define bfa_ioc_asic_gen(__ioc) ((__ioc)->asic_gen)
|
#define bfa_ioc_asic_gen(__ioc) ((__ioc)->asic_gen)
|
||||||
#define bfa_ioc_is_cna(__ioc) \
|
#define bfa_ioc_is_cna(__ioc) \
|
||||||
((bfa_ioc_get_type(ioc) == BFA_IOC_TYPE_FCoE) || \
|
((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_LL))
|
||||||
#define bfa_ioc_fetch_stats(__ioc, __stats) \
|
#define bfa_ioc_fetch_stats(__ioc, __stats) \
|
||||||
(((__stats)->drv_stats) = (__ioc)->stats)
|
(((__stats)->drv_stats) = (__ioc)->stats)
|
||||||
#define bfa_ioc_clr_stats(__ioc) \
|
#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);
|
bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE);
|
||||||
bfad->bfa_fcs.fdmi_enabled = fdmi_enable;
|
bfad->bfa_fcs.fdmi_enabled = fdmi_enable;
|
||||||
bfad->bfa_fcs.bbscn_enabled = fc_credit_recovery;
|
bfad->bfa_fcs.bbscn_enabled = fc_credit_recovery;
|
||||||
|
bfa_fcs_init(&bfad->bfa_fcs);
|
||||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||||
|
|
||||||
bfad->bfad_flags |= BFAD_DRV_INIT_DONE;
|
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;
|
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:
|
out_hal_mem_alloc_failure:
|
||||||
return BFA_STATUS_FAILED;
|
return BFA_STATUS_FAILED;
|
||||||
}
|
}
|
||||||
@ -952,6 +969,7 @@ bfad_drv_start(struct bfad_s *bfad)
|
|||||||
|
|
||||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||||
bfa_iocfc_start(&bfad->bfa);
|
bfa_iocfc_start(&bfad->bfa);
|
||||||
|
bfa_fcs_pbc_vport_init(&bfad->bfa_fcs);
|
||||||
bfa_fcs_fabric_modstart(&bfad->bfa_fcs);
|
bfa_fcs_fabric_modstart(&bfad->bfa_fcs);
|
||||||
bfad->bfad_flags |= BFAD_HAL_START_DONE;
|
bfad->bfad_flags |= BFAD_HAL_START_DONE;
|
||||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
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,
|
strncpy(driver_info.os_device_name, bfad->pci_name,
|
||||||
sizeof(driver_info.os_device_name - 1));
|
sizeof(driver_info.os_device_name - 1));
|
||||||
|
|
||||||
/* FCS INIT */
|
/* FCS driver info init */
|
||||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||||
bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info);
|
bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info);
|
||||||
bfa_fcs_init(&bfad->bfa_fcs);
|
|
||||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||||
|
|
||||||
retval = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM);
|
/*
|
||||||
if (retval != BFA_STATUS_OK) {
|
* FCS update cfg - reset the pwwn/nwwn of fabric base logical port
|
||||||
if (bfa_sm_cmp_state(bfad, bfad_sm_initializing))
|
* with values learned during bfa_init firmware GETATTR REQ.
|
||||||
bfa_sm_set_state(bfad, bfad_sm_failed);
|
*/
|
||||||
bfad_stop(bfad);
|
bfa_fcs_update_cfg(&bfad->bfa_fcs);
|
||||||
return BFA_STATUS_FAILED;
|
|
||||||
}
|
/* Setup fc host fixed attribute if the lk supports */
|
||||||
|
bfad_fc_host_init(bfad->pport.im_port);
|
||||||
|
|
||||||
/* BFAD level FC4 IM specific resource allocation */
|
/* BFAD level FC4 IM specific resource allocation */
|
||||||
retval = bfad_im_probe(bfad);
|
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;
|
struct bfad_s *bfad = im_port->bfad;
|
||||||
char model[BFA_ADAPTER_MODEL_NAME_LEN];
|
char model[BFA_ADAPTER_MODEL_NAME_LEN];
|
||||||
char model_descr[BFA_ADAPTER_MODEL_DESCR_LEN];
|
char model_descr[BFA_ADAPTER_MODEL_DESCR_LEN];
|
||||||
|
int nports = 0;
|
||||||
|
|
||||||
bfa_get_adapter_model(&bfad->bfa, model);
|
bfa_get_adapter_model(&bfad->bfa, model);
|
||||||
|
nports = bfa_get_nports(&bfad->bfa);
|
||||||
if (!strcmp(model, "Brocade-425"))
|
if (!strcmp(model, "Brocade-425"))
|
||||||
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
||||||
"Brocade 4Gbps PCIe dual port FC HBA");
|
"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");
|
"Brocade 8Gbps PCIe dual port FC HBA");
|
||||||
else if (!strcmp(model, "Brocade-42B"))
|
else if (!strcmp(model, "Brocade-42B"))
|
||||||
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
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"))
|
else if (!strcmp(model, "Brocade-82B"))
|
||||||
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
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"))
|
else if (!strcmp(model, "Brocade-1010"))
|
||||||
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
||||||
"Brocade 10Gbps single port CNA");
|
"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");
|
"Brocade 10Gbps dual port CNA");
|
||||||
else if (!strcmp(model, "Brocade-1007"))
|
else if (!strcmp(model, "Brocade-1007"))
|
||||||
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
||||||
"Brocade 10Gbps CNA");
|
"Brocade 10Gbps CNA for IBM Blade Center");
|
||||||
else if (!strcmp(model, "Brocade-415"))
|
else if (!strcmp(model, "Brocade-415"))
|
||||||
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
||||||
"Brocade 4Gbps PCIe single port FC HBA");
|
"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");
|
"Brocade 8Gbps PCIe single port FC HBA");
|
||||||
else if (!strcmp(model, "Brocade-41B"))
|
else if (!strcmp(model, "Brocade-41B"))
|
||||||
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
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"))
|
else if (!strcmp(model, "Brocade-81B"))
|
||||||
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
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"))
|
else if (!strcmp(model, "Brocade-804"))
|
||||||
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
||||||
"HP Bladesystem C-class 8Gbps FC HBA");
|
"Brocade 8Gbps FC HBA for HP Bladesystem C-class");
|
||||||
else if (!strcmp(model, "Brocade-902"))
|
else if (!strcmp(model, "Brocade-902") ||
|
||||||
|
!strcmp(model, "Brocade-1741"))
|
||||||
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
||||||
"Brocade 10Gbps CNA");
|
"Brocade 10Gbps CNA for Dell M-Series Blade Servers");
|
||||||
else
|
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,
|
snprintf(model_descr, BFA_ADAPTER_MODEL_DESCR_LEN,
|
||||||
"Invalid Model");
|
"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 *im_port =
|
||||||
(struct bfad_im_port_s *) shost->hostdata[0];
|
(struct bfad_im_port_s *) shost->hostdata[0];
|
||||||
struct bfad_s *bfad = im_port->bfad;
|
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));
|
memset(bfa_buf, 0, sizeof(bfa_buf));
|
||||||
if (bfa_ioc_is_cna(ioc))
|
snprintf(bfa_buf, sizeof(bfa_buf),
|
||||||
snprintf(bfa_buf, sizeof(bfa_buf),
|
"Brocade FC/FCOE Adapter, " "hwpath: %s driver: %s",
|
||||||
"Brocade FCOE Adapter, " "model: %s hwpath: %s driver: %s",
|
bfad->pci_name, BFAD_DRIVER_VERSION);
|
||||||
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);
|
|
||||||
|
|
||||||
return bfa_buf;
|
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;
|
goto out_fc_rel;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* setup host fixed attribute if the lk supports */
|
|
||||||
bfad_fc_host_init(im_port);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_fc_rel:
|
out_fc_rel:
|
||||||
|
Loading…
Reference in New Issue
Block a user