wifi: mt76: mt7996: get tx_retries and tx_failed from txfree
authorYi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
Thu, 21 Sep 2023 21:04:00 +0000 (14:04 -0700)
committerFelix Fietkau <nbd@nbd.name>
Sat, 30 Sep 2023 18:17:18 +0000 (20:17 +0200)
Retrieve tx retries/failed counts from 'txfree done' events and report
them via mt7996_sta_statistics().

Signed-off-by: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
Signed-off-by: Money Wang <Money.Wang@mediatek.com>
Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Evelyn Tsai <evelyn.tsai@mediatek.com>
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h
drivers/net/wireless/mediatek/mt76/mt7996/mac.c
drivers/net/wireless/mediatek/mt76/mt7996/main.c

index 87bfa441a93743a99c1f7e72ae252cd9d42f60d3..b614b92ebaa4610ae42c95e2d34272fac2941921 100644 (file)
@@ -271,7 +271,7 @@ enum tx_mgnt_type {
 #define MT_TXFREE0_MSDU_CNT            GENMASK(25, 16)
 #define MT_TXFREE0_RX_BYTE             GENMASK(15, 0)
 
-#define MT_TXFREE1_VER                 GENMASK(18, 16)
+#define MT_TXFREE1_VER                 GENMASK(19, 16)
 
 #define MT_TXFREE_INFO_PAIR            BIT(31)
 #define MT_TXFREE_INFO_HEADER          BIT(30)
index c43839a2050880c35369b063d4dbd161b66b15a9..83e910eb755ca7558117f258757bfc76fb0eb7d5 100644 (file)
@@ -1070,6 +1070,7 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
        struct mt76_phy *phy3 = mdev->phys[MT_BAND2];
        struct mt76_txwi_cache *txwi;
        struct ieee80211_sta *sta = NULL;
+       struct mt76_wcid *wcid;
        LIST_HEAD(free_list);
        struct sk_buff *skb, *tmp;
        void *end = data + len;
@@ -1088,7 +1089,7 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
                mt76_queue_tx_cleanup(dev, phy3->q_tx[MT_TXQ_BE], false);
        }
 
-       if (WARN_ON_ONCE(le32_get_bits(tx_free[1], MT_TXFREE1_VER) < 4))
+       if (WARN_ON_ONCE(le32_get_bits(tx_free[1], MT_TXFREE1_VER) < 5))
                return;
 
        total = le32_get_bits(tx_free[0], MT_TXFREE0_MSDU_CNT);
@@ -1104,7 +1105,6 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
                info = le32_to_cpu(*cur_info);
                if (info & MT_TXFREE_INFO_PAIR) {
                        struct mt7996_sta *msta;
-                       struct mt76_wcid *wcid;
                        u16 idx;
 
                        idx = FIELD_GET(MT_TXFREE_INFO_WLAN_ID, info);
@@ -1120,10 +1120,21 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
                                              &mdev->sta_poll_list);
                        spin_unlock_bh(&mdev->sta_poll_lock);
                        continue;
-               }
+               } else if (info & MT_TXFREE_INFO_HEADER) {
+                       u32 tx_retries = 0, tx_failed = 0;
+
+                       if (!wcid)
+                               continue;
+
+                       tx_retries =
+                               FIELD_GET(MT_TXFREE_INFO_COUNT, info) - 1;
+                       tx_failed = tx_retries +
+                               !!FIELD_GET(MT_TXFREE_INFO_STAT, info);
 
-               if (info & MT_TXFREE_INFO_HEADER)
+                       wcid->stats.tx_retries += tx_retries;
+                       wcid->stats.tx_failed += tx_failed;
                        continue;
+               }
 
                for (i = 0; i < 2; i++) {
                        msdu = (info >> (15 * i)) & MT_TXFREE_INFO_MSDU_ID;
index a2ab668a3b0fba08e2e3afffa22f3352489a6480..0072809ae6172e68732542613f7800c4cca2ed7f 100644 (file)
@@ -989,6 +989,12 @@ static void mt7996_sta_statistics(struct ieee80211_hw *hw,
        sinfo->txrate.flags = txrate->flags;
        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
 
+       sinfo->tx_failed = msta->wcid.stats.tx_failed;
+       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
+
+       sinfo->tx_retries = msta->wcid.stats.tx_retries;
+       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
+
        sinfo->ack_signal = (s8)msta->ack_signal;
        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL);