be2net: Fixup profile management routines
authorVasundhara Volam <vasundhara.volam@emulex.com>
Tue, 27 Aug 2013 11:27:31 +0000 (16:57 +0530)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Aug 2013 19:57:04 +0000 (15:57 -0400)
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: Vasundhara Volam <vasundhara.volam@emulex.com>
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/emulex/benet/be_cmds.c
drivers/net/ethernet/emulex/benet/be_cmds.h

index e69835c6532cb75f2a2783862c303db55a583846..bc6f95814998e669f68128469e619d99c7152156 100644 (file)
@@ -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))
-                       return NULL;
+               if (hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V0 ||
+                   hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V1)
+                       return (struct be_nic_res_desc *)hdr;
 
-               if (desc->desc_type == NIC_RESOURCE_DESC_TYPE_V0 ||
-                   desc->desc_type == NIC_RESOURCE_DESC_TYPE_V1)
-                       return desc;
-
-               desc = (void *)desc + desc->desc_len;
+               hdr->desc_len = hdr->desc_len ? : RESOURCE_DESC_SIZE_V0;
+               hdr = (void *)hdr + hdr->desc_len;
        }
+       return NULL;
+}
+
+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;
+
+       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.size = sizeof(struct be_cmd_resp_get_profile_config);
+       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;
index 880c85aea6bbaaca94f0e06da8c40b1dcc88ff6b..8ebed17b57f183646e1f40f1147d3a322f2c43f7 100644 (file)
@@ -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 {