aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgbe
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ixgbe')
-rw-r--r--drivers/net/ixgbe/ixgbe_main.c53
1 files changed, 31 insertions, 22 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index ee5ee10c918f..6e7d90e69b52 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c
@@ -2026,22 +2026,26 @@ static int ixgbe_close(struct net_device *netdev)
2026void ixgbe_update_stats(struct ixgbe_adapter *adapter) 2026void ixgbe_update_stats(struct ixgbe_adapter *adapter)
2027{ 2027{
2028 struct ixgbe_hw *hw = &adapter->hw; 2028 struct ixgbe_hw *hw = &adapter->hw;
2029 u64 good_rx, missed_rx, bprc; 2029 u64 total_mpc = 0;
2030 u32 i, missed_rx = 0, mpc, bprc, lxon, lxoff, xon_off_tot;
2030 2031
2031 adapter->stats.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS); 2032 adapter->stats.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);
2032 good_rx = IXGBE_READ_REG(hw, IXGBE_GPRC); 2033 for (i = 0; i < 8; i++) {
2033 missed_rx = IXGBE_READ_REG(hw, IXGBE_MPC(0)); 2034 /* for packet buffers not used, the register should read 0 */
2034 missed_rx += IXGBE_READ_REG(hw, IXGBE_MPC(1)); 2035 mpc = IXGBE_READ_REG(hw, IXGBE_MPC(i));
2035 missed_rx += IXGBE_READ_REG(hw, IXGBE_MPC(2)); 2036 missed_rx += mpc;
2036 missed_rx += IXGBE_READ_REG(hw, IXGBE_MPC(3)); 2037 adapter->stats.mpc[i] += mpc;
2037 missed_rx += IXGBE_READ_REG(hw, IXGBE_MPC(4)); 2038 total_mpc += adapter->stats.mpc[i];
2038 missed_rx += IXGBE_READ_REG(hw, IXGBE_MPC(5)); 2039 adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i));
2039 missed_rx += IXGBE_READ_REG(hw, IXGBE_MPC(6)); 2040 }
2040 missed_rx += IXGBE_READ_REG(hw, IXGBE_MPC(7)); 2041 adapter->stats.gprc += IXGBE_READ_REG(hw, IXGBE_GPRC);
2041 adapter->stats.gprc += (good_rx - missed_rx); 2042 /* work around hardware counting issue */
2042 2043 adapter->stats.gprc -= missed_rx;
2043 adapter->stats.mpc[0] += missed_rx; 2044
2045 /* 82598 hardware only has a 32 bit counter in the high register */
2044 adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH); 2046 adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH);
2047 adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH);
2048 adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORH);
2045 bprc = IXGBE_READ_REG(hw, IXGBE_BPRC); 2049 bprc = IXGBE_READ_REG(hw, IXGBE_BPRC);
2046 adapter->stats.bprc += bprc; 2050 adapter->stats.bprc += bprc;
2047 adapter->stats.mprc += IXGBE_READ_REG(hw, IXGBE_MPRC); 2051 adapter->stats.mprc += IXGBE_READ_REG(hw, IXGBE_MPRC);
@@ -2053,28 +2057,34 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
2053 adapter->stats.prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511); 2057 adapter->stats.prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511);
2054 adapter->stats.prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023); 2058 adapter->stats.prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023);
2055 adapter->stats.prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522); 2059 adapter->stats.prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522);
2056
2057 adapter->stats.rlec += IXGBE_READ_REG(hw, IXGBE_RLEC); 2060 adapter->stats.rlec += IXGBE_READ_REG(hw, IXGBE_RLEC);
2058 adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC); 2061 adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
2059 adapter->stats.lxontxc += IXGBE_READ_REG(hw, IXGBE_LXONTXC);
2060 adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC); 2062 adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
2061 adapter->stats.lxofftxc += IXGBE_READ_REG(hw, IXGBE_LXOFFTXC); 2063 lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
2064 adapter->stats.lxontxc += lxon;
2065 lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
2066 adapter->stats.lxofftxc += lxoff;
2062 adapter->stats.ruc += IXGBE_READ_REG(hw, IXGBE_RUC); 2067 adapter->stats.ruc += IXGBE_READ_REG(hw, IXGBE_RUC);
2063 adapter->stats.gptc += IXGBE_READ_REG(hw, IXGBE_GPTC); 2068 adapter->stats.gptc += IXGBE_READ_REG(hw, IXGBE_GPTC);
2064 adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); 2069 adapter->stats.mptc += IXGBE_READ_REG(hw, IXGBE_MPTC);
2065 adapter->stats.rnbc[0] += IXGBE_READ_REG(hw, IXGBE_RNBC(0)); 2070 /*
2071 * 82598 errata - tx of flow control packets is included in tx counters
2072 */
2073 xon_off_tot = lxon + lxoff;
2074 adapter->stats.gptc -= xon_off_tot;
2075 adapter->stats.mptc -= xon_off_tot;
2076 adapter->stats.gotc -= (xon_off_tot * (ETH_ZLEN + ETH_FCS_LEN));
2066 adapter->stats.ruc += IXGBE_READ_REG(hw, IXGBE_RUC); 2077 adapter->stats.ruc += IXGBE_READ_REG(hw, IXGBE_RUC);
2067 adapter->stats.rfc += IXGBE_READ_REG(hw, IXGBE_RFC); 2078 adapter->stats.rfc += IXGBE_READ_REG(hw, IXGBE_RFC);
2068 adapter->stats.rjc += IXGBE_READ_REG(hw, IXGBE_RJC); 2079 adapter->stats.rjc += IXGBE_READ_REG(hw, IXGBE_RJC);
2069 adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORH);
2070 adapter->stats.tpr += IXGBE_READ_REG(hw, IXGBE_TPR); 2080 adapter->stats.tpr += IXGBE_READ_REG(hw, IXGBE_TPR);
2071 adapter->stats.ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64); 2081 adapter->stats.ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64);
2082 adapter->stats.ptc64 -= xon_off_tot;
2072 adapter->stats.ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127); 2083 adapter->stats.ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127);
2073 adapter->stats.ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255); 2084 adapter->stats.ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255);
2074 adapter->stats.ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511); 2085 adapter->stats.ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511);
2075 adapter->stats.ptc1023 += IXGBE_READ_REG(hw, IXGBE_PTC1023); 2086 adapter->stats.ptc1023 += IXGBE_READ_REG(hw, IXGBE_PTC1023);
2076 adapter->stats.ptc1522 += IXGBE_READ_REG(hw, IXGBE_PTC1522); 2087 adapter->stats.ptc1522 += IXGBE_READ_REG(hw, IXGBE_PTC1522);
2077 adapter->stats.mptc += IXGBE_READ_REG(hw, IXGBE_MPTC);
2078 adapter->stats.bptc += IXGBE_READ_REG(hw, IXGBE_BPTC); 2088 adapter->stats.bptc += IXGBE_READ_REG(hw, IXGBE_BPTC);
2079 2089
2080 /* Fill out the OS statistics structure */ 2090 /* Fill out the OS statistics structure */
@@ -2090,8 +2100,7 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
2090 adapter->net_stats.rx_dropped = 0; 2100 adapter->net_stats.rx_dropped = 0;
2091 adapter->net_stats.rx_length_errors = adapter->stats.rlec; 2101 adapter->net_stats.rx_length_errors = adapter->stats.rlec;
2092 adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs; 2102 adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs;
2093 adapter->net_stats.rx_missed_errors = adapter->stats.mpc[0]; 2103 adapter->net_stats.rx_missed_errors = total_mpc;
2094
2095} 2104}
2096 2105
2097/** 2106/**