blob: 804aa16cc1a22ef132125d8084bc11b0e7631a92 [file] [log] [blame]
developerd243af02023-12-21 14:49:33 +08001From 6dee226e8db428c4434115b4c792f7ffd8a759dd Mon Sep 17 00:00:00 2001
developer32b0e0f2023-04-11 13:34:56 +08002From: Evelyn Tsai <evelyn.tsai@mediatek.com>
3Date: Fri, 17 Mar 2023 16:17:14 +0800
developerd243af02023-12-21 14:49:33 +08004Subject: [PATCH 21/54] mtk: hostapd: Add vendor for CAPI certification
developera43cc482023-04-17 15:57:28 +08005 commands
developer32b0e0f2023-04-11 13:34:56 +08006
7---
developerd243af02023-12-21 14:49:33 +08008 hostapd/ctrl_iface.c | 99 +++++++++++++++++++++++++++++++
developer505c9432023-05-12 18:58:17 +08009 src/ap/ap_drv_ops.c | 21 +++++++
10 src/ap/ap_drv_ops.h | 3 +
developer004e50c2023-06-29 20:33:22 +080011 src/common/mtk_vendor.h | 33 +----------
developer505c9432023-05-12 18:58:17 +080012 src/drivers/driver.h | 22 +++++++
developerd243af02023-12-21 14:49:33 +080013 src/drivers/driver_nl80211.c | 55 +++++++++++++++++
developer505c9432023-05-12 18:58:17 +080014 src/drivers/driver_nl80211.h | 1 +
15 src/drivers/driver_nl80211_capa.c | 3 +
developerd243af02023-12-21 14:49:33 +080016 8 files changed, 206 insertions(+), 31 deletions(-)
developer32b0e0f2023-04-11 13:34:56 +080017
18diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
developerd243af02023-12-21 14:49:33 +080019index e45e574be..05606eb43 100644
developer32b0e0f2023-04-11 13:34:56 +080020--- a/hostapd/ctrl_iface.c
21+++ b/hostapd/ctrl_iface.c
developerdfb50982023-09-11 13:34:36 +080022@@ -69,6 +69,7 @@
developer505c9432023-05-12 18:58:17 +080023 #include "config_file.h"
developerdfb50982023-09-11 13:34:36 +080024 #include "ctrl_iface.h"
developer505c9432023-05-12 18:58:17 +080025
developer32b0e0f2023-04-11 13:34:56 +080026+#include "common/mtk_vendor.h"
developer505c9432023-05-12 18:58:17 +080027
28 #define HOSTAPD_CLI_DUP_VALUE_MAX_LEN 256
29
developerd243af02023-12-21 14:49:33 +080030@@ -3766,6 +3767,100 @@ hostapd_ctrl_iface_get_aval_color_bmp(struct hostapd_data *hapd, char *buf,
developer32b0e0f2023-04-11 13:34:56 +080031 return pos - buf;
32 }
33
34+static int
35+hostapd_ctrl_iface_ap_wireless(struct hostapd_data *hapd, char *cmd,
36+ char *buf, size_t buflen)
37+{
38+ char *pos, *value, *config = cmd;
39+ enum mtk_vendor_attr_wireless_ctrl sub_cmd;
40+
41+ pos = os_strchr(config, '=');
42+ if (pos == NULL)
43+ return -1;
44+ *pos++ = '\0';
45+
46+ if(pos == NULL)
47+ return -1;
48+ value = pos;
49+
50+ if (os_strncmp(config, "fixed_mcs", 9) == 0)
51+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_MCS;
52+ else if (os_strncmp(config, "ofdma", 5) == 0)
53+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_OFDMA;
54+ else if (os_strncmp(config, "ppdu_type", 9) == 0)
55+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE;
56+ else if (os_strncmp(config, "nusers_ofdma", 12) == 0)
57+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA;
58+ else if (os_strncmp(config, "add_ba_req_bufsize", 18) == 0)
59+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE;
60+ else if (os_strncmp(config, "mimo", 4) == 0)
61+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO;
62+ else if (os_strncmp(config, "cert", 4) == 0)
63+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT ;
developerdfb50982023-09-11 13:34:36 +080064+ else if (os_strncmp(config, "amsdu", 5) == 0)
65+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU;
developerd243af02023-12-21 14:49:33 +080066+ else if (os_strncmp(config, "rts_sigta", 9) == 0)
67+ sub_cmd = MTK_VENDOR_ATTR_WIRELESS_CTRL_RTS_SIGTA;
developer32b0e0f2023-04-11 13:34:56 +080068+ else {
69+ wpa_printf(MSG_ERROR,
70+ "Unsupported parameter %s for ap_wireless", config);
71+ return -1;
72+ }
73+
74+ if (hostapd_drv_ap_wireless(hapd, (u8) sub_cmd, atoi(value)) != 0)
75+ return -1;
76+
77+ return os_snprintf(buf, buflen, "OK\n");
78+}
79+
80+static int
81+hostapd_ctrl_iface_ap_rfeatures(struct hostapd_data *hapd, char *cmd,
82+ char *buf, size_t buflen)
83+{
84+ char *pos, *value, *type, *config = cmd;
85+ enum mtk_vendor_attr_rfeature_ctrl sub_cmd;
86+
87+ pos = os_strchr(config, '=');
88+ if (pos == NULL)
89+ return -1;
90+ *pos++ = '\0';
91+
92+ if(pos == NULL)
93+ return -1;
94+ value = pos;
95+
96+ if (os_strncmp(config, "he_gi", 5) == 0)
97+ sub_cmd = MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_GI;
98+ else if (os_strncmp(config, "he_ltf", 6) == 0)
99+ sub_cmd = MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_LTF;
100+ else if (os_strncmp(config, "trig_type", 9) == 0) {
101+ pos = os_strchr(value, ',');
102+ if (pos == NULL)
103+ return -1;
104+ *pos++ = '\0';
105+ if(pos == NULL)
106+ return -1;
107+ type = pos;
108+ goto trigtype;
109+ } else if (os_strcmp(config, "ack_policy") == 0)
110+ sub_cmd = MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY;
111+ else {
112+ wpa_printf(MSG_ERROR,
113+ "Unsupported parameter %s for ap_rfeatures", config);
114+ return -1;
115+ }
116+
117+ if (hostapd_drv_ap_rfeatures(hapd, (u8) sub_cmd, atoi(value)) != 0)
118+ return -1;
119+ goto exit;
120+
121+trigtype:
122+ if (hostapd_drv_ap_trig_type(hapd, atoi(value), atoi(type)) != 0)
123+ return -1;
124+
125+exit:
126+ return os_snprintf(buf, buflen, "OK\n");
127+}
128
129 static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
130 char *buf, char *reply,
developerd243af02023-12-21 14:49:33 +0800131@@ -4344,6 +4439,10 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd,
developer32b0e0f2023-04-11 13:34:56 +0800132 reply_len = hostapd_ctrl_iface_get_bss_color(hapd, reply, reply_size);
133 } else if (os_strncmp(buf, "AVAL_COLOR_BMP", 14) == 0) {
134 reply_len = hostapd_ctrl_iface_get_aval_color_bmp(hapd, reply, reply_size);
135+ } else if (os_strncmp(buf, "ap_wireless ", 12) == 0) {
136+ reply_len = hostapd_ctrl_iface_ap_wireless(hapd, buf + 12, reply, reply_size);
137+ } else if (os_strncmp(buf, "ap_rfeatures ", 13) == 0) {
138+ reply_len = hostapd_ctrl_iface_ap_rfeatures(hapd, buf + 13, reply, reply_size);
139 } else {
140 os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
141 reply_len = 16;
142diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
developerd243af02023-12-21 14:49:33 +0800143index 9615ca8ce..11444c7eb 100644
developer32b0e0f2023-04-11 13:34:56 +0800144--- a/src/ap/ap_drv_ops.c
145+++ b/src/ap/ap_drv_ops.c
developer8bff6472023-07-17 11:11:44 +0800146@@ -1222,3 +1222,24 @@ int hostapd_drv_get_aval_bss_color_bmp(struct hostapd_data *hapd, u64 *aval_colo
developer32b0e0f2023-04-11 13:34:56 +0800147 return 0;
148 return hapd->driver->get_aval_color_bmp(hapd->drv_priv, aval_color_bmp);
149 }
150+
151+int hostapd_drv_ap_wireless(struct hostapd_data *hapd, u8 sub_vendor_id, int value)
152+{
153+ if (!hapd->driver || !hapd->driver->ap_wireless)
154+ return 0;
155+ return hapd->driver->ap_wireless(hapd->drv_priv, sub_vendor_id, value);
156+}
157+
158+int hostapd_drv_ap_rfeatures(struct hostapd_data *hapd, u8 sub_vendor_id, int value)
159+{
160+ if (!hapd->driver || !hapd->driver->ap_rfeatures)
161+ return 0;
162+ return hapd->driver->ap_rfeatures(hapd->drv_priv, sub_vendor_id, value);
163+}
164+
165+int hostapd_drv_ap_trig_type(struct hostapd_data *hapd, u8 enable, u8 type)
166+{
167+ if (!hapd->driver || !hapd->driver->ap_trigtype)
168+ return 0;
169+ return hapd->driver->ap_trigtype(hapd->drv_priv, enable, type);
170+}
171diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
developerd243af02023-12-21 14:49:33 +0800172index ecaa71f99..32e6fc151 100644
developer32b0e0f2023-04-11 13:34:56 +0800173--- a/src/ap/ap_drv_ops.h
174+++ b/src/ap/ap_drv_ops.h
developer505c9432023-05-12 18:58:17 +0800175@@ -157,6 +157,9 @@ int hostapd_drv_amsdu_ctrl(struct hostapd_data *hapd);
developer32b0e0f2023-04-11 13:34:56 +0800176 int hostapd_drv_amsdu_dump(struct hostapd_data *hapd, u8 *amsdu);
177 int hostapd_drv_get_aval_bss_color_bmp(struct hostapd_data *hapd,
178 u64 *aval_color_bmp);
179+int hostapd_drv_ap_wireless(struct hostapd_data *hapd, u8 sub_vendor_id, int value);
180+int hostapd_drv_ap_rfeatures(struct hostapd_data *hapd, u8 sub_vendor_id, int value);
181+int hostapd_drv_ap_trig_type(struct hostapd_data *hapd, u8 enable, u8 type);
182
183 #include "drivers/driver.h"
184
185diff --git a/src/common/mtk_vendor.h b/src/common/mtk_vendor.h
developerd243af02023-12-21 14:49:33 +0800186index e27fe69b3..0b23c76ad 100644
developer32b0e0f2023-04-11 13:34:56 +0800187--- a/src/common/mtk_vendor.h
188+++ b/src/common/mtk_vendor.h
developer004e50c2023-06-29 20:33:22 +0800189@@ -50,17 +50,6 @@ enum mtk_vendor_attr_edcca_dump {
developer32b0e0f2023-04-11 13:34:56 +0800190 NUM_MTK_VENDOR_ATTRS_EDCCA_DUMP - 1
191 };
192
193-
194-static struct nla_policy edcca_ctrl_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL] = {
195- [MTK_VENDOR_ATTR_EDCCA_CTRL_MODE] = { .type = NLA_U8 },
196- [MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL] = { .type = NLA_U8 },
197- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC20_VAL] = { .type = NLA_U8 },
198- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC40_VAL] = { .type = NLA_U8 },
199- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC80_VAL] = { .type = NLA_U8 },
200- [MTK_VENDOR_ATTR_EDCCA_CTRL_COMPENSATE] = { .type = NLA_U8 },
developer004e50c2023-06-29 20:33:22 +0800201- [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC160_VAL] = { .type = NLA_U8 },
developer32b0e0f2023-04-11 13:34:56 +0800202-};
203-
204 enum mtk_vendor_attr_3wire_ctrl {
205 MTK_VENDOR_ATTR_3WIRE_CTRL_UNSPEC,
206
developer004e50c2023-06-29 20:33:22 +0800207@@ -72,10 +61,6 @@ enum mtk_vendor_attr_3wire_ctrl {
developer32b0e0f2023-04-11 13:34:56 +0800208 NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL - 1
209 };
210
211-static struct nla_policy three_wire_ctrl_policy[NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL] = {
212- [MTK_VENDOR_ATTR_3WIRE_CTRL_MODE] = {.type = NLA_U8 },
213-};
214-
215 enum mtk_vendor_attr_csi_ctrl {
216 MTK_VENDOR_ATTR_CSI_CTRL_UNSPEC,
217
developer004e50c2023-06-29 20:33:22 +0800218@@ -172,7 +157,7 @@ enum mtk_vendor_attr_wireless_ctrl {
developer32b0e0f2023-04-11 13:34:56 +0800219 MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE,
220 MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO,
221 MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU,
222- MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT,
223+ MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT = 9,
224 MTK_VENDOR_ATTR_WIRELESS_CTRL_RTS_SIGTA,
225
226 /* keep last */
developer004e50c2023-06-29 20:33:22 +0800227@@ -192,11 +177,6 @@ enum mtk_vendor_attr_wireless_dump {
developer32b0e0f2023-04-11 13:34:56 +0800228 NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP - 1
229 };
230
231-static const struct nla_policy
232-wireless_dump_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP] = {
233- [MTK_VENDOR_ATTR_WIRELESS_DUMP_AMSDU] = { .type = NLA_U8 },
234-};
235-
236 enum mtk_vendor_attr_rfeature_ctrl {
237 MTK_VENDOR_ATTR_RFEATURE_CTRL_UNSPEC,
238
developer004e50c2023-06-29 20:33:22 +0800239@@ -206,6 +186,7 @@ enum mtk_vendor_attr_rfeature_ctrl {
developer32b0e0f2023-04-11 13:34:56 +0800240 MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_EN,
241 MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE,
242 MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY,
243+ MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TXBF,
244
245 /* keep last */
246 NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL,
developer004e50c2023-06-29 20:33:22 +0800247@@ -247,16 +228,6 @@ enum mtk_vendor_attr_ibf_dump {
developer32b0e0f2023-04-11 13:34:56 +0800248 NUM_MTK_VENDOR_ATTRS_IBF_DUMP - 1
249 };
250
251-static struct nla_policy
252-ibf_ctrl_policy[NUM_MTK_VENDOR_ATTRS_IBF_CTRL] = {
253- [MTK_VENDOR_ATTR_IBF_CTRL_ENABLE] = { .type = NLA_U8 },
254-};
255-
256-static struct nla_policy
257-ibf_dump_policy[NUM_MTK_VENDOR_ATTRS_IBF_DUMP] = {
258- [MTK_VENDOR_ATTR_IBF_DUMP_ENABLE] = { .type = NLA_U8 },
259-};
260-
261 enum mtk_vendor_attr_bss_color_ctrl {
262 MTK_VENDOR_ATTR_BSS_COLOR_CTRL_UNSPEC,
263
264diff --git a/src/drivers/driver.h b/src/drivers/driver.h
developerd243af02023-12-21 14:49:33 +0800265index 869b0442f..2ef1a3fcd 100644
developer32b0e0f2023-04-11 13:34:56 +0800266--- a/src/drivers/driver.h
267+++ b/src/drivers/driver.h
developerd243af02023-12-21 14:49:33 +0800268@@ -5166,6 +5166,28 @@ struct wpa_driver_ops {
developer32b0e0f2023-04-11 13:34:56 +0800269 *
270 */
271 int (*get_aval_color_bmp)(void *priv, u64 *aval_color_bmp);
272+
273+ /**
274+ * ap_wireless - set wireless command
275+ * @priv: Private driver interface data
276+ * @value: value
277+ */
278+ int (*ap_wireless)(void *priv, u8 mode, int value);
279+
280+ /**
281+ * ap_rfeatures - set ap rf features command
282+ * @priv: Private driver interface data
283+ * @value: value
284+ */
285+ int (*ap_rfeatures)(void *priv, u8 mode, int value);
286+
287+ /**
288+ * ap_trigtype - set trigger type
289+ * @priv: Private driver interface data
290+ * @enable: enable or disable
291+ * @type: trigger type
292+ */
293+ int (*ap_trigtype)(void *priv, u8 enable, u8 type);
294 };
295
296 /**
297diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
developerd243af02023-12-21 14:49:33 +0800298index 7b5a50ea6..3ee3ec1eb 100644
developer32b0e0f2023-04-11 13:34:56 +0800299--- a/src/drivers/driver_nl80211.c
300+++ b/src/drivers/driver_nl80211.c
developerd243af02023-12-21 14:49:33 +0800301@@ -86,6 +86,58 @@ static void handle_nl_debug_hook(struct nl_msg *msg, int tx)
302 wpa_netlink_hook(tx, nlh, nlh->nlmsg_len);
303 }
developer32b0e0f2023-04-11 13:34:56 +0800304
305+static struct nla_policy
306+ibf_ctrl_policy[NUM_MTK_VENDOR_ATTRS_IBF_CTRL] = {
307+ [MTK_VENDOR_ATTR_IBF_CTRL_ENABLE] = { .type = NLA_U8 },
308+};
309+
310+static struct nla_policy
311+ibf_dump_policy[NUM_MTK_VENDOR_ATTRS_IBF_DUMP] = {
312+ [MTK_VENDOR_ATTR_IBF_DUMP_ENABLE] = { .type = NLA_U8 },
313+};
314+
315+static struct nla_policy three_wire_ctrl_policy[NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL] = {
316+ [MTK_VENDOR_ATTR_3WIRE_CTRL_MODE] = {.type = NLA_U8 },
317+};
318+
319+static struct nla_policy edcca_ctrl_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL] = {
320+ [MTK_VENDOR_ATTR_EDCCA_CTRL_MODE] = { .type = NLA_U8 },
321+ [MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL] = { .type = NLA_U8 },
322+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC20_VAL] = { .type = NLA_U8 },
323+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC40_VAL] = { .type = NLA_U8 },
324+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC80_VAL] = { .type = NLA_U8 },
325+ [MTK_VENDOR_ATTR_EDCCA_CTRL_COMPENSATE] = { .type = NLA_U8 },
developer004e50c2023-06-29 20:33:22 +0800326+ [MTK_VENDOR_ATTR_EDCCA_CTRL_SEC160_VAL] = { .type = NLA_U8 },
developer32b0e0f2023-04-11 13:34:56 +0800327+};
328+
329+static const struct nla_policy
330+wireless_dump_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP] = {
331+ [MTK_VENDOR_ATTR_WIRELESS_DUMP_AMSDU] = { .type = NLA_U8 },
332+};
333+
334+static const struct nla_policy
335+rfeature_ctrl_policy[NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL] = {
336+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_GI] = {.type = NLA_U8 },
337+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_LTF] = { .type = NLA_U8 },
338+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_CFG] = { .type = NLA_NESTED },
339+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_EN] = { .type = NLA_U8 },
340+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE] = { .type = NLA_U8 },
341+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY] = { .type = NLA_U8 },
342+ [MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TXBF] = { .type = NLA_U8 },
343+};
344+
345+static const struct nla_policy
346+wireless_ctrl_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_CTRL] = {
347+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_MCS] = {.type = NLA_U8 },
348+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_OFDMA] = {.type = NLA_U8 },
349+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE] = {.type = NLA_U8 },
350+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA] = {.type = NLA_U8 },
351+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO] = {.type = NLA_U8 },
352+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE] = {.type = NLA_U16 },
353+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU] = {.type = NLA_U8 },
354+ [MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT] = {.type = NLA_U8 },
355+};
356+
357 static struct nl_sock * nl_create_handle(struct nl_cb *cb, const char *dbg)
358 {
359 struct nl_sock *handle;
developerd243af02023-12-21 14:49:33 +0800360@@ -14660,4 +14712,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
developer32b0e0f2023-04-11 13:34:56 +0800361 .amsdu_ctrl = nl80211_enable_amsdu,
362 .amsdu_dump = nl80211_dump_amsdu,
363 .get_aval_color_bmp = nl80211_get_aval_color_bmp,
364+ .ap_wireless = nl80211_ap_wireless,
365+ .ap_rfeatures = nl80211_ap_rfeatures,
366+ .ap_trigtype = nl80211_ap_trigtype,
367 };
368diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h
developerd243af02023-12-21 14:49:33 +0800369index fd1e57cc2..fc5217d61 100644
developer32b0e0f2023-04-11 13:34:56 +0800370--- a/src/drivers/driver_nl80211.h
371+++ b/src/drivers/driver_nl80211.h
developer8bff6472023-07-17 11:11:44 +0800372@@ -208,6 +208,7 @@ struct wpa_driver_nl80211_data {
developer32b0e0f2023-04-11 13:34:56 +0800373 unsigned int mtk_ibf_vendor_cmd_avail:1;
374 unsigned int mtk_wireless_vendor_cmd_avail:1;
375 unsigned int mtk_bss_color_vendor_cmd_avail:1;
376+ unsigned int mtk_rfeatures_vendor_cmd_avail:1;
377
378 u64 vendor_scan_cookie;
379 u64 remain_on_chan_cookie;
380diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
developerd243af02023-12-21 14:49:33 +0800381index 3e8eb8cb1..16306a121 100644
developer32b0e0f2023-04-11 13:34:56 +0800382--- a/src/drivers/driver_nl80211_capa.c
383+++ b/src/drivers/driver_nl80211_capa.c
developerd243af02023-12-21 14:49:33 +0800384@@ -1132,6 +1132,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
developer32b0e0f2023-04-11 13:34:56 +0800385 case MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL :
386 drv->mtk_bss_color_vendor_cmd_avail = 1;
387 break;
388+ case MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL:
389+ drv->mtk_rfeatures_vendor_cmd_avail = 1;
390+ break;
391 }
392 }
393
394--
developerdfb50982023-09-11 13:34:36 +08003952.18.0
developer32b0e0f2023-04-11 13:34:56 +0800396