i40e: Separate out DCB capability and enabled flags
authorNeerav Parikh <neerav.parikh@intel.com>
Thu, 22 May 2014 06:31:51 +0000 (06:31 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 11 Jun 2014 15:48:15 +0000 (08:48 -0700)
Currently if the firmware reports DCB capability the driver enables
I40E_FLAG_DCB_ENABLED flag. When this flag is enabled the driver
inserts a tag when transmitting a packet from the port even if there
are no DCB traffic classes configured at the port.

This patch adds a new flag I40E_FLAG_DCB_CAPABLE that will be set
when the DCB capability is present and the existing flag
I40E_FLAG_DCB_ENABLED will be set only if there are more than one
traffic classes configured at the port.

Change-ID: I24ccbf53ef293db2eba80c8a9772acf729795bd5
Signed-off-by: Neerav Parikh <neerav.parikh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e.h
drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c
drivers/net/ethernet/intel/i40e/i40e_main.c

index fc1bd1094397e3ff7c8df1d997cb35a5f954c9f6..5a8bbaafe50099d2f8a0c82da03972235a03ed51 100644 (file)
@@ -264,6 +264,7 @@ struct i40e_pf {
 #ifdef CONFIG_I40E_VXLAN
 #define I40E_FLAG_VXLAN_FILTER_SYNC            (u64)(1 << 27)
 #endif
+#define I40E_FLAG_DCB_CAPABLE                  (u64)(1 << 29)
 
        /* tracks features that get auto disabled by errors */
        u64 auto_disable_flags;
index 871831a535d05a73fea023f341e6d41666364e61..00bc0cdb3a0304b87ec9935b148a81c683927f51 100644 (file)
@@ -302,8 +302,8 @@ void i40e_dcbnl_setup(struct i40e_vsi *vsi)
        struct net_device *dev = vsi->netdev;
        struct i40e_pf *pf = i40e_netdev_to_pf(dev);
 
-       /* DCB not enabled */
-       if (!(pf->flags & I40E_FLAG_DCB_ENABLED))
+       /* Not DCB capable */
+       if (!(pf->flags & I40E_FLAG_DCB_CAPABLE))
                return;
 
        /* Do not setup DCB NL ops for MFP mode */
index 145cb9fc1516d410f0067b0ee1fcc8617dda1c9b..676bebb97f6eb823f026d78d62632f71e8d0efd9 100644 (file)
@@ -4130,7 +4130,11 @@ static int i40e_init_pf_dcb(struct i40e_pf *pf)
                        /* When status is not DISABLED then DCBX in FW */
                        pf->dcbx_cap = DCB_CAP_DCBX_LLD_MANAGED |
                                       DCB_CAP_DCBX_VER_IEEE;
-                       pf->flags |= I40E_FLAG_DCB_ENABLED;
+
+                       pf->flags |= I40E_FLAG_DCB_CAPABLE;
+                       /* Enable DCB tagging only when more than one TC */
+                       if (i40e_dcb_get_num_tc(&hw->local_dcbx_config) > 1)
+                               pf->flags |= I40E_FLAG_DCB_ENABLED;
                }
        } else {
                dev_info(&pf->pdev->dev, "AQ Querying DCB configuration failed: %d\n",
@@ -4685,6 +4689,10 @@ static int i40e_handle_lldp_event(struct i40e_pf *pf,
        int ret = 0;
        u8 type;
 
+       /* Not DCB capable or capability disabled */
+       if (!(pf->flags & I40E_FLAG_DCB_CAPABLE))
+               return ret;
+
        /* Ignore if event is not for Nearest Bridge */
        type = ((mib->type >> I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT)
                & I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
@@ -4726,6 +4734,12 @@ static int i40e_handle_lldp_event(struct i40e_pf *pf,
        if (!need_reconfig)
                goto exit;
 
+       /* Enable DCB tagging only when more than one TC */
+       if (i40e_dcb_get_num_tc(dcbx_cfg) > 1)
+               pf->flags |= I40E_FLAG_DCB_ENABLED;
+       else
+               pf->flags &= ~I40E_FLAG_DCB_ENABLED;
+
        /* Reconfiguration needed quiesce all VSIs */
        i40e_pf_quiesce_all_vsi(pf);
 
@@ -6365,7 +6379,7 @@ static void i40e_init_interrupt_scheme(struct i40e_pf *pf)
                if (err) {
                        pf->flags &= ~(I40E_FLAG_MSIX_ENABLED   |
                                       I40E_FLAG_RSS_ENABLED    |
-                                      I40E_FLAG_DCB_ENABLED    |
+                                      I40E_FLAG_DCB_CAPABLE    |
                                       I40E_FLAG_SRIOV_ENABLED  |
                                       I40E_FLAG_FD_SB_ENABLED  |
                                       I40E_FLAG_FD_ATR_ENABLED |
@@ -8187,13 +8201,13 @@ static void i40e_determine_queue_usage(struct i40e_pf *pf)
                pf->flags &= ~(I40E_FLAG_RSS_ENABLED    |
                               I40E_FLAG_FD_SB_ENABLED  |
                               I40E_FLAG_FD_ATR_ENABLED |
-                              I40E_FLAG_DCB_ENABLED    |
+                              I40E_FLAG_DCB_CAPABLE    |
                               I40E_FLAG_SRIOV_ENABLED  |
                               I40E_FLAG_VMDQ_ENABLED);
        } else if (!(pf->flags & (I40E_FLAG_RSS_ENABLED |
                                  I40E_FLAG_FD_SB_ENABLED |
                                  I40E_FLAG_FD_ATR_ENABLED |
-                                 I40E_FLAG_DCB_ENABLED))) {
+                                 I40E_FLAG_DCB_CAPABLE))) {
                /* one qp for PF */
                pf->rss_size = pf->num_lan_qps = 1;
                queues_left -= pf->num_lan_qps;
@@ -8205,9 +8219,9 @@ static void i40e_determine_queue_usage(struct i40e_pf *pf)
                               I40E_FLAG_VMDQ_ENABLED);
        } else {
                /* Not enough queues for all TCs */
-               if ((pf->flags & I40E_FLAG_DCB_ENABLED) &&
+               if ((pf->flags & I40E_FLAG_DCB_CAPABLE) &&
                    (queues_left < I40E_MAX_TRAFFIC_CLASS)) {
-                       pf->flags &= ~I40E_FLAG_DCB_ENABLED;
+                       pf->flags &= ~I40E_FLAG_DCB_CAPABLE;
                        dev_info(&pf->pdev->dev, "not enough queues for DCB. DCB is disabled.\n");
                }
                pf->num_lan_qps = pf->rss_size_max;
@@ -8300,7 +8314,7 @@ static void i40e_print_features(struct i40e_pf *pf)
                buf += sprintf(buf, "FD_SB ");
                buf += sprintf(buf, "NTUPLE ");
        }
-       if (pf->flags & I40E_FLAG_DCB_ENABLED)
+       if (pf->flags & I40E_FLAG_DCB_CAPABLE)
                buf += sprintf(buf, "DCB ");
        if (pf->flags & I40E_FLAG_PTP)
                buf += sprintf(buf, "PTP ");
@@ -8486,7 +8500,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        err = i40e_init_pf_dcb(pf);
        if (err) {
                dev_info(&pdev->dev, "init_pf_dcb failed: %d\n", err);
-               pf->flags &= ~I40E_FLAG_DCB_ENABLED;
+               pf->flags &= ~I40E_FLAG_DCB_CAPABLE;
                /* Continue without DCB enabled */
        }
 #endif /* CONFIG_I40E_DCB */