be2net: Use GET_PROFILE_CONFIG V1 cmd for BE3-R
authorVasundhara Volam <vasundhara.volam@emulex.com>
Sun, 21 Apr 2013 23:28:17 +0000 (23:28 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 22 Apr 2013 19:36:06 +0000 (15:36 -0400)
Use GET_PROFILE_CONFIG_V1 cmd for BE3-R, to query the maximum number of
TX rings available per function. On SH-R the same is queried via the
GET_FUNCTION_CONFIG cmd.

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
drivers/net/ethernet/emulex/benet/be_main.c

index d60be6845ee64fb69fed86d44b332f9cb799a550..d6291aba25241bcae04ac8362ac733573fd080b2 100644 (file)
@@ -2946,7 +2946,8 @@ static struct be_nic_resource_desc *be_get_nic_desc(u8 *buf, u32 desc_count,
                        break;
                }
 
-               if (desc->desc_type == NIC_RESOURCE_DESC_TYPE_ID)
+               if (desc->desc_type == NIC_RESOURCE_DESC_TYPE_V0 ||
+                   desc->desc_type == NIC_RESOURCE_DESC_TYPE_V1)
                        break;
 
                desc = (void *)desc + desc->desc_len;
@@ -3020,23 +3021,41 @@ err:
        return status;
 }
 
- /* Uses sync mcc */
-int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
-                             u8 domain)
+/* Uses mbox */
+int be_cmd_get_profile_config_mbox(struct be_adapter *adapter,
+                                  u8 domain, struct be_dma_mem *cmd)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_get_profile_config *req;
        int status;
-       struct be_dma_mem cmd;
 
-       memset(&cmd, 0, sizeof(struct be_dma_mem));
-       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");
-               return -ENOMEM;
-       }
+       if (mutex_lock_interruptible(&adapter->mbox_lock))
+               return -1;
+       wrb = wrb_from_mbox(adapter);
+
+       req = cmd->va;
+       be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+                              OPCODE_COMMON_GET_PROFILE_CONFIG,
+                              cmd->size, wrb, cmd);
+
+       req->type = ACTIVE_PROFILE_TYPE;
+       req->hdr.domain = domain;
+       if (!lancer_chip(adapter))
+               req->hdr.version = 1;
+
+       status = be_mbox_notify_wait(adapter);
+
+       mutex_unlock(&adapter->mbox_lock);
+       return status;
+}
+
+/* Uses sync mcc */
+int be_cmd_get_profile_config_mccq(struct be_adapter *adapter,
+                                  u8 domain, struct be_dma_mem *cmd)
+{
+       struct be_mcc_wrb *wrb;
+       struct be_cmd_req_get_profile_config *req;
+       int status;
 
        spin_lock_bh(&adapter->mcc_lock);
 
@@ -3046,16 +3065,47 @@ int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
                goto err;
        }
 
-       req = cmd.va;
-
+       req = cmd->va;
        be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
                               OPCODE_COMMON_GET_PROFILE_CONFIG,
-                              cmd.size, wrb, &cmd);
+                              cmd->size, wrb, cmd);
 
        req->type = ACTIVE_PROFILE_TYPE;
        req->hdr.domain = domain;
+       if (!lancer_chip(adapter))
+               req->hdr.version = 1;
 
        status = be_mcc_notify_wait(adapter);
+
+err:
+       spin_unlock_bh(&adapter->mcc_lock);
+       return status;
+}
+
+/* Uses sync mcc, if MCCQ is already created otherwise mbox */
+int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
+                             u16 *txq_count, u8 domain)
+{
+       struct be_queue_info *mccq = &adapter->mcc_obj.q;
+       struct be_dma_mem cmd;
+       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");
+               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);
@@ -3068,12 +3118,15 @@ int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
                        status = -EINVAL;
                        goto err;
                }
-               *cap_flags = le32_to_cpu(desc->cap_flags);
+               if (cap_flags)
+                       *cap_flags = le32_to_cpu(desc->cap_flags);
+               if (txq_count)
+                       *txq_count = le32_to_cpu(desc->txq_count);
        }
 err:
-       spin_unlock_bh(&adapter->mcc_lock);
-       pci_free_consistent(adapter->pdev, cmd.size,
-                           cmd.va, cmd.dma);
+       if (cmd.va)
+               pci_free_consistent(adapter->pdev, cmd.size,
+                                   cmd.va, cmd.dma);
        return status;
 }
 
@@ -3102,7 +3155,7 @@ int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps,
        req->hdr.domain = domain;
        req->desc_count = cpu_to_le32(1);
 
-       req->nic_desc.desc_type = NIC_RESOURCE_DESC_TYPE_ID;
+       req->nic_desc.desc_type = NIC_RESOURCE_DESC_TYPE_V0;
        req->nic_desc.desc_len = RESOURCE_DESC_SIZE;
        req->nic_desc.flags = (1 << QUN) | (1 << IMM) | (1 << NOSV);
        req->nic_desc.pf_num = adapter->pf_number;
index e9597852a40439a6b10bb8a670d6dfe260e9b6eb..460332021590ad36d780df518d3269520000fba6 100644 (file)
@@ -1687,9 +1687,11 @@ struct be_cmd_req_set_ext_fat_caps {
        struct be_fat_conf_params set_params;
 };
 
-#define RESOURCE_DESC_SIZE                     72
-#define NIC_RESOURCE_DESC_TYPE_ID              0x41
+#define RESOURCE_DESC_SIZE                     88
+#define NIC_RESOURCE_DESC_TYPE_V0              0x41
+#define NIC_RESOURCE_DESC_TYPE_V1              0x51
 #define MAX_RESOURCE_DESC                      4
+#define MAX_RESOURCE_DESC_V1                   32
 
 /* QOS unit number */
 #define QUN                                    4
@@ -1755,6 +1757,12 @@ struct be_cmd_resp_get_profile_config {
        u8 func_param[MAX_RESOURCE_DESC * RESOURCE_DESC_SIZE];
 };
 
+struct be_cmd_resp_get_profile_config_v1 {
+       struct be_cmd_req_hdr hdr;
+       u32 desc_count;
+       u8 func_param[MAX_RESOURCE_DESC_V1 * RESOURCE_DESC_SIZE];
+};
+
 struct be_cmd_req_set_profile_config {
        struct be_cmd_req_hdr hdr;
        u32 rsvd;
@@ -1917,7 +1925,7 @@ extern int lancer_test_and_set_rdy_state(struct be_adapter *adapter);
 extern int be_cmd_query_port_name(struct be_adapter *adapter, u8 *port_name);
 extern int be_cmd_get_func_config(struct be_adapter *adapter);
 extern int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
-                                    u8 domain);
+                                    u16 *txq_count, u8 domain);
 
 extern int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps,
                                     u8 domain);
index c70b8fff8cff8abd44528647117a2e6c6ed12bbd..e773fbaf8d02480865e7f15318996a365f8490b5 100644 (file)
@@ -2719,7 +2719,8 @@ static int be_vfs_if_create(struct be_adapter *adapter)
 
        for_all_vfs(adapter, vf_cfg, vf) {
                if (!BE3_chip(adapter))
-                       be_cmd_get_profile_config(adapter, &cap_flags, vf + 1);
+                       be_cmd_get_profile_config(adapter, &cap_flags,
+                                                 NULL, vf + 1);
 
                /* If a FW profile exists, then cap_flags are updated */
                en_flags = cap_flags & (BE_IF_FLAGS_UNTAGGED |
@@ -2883,11 +2884,14 @@ static void be_get_resources(struct be_adapter *adapter)
        u16 dev_num_vfs;
        int pos, status;
        bool profile_present = false;
+       u16 txq_count = 0;
 
        if (!BEx_chip(adapter)) {
                status = be_cmd_get_func_config(adapter);
                if (!status)
                        profile_present = true;
+       } else if (BE3_chip(adapter) && be_physfn(adapter)) {
+               be_cmd_get_profile_config(adapter, NULL, &txq_count, 0);
        }
 
        if (profile_present) {
@@ -2925,7 +2929,9 @@ static void be_get_resources(struct be_adapter *adapter)
                        adapter->max_vlans = BE_NUM_VLANS_SUPPORTED;
 
                adapter->max_mcast_mac = BE_MAX_MC;
-               adapter->max_tx_queues = MAX_TX_QS;
+               adapter->max_tx_queues = txq_count ? txq_count : MAX_TX_QS;
+               adapter->max_tx_queues = min_t(u16, adapter->max_tx_queues,
+                                              MAX_TX_QS);
                adapter->max_rss_queues = (adapter->be3_native) ?
                                           BE3_MAX_RSS_QS : BE2_MAX_RSS_QS;
                adapter->max_event_queues = BE3_MAX_RSS_QS;