Commit 10cccf60 authored by Vasundhara Volam's avatar Vasundhara Volam Committed by David S. Miller

be2net: read VF's capabilities from GET_PROFILE_CONFIG cmd

The PF driver must query the FW for VF's interface capabilities
to know if the VF is RSS capable or not.
This patch is in preparation for enabling RSS on VFs on Skyhawk-R.
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 ba48c0c9
...@@ -411,6 +411,7 @@ struct be_resources { ...@@ -411,6 +411,7 @@ struct be_resources {
u16 max_vlans; /* Number of vlans supported */ u16 max_vlans; /* Number of vlans supported */
u16 max_evt_qs; u16 max_evt_qs;
u32 if_cap_flags; u32 if_cap_flags;
u32 vf_if_cap_flags; /* VF if capability flags */
}; };
struct rss_info { struct rss_info {
......
...@@ -3313,15 +3313,28 @@ int be_cmd_query_port_name(struct be_adapter *adapter, u8 *port_name) ...@@ -3313,15 +3313,28 @@ int be_cmd_query_port_name(struct be_adapter *adapter, u8 *port_name)
return status; return status;
} }
static struct be_nic_res_desc *be_get_nic_desc(u8 *buf, u32 desc_count) /* Descriptor type */
enum {
FUNC_DESC = 1,
VFT_DESC = 2
};
static struct be_nic_res_desc *be_get_nic_desc(u8 *buf, u32 desc_count,
int desc_type)
{ {
struct be_res_desc_hdr *hdr = (struct be_res_desc_hdr *)buf; struct be_res_desc_hdr *hdr = (struct be_res_desc_hdr *)buf;
struct be_nic_res_desc *nic;
int i; int i;
for (i = 0; i < desc_count; i++) { for (i = 0; i < desc_count; i++) {
if (hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V0 || if (hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V0 ||
hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V1) hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V1) {
return (struct be_nic_res_desc *)hdr; nic = (struct be_nic_res_desc *)hdr;
if (desc_type == FUNC_DESC ||
(desc_type == VFT_DESC &&
nic->flags & (1 << VFT_SHIFT)))
return nic;
}
hdr->desc_len = hdr->desc_len ? : RESOURCE_DESC_SIZE_V0; hdr->desc_len = hdr->desc_len ? : RESOURCE_DESC_SIZE_V0;
hdr = (void *)hdr + hdr->desc_len; hdr = (void *)hdr + hdr->desc_len;
...@@ -3329,6 +3342,16 @@ static struct be_nic_res_desc *be_get_nic_desc(u8 *buf, u32 desc_count) ...@@ -3329,6 +3342,16 @@ static struct be_nic_res_desc *be_get_nic_desc(u8 *buf, u32 desc_count)
return NULL; return NULL;
} }
static struct be_nic_res_desc *be_get_vft_desc(u8 *buf, u32 desc_count)
{
return be_get_nic_desc(buf, desc_count, VFT_DESC);
}
static struct be_nic_res_desc *be_get_func_nic_desc(u8 *buf, u32 desc_count)
{
return be_get_nic_desc(buf, desc_count, FUNC_DESC);
}
static struct be_pcie_res_desc *be_get_pcie_desc(u8 devfn, u8 *buf, static struct be_pcie_res_desc *be_get_pcie_desc(u8 devfn, u8 *buf,
u32 desc_count) u32 desc_count)
{ {
...@@ -3424,7 +3447,7 @@ int be_cmd_get_func_config(struct be_adapter *adapter, struct be_resources *res) ...@@ -3424,7 +3447,7 @@ int be_cmd_get_func_config(struct be_adapter *adapter, struct be_resources *res)
u32 desc_count = le32_to_cpu(resp->desc_count); u32 desc_count = le32_to_cpu(resp->desc_count);
struct be_nic_res_desc *desc; struct be_nic_res_desc *desc;
desc = be_get_nic_desc(resp->func_param, desc_count); desc = be_get_func_nic_desc(resp->func_param, desc_count);
if (!desc) { if (!desc) {
status = -EINVAL; status = -EINVAL;
goto err; goto err;
...@@ -3446,6 +3469,7 @@ int be_cmd_get_profile_config(struct be_adapter *adapter, ...@@ -3446,6 +3469,7 @@ int be_cmd_get_profile_config(struct be_adapter *adapter,
{ {
struct be_cmd_resp_get_profile_config *resp; struct be_cmd_resp_get_profile_config *resp;
struct be_cmd_req_get_profile_config *req; struct be_cmd_req_get_profile_config *req;
struct be_nic_res_desc *vf_res;
struct be_pcie_res_desc *pcie; struct be_pcie_res_desc *pcie;
struct be_port_res_desc *port; struct be_port_res_desc *port;
struct be_nic_res_desc *nic; struct be_nic_res_desc *nic;
...@@ -3486,10 +3510,13 @@ int be_cmd_get_profile_config(struct be_adapter *adapter, ...@@ -3486,10 +3510,13 @@ int be_cmd_get_profile_config(struct be_adapter *adapter,
if (port) if (port)
adapter->mc_type = port->mc_type; adapter->mc_type = port->mc_type;
nic = be_get_nic_desc(resp->func_param, desc_count); nic = be_get_func_nic_desc(resp->func_param, desc_count);
if (nic) if (nic)
be_copy_nic_desc(res, nic); be_copy_nic_desc(res, nic);
vf_res = be_get_vft_desc(resp->func_param, desc_count);
if (vf_res)
res->vf_if_cap_flags = vf_res->cap_flags;
err: err:
if (cmd.va) 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);
......
...@@ -1835,6 +1835,7 @@ struct be_cmd_req_set_ext_fat_caps { ...@@ -1835,6 +1835,7 @@ struct be_cmd_req_set_ext_fat_caps {
#define PORT_RESOURCE_DESC_TYPE_V1 0x55 #define PORT_RESOURCE_DESC_TYPE_V1 0x55
#define MAX_RESOURCE_DESC 264 #define MAX_RESOURCE_DESC 264
#define VFT_SHIFT 3 /* VF template */
#define IMM_SHIFT 6 /* Immediate */ #define IMM_SHIFT 6 /* Immediate */
#define NOSV_SHIFT 7 /* No save */ #define NOSV_SHIFT 7 /* No save */
......
...@@ -3379,6 +3379,7 @@ static int be_get_resources(struct be_adapter *adapter) ...@@ -3379,6 +3379,7 @@ static int be_get_resources(struct be_adapter *adapter)
if (status) if (status)
return status; return status;
adapter->res.max_vfs = res.max_vfs; adapter->res.max_vfs = res.max_vfs;
adapter->res.vf_if_cap_flags = res.vf_if_cap_flags;
} }
dev_info(dev, "Max: txqs %d, rxqs %d, rss %d, eqs %d, vfs %d\n", dev_info(dev, "Max: txqs %d, rxqs %d, rss %d, eqs %d, vfs %d\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment