Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 75332a70 authored by Krishna Gudipati's avatar Krishna Gudipati Committed by James Bottomley
Browse files

[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: default avatarKrishna Gudipati <kgudipat@brocade.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent e2187d7f
Loading
Loading
Loading
Loading
+28 −4
Original line number Diff line number Diff line
@@ -92,15 +92,40 @@ 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 =
@@ -110,7 +135,6 @@ bfa_fcs_init(struct bfa_fcs_s *fcs)
	}
}


/*
 *	brief
 *		FCS driver details initialization.
+2 −0
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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)	\
+27 −9
Original line number Diff line number Diff line
@@ -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);
+39 −9
Original line number Diff line number Diff line
@@ -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");
			"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");

Loading