be2net: query max_tx_qs for BE3 super-nic profile from FW
authorSuresh Reddy <Suresh.Reddy@emulex.com>
Tue, 2 Sep 2014 04:26:57 +0000 (09:56 +0530)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Sep 2014 19:46:00 +0000 (12:46 -0700)
In the BE3 super-nic profile, the max_tx_qs value can vary for each function.
So the driver needs to query this value from FW instead of using the
pre-defined constant BE3_MAX_TX_QS.

Signed-off-by: Suresh Reddy <Suresh.Reddy@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_main.c

index 1b1fbbf..5b26c4c 100644 (file)
@@ -3324,10 +3324,20 @@ static void BEx_get_resources(struct be_adapter *adapter,
         */
        if (BE2_chip(adapter) || use_sriov ||  (adapter->port_num > 1) ||
            !be_physfn(adapter) || (be_is_mc(adapter) &&
-           !(adapter->function_caps & BE_FUNCTION_CAPS_RSS)))
+           !(adapter->function_caps & BE_FUNCTION_CAPS_RSS))) {
                res->max_tx_qs = 1;
-       else
+       } else if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) {
+               struct be_resources super_nic_res = {0};
+
+               /* On a SuperNIC profile, the driver needs to use the
+                * GET_PROFILE_CONFIG cmd to query the per-function TXQ limits
+                */
+               be_cmd_get_profile_config(adapter, &super_nic_res, 0);
+               /* Some old versions of BE3 FW don't report max_tx_qs value */
+               res->max_tx_qs = super_nic_res.max_tx_qs ? : BE3_MAX_TX_QS;
+       } else {
                res->max_tx_qs = BE3_MAX_TX_QS;
+       }
 
        if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) &&
            !use_sriov && be_physfn(adapter))