diff mbox series

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

Message ID 13d9169b5709efad969d7d167a1ff19828395fed.1683602740.git.ryder.lee@mediatek.com (mailing list archive)
State Superseded
Delegated to: Felix Fietkau
Headers show
Series [v5] wifi: mt76: mt7915: report tx retries/failed counts for non-WED path | expand

Commit Message

Ryder Lee May 9, 2023, 3:26 a.m. UTC
Get missing tx retries/failed counts from txfree done events and report
them via mt7915_sta_statistics().

Co-developed-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
---
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(-)

Comments

Ryder Lee May 9, 2023, 6:10 p.m. UTC | #1
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 <chui-hao.chiu@mediatek.com>
> Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
> Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
> ---
> 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
Deren Wu May 10, 2023, 3:11 a.m. UTC | #2
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 <chui-hao.chiu@mediatek.com>
> > Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
> > Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
> > ---
> > 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
diff mbox series

Patch

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)