mt76: mt7915: add tx mu/su counters to mib
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>
This commit is contained in:
parent
bc529ee3a7
commit
016f204059
@ -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");
|
||||
}
|
||||
|
@ -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++) {
|
||||
|
@ -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++)
|
||||
|
@ -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 */
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user