* [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing
@ 2021-11-18 16:40 greearb
2021-11-18 16:40 ` [PATCH 02/11] mt76: mt7915: print out hw revision greearb
` (10 more replies)
0 siblings, 11 replies; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
This is a tricky beast to understand, so add some notes for
next time someone is looking at this code and trying to compare
against documents.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
txs and related patches rebased on top of 5.16
.../net/wireless/mediatek/mt76/mt7915/mac.c | 23 +++++++++++++++----
1 file changed, 18 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 8e5b87af2efb..6fbd58ae9c88 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -410,6 +410,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
__le32 *rxd = (__le32 *)skb->data;
__le32 *rxv = NULL;
u32 mode = 0;
+ /* table "PP -> HOST / X-CPU" RX Format */
u32 rxd0 = le32_to_cpu(rxd[0]);
u32 rxd1 = le32_to_cpu(rxd[1]);
u32 rxd2 = le32_to_cpu(rxd[2]);
@@ -489,7 +490,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
rxd += 6;
if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
- u32 v0 = le32_to_cpu(rxd[0]);
+ u32 v0 = le32_to_cpu(rxd[0]); /* DW6 */
u32 v2 = le32_to_cpu(rxd[2]);
fc = cpu_to_le16(FIELD_GET(MT_RXD6_FRAME_CONTROL, v0));
@@ -502,6 +503,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
}
if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
+ /* DW10, assuming Group-4 enabled */
u8 *data = (u8 *)rxd;
if (status->flag & RX_FLAG_DECRYPTED) {
@@ -533,6 +535,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
}
if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
+ /* DW14, assuming group-1,4 */
status->timestamp = le32_to_cpu(rxd[0]);
status->flag |= RX_FLAG_MACTIME_START;
@@ -558,18 +561,22 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
u32 v0, v1, v2;
- rxv = rxd;
+ rxv = rxd; /* DW16 assuming group 1,2,3,4 */
rxd += 2;
if ((u8 *)rxd - skb->data >= skb->len)
return -EINVAL;
- v0 = le32_to_cpu(rxv[0]);
+ v0 = le32_to_cpu(rxv[0]); /* DW16, P-VEC1 31:0 */
+ /* DW17, RX_RCPI copied over P-VEC 64:32 Per RX Format doc. */
v1 = le32_to_cpu(rxv[1]);
- v2 = le32_to_cpu(rxv[2]);
+ v2 = le32_to_cpu(rxv[2]); /* first DW of group-5, C-RXV */
if (v0 & MT_PRXV_HT_AD_CODE)
status->enc_flags |= RX_ENC_FLAG_LDPC;
+ /* TODO: When group-5 is enabled, use nss (and stbc) to
+ * calculate chains properly for this particular skb.
+ */
status->chains = mphy->antenna_mask;
status->chain_signal[0] = to_rssi(MT_PRXV_RCPI0, v1);
status->chain_signal[1] = to_rssi(MT_PRXV_RCPI1, v1);
@@ -581,12 +588,18 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
if (!(status->chains & BIT(i)))
continue;
+ /* TODO: Use db sum logic instead of max. */
status->signal = max(status->signal,
status->chain_signal[i]);
}
- /* RXD Group 5 - C-RXV */
+ /* RXD Group 5 - C-RXV.
+ * Group 5 Not currently enabled for 7915 except in
+ * monitor mode.
+ * See MT_DMA_DCR0_RXD_G5_EN
+ */
if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
+ /* See RXV document ... */
u8 stbc = FIELD_GET(MT_CRXV_HT_STBC, v2);
u8 gi = FIELD_GET(MT_CRXV_HT_SHORT_GI, v2);
bool cck = false;
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 02/11] mt76: mt7915: print out hw revision
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
@ 2021-11-18 16:40 ` greearb
2021-11-18 16:59 ` Ryder Lee
2021-11-18 16:40 ` [PATCH 03/11] mt76: mt7915: support enabling rx group-5 status greearb
` (9 subsequent siblings)
10 siblings, 1 reply; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
Help determine what version of silicon is in use.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
index 1f6ba306c850..fcc4312555f7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
@@ -146,7 +146,7 @@ int mt7915_mmio_init(struct mt76_dev *mdev, void __iomem *mem_base, int irq)
mdev->rev = (mt76_rr(dev, MT_HW_CHIPID) << 16) |
(mt76_rr(dev, MT_HW_REV) & 0xff);
- dev_dbg(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
+ dev_info(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
mt76_wr(dev, MT_INT_MASK_CSR, 0);
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 03/11] mt76: mt7915: support enabling rx group-5 status
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
2021-11-18 16:40 ` [PATCH 02/11] mt76: mt7915: print out hw revision greearb
@ 2021-11-18 16:40 ` greearb
2022-01-04 10:39 ` Lorenzo Bianconi
2021-11-18 16:40 ` [PATCH 04/11] mt76: mt7915: use nss for calculating rx-chains greearb
` (8 subsequent siblings)
10 siblings, 1 reply; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
When enabled, this allows per-skb rx rate reporting.
Enabling this may degrade RX performance, so it remains
disabled by default.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
.../wireless/mediatek/mt76/mt7915/debugfs.c | 33 +++++++++++++++++++
.../net/wireless/mediatek/mt76/mt7915/init.c | 3 +-
.../net/wireless/mediatek/mt76/mt7915/mac.c | 3 +-
.../net/wireless/mediatek/mt76/mt7915/main.c | 3 +-
.../wireless/mediatek/mt76/mt7915/mt7915.h | 5 +++
5 files changed, 44 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
index e3f6cd18e30a..32e219a20721 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
@@ -435,6 +435,38 @@ mt7915_txs_for_no_skb_get(void *data, u64 *val)
DEFINE_DEBUGFS_ATTRIBUTE(fops_txs_for_no_skb, mt7915_txs_for_no_skb_get,
mt7915_txs_for_no_skb_set, "%lld\n");
+static int
+mt7915_rx_group_5_enable_set(void *data, u64 val)
+{
+ struct mt7915_dev *dev = data;
+
+ mutex_lock(&dev->mt76.mutex);
+
+ dev->rx_group_5_enable = !!val;
+
+ /* Enabled if we requested enabled OR if monitor mode is enabled. */
+ mt76_rmw_field(dev, MT_DMA_DCR0(0), MT_DMA_DCR0_RXD_G5_EN,
+ dev->phy.is_monitor_mode || dev->rx_group_5_enable);
+ mt76_testmode_reset(dev->phy.mt76, true);
+
+ mutex_unlock(&dev->mt76.mutex);
+
+ return 0;
+}
+
+static int
+mt7915_rx_group_5_enable_get(void *data, u64 *val)
+{
+ struct mt7915_dev *dev = data;
+
+ *val = dev->rx_group_5_enable;
+
+ return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(fops_rx_group_5_enable, mt7915_rx_group_5_enable_get,
+ mt7915_rx_group_5_enable_set, "%lld\n");
+
static void
mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,
struct seq_file *file)
@@ -786,6 +818,7 @@ int mt7915_init_debugfs(struct mt7915_phy *phy)
debugfs_create_file("fw_util_wa", 0400, dir, dev,
&mt7915_fw_util_wa_fops);
debugfs_create_file("force_txs", 0600, dir, dev, &fops_txs_for_no_skb);
+ debugfs_create_file("rx_group_5_enable", 0600, dir, dev, &fops_rx_group_5_enable);
debugfs_create_file("implicit_txbf", 0600, dir, dev,
&fops_implicit_txbf);
debugfs_create_file("txpower_sku", 0400, dir, phy,
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
index 90aa62c64f3e..58a0ce72b714 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
@@ -391,7 +391,8 @@ mt7915_mac_init_band(struct mt7915_dev *dev, u8 band)
mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_MAX_RX_LEN, 0x680);
/* disable rx rate report by default due to hw issues */
- mt76_clear(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN);
+ mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN,
+ dev->phy.is_monitor_mode || dev->rx_group_5_enable);
}
static void mt7915_mac_init(struct mt7915_dev *dev)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 6fbd58ae9c88..a6bcc76dcb03 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -715,7 +715,8 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
status->flag |= RX_FLAG_8023;
}
- if (rxv && status->flag & RX_FLAG_RADIOTAP_HE) {
+ if (phy->is_monitor_mode &&
+ rxv && status->flag & RX_FLAG_RADIOTAP_HE) {
mt7915_mac_decode_he_radiotap(skb, status, rxv, mode);
if (status->flag & RX_FLAG_RADIOTAP_HE_MU)
mt7915_mac_decode_he_mu_radiotap(skb, status, rxv);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index 3d702dc899ba..e973b2527b34 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -458,13 +458,14 @@ static int mt7915_config(struct ieee80211_hw *hw, u32 changed)
if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
bool enabled = !!(hw->conf.flags & IEEE80211_CONF_MONITOR);
+ phy->is_monitor_mode = enabled;
if (!enabled)
phy->rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
else
phy->rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN,
- enabled);
+ phy->is_monitor_mode || dev->rx_group_5_enable);
mt76_testmode_reset(phy->mt76, true);
mt76_wr(dev, MT_WF_RFCR(band), phy->rxfilter);
}
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
index 86cd0fc8e9de..84fff60ada92 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
@@ -209,6 +209,7 @@ struct mt7915_phy {
struct thermal_cooling_device *cdev;
u8 throttle_state;
u32 throttle_temp[2]; /* 0: critical high, 1: maximum */
+ u8 is_monitor_mode; /* are we in monitor mode or not ? */
u32 rxfilter;
u64 omac_mask;
@@ -261,6 +262,10 @@ struct mt7915_dev {
* creation by firmware, so may be a performance drag.
*/
bool txs_for_no_skb_enabled;
+ /* Should we enable group-5 rx descriptor logic? This may decrease RX
+ * throughput, but will give per skb rx rate information..
+ */
+ bool rx_group_5_enable;
struct work_struct init_work;
struct work_struct rc_work;
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 04/11] mt76: mt7915: use nss for calculating rx-chains
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
2021-11-18 16:40 ` [PATCH 02/11] mt76: mt7915: print out hw revision greearb
2021-11-18 16:40 ` [PATCH 03/11] mt76: mt7915: support enabling rx group-5 status greearb
@ 2021-11-18 16:40 ` greearb
2021-12-03 9:16 ` Felix Fietkau
2021-11-18 16:40 ` [PATCH 05/11] mt76: mt7915: ethtool group-5 rx stats information greearb
` (7 subsequent siblings)
10 siblings, 1 reply; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
When group-5 is enabled, we can find the actuall NSS used.
In that case, update the rx chains info so that the upper
stack can give better idea of actual antenna usage.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
.../net/wireless/mediatek/mt76/mt7915/mac.c | 32 +++++++++++++------
1 file changed, 22 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index a6bcc76dcb03..ddc85464b1e9 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -560,6 +560,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
/* RXD Group 3 - P-RXV */
if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
u32 v0, v1, v2;
+ u8 nss;
rxv = rxd; /* DW16 assuming group 1,2,3,4 */
rxd += 2;
@@ -577,21 +578,12 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
/* TODO: When group-5 is enabled, use nss (and stbc) to
* calculate chains properly for this particular skb.
*/
- status->chains = mphy->antenna_mask;
status->chain_signal[0] = to_rssi(MT_PRXV_RCPI0, v1);
status->chain_signal[1] = to_rssi(MT_PRXV_RCPI1, v1);
status->chain_signal[2] = to_rssi(MT_PRXV_RCPI2, v1);
status->chain_signal[3] = to_rssi(MT_PRXV_RCPI3, v1);
- status->signal = status->chain_signal[0];
- for (i = 1; i < hweight8(mphy->antenna_mask); i++) {
- if (!(status->chains & BIT(i)))
- continue;
-
- /* TODO: Use db sum logic instead of max. */
- status->signal = max(status->signal,
- status->chain_signal[i]);
- }
+ nss = hweight8(mphy->antenna_mask);
/* RXD Group 5 - C-RXV.
* Group 5 Not currently enabled for 7915 except in
@@ -604,6 +596,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
u8 gi = FIELD_GET(MT_CRXV_HT_SHORT_GI, v2);
bool cck = false;
+ nss = 1;
rxd += 18;
if ((u8 *)rxd - skb->data >= skb->len)
return -EINVAL;
@@ -623,6 +616,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
status->encoding = RX_ENC_HT;
if (i > 31)
return -EINVAL;
+ nss = i / 8 + 1;
break;
case MT_PHY_TYPE_VHT:
status->nss =
@@ -630,6 +624,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
status->encoding = RX_ENC_VHT;
if (i > 9)
return -EINVAL;
+ nss = status->nss;
break;
case MT_PHY_TYPE_HE_MU:
status->flag |= RX_FLAG_RADIOTAP_HE_MU;
@@ -639,6 +634,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
case MT_PHY_TYPE_HE_TB:
status->nss =
FIELD_GET(MT_PRXV_NSTS, v0) + 1;
+ nss = status->nss;
status->encoding = RX_ENC_HE;
status->flag |= RX_FLAG_RADIOTAP_HE;
i &= GENMASK(3, 0);
@@ -653,6 +649,11 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
}
status->rate_idx = i;
+ if (stbc) {
+ nss *= 2;
+ WARN_ON_ONCE(nss > 4);
+ }
+
switch (FIELD_GET(MT_CRXV_FRAME_MODE, v2)) {
case IEEE80211_STA_RX_BW_20:
break;
@@ -680,6 +681,17 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
if (mode < MT_PHY_TYPE_HE_SU && gi)
status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
}
+
+ status->chains = 1;
+ status->signal = status->chain_signal[0];
+
+ for (i = 1; i < nss; i++) {
+ status->chains |= BIT(i);
+
+ /* TODO: Use db sum logic instead of max. */
+ status->signal = max(status->signal,
+ status->chain_signal[i]);
+ }
}
skb_pull(skb, (u8 *)rxd - skb->data + 2 * remove_pad);
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 05/11] mt76: mt7915: ethtool group-5 rx stats information
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
` (2 preceding siblings ...)
2021-11-18 16:40 ` [PATCH 04/11] mt76: mt7915: use nss for calculating rx-chains greearb
@ 2021-11-18 16:40 ` greearb
2022-01-04 10:58 ` Lorenzo Bianconi
2021-11-18 16:40 ` [PATCH 06/11] mt76: mt7915: ethtool counters for driver rx path greearb
` (6 subsequent siblings)
10 siblings, 1 reply; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
Add ethtool support for rx-nss, rx-bw, rx-mode stats.
These are only valid when the group-5 rx stats are
enabled.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
drivers/net/wireless/mediatek/mt76/mac80211.c | 23 ++++++++++++++++++-
drivers/net/wireless/mediatek/mt76/mt76.h | 10 ++++++++
.../net/wireless/mediatek/mt76/mt7915/mac.c | 23 +++++++++++++++++++
.../net/wireless/mediatek/mt76/mt7915/main.c | 21 +++++++++++++++++
4 files changed, 76 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mac80211.c b/drivers/net/wireless/mediatek/mt76/mac80211.c
index a385c1850c61..577d83f8ae71 100644
--- a/drivers/net/wireless/mediatek/mt76/mac80211.c
+++ b/drivers/net/wireless/mediatek/mt76/mac80211.c
@@ -1512,7 +1512,7 @@ EXPORT_SYMBOL_GPL(mt76_calculate_default_rate);
void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
struct mt76_sta_stats *stats)
{
- int i, ei = wi->initial_stat_idx;
+ int i, q, ei = wi->initial_stat_idx;
u64 *data = wi->data;
wi->sta_count++;
@@ -1537,6 +1537,27 @@ void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
for (i = 0; i < 12; i++)
data[ei++] += stats->tx_mcs[i];
+ /* rx stats */
+ for (q = 0; q < ARRAY_SIZE(stats->rx_nss); q++)
+ data[ei++] += stats->rx_nss[q];
+
+ data[ei++] += stats->rx_mode[MT_PHY_TYPE_CCK];
+ data[ei++] += stats->rx_mode[MT_PHY_TYPE_OFDM];
+ data[ei++] += stats->rx_mode[MT_PHY_TYPE_HT];
+ data[ei++] += stats->rx_mode[MT_PHY_TYPE_HT_GF];
+ data[ei++] += stats->rx_mode[MT_PHY_TYPE_VHT];
+ data[ei++] += stats->rx_mode[MT_PHY_TYPE_HE_SU];
+ data[ei++] += stats->rx_mode[MT_PHY_TYPE_HE_EXT_SU];
+ data[ei++] += stats->rx_mode[MT_PHY_TYPE_HE_TB];
+ data[ei++] += stats->rx_mode[MT_PHY_TYPE_HE_MU];
+
+ data[ei++] += stats->rx_bw_20;
+ data[ei++] += stats->rx_bw_40;
+ data[ei++] += stats->rx_bw_80;
+ data[ei++] += stats->rx_bw_160;
+ data[ei++] += stats->rx_bw_he_ru;
+ data[ei++] += stats->rx_ru_106;
+
wi->worker_stat_count = ei - wi->initial_stat_idx;
}
EXPORT_SYMBOL_GPL(mt76_ethtool_worker);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 7bcdfef3c983..9e43ea0077d3 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -798,6 +798,16 @@ struct mt76_sta_stats {
u64 tx_bw[4]; /* 20, 40, 80, 160 */
u64 tx_nss[4]; /* 1, 2, 3, 4 */
u64 tx_mcs[16]; /* mcs idx */
+
+ /* This section requires group-5 in rxd to be enabled for 7915. */
+ u32 rx_nss[4]; /* rx-nss histogram */
+ u32 rx_mode[__MT_PHY_TYPE_HE_MAX]; /* rx mode histogram */
+ u32 rx_bw_20;
+ u32 rx_bw_40;
+ u32 rx_bw_80;
+ u32 rx_bw_160;
+ u32 rx_bw_he_ru;
+ u32 rx_ru_106;
};
struct mt76_ethtool_worker_info {
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index ddc85464b1e9..2915e7237d96 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -424,6 +424,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
u8 qos_ctl = 0;
__le16 fc = 0;
int i, idx;
+ struct mt76_sta_stats *stats = NULL;
memset(status, 0, sizeof(*status));
@@ -451,6 +452,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
struct mt7915_sta *msta;
msta = container_of(status->wcid, struct mt7915_sta, wcid);
+ stats = &msta->stats;
spin_lock_bh(&dev->sta_poll_lock);
if (list_empty(&msta->poll_list))
list_add_tail(&msta->poll_list, &dev->sta_poll_list);
@@ -654,8 +656,19 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
WARN_ON_ONCE(nss > 4);
}
+ if (stats) {
+ if (nss > 3)
+ stats->rx_nss[3]++;
+ else
+ stats->rx_nss[nss - 1]++;
+
+ stats->rx_mode[mode]++;
+ }
+
switch (FIELD_GET(MT_CRXV_FRAME_MODE, v2)) {
case IEEE80211_STA_RX_BW_20:
+ if (stats)
+ stats->rx_bw_20++;
break;
case IEEE80211_STA_RX_BW_40:
if (mode & MT_PHY_TYPE_HE_EXT_SU &&
@@ -663,14 +676,24 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
status->bw = RATE_INFO_BW_HE_RU;
status->he_ru =
NL80211_RATE_INFO_HE_RU_ALLOC_106;
+ if (stats) {
+ stats->rx_bw_he_ru++;
+ stats->rx_ru_106++;
+ }
} else {
status->bw = RATE_INFO_BW_40;
+ if (stats)
+ stats->rx_bw_40++;
}
break;
case IEEE80211_STA_RX_BW_80:
status->bw = RATE_INFO_BW_80;
+ if (stats)
+ stats->rx_bw_80++;
break;
case IEEE80211_STA_RX_BW_160:
+ if (stats)
+ stats->rx_bw_160++;
status->bw = RATE_INFO_BW_160;
break;
default:
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index e973b2527b34..bfc81e008f86 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -1170,6 +1170,27 @@ static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = {
"v_tx_mcs_9",
"v_tx_mcs_10",
"v_tx_mcs_11",
+
+ /* per-vif rx counters */
+ "v_rx_nss1",
+ "v_rx_nss2",
+ "v_rx_nss3",
+ "v_rx_nss4",
+ "v_rx_mode_cck",
+ "v_rx_mode_ofdm",
+ "v_rx_mode_ht",
+ "v_rx_mode_ht_gf",
+ "v_rx_mode_vht",
+ "v_rx_mode_he_su",
+ "v_rx_mode_he_ext_su",
+ "v_rx_mode_he_tb",
+ "v_rx_mode_he_mu",
+ "v_rx_bw_20",
+ "v_rx_bw_40",
+ "v_rx_bw_80",
+ "v_rx_bw_160",
+ "v_rx_bw_he_ru",
+ "v_rx_ru_106",
};
#define MT7915_SSTATS_LEN ARRAY_SIZE(mt7915_gstrings_stats)
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 06/11] mt76: mt7915: ethtool counters for driver rx path
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
` (3 preceding siblings ...)
2021-11-18 16:40 ` [PATCH 05/11] mt76: mt7915: ethtool group-5 rx stats information greearb
@ 2021-11-18 16:40 ` greearb
2021-11-18 16:40 ` [PATCH 07/11] mt76: mt7915: fix rate rix and flags in txs path greearb
` (5 subsequent siblings)
10 siblings, 0 replies; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
Add some per-phy counters for rx errors in the driver.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
.../net/wireless/mediatek/mt76/mt7915/mac.c | 45 ++++++++++++++-----
.../net/wireless/mediatek/mt76/mt7915/main.c | 22 +++++++++
.../wireless/mediatek/mt76/mt7915/mt7915.h | 11 +++++
3 files changed, 68 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 2915e7237d96..edf33540658e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -425,9 +425,12 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
__le16 fc = 0;
int i, idx;
struct mt76_sta_stats *stats = NULL;
+ struct mib_stats *mib = &phy->mib;
memset(status, 0, sizeof(*status));
+ mib->rx_d_skb++;
+
if (rxd1 & MT_RXD1_NORMAL_BAND_IDX) {
mphy = dev->mt76.phy2;
if (!mphy)
@@ -440,8 +443,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
if (!test_bit(MT76_STATE_RUNNING, &mphy->state))
return -EINVAL;
- if (rxd2 & MT_RXD2_NORMAL_AMSDU_ERR)
+ if (rxd2 & MT_RXD2_NORMAL_AMSDU_ERR) {
+ mib->rx_d_rxd2_amsdu_err++;
return -EINVAL;
+ }
unicast = FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, rxd3) == MT_RXD3_NORMAL_U2M;
idx = FIELD_GET(MT_RXD1_NORMAL_WLAN_IDX, rxd1);
@@ -466,8 +471,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
else
sband = &mphy->sband_2g.sband;
- if (!sband->channels)
+ if (!sband->channels) {
+ mib->rx_d_null_channels++;
return -EINVAL;
+ }
if ((rxd0 & csum_mask) == csum_mask)
skb->ip_summed = CHECKSUM_UNNECESSARY;
@@ -487,8 +494,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
remove_pad = FIELD_GET(MT_RXD2_NORMAL_HDR_OFFSET, rxd2);
- if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR)
+ if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR) {
+ mib->rx_d_max_len_err++;
return -EINVAL;
+ }
rxd += 6;
if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
@@ -500,8 +509,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
seq_ctrl = FIELD_GET(MT_RXD8_SEQ_CTRL, v2);
rxd += 4;
- if ((u8 *)rxd - skb->data >= skb->len)
+ if ((u8 *)rxd - skb->data >= skb->len) {
+ mib->rx_d_too_short++;
return -EINVAL;
+ }
}
if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
@@ -532,8 +543,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
}
}
rxd += 4;
- if ((u8 *)rxd - skb->data >= skb->len)
+ if ((u8 *)rxd - skb->data >= skb->len) {
+ mib->rx_d_too_short++;
return -EINVAL;
+ }
}
if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
@@ -555,8 +568,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
}
rxd += 2;
- if ((u8 *)rxd - skb->data >= skb->len)
+ if ((u8 *)rxd - skb->data >= skb->len) {
+ mib->rx_d_too_short++;
return -EINVAL;
+ }
}
/* RXD Group 3 - P-RXV */
@@ -566,8 +581,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
rxv = rxd; /* DW16 assuming group 1,2,3,4 */
rxd += 2;
- if ((u8 *)rxd - skb->data >= skb->len)
+ if ((u8 *)rxd - skb->data >= skb->len) {
+ mib->rx_d_too_short++;
return -EINVAL;
+ }
v0 = le32_to_cpu(rxv[0]); /* DW16, P-VEC1 31:0 */
/* DW17, RX_RCPI copied over P-VEC 64:32 Per RX Format doc. */
@@ -600,8 +617,10 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
nss = 1;
rxd += 18;
- if ((u8 *)rxd - skb->data >= skb->len)
+ if ((u8 *)rxd - skb->data >= skb->len) {
+ mib->rx_d_too_short++;
return -EINVAL;
+ }
idx = i = FIELD_GET(MT_PRXV_TX_RATE, v0);
mode = FIELD_GET(MT_CRXV_TX_MODE, v2);
@@ -616,16 +635,20 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
case MT_PHY_TYPE_HT_GF:
case MT_PHY_TYPE_HT:
status->encoding = RX_ENC_HT;
- if (i > 31)
+ if (i > 31) {
+ mib->rx_d_bad_ht_rix++;
return -EINVAL;
+ }
nss = i / 8 + 1;
break;
case MT_PHY_TYPE_VHT:
status->nss =
FIELD_GET(MT_PRXV_NSTS, v0) + 1;
status->encoding = RX_ENC_VHT;
- if (i > 9)
+ if (i > 9) {
+ mib->rx_d_bad_vht_rix++;
return -EINVAL;
+ }
nss = status->nss;
break;
case MT_PHY_TYPE_HE_MU:
@@ -647,6 +670,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
status->he_dcm = !!(idx & MT_PRXV_TX_DCM);
break;
default:
+ mib->rx_d_bad_mode++;
return -EINVAL;
}
status->rate_idx = i;
@@ -697,6 +721,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
status->bw = RATE_INFO_BW_160;
break;
default:
+ mib->rx_d_bad_bw++;
return -EINVAL;
}
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index bfc81e008f86..f6c334721bca 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -1140,6 +1140,17 @@ static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = {
"rx_vec_queue_overflow_drop_cnt",
"rx_ba_cnt",
+ /* driver rx counters */
+ "d_rx_skb",
+ "d_rx_rxd2_amsdu_err",
+ "d_rx_null_channels",
+ "d_rx_max_len_err",
+ "d_rx_too_short",
+ "d_rx_bad_ht_rix",
+ "d_rx_bad_vht_rix",
+ "d_rx_bad_mode",
+ "d_rx_bad_bw",
+
/* per vif counters */
"v_tx_mpdu_attempts", /* counting any retries */
"v_tx_mpdu_fail", /* frames that failed even after retry */
@@ -1307,6 +1318,17 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
data[ei++] = mib->rx_vec_queue_overflow_drop_cnt;
data[ei++] = mib->rx_ba_cnt;
+ /* rx stats from driver */
+ data[ei++] = mib->rx_d_skb;
+ data[ei++] = mib->rx_d_rxd2_amsdu_err;
+ data[ei++] = mib->rx_d_null_channels;
+ data[ei++] = mib->rx_d_max_len_err;
+ data[ei++] = mib->rx_d_too_short;
+ data[ei++] = mib->rx_d_bad_ht_rix;
+ data[ei++] = mib->rx_d_bad_vht_rix;
+ data[ei++] = mib->rx_d_bad_mode;
+ data[ei++] = mib->rx_d_bad_bw;
+
/* Add values for all stations owned by this vif */
wi.initial_stat_idx = ei;
ieee80211_iterate_stations_atomic(hw, mt7915_ethtool_worker, &wi);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
index 84fff60ada92..bcbc8496516e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
@@ -188,6 +188,17 @@ struct mib_stats {
u32 tx_amsdu[8];
u32 tx_amsdu_cnt;
+
+ /* rx stats from the driver */
+ u32 rx_d_skb; /* total skb received in rx path */
+ u32 rx_d_rxd2_amsdu_err;
+ u32 rx_d_null_channels;
+ u32 rx_d_max_len_err;
+ u32 rx_d_too_short;
+ u32 rx_d_bad_ht_rix;
+ u32 rx_d_bad_vht_rix;
+ u32 rx_d_bad_mode;
+ u32 rx_d_bad_bw;
};
struct mt7915_hif {
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 07/11] mt76: mt7915: fix rate rix and flags in txs path
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
` (4 preceding siblings ...)
2021-11-18 16:40 ` [PATCH 06/11] mt76: mt7915: ethtool counters for driver rx path greearb
@ 2021-11-18 16:40 ` greearb
2022-01-04 11:15 ` Lorenzo Bianconi
2021-11-18 16:40 ` [PATCH 08/11] mt76: mt7915: add ethtool tx/rx pkts/bytes greearb
` (4 subsequent siblings)
10 siblings, 1 reply; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
Do not initialize rix to -1, build the rix and set flags
based on the mcs, nss, and mode.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index edf33540658e..300928edd0d7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -1571,7 +1571,7 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
struct ieee80211_supported_band *sband;
struct mt76_dev *mdev = &dev->mt76;
struct mt76_phy *mphy;
- struct ieee80211_tx_info *info;
+ struct ieee80211_tx_info *info = NULL;
struct sk_buff_head list;
struct rate_info rate = {};
struct sk_buff *skb = NULL;
@@ -1596,8 +1596,6 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
info->status.ampdu_len = 1;
info->status.ampdu_ack_len = !!(info->flags &
IEEE80211_TX_STAT_ACK);
-
- info->status.rates[0].idx = -1;
}
txrate = FIELD_GET(MT_TXS0_TX_RATE, txs);
@@ -1627,6 +1625,8 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
rate.mcs = mt76_get_rate(mphy->dev, sband, rate.mcs, cck);
rate.legacy = sband->bitrates[rate.mcs].bitrate;
+ if (info)
+ info->status.rates[0].idx = rate.mcs;
break;
case MT_PHY_TYPE_HT:
case MT_PHY_TYPE_HT_GF:
@@ -1637,6 +1637,10 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
rate.flags = RATE_INFO_FLAGS_MCS;
if (wcid->rate_short_gi)
rate.flags |= RATE_INFO_FLAGS_SHORT_GI;
+ if (info) {
+ info->status.rates[0].idx = rate.mcs + rate.nss * 8;
+ info->status.rates[0].flags |= IEEE80211_TX_RC_MCS;
+ }
break;
case MT_PHY_TYPE_VHT:
if (rate.mcs > 9)
@@ -1645,6 +1649,10 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
rate.flags = RATE_INFO_FLAGS_VHT_MCS;
if (wcid->rate_short_gi)
rate.flags |= RATE_INFO_FLAGS_SHORT_GI;
+ if (info) {
+ info->status.rates[0].idx = (rate.nss << 4) | rate.mcs;
+ info->status.rates[0].flags |= IEEE80211_TX_RC_VHT_MCS;
+ }
break;
case MT_PHY_TYPE_HE_SU:
case MT_PHY_TYPE_HE_EXT_SU:
@@ -1656,6 +1664,8 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
rate.he_gi = wcid->rate_he_gi;
rate.he_dcm = FIELD_GET(MT_TX_RATE_DCM, txrate);
rate.flags = RATE_INFO_FLAGS_HE_MCS;
+ if (info)
+ info->status.rates[0].idx = (rate.nss << 4) | rate.mcs;
break;
default:
WARN_ON_ONCE(true);
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 08/11] mt76: mt7915: add ethtool tx/rx pkts/bytes
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
` (5 preceding siblings ...)
2021-11-18 16:40 ` [PATCH 07/11] mt76: mt7915: fix rate rix and flags in txs path greearb
@ 2021-11-18 16:40 ` greearb
2021-11-18 16:40 ` [PATCH 09/11] mt76: mt7915: add rx-ppdu-size-out-of-range ethtool counter greearb
` (3 subsequent siblings)
10 siblings, 0 replies; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
These stats are provided with same name by ath10k
and some intel wired NIC drivers. Add them to mt7915
as well to allow user-space code to more easily get some
basic stats out of the radio.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 7 +++++++
drivers/net/wireless/mediatek/mt76/mt7915/main.c | 11 +++++++++++
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h | 7 +++++++
3 files changed, 25 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 300928edd0d7..a97b4e64f74d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -782,6 +782,9 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
mt7915_mac_decode_he_mu_radiotap(skb, status, rxv);
}
+ mib->rx_pkts_nic++;
+ mib->rx_bytes_nic += skb->len;
+
if (!status->wcid || !ieee80211_is_data_qos(fc))
return 0;
@@ -1384,6 +1387,8 @@ mt7915_txwi_free(struct mt7915_dev *dev, struct mt76_txwi_cache *t,
u16 wcid_idx;
struct ieee80211_tx_info *info;
struct ieee80211_tx_rate *rate;
+ struct mt7915_phy *phy = &dev->phy;
+ struct mib_stats *mib = &phy->mib;
mt7915_txp_skb_unmap(mdev, t);
if (!t->skb)
@@ -1465,6 +1470,8 @@ mt7915_txwi_free(struct mt7915_dev *dev, struct mt76_txwi_cache *t,
/* Apply the values that this txfree path reports */
rate->count = tx_cnt;
if (tx_status == 0) {
+ mib->tx_pkts_nic++;
+ mib->tx_bytes_nic += t->skb->len;
info->flags |= IEEE80211_TX_STAT_ACK;
info->status.ampdu_ack_len = 1;
} else {
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index f6c334721bca..c4eee951699e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -1077,6 +1077,10 @@ static void mt7915_sta_set_decap_offload(struct ieee80211_hw *hw,
}
static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = {
+ "tx_pkts_nic", /* from driver, phy tx-ok skb */
+ "tx_bytes_nic", /* from driver, phy tx-ok bytes */
+ "rx_pkts_nic", /* from driver, phy rx OK skb */
+ "rx_bytes_nic", /* from driver, phy rx OK bytes */
"tx_ampdu_cnt",
"tx_stop_q_empty_cnt",
"tx_mpdu_attempts",
@@ -1259,6 +1263,13 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
mt7915_mac_update_stats(phy);
+ /* driver phy-wide stats */
+ data[ei++] = mib->tx_pkts_nic;
+ data[ei++] = mib->tx_bytes_nic;
+ data[ei++] = mib->rx_pkts_nic;
+ data[ei++] = mib->rx_bytes_nic;
+
+ /* MIB stats from FW/HW */
data[ei++] = mib->tx_ampdu_cnt;
data[ei++] = mib->tx_stop_q_empty_cnt;
data[ei++] = mib->tx_mpdu_attempts_cnt;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
index bcbc8496516e..60881b357399 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
@@ -138,6 +138,13 @@ struct mt7915_vif {
/* per-phy stats. */
struct mib_stats {
+ /* phy wide driver stats */
+ u32 tx_pkts_nic; /* tx OK skb */
+ u32 tx_bytes_nic; /* tx OK bytes */
+ u32 rx_pkts_nic; /* rx OK skb */
+ u32 rx_bytes_nic; /* rx OK bytes */
+
+ /* MIB counters from FW/HW */
u32 ack_fail_cnt;
u32 fcs_err_cnt;
u32 rts_cnt;
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 09/11] mt76: mt7915: add rx-ppdu-size-out-of-range ethtool counter
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
` (6 preceding siblings ...)
2021-11-18 16:40 ` [PATCH 08/11] mt76: mt7915: add ethtool tx/rx pkts/bytes greearb
@ 2021-11-18 16:40 ` greearb
2021-11-18 16:40 ` [PATCH 10/11] mt76: mt7915: ethtool and mib rx stats greearb
` (2 subsequent siblings)
10 siblings, 0 replies; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
Support this additional MIB counter, it shares register with
the rx-fifo-overflow counter.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 1 +
drivers/net/wireless/mediatek/mt76/mt7915/main.c | 4 +++-
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h | 1 +
drivers/net/wireless/mediatek/mt76/mt7915/regs.h | 1 +
4 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index a97b4e64f74d..82786404f516 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -2175,6 +2175,7 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy)
cnt = mt76_rr(dev, MT_MIB_SDR4(ext_phy));
mib->rx_fifo_full_cnt += FIELD_GET(MT_MIB_SDR4_RX_FIFO_FULL_MASK, cnt);
+ mib->rx_oor_cnt += FIELD_GET(MT_MIB_SDR4_RX_OOR_MASK, cnt);
cnt = mt76_rr(dev, MT_MIB_SDR5(ext_phy));
mib->rx_mpdu_cnt += cnt;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index c4eee951699e..7422421c1848 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -1131,6 +1131,7 @@ static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = {
/* rx counters */
"rx_fifo_full_cnt",
+ "rx_oor_cnt", /* rx ppdu length is bad */
"rx_mpdu_cnt",
"channel_idle_cnt",
"rx_vector_mismatch_cnt",
@@ -1315,7 +1316,8 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
data[ei++] = mib->tx_amsdu[i];
/* rx counters */
- data[ei++] = mib->rx_fifo_full_cnt;
+ data[ei++] = mib->rx_fifo_full_cnt; /* group-5 might exacerbate this */
+ data[ei++] = mib->rx_oor_cnt;
data[ei++] = mib->rx_mpdu_cnt;
data[ei++] = mib->channel_idle_cnt;
data[ei++] = mib->rx_vector_mismatch_cnt;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
index 60881b357399..f5e8ae9db4a2 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
@@ -180,6 +180,7 @@ struct mib_stats {
/* rx stats */
u32 rx_fifo_full_cnt;
+ u32 rx_oor_cnt;
u32 channel_idle_cnt;
u32 rx_vector_mismatch_cnt;
u32 rx_delimiter_fail_cnt;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
index d23c669cc933..a142b860fc7c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
@@ -164,6 +164,7 @@
#define MT_MIB_SDR4(_band) MT_WF_MIB(_band, 0x018)
#define MT_MIB_SDR4_RX_FIFO_FULL_MASK GENMASK(15, 0)
+#define MT_MIB_SDR4_RX_OOR_MASK GENMASK(23, 16)
/* rx mpdu counter, full 32 bits */
#define MT_MIB_SDR5(_band) MT_WF_MIB(_band, 0x01c)
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 10/11] mt76: mt7915: ethtool and mib rx stats
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
` (7 preceding siblings ...)
2021-11-18 16:40 ` [PATCH 09/11] mt76: mt7915: add rx-ppdu-size-out-of-range ethtool counter greearb
@ 2021-11-18 16:40 ` greearb
2021-11-18 16:40 ` [PATCH 11/11] mt76: mt7915: poll mib counters every 200ms greearb
2021-11-19 16:33 ` [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing Lorenzo Bianconi
10 siblings, 0 replies; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
Add some new stats read from MIB registers, including
rx-mu-vht histogram data.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
.../net/wireless/mediatek/mt76/mt7915/mac.c | 45 ++++++++++-
.../net/wireless/mediatek/mt76/mt7915/main.c | 77 ++++++++++++++++++-
.../wireless/mediatek/mt76/mt7915/mt7915.h | 13 ++++
.../net/wireless/mediatek/mt76/mt7915/regs.h | 47 +++++++++++
4 files changed, 180 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 82786404f516..3c89c7573015 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -2168,7 +2168,7 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy)
struct mt7915_dev *dev = phy->dev;
struct mib_stats *mib = &phy->mib;
bool ext_phy = phy != &dev->phy;
- int i, aggr0, aggr1, cnt;
+ int i, q, aggr0, aggr1, cnt;
mib->fcs_err_cnt += mt76_get_field(dev, MT_MIB_SDR3(ext_phy),
MT_MIB_SDR3_FCS_ERR_MASK);
@@ -2241,6 +2241,26 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy)
cnt = mt76_rr(dev, MT_MIB_SDR34(ext_phy));
mib->tx_bf_cnt += FIELD_GET(MT_MIB_MU_BF_TX_CNT, cnt);
+ cnt = mt76_rr(dev, MT_MIB_SDR38(ext_phy));
+ mib->tx_mgt_frame_cnt += FIELD_GET(MT_MIB_CTRL_TX_CNT, cnt);
+
+ cnt = mt76_rr(dev, MT_MIB_SDR39(ext_phy));
+ mib->tx_mgt_frame_retry_cnt += FIELD_GET(MT_MIB_MGT_RETRY_CNT, cnt);
+
+ cnt = mt76_rr(dev, MT_MIB_SDR40(ext_phy));
+ mib->tx_data_frame_retry_cnt += FIELD_GET(MT_MIB_DATA_RETRY_CNT, cnt);
+
+ cnt = mt76_rr(dev, MT_MIB_SDR42(ext_phy));
+ mib->rx_partial_beacon_cnt += FIELD_GET(MT_MIB_RX_PARTIAL_BEACON_BSSID0, cnt);
+ mib->rx_partial_beacon_cnt += FIELD_GET(MT_MIB_RX_PARTIAL_BEACON_BSSID1, cnt);
+
+ cnt = mt76_rr(dev, MT_MIB_SDR43(ext_phy));
+ mib->rx_partial_beacon_cnt += FIELD_GET(MT_MIB_RX_PARTIAL_BEACON_BSSID2, cnt);
+ mib->rx_partial_beacon_cnt += FIELD_GET(MT_MIB_RX_PARTIAL_BEACON_BSSID3, cnt);
+
+ cnt = mt76_rr(dev, MT_MIB_SDR46(ext_phy));
+ mib->rx_oppo_ps_rx_dis_drop_cnt += FIELD_GET(MT_MIB_OPPO_PS_RX_DIS_DROP_COUNT, cnt);
+
cnt = mt76_rr(dev, MT_MIB_DR8(ext_phy));
mib->tx_mu_mpdu_cnt += cnt;
@@ -2297,6 +2317,29 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy)
dev->mt76.aggr_stats[aggr1++] += val & 0xffff;
dev->mt76.aggr_stats[aggr1++] += val >> 16;
}
+
+ cnt = mt76_rr(dev, MT_MIB_M0DROPSR00(ext_phy));
+ mib->tx_drop_rts_retry_fail_cnt += FIELD_GET(MT_MIB_RTS_RETRY_FAIL_DROP_MASK, cnt);
+ mib->tx_drop_mpdu_retry_fail_cnt += FIELD_GET(MT_MIB_RTS_RETRY_FAIL_DROP_MASK, cnt);
+
+ cnt = mt76_rr(dev, MT_MIB_M0DROPSR01(ext_phy));
+ mib->tx_drop_lto_limit_fail_cnt += FIELD_GET(MT_MIB_LTO_FAIL_DROP_MASK, cnt);
+
+ cnt = mt76_rr(dev, MT_MIB_SDR50(ext_phy));
+ mib->tx_dbnss_cnt += FIELD_GET(MT_MIB_DBNSS_CNT_DROP_MASK, cnt);
+
+ cnt = mt76_rr(dev, MT_MIB_SDR51(ext_phy));
+ mib->rx_fcs_ok_cnt += FIELD_GET(MT_MIB_RX_FCS_OK_MASK, cnt);
+
+ for (i = 0; i < 2; i++) {
+ for (q = 0; q < 10; q++) {
+ cnt = mt76_rr(dev, MT_MIB_VHT_RX_FCS_HISTOGRAM(ext_phy, i, q));
+ mib->rx_mu_fcs_ok_hist[i][q] +=
+ FIELD_GET(MT_MIB_VHT_RX_FCS_HIST_OK_MASK, cnt);
+ mib->rx_mu_fcs_err_hist[i][q] +=
+ FIELD_GET(MT_MIB_VHT_RX_FCS_HIST_ERR_MASK, cnt);
+ }
+ }
}
void mt7915_mac_sta_rc_work(struct work_struct *work)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index 7422421c1848..ce088f8f38f6 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -1128,6 +1128,13 @@ static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = {
"tx_msdu_pack_6",
"tx_msdu_pack_7",
"tx_msdu_pack_8",
+ "tx_mgt_frame", /* SDR38, management frame tx counter */
+ "tx_mgt_frame_retry", /* SDR39, management frame retried counter */
+ "tx_data_frame_retry", /* SDR40, data frame retried counter */
+ "tx_drop_rts_retry_fail", /* TX Drop, RTS retries exhausted */
+ "tx_drop_mpdu_retry_fail", /* TX Drop, MPDU retries exhausted */
+ "tx_drop_lto_limit_fail", /* TX drop, Life Time Out limit reached. */
+ "tx_dbnss", /* pkts TX using double number of spatial streams */
/* rx counters */
"rx_fifo_full_cnt",
@@ -1144,6 +1151,54 @@ static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = {
"rx_pfdrop_cnt",
"rx_vec_queue_overflow_drop_cnt",
"rx_ba_cnt",
+ "rx_partial_beacon",
+ "rx_oppo_ps_rx_dis_drop",
+ "rx_fcs_ok",
+
+ /* rx MU VHT histogram */
+ "rx_mu_fcs_ok_nss1_mcs0",
+ "rx_mu_fcs_ok_nss1_mcs1",
+ "rx_mu_fcs_ok_nss1_mcs2",
+ "rx_mu_fcs_ok_nss1_mcs3",
+ "rx_mu_fcs_ok_nss1_mcs4",
+ "rx_mu_fcs_ok_nss1_mcs5",
+ "rx_mu_fcs_ok_nss1_mcs6",
+ "rx_mu_fcs_ok_nss1_mcs7",
+ "rx_mu_fcs_ok_nss1_mcs8",
+ "rx_mu_fcs_ok_nss1_mcs9",
+
+ "rx_mu_fcs_ok_nss2_mcs0",
+ "rx_mu_fcs_ok_nss2_mcs1",
+ "rx_mu_fcs_ok_nss2_mcs2",
+ "rx_mu_fcs_ok_nss2_mcs3",
+ "rx_mu_fcs_ok_nss2_mcs4",
+ "rx_mu_fcs_ok_nss2_mcs5",
+ "rx_mu_fcs_ok_nss2_mcs6",
+ "rx_mu_fcs_ok_nss2_mcs7",
+ "rx_mu_fcs_ok_nss2_mcs8",
+ "rx_mu_fcs_ok_nss2_mcs9",
+
+ "rx_mu_fcs_err_nss1_mcs0",
+ "rx_mu_fcs_err_nss1_mcs1",
+ "rx_mu_fcs_err_nss1_mcs2",
+ "rx_mu_fcs_err_nss1_mcs3",
+ "rx_mu_fcs_err_nss1_mcs4",
+ "rx_mu_fcs_err_nss1_mcs5",
+ "rx_mu_fcs_err_nss1_mcs6",
+ "rx_mu_fcs_err_nss1_mcs7",
+ "rx_mu_fcs_err_nss1_mcs8",
+ "rx_mu_fcs_err_nss1_mcs9",
+
+ "rx_mu_fcs_err_nss2_mcs0",
+ "rx_mu_fcs_err_nss2_mcs1",
+ "rx_mu_fcs_err_nss2_mcs2",
+ "rx_mu_fcs_err_nss2_mcs3",
+ "rx_mu_fcs_err_nss2_mcs4",
+ "rx_mu_fcs_err_nss2_mcs5",
+ "rx_mu_fcs_err_nss2_mcs6",
+ "rx_mu_fcs_err_nss2_mcs7",
+ "rx_mu_fcs_err_nss2_mcs8",
+ "rx_mu_fcs_err_nss2_mcs9",
/* driver rx counters */
"d_rx_skb",
@@ -1258,7 +1313,7 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
struct mib_stats *mib = &phy->mib;
/* See mt7915_ampdu_stat_read_phy, etc */
bool ext_phy = phy != &dev->phy;
- int i, n, ei = 0;
+ int i, n, q, ei = 0;
mutex_lock(&dev->mt76.mutex);
@@ -1315,6 +1370,14 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++)
data[ei++] = mib->tx_amsdu[i];
+ data[ei++] = mib->tx_mgt_frame_cnt;
+ data[ei++] = mib->tx_mgt_frame_retry_cnt;
+ data[ei++] = mib->tx_data_frame_retry_cnt;
+ data[ei++] = mib->tx_drop_rts_retry_fail_cnt;
+ data[ei++] = mib->tx_drop_mpdu_retry_fail_cnt;
+ data[ei++] = mib->tx_drop_lto_limit_fail_cnt;
+ data[ei++] = mib->tx_dbnss_cnt;
+
/* rx counters */
data[ei++] = mib->rx_fifo_full_cnt; /* group-5 might exacerbate this */
data[ei++] = mib->rx_oor_cnt;
@@ -1330,6 +1393,18 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
data[ei++] = mib->rx_pfdrop_cnt;
data[ei++] = mib->rx_vec_queue_overflow_drop_cnt;
data[ei++] = mib->rx_ba_cnt;
+ data[ei++] = mib->rx_partial_beacon_cnt;
+ data[ei++] = mib->rx_oppo_ps_rx_dis_drop_cnt;
+ data[ei++] = mib->rx_fcs_ok_cnt;
+
+ for (i = 0; i < 2; i++) { /* for each nss */
+ for (q = 0; q < 10; q++) /* for each mcs */
+ data[ei++] = mib->rx_mu_fcs_ok_hist[i][q];
+ }
+ for (i = 0; i < 2; i++) { /* for each nss */
+ for (q = 0; q < 10; q++) /* for each mcs */
+ data[ei++] = mib->rx_mu_fcs_err_hist[i][q];
+ }
/* rx stats from driver */
data[ei++] = mib->rx_d_skb;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
index f5e8ae9db4a2..cd0341071875 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
@@ -177,6 +177,13 @@ struct mib_stats {
u32 tx_rwp_fail_cnt;
u32 tx_rwp_need_cnt;
+ u32 tx_mgt_frame_cnt;
+ u32 tx_mgt_frame_retry_cnt;
+ u32 tx_data_frame_retry_cnt;
+ u32 tx_drop_rts_retry_fail_cnt;
+ u32 tx_drop_mpdu_retry_fail_cnt;
+ u32 tx_drop_lto_limit_fail_cnt;
+ u32 tx_dbnss_cnt;
/* rx stats */
u32 rx_fifo_full_cnt;
@@ -197,6 +204,12 @@ struct mib_stats {
u32 tx_amsdu[8];
u32 tx_amsdu_cnt;
+ u32 rx_partial_beacon_cnt;
+ u32 rx_oppo_ps_rx_dis_drop_cnt;
+ u32 rx_fcs_ok_cnt;
+ u32 rx_mu_fcs_ok_hist[2][10]; /* nss, mcs */
+ u32 rx_mu_fcs_err_hist[2][10]; /* nss, mcs */
+
/* rx stats from the driver */
u32 rx_d_skb; /* total skb received in rx path */
u32 rx_d_rxd2_amsdu_err;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
index a142b860fc7c..c9068f4b32ed 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
@@ -262,6 +262,29 @@
/* 36, 37 both DNR */
+#define MT_MIB_SDR38(_band) MT_WF_MIB(_band, 0x0d0)
+#define MT_MIB_CTRL_TX_CNT GENMASK(23, 0)
+
+#define MT_MIB_SDR39(_band) MT_WF_MIB(_band, 0x0d4)
+#define MT_MIB_MGT_RETRY_CNT GENMASK(23, 0)
+
+#define MT_MIB_SDR40(_band) MT_WF_MIB(_band, 0x0d8)
+#define MT_MIB_DATA_RETRY_CNT GENMASK(23, 0)
+
+#define MT_MIB_SDR42(_band) MT_WF_MIB(_band, 0x0e0)
+#define MT_MIB_RX_PARTIAL_BEACON_BSSID0 GENMASK(15, 0)
+#define MT_MIB_RX_PARTIAL_BEACON_BSSID1 GENMASK(31, 16)
+
+#define MT_MIB_SDR43(_band) MT_WF_MIB(_band, 0x0e4)
+#define MT_MIB_RX_PARTIAL_BEACON_BSSID2 GENMASK(15, 0)
+#define MT_MIB_RX_PARTIAL_BEACON_BSSID3 GENMASK(31, 16)
+
+/* This counter shall increment when PPDUs dropped by the oppo_ps_rx_dis
+ * mechanism
+ */
+#define MT_MIB_SDR46(_band) MT_WF_MIB(_band, 0x0f0)
+#define MT_MIB_OPPO_PS_RX_DIS_DROP_COUNT GENMASK(15, 0)
+
#define MT_MIB_DR8(_band) MT_WF_MIB(_band, 0x0c0)
#define MT_MIB_DR9(_band) MT_WF_MIB(_band, 0x0c4)
#define MT_MIB_DR11(_band) MT_WF_MIB(_band, 0x0cc)
@@ -279,6 +302,30 @@
#define MT_MIB_ARNG(_band, n) MT_WF_MIB(_band, 0x4b8 + ((n) << 2))
#define MT_MIB_ARNCR_RANGE(val, n) (((val) >> ((n) << 3)) & GENMASK(7, 0))
+/* drop due to retries being exhausted */
+#define MT_MIB_M0DROPSR00(_band) MT_WF_MIB(_band, 0x190)
+#define MT_MIB_RTS_RETRY_FAIL_DROP_MASK GENMASK(15, 0)
+#define MT_MIB_MPDU_RETRY_FAIL_DROP_MASK GENMASK(31, 16)
+
+/* life time out limit */
+#define MT_MIB_M0DROPSR01(_band) MT_WF_MIB(_band, 0x194)
+#define MT_MIB_LTO_FAIL_DROP_MASK GENMASK(15, 0)
+
+/* increment when using double number of spatial streams */
+#define MT_MIB_SDR50(_band) MT_WF_MIB(_band, 0x1dc)
+#define MT_MIB_DBNSS_CNT_DROP_MASK GENMASK(15, 0)
+
+/* NOTE: Would need to poll this quickly since it is 16-bit */
+#define MT_MIB_SDR51(_band) MT_WF_MIB(_band, 0x1e0)
+#define MT_MIB_RX_FCS_OK_MASK GENMASK(15, 0)
+
+/* VHT MU rx fcs ok, fcs fail. NSS: 0,1 MCS: 0..9 */
+#define MT_MIB_VHT_RX_FCS_HISTOGRAM_BASE_M0NSS1MCS0(_band) MT_WF_MIB(_band, 0x400)
+#define MT_MIB_VHT_RX_FCS_HIST_OK_MASK GENMASK(15, 0)
+#define MT_MIB_VHT_RX_FCS_HIST_ERR_MASK GENMASK(31, 16)
+#define MT_MIB_VHT_RX_FCS_HISTOGRAM(_band, nss, mcs) \
+ (MT_MIB_VHT_RX_FCS_HISTOGRAM_BASE_M0NSS1MCS0(_band) + (nss) * 4 + (mcs))
+
#define MT_WTBLON_TOP_BASE 0x34000
#define MT_WTBLON_TOP(ofs) (MT_WTBLON_TOP_BASE + (ofs))
#define MT_WTBLON_TOP_WDUCR MT_WTBLON_TOP(0x0)
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 11/11] mt76: mt7915: poll mib counters every 200ms
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
` (8 preceding siblings ...)
2021-11-18 16:40 ` [PATCH 10/11] mt76: mt7915: ethtool and mib rx stats greearb
@ 2021-11-18 16:40 ` greearb
2021-11-18 17:01 ` Ryder Lee
2021-11-19 16:33 ` [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing Lorenzo Bianconi
10 siblings, 1 reply; 20+ messages in thread
From: greearb @ 2021-11-18 16:40 UTC (permalink / raw)
To: linux-wireless; +Cc: Ben Greear
From: Ben Greear <greearb@candelatech.com>
Instead of every 500ms, this will do better job of catching wraps
of 16-bit pkt counters.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 3c89c7573015..7cfa6b2abda5 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -2390,7 +2390,11 @@ void mt7915_mac_work(struct work_struct *work)
mutex_lock(&mphy->dev->mutex);
mt76_update_survey(mphy);
- if (++mphy->mac_work_count == 5) {
+
+ /* this method is called about every 100ms. Some pkt counters are 16-bit,
+ * so poll every 200ms to keep overflows at a minimum.
+ */
+ if (++mphy->mac_work_count == 2) {
mphy->mac_work_count = 0;
mt7915_mac_update_stats(phy);
--
2.20.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 02/11] mt76: mt7915: print out hw revision
2021-11-18 16:40 ` [PATCH 02/11] mt76: mt7915: print out hw revision greearb
@ 2021-11-18 16:59 ` Ryder Lee
0 siblings, 0 replies; 20+ messages in thread
From: Ryder Lee @ 2021-11-18 16:59 UTC (permalink / raw)
To: greearb, linux-wireless
On Thu, 2021-11-18 at 08:40 -0800, greearb@candelatech.com wrote:
> From: Ben Greear <greearb@candelatech.com>
>
> Help determine what version of silicon is in use.
>
> Signed-off-by: Ben Greear <greearb@candelatech.com>
> ---
> drivers/net/wireless/mediatek/mt76/mt7915/mmio.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
> b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
> index 1f6ba306c850..fcc4312555f7 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
> @@ -146,7 +146,7 @@ int mt7915_mmio_init(struct mt76_dev *mdev, void
> __iomem *mem_base, int irq)
>
> mdev->rev = (mt76_rr(dev, MT_HW_CHIPID) << 16) |
> (mt76_rr(dev, MT_HW_REV) & 0xff);
> - dev_dbg(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
> + dev_info(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
>
> mt76_wr(dev, MT_INT_MASK_CSR, 0);
I prefer leaving it as is now.
Ryder
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 11/11] mt76: mt7915: poll mib counters every 200ms
2021-11-18 16:40 ` [PATCH 11/11] mt76: mt7915: poll mib counters every 200ms greearb
@ 2021-11-18 17:01 ` Ryder Lee
0 siblings, 0 replies; 20+ messages in thread
From: Ryder Lee @ 2021-11-18 17:01 UTC (permalink / raw)
To: greearb, linux-wireless
On Thu, 2021-11-18 at 08:40 -0800, greearb@candelatech.com wrote:
> From: Ben Greear <greearb@candelatech.com>
>
> Instead of every 500ms, this will do better job of catching wraps
> of 16-bit pkt counters.
>
> Signed-off-by: Ben Greear <greearb@candelatech.com>
> ---
> drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> index 3c89c7573015..7cfa6b2abda5 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> @@ -2390,7 +2390,11 @@ void mt7915_mac_work(struct work_struct *work)
> mutex_lock(&mphy->dev->mutex);
>
> mt76_update_survey(mphy);
> - if (++mphy->mac_work_count == 5) {
> +
> + /* this method is called about every 100ms. Some pkt counters
> are 16-bit,
> + * so poll every 200ms to keep overflows at a minimum.
> + */
> + if (++mphy->mac_work_count == 2) {
> mphy->mac_work_count = 0;
>
> mt7915_mac_update_stats(phy);
I guess we need to do some testing on embedded platform to see it hurts
performance.
Ryder
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
` (9 preceding siblings ...)
2021-11-18 16:40 ` [PATCH 11/11] mt76: mt7915: poll mib counters every 200ms greearb
@ 2021-11-19 16:33 ` Lorenzo Bianconi
2021-11-19 16:41 ` Ben Greear
10 siblings, 1 reply; 20+ messages in thread
From: Lorenzo Bianconi @ 2021-11-19 16:33 UTC (permalink / raw)
To: greearb; +Cc: linux-wireless
[-- Attachment #1: Type: text/plain, Size: 3748 bytes --]
> From: Ben Greear <greearb@candelatech.com>
>
> This is a tricky beast to understand, so add some notes for
> next time someone is looking at this code and trying to compare
> against documents.
>
> Signed-off-by: Ben Greear <greearb@candelatech.com>
> ---
>
> txs and related patches rebased on top of 5.16
>
> .../net/wireless/mediatek/mt76/mt7915/mac.c | 23 +++++++++++++++----
> 1 file changed, 18 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> index 8e5b87af2efb..6fbd58ae9c88 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> @@ -410,6 +410,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> __le32 *rxd = (__le32 *)skb->data;
> __le32 *rxv = NULL;
> u32 mode = 0;
> + /* table "PP -> HOST / X-CPU" RX Format */
> u32 rxd0 = le32_to_cpu(rxd[0]);
> u32 rxd1 = le32_to_cpu(rxd[1]);
> u32 rxd2 = le32_to_cpu(rxd[2]);
> @@ -489,7 +490,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>
> rxd += 6;
> if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
> - u32 v0 = le32_to_cpu(rxd[0]);
> + u32 v0 = le32_to_cpu(rxd[0]); /* DW6 */
> u32 v2 = le32_to_cpu(rxd[2]);
>
> fc = cpu_to_le16(FIELD_GET(MT_RXD6_FRAME_CONTROL, v0));
> @@ -502,6 +503,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> }
>
> if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
> + /* DW10, assuming Group-4 enabled */
> u8 *data = (u8 *)rxd;
>
> if (status->flag & RX_FLAG_DECRYPTED) {
> @@ -533,6 +535,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> }
>
> if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
> + /* DW14, assuming group-1,4 */
> status->timestamp = le32_to_cpu(rxd[0]);
> status->flag |= RX_FLAG_MACTIME_START;
>
> @@ -558,18 +561,22 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
> u32 v0, v1, v2;
>
> - rxv = rxd;
> + rxv = rxd; /* DW16 assuming group 1,2,3,4 */
> rxd += 2;
> if ((u8 *)rxd - skb->data >= skb->len)
> return -EINVAL;
>
> - v0 = le32_to_cpu(rxv[0]);
> + v0 = le32_to_cpu(rxv[0]); /* DW16, P-VEC1 31:0 */
> + /* DW17, RX_RCPI copied over P-VEC 64:32 Per RX Format doc. */
This seems not so useful for everybody.
> v1 = le32_to_cpu(rxv[1]);
> - v2 = le32_to_cpu(rxv[2]);
> + v2 = le32_to_cpu(rxv[2]); /* first DW of group-5, C-RXV */
>
> if (v0 & MT_PRXV_HT_AD_CODE)
> status->enc_flags |= RX_ENC_FLAG_LDPC;
>
> + /* TODO: When group-5 is enabled, use nss (and stbc) to
> + * calculate chains properly for this particular skb.
> + */
> status->chains = mphy->antenna_mask;
> status->chain_signal[0] = to_rssi(MT_PRXV_RCPI0, v1);
> status->chain_signal[1] = to_rssi(MT_PRXV_RCPI1, v1);
> @@ -581,12 +588,18 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> if (!(status->chains & BIT(i)))
> continue;
>
> + /* TODO: Use db sum logic instead of max. */
This seems just a not for you :)
> status->signal = max(status->signal,
> status->chain_signal[i]);
> }
>
> - /* RXD Group 5 - C-RXV */
> + /* RXD Group 5 - C-RXV.
> + * Group 5 Not currently enabled for 7915 except in
> + * monitor mode.
> + * See MT_DMA_DCR0_RXD_G5_EN
> + */
> if (rxd1 & MT_RXD1_NORMAL_GROUP_5) {
> + /* See RXV document ... */
This is not so useful :)
> u8 stbc = FIELD_GET(MT_CRXV_HT_STBC, v2);
> u8 gi = FIELD_GET(MT_CRXV_HT_SHORT_GI, v2);
> bool cck = false;
> --
> 2.20.1
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing
2021-11-19 16:33 ` [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing Lorenzo Bianconi
@ 2021-11-19 16:41 ` Ben Greear
0 siblings, 0 replies; 20+ messages in thread
From: Ben Greear @ 2021-11-19 16:41 UTC (permalink / raw)
To: Lorenzo Bianconi; +Cc: linux-wireless
On 11/19/21 8:33 AM, Lorenzo Bianconi wrote:
>> From: Ben Greear <greearb@candelatech.com>
>>
>> This is a tricky beast to understand, so add some notes for
>> next time someone is looking at this code and trying to compare
>> against documents.
>>
>> Signed-off-by: Ben Greear <greearb@candelatech.com>
>> ---
>>
>> txs and related patches rebased on top of 5.16
>>
>> .../net/wireless/mediatek/mt76/mt7915/mac.c | 23 +++++++++++++++----
>> 1 file changed, 18 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
>> index 8e5b87af2efb..6fbd58ae9c88 100644
>> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
>> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
>> @@ -410,6 +410,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>> __le32 *rxd = (__le32 *)skb->data;
>> __le32 *rxv = NULL;
>> u32 mode = 0;
>> + /* table "PP -> HOST / X-CPU" RX Format */
>> u32 rxd0 = le32_to_cpu(rxd[0]);
>> u32 rxd1 = le32_to_cpu(rxd[1]);
>> u32 rxd2 = le32_to_cpu(rxd[2]);
>> @@ -489,7 +490,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>>
>> rxd += 6;
>> if (rxd1 & MT_RXD1_NORMAL_GROUP_4) {
>> - u32 v0 = le32_to_cpu(rxd[0]);
>> + u32 v0 = le32_to_cpu(rxd[0]); /* DW6 */
>> u32 v2 = le32_to_cpu(rxd[2]);
>>
>> fc = cpu_to_le16(FIELD_GET(MT_RXD6_FRAME_CONTROL, v0));
>> @@ -502,6 +503,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>> }
>>
>> if (rxd1 & MT_RXD1_NORMAL_GROUP_1) {
>> + /* DW10, assuming Group-4 enabled */
>> u8 *data = (u8 *)rxd;
>>
>> if (status->flag & RX_FLAG_DECRYPTED) {
>> @@ -533,6 +535,7 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>> }
>>
>> if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
>> + /* DW14, assuming group-1,4 */
>> status->timestamp = le32_to_cpu(rxd[0]);
>> status->flag |= RX_FLAG_MACTIME_START;
>>
>> @@ -558,18 +561,22 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>> if (rxd1 & MT_RXD1_NORMAL_GROUP_3) {
>> u32 v0, v1, v2;
>>
>> - rxv = rxd;
>> + rxv = rxd; /* DW16 assuming group 1,2,3,4 */
>> rxd += 2;
>> if ((u8 *)rxd - skb->data >= skb->len)
>> return -EINVAL;
>>
>> - v0 = le32_to_cpu(rxv[0]);
>> + v0 = le32_to_cpu(rxv[0]); /* DW16, P-VEC1 31:0 */
>> + /* DW17, RX_RCPI copied over P-VEC 64:32 Per RX Format doc. */
>
> This seems not so useful for everybody.
It was put in for folks doing dev work on this driver, so just a handful
of people in the whole world. It doesn't need to be useful for lots
of people.
>
>> v1 = le32_to_cpu(rxv[1]);
>> - v2 = le32_to_cpu(rxv[2]);
>> + v2 = le32_to_cpu(rxv[2]); /* first DW of group-5, C-RXV */
>>
>> if (v0 & MT_PRXV_HT_AD_CODE)
>> status->enc_flags |= RX_ENC_FLAG_LDPC;
>>
>> + /* TODO: When group-5 is enabled, use nss (and stbc) to
>> + * calculate chains properly for this particular skb.
>> + */
>> status->chains = mphy->antenna_mask;
>> status->chain_signal[0] = to_rssi(MT_PRXV_RCPI0, v1);
>> status->chain_signal[1] = to_rssi(MT_PRXV_RCPI1, v1);
>> @@ -581,12 +588,18 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
>> if (!(status->chains & BIT(i)))
>> continue;
>>
>> + /* TODO: Use db sum logic instead of max. */
>
> This seems just a not for you :)
Anyone wanting proper RSSI. The current implementation is wrong
and could be off by as much as 6db on a 4x4 radio.
I will fix it eventually if no one beats me to it.
Anyway, please apply anything you think is helpful, leave out
the rest.
Thanks,
Ben
--
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc http://www.candelatech.com
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 04/11] mt76: mt7915: use nss for calculating rx-chains
2021-11-18 16:40 ` [PATCH 04/11] mt76: mt7915: use nss for calculating rx-chains greearb
@ 2021-12-03 9:16 ` Felix Fietkau
2021-12-03 15:33 ` Ben Greear
0 siblings, 1 reply; 20+ messages in thread
From: Felix Fietkau @ 2021-12-03 9:16 UTC (permalink / raw)
To: greearb, linux-wireless
On 2021-11-18 17:40, greearb@candelatech.com wrote:
> From: Ben Greear <greearb@candelatech.com>
>
> When group-5 is enabled, we can find the actuall NSS used.
> In that case, update the rx chains info so that the upper
> stack can give better idea of actual antenna usage.
>
> Signed-off-by: Ben Greear <greearb@candelatech.com>
I'm not sure this is correct. From my understanding, nss does not
determine which antennas (and how many of them) are involved in
receiving the signal.
- Felix
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 04/11] mt76: mt7915: use nss for calculating rx-chains
2021-12-03 9:16 ` Felix Fietkau
@ 2021-12-03 15:33 ` Ben Greear
0 siblings, 0 replies; 20+ messages in thread
From: Ben Greear @ 2021-12-03 15:33 UTC (permalink / raw)
To: Felix Fietkau, linux-wireless
On 12/3/21 1:16 AM, Felix Fietkau wrote:
> On 2021-11-18 17:40, greearb@candelatech.com wrote:
>> From: Ben Greear <greearb@candelatech.com>
>>
>> When group-5 is enabled, we can find the actuall NSS used.
>> In that case, update the rx chains info so that the upper
>> stack can give better idea of actual antenna usage.
>>
>> Signed-off-by: Ben Greear <greearb@candelatech.com>
> I'm not sure this is correct. From my understanding, nss does not determine which antennas (and how many of them) are involved in receiving the signal.
>
> - Felix
>
I guess this would take some special knowledge of this chip and how firmware reports
the descriptor to know for sure.
Ath10k at least acts similar to how I wrote this patch....
Thanks,
Ben
--
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc http://www.candelatech.com
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 03/11] mt76: mt7915: support enabling rx group-5 status
2021-11-18 16:40 ` [PATCH 03/11] mt76: mt7915: support enabling rx group-5 status greearb
@ 2022-01-04 10:39 ` Lorenzo Bianconi
0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2022-01-04 10:39 UTC (permalink / raw)
To: greearb; +Cc: linux-wireless
[-- Attachment #1: Type: text/plain, Size: 6202 bytes --]
> From: Ben Greear <greearb@candelatech.com>
>
> When enabled, this allows per-skb rx rate reporting.
> Enabling this may degrade RX performance, so it remains
> disabled by default.
>
> Signed-off-by: Ben Greear <greearb@candelatech.com>
> ---
> .../wireless/mediatek/mt76/mt7915/debugfs.c | 33 +++++++++++++++++++
> .../net/wireless/mediatek/mt76/mt7915/init.c | 3 +-
> .../net/wireless/mediatek/mt76/mt7915/mac.c | 3 +-
> .../net/wireless/mediatek/mt76/mt7915/main.c | 3 +-
> .../wireless/mediatek/mt76/mt7915/mt7915.h | 5 +++
> 5 files changed, 44 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
> index e3f6cd18e30a..32e219a20721 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
> @@ -435,6 +435,38 @@ mt7915_txs_for_no_skb_get(void *data, u64 *val)
> DEFINE_DEBUGFS_ATTRIBUTE(fops_txs_for_no_skb, mt7915_txs_for_no_skb_get,
> mt7915_txs_for_no_skb_set, "%lld\n");
>
> +static int
> +mt7915_rx_group_5_enable_set(void *data, u64 val)
> +{
> + struct mt7915_dev *dev = data;
> +
> + mutex_lock(&dev->mt76.mutex);
> +
> + dev->rx_group_5_enable = !!val;
I think this should be added in mt7915_phy instead of in mt7915_dev since
we have MT_DMA_DCR0() for each band.
> +
> + /* Enabled if we requested enabled OR if monitor mode is enabled. */
> + mt76_rmw_field(dev, MT_DMA_DCR0(0), MT_DMA_DCR0_RXD_G5_EN,
> + dev->phy.is_monitor_mode || dev->rx_group_5_enable);
I think we do not need dev->phy.is_monitor_mode, we can check if monitor is
enabled looking at hw->conf.flag.
> + mt76_testmode_reset(dev->phy.mt76, true);
> +
> + mutex_unlock(&dev->mt76.mutex);
> +
> + return 0;
> +}
> +
> +static int
> +mt7915_rx_group_5_enable_get(void *data, u64 *val)
> +{
> + struct mt7915_dev *dev = data;
> +
> + *val = dev->rx_group_5_enable;
> +
> + return 0;
> +}
> +
> +DEFINE_DEBUGFS_ATTRIBUTE(fops_rx_group_5_enable, mt7915_rx_group_5_enable_get,
> + mt7915_rx_group_5_enable_set, "%lld\n");
> +
> static void
> mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,
> struct seq_file *file)
> @@ -786,6 +818,7 @@ int mt7915_init_debugfs(struct mt7915_phy *phy)
> debugfs_create_file("fw_util_wa", 0400, dir, dev,
> &mt7915_fw_util_wa_fops);
> debugfs_create_file("force_txs", 0600, dir, dev, &fops_txs_for_no_skb);
> + debugfs_create_file("rx_group_5_enable", 0600, dir, dev, &fops_rx_group_5_enable);
> debugfs_create_file("implicit_txbf", 0600, dir, dev,
> &fops_implicit_txbf);
> debugfs_create_file("txpower_sku", 0400, dir, phy,
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
> index 90aa62c64f3e..58a0ce72b714 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
> @@ -391,7 +391,8 @@ mt7915_mac_init_band(struct mt7915_dev *dev, u8 band)
>
> mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_MAX_RX_LEN, 0x680);
> /* disable rx rate report by default due to hw issues */
> - mt76_clear(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN);
> + mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN,
> + dev->phy.is_monitor_mode || dev->rx_group_5_enable);
> }
>
> static void mt7915_mac_init(struct mt7915_dev *dev)
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> index 6fbd58ae9c88..a6bcc76dcb03 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> @@ -715,7 +715,8 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> status->flag |= RX_FLAG_8023;
> }
>
> - if (rxv && status->flag & RX_FLAG_RADIOTAP_HE) {
> + if (phy->is_monitor_mode &&
> + rxv && status->flag & RX_FLAG_RADIOTAP_HE) {
> mt7915_mac_decode_he_radiotap(skb, status, rxv, mode);
> if (status->flag & RX_FLAG_RADIOTAP_HE_MU)
> mt7915_mac_decode_he_mu_radiotap(skb, status, rxv);
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
> index 3d702dc899ba..e973b2527b34 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
> @@ -458,13 +458,14 @@ static int mt7915_config(struct ieee80211_hw *hw, u32 changed)
> if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
> bool enabled = !!(hw->conf.flags & IEEE80211_CONF_MONITOR);
>
> + phy->is_monitor_mode = enabled;
> if (!enabled)
> phy->rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
> else
> phy->rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
>
> mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN,
> - enabled);
> + phy->is_monitor_mode || dev->rx_group_5_enable);
> mt76_testmode_reset(phy->mt76, true);
> mt76_wr(dev, MT_WF_RFCR(band), phy->rxfilter);
> }
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
> index 86cd0fc8e9de..84fff60ada92 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
> @@ -209,6 +209,7 @@ struct mt7915_phy {
> struct thermal_cooling_device *cdev;
> u8 throttle_state;
> u32 throttle_temp[2]; /* 0: critical high, 1: maximum */
> + u8 is_monitor_mode; /* are we in monitor mode or not ? */
not needed
>
> u32 rxfilter;
> u64 omac_mask;
> @@ -261,6 +262,10 @@ struct mt7915_dev {
> * creation by firmware, so may be a performance drag.
> */
> bool txs_for_no_skb_enabled;
> + /* Should we enable group-5 rx descriptor logic? This may decrease RX
> + * throughput, but will give per skb rx rate information..
> + */
> + bool rx_group_5_enable;
move it in mt7915_phy
>
> struct work_struct init_work;
> struct work_struct rc_work;
> --
> 2.20.1
>
Regards,
Lorenzo
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 05/11] mt76: mt7915: ethtool group-5 rx stats information
2021-11-18 16:40 ` [PATCH 05/11] mt76: mt7915: ethtool group-5 rx stats information greearb
@ 2022-01-04 10:58 ` Lorenzo Bianconi
0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2022-01-04 10:58 UTC (permalink / raw)
To: greearb; +Cc: linux-wireless
[-- Attachment #1: Type: text/plain, Size: 2591 bytes --]
> From: Ben Greear <greearb@candelatech.com>
>
[...]
>
> msta = container_of(status->wcid, struct mt7915_sta, wcid);
> + stats = &msta->stats;
> spin_lock_bh(&dev->sta_poll_lock);
> if (list_empty(&msta->poll_list))
> list_add_tail(&msta->poll_list, &dev->sta_poll_list);
> @@ -654,8 +656,19 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
> WARN_ON_ONCE(nss > 4);
> }
>
> + if (stats) {
> + if (nss > 3)
> + stats->rx_nss[3]++;
> + else
> + stats->rx_nss[nss - 1]++;
> +
> + stats->rx_mode[mode]++;
> + }
> +
> switch (FIELD_GET(MT_CRXV_FRAME_MODE, v2)) {
> case IEEE80211_STA_RX_BW_20:
> + if (stats)
> + stats->rx_bw_20++;
> break;
> case IEEE80211_STA_RX_BW_40:
> if (mode & MT_PHY_TYPE_HE_EXT_SU &&
> @@ -663,14 +676,24 @@ mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
after mt7916 support, I guess this patch must be rebased
Regards,
Lorenzo
> status->bw = RATE_INFO_BW_HE_RU;
> status->he_ru =
> NL80211_RATE_INFO_HE_RU_ALLOC_106;
> + if (stats) {
> + stats->rx_bw_he_ru++;
> + stats->rx_ru_106++;
> + }
> } else {
> status->bw = RATE_INFO_BW_40;
> + if (stats)
> + stats->rx_bw_40++;
> }
> break;
> case IEEE80211_STA_RX_BW_80:
> status->bw = RATE_INFO_BW_80;
> + if (stats)
> + stats->rx_bw_80++;
> break;
> case IEEE80211_STA_RX_BW_160:
> + if (stats)
> + stats->rx_bw_160++;
> status->bw = RATE_INFO_BW_160;
> break;
> default:
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
> index e973b2527b34..bfc81e008f86 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
> @@ -1170,6 +1170,27 @@ static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = {
> "v_tx_mcs_9",
> "v_tx_mcs_10",
> "v_tx_mcs_11",
> +
> + /* per-vif rx counters */
> + "v_rx_nss1",
> + "v_rx_nss2",
> + "v_rx_nss3",
> + "v_rx_nss4",
> + "v_rx_mode_cck",
> + "v_rx_mode_ofdm",
> + "v_rx_mode_ht",
> + "v_rx_mode_ht_gf",
> + "v_rx_mode_vht",
> + "v_rx_mode_he_su",
> + "v_rx_mode_he_ext_su",
> + "v_rx_mode_he_tb",
> + "v_rx_mode_he_mu",
> + "v_rx_bw_20",
> + "v_rx_bw_40",
> + "v_rx_bw_80",
> + "v_rx_bw_160",
> + "v_rx_bw_he_ru",
> + "v_rx_ru_106",
> };
>
> #define MT7915_SSTATS_LEN ARRAY_SIZE(mt7915_gstrings_stats)
> --
> 2.20.1
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 07/11] mt76: mt7915: fix rate rix and flags in txs path
2021-11-18 16:40 ` [PATCH 07/11] mt76: mt7915: fix rate rix and flags in txs path greearb
@ 2022-01-04 11:15 ` Lorenzo Bianconi
0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2022-01-04 11:15 UTC (permalink / raw)
To: greearb; +Cc: linux-wireless
[-- Attachment #1: Type: text/plain, Size: 3029 bytes --]
> From: Ben Greear <greearb@candelatech.com>
>
> Do not initialize rix to -1, build the rix and set flags
> based on the mcs, nss, and mode.
>
> Signed-off-by: Ben Greear <greearb@candelatech.com>
> ---
> drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 16 +++++++++++++---
> 1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> index edf33540658e..300928edd0d7 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
> @@ -1571,7 +1571,7 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
> struct ieee80211_supported_band *sband;
> struct mt76_dev *mdev = &dev->mt76;
> struct mt76_phy *mphy;
> - struct ieee80211_tx_info *info;
> + struct ieee80211_tx_info *info = NULL;
> struct sk_buff_head list;
> struct rate_info rate = {};
> struct sk_buff *skb = NULL;
> @@ -1596,8 +1596,6 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
> info->status.ampdu_len = 1;
> info->status.ampdu_ack_len = !!(info->flags &
> IEEE80211_TX_STAT_ACK);
> -
> - info->status.rates[0].idx = -1;
> }
>
> txrate = FIELD_GET(MT_TXS0_TX_RATE, txs);
> @@ -1627,6 +1625,8 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
>
> rate.mcs = mt76_get_rate(mphy->dev, sband, rate.mcs, cck);
> rate.legacy = sband->bitrates[rate.mcs].bitrate;
> + if (info)
> + info->status.rates[0].idx = rate.mcs;
can it be NULL?
> break;
> case MT_PHY_TYPE_HT:
> case MT_PHY_TYPE_HT_GF:
> @@ -1637,6 +1637,10 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
> rate.flags = RATE_INFO_FLAGS_MCS;
> if (wcid->rate_short_gi)
> rate.flags |= RATE_INFO_FLAGS_SHORT_GI;
> + if (info) {
> + info->status.rates[0].idx = rate.mcs + rate.nss * 8;
> + info->status.rates[0].flags |= IEEE80211_TX_RC_MCS;
> + }
> break;
> case MT_PHY_TYPE_VHT:
> if (rate.mcs > 9)
> @@ -1645,6 +1649,10 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
> rate.flags = RATE_INFO_FLAGS_VHT_MCS;
> if (wcid->rate_short_gi)
> rate.flags |= RATE_INFO_FLAGS_SHORT_GI;
> + if (info) {
> + info->status.rates[0].idx = (rate.nss << 4) | rate.mcs;
ieee80211_rate_set_vht()
> + info->status.rates[0].flags |= IEEE80211_TX_RC_VHT_MCS;
> + }
> break;
> case MT_PHY_TYPE_HE_SU:
> case MT_PHY_TYPE_HE_EXT_SU:
> @@ -1656,6 +1664,8 @@ mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid,
> rate.he_gi = wcid->rate_he_gi;
> rate.he_dcm = FIELD_GET(MT_TX_RATE_DCM, txrate);
> rate.flags = RATE_INFO_FLAGS_HE_MCS;
> + if (info)
> + info->status.rates[0].idx = (rate.nss << 4) | rate.mcs;
> break;
> default:
> WARN_ON_ONCE(true);
> --
> 2.20.1
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2022-01-04 11:16 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-18 16:40 [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing greearb
2021-11-18 16:40 ` [PATCH 02/11] mt76: mt7915: print out hw revision greearb
2021-11-18 16:59 ` Ryder Lee
2021-11-18 16:40 ` [PATCH 03/11] mt76: mt7915: support enabling rx group-5 status greearb
2022-01-04 10:39 ` Lorenzo Bianconi
2021-11-18 16:40 ` [PATCH 04/11] mt76: mt7915: use nss for calculating rx-chains greearb
2021-12-03 9:16 ` Felix Fietkau
2021-12-03 15:33 ` Ben Greear
2021-11-18 16:40 ` [PATCH 05/11] mt76: mt7915: ethtool group-5 rx stats information greearb
2022-01-04 10:58 ` Lorenzo Bianconi
2021-11-18 16:40 ` [PATCH 06/11] mt76: mt7915: ethtool counters for driver rx path greearb
2021-11-18 16:40 ` [PATCH 07/11] mt76: mt7915: fix rate rix and flags in txs path greearb
2022-01-04 11:15 ` Lorenzo Bianconi
2021-11-18 16:40 ` [PATCH 08/11] mt76: mt7915: add ethtool tx/rx pkts/bytes greearb
2021-11-18 16:40 ` [PATCH 09/11] mt76: mt7915: add rx-ppdu-size-out-of-range ethtool counter greearb
2021-11-18 16:40 ` [PATCH 10/11] mt76: mt7915: ethtool and mib rx stats greearb
2021-11-18 16:40 ` [PATCH 11/11] mt76: mt7915: poll mib counters every 200ms greearb
2021-11-18 17:01 ` Ryder Lee
2021-11-19 16:33 ` [PATCH 01/11] mt76: mt7915: add comments about rx descriptor parsing Lorenzo Bianconi
2021-11-19 16:41 ` Ben Greear
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).