ixgbevf: add RSS support for X550
authorEmil Tantilov <emil.s.tantilov@intel.com>
Sat, 6 Dec 2014 09:19:09 +0000 (09:19 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 6 Feb 2015 03:57:47 +0000 (19:57 -0800)
X550 provides RSS registers for configuring RSS per VF.

This patch introduces ixgbevf_setup_vfmrqc() which uses the VFRETA,
VFRSSRK and VFMRQC registers to configure RSS on X550.

Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com>
Tested-by: Krishneil Singh <Krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
drivers/net/ethernet/intel/ixgbevf/regs.h

index 92154ee..a573526 100644 (file)
@@ -1584,6 +1584,39 @@ static void ixgbevf_rx_desc_queue_enable(struct ixgbevf_adapter *adapter,
                       reg_idx);
 }
 
+static void ixgbevf_setup_vfmrqc(struct ixgbevf_adapter *adapter)
+{
+       struct ixgbe_hw *hw = &adapter->hw;
+       u32 vfmrqc = 0, vfreta = 0;
+       u32 rss_key[10];
+       u16 rss_i = adapter->num_rx_queues;
+       int i, j;
+
+       /* Fill out hash function seeds */
+       netdev_rss_key_fill(rss_key, sizeof(rss_key));
+       for (i = 0; i < 10; i++)
+               IXGBE_WRITE_REG(hw, IXGBE_VFRSSRK(i), rss_key[i]);
+
+       /* Fill out redirection table */
+       for (i = 0, j = 0; i < 64; i++, j++) {
+               if (j == rss_i)
+                       j = 0;
+               vfreta = (vfreta << 8) | (j * 0x1);
+               if ((i & 3) == 3)
+                       IXGBE_WRITE_REG(hw, IXGBE_VFRETA(i >> 2), vfreta);
+       }
+
+       /* Perform hash on these packet types */
+       vfmrqc |= IXGBE_VFMRQC_RSS_FIELD_IPV4 |
+               IXGBE_VFMRQC_RSS_FIELD_IPV4_TCP |
+               IXGBE_VFMRQC_RSS_FIELD_IPV6 |
+               IXGBE_VFMRQC_RSS_FIELD_IPV6_TCP;
+
+       vfmrqc |= IXGBE_VFMRQC_RSSEN;
+
+       IXGBE_WRITE_REG(hw, IXGBE_VFMRQC, vfmrqc);
+}
+
 static void ixgbevf_configure_rx_ring(struct ixgbevf_adapter *adapter,
                                      struct ixgbevf_ring *ring)
 {
@@ -1640,6 +1673,8 @@ static void ixgbevf_configure_rx(struct ixgbevf_adapter *adapter)
        struct net_device *netdev = adapter->netdev;
 
        ixgbevf_setup_psrtype(adapter);
+       if (hw->mac.type >= ixgbe_mac_X550_vf)
+               ixgbevf_setup_vfmrqc(adapter);
 
        /* notify the PF of our intent to use this size of frame */
        ixgbevf_rlpml_set_vf(hw, netdev->mtu + ETH_HLEN + ETH_FCS_LEN);
index 09dd8f6..3e712fd 100644 (file)
 #define IXGBE_VFGOTC_LSB       0x02020
 #define IXGBE_VFGOTC_MSB       0x02024
 #define IXGBE_VFMPRC           0x01034
+#define IXGBE_VFMRQC           0x3000
+#define IXGBE_VFRSSRK(x)       (0x3100 + ((x) * 4))
+#define IXGBE_VFRETA(x)        (0x3200 + ((x) * 4))
+
+/* VFMRQC bits */
+#define IXGBE_VFMRQC_RSSEN              0x00000001  /* RSS Enable */
+#define IXGBE_VFMRQC_RSS_FIELD_IPV4_TCP 0x00010000
+#define IXGBE_VFMRQC_RSS_FIELD_IPV4     0x00020000
+#define IXGBE_VFMRQC_RSS_FIELD_IPV6     0x00100000
+#define IXGBE_VFMRQC_RSS_FIELD_IPV6_TCP 0x00200000
 
 #define IXGBE_WRITE_FLUSH(a) (IXGBE_READ_REG(a, IXGBE_VFSTATUS))