summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2008-08-30 00:29:10 -0700
committerJeff Garzik <jgarzik@redhat.com>2008-09-03 10:08:22 -0400
commit3be1adfb912867e244729c3826b457ee76b8f737 (patch)
tree5805e1eda10bca5b4a66f9abbf3394312ff9824b
parent1a32bcfb5706d06a49904383b02f7c1d24172b96 (diff)
downloadlinux-3be1adfb912867e244729c3826b457ee76b8f737.tar.gz
linux-3be1adfb912867e244729c3826b457ee76b8f737.tar.bz2
linux-3be1adfb912867e244729c3826b457ee76b8f737.zip
ixgbe: change config srrctl to only program one register per VMDq/RSS id
This change makes it so only one srrctl register is programmed per VMDq id, and if VMDq is not enabled it is one register per RSS queue. Currently this function is working correctly for the multiqueue RSS and single queue cases, but if any advances features such as VMDq or DCB would have been enabled this function would have caused issues as it was not correct. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
-rw-r--r--drivers/net/ixgbe/ixgbe_main.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index 198b9d9a3d4c..99e0b34416e8 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c
@@ -1417,18 +1417,23 @@ static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter, int index)
struct ixgbe_ring *rx_ring;
u32 srrctl;
int queue0;
- unsigned long *mask, maskval = 1;
- long shift, len;
-
- if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) {
- mask = (unsigned long *) &adapter->ring_feature[RING_F_RSS].mask;
- len = sizeof(adapter->ring_feature[RING_F_RSS].mask) * 8;
+ unsigned long mask;
+
+ /* program one srrctl register per VMDq index */
+ if (adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) {
+ long shift, len;
+ mask = (unsigned long) adapter->ring_feature[RING_F_RSS].mask;
+ len = sizeof(adapter->ring_feature[RING_F_VMDQ].mask) * 8;
+ shift = find_first_bit(&mask, len);
+ queue0 = index & mask;
+ index = (index & mask) >> shift;
+ /* program one srrctl per RSS queue since RDRXCTL.MVMEN is enabled */
} else {
- mask = &maskval;
- len = 1;
+ mask = (unsigned long) adapter->ring_feature[RING_F_RSS].mask;
+ queue0 = index & mask;
+ index = index & mask;
}
- shift = find_first_bit(mask, len);
- queue0 = index << shift;
+
rx_ring = &adapter->rx_ring[queue0];
srrctl = IXGBE_READ_REG(&adapter->hw, IXGBE_SRRCTL(index));