mt76: mt7915: add tx mu/su counters to mib
authorBen Greear <greearb@candelatech.com>
Wed, 4 Aug 2021 13:43:32 +0000 (06:43 -0700)
committerFelix Fietkau <nbd@nbd.name>
Wed, 20 Oct 2021 08:36:44 +0000 (10:36 +0200)
These counters are clear-on-read, so we need to accumulate
them in the update_stats poll logic, and read the accumulated
values instead of directly doing register reads when reporting
to debugfs and ethtool stats.

Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
drivers/net/wireless/mediatek/mt76/mt7915/main.c
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h

index 8c1725c001267fd11b9cd6eb36cb0fda3d0d4ef4..1d237e7908e795088f1a7c3fd8a03d30a83afc6e 100644 (file)
@@ -153,56 +153,51 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,
 static void
 mt7915_txbf_stat_read_phy(struct mt7915_phy *phy, struct seq_file *s)
 {
-       struct mt7915_dev *dev = s->private;
-       bool ext_phy = phy != &dev->phy;
        static const char * const bw[] = {
                "BW20", "BW40", "BW80", "BW160"
        };
-       int cnt;
+       struct mib_stats *mib;
 
        if (!phy)
                return;
 
+       mib = &phy->mib;
+
        /* Tx Beamformer monitor */
        seq_puts(s, "\nTx Beamformer applied PPDU counts: ");
 
-       cnt = mt76_rr(dev, MT_ETBF_TX_APP_CNT(ext_phy));
-       seq_printf(s, "iBF: %ld, eBF: %ld\n",
-                  FIELD_GET(MT_ETBF_TX_IBF_CNT, cnt),
-                  FIELD_GET(MT_ETBF_TX_EBF_CNT, cnt));
+       seq_printf(s, "iBF: %d, eBF: %d\n",
+                  mib->tx_bf_ibf_ppdu_cnt,
+                  mib->tx_bf_ebf_ppdu_cnt);
 
        /* Tx Beamformer Rx feedback monitor */
        seq_puts(s, "Tx Beamformer Rx feedback statistics: ");
 
-       cnt = mt76_rr(dev, MT_ETBF_RX_FB_CNT(ext_phy));
-       seq_printf(s, "All: %ld, HE: %ld, VHT: %ld, HT: %ld, ",
-                  FIELD_GET(MT_ETBF_RX_FB_ALL, cnt),
-                  FIELD_GET(MT_ETBF_RX_FB_HE, cnt),
-                  FIELD_GET(MT_ETBF_RX_FB_VHT, cnt),
-                  FIELD_GET(MT_ETBF_RX_FB_HT, cnt));
-       cnt = mt76_rr(dev, MT_ETBF_RX_FB_CONT(ext_phy));
-       seq_printf(s, "%s, NC: %ld, NR: %ld\n",
-                  bw[FIELD_GET(MT_ETBF_RX_FB_BW, cnt)],
-                  FIELD_GET(MT_ETBF_RX_FB_NC, cnt),
-                  FIELD_GET(MT_ETBF_RX_FB_NR, cnt));
+       seq_printf(s, "All: %d, HE: %d, VHT: %d, HT: %d, ",
+                  mib->tx_bf_rx_fb_all_cnt,
+                  mib->tx_bf_rx_fb_he_cnt,
+                  mib->tx_bf_rx_fb_vht_cnt,
+                  mib->tx_bf_rx_fb_ht_cnt);
+
+       seq_printf(s, "%s, NC: %d, NR: %d\n",
+                  bw[mib->tx_bf_rx_fb_bw],
+                  mib->tx_bf_rx_fb_nc_cnt,
+                  mib->tx_bf_rx_fb_nr_cnt);
 
        /* Tx Beamformee Rx NDPA & Tx feedback report */
-       cnt = mt76_rr(dev, MT_ETBF_TX_NDP_BFRP(ext_phy));
-       seq_printf(s, "Tx Beamformee successful feedback frames: %ld\n",
-                  FIELD_GET(MT_ETBF_TX_FB_CPL, cnt));
-       seq_printf(s, "Tx Beamformee feedback triggered counts: %ld\n",
-                  FIELD_GET(MT_ETBF_TX_FB_TRI, cnt));
+       seq_printf(s, "Tx Beamformee successful feedback frames: %d\n",
+                  mib->tx_bf_fb_cpl_cnt);
+       seq_printf(s, "Tx Beamformee feedback triggered counts: %d\n",
+                  mib->tx_bf_fb_trig_cnt);
 
        /* Tx SU & MU counters */
-       cnt = mt76_rr(dev, MT_MIB_SDR34(ext_phy));
-       seq_printf(s, "Tx multi-user Beamforming counts: %ld\n",
-                  FIELD_GET(MT_MIB_MU_BF_TX_CNT, cnt));
-       cnt = mt76_rr(dev, MT_MIB_DR8(ext_phy));
-       seq_printf(s, "Tx multi-user MPDU counts: %d\n", cnt);
-       cnt = mt76_rr(dev, MT_MIB_DR9(ext_phy));
-       seq_printf(s, "Tx multi-user successful MPDU counts: %d\n", cnt);
-       cnt = mt76_rr(dev, MT_MIB_DR11(ext_phy));
-       seq_printf(s, "Tx single-user successful MPDU counts: %d\n", cnt);
+       seq_printf(s, "Tx multi-user Beamforming counts: %d\n",
+                  mib->tx_bf_cnt);
+       seq_printf(s, "Tx multi-user MPDU counts: %d\n", mib->tx_mu_mpdu_cnt);
+       seq_printf(s, "Tx multi-user successful MPDU counts: %d\n",
+                  mib->tx_mu_acked_mpdu_cnt);
+       seq_printf(s, "Tx single-user successful MPDU counts: %d\n",
+                  mib->tx_su_acked_mpdu_cnt);
 
        seq_puts(s, "\n");
 }
index 1563e27e161a08fd27392804cb9e284af9a73062..dfc8460ee717d6fad7e02a323c2098af5eb82a6a 100644 (file)
@@ -1923,10 +1923,40 @@ mt7915_mac_update_stats(struct mt7915_phy *phy)
        struct mt7915_dev *dev = phy->dev;
        struct mib_stats *mib = &phy->mib;
        bool ext_phy = phy != &dev->phy;
-       int i, aggr0, aggr1;
+       int i, aggr0, aggr1, cnt;
 
        mib->fcs_err_cnt += mt76_get_field(dev, MT_MIB_SDR3(ext_phy),
                                           MT_MIB_SDR3_FCS_ERR_MASK);
+       cnt = mt76_rr(dev, MT_MIB_SDR34(ext_phy));
+       mib->tx_bf_cnt += FIELD_GET(MT_MIB_MU_BF_TX_CNT, cnt);
+
+       cnt = mt76_rr(dev, MT_MIB_DR8(ext_phy));
+       mib->tx_mu_mpdu_cnt += cnt;
+
+       cnt = mt76_rr(dev, MT_MIB_DR9(ext_phy));
+       mib->tx_mu_acked_mpdu_cnt += cnt;
+
+       cnt = mt76_rr(dev, MT_MIB_DR11(ext_phy));
+       mib->tx_su_acked_mpdu_cnt += cnt;
+
+       cnt = mt76_rr(dev, MT_ETBF_TX_APP_CNT(ext_phy));
+       mib->tx_bf_ibf_ppdu_cnt += FIELD_GET(MT_ETBF_TX_IBF_CNT, cnt);
+       mib->tx_bf_ebf_ppdu_cnt += FIELD_GET(MT_ETBF_TX_EBF_CNT, cnt);
+
+       cnt = mt76_rr(dev, MT_ETBF_RX_FB_CNT(ext_phy));
+       mib->tx_bf_rx_fb_all_cnt += FIELD_GET(MT_ETBF_RX_FB_ALL, cnt);
+       mib->tx_bf_rx_fb_he_cnt += FIELD_GET(MT_ETBF_RX_FB_HE, cnt);
+       mib->tx_bf_rx_fb_vht_cnt += FIELD_GET(MT_ETBF_RX_FB_VHT, cnt);
+       mib->tx_bf_rx_fb_ht_cnt += FIELD_GET(MT_ETBF_RX_FB_HT, cnt);
+
+       cnt = mt76_rr(dev, MT_ETBF_RX_FB_CONT(ext_phy));
+       mib->tx_bf_rx_fb_bw = FIELD_GET(MT_ETBF_RX_FB_BW, cnt);
+       mib->tx_bf_rx_fb_nc_cnt += FIELD_GET(MT_ETBF_RX_FB_NC, cnt);
+       mib->tx_bf_rx_fb_nr_cnt += FIELD_GET(MT_ETBF_RX_FB_NR, cnt);
+
+       cnt = mt76_rr(dev, MT_ETBF_TX_NDP_BFRP(ext_phy));
+       mib->tx_bf_fb_cpl_cnt += FIELD_GET(MT_ETBF_TX_FB_CPL, cnt);
+       mib->tx_bf_fb_trig_cnt += FIELD_GET(MT_ETBF_TX_FB_TRI, cnt);
 
        aggr0 = ext_phy ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0;
        for (i = 0, aggr1 = aggr0 + 4; i < 4; i++) {
index 6f66cd4ca2691d08184c3fbf990bd736def24a11..21a0a9b77e4d5ea7d31da9f5f681705e2a484774 100644 (file)
@@ -1195,6 +1195,7 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
        struct mt7915_phy *phy = mt7915_hw_phy(hw);
        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
        struct mt7915_ethtool_worker_info wi;
+       struct mib_stats *mib = &phy->mib;
 
        /* See mt7915_ampdu_stat_read_phy, etc */
        bool ext_phy = phy != &dev->phy;
@@ -1208,39 +1209,28 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
        data[ei++] = phy->mib.ba_miss_cnt;
 
        /* Tx Beamformer monitor */
-       cnt = mt76_rr(dev, MT_ETBF_TX_APP_CNT(ext_phy));
-       data[ei++] = FIELD_GET(MT_ETBF_TX_IBF_CNT, cnt);
-       data[ei++] = FIELD_GET(MT_ETBF_TX_EBF_CNT, cnt);
+       data[ei++] = mib->tx_bf_ibf_ppdu_cnt;
+       data[ei++] = mib->tx_bf_ebf_ppdu_cnt;
 
        /* Tx Beamformer Rx feedback monitor */
-       cnt = mt76_rr(dev, MT_ETBF_RX_FB_CNT(ext_phy));
-       data[ei++] = FIELD_GET(MT_ETBF_RX_FB_ALL, cnt);
-       data[ei++] = FIELD_GET(MT_ETBF_RX_FB_HE, cnt);
-       data[ei++] = FIELD_GET(MT_ETBF_RX_FB_VHT, cnt);
-       data[ei++] = FIELD_GET(MT_ETBF_RX_FB_HT, cnt);
+       data[ei++] = mib->tx_bf_rx_fb_all_cnt;
+       data[ei++] = mib->tx_bf_rx_fb_he_cnt;
+       data[ei++] = mib->tx_bf_rx_fb_vht_cnt;
+       data[ei++] = mib->tx_bf_rx_fb_ht_cnt;
 
-       cnt = mt76_rr(dev, MT_ETBF_RX_FB_CONT(ext_phy));
-       data[ei++] = FIELD_GET(MT_ETBF_RX_FB_BW, cnt);
-       data[ei++] = FIELD_GET(MT_ETBF_RX_FB_NC, cnt);
-       data[ei++] = FIELD_GET(MT_ETBF_RX_FB_NR, cnt);
+       data[ei++] = mib->tx_bf_rx_fb_bw;
+       data[ei++] = mib->tx_bf_rx_fb_nc_cnt;
+       data[ei++] = mib->tx_bf_rx_fb_nr_cnt;
 
        /* Tx Beamformee Rx NDPA & Tx feedback report */
-       cnt = mt76_rr(dev, MT_ETBF_TX_NDP_BFRP(ext_phy));
-       data[ei++] = FIELD_GET(MT_ETBF_TX_FB_CPL, cnt);
-       data[ei++] = FIELD_GET(MT_ETBF_TX_FB_TRI, cnt);
+       data[ei++] = mib->tx_bf_fb_cpl_cnt;
+       data[ei++] = mib->tx_bf_fb_trig_cnt;
 
        /* Tx SU & MU counters */
-       cnt = mt76_rr(dev, MT_MIB_SDR34(ext_phy));
-       data[ei++] = FIELD_GET(MT_MIB_MU_BF_TX_CNT, cnt);
-
-       cnt = mt76_rr(dev, MT_MIB_DR8(ext_phy));
-       data[ei++] = cnt;
-
-       cnt = mt76_rr(dev, MT_MIB_DR9(ext_phy));
-       data[ei++] = cnt; /* MU MPDU SUccessful */
-
-       cnt = mt76_rr(dev, MT_MIB_DR11(ext_phy));
-       data[ei++] = cnt; /* SU MPDU successful */
+       data[ei++] = mib->tx_bf_cnt;
+       data[ei++] = mib->tx_mu_mpdu_cnt;
+       data[ei++] = mib->tx_mu_acked_mpdu_cnt;
+       data[ei++] = mib->tx_su_acked_mpdu_cnt;
 
        /* Tx amsdu info (pack-count histogram) */
        for (i = 0; i < 8; i++)
index 3c1ba6f4c6e6cc045eec6d5d728e15f5533b252a..f664f46ca26132c8993eb05f2084e26d94722b9c 100644 (file)
@@ -105,12 +105,31 @@ struct mt7915_vif {
        struct cfg80211_bitrate_mask bitrate_mask;
 };
 
+/* per-phy stats.  */
 struct mib_stats {
        u32 ack_fail_cnt;
        u32 fcs_err_cnt;
        u32 rts_cnt;
        u32 rts_retries_cnt;
        u32 ba_miss_cnt;
+       u32 tx_bf_cnt;
+       u32 tx_mu_mpdu_cnt;
+       u32 tx_mu_acked_mpdu_cnt;
+       u32 tx_su_acked_mpdu_cnt;
+       u32 tx_bf_ibf_ppdu_cnt;
+       u32 tx_bf_ebf_ppdu_cnt;
+
+       u32 tx_bf_rx_fb_all_cnt;
+       u32 tx_bf_rx_fb_he_cnt;
+       u32 tx_bf_rx_fb_vht_cnt;
+       u32 tx_bf_rx_fb_ht_cnt;
+
+       u32 tx_bf_rx_fb_bw; /* value of last sample, not cumulative */
+       u32 tx_bf_rx_fb_nc_cnt;
+       u32 tx_bf_rx_fb_nr_cnt;
+       u32 tx_bf_fb_cpl_cnt;
+       u32 tx_bf_fb_trig_cnt;
+
        /* Add more stats here, updated from mac_update_stats */
 };