mt76: ethtool stats features and fixes
Subsystems (2)
Lorenzo Bianconi
maintainercover mt76: ethtool stats features and fixes
- mt7921: add ethtool support similar to mt7915 driver
- mt7915: some ethtool fixes
Lorenzo Bianconi (10):
mt76: move mt76_sta_stats in mt76.h
mt76: mt7921: add sta stats accounting in mt7921_mac_add_txs_skb
mt76: mt7921: add some more MIB counters
mt76: mt7921: introduce stats reporting through ethtool
mt76: mt7921: move tx amsdu stats in mib_stats
mt76: move mt76_ethtool_worker_info in mt76 module
mt76: mt7921: add per-vif counters in ethtool
mt76: mt7915: run mt7915_get_et_stats holding mt76 mutex
mt76: mt7915: do not overwrite all mib counters in mt7915_get_stats
mt76: mt7915: move tx amsdu stats in mib_stats
drivers/net/wireless/mediatek/mt76/mac80211.c | 28 +++ drivers/net/wireless/mediatek/mt76/mt76.h | 17 ++ .../wireless/mediatek/mt76/mt7915/debugfs.c | 24 +-- .../net/wireless/mediatek/mt76/mt7915/mac.c | 11 +- .../net/wireless/mediatek/mt76/mt7915/main.c | 59 ++---- .../wireless/mediatek/mt76/mt7915/mt7915.h | 13 +- .../wireless/mediatek/mt76/mt7921/debugfs.c | 27 ++- .../net/wireless/mediatek/mt76/mt7921/mac.c | 49 ++++- .../net/wireless/mediatek/mt76/mt7921/main.c | 169 +++++++++++++++++- .../wireless/mediatek/mt76/mt7921/mt7921.h | 22 +++ .../net/wireless/mediatek/mt76/mt7921/regs.h | 28 +++ 11 files changed, 363 insertions(+), 84 deletions(-)
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 1/10 mt76: move mt76_sta_stats in mt76.h
This is a preliminary patch to add ethtool stats to mt7921 driver.
--- drivers/net/wireless/mediatek/mt76/mt76.h | 7 +++++++ drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/main.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h | 9 +-------- 4 files changed, 10 insertions(+), 10 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +7 -0
@@ -773,6 +773,13 @@ enum mt76_phy_type { __MT_PHY_TYPE_HE_MAX, }; +struct mt76_sta_stats { +u64 tx_mode[__MT_PHY_TYPE_HE_MAX]; +u64 tx_bw[4 ];/* 20, 40, 80, 160 */ +u64 tx_nss[4 ];/* 1, 2, 3, 4 */ +u64 tx_mcs[16 ];/* mcs idx */ +}; +#define CCK_RATE (_idx, _rate) { \ .bitrate = _rate, \ .flags = IEEE80211_RATE_SHORT_PREAMBLE, \
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +1 -1
@@ -1347,7 +1347,7 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)static bool mt7915_mac_add_txs_skb (struct mt7915_dev *dev,struct mt76_wcid *wcid,int pid, -__le32 *txs_data,struct mt7915_sta_stats *stats) +__le32 *txs_data,struct mt76_sta_stats *stats) {struct ieee80211_supported_band *sband;struct mt76_dev *mdev = &dev->mt76;
drivers/net/wireless/mediatek/mt76/mt7915/main.c +1 -1
@@ -1199,10 +1199,10 @@ static void mt7915_ethtool_worker(void *wi_data, struct ieee80211_sta *sta) {struct mt7915_ethtool_worker_info *wi = wi_data;struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; +struct mt76_sta_stats *mstats = &msta->stats;int ei = wi->initial_stat_idx;int q;u64 *data = wi->data; -struct mt7915_sta_stats *mstats = &msta->stats;if (msta->vif != wi->mvif)return ;
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +1 -8
@@ -65,13 +65,6 @@ enum mt7915_rxq_id { MT7915_RXQ_MCU_WA_EXT, }; -struct mt7915_sta_stats { -unsigned long tx_mode[__MT_PHY_TYPE_HE_MAX];/* See mt76_phy_type */ -unsigned long tx_bw[4 ];/* 20, 40, 80, 160 */ -unsigned long tx_nss[4 ];/* 1, 2, 3, 4 */ -unsigned long tx_mcs[16 ];/* mcs idx */ -}; -struct mt7915_sta_key_conf {s8 keyidx;u8 key[16 ];
@@ -106,7 +99,7 @@ struct mt7915_sta {unsigned long jiffies;unsigned long ampdu_state; -struct mt7915_sta_stats stats; +struct mt76_sta_stats stats;struct mt7915_sta_key_conf bip;
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 2/10 mt76: mt7921: add sta stats accounting in mt7921_mac_add_txs_skb
In reply to Lorenzo BianconiThis is a preliminary patch to add ethtool stats to mt7921 driver.
--- drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 17 +++++++++++++++-- .../net/wireless/mediatek/mt76/mt7921/mt7921.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +15 -2
@@ -1165,14 +1165,16 @@ static bool mt7921_mac_add_txs_skb(struct mt7921_dev *dev, struct mt76_wcid *wcid, int pid, __le32 *txs_data) { + struct mt7921_sta *msta = container_of(wcid, struct mt7921_sta, wcid); +struct mt76_sta_stats *stats = &msta->stats;struct ieee80211_supported_band *sband;struct mt76_dev *mdev = &dev->mt76;struct ieee80211_tx_info *info;struct rate_info rate = {};struct sk_buff_head list; +u32 txrate, txs, mode;struct sk_buff *skb;bool cck = false; -u32 txrate, txs;mt76_tx_status_lock (mdev, &list); skb =mt76_tx_status_skb_get (mdev, wcid, pid, &list);
@@ -1198,7 +1200,13 @@ mt7921_mac_add_txs_skb(struct mt7921_dev *dev, struct mt76_wcid *wcid, int pid, rate.mcs =FIELD_GET (MT_TX_RATE_IDX , txrate); rate.nss =FIELD_GET (MT_TX_RATE_NSS , txrate) +1 ; -switch (FIELD_GET (MT_TX_RATE_MODE , txrate)) { +if (rate.nss -1 <ARRAY_SIZE (stats->tx_nss)) + stats->tx_nss[rate.nss -1 ]++; +if (rate.mcs <ARRAY_SIZE (stats->tx_mcs)) + stats->tx_mcs[rate.mcs]++; + + mode =FIELD_GET (MT_TX_RATE_MODE , txrate); +switch (mode) {case MT_PHY_TYPE_CCK : cck = true; fallthrough;
@@ -1241,19 +1249,24 @@ mt7921_mac_add_txs_skb(struct mt7921_dev *dev, struct mt76_wcid *wcid, int pid,default : goto out; } + stats->tx_mode[mode]++;switch (FIELD_GET (MT_TXS0_BW , txs)) {case IEEE80211_STA_RX_BW_160 : rate.bw =RATE_INFO_BW_160 ; + stats->tx_bw[3 ]++;break ;case IEEE80211_STA_RX_BW_80 : rate.bw =RATE_INFO_BW_80 ; + stats->tx_bw[2 ]++;break ;case IEEE80211_STA_RX_BW_40 : rate.bw =RATE_INFO_BW_40 ; + stats->tx_bw[1 ]++;break ;default : rate.bw =RATE_INFO_BW_20 ; + stats->tx_bw[0 ]++;break ; } wcid->rate = rate;
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +1 -0
@@ -81,6 +81,7 @@ struct mt7921_sta {unsigned long last_txs;unsigned long ampdu_state; +struct mt76_sta_stats stats;struct mt7921_sta_key_conf bip; };
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 3/10 mt76: mt7921: add some more MIB counters
In reply to Lorenzo BianconiThis is a preliminary patch to introduce ethtool stats support to mt7921 driver.
--- .../net/wireless/mediatek/mt76/mt7921/mac.c | 26 ++++++++++++++++- .../wireless/mediatek/mt76/mt7921/mt7921.h | 18 ++++++++++++ .../net/wireless/mediatek/mt76/mt7921/regs.h | 28 +++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +25 -1
@@ -1662,6 +1662,7 @@ void mt7921_mac_update_mib_stats(struct mt7921_phy *phy)struct mt7921_dev *dev = phy->dev;struct mib_stats *mib = &phy->mib;int i, aggr0 =0 , aggr1; +u32 val; mib->fcs_err_cnt +=mt76_get_field (dev,MT_MIB_SDR3 (0 ),MT_MIB_SDR3_FCS_ERR_MASK );
@@ -1674,8 +1675,31 @@ void mt7921_mac_update_mib_stats(struct mt7921_phy *phy) mib->rts_retries_cnt +=mt76_get_field (dev,MT_MIB_MB_BSDR1 (0 ),MT_MIB_RTS_FAIL_COUNT_MASK ); + mib->tx_ampdu_cnt +=mt76_rr (dev,MT_MIB_SDR12 (0 )); + mib->tx_mpdu_attempts_cnt +=mt76_rr (dev,MT_MIB_SDR14 (0 )); + mib->tx_mpdu_success_cnt +=mt76_rr (dev,MT_MIB_SDR15 (0 )); + + val =mt76_rr (dev,MT_MIB_SDR32 (0 )); + mib->tx_pkt_ebf_cnt +=FIELD_GET (MT_MIB_SDR9_EBF_CNT_MASK , val); + mib->tx_pkt_ibf_cnt +=FIELD_GET (MT_MIB_SDR9_IBF_CNT_MASK , val); + + val =mt76_rr (dev,MT_ETBF_TX_APP_CNT (0 )); + mib->tx_bf_ibf_ppdu_cnt +=FIELD_GET (MT_ETBF_TX_IBF_CNT , val); + mib->tx_bf_ebf_ppdu_cnt +=FIELD_GET (MT_ETBF_TX_EBF_CNT , val); + + val =mt76_rr (dev,MT_ETBF_RX_FB_CNT (0 )); + mib->tx_bf_rx_fb_all_cnt +=FIELD_GET (MT_ETBF_RX_FB_ALL , val); + mib->tx_bf_rx_fb_he_cnt +=FIELD_GET (MT_ETBF_RX_FB_HE , val); + mib->tx_bf_rx_fb_vht_cnt +=FIELD_GET (MT_ETBF_RX_FB_VHT , val); + mib->tx_bf_rx_fb_ht_cnt +=FIELD_GET (MT_ETBF_RX_FB_HT , val); + + mib->rx_mpdu_cnt +=mt76_rr (dev,MT_MIB_SDR5 (0 )); + mib->rx_ampdu_cnt +=mt76_rr (dev,MT_MIB_SDR22 (0 )); + mib->rx_ampdu_bytes_cnt +=mt76_rr (dev,MT_MIB_SDR23 (0 )); + mib->rx_ba_cnt +=mt76_rr (dev,MT_MIB_SDR31 (0 )); +for (i =0 , aggr1 = aggr0 +4 ; i <4 ; i++) { -u32 val, val2; +u32 val2; val =mt76_rr (dev,MT_TX_AGG_CNT (0 , i)); val2 =mt76_rr (dev,MT_TX_AGG_CNT2 (0 , i));
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +18 -0
@@ -107,6 +107,24 @@ struct mib_stats {u32 rts_cnt;u32 rts_retries_cnt;u32 ba_miss_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_ampdu_cnt; +u32 tx_mpdu_attempts_cnt; +u32 tx_mpdu_success_cnt; +u32 tx_pkt_ebf_cnt; +u32 tx_pkt_ibf_cnt; + +u32 rx_mpdu_cnt; +u32 rx_ampdu_cnt; +u32 rx_ampdu_bytes_cnt; +u32 rx_ba_cnt; };struct mt7921_phy {
drivers/net/wireless/mediatek/mt76/mt7921/regs.h +28 -0
@@ -92,6 +92,20 @@#define MT_LPON_TCR_SW_MODE GENMASK(1, 0)#define MT_LPON_TCR_SW_WRITE BIT(0) +/* ETBF: band 0(0x24000), band 1(0xa4000) */ +#define MT_WF_ETBF_BASE (_band) ((_band) ? 0xa4000 : 0x24000) +#define MT_WF_ETBF (_band, ofs) (MT_WF_ETBF_BASE(_band) + (ofs)) + +#define MT_ETBF_TX_APP_CNT (_band) MT_WF_ETBF(_band, 0x150) +#define MT_ETBF_TX_IBF_CNT GENMASK(31, 16) +#define MT_ETBF_TX_EBF_CNT GENMASK(15, 0) + +#define MT_ETBF_RX_FB_CNT (_band) MT_WF_ETBF(_band, 0x158) +#define MT_ETBF_RX_FB_ALL GENMASK(31, 24) +#define MT_ETBF_RX_FB_HE GENMASK(23, 16) +#define MT_ETBF_RX_FB_VHT GENMASK(15, 8) +#define MT_ETBF_RX_FB_HT GENMASK(7, 0) +/* MIB: band 0(0x24800), band 1(0xa4800) */ #define MT_WF_MIB_BASE (_band) ((_band) ? 0xa4800 : 0x24800)#define MT_WF_MIB (_band, ofs) (MT_WF_MIB_BASE(_band) + (ofs))
@@ -103,12 +117,26 @@#define MT_MIB_SDR3 (_band) MT_WF_MIB(_band, 0x698)#define MT_MIB_SDR3_FCS_ERR_MASK GENMASK(31, 16) +#define MT_MIB_SDR5 (_band) MT_WF_MIB(_band, 0x780) +#define MT_MIB_SDR9 (_band) MT_WF_MIB(_band, 0x02c)#define MT_MIB_SDR9_BUSY_MASK GENMASK(23, 0) +#define MT_MIB_SDR12 (_band) MT_WF_MIB(_band, 0x558) +#define MT_MIB_SDR14 (_band) MT_WF_MIB(_band, 0x564) +#define MT_MIB_SDR15 (_band) MT_WF_MIB(_band, 0x568) +#define MT_MIB_SDR16 (_band) MT_WF_MIB(_band, 0x048)#define MT_MIB_SDR16_BUSY_MASK GENMASK(23, 0) +#define MT_MIB_SDR22 (_band) MT_WF_MIB(_band, 0x770) +#define MT_MIB_SDR23 (_band) MT_WF_MIB(_band, 0x774) +#define MT_MIB_SDR31 (_band) MT_WF_MIB(_band, 0x55c) + +#define MT_MIB_SDR32 (_band) MT_WF_MIB(_band, 0x7a8) +#define MT_MIB_SDR9_IBF_CNT_MASK GENMASK(31, 16) +#define MT_MIB_SDR9_EBF_CNT_MASK GENMASK(15, 0) +#define MT_MIB_SDR34 (_band) MT_WF_MIB(_band, 0x090)#define MT_MIB_MU_BF_TX_CNT GENMASK(15, 0)
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 4/10 mt76: mt7921: introduce stats reporting through ethtool
In reply to Lorenzo BianconiSimilar to mt7915 driver, add tx/rx statistics reporting through ethtool.
--- .../net/wireless/mediatek/mt76/mt7921/main.c | 118 +++++++++++++++++- 1 file changed, 117 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7921/main.c +117 -1
@@ -852,13 +852,126 @@ mt7921_get_stats(struct ieee80211_hw *hw, stats->dot11FCSErrorCount = mib->fcs_err_cnt; stats->dot11ACKFailureCount = mib->ack_fail_cnt; -memset (mib,0 ,sizeof (*mib)); +memset (mib,0 , offsetof(struct mib_stats , ba_miss_cnt));mt7921_mutex_release (phy->dev);return 0 ; } +static const char mt7921_gstrings_stats[][ETH_GSTRING_LEN ] = { +/* tx counters */ +"tx_ampdu_cnt" , +"tx_mpdu_attempts" , +"tx_mpdu_success" , +"tx_pkt_ebf_cnt" , +"tx_pkt_ibf_cnt" , +"tx_ampdu_len:0-1" , +"tx_ampdu_len:2-10" , +"tx_ampdu_len:11-19" , +"tx_ampdu_len:20-28" , +"tx_ampdu_len:29-37" , +"tx_ampdu_len:38-46" , +"tx_ampdu_len:47-55" , +"tx_ampdu_len:56-79" , +"tx_ampdu_len:80-103" , +"tx_ampdu_len:104-127" , +"tx_ampdu_len:128-151" , +"tx_ampdu_len:152-175" , +"tx_ampdu_len:176-199" , +"tx_ampdu_len:200-223" , +"tx_ampdu_len:224-247" , +"ba_miss_count" , +"tx_beamformer_ppdu_iBF" , +"tx_beamformer_ppdu_eBF" , +"tx_beamformer_rx_feedback_all" , +"tx_beamformer_rx_feedback_he" , +"tx_beamformer_rx_feedback_vht" , +"tx_beamformer_rx_feedback_ht" , +"tx_msdu_pack_1" , +"tx_msdu_pack_2" , +"tx_msdu_pack_3" , +"tx_msdu_pack_4" , +"tx_msdu_pack_5" , +"tx_msdu_pack_6" , +"tx_msdu_pack_7" , +"tx_msdu_pack_8" , +/* rx counters */ +"rx_mpdu_cnt" , +"rx_ampdu_cnt" , +"rx_ampdu_bytes_cnt" , +"rx_ba_cnt" +}; + +static void +mt7921_get_et_strings (struct ieee80211_hw *hw,struct ieee80211_vif *vif, +u32 sset,u8 *data) +{ +if (sset !=ETH_SS_STATS ) +return ; + +memcpy (data, *mt7921_gstrings_stats,sizeof (mt7921_gstrings_stats)); +} + +static int +mt7921_get_et_sset_count (struct ieee80211_hw *hw,struct ieee80211_vif *vif, +int sset) +{ +return sset ==ETH_SS_STATS ?ARRAY_SIZE (mt7921_gstrings_stats) :0 ; +} + +static +void mt7921_get_et_stats (struct ieee80211_hw *hw,struct ieee80211_vif *vif, +struct ethtool_stats *stats,u64 *data) +{ +struct mt7921_phy *phy =mt7921_hw_phy (hw); +struct mt7921_dev *dev = phy->dev; +struct mib_stats *mib = &phy->mib; +int i, ei =0 ; + +mt7921_mutex_acquire (dev); + +mt7921_mac_update_mib_stats (phy); + + data[ei++] = mib->tx_ampdu_cnt; + data[ei++] = mib->tx_mpdu_attempts_cnt; + data[ei++] = mib->tx_mpdu_success_cnt; + data[ei++] = mib->tx_pkt_ebf_cnt; + data[ei++] = mib->tx_pkt_ibf_cnt; + +/* Tx ampdu stat */ +for (i =0 ; i <15 ; i++) + data[ei++] = dev->mt76.aggr_stats[i]; + + data[ei++] = phy->mib.ba_miss_cnt; + +/* Tx Beamformer monitor */ + data[ei++] = mib->tx_bf_ibf_ppdu_cnt; + data[ei++] = mib->tx_bf_ebf_ppdu_cnt; + +/* Tx Beamformer Rx feedback monitor */ + 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; + +/* Tx amsdu info (pack-count histogram) */ +for (i =0 ; i <8 ; i++) + data[ei++] =mt76_rr (dev,MT_PLE_AMSDU_PACK_MSDU_CNT (i)); + +/* rx counters */ + data[ei++] = mib->rx_mpdu_cnt; + data[ei++] = mib->rx_ampdu_cnt; + data[ei++] = mib->rx_ampdu_bytes_cnt; + data[ei++] = mib->rx_ba_cnt; + +mt7921_mutex_release (dev); + +if (ei !=ARRAY_SIZE (mt7921_gstrings_stats)) +dev_err (dev->mt76.dev,"ei: %d SSTATS_LEN: %lu" , + ei,ARRAY_SIZE (mt7921_gstrings_stats)); +} +static u64 mt7921_get_tsf (struct ieee80211_hw *hw,struct ieee80211_vif *vif) {
@@ -1228,6 +1341,9 @@ const struct ieee80211_ops mt7921_ops = { .release_buffered_frames = mt76_release_buffered_frames, .get_txpower = mt76_get_txpower, .get_stats = mt7921_get_stats, + .get_et_sset_count = mt7921_get_et_sset_count, + .get_et_strings = mt7921_get_et_strings, + .get_et_stats = mt7921_get_et_stats, .get_tsf = mt7921_get_tsf, .set_tsf = mt7921_set_tsf, .get_survey = mt76_get_survey,
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 5/10 mt76: mt7921: move tx amsdu stats in mib_stats
In reply to Lorenzo BianconiMove tx_amsdu histogram stats in mib_stats structure since registers are clear-on-read
--- .../wireless/mediatek/mt76/mt7921/debugfs.c | 27 +++++++++---------- .../net/wireless/mediatek/mt76/mt7921/mac.c | 6 +++++ .../net/wireless/mediatek/mt76/mt7921/main.c | 4 +-- .../wireless/mediatek/mt76/mt7921/mt7921.h | 3 +++ 4 files changed, 23 insertions(+), 17 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c +12 -15
@@ -95,30 +95,27 @@ static int mt7921_tx_stats_show(struct seq_file *file, void *data) { struct mt7921_dev *dev = file->private; -int stat[8 ], i, n; +struct mt7921_phy *phy = &dev->phy; +struct mib_stats *mib = &phy->mib; +int i;mt7921_mutex_acquire (dev); -mt7921_ampdu_stat_read_phy (&dev->phy, file); +mt7921_ampdu_stat_read_phy (phy, file); -/* Tx amsdu info */ seq_puts (file,"Tx MSDU stat:\n" ); -for (i =0 , n =0 ; i <ARRAY_SIZE (stat); i++) { - stat[i] =mt76_rr (dev,MT_PLE_AMSDU_PACK_MSDU_CNT (i)); - n += stat[i]; - } - -mt7921_mutex_release (dev); - -for (i =0 ; i <ARRAY_SIZE (stat); i++) { -seq_printf (file,"AMSDU pack count of %d MSDU in TXD: 0x%x " , - i +1 , stat[i]); -if (n !=0 ) -seq_printf (file,"(%d%%)\n" , stat[i] *100 / n); +for (i =0 ; i <ARRAY_SIZE (mib->tx_amsdu); i++) { +seq_printf (file,"AMSDU pack count of %d MSDU in TXD: %8d " , + i +1 , mib->tx_amsdu[i]); +if (mib->tx_amsdu_cnt) +seq_printf (file,"(%3d%%)\n" , + mib->tx_amsdu[i] *100 / mib->tx_amsdu_cnt);else seq_puts (file,"\n" ); } +mt7921_mutex_release (dev); +return 0 ; }
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +6 -0
@@ -1698,6 +1698,12 @@ void mt7921_mac_update_mib_stats(struct mt7921_phy *phy) mib->rx_ampdu_bytes_cnt +=mt76_rr (dev,MT_MIB_SDR23 (0 )); mib->rx_ba_cnt +=mt76_rr (dev,MT_MIB_SDR31 (0 )); +for (i =0 ; i <ARRAY_SIZE (mib->tx_amsdu); i++) { + val =mt76_rr (dev,MT_PLE_AMSDU_PACK_MSDU_CNT (i)); + mib->tx_amsdu[i] += val; + mib->tx_amsdu_cnt += val; + } +for (i =0 , aggr1 = aggr0 +4 ; i <4 ; i++) {u32 val2;
drivers/net/wireless/mediatek/mt76/mt7921/main.c +2 -2
@@ -956,8 +956,8 @@ void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif, data[ei++] = mib->tx_bf_rx_fb_ht_cnt;/* Tx amsdu info (pack-count histogram) */ -for (i =0 ; i <8 ; i++) - data[ei++] =mt76_rr (dev,MT_PLE_AMSDU_PACK_MSDU_CNT (i)); +for (i =0 ; i <ARRAY_SIZE (mib->tx_amsdu); i++) + data[ei++] = mib->tx_amsdu[i];/* rx counters */ data[ei++] = mib->rx_mpdu_cnt;
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +3 -0
@@ -125,6 +125,9 @@ struct mib_stats {u32 rx_ampdu_cnt;u32 rx_ampdu_bytes_cnt;u32 rx_ba_cnt; + +u32 tx_amsdu[8 ]; +u32 tx_amsdu_cnt; };struct mt7921_phy {
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 6/10 mt76: move mt76_ethtool_worker_info in mt76 module
In reply to Lorenzo BianconiMove mt76_ethtool_worker_info in common code in order to be reused in mt7921 driver.
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 28 +++++++++++ drivers/net/wireless/mediatek/mt76/mt76.h | 10 ++++ .../net/wireless/mediatek/mt76/mt7915/main.c | 47 +++---------------- 3 files changed, 45 insertions(+), 40 deletions(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +28 -0
@@ -1508,3 +1508,31 @@ u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx)return rate->hw_value; }EXPORT_SYMBOL_GPL (mt76_calculate_default_rate); + +void mt76_ethtool_worker (struct mt76_ethtool_worker_info *wi, +struct mt76_sta_stats *stats) +{ +int i, ei = wi->initial_stat_idx; +u64 *data = wi->data; + + wi->sta_count++; + + data[ei++] += stats->tx_mode[MT_PHY_TYPE_CCK ]; + data[ei++] += stats->tx_mode[MT_PHY_TYPE_OFDM ]; + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HT ]; + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HT_GF ]; + data[ei++] += stats->tx_mode[MT_PHY_TYPE_VHT ]; + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_SU ]; + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_EXT_SU ]; + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_TB ]; + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_MU ]; + +for (i =0 ; i <ARRAY_SIZE (stats->tx_bw); i++) + data[ei++] += stats->tx_bw[i]; + +for (i =0 ; i <12 ; i++) + data[ei++] += stats->tx_mcs[i]; + + wi->worker_stat_count = ei - wi->initial_stat_idx; +} +EXPORT_SYMBOL_GPL (mt76_ethtool_worker);
drivers/net/wireless/mediatek/mt76/mt76.h +10 -0
@@ -780,6 +780,14 @@ struct mt76_sta_stats {u64 tx_mcs[16 ];/* mcs idx */ }; +struct mt76_ethtool_worker_info { +u64 *data; +int idx; +int initial_stat_idx; +int worker_stat_count; +int sta_count; +}; +#define CCK_RATE (_idx, _rate) { \ .bitrate = _rate, \ .flags = IEEE80211_RATE_SHORT_PREAMBLE, \
@@ -1235,6 +1243,8 @@ mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len,return usb_bulk_msg (udev, pipe, data, len, actual_len, timeout); } +void mt76_ethtool_worker (struct mt76_ethtool_worker_info *wi, +struct mt76_sta_stats *stats);int mt76_skb_adjust_pad (struct sk_buff *skb,int pad); int mt76u_vendor_request(struct mt76_dev *dev, u8 req, u8 req_type, u16 val, u16 offset,
drivers/net/wireless/mediatek/mt76/mt7915/main.c +7 -40
73 lines not on this page · raw message
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 7/10 mt76: mt7921: add per-vif counters in ethtool
In reply to Lorenzo BianconiSimilar to mt7915 driver, add per-vif tx counters in ethtool.
--- .../net/wireless/mediatek/mt76/mt7921/main.c | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7921/main.c +52 -1
@@ -900,7 +900,33 @@ static const char mt7921_gstrings_stats[][ETH_GSTRING_LEN] = {"rx_mpdu_cnt" ,"rx_ampdu_cnt" ,"rx_ampdu_bytes_cnt" , -"rx_ba_cnt" +"rx_ba_cnt" , +/* per vif counters */ +"v_tx_mode_cck" , +"v_tx_mode_ofdm" , +"v_tx_mode_ht" , +"v_tx_mode_ht_gf" , +"v_tx_mode_vht" , +"v_tx_mode_he_su" , +"v_tx_mode_he_ext_su" , +"v_tx_mode_he_tb" , +"v_tx_mode_he_mu" , +"v_tx_bw_20" , +"v_tx_bw_40" , +"v_tx_bw_80" , +"v_tx_bw_160" , +"v_tx_mcs_0" , +"v_tx_mcs_1" , +"v_tx_mcs_2" , +"v_tx_mcs_3" , +"v_tx_mcs_4" , +"v_tx_mcs_5" , +"v_tx_mcs_6" , +"v_tx_mcs_7" , +"v_tx_mcs_8" , +"v_tx_mcs_9" , +"v_tx_mcs_10" , + "v_tx_mcs_11", }; static void
@@ -920,13 +946,30 @@ mt7921_get_et_sset_count(struct ieee80211_hw *hw, struct ieee80211_vif *vif,return sset ==ETH_SS_STATS ?ARRAY_SIZE (mt7921_gstrings_stats) :0 ; } +static void +mt7921_ethtool_worker (void *wi_data,struct ieee80211_sta *sta) +{ +struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; +struct mt76_ethtool_worker_info *wi = wi_data; + +if (msta->vif->mt76.idx != wi->idx) +return ; + +mt76_ethtool_worker (wi, &msta->stats); +} +static void mt7921_get_et_stats (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ethtool_stats *stats,u64 *data) { +struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;struct mt7921_phy *phy =mt7921_hw_phy (hw);struct mt7921_dev *dev = phy->dev;struct mib_stats *mib = &phy->mib; +struct mt76_ethtool_worker_info wi = { + .data = data, + .idx = mvif->mt76.idx, + };int i, ei =0 ;mt7921_mutex_acquire (dev);
@@ -965,8 +1008,16 @@ void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif, data[ei++] = mib->rx_ampdu_bytes_cnt; data[ei++] = mib->rx_ba_cnt; +/* Add values for all stations owned by this vif */ + wi.initial_stat_idx = ei; +ieee80211_iterate_stations_atomic (hw, mt7921_ethtool_worker, &wi); +mt7921_mutex_release (dev); +if (!wi.sta_count) +return ; + + ei += wi.worker_stat_count;if (ei !=ARRAY_SIZE (mt7921_gstrings_stats))dev_err (dev->mt76.dev,"ei: %d SSTATS_LEN: %lu" , ei,ARRAY_SIZE (mt7921_gstrings_stats));
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 8/10 mt76: mt7915: run mt7915_get_et_stats holding mt76 mutex
In reply to Lorenzo BianconiSince it can run in parallel with mac_work, hold mutex lock in mt7915_get_et_stats. Moreover update mib counters running mt7915_get_et_stats.
--- drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c | 5 +++++ drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 3 +-- drivers/net/wireless/mediatek/mt76/mt7915/main.c | 6 ++++++ drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h | 1 + 4 files changed, 13 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +5 -0
@@ -209,7 +209,10 @@ mt7915_tx_stats_show(struct seq_file *file, void *data)struct mt7915_dev *dev = phy->dev;int stat[8 ], i, n; +mutex_lock (&dev->mt76.mutex); +mt7915_ampdu_stat_read_phy (phy, file); +mt7915_mac_update_stats (phy);mt7915_txbf_stat_read_phy (phy, file);/* Tx amsdu info */
@@ -228,6 +231,8 @@ mt7915_tx_stats_show(struct seq_file *file, void *data)seq_puts (file,"\n" ); } +mutex_unlock (&dev->mt76.mutex); +return 0 ; }
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +1 -2
@@ -1918,8 +1918,7 @@ void mt7915_mac_reset_work(struct work_struct *work) MT7915_WATCHDOG_TIME); } -static void -mt7915_mac_update_stats (struct mt7915_phy *phy) +void mt7915_mac_update_stats (struct mt7915_phy *phy) {struct mt7915_dev *dev = phy->dev;struct mib_stats *mib = &phy->mib;
drivers/net/wireless/mediatek/mt76/mt7915/main.c +6 -0
@@ -1219,6 +1219,10 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,if (!phy)return ; +mutex_lock (&dev->mt76.mutex); + +mt7915_mac_update_stats (phy); + data[ei++] = mib->tx_ampdu_cnt; data[ei++] = mib->tx_stop_q_empty_cnt; data[ei++] = mib->tx_mpdu_attempts_cnt;
@@ -1282,6 +1286,8 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw, wi.initial_stat_idx = ei;ieee80211_iterate_stations_atomic (hw, mt7915_ethtool_worker, &wi); +mutex_unlock (&dev->mt76.mutex); +if (wi.sta_count ==0 )return ;
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +1 -0
@@ -481,6 +481,7 @@ void mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,void mt7915_mac_work (struct work_struct *work);void mt7915_mac_reset_work (struct work_struct *work);void mt7915_mac_sta_rc_work (struct work_struct *work); +void mt7915_mac_update_stats (struct mt7915_phy *phy);int mt7915_mmio_init (struct mt76_dev *mdev,void __iomem *mem_base,int irq); void mt7915_mac_twt_teardown_flow(struct mt7915_dev *dev, struct mt7915_sta *msta,
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 9/10 mt76: mt7915: do not overwrite all mib counters in mt7915_get_stats
In reply to Lorenzo BianconiDo not overwrite all mib counters in mt7915_get_stats since they are used for ethtool stats.
--- drivers/net/wireless/mediatek/mt76/mt7915/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7915/main.c +1 -1
@@ -816,7 +816,7 @@ mt7915_get_stats(struct ieee80211_hw *hw, stats->dot11FCSErrorCount = mib->fcs_err_cnt; stats->dot11ACKFailureCount = mib->ack_fail_cnt; -memset (mib,0 ,sizeof (*mib)); +memset (mib,0 , offsetof(struct mib_stats , ba_miss_cnt));mutex_unlock (&dev->mt76.mutex);
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 10/10 mt76: mt7915: move tx amsdu stats in mib_stats
In reply to Lorenzo BianconiMove tx_amsdu histogram stats in mib_stats structure since registers are clear-on-read
--- .../wireless/mediatek/mt76/mt7915/debugfs.c | 19 ++++++++----------- .../net/wireless/mediatek/mt76/mt7915/mac.c | 6 ++++++ .../net/wireless/mediatek/mt76/mt7915/main.c | 4 ++-- .../wireless/mediatek/mt76/mt7915/mt7915.h | 3 +++ 4 files changed, 19 insertions(+), 13 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +8 -11
@@ -207,7 +207,8 @@ mt7915_tx_stats_show(struct seq_file *file, void *data) {struct mt7915_phy *phy = file->private;struct mt7915_dev *dev = phy->dev; -int stat[8 ], i, n; +struct mib_stats *mib = &phy->mib; +int i;mutex_lock (&dev->mt76.mutex);
@@ -217,16 +218,12 @@ mt7915_tx_stats_show(struct seq_file *file, void *data)/* Tx amsdu info */ seq_puts (file,"Tx MSDU statistics:\n" ); -for (i =0 , n =0 ; i <ARRAY_SIZE (stat); i++) { - stat[i] =mt76_rr (dev,MT_PLE_AMSDU_PACK_MSDU_CNT (i)); - n += stat[i]; - } - -for (i =0 ; i <ARRAY_SIZE (stat); i++) { -seq_printf (file,"AMSDU pack count of %d MSDU in TXD: 0x%x " , - i +1 , stat[i]); -if (n !=0 ) -seq_printf (file,"(%d%%)\n" , stat[i] *100 / n); +for (i =0 ; i <ARRAY_SIZE (mib->tx_amsdu); i++) { +seq_printf (file,"AMSDU pack count of %d MSDU in TXD: %8d " , + i +1 , mib->tx_amsdu[i]); +if (mib->tx_amsdu_cnt) +seq_printf (file,"(%3d%%)\n" , + mib->tx_amsdu[i] *100 / mib->tx_amsdu_cnt);else seq_puts (file,"\n" ); }
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +6 -0
@@ -2023,6 +2023,12 @@ void mt7915_mac_update_stats(struct mt7915_phy *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); +for (i =0 ; i <ARRAY_SIZE (mib->tx_amsdu); i++) { + cnt =mt76_rr (dev,MT_PLE_AMSDU_PACK_MSDU_CNT (i)); + mib->tx_amsdu[i] += cnt; + mib->tx_amsdu_cnt += cnt; + } + aggr0 = ext_phy ?ARRAY_SIZE (dev->mt76.aggr_stats) /2 :0 ;for (i =0 , aggr1 = aggr0 +4 ; i <4 ; i++) {u32 val;
drivers/net/wireless/mediatek/mt76/mt7915/main.c +2 -2
@@ -1264,8 +1264,8 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw, data[ei++] = mib->tx_su_acked_mpdu_cnt;/* Tx amsdu info (pack-count histogram) */ -for (i =0 ; i <8 ; i++) - data[ei++] =mt76_rr (dev,MT_PLE_AMSDU_PACK_MSDU_CNT (i)); +for (i =0 ; i <ARRAY_SIZE (mib->tx_amsdu); i++) + data[ei++] = mib->tx_amsdu[i];/* rx counters */ data[ei++] = mib->rx_fifo_full_cnt;
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +3 -0
@@ -171,6 +171,9 @@ struct mib_stats {u32 rx_pfdrop_cnt;u32 rx_vec_queue_overflow_drop_cnt;u32 rx_ba_cnt; + +u32 tx_amsdu[8 ]; +u32 tx_amsdu_cnt; };struct mt7915_hif {
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerQuoted 2 lines
- mt7921: add ethtool support similar to mt7915 driver
- mt7915: some ethtool fixes
Hi Felix,
please drop this series, I will post v2 addressing some bits.
Regards,
Lorenzo
Quoted 29 lines
Lorenzo Bianconi (10):
mt76: movemt76_sta_statsinmt76.h
mt76: mt7921: add sta stats accounting inmt7921_mac_add_txs_skb
mt76: mt7921: add some more MIB counters
mt76: mt7921: introduce stats reporting through ethtool
mt76: mt7921: move tx amsdu stats inmib_stats
mt76: movemt76_ethtool_worker_infoin mt76 module
mt76: mt7921: add per-vif counters in ethtool
mt76: mt7915: runmt7915_get_et_statsholding mt76 mutex
mt76: mt7915: do not overwrite all mib counters inmt7915_get_stats
mt76: mt7915: move tx amsdu stats inmib_statsdrivers/net/wireless/mediatek/mt76/mac80211.c | 28 +++ drivers/net/wireless/mediatek/mt76/mt76.h | 17 ++ .../wireless/mediatek/mt76/mt7915/debugfs.c | 24 +-- .../net/wireless/mediatek/mt76/mt7915/mac.c | 11 +- .../net/wireless/mediatek/mt76/mt7915/main.c | 59 ++---- .../wireless/mediatek/mt76/mt7915/mt7915.h | 13 +- .../wireless/mediatek/mt76/mt7921/debugfs.c | 27 ++- .../net/wireless/mediatek/mt76/mt7921/mac.c | 49 ++++- .../net/wireless/mediatek/mt76/mt7921/main.c | 169 +++++++++++++++++- .../wireless/mediatek/mt76/mt7921/mt7921.h | 22 +++ .../net/wireless/mediatek/mt76/mt7921/regs.h | 28 +++ 11 files changed, 363 insertions(+), 84 deletions(-)Signature · 1 line
2.31.1