igb: only read phy specific stats if in internal phy mode
authorNick Nunley <nicholasx.d.nunley@intel.com>
Wed, 17 Feb 2010 01:03:58 +0000 (01:03 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 Feb 2010 21:21:36 +0000 (13:21 -0800)
There are a couple statistics registers that are not meant to
be read when in SGMII/serdes mode. This patch adds a check to
verify mode before reading and updating these statistics.

Signed-off-by: Nicholas Nunley <nicholasx.d.nunley@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/igb/igb_main.c

index b989b34a4adb2e039a65c81d3547aa0f90c189b0..cba0115a6a5792e02979b7cf4f8f004a785954fb 100644 (file)
@@ -3975,7 +3975,7 @@ void igb_update_stats(struct igb_adapter *adapter)
        struct net_device_stats *net_stats = igb_get_stats(adapter->netdev);
        struct e1000_hw *hw = &adapter->hw;
        struct pci_dev *pdev = adapter->pdev;
-       u32 rnbc;
+       u32 rnbc, reg;
        u16 phy_tmp;
        int i;
        u64 bytes, packets;
@@ -4072,8 +4072,13 @@ void igb_update_stats(struct igb_adapter *adapter)
        adapter->stats.colc += rd32(E1000_COLC);
 
        adapter->stats.algnerrc += rd32(E1000_ALGNERRC);
-       adapter->stats.rxerrc += rd32(E1000_RXERRC);
-       adapter->stats.tncrs += rd32(E1000_TNCRS);
+       /* read internal phy specific stats */
+       reg = rd32(E1000_CTRL_EXT);
+       if (!(reg & E1000_CTRL_EXT_LINK_MODE_MASK)) {
+               adapter->stats.rxerrc += rd32(E1000_RXERRC);
+               adapter->stats.tncrs += rd32(E1000_TNCRS);
+       }
+
        adapter->stats.tsctc += rd32(E1000_TSCTC);
        adapter->stats.tsctfc += rd32(E1000_TSCTFC);