ixgbe: DCB: enable RSS to be used with DCB
authorJohn Fastabend <john.r.fastabend@intel.com>
Wed, 23 Feb 2011 05:58:08 +0000 (05:58 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 12 Mar 2011 12:12:14 +0000 (04:12 -0800)
RSS had previously been disabled when DCB was enabled because
DCB was single queued per traffic class. Now that DCB implements
multiple Tx/Rx rings per traffic class enable RSS.

Here RSS hashes across the queues in the traffic class.

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/ixgbe/ixgbe_dcb_nl.c
drivers/net/ixgbe/ixgbe_main.c

index b7b6db3..91ff51c 100644 (file)
@@ -129,7 +129,6 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
                        netdev->netdev_ops->ndo_stop(netdev);
                ixgbe_clear_interrupt_scheme(adapter);
 
-               adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
                switch (adapter->hw.mac.type) {
                case ixgbe_mac_82598EB:
                        adapter->last_lfc_mode = adapter->hw.fc.current_mode;
@@ -162,7 +161,6 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
                        adapter->temp_dcb_cfg.pfc_mode_enable = false;
                        adapter->dcb_cfg.pfc_mode_enable = false;
                        adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED;
-                       adapter->flags |= IXGBE_FLAG_RSS_ENABLED;
                        switch (adapter->hw.mac.type) {
                        case ixgbe_mac_82599EB:
                        case ixgbe_mac_X540:
index 3ce0f4f..be2e145 100644 (file)
@@ -2892,17 +2892,20 @@ static void ixgbe_setup_mrqc(struct ixgbe_adapter *adapter)
                                        );
 
        switch (mask) {
+#ifdef CONFIG_IXGBE_DCB
+       case (IXGBE_FLAG_DCB_ENABLED | IXGBE_FLAG_RSS_ENABLED):
+               mrqc = IXGBE_MRQC_RTRSS8TCEN;
+               break;
+       case (IXGBE_FLAG_DCB_ENABLED):
+               mrqc = IXGBE_MRQC_RT8TCEN;
+               break;
+#endif /* CONFIG_IXGBE_DCB */
        case (IXGBE_FLAG_RSS_ENABLED):
                mrqc = IXGBE_MRQC_RSSEN;
                break;
        case (IXGBE_FLAG_SRIOV_ENABLED):
                mrqc = IXGBE_MRQC_VMDQEN;
                break;
-#ifdef CONFIG_IXGBE_DCB
-       case (IXGBE_FLAG_DCB_ENABLED):
-               mrqc = IXGBE_MRQC_RT8TCEN;
-               break;
-#endif /* CONFIG_IXGBE_DCB */
        default:
                break;
        }
@@ -3672,6 +3675,23 @@ static void ixgbe_configure_dcb(struct ixgbe_adapter *adapter)
 
        /* reconfigure the hardware */
        ixgbe_dcb_hw_config(hw, &adapter->dcb_cfg);
+
+       /* Enable RSS Hash per TC */
+       if (hw->mac.type != ixgbe_mac_82598EB) {
+               int i;
+               u32 reg = 0;
+
+               for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
+                       u8 msb = 0;
+                       u8 cnt = adapter->netdev->tc_to_txq[i].count;
+
+                       while (cnt >>= 1)
+                               msb++;
+
+                       reg |= msb << IXGBE_RQTC_SHIFT_TC(i);
+               }
+               IXGBE_WRITE_REG(hw, IXGBE_RQTC, reg);
+       }
 }
 
 #endif
@@ -7343,8 +7363,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
        if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
                adapter->flags &= ~(IXGBE_FLAG_RSS_ENABLED |
                                    IXGBE_FLAG_DCB_ENABLED);
-       if (adapter->flags & IXGBE_FLAG_DCB_ENABLED)
-               adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
 
 #ifdef CONFIG_IXGBE_DCB
        netdev->dcbnl_ops = &dcbnl_ops;