blob: e4e034393904fc98236ec68f39da9ebe948c2f83 [file] [log] [blame]
From 7fad725b238b5b94403b9c4457aa0c3c0acdd576 Mon Sep 17 00:00:00 2001
From: Peter Chiu <chui-hao.chiu@mediatek.com>
Date: Tue, 17 Jan 2023 21:15:00 +0800
Subject: [PATCH 3009/3012] wifi: mt76: mt7915: get tx retries from tx free
done event for sw path
---
mt76_connac2_mac.h | 2 ++
mt7915/mac.c | 14 +++++++++++---
mt7915/mac.h | 3 ++-
mt7915/main.c | 6 +++---
4 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/mt76_connac2_mac.h b/mt76_connac2_mac.h
index e7a4019..e6170ea 100644
--- a/mt76_connac2_mac.h
+++ b/mt76_connac2_mac.h
@@ -38,6 +38,8 @@ enum {
/* 0: success, others: dropped */
#define MT_TX_FREE_STATUS GENMASK(14, 13)
#define MT_TX_FREE_MSDU_ID GENMASK(30, 16)
+#define MT_TX_FREE_TX_COUNT GENMASK(12, 0)
+#define MT_TX_FREE_TX_COUNT_V3 GENMASK(27, 24)
#define MT_TX_FREE_PAIR BIT(31)
/* will support this field in further revision */
#define MT_TX_FREE_RATE GENMASK(13, 0)
diff --git a/mt7915/mac.c b/mt7915/mac.c
index 26b5e15..0994ce1 100644
--- a/mt7915/mac.c
+++ b/mt7915/mac.c
@@ -981,6 +981,7 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
struct mt76_dev *mdev = &dev->mt76;
struct mt76_txwi_cache *txwi;
struct ieee80211_sta *sta = NULL;
+ struct mt76_wcid *wcid = NULL;
LIST_HEAD(free_list);
void *end = data + len;
bool v3, wake = false;
@@ -995,7 +996,7 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
v3 = (FIELD_GET(MT_TX_FREE_VER, txd) == 0x4);
for (cur_info = tx_info; count < total; cur_info++) {
- u32 msdu, info;
+ u32 msdu, info, retries = 0;
u8 i;
if (WARN_ON_ONCE((void *)cur_info >= end))
@@ -1008,7 +1009,6 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
info = le32_to_cpu(*cur_info);
if (info & MT_TX_FREE_PAIR) {
struct mt7915_sta *msta;
- struct mt76_wcid *wcid = NULL;
struct mt7915_phy *phy;
u16 idx;
@@ -1033,7 +1033,15 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
continue;
}
- if (v3 && (info & MT_TX_FREE_MPDU_HEADER))
+ if (v3 && (info & MT_TX_FREE_MPDU_HEADER_V3))
+ retries = u32_get_bits(info, MT_TX_FREE_TX_COUNT_V3) - 1;
+ else if (!v3 && (info & MT_TX_FREE_MPDU_HEADER))
+ retries = u32_get_bits(info, MT_TX_FREE_TX_COUNT) - 1;
+
+ if (!mtk_wed_device_active(&mdev->mmio.wed) && wcid)
+ wcid->stats.tx_retries += retries;
+
+ if (v3 && (info & MT_TX_FREE_MPDU_HEADER_V3))
continue;
for (i = 0; i < 1 + v3; i++) {
diff --git a/mt7915/mac.h b/mt7915/mac.h
index ce94f87..859298d 100644
--- a/mt7915/mac.h
+++ b/mt7915/mac.h
@@ -9,7 +9,8 @@
#define MT_TX_FREE_VER GENMASK(18, 16)
#define MT_TX_FREE_MSDU_CNT_V0 GENMASK(6, 0)
/* 0: success, others: dropped */
-#define MT_TX_FREE_MPDU_HEADER BIT(30)
+#define MT_TX_FREE_MPDU_HEADER BIT(15)
+#define MT_TX_FREE_MPDU_HEADER_V3 BIT(30)
#define MT_TX_FREE_MSDU_ID_V3 GENMASK(14, 0)
#define MT_TXS5_F0_FINAL_MPDU BIT(31)
diff --git a/mt7915/main.c b/mt7915/main.c
index c377ef2..f836aa8 100644
--- a/mt7915/main.c
+++ b/mt7915/main.c
@@ -1116,9 +1116,6 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,
sinfo->tx_bytes = msta->wcid.stats.tx_bytes;
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64);
- sinfo->tx_retries = msta->wcid.stats.tx_retries;
- sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
-
if (mtk_wed_get_rx_capa(&phy->dev->mt76.mmio.wed)) {
sinfo->rx_bytes = msta->wcid.stats.rx_bytes;
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64);
@@ -1128,6 +1125,9 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,
}
}
+ sinfo->tx_retries = msta->wcid.stats.tx_retries;
+ sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
+
if (!mt7915_mcu_get_tx_stat_wa(phy->dev, msta->wcid.idx)) {
sinfo->tx_packets = msta->wcid.stats.tx_packets;
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
--
2.18.0