aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgbe
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2008-08-30 03:29:10 -0400
committerJeff Garzik <jgarzik@redhat.com>2008-09-03 10:08:22 -0400
commit3be1adfb912867e244729c3826b457ee76b8f737 (patch)
tree5805e1eda10bca5b4a66f9abbf3394312ff9824b /drivers/net/ixgbe
parent1a32bcfb5706d06a49904383b02f7c1d24172b96 (diff)
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>
Diffstat (limited to 'drivers/net/ixgbe')
-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)
1417 struct ixgbe_ring *rx_ring; 1417 struct ixgbe_ring *rx_ring;
1418 u32 srrctl; 1418 u32 srrctl;
1419 int queue0; 1419 int queue0;
1420 unsigned long *mask, maskval = 1; 1420 unsigned long mask;
1421 long shift, len; 1421
1422 1422 /* program one srrctl register per VMDq index */
1423 if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { 1423 if (adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) {
1424 mask = (unsigned long *) &adapter->ring_feature[RING_F_RSS].mask; 1424 long shift, len;
1425 len = sizeof(adapter->ring_feature[RING_F_RSS].mask) * 8; 1425 mask = (unsigned long) adapter->ring_feature[RING_F_RSS].mask;
1426 len = sizeof(adapter->ring_feature[RING_F_VMDQ].mask) * 8;
1427 shift = find_first_bit(&mask, len);
1428 queue0 = index & mask;
1429 index = (index & mask) >> shift;
1430 /* program one srrctl per RSS queue since RDRXCTL.MVMEN is enabled */
1426 } else { 1431 } else {
1427 mask = &maskval; 1432 mask = (unsigned long) adapter->ring_feature[RING_F_RSS].mask;
1428 len = 1; 1433 queue0 = index & mask;
1434 index = index & mask;
1429 } 1435 }
1430 shift = find_first_bit(mask, len); 1436
1431 queue0 = index << shift;
1432 rx_ring = &adapter->rx_ring[queue0]; 1437 rx_ring = &adapter->rx_ring[queue0];
1433 1438
1434 srrctl = IXGBE_READ_REG(&adapter->hw, IXGBE_SRRCTL(index)); 1439 srrctl = IXGBE_READ_REG(&adapter->hw, IXGBE_SRRCTL(index));