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

Commit 150d58c7 authored by Vasundhara Volam's avatar Vasundhara Volam Committed by David S. Miller
Browse files

be2net: Fixup profile management routines



1) Parse PCIe descriptor for max-VFs supported by HW
2) Cleanup NIC descriptor parsing in get_func/profile_config() routines
3) Use common struct definitions for v0 and v1 versions of GET_FUNC_CONFIG
Signed-off-by: default avatarVasundhara Volam <vasundhara.volam@emulex.com>

Signed-off-by: default avatarSathya Perla <sathya.perla@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f2f781a7
Loading
Loading
Loading
Loading
+55 −43
Original line number Diff line number Diff line
@@ -3066,25 +3066,40 @@ err:
	return status;
}

static struct be_nic_resource_desc *be_get_nic_desc(u8 *buf, u32 desc_count,
						    u32 max_buf_size)
static struct be_nic_res_desc *be_get_nic_desc(u8 *buf, u32 desc_count)
{
	struct be_nic_resource_desc *desc = (struct be_nic_resource_desc *)buf;
	struct be_res_desc_hdr *hdr = (struct be_res_desc_hdr *)buf;
	int i;

	for (i = 0; i < desc_count; i++) {
		desc->desc_len = desc->desc_len ? : RESOURCE_DESC_SIZE;
		if (((void *)desc + desc->desc_len) >
		    (void *)(buf + max_buf_size))
		if (hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V0 ||
		    hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V1)
			return (struct be_nic_res_desc *)hdr;

		hdr->desc_len = hdr->desc_len ? : RESOURCE_DESC_SIZE_V0;
		hdr = (void *)hdr + hdr->desc_len;
	}
	return NULL;
}

		if (desc->desc_type == NIC_RESOURCE_DESC_TYPE_V0 ||
		    desc->desc_type == NIC_RESOURCE_DESC_TYPE_V1)
			return desc;
static struct be_pcie_res_desc *be_get_pcie_desc(u8 devfn, u8 *buf,
						 u32 desc_count)
{
	struct be_res_desc_hdr *hdr = (struct be_res_desc_hdr *)buf;
	struct be_pcie_res_desc *pcie;
	int i;

		desc = (void *)desc + desc->desc_len;
	for (i = 0; i < desc_count; i++) {
		if ((hdr->desc_type == PCIE_RESOURCE_DESC_TYPE_V0 ||
		     hdr->desc_type == PCIE_RESOURCE_DESC_TYPE_V1)) {
			pcie = (struct be_pcie_res_desc	*)hdr;
			if (pcie->pf_num == devfn)
				return pcie;
		}

		hdr->desc_len = hdr->desc_len ? : RESOURCE_DESC_SIZE_V0;
		hdr = (void *)hdr + hdr->desc_len;
	}
	return NULL;
}

@@ -3128,10 +3143,9 @@ int be_cmd_get_func_config(struct be_adapter *adapter)
	if (!status) {
		struct be_cmd_resp_get_func_config *resp = cmd.va;
		u32 desc_count = le32_to_cpu(resp->desc_count);
		struct be_nic_resource_desc *desc;
		struct be_nic_res_desc *desc;

		desc = be_get_nic_desc(resp->func_param, desc_count,
				       sizeof(resp->func_param));
		desc = be_get_nic_desc(resp->func_param, desc_count);
		if (!desc) {
			status = -EINVAL;
			goto err;
@@ -3223,51 +3237,51 @@ err:
int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
			      u16 *txq_count, u8 domain)
{
	struct be_cmd_resp_get_profile_config *resp;
	struct be_pcie_res_desc *pcie;
	struct be_nic_res_desc *nic;
	struct be_queue_info *mccq = &adapter->mcc_obj.q;
	struct be_dma_mem cmd;
	u32 desc_count;
	int status;

	memset(&cmd, 0, sizeof(struct be_dma_mem));
	if (!lancer_chip(adapter))
		cmd.size = sizeof(struct be_cmd_resp_get_profile_config_v1);
	else
	cmd.size = sizeof(struct be_cmd_resp_get_profile_config);
	cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size,
				      &cmd.dma);
	if (!cmd.va) {
		dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
	cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, &cmd.dma);
	if (!cmd.va)
		return -ENOMEM;
	}

	if (!mccq->created)
		status = be_cmd_get_profile_config_mbox(adapter, domain, &cmd);
	else
		status = be_cmd_get_profile_config_mccq(adapter, domain, &cmd);
	if (!status) {
		struct be_cmd_resp_get_profile_config *resp = cmd.va;
		u32 desc_count = le32_to_cpu(resp->desc_count);
		struct be_nic_resource_desc *desc;
	if (status)
		goto err;

		desc = be_get_nic_desc(resp->func_param, desc_count,
				       sizeof(resp->func_param));
	resp = cmd.va;
	desc_count = le32_to_cpu(resp->desc_count);

		if (!desc) {
			status = -EINVAL;
			goto err;
		}
	pcie =  be_get_pcie_desc(adapter->pdev->devfn, resp->func_param,
				 desc_count);
	if (pcie)
		adapter->dev_num_vfs = le16_to_cpu(pcie->num_vfs);

	nic = be_get_nic_desc(resp->func_param, desc_count);
	if (nic) {
		if (cap_flags)
			*cap_flags = le32_to_cpu(desc->cap_flags);
			*cap_flags = le32_to_cpu(nic->cap_flags);
		if (txq_count)
			*txq_count = le32_to_cpu(desc->txq_count);
			*txq_count = le16_to_cpu(nic->txq_count);
	}
err:
	if (cmd.va)
		pci_free_consistent(adapter->pdev, cmd.size,
				    cmd.va, cmd.dma);
		pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma);
	return status;
}

/* Uses sync mcc */
/* Currently only Lancer uses this command and it supports version 0 only
 * Uses sync mcc
 */
int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps,
			      u8 domain)
{
@@ -3288,12 +3302,10 @@ int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps,
	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
			       OPCODE_COMMON_SET_PROFILE_CONFIG, sizeof(*req),
			       wrb, NULL);

	req->hdr.domain = domain;
	req->desc_count = cpu_to_le32(1);

	req->nic_desc.desc_type = NIC_RESOURCE_DESC_TYPE_V0;
	req->nic_desc.desc_len = RESOURCE_DESC_SIZE;
	req->nic_desc.hdr.desc_type = NIC_RESOURCE_DESC_TYPE_V0;
	req->nic_desc.hdr.desc_len = RESOURCE_DESC_SIZE_V0;
	req->nic_desc.flags = (1 << QUN) | (1 << IMM) | (1 << NOSV);
	req->nic_desc.pf_num = adapter->pf_number;
	req->nic_desc.vf_num = domain;
+33 −16
Original line number Diff line number Diff line
@@ -1718,11 +1718,13 @@ struct be_cmd_req_set_ext_fat_caps {
	struct be_fat_conf_params set_params;
};

#define RESOURCE_DESC_SIZE			88
#define RESOURCE_DESC_SIZE_V0			72
#define RESOURCE_DESC_SIZE_V1			88
#define PCIE_RESOURCE_DESC_TYPE_V0		0x40
#define NIC_RESOURCE_DESC_TYPE_V0		0x41
#define PCIE_RESOURCE_DESC_TYPE_V1		0x50
#define NIC_RESOURCE_DESC_TYPE_V1		0x51
#define MAX_RESOURCE_DESC			4
#define MAX_RESOURCE_DESC_V1			32
#define MAX_RESOURCE_DESC			264

/* QOS unit number */
#define QUN					4
@@ -1731,9 +1733,30 @@ struct be_cmd_req_set_ext_fat_caps {
/* No save */
#define NOSV					7

struct be_nic_resource_desc {
struct be_res_desc_hdr {
	u8 desc_type;
	u8 desc_len;
} __packed;

struct be_pcie_res_desc {
	struct be_res_desc_hdr hdr;
	u8 rsvd0;
	u8 flags;
	u16 rsvd1;
	u8 pf_num;
	u8 rsvd2;
	u32 rsvd3;
	u8 sriov_state;
	u8 pf_state;
	u8 pf_type;
	u8 rsvd4;
	u16 num_vfs;
	u16 rsvd5;
	u32 rsvd6[17];
} __packed;

struct be_nic_res_desc {
	struct be_res_desc_hdr hdr;
	u8 rsvd1;
	u8 flags;
	u8 vf_num;
@@ -1762,7 +1785,7 @@ struct be_nic_resource_desc {
	u8 wol_param;
	u16 rsvd7;
	u32 rsvd8[3];
};
} __packed;

struct be_cmd_req_get_func_config {
	struct be_cmd_req_hdr hdr;
@@ -1771,7 +1794,7 @@ struct be_cmd_req_get_func_config {
struct be_cmd_resp_get_func_config {
	struct be_cmd_resp_hdr hdr;
	u32 desc_count;
	u8 func_param[MAX_RESOURCE_DESC * RESOURCE_DESC_SIZE];
	u8 func_param[MAX_RESOURCE_DESC * RESOURCE_DESC_SIZE_V1];
};

#define ACTIVE_PROFILE_TYPE			0x2
@@ -1783,26 +1806,20 @@ struct be_cmd_req_get_profile_config {
};

struct be_cmd_resp_get_profile_config {
	struct be_cmd_req_hdr hdr;
	u32 desc_count;
	u8 func_param[MAX_RESOURCE_DESC * RESOURCE_DESC_SIZE];
};

struct be_cmd_resp_get_profile_config_v1 {
	struct be_cmd_req_hdr hdr;
	struct be_cmd_resp_hdr hdr;
	u32 desc_count;
	u8 func_param[MAX_RESOURCE_DESC_V1 * RESOURCE_DESC_SIZE];
	u8 func_param[MAX_RESOURCE_DESC * RESOURCE_DESC_SIZE_V1];
};

struct be_cmd_req_set_profile_config {
	struct be_cmd_req_hdr hdr;
	u32 rsvd;
	u32 desc_count;
	struct be_nic_resource_desc nic_desc;
	struct be_nic_res_desc nic_desc;
};

struct be_cmd_resp_set_profile_config {
	struct be_cmd_req_hdr hdr;
	struct be_cmd_resp_hdr hdr;
};

struct be_cmd_enable_disable_vf {