ixgbe: consolidate, setup for multiple traffic classes
authorJohn Fastabend <john.r.fastabend@intel.com>
Mon, 18 Jul 2011 22:38:36 +0000 (22:38 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Mon, 29 Aug 2011 08:18:13 +0000 (01:18 -0700)
This consolidates setup code for multiple traffic classes in
the setup_tc routine.

Prep work to allow IEEE DCBX to optimize for number of traffic
classes. Also simplifies code paths.

Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Tested-by: Ross Brattain <ross.b.brattain@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index da6d53e..0422e35 100644 (file)
@@ -118,49 +118,11 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
        if (!!state != !(adapter->flags & IXGBE_FLAG_DCB_ENABLED))
                return err;
 
-       if (state > 0) {
-               /* Turn on DCB */
-               if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) {
-                       e_err(drv, "Enable failed, needs MSI-X\n");
-                       err = 1;
-                       goto out;
-               }
-
-               adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
-
-               switch (adapter->hw.mac.type) {
-               case ixgbe_mac_82598EB:
-                       adapter->last_lfc_mode = adapter->hw.fc.current_mode;
-                       adapter->hw.fc.requested_mode = ixgbe_fc_none;
-                       break;
-               case ixgbe_mac_82599EB:
-               case ixgbe_mac_X540:
-                       adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
-                       break;
-               default:
-                       break;
-               }
-
-               ixgbe_setup_tc(netdev, MAX_TRAFFIC_CLASS);
-       } else {
-               /* Turn off DCB */
-               adapter->hw.fc.requested_mode = adapter->last_lfc_mode;
-               adapter->temp_dcb_cfg.pfc_mode_enable = false;
-               adapter->dcb_cfg.pfc_mode_enable = false;
-               adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED;
-               switch (adapter->hw.mac.type) {
-               case ixgbe_mac_82599EB:
-               case ixgbe_mac_X540:
-                       if (!(adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE))
-                               adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
-                       break;
-               default:
-                       break;
-               }
-               ixgbe_setup_tc(netdev, 0);
-       }
+       if (state > 0)
+               err = ixgbe_setup_tc(netdev, MAX_TRAFFIC_CLASS);
+       else
+               err = ixgbe_setup_tc(netdev, 0);
 
-out:
        return err;
 }
 
index 2b1bb60..3932cd0 100644 (file)
@@ -7065,11 +7065,11 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)
        struct ixgbe_adapter *adapter = netdev_priv(dev);
        struct ixgbe_hw *hw = &adapter->hw;
 
-       /* If DCB is anabled do not remove traffic classes, multiple
-        * traffic classes are required to implement DCB
-        */
-       if (!tc && (adapter->flags & IXGBE_FLAG_DCB_ENABLED))
-               return 0;
+       /* Multiple traffic classes requires multiple queues */
+       if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) {
+               e_err(drv, "Enable failed, needs MSI-X\n");
+               return -EINVAL;
+       }
 
        /* Hardware supports up to 8 traffic classes */
        if (tc > MAX_TRAFFIC_CLASS ||
@@ -7084,11 +7084,27 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)
                ixgbe_close(dev);
        ixgbe_clear_interrupt_scheme(adapter);
 
-       if (tc)
+       if (tc) {
                netdev_set_num_tc(dev, tc);
-       else
+               adapter->last_lfc_mode = adapter->hw.fc.current_mode;
+
+               adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
+               adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
+
+               if (adapter->hw.mac.type == ixgbe_mac_82598EB)
+                       adapter->hw.fc.requested_mode = ixgbe_fc_none;
+       } else {
                netdev_reset_tc(dev);
 
+               adapter->hw.fc.requested_mode = adapter->last_lfc_mode;
+
+               adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED;
+               adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
+
+               adapter->temp_dcb_cfg.pfc_mode_enable = false;
+               adapter->dcb_cfg.pfc_mode_enable = false;
+       }
+
        ixgbe_init_interrupt_scheme(adapter);
        ixgbe_validate_rtr(adapter, tc);
        if (netif_running(dev))