[PATCH] ixgb: Fix multi-cast packet count in statistics

Fix multi-cast packet count in statistics

Signed-off-by: Mallikarjuna R Chilakala <mallikarjuna.chilakala@intel.com>
Signed-off-by: Ganesh Venkatesan <ganesh.venkatesan@intel.com>
Signed-off-by: John Ronciak <john.ronciak@intel.com>

diff -up net-drivers-2.6/drivers/net/ixgb/ixgb_main.c net-drivers-2.6/drivers/net/ixgb.new/ixgb_main.c

authored by Malli Chilakala and committed by Jeff Garzik 5633684d 88d7bd8c

+23 -4
+23 -4
drivers/net/ixgb/ixgb_main.c
··· 1526 void 1527 ixgb_update_stats(struct ixgb_adapter *adapter) 1528 { 1529 adapter->stats.tprl += IXGB_READ_REG(&adapter->hw, TPRL); 1530 adapter->stats.tprh += IXGB_READ_REG(&adapter->hw, TPRH); 1531 adapter->stats.gprcl += IXGB_READ_REG(&adapter->hw, GPRCL); 1532 adapter->stats.gprch += IXGB_READ_REG(&adapter->hw, GPRCH); 1533 - adapter->stats.bprcl += IXGB_READ_REG(&adapter->hw, BPRCL); 1534 - adapter->stats.bprch += IXGB_READ_REG(&adapter->hw, BPRCH); 1535 - adapter->stats.mprcl += IXGB_READ_REG(&adapter->hw, MPRCL); 1536 - adapter->stats.mprch += IXGB_READ_REG(&adapter->hw, MPRCH); 1537 adapter->stats.uprcl += IXGB_READ_REG(&adapter->hw, UPRCL); 1538 adapter->stats.uprch += IXGB_READ_REG(&adapter->hw, UPRCH); 1539 adapter->stats.vprcl += IXGB_READ_REG(&adapter->hw, VPRCL);
··· 1526 void 1527 ixgb_update_stats(struct ixgb_adapter *adapter) 1528 { 1529 + struct net_device *netdev = adapter->netdev; 1530 + 1531 + if((netdev->flags & IFF_PROMISC) || (netdev->flags & IFF_ALLMULTI) || 1532 + (netdev->mc_count > IXGB_MAX_NUM_MULTICAST_ADDRESSES)) { 1533 + u64 multi = IXGB_READ_REG(&adapter->hw, MPRCL); 1534 + u32 bcast_l = IXGB_READ_REG(&adapter->hw, BPRCL); 1535 + u32 bcast_h = IXGB_READ_REG(&adapter->hw, BPRCH); 1536 + u64 bcast = ((u64)bcast_h << 32) | bcast_l; 1537 + 1538 + multi |= ((u64)IXGB_READ_REG(&adapter->hw, MPRCH) << 32); 1539 + /* fix up multicast stats by removing broadcasts */ 1540 + multi -= bcast; 1541 + 1542 + adapter->stats.mprcl += (multi & 0xFFFFFFFF); 1543 + adapter->stats.mprch += (multi >> 32); 1544 + adapter->stats.bprcl += bcast_l; 1545 + adapter->stats.bprch += bcast_h; 1546 + } else { 1547 + adapter->stats.mprcl += IXGB_READ_REG(&adapter->hw, MPRCL); 1548 + adapter->stats.mprch += IXGB_READ_REG(&adapter->hw, MPRCH); 1549 + adapter->stats.bprcl += IXGB_READ_REG(&adapter->hw, BPRCL); 1550 + adapter->stats.bprch += IXGB_READ_REG(&adapter->hw, BPRCH); 1551 + } 1552 adapter->stats.tprl += IXGB_READ_REG(&adapter->hw, TPRL); 1553 adapter->stats.tprh += IXGB_READ_REG(&adapter->hw, TPRH); 1554 adapter->stats.gprcl += IXGB_READ_REG(&adapter->hw, GPRCL); 1555 adapter->stats.gprch += IXGB_READ_REG(&adapter->hw, GPRCH); 1556 adapter->stats.uprcl += IXGB_READ_REG(&adapter->hw, UPRCL); 1557 adapter->stats.uprch += IXGB_READ_REG(&adapter->hw, UPRCH); 1558 adapter->stats.vprcl += IXGB_READ_REG(&adapter->hw, VPRCL);