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

Commit 8aa134a8 authored by James Smart's avatar James Smart Committed by James Bottomley
Browse files

[SCSI] lpfc 8.3.34: Add SLI-4 V1 Capacity and Resource Descriptor support

parent 086a345f
Loading
Loading
Loading
Loading
+16 −1
Original line number Original line Diff line number Diff line
@@ -2573,7 +2573,7 @@ struct lpfc_mbx_get_sli4_parameters {
};
};


struct lpfc_rscr_desc_generic {
struct lpfc_rscr_desc_generic {
#define LPFC_RSRC_DESC_WSIZE			18
#define LPFC_RSRC_DESC_WSIZE			22
	uint32_t desc[LPFC_RSRC_DESC_WSIZE];
	uint32_t desc[LPFC_RSRC_DESC_WSIZE];
};
};


@@ -2583,6 +2583,9 @@ struct lpfc_rsrc_desc_pcie {
#define lpfc_rsrc_desc_pcie_type_MASK		0x000000ff
#define lpfc_rsrc_desc_pcie_type_MASK		0x000000ff
#define lpfc_rsrc_desc_pcie_type_WORD		word0
#define lpfc_rsrc_desc_pcie_type_WORD		word0
#define LPFC_RSRC_DESC_TYPE_PCIE		0x40
#define LPFC_RSRC_DESC_TYPE_PCIE		0x40
#define lpfc_rsrc_desc_pcie_length_SHIFT	8
#define lpfc_rsrc_desc_pcie_length_MASK		0x000000ff
#define lpfc_rsrc_desc_pcie_length_WORD		word0
	uint32_t word1;
	uint32_t word1;
#define lpfc_rsrc_desc_pcie_pfnum_SHIFT		0
#define lpfc_rsrc_desc_pcie_pfnum_SHIFT		0
#define lpfc_rsrc_desc_pcie_pfnum_MASK		0x000000ff
#define lpfc_rsrc_desc_pcie_pfnum_MASK		0x000000ff
@@ -2610,6 +2613,12 @@ struct lpfc_rsrc_desc_fcfcoe {
#define lpfc_rsrc_desc_fcfcoe_type_MASK		0x000000ff
#define lpfc_rsrc_desc_fcfcoe_type_MASK		0x000000ff
#define lpfc_rsrc_desc_fcfcoe_type_WORD		word0
#define lpfc_rsrc_desc_fcfcoe_type_WORD		word0
#define LPFC_RSRC_DESC_TYPE_FCFCOE		0x43
#define LPFC_RSRC_DESC_TYPE_FCFCOE		0x43
#define lpfc_rsrc_desc_fcfcoe_length_SHIFT	8
#define lpfc_rsrc_desc_fcfcoe_length_MASK	0x000000ff
#define lpfc_rsrc_desc_fcfcoe_length_WORD	word0
#define LPFC_RSRC_DESC_TYPE_FCFCOE_V0_RSVD	0
#define LPFC_RSRC_DESC_TYPE_FCFCOE_V0_LENGTH	72
#define LPFC_RSRC_DESC_TYPE_FCFCOE_V1_LENGTH	88
	uint32_t word1;
	uint32_t word1;
#define lpfc_rsrc_desc_fcfcoe_vfnum_SHIFT	0
#define lpfc_rsrc_desc_fcfcoe_vfnum_SHIFT	0
#define lpfc_rsrc_desc_fcfcoe_vfnum_MASK	0x000000ff
#define lpfc_rsrc_desc_fcfcoe_vfnum_MASK	0x000000ff
@@ -2668,6 +2677,12 @@ struct lpfc_rsrc_desc_fcfcoe {
#define lpfc_rsrc_desc_fcfcoe_eq_cnt_SHIFT	16
#define lpfc_rsrc_desc_fcfcoe_eq_cnt_SHIFT	16
#define lpfc_rsrc_desc_fcfcoe_eq_cnt_MASK	0x0000ffff
#define lpfc_rsrc_desc_fcfcoe_eq_cnt_MASK	0x0000ffff
#define lpfc_rsrc_desc_fcfcoe_eq_cnt_WORD	word13
#define lpfc_rsrc_desc_fcfcoe_eq_cnt_WORD	word13
/* extended FC/FCoE Resource Descriptor when length = 88 bytes */
	uint32_t bw_min;
	uint32_t bw_max;
	uint32_t iops_min;
	uint32_t iops_max;
	uint32_t reserved[4];
};
};


struct lpfc_func_cfg {
struct lpfc_func_cfg {
+15 −10
Original line number Original line Diff line number Diff line
@@ -6299,8 +6299,9 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
	uint32_t shdr_status, shdr_add_status;
	uint32_t shdr_status, shdr_add_status;
	struct lpfc_mbx_get_func_cfg *get_func_cfg;
	struct lpfc_mbx_get_func_cfg *get_func_cfg;
	struct lpfc_rsrc_desc_fcfcoe *desc;
	struct lpfc_rsrc_desc_fcfcoe *desc;
	char *pdesc_0;
	uint32_t desc_count;
	uint32_t desc_count;
	int length, i, rc = 0;
	int length, i, rc = 0, rc2;


	pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
	pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
	if (!pmb) {
	if (!pmb) {
@@ -6412,18 +6413,17 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
			 LPFC_MBOX_OPCODE_GET_FUNCTION_CONFIG,
			 LPFC_MBOX_OPCODE_GET_FUNCTION_CONFIG,
			 length, LPFC_SLI4_MBX_EMBED);
			 length, LPFC_SLI4_MBX_EMBED);


	rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL);
	rc2 = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL);
	shdr = (union lpfc_sli4_cfg_shdr *)
	shdr = (union lpfc_sli4_cfg_shdr *)
				&pmb->u.mqe.un.sli4_config.header.cfg_shdr;
				&pmb->u.mqe.un.sli4_config.header.cfg_shdr;
	shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
	shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
	shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
	shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
	if (rc || shdr_status || shdr_add_status) {
	if (rc2 || shdr_status || shdr_add_status) {
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
				"3026 Mailbox failed , mbxCmd x%x "
				"3026 Mailbox failed , mbxCmd x%x "
				"GET_FUNCTION_CONFIG, mbxStatus x%x\n",
				"GET_FUNCTION_CONFIG, mbxStatus x%x\n",
				bf_get(lpfc_mqe_command, &pmb->u.mqe),
				bf_get(lpfc_mqe_command, &pmb->u.mqe),
				bf_get(lpfc_mqe_status, &pmb->u.mqe));
				bf_get(lpfc_mqe_status, &pmb->u.mqe));
		rc = -EIO;
		goto read_cfg_out;
		goto read_cfg_out;
	}
	}


@@ -6431,11 +6431,18 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
	get_func_cfg = &pmb->u.mqe.un.get_func_cfg;
	get_func_cfg = &pmb->u.mqe.un.get_func_cfg;
	desc_count = get_func_cfg->func_cfg.rsrc_desc_count;
	desc_count = get_func_cfg->func_cfg.rsrc_desc_count;


	pdesc_0 = (char *)&get_func_cfg->func_cfg.desc[0];
	desc = (struct lpfc_rsrc_desc_fcfcoe *)pdesc_0;
	length = bf_get(lpfc_rsrc_desc_fcfcoe_length, desc);
	if (length == LPFC_RSRC_DESC_TYPE_FCFCOE_V0_RSVD)
		length = LPFC_RSRC_DESC_TYPE_FCFCOE_V0_LENGTH;
	else if (length != LPFC_RSRC_DESC_TYPE_FCFCOE_V1_LENGTH)
		goto read_cfg_out;

	for (i = 0; i < LPFC_RSRC_DESC_MAX_NUM; i++) {
	for (i = 0; i < LPFC_RSRC_DESC_MAX_NUM; i++) {
		desc = (struct lpfc_rsrc_desc_fcfcoe *)
		desc = (struct lpfc_rsrc_desc_fcfcoe *)(pdesc_0 + length * i);
			&get_func_cfg->func_cfg.desc[i];
		if (LPFC_RSRC_DESC_TYPE_FCFCOE ==
		if (LPFC_RSRC_DESC_TYPE_FCFCOE ==
		    bf_get(lpfc_rsrc_desc_pcie_type, desc)) {
		    bf_get(lpfc_rsrc_desc_fcfcoe_type, desc)) {
			phba->sli4_hba.iov.pf_number =
			phba->sli4_hba.iov.pf_number =
				bf_get(lpfc_rsrc_desc_fcfcoe_pfnum, desc);
				bf_get(lpfc_rsrc_desc_fcfcoe_pfnum, desc);
			phba->sli4_hba.iov.vf_number =
			phba->sli4_hba.iov.vf_number =
@@ -6449,13 +6456,11 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
				"3027 GET_FUNCTION_CONFIG: pf_number:%d, "
				"3027 GET_FUNCTION_CONFIG: pf_number:%d, "
				"vf_number:%d\n", phba->sli4_hba.iov.pf_number,
				"vf_number:%d\n", phba->sli4_hba.iov.pf_number,
				phba->sli4_hba.iov.vf_number);
				phba->sli4_hba.iov.vf_number);
	else {
	else
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
		lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
				"3028 GET_FUNCTION_CONFIG: failed to find "
				"3028 GET_FUNCTION_CONFIG: failed to find "
				"Resrouce Descriptor:x%x\n",
				"Resrouce Descriptor:x%x\n",
				LPFC_RSRC_DESC_TYPE_FCFCOE);
				LPFC_RSRC_DESC_TYPE_FCFCOE);
		rc = -EIO;
	}


read_cfg_out:
read_cfg_out:
	mempool_free(pmb, phba->mbox_mem_pool);
	mempool_free(pmb, phba->mbox_mem_pool);