wifi: mt76: mt7925: share TLV setup for NAN enable command

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.

Fixes: a5487a682406 ("wifi: mt76: mt7925: add NAN MCU helpers")
Co-developed-by: Sean Wang <[email protected]>
Signed-off-by: Sean Wang <[email protected]>
Signed-off-by: Stella Liu <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Stella Liu
2026-08-25 11:25:29 +02:00
committed by Felix Fietkau
parent d19401e5d3
commit a81f793eaf
2 changed files with 78 additions and 119 deletions
+71 -119
View File
@@ -42,63 +42,6 @@ static void mt7925_nan_set_5g_channel(struct mt792x_dev *dev,
req->channel_5g_val = cpu_to_le32(ch5g); 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, static void mt7925_nan_set_scan_params(struct mt7925_nan_enable_req_tlv *req,
struct cfg80211_nan_conf *conf) 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); 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 static int
mt7925_nan_mp_tlv(struct sk_buff *skb, u8 master_pref) 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; 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, int mt7925_nan_change_configure(struct ieee80211_vif *vif,
struct mt792x_dev *dev, struct mt792x_dev *dev,
struct cfg80211_nan_conf *conf) struct cfg80211_nan_conf *conf)
+7
View File
@@ -28,6 +28,13 @@
#define NAN_MAX_CONN_CFG 8 #define NAN_MAX_CONN_CFG 8
#define NAN_MAX_NDP_CXT 4 #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 \ #define MT7925_NAN_CONF_MAX_SIZE \
(sizeof(struct mt7925_nan_common_hdr) + \ (sizeof(struct mt7925_nan_common_hdr) + \
sizeof(struct mt7925_nan_master_preference_tlv) + \ sizeof(struct mt7925_nan_master_preference_tlv) + \