mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-03 06:33:53 +00:00
284 lines
7.6 KiB
Diff
284 lines
7.6 KiB
Diff
From 2472b924a409ae452065cd5726c5020cfa442698 Mon Sep 17 00:00:00 2001
|
|
From: Peter Chiu <chui-hao.chiu@mediatek.com>
|
|
Date: Mon, 18 Mar 2024 14:16:34 +0800
|
|
Subject: [PATCH 2013/2014] wifi: mt76: add debugfs for tx drop counters
|
|
|
|
Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
|
|
---
|
|
dma.c | 26 +++++++++++++++++++++-----
|
|
mt76.h | 22 ++++++++++++++++++++++
|
|
mt7915/mac.c | 16 +++++++++++++---
|
|
mt7915/mtk_debugfs.c | 37 +++++++++++++++++++++++++++++++++++++
|
|
tx.c | 6 ++++++
|
|
5 files changed, 99 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/dma.c b/dma.c
|
|
index d17fc88..da3e8bc 100644
|
|
--- a/dma.c
|
|
+++ b/dma.c
|
|
@@ -612,13 +612,18 @@ mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,
|
|
struct sk_buff *iter;
|
|
dma_addr_t addr;
|
|
u8 *txwi;
|
|
+ int reason = -1;
|
|
|
|
- if (test_bit(MT76_RESET, &phy->state))
|
|
+ if (test_bit(MT76_RESET, &phy->state)) {
|
|
+ reason = MT_TX_DROP_RESET_STATE;
|
|
goto free_skb;
|
|
+ }
|
|
|
|
t = mt76_get_txwi(dev);
|
|
- if (!t)
|
|
+ if (!t) {
|
|
+ reason = MT_TX_DROP_GET_TXWI_FAIL;
|
|
goto free_skb;
|
|
+ }
|
|
|
|
txwi = mt76_get_txwi_ptr(dev, t);
|
|
|
|
@@ -628,8 +633,10 @@ mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,
|
|
|
|
len = skb_headlen(skb);
|
|
addr = dma_map_single(dev->dma_dev, skb->data, len, DMA_TO_DEVICE);
|
|
- if (unlikely(dma_mapping_error(dev->dma_dev, addr)))
|
|
+ if (unlikely(dma_mapping_error(dev->dma_dev, addr))) {
|
|
+ reason = MT_TX_DROP_DMA_FAIL;
|
|
goto free;
|
|
+ }
|
|
|
|
tx_info.buf[n].addr = t->dma_addr;
|
|
tx_info.buf[n++].len = dev->drv->txwi_size;
|
|
@@ -637,13 +644,17 @@ mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,
|
|
tx_info.buf[n++].len = len;
|
|
|
|
skb_walk_frags(skb, iter) {
|
|
- if (n == ARRAY_SIZE(tx_info.buf))
|
|
+ if (n == ARRAY_SIZE(tx_info.buf)) {
|
|
+ reason = MT_TX_DROP_AGG_EXCEEDED;
|
|
goto unmap;
|
|
+ }
|
|
|
|
addr = dma_map_single(dev->dma_dev, iter->data, iter->len,
|
|
DMA_TO_DEVICE);
|
|
- if (unlikely(dma_mapping_error(dev->dma_dev, addr)))
|
|
+ if (unlikely(dma_mapping_error(dev->dma_dev, addr))) {
|
|
+ reason = MT_TX_DROP_DMA_FAIL;
|
|
goto unmap;
|
|
+ }
|
|
|
|
tx_info.buf[n].addr = addr;
|
|
tx_info.buf[n++].len = iter->len;
|
|
@@ -652,6 +663,7 @@ mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,
|
|
|
|
if (q->queued + (tx_info.nbuf + 1) / 2 >= q->ndesc - 1) {
|
|
ret = -ENOMEM;
|
|
+ reason = MT_TX_DROP_RING_FULL;
|
|
goto unmap;
|
|
}
|
|
|
|
@@ -663,6 +675,7 @@ mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,
|
|
if (ret < 0)
|
|
goto unmap;
|
|
|
|
+ phy->tx_dbg_stats.tx_to_hw++;
|
|
return mt76_dma_add_buf(dev, q, tx_info.buf, tx_info.nbuf,
|
|
tx_info.info, tx_info.skb, t, NULL);
|
|
|
|
@@ -690,6 +703,9 @@ free_skb:
|
|
ieee80211_tx_status_ext(hw, &status);
|
|
spin_unlock_bh(&dev->rx_lock);
|
|
|
|
+ if (reason >= 0)
|
|
+ phy->tx_dbg_stats.tx_drop[reason]++;
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/mt76.h b/mt76.h
|
|
index b6292e3..c1128d1 100644
|
|
--- a/mt76.h
|
|
+++ b/mt76.h
|
|
@@ -849,6 +849,27 @@ struct mt76_vif {
|
|
struct ieee80211_chanctx_conf *ctx;
|
|
};
|
|
|
|
+enum {
|
|
+ MT_TX_DROP_IN_TESTMODE,
|
|
+ MT_TX_DROP_WCID_NOT_INIT,
|
|
+ MT_TX_DROP_STOPPED_QUEUE,
|
|
+ MT_TX_DROP_RESET_STATE,
|
|
+ MT_TX_DROP_GET_TXWI_FAIL,
|
|
+ MT_TX_DROP_DMA_FAIL,
|
|
+ MT_TX_DROP_AGG_EXCEEDED,
|
|
+ MT_TX_DROP_RING_FULL,
|
|
+ MT_TX_DROP_INVALID_SKB,
|
|
+ MT_TX_DROP_GET_TOKEN_FAIL,
|
|
+ MT_TX_DROP_MAX,
|
|
+};
|
|
+
|
|
+struct mt76_tx_debug {
|
|
+ u32 tx_from_mac80211;
|
|
+ u32 tx_to_hw;
|
|
+
|
|
+ u32 tx_drop[MT_TX_DROP_MAX];
|
|
+};
|
|
+
|
|
struct mt76_phy {
|
|
struct ieee80211_hw *hw;
|
|
struct mt76_dev *dev;
|
|
@@ -906,6 +927,7 @@ struct mt76_phy {
|
|
u8 pin;
|
|
} leds;
|
|
int tokens;
|
|
+ struct mt76_tx_debug tx_dbg_stats;
|
|
};
|
|
|
|
struct mt76_dev {
|
|
diff --git a/mt7915/mac.c b/mt7915/mac.c
|
|
index 0c12170..1e2ef8c 100644
|
|
--- a/mt7915/mac.c
|
|
+++ b/mt7915/mac.c
|
|
@@ -782,9 +782,15 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
|
|
u8 phy_idx = (info->hw_queue & MT_TX_HW_QUEUE_PHY) >> 2;
|
|
u8 *txwi = (u8 *)txwi_ptr;
|
|
int pid;
|
|
+ struct mt76_phy *mphy = &mdev->phy;
|
|
|
|
- if (unlikely(tx_info->skb->len <= ETH_HLEN))
|
|
+ if (phy_idx && mdev->phys[MT_BAND1])
|
|
+ mphy = mdev->phys[MT_BAND1];
|
|
+
|
|
+ if (unlikely(tx_info->skb->len <= ETH_HLEN)) {
|
|
+ mphy->tx_dbg_stats.tx_drop[MT_TX_DROP_INVALID_SKB]++;
|
|
return -EINVAL;
|
|
+ }
|
|
|
|
if (!wcid)
|
|
wcid = &dev->mt76.global_wcid;
|
|
@@ -804,12 +810,16 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
|
|
t->skb = tx_info->skb;
|
|
|
|
if (ieee80211_is_action(fc) &&
|
|
- mgmt->u.action.category == 0xff)
|
|
+ mgmt->u.action.category == 0xff) {
|
|
+ mphy->tx_dbg_stats.tx_drop[MT_TX_DROP_INVALID_SKB]++;
|
|
return -1;
|
|
+ }
|
|
|
|
id = mt76_token_consume(mdev, &t, phy_idx);
|
|
- if (id < 0)
|
|
+ if (id < 0) {
|
|
+ mphy->tx_dbg_stats.tx_drop[MT_TX_DROP_GET_TOKEN_FAIL]++;
|
|
return id;
|
|
+ }
|
|
|
|
t->jiffies = jiffies;
|
|
|
|
diff --git a/mt7915/mtk_debugfs.c b/mt7915/mtk_debugfs.c
|
|
index 129a4dd..568ecff 100644
|
|
--- a/mt7915/mtk_debugfs.c
|
|
+++ b/mt7915/mtk_debugfs.c
|
|
@@ -4033,6 +4033,12 @@ static int mt7915_reset_counter(void *data, u64 val)
|
|
struct mt7915_dev *dev = phy->dev;
|
|
struct mt76_wcid *wcid;
|
|
|
|
+ if (!dev->wlan_idx) {
|
|
+ memset(&phy->mt76->tx_dbg_stats, 0, sizeof(struct mt76_tx_debug));
|
|
+
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
/* Clear the firmware counters */
|
|
mt7915_mcu_wed_wa_tx_stats(dev, dev->wlan_idx, NULL);
|
|
mt7915_get_tx_stat(phy, dev->wlan_idx);
|
|
@@ -4087,6 +4093,35 @@ mt7915_per_read(struct seq_file *s, void *data)
|
|
return 0;
|
|
}
|
|
|
|
+static int
|
|
+mt7915_tx_drop_show(struct seq_file *s, void *data)
|
|
+{
|
|
+ struct mt7915_phy *phy = s->private;
|
|
+ struct mt76_tx_debug *stats = &phy->mt76->tx_dbg_stats;
|
|
+
|
|
+ seq_printf(s, "Receive from mac80211: %d\n", stats->tx_from_mac80211);
|
|
+ seq_printf(s, "Send to hw: %d\n", stats->tx_to_hw);
|
|
+
|
|
+#define __pr(t) seq_printf(s, "Drop due to %s: %d\n", \
|
|
+ #t, stats->tx_drop[MT_TX_DROP_##t])
|
|
+ __pr(IN_TESTMODE);
|
|
+ __pr(WCID_NOT_INIT);
|
|
+ __pr(STOPPED_QUEUE);
|
|
+ __pr(RESET_STATE);
|
|
+ __pr(GET_TXWI_FAIL);
|
|
+ __pr(DMA_FAIL);
|
|
+ __pr(AGG_EXCEEDED);
|
|
+ __pr(RING_FULL);
|
|
+ __pr(INVALID_SKB);
|
|
+ __pr(GET_TOKEN_FAIL);
|
|
+
|
|
+#undef __pr
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+DEFINE_SHOW_ATTRIBUTE(mt7915_tx_drop);
|
|
+
|
|
int mt7915_mtk_init_debugfs(struct mt7915_phy *phy, struct dentry *dir)
|
|
{
|
|
struct mt7915_dev *dev = phy->dev;
|
|
@@ -4186,7 +4221,9 @@ int mt7915_mtk_init_debugfs(struct mt7915_phy *phy, struct dentry *dir)
|
|
debugfs_create_file("sr_scene_cond", 0400, dir, phy, &mt7915_sr_scene_cond_fops);
|
|
debugfs_create_file("reset_counter", 0200, dir, phy, &fops_reset_counter);
|
|
debugfs_create_devm_seqfile(dev->mt76.dev, "per", dir, mt7915_per_read);
|
|
+ debugfs_create_file("tx_drop_stats", 0400, dir, phy, &mt7915_tx_drop_fops);
|
|
|
|
return 0;
|
|
}
|
|
+
|
|
#endif
|
|
diff --git a/tx.c b/tx.c
|
|
index df2bb07..e4eb74b 100644
|
|
--- a/tx.c
|
|
+++ b/tx.c
|
|
@@ -330,8 +330,10 @@ mt76_tx(struct mt76_phy *phy, struct ieee80211_sta *sta,
|
|
{
|
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
|
|
+ phy->tx_dbg_stats.tx_from_mac80211++;
|
|
if (mt76_testmode_enabled(phy)) {
|
|
ieee80211_free_txskb(phy->hw, skb);
|
|
+ phy->tx_dbg_stats.tx_drop[MT_TX_DROP_IN_TESTMODE]++;
|
|
return;
|
|
}
|
|
|
|
@@ -348,6 +350,7 @@ mt76_tx(struct mt76_phy *phy, struct ieee80211_sta *sta,
|
|
dev_warn(phy->dev->dev, "Un-initialized STA %pM wcid %d in mt76_tx\n",
|
|
sta->addr, wcid->idx);
|
|
|
|
+ phy->tx_dbg_stats.tx_drop[MT_TX_DROP_WCID_NOT_INIT]++;
|
|
ieee80211_free_txskb(phy->hw, skb);
|
|
return;
|
|
}
|
|
@@ -379,6 +382,8 @@ mt76_txq_dequeue(struct mt76_phy *phy, struct mt76_txq *mtxq)
|
|
info = IEEE80211_SKB_CB(skb);
|
|
info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, phy->band_idx);
|
|
|
|
+ phy->tx_dbg_stats.tx_from_mac80211++;
|
|
+
|
|
return skb;
|
|
}
|
|
|
|
@@ -616,6 +621,7 @@ mt76_txq_schedule_pending_wcid(struct mt76_phy *phy, struct mt76_wcid *wcid)
|
|
q = phy->q_tx[qid];
|
|
if (mt76_txq_stopped(q)) {
|
|
ret = -1;
|
|
+ phy->tx_dbg_stats.tx_drop[MT_TX_DROP_STOPPED_QUEUE]++;
|
|
break;
|
|
}
|
|
|
|
--
|
|
2.18.0
|
|
|