Move stats register reads to ixgbe_read_stats_registers() as it will be used by the functions to retrieve stats and extended stats.
Signed-off-by: Maryam Tahhan <maryam.tahhan at intel.com> --- drivers/net/ixgbe/ixgbe_ethdev.c | 64 +++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index f18550c..927021f 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -1761,24 +1761,16 @@ ixgbe_dev_close(struct rte_eth_dev *dev) ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV); } -/* - * This function is based on ixgbe_update_stats_counters() in base/ixgbe.c - */ static void -ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) +ixgbe_read_stats_registers(struct ixgbe_hw *hw, struct ixgbe_hw_stats + *hw_stats, uint64_t *total_missed_rx, + uint64_t *total_qbrc, uint64_t *total_qprc, + uint64_t *rxnfgpc, uint64_t *txdgpc, + uint64_t *total_qprdc) { - struct ixgbe_hw *hw = - IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct ixgbe_hw_stats *hw_stats = - IXGBE_DEV_PRIVATE_TO_STATS(dev->data->dev_private); uint32_t bprc, lxon, lxoff, total; - uint64_t total_missed_rx, total_qbrc, total_qprc; unsigned i; - total_missed_rx = 0; - total_qbrc = 0; - total_qprc = 0; - hw_stats->crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS); hw_stats->illerrc += IXGBE_READ_REG(hw, IXGBE_ILLERRC); hw_stats->errbc += IXGBE_READ_REG(hw, IXGBE_ERRBC); @@ -1790,7 +1782,7 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) /* global total per queue */ hw_stats->mpc[i] += mp; /* Running comprehensive total for stats display */ - total_missed_rx += hw_stats->mpc[i]; + *total_missed_rx += hw_stats->mpc[i]; if (hw->mac.type == ixgbe_mac_82598EB) hw_stats->rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); @@ -1814,10 +1806,11 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) hw_stats->qbtc[i] += IXGBE_READ_REG(hw, IXGBE_QBTC_L(i)); hw_stats->qbtc[i] += ((uint64_t)IXGBE_READ_REG(hw, IXGBE_QBTC_H(i)) << 32); - hw_stats->qprdc[i] += IXGBE_READ_REG(hw, IXGBE_QPRDC(i)); + *total_qprdc += hw_stats->qprdc[i] += + IXGBE_READ_REG(hw, IXGBE_QPRDC(i)); - total_qprc += hw_stats->qprc[i]; - total_qbrc += hw_stats->qbrc[i]; + *total_qprc += hw_stats->qprc[i]; + *total_qbrc += hw_stats->qbrc[i]; } hw_stats->mlfc += IXGBE_READ_REG(hw, IXGBE_MLFC); hw_stats->mrfc += IXGBE_READ_REG(hw, IXGBE_MRFC); @@ -1825,6 +1818,8 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) /* Note that gprc counts missed packets */ hw_stats->gprc += IXGBE_READ_REG(hw, IXGBE_GPRC); + *rxnfgpc += IXGBE_READ_REG(hw, IXGBE_RXNFGPC); + *txdgpc += IXGBE_READ_REG(hw, IXGBE_TXDGPC); if (hw->mac.type != ixgbe_mac_82598EB) { hw_stats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCL); @@ -1902,6 +1897,35 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) hw_stats->fcoedwtc += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC); } + /* Flow Director Stats registers */ + hw_stats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); + hw_stats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS); +} + +/* + * This function is based on ixgbe_update_stats_counters() in ixgbe/ixgbe.c + */ +static void +ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) +{ + struct ixgbe_hw *hw = + IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + struct ixgbe_hw_stats *hw_stats = + IXGBE_DEV_PRIVATE_TO_STATS(dev->data->dev_private); + uint64_t total_missed_rx, total_qbrc, total_qprc, total_qprdc; + uint64_t rxnfgpc, txdgpc; + unsigned i; + + total_missed_rx = 0; + total_qbrc = 0; + total_qprc = 0; + total_qprdc = 0; + rxnfgpc = 0; + txdgpc = 0; + + ixgbe_read_stats_registers(hw, hw_stats, &total_missed_rx, &total_qbrc, + &total_qprc, &rxnfgpc, &txdgpc, &total_qprdc); + if (stats == NULL) return; @@ -1930,7 +1954,9 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) hw_stats->illerrc + hw_stats->errbc; /* Tx Errors */ - stats->oerrors = 0; + /*txdgpc: packets that are DMA'ed*/ + /*gptc: packets that are sent*/ + stats->oerrors = txdgpc - hw_stats->gptc; /* XON/XOFF pause frames */ stats->tx_pause_xon = hw_stats->lxontxc; @@ -1939,8 +1965,6 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) stats->rx_pause_xoff = hw_stats->lxoffrxc; /* Flow Director Stats registers */ - hw_stats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); - hw_stats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS); stats->fdirmatch = hw_stats->fdirmatch; stats->fdirmiss = hw_stats->fdirmiss; } -- 1.9.3