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

Reply via email to