tg3: Fix RSS indirection table distribution

The current RSS indirection table is populated such that more traffic
will hit the first RSS ring.  This patch adjusts the indirection table
so that the load is more evenly distributed.

Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Reviewed-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Matt Carlson 2011-07-20 10:20:54 +00:00 committed by David S. Miller
parent 5baa5e9aa2
commit 9d53fa1296
1 changed files with 15 additions and 6 deletions

View File

@ -8723,15 +8723,24 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
udelay(100);
if (tg3_flag(tp, ENABLE_RSS)) {
int i = 0;
u32 reg = MAC_RSS_INDIR_TBL_0;
u8 *ent = (u8 *)&val;
/* Setup the indirection table */
for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) {
int idx = i % sizeof(val);
if (tp->irq_cnt == 2) {
for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i += 8) {
tw32(reg, 0x0);
reg += 4;
}
} else {
u32 val;
ent[idx] = i % (tp->irq_cnt - 1);
if (idx == sizeof(val) - 1) {
while (i < TG3_RSS_INDIR_TBL_SIZE) {
val = i % (tp->irq_cnt - 1);
i++;
for (; i % 8; i++) {
val <<= 4;
val |= (i % (tp->irq_cnt - 1));
}
tw32(reg, val);
reg += 4;
}