net/cxgbe: fix port statistics
authorRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Sat, 27 May 2017 03:46:27 +0000 (09:16 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 12 Jun 2017 09:41:27 +0000 (10:41 +0100)
Do not count pause frames as part of normal TX/RX Frame/Byte counts.
Also, switch to using software counters rather than hardware for RX
stats.

Fixes: 856505d303f4 ("cxgbe: add port statistics")
Cc: stable@dpdk.org
Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
drivers/net/cxgbe/base/t4_hw.c
drivers/net/cxgbe/base/t4_regs.h
drivers/net/cxgbe/cxgbe_ethdev.c

index 94abd5b..83a542d 100644 (file)
@@ -2941,6 +2941,7 @@ unsigned int t4_get_tp_ch_map(struct adapter *adapter, unsigned int pidx)
 void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
 {
        u32 bgmap = t4_get_mps_bg_map(adap, idx);
+       u32 stat_ctl = t4_read_reg(adap, A_MPS_STAT_CTL);
 
 #define GET_STAT(name) \
        t4_read_reg64(adap, \
@@ -2973,6 +2974,15 @@ void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
        p->tx_ppp6             = GET_STAT(TX_PORT_PPP6);
        p->tx_ppp7             = GET_STAT(TX_PORT_PPP7);
 
+       if (CHELSIO_CHIP_VERSION(adap->params.chip) >= CHELSIO_T5) {
+               if (stat_ctl & F_COUNTPAUSESTATTX) {
+                       p->tx_frames -= p->tx_pause;
+                       p->tx_octets -= p->tx_pause * 64;
+               }
+               if (stat_ctl & F_COUNTPAUSEMCTX)
+                       p->tx_mcast_frames -= p->tx_pause;
+       }
+
        p->rx_octets           = GET_STAT(RX_PORT_BYTES);
        p->rx_frames           = GET_STAT(RX_PORT_FRAMES);
        p->rx_bcast_frames     = GET_STAT(RX_PORT_BCAST);
@@ -3000,6 +3010,16 @@ void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
        p->rx_ppp5             = GET_STAT(RX_PORT_PPP5);
        p->rx_ppp6             = GET_STAT(RX_PORT_PPP6);
        p->rx_ppp7             = GET_STAT(RX_PORT_PPP7);
+
+       if (CHELSIO_CHIP_VERSION(adap->params.chip) >= CHELSIO_T5) {
+               if (stat_ctl & F_COUNTPAUSESTATRX) {
+                       p->rx_frames -= p->rx_pause;
+                       p->rx_octets -= p->rx_pause * 64;
+               }
+               if (stat_ctl & F_COUNTPAUSEMCRX)
+                       p->rx_mcast_frames -= p->rx_pause;
+       }
+
        p->rx_ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_MAC_DROP_FRAME) : 0;
        p->rx_ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_MAC_DROP_FRAME) : 0;
        p->rx_ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_DROP_FRAME) : 0;
index 8dc1f58..289c7e4 100644 (file)
 #define V_VF(x) ((x) << S_VF)
 #define G_VF(x) (((x) >> S_VF) & M_VF)
 
+#define A_MPS_STAT_CTL 0x9600
+
+#define S_COUNTPAUSEMCRX    5
+#define V_COUNTPAUSEMCRX(x) ((x) << S_COUNTPAUSEMCRX)
+#define F_COUNTPAUSEMCRX    V_COUNTPAUSEMCRX(1U)
+
+#define S_COUNTPAUSESTATRX    4
+#define V_COUNTPAUSESTATRX(x) ((x) << S_COUNTPAUSESTATRX)
+#define F_COUNTPAUSESTATRX    V_COUNTPAUSESTATRX(1U)
+
+#define S_COUNTPAUSEMCTX    3
+#define V_COUNTPAUSEMCTX(x) ((x) << S_COUNTPAUSEMCTX)
+#define F_COUNTPAUSEMCTX    V_COUNTPAUSEMCTX(1U)
+
+#define S_COUNTPAUSESTATTX    2
+#define V_COUNTPAUSESTATTX(x) ((x) << S_COUNTPAUSESTATTX)
+#define F_COUNTPAUSESTATTX    V_COUNTPAUSESTATTX(1U)
+
 #define A_MPS_PORT_STAT_TX_PORT_BYTES_L 0x400
 #define A_MPS_PORT_STAT_TX_PORT_BYTES_H 0x404
 #define A_MPS_PORT_STAT_TX_PORT_FRAMES_L 0x408
index c50f089..3fae185 100644 (file)
@@ -657,8 +657,6 @@ static void cxgbe_dev_stats_get(struct rte_eth_dev *eth_dev,
        cxgbe_stats_get(pi, &ps);
 
        /* RX Stats */
-       eth_stats->ipackets = ps.rx_frames;
-       eth_stats->ibytes   = ps.rx_octets;
        eth_stats->imissed  = ps.rx_ovflow0 + ps.rx_ovflow1 +
                              ps.rx_ovflow2 + ps.rx_ovflow3 +
                              ps.rx_trunc0 + ps.rx_trunc1 +
@@ -678,6 +676,8 @@ static void cxgbe_dev_stats_get(struct rte_eth_dev *eth_dev,
 
                eth_stats->q_ipackets[i] = rxq->stats.pkts;
                eth_stats->q_ibytes[i] = rxq->stats.rx_bytes;
+               eth_stats->ipackets += eth_stats->q_ipackets[i];
+               eth_stats->ibytes += eth_stats->q_ibytes[i];
        }
 
        for (i = 0; i < pi->n_tx_qsets; i++) {