2023-05-09 03:36:54

by Ryder Lee

[permalink] [raw]
Subject: [PATCH v5] wifi: mt76: mt7915: report tx retries/failed counts for non-WED path

Get missing tx retries/failed counts from txfree done events and report
them via mt7915_sta_statistics().

Co-developed-by: Peter Chiu <[email protected]>
Signed-off-by: Peter Chiu <[email protected]>
Signed-off-by: Ryder Lee <[email protected]>
---
v5 - fix noacked
v4 - switch from Tx latency report to enable Tx count in txfree path for non-v3 format
v3 - add a missing check for mt7921
v2 - add a missing check for non-v3 format
---
.../wireless/mediatek/mt76/mt76_connac_mac.c | 7 ++++--
.../net/wireless/mediatek/mt76/mt7915/init.c | 2 ++
.../net/wireless/mediatek/mt76/mt7915/mac.c | 22 +++++++++++++++++--
.../net/wireless/mediatek/mt76/mt7915/mac.h | 7 +++++-
.../net/wireless/mediatek/mt76/mt7915/main.c | 12 +++++-----
.../net/wireless/mediatek/mt76/mt7915/regs.h | 3 +++
6 files changed, 42 insertions(+), 11 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
index ee0fbfcd07d6..6b515f330976 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
@@ -728,16 +728,19 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid,
skb = mt76_tx_status_skb_get(dev, wcid, pid, &list);
if (skb) {
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
- bool noacked = !(info->flags & IEEE80211_TX_STAT_ACK);
+ bool noacked;

if (!(le32_to_cpu(txs_data[0]) & MT_TXS0_ACK_ERROR_MASK))
info->flags |= IEEE80211_TX_STAT_ACK;

+ noacked = !(info->flags & IEEE80211_TX_STAT_ACK);
info->status.ampdu_len = 1;
info->status.ampdu_ack_len = !noacked;
info->status.rates[0].idx = -1;

- wcid->stats.tx_failed += noacked;
+ /* avoid double counting if dev supports txfree event */
+ if (is_mt7921(dev))
+ wcid->stats.tx_failed += noacked;

mt76_connac2_mac_fill_txs(dev, wcid, txs_data);
mt76_tx_status_skb_done(dev, skb, &list);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
index ac2049f49bb3..8d6e09605dc4 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
@@ -581,6 +581,8 @@ void mt7915_mac_init(struct mt7915_dev *dev)

if (!is_mt7915(&dev->mt76))
mt76_clear(dev, MT_MDP_DCR2, MT_MDP_DCR2_RX_TRANS_SHORT);
+ else
+ mt76_clear(dev, MT_PLE_HOST_RPT0, MT_PLE_HOST_RPT0_TX_LATENCY);

/* enable hardware de-agg */
mt76_set(dev, MT_MDP_DCR0, MT_MDP_DCR0_DAMSDU_EN);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 7df8d95fc3fb..9b2ccd99854e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -951,6 +951,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;
@@ -977,7 +978,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;
u16 idx;

idx = FIELD_GET(MT_TX_FREE_WLAN_ID, info);
@@ -994,7 +994,25 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
continue;
}

- if (v3 && (info & MT_TX_FREE_MPDU_HEADER))
+ if (!mtk_wed_device_active(&mdev->mmio.wed) && wcid) {
+ u32 tx_retries = 0, tx_failed = 0;
+
+ if (v3 && (info & MT_TX_FREE_MPDU_HEADER_V3)) {
+ tx_retries =
+ FIELD_GET(MT_TX_FREE_COUNT_V3, info) - 1;
+ tx_failed = tx_retries +
+ !!FIELD_GET(MT_TX_FREE_STAT_V3, info);
+ } else if (!v3 && (info & MT_TX_FREE_MPDU_HEADER)) {
+ tx_retries =
+ FIELD_GET(MT_TX_FREE_COUNT, info) - 1;
+ tx_failed = tx_retries +
+ !!FIELD_GET(MT_TX_FREE_STAT, info);
+ }
+ wcid->stats.tx_retries += tx_retries;
+ wcid->stats.tx_failed += tx_failed;
+ }
+
+ if (v3 && (info & MT_TX_FREE_MPDU_HEADER_V3))
continue;

for (i = 0; i < 1 + v3; i++) {
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.h b/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
index ce94f87e2042..448b1b380190 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
@@ -9,7 +9,12 @@
#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_COUNT GENMASK(12, 0)
+#define MT_TX_FREE_COUNT_V3 GENMASK(27, 24)
+#define MT_TX_FREE_STAT GENMASK(14, 13)
+#define MT_TX_FREE_STAT_V3 GENMASK(29, 28)
+#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/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index 2ada2806de66..61157248d742 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -1046,12 +1046,6 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,
sinfo->tx_packets = msta->wcid.stats.tx_packets;
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);

- 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);
-
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);
@@ -1061,6 +1055,12 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,
}
}

+ 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);

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
index c8e478a55081..71fa9576ad0e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
@@ -145,6 +145,9 @@ enum offs_rev {
#define MT_PLE_BASE 0x820c0000
#define MT_PLE(ofs) (MT_PLE_BASE + (ofs))

+#define MT_PLE_HOST_RPT0 MT_PLE(0x030)
+#define MT_PLE_HOST_RPT0_TX_LATENCY BIT(3)
+
#define MT_FL_Q_EMPTY MT_PLE(__OFFS(PLE_FL_Q_EMPTY))
#define MT_FL_Q0_CTRL MT_PLE(__OFFS(PLE_FL_Q_CTRL))
#define MT_FL_Q2_CTRL MT_PLE(__OFFS(PLE_FL_Q_CTRL) + 0x8)
--
2.18.0


2023-05-09 18:35:55

by Ryder Lee

[permalink] [raw]
Subject: Re: [PATCH v5] wifi: mt76: mt7915: report tx retries/failed counts for non-WED path

On Tue, 2023-05-09 at 11:26 +0800, Ryder Lee wrote:
> Get missing tx retries/failed counts from txfree done events and
> report
> them via mt7915_sta_statistics().
>
> Co-developed-by: Peter Chiu <[email protected]>
> Signed-off-by: Peter Chiu <[email protected]>
> Signed-off-by: Ryder Lee <[email protected]>
> ---
> v5 - fix noacked
> v4 - switch from Tx latency report to enable Tx count in txfree path
> for non-v3 format
> v3 - add a missing check for mt7921
> v2 - add a missing check for non-v3 format
> ---
> .../wireless/mediatek/mt76/mt76_connac_mac.c | 7 ++++--
> .../net/wireless/mediatek/mt76/mt7915/init.c | 2 ++
> .../net/wireless/mediatek/mt76/mt7915/mac.c | 22
> +++++++++++++++++--
> .../net/wireless/mediatek/mt76/mt7915/mac.h | 7 +++++-
> .../net/wireless/mediatek/mt76/mt7915/main.c | 12 +++++-----
> .../net/wireless/mediatek/mt76/mt7915/regs.h | 3 +++
> 6 files changed, 42 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> index ee0fbfcd07d6..6b515f330976 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> @@ -728,16 +728,19 @@ bool mt76_connac2_mac_add_txs_skb(struct
> mt76_dev *dev, struct mt76_wcid *wcid,
> skb = mt76_tx_status_skb_get(dev, wcid, pid, &list);
> if (skb) {
> struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
> - bool noacked = !(info->flags & IEEE80211_TX_STAT_ACK);
> + bool noacked;
>
> if (!(le32_to_cpu(txs_data[0]) &
> MT_TXS0_ACK_ERROR_MASK))
> info->flags |= IEEE80211_TX_STAT_ACK;
>
> + noacked = !(info->flags & IEEE80211_TX_STAT_ACK);
> info->status.ampdu_len = 1;
> info->status.ampdu_ack_len = !noacked;
> info->status.rates[0].idx = -1;
>
> - wcid->stats.tx_failed += noacked;
> + /* avoid double counting if dev supports txfree event
> */
> + if (is_mt7921(dev))
> + wcid->stats.tx_failed += noacked;
@Deren, can you help to check if mt7921 can drop this and calculate
tx_failed from txfree directly?

Ryder

2023-05-10 03:20:40

by Deren Wu

[permalink] [raw]
Subject: Re: [PATCH v5] wifi: mt76: mt7915: report tx retries/failed counts for non-WED path

On Tue, 2023-05-09 at 18:10 +0000, Ryder Lee wrote:
> On Tue, 2023-05-09 at 11:26 +0800, Ryder Lee wrote:
> > Get missing tx retries/failed counts from txfree done events and
> > report
> > them via mt7915_sta_statistics().
> >
> > Co-developed-by: Peter Chiu <[email protected]>
> > Signed-off-by: Peter Chiu <[email protected]>
> > Signed-off-by: Ryder Lee <[email protected]>
> > ---
> > v5 - fix noacked
> > v4 - switch from Tx latency report to enable Tx count in txfree
> > path
> > for non-v3 format
> > v3 - add a missing check for mt7921
> > v2 - add a missing check for non-v3 format
> > ---
> > .../wireless/mediatek/mt76/mt76_connac_mac.c | 7 ++++--
> > .../net/wireless/mediatek/mt76/mt7915/init.c | 2 ++
> > .../net/wireless/mediatek/mt76/mt7915/mac.c | 22
> > +++++++++++++++++--
> > .../net/wireless/mediatek/mt76/mt7915/mac.h | 7 +++++-
> > .../net/wireless/mediatek/mt76/mt7915/main.c | 12 +++++-----
> > .../net/wireless/mediatek/mt76/mt7915/regs.h | 3 +++
> > 6 files changed, 42 insertions(+), 11 deletions(-)
> >
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> > b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> > index ee0fbfcd07d6..6b515f330976 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> > @@ -728,16 +728,19 @@ bool mt76_connac2_mac_add_txs_skb(struct
> > mt76_dev *dev, struct mt76_wcid *wcid,
> > skb = mt76_tx_status_skb_get(dev, wcid, pid, &list);
> > if (skb) {
> > struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
> > - bool noacked = !(info->flags & IEEE80211_TX_STAT_ACK);
> > + bool noacked;
> >
> > if (!(le32_to_cpu(txs_data[0]) &
> > MT_TXS0_ACK_ERROR_MASK))
> > info->flags |= IEEE80211_TX_STAT_ACK;
> >
> > + noacked = !(info->flags & IEEE80211_TX_STAT_ACK);
> > info->status.ampdu_len = 1;
> > info->status.ampdu_ack_len = !noacked;
> > info->status.rates[0].idx = -1;
> >
> > - wcid->stats.tx_failed += noacked;
> > + /* avoid double counting if dev supports txfree event
> > */
> > + if (is_mt7921(dev))
> > + wcid->stats.tx_failed += noacked;
>
> @Deren, can you help to check if mt7921 can drop this and calculate
> tx_failed from txfree directly?
>
> Ryder

Hi Ryder,

mt7921 should follow txfree event as well. Please drop it in this patch
and I will post an new patch for mt7921 version.

Thanks,
Deren