From: greearb@candelatech.com
To: linux-wireless@vger.kernel.org
Cc: Ben Greear <greearb@candelatech.com>
Subject: [PATCH v2 3/6] wifi: mt76: mt7915: Support setting aid when in monitor mode.
Date: Thu, 4 May 2023 17:05:40 -0700 [thread overview]
Message-ID: <20230505000543.693532-3-greearb@candelatech.com> (raw)
In-Reply-To: <20230505000543.693532-1-greearb@candelatech.com>
From: Ben Greear <greearb@candelatech.com>
The parser expects values in hex.
Syntax: aid color uldl enables
The enables value is a set of flags to enable any/all of the
aid, color, and/or uldl (in that order).
options. For uldl, 0x1 means upload.
Example, capture aid 11:
echo "b 0 0 1" > /debug/ieee80211/phy0/mt76/he_sniffer_params
Note that you must also enable the group-5 fields in the rx-status
header for he-trig (and he-mu) to show up properly in a packet
capture.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
.../wireless/mediatek/mt76/mt7915/debugfs.c | 60 +++++++++++++++++++
.../net/wireless/mediatek/mt76/mt7915/main.c | 35 +++++++++++
.../wireless/mediatek/mt76/mt7915/mt7915.h | 10 ++++
.../net/wireless/mediatek/mt76/mt7915/regs.h | 9 +++
4 files changed, 114 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
index 879884ead660..f9d539bb9077 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
@@ -247,6 +247,64 @@ mt7915_muru_debug_get(void *data, u64 *val)
DEFINE_DEBUGFS_ATTRIBUTE(fops_muru_debug, mt7915_muru_debug_get,
mt7915_muru_debug_set, "%lld\n");
+static ssize_t
+mt7915_he_monitor_set(struct file *file, const char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ struct mt7915_phy *phy = file->private_data;
+ char buf[64] = {0};
+ u32 aid, bss_color, uldl, enables;
+ int ret;
+ struct mt7915_dev *dev = phy->dev;
+
+ if (count >= sizeof(buf))
+ return -EINVAL;
+
+ if (copy_from_user(buf, user_buf, count))
+ return -EFAULT;
+
+ ret = sscanf(buf, "%x %x %x %x",
+ &aid, &bss_color, &uldl, &enables);
+ if (ret != 4)
+ return -EINVAL;
+
+ phy->monitor.cur_aid = aid;
+ phy->monitor.cur_color = bss_color;
+ phy->monitor.cur_uldl = uldl;
+ phy->monitor.cur_enables = enables;
+
+ mutex_lock(&dev->mt76.mutex);
+ mt7915_check_apply_monitor_config(phy);
+ mutex_unlock(&dev->mt76.mutex);
+
+ return count;
+}
+
+static ssize_t
+mt7915_he_monitor_get(struct file *file, char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ struct mt7915_phy *phy = file->private_data;
+ u8 buf[32];
+ int len;
+
+ len = scnprintf(buf, sizeof(buf),
+ "aid: 0x%x bss-color: 0x%x uldl: 0x%x enables: 0x%x\n"
+ " ULDL: 0 is download, 1 is upload\n"
+ " Enable-bits: 1: AID 2: Color 4: ULDL\n",
+ phy->monitor.cur_aid, phy->monitor.cur_color,
+ phy->monitor.cur_uldl, phy->monitor.cur_enables);
+
+ return simple_read_from_buffer(user_buf, count, ppos, buf, len);
+}
+
+static const struct file_operations mt7915_he_sniffer_ops = {
+ .write = mt7915_he_monitor_set,
+ .read = mt7915_he_monitor_get,
+ .open = simple_open,
+ .llseek = default_llseek,
+};
+
static int mt7915_muru_stats_show(struct seq_file *file, void *data)
{
struct mt7915_phy *phy = file->private;
@@ -1230,6 +1288,8 @@ int mt7915_init_debugfs(struct mt7915_phy *phy)
debugfs_create_file("tx_stats", 0400, dir, phy, &mt7915_tx_stats_fops);
debugfs_create_file("sys_recovery", 0600, dir, phy,
&mt7915_sys_recovery_ops);
+ debugfs_create_file("he_sniffer_params", 0600, dir, phy,
+ &mt7915_he_sniffer_ops);
debugfs_create_file("fw_debug_wm", 0600, dir, dev, &fops_fw_debug_wm);
debugfs_create_file("fw_debug_wa", 0600, dir, dev, &fops_fw_debug_wa);
debugfs_create_file("fw_debug_bin", 0600, dir, dev, &fops_fw_debug_bin);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index 4264ee117e07..f38e4cb4504c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -516,6 +516,40 @@ mt7915_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
return 0;
}
+void mt7915_check_apply_monitor_config(struct mt7915_phy *phy)
+{
+ /* I first thought that this would not work well when combined
+ * with STA mode, but now I think it will not matter since it appears
+ * the HEMU rule 1 is only used after normal HE MU operations
+ * have happened. --Ben
+ */
+ struct mt7915_dev *dev = phy->dev;
+ u32 reg = mt76_rr(dev, MT_WF_HEMU_RULE1);
+
+ reg &= ~(MT_WF_HEMU_RULE1_AID |
+ MT_WF_HEMU_RULE1_COLOR |
+ MT_WF_HEMU_RULE1_ULDL |
+ MT_WF_HEMU_RULE1_AID_ENABLE |
+ MT_WF_HEMU_RULE1_BSS_COLOR_ENABLE |
+ MT_WF_HEMU_RULE1_ULDL_ENABLE |
+ MT_WF_HEMU_RULE1_PRIORITY);
+ reg |= phy->monitor.cur_aid;
+ reg |= (phy->monitor.cur_color << 10) & 0x3f;
+ if (phy->monitor.cur_uldl)
+ reg |= MT_WF_HEMU_RULE1_ULDL;
+ if (phy->monitor.cur_enables) {
+ if (phy->monitor.cur_enables & 0x1)
+ reg |= MT_WF_HEMU_RULE1_AID_ENABLE;
+ if (phy->monitor.cur_enables & 0x2)
+ reg |= MT_WF_HEMU_RULE1_BSS_COLOR_ENABLE;
+ if (phy->monitor.cur_enables & 0x4)
+ reg |= MT_WF_HEMU_RULE1_ULDL_ENABLE;
+ reg |= MT_WF_HEMU_RULE1_PRIORITY; /* set priority to 7 */
+ }
+
+ mt76_wr(dev, MT_WF_HEMU_RULE1, reg);
+}
+
static void __mt7915_configure_filter(struct ieee80211_hw *hw,
unsigned int changed_flags,
unsigned int *total_flags,
@@ -575,6 +609,7 @@ static void __mt7915_configure_filter(struct ieee80211_hw *hw,
mt76_clear(dev, MT_WF_RFCR1(band), ctl_flags);
mt76_set(dev, MT_WF_RMAC_TOP_TF_PARSER(band),
MT_WF_RMAC_TOP_TF_SNIFFER);
+ mt7915_check_apply_monitor_config(phy);
} else {
mt76_set(dev, MT_WF_RFCR1(band), ctl_flags);
mt76_clear(dev, MT_WF_RMAC_TOP_TF_PARSER(band),
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
index 06f98e5cd95e..0ed041813d95 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
@@ -242,6 +242,15 @@ struct mt7915_phy {
struct ieee80211_sband_iftype_data iftype[NUM_NL80211_BANDS][NUM_NL80211_IFTYPES];
struct ieee80211_vif *monitor_vif;
+ struct {
+ u16 cur_aid; /* aid to be used in monitor mode to capture HE trigger frames */
+ /* bss-color to be used in monitor mode to capture HE trigger frames */
+ u8 cur_color;
+ /* upload/download to be used in monitor mode to capture HE trigger frames */
+ u8 cur_uldl;
+ /* Specifies which of the above are used: 0x1 is AID, 0x2 is color, 0x4 is uldl */
+ u8 cur_enables;
+ } monitor;
struct thermal_cooling_device *cdev;
u32 mac80211_rxfilter_flags;
@@ -628,6 +637,7 @@ int mt7915_mcu_muru_debug_set(struct mt7915_dev *dev, bool enable);
int mt7915_mcu_muru_debug_get(struct mt7915_phy *phy, void *ms);
int mt7915_mcu_wed_enable_rx_stats(struct mt7915_dev *dev);
int mt7915_init_debugfs(struct mt7915_phy *phy);
+void mt7915_check_apply_monitor_config(struct mt7915_phy *phy);
void mt7915_debugfs_rx_fw_monitor(struct mt7915_dev *dev, const void *data, int len);
bool mt7915_debugfs_rx_log(struct mt7915_dev *dev, const void *data, int len);
#ifdef CONFIG_MAC80211_DEBUGFS
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
index 0118fdaa96b3..252e5f1405cf 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/regs.h
@@ -1217,4 +1217,13 @@ enum offs_rev {
#define MT_MCU_WM_CIRQ_EINT_MASK_CLR_ADDR MT_MCU_WM_CIRQ(0x108)
#define MT_MCU_WM_CIRQ_EINT_SOFT_ADDR MT_MCU_WM_CIRQ(0x118)
+#define MT_WF_HEMU_RULE1 (MT_WF_PHY_BASE + 0x10e0)
+#define MT_WF_HEMU_RULE1_AID GENMASK(10, 0)
+#define MT_WF_HEMU_RULE1_COLOR GENMASK(21, 16)
+#define MT_WF_HEMU_RULE1_ULDL (BIT(22)) /* 0 dl, 1 ul */
+#define MT_WF_HEMU_RULE1_AID_ENABLE (BIT(24))
+#define MT_WF_HEMU_RULE1_BSS_COLOR_ENABLE (BIT(25))
+#define MT_WF_HEMU_RULE1_ULDL_ENABLE (BIT(26))
+#define MT_WF_HEMU_RULE1_PRIORITY GENMASK(30, 28) /* 0 disable, 7 is highest */
+
#endif
--
2.40.0
next prev parent reply other threads:[~2023-05-05 0:05 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-05 0:05 [PATCH v2 1/6] wifi: mt76: mt7915: Support vht mu-mimo sniffer feature greearb
2023-05-05 0:05 ` [PATCH v2 2/6] wifi: mt76: mt7915: Move rxfilter logic into central location greearb
2023-05-05 0:05 ` greearb [this message]
2023-05-05 0:05 ` [PATCH v2 4/6] wifi: mt76: mt7915: Adjust MDP_RCFR1 in monitor mode greearb
2023-05-05 0:05 ` [PATCH v2 5/6] wifi: mt76: mt7915: support enabling rx group-5 status greearb
2023-05-05 0:05 ` [PATCH v2 6/6] wifi: mt76: mt7915: Improve monitor-mode flags settings greearb
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230505000543.693532-3-greearb@candelatech.com \
--to=greearb@candelatech.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.