From: Sean Wang <sean.wang@kernel.org>
To: nbd@nbd.name, lorenzo.bianconi@redhat.com
Cc: linux-wireless@vger.kernel.org,
linux-mediatek@lists.infradead.org, yu-ching.liu@mediatek.com,
jenhao.yang@mediatek.com, posh.sun@mediatek.com,
Sean Wang <sean.wang@mediatek.com>
Subject: [PATCH 08/15] wifi: mt76: mt7925: share TLV setup for NAN enable command
Date: Mon, 24 Aug 2026 14:52:20 -0500 [thread overview]
Message-ID: <20260824195227.12589-9-sean.wang@kernel.org> (raw)
In-Reply-To: <20260824195227.12589-1-sean.wang@kernel.org>
From: Stella Liu <yu-ching.liu@mediatek.com>
Refactor mt7925_nan_enable() to build the MCU command from separate
TLVs via skb instead of inline fields in the enable request struct.
The cluster ID, DW interval, discovery beacon interval and RSSI
threshold settings are now shared with mt7925_nan_change_configure()
through the common TLV helpers, avoiding duplicated setup code.
Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Stella Liu <yu-ching.liu@mediatek.com>
---
.../net/wireless/mediatek/mt76/mt7925/nan.c | 190 +++++++-----------
.../net/wireless/mediatek/mt76/mt7925/nan.h | 6 +
2 files changed, 77 insertions(+), 119 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/nan.c b/drivers/net/wireless/mediatek/mt76/mt7925/nan.c
index e6d6af4fc681..527cdb3a4ed7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/nan.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/nan.c
@@ -42,63 +42,6 @@ static void mt7925_nan_set_5g_channel(struct mt792x_dev *dev,
req->channel_5g_val = cpu_to_le32(ch5g);
}
-static void mt7925_nan_set_cluster_id(struct mt7925_nan_enable_req_tlv *req,
- const u8 *cluster_id)
-{
- if (!cluster_id)
- return;
-
- req->cluster_high = cpu_to_le16(cluster_id[4] | cluster_id[5] << 8);
- req->cluster_low = cpu_to_le16((u16)cluster_id[3]);
-}
-
-static void mt7925_nan_set_dw_interval(struct mt7925_nan_enable_req_tlv *req,
- struct cfg80211_nan_conf *conf)
-{
- if (conf->band_cfgs[NL80211_BAND_2GHZ].awake_dw_interval > 0) {
- req->config_dw.config_2dot4g_dw_band = 1;
- req->config_dw.dw_2dot4g_interval_val =
- cpu_to_le32(conf->band_cfgs[NL80211_BAND_2GHZ].awake_dw_interval);
- }
-
- if (conf->band_cfgs[NL80211_BAND_5GHZ].awake_dw_interval > 0) {
- req->config_dw.config_5g_dw_band = 1;
- req->config_dw.dw_5g_interval_val =
- cpu_to_le32(conf->band_cfgs[NL80211_BAND_5GHZ].awake_dw_interval);
- }
-}
-
-static void mt7925_nan_set_disc_beacon(struct mt7925_nan_enable_req_tlv *req,
- struct cfg80211_nan_conf *conf)
-{
- if (conf->discovery_beacon_interval > 0) {
- req->config_2dot4g_beacons = true;
- req->beacon_2dot4g_val = conf->discovery_beacon_interval;
- }
-}
-
-static void mt7925_nan_set_rssi_thresholds(struct mt7925_nan_enable_req_tlv *req,
- struct cfg80211_nan_conf *conf)
-{
- if (conf->band_cfgs[NL80211_BAND_2GHZ].chan) {
- req->config_2dot4g_rssi_close = 1;
- req->rssi_close_2dot4g_val =
- abs(conf->band_cfgs[NL80211_BAND_2GHZ].rssi_close);
- req->config_2dot4g_rssi_middle = 1;
- req->rssi_middle_2dot4g_val =
- abs(conf->band_cfgs[NL80211_BAND_2GHZ].rssi_middle);
- }
-
- if (conf->band_cfgs[NL80211_BAND_5GHZ].chan) {
- req->config_5g_rssi_close = 1;
- req->rssi_close_5g_val =
- abs(conf->band_cfgs[NL80211_BAND_5GHZ].rssi_close);
- req->config_5g_rssi_middle = 1;
- req->rssi_middle_5g_val =
- abs(conf->band_cfgs[NL80211_BAND_5GHZ].rssi_middle);
- }
-}
-
static void mt7925_nan_set_scan_params(struct mt7925_nan_enable_req_tlv *req,
struct cfg80211_nan_conf *conf)
{
@@ -132,68 +75,6 @@ mt7925_nan_update_conf(struct mt792x_vif *mvif,
memcpy(mvif->nan.conf.cluster_id, conf->cluster_id, ETH_ALEN);
}
-int mt7925_nan_enable(struct ieee80211_vif *vif,
- struct mt792x_dev *dev,
- struct cfg80211_nan_conf *conf)
-{
- struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
- struct mt76_dev *mdev = &dev->mt76;
- struct {
- u8 rsv[4];
- struct mt7925_nan_enable_req_tlv nan_req_tlv;
- } nan_cmd = {
- .rsv = { 0 },
- .nan_req_tlv = {
- .tag = cpu_to_le16(NAN_UNI_CMD_ENABLE_REQUEST),
- .len = cpu_to_le16(sizeof(struct mt7925_nan_enable_req_tlv)),
- .config_random_factor_force = 0,
- .random_factor_force_val = 0,
- .config_hop_count_force = 0,
- .hop_count_force_val = 0,
- },
- };
- struct mt7925_nan_enable_req_tlv *p_nan_req_tlv = &nan_cmd.nan_req_tlv;
- int ret;
-
- if (!vif || !dev || !conf)
- return -EINVAL;
-
- p_nan_req_tlv->master_pref = conf->master_pref;
-
- mt7925_nan_set_5g_channel(dev, p_nan_req_tlv, conf);
- mt7925_nan_set_cluster_id(p_nan_req_tlv, conf->cluster_id);
- mt7925_nan_set_dw_interval(p_nan_req_tlv, conf);
- mt7925_nan_set_disc_beacon(p_nan_req_tlv, conf);
- mt7925_nan_set_rssi_thresholds(p_nan_req_tlv, conf);
- mt7925_nan_set_scan_params(p_nan_req_tlv, conf);
-
- mt7925_nan_update_conf(mvif, conf);
-
- ret = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(NAN), &nan_cmd, sizeof(nan_cmd), true);
-
- return ret;
-}
-
-int mt7925_nan_disable(struct ieee80211_vif *vif, struct mt792x_dev *dev)
-{
- struct mt76_dev *mdev = &dev->mt76;
- struct {
- u8 rsv[4];
- struct tlv nan_dis_tlv;
- } nan_cmd = {
- .rsv = { 0 },
- .nan_dis_tlv = {
- .tag = cpu_to_le16(NAN_UNI_CMD_DISABLE_REQUEST),
- .len = cpu_to_le16(sizeof(struct tlv)),
- },
- };
-
- if (!dev)
- return -EINVAL;
-
- return mt76_mcu_send_msg(mdev, MCU_UNI_CMD(NAN), &nan_cmd, sizeof(nan_cmd), true);
-}
-
static int
mt7925_nan_mp_tlv(struct sk_buff *skb, u8 master_pref)
{
@@ -312,6 +193,77 @@ mt7925_nan_sync_rssi_tlv(struct sk_buff *skb, struct cfg80211_nan_conf *conf)
return 0;
}
+int mt7925_nan_enable(struct ieee80211_vif *vif,
+ struct mt792x_dev *dev,
+ struct cfg80211_nan_conf *conf)
+{
+ struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
+ struct mt76_dev *mdev = &dev->mt76;
+ struct mt7925_nan_common_hdr *hdr;
+ struct mt7925_nan_enable_req_tlv *req;
+ struct sk_buff *skb;
+
+ if (!vif || !dev || !conf)
+ return -EINVAL;
+
+ skb = mt76_mcu_msg_alloc(mdev, NULL, MT7925_NAN_ENABLE_MAX_SIZE);
+ if (!skb)
+ return -ENOMEM;
+
+ hdr = (struct mt7925_nan_common_hdr *)skb_put(skb, sizeof(*hdr));
+ memset(hdr, 0, sizeof(*hdr));
+
+ /* Set cluster id before joining cluster */
+ if (mt7925_nan_cluster_id_tlv(skb, conf->cluster_id)) {
+ dev_kfree_skb(skb);
+ return -ENOMEM;
+ }
+
+ /* NAN enable request tlv */
+ req = (struct mt7925_nan_enable_req_tlv *)
+ mt76_connac_mcu_add_tlv(skb, NAN_UNI_CMD_ENABLE_REQUEST,
+ sizeof(*req));
+ if (!req) {
+ dev_kfree_skb(skb);
+ return -ENOMEM;
+ }
+
+ req->master_pref = conf->master_pref;
+
+ mt7925_nan_set_5g_channel(dev, req, conf);
+ mt7925_nan_set_scan_params(req, conf);
+
+ if (mt7925_nan_dw_tlv(skb, conf) ||
+ mt7925_nan_sync_rssi_tlv(skb, conf)) {
+ dev_kfree_skb(skb);
+ return -ENOMEM;
+ }
+
+ mt7925_nan_update_conf(mvif, conf);
+
+ return mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(NAN), true);
+}
+
+int mt7925_nan_disable(struct ieee80211_vif *vif, struct mt792x_dev *dev)
+{
+ struct mt76_dev *mdev = &dev->mt76;
+ struct {
+ u8 rsv[4];
+ struct tlv nan_dis_tlv;
+ } nan_cmd = {
+ .rsv = { 0 },
+ .nan_dis_tlv = {
+ .tag = cpu_to_le16(NAN_UNI_CMD_DISABLE_REQUEST),
+ .len = cpu_to_le16(sizeof(struct tlv)),
+ },
+ };
+
+ if (!dev)
+ return -EINVAL;
+
+ return mt76_mcu_send_msg(mdev, MCU_UNI_CMD(NAN), &nan_cmd, sizeof(nan_cmd), true);
+}
+
int mt7925_nan_change_configure(struct ieee80211_vif *vif,
struct mt792x_dev *dev,
struct cfg80211_nan_conf *conf)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/nan.h b/drivers/net/wireless/mediatek/mt76/mt7925/nan.h
index fab10b829eaa..8ddb0a6d73b5 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/nan.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/nan.h
@@ -28,6 +28,12 @@
#define NAN_MAX_CONN_CFG 8
#define NAN_MAX_NDP_CXT 4
+#define MT7925_NAN_ENABLE_MAX_SIZE \
+ (sizeof(struct mt7925_nan_common_hdr) + \
+ sizeof(struct mt7925_nan_enable_req_tlv) + \
+ sizeof(struct mt7925_nan_dw_interval_tlv) + \
+ sizeof(struct mt7925_nan_cluster_id_tlv) + \
+ sizeof(struct mt7925_nan_sync_rssi_tlv))
#define MT7925_NAN_CONF_MAX_SIZE \
(sizeof(struct mt7925_nan_common_hdr) + \
sizeof(struct mt7925_nan_master_preference_tlv) + \
--
2.43.0
next prev parent reply other threads:[~2026-08-24 19:53 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-24 19:52 [PATCH 00/15] wifi: mt76: mt7925: fix NAN operation and NDP performance Sean Wang
2026-08-24 19:52 ` [PATCH 01/15] wifi: mt76: mt7925: fix NAN NDP STA record role index Sean Wang
2026-08-24 19:52 ` [PATCH 02/15] wifi: mt76: mt7925: fix NAN start failure Sean Wang
2026-08-24 19:52 ` [PATCH 03/15] wifi: mt76: mt7925: fix NAN committed CRB timeline layout Sean Wang
2026-08-24 19:52 ` [PATCH 04/15] wifi: mt76: mt7925: report only 2.4 GHz NAN supported band Sean Wang
2026-08-24 19:52 ` [PATCH 05/15] wifi: mt76: mt7925: drop unused NAN 2.4/5 GHz support config Sean Wang
2026-08-24 19:52 ` [PATCH 06/15] wifi: mt76: mt7925: drop deferred NAN local schedule update handling Sean Wang
2026-08-24 19:52 ` [PATCH 07/15] wifi: mt76: mt7925: use OFDM-only PHY mode for NAN STA records Sean Wang
2026-08-24 19:52 ` Sean Wang [this message]
2026-08-24 19:52 ` [PATCH 09/15] wifi: mt76: mt7925: replace NAN DW end event with DW start Sean Wang
2026-08-24 19:52 ` [PATCH 10/15] wifi: mt76: mt7925: fill all DW intervals in NAN avail_map Sean Wang
2026-08-24 19:52 ` [PATCH 11/15] wifi: mt76: mt7925: clear CRB before deactivating NAN peer record Sean Wang
2026-08-24 19:52 ` [PATCH 12/15] wifi: mt76: mt7925: add ULW event handling and peer ULW update Sean Wang
2026-08-24 19:52 ` [PATCH 13/15] wifi: mt76: mt7925: configure NAN PHY setting on enable Sean Wang
2026-08-24 19:52 ` [PATCH 14/15] wifi: mt76: mt7925: support deferred NAN schedule update and cluster events Sean Wang
2026-08-24 19:52 ` [PATCH 15/15] wifi: mt76: mt7925: fix HT/VHT caps and rates for NAN NDP peers Sean Wang
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=20260824195227.12589-9-sean.wang@kernel.org \
--to=sean.wang@kernel.org \
--cc=jenhao.yang@mediatek.com \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-wireless@vger.kernel.org \
--cc=lorenzo.bianconi@redhat.com \
--cc=nbd@nbd.name \
--cc=posh.sun@mediatek.com \
--cc=sean.wang@mediatek.com \
--cc=yu-ching.liu@mediatek.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox