xref: /linux/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c (revision eed4edda910fe34dfae8c6bfbcf57f4593a54295)
1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2020 MediaTek Inc. */
3 
4 #include <linux/firmware.h>
5 #include "mt76_connac2_mac.h"
6 #include "mt76_connac_mcu.h"
7 
8 int mt76_connac_mcu_start_firmware(struct mt76_dev *dev, u32 addr, u32 option)
9 {
10 	struct {
11 		__le32 option;
12 		__le32 addr;
13 	} req = {
14 		.option = cpu_to_le32(option),
15 		.addr = cpu_to_le32(addr),
16 	};
17 
18 	return mt76_mcu_send_msg(dev, MCU_CMD(FW_START_REQ), &req,
19 				 sizeof(req), true);
20 }
21 EXPORT_SYMBOL_GPL(mt76_connac_mcu_start_firmware);
22 
23 int mt76_connac_mcu_patch_sem_ctrl(struct mt76_dev *dev, bool get)
24 {
25 	u32 op = get ? PATCH_SEM_GET : PATCH_SEM_RELEASE;
26 	struct {
27 		__le32 op;
28 	} req = {
29 		.op = cpu_to_le32(op),
30 	};
31 
32 	return mt76_mcu_send_msg(dev, MCU_CMD(PATCH_SEM_CONTROL),
33 				 &req, sizeof(req), true);
34 }
35 EXPORT_SYMBOL_GPL(mt76_connac_mcu_patch_sem_ctrl);
36 
37 int mt76_connac_mcu_start_patch(struct mt76_dev *dev)
38 {
39 	struct {
40 		u8 check_crc;
41 		u8 reserved[3];
42 	} req = {
43 		.check_crc = 0,
44 	};
45 
46 	return mt76_mcu_send_msg(dev, MCU_CMD(PATCH_FINISH_REQ),
47 				 &req, sizeof(req), true);
48 }
49 EXPORT_SYMBOL_GPL(mt76_connac_mcu_start_patch);
50 
51 #define MCU_PATCH_ADDRESS	0x200000
52 
53 int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
54 				  u32 mode)
55 {
56 	struct {
57 		__le32 addr;
58 		__le32 len;
59 		__le32 mode;
60 	} req = {
61 		.addr = cpu_to_le32(addr),
62 		.len = cpu_to_le32(len),
63 		.mode = cpu_to_le32(mode),
64 	};
65 	int cmd;
66 
67 	if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) ||
68 	    (is_mt7921(dev) && addr == 0x900000) ||
69 	    (is_mt7925(dev) && addr == 0x900000) ||
70 	    (is_mt7996(dev) && addr == 0x900000) ||
71 	    (is_mt7992(dev) && addr == 0x900000))
72 		cmd = MCU_CMD(PATCH_START_REQ);
73 	else
74 		cmd = MCU_CMD(TARGET_ADDRESS_LEN_REQ);
75 
76 	return mt76_mcu_send_msg(dev, cmd, &req, sizeof(req), true);
77 }
78 EXPORT_SYMBOL_GPL(mt76_connac_mcu_init_download);
79 
80 int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy)
81 {
82 	int len, i, n_max_channels, n_2ch = 0, n_5ch = 0, n_6ch = 0;
83 	struct mt76_connac_mcu_channel_domain {
84 		u8 alpha2[4]; /* regulatory_request.alpha2 */
85 		u8 bw_2g; /* BW_20_40M		0
86 			   * BW_20M		1
87 			   * BW_20_40_80M	2
88 			   * BW_20_40_80_160M	3
89 			   * BW_20_40_80_8080M	4
90 			   */
91 		u8 bw_5g;
92 		u8 bw_6g;
93 		u8 pad;
94 		u8 n_2ch;
95 		u8 n_5ch;
96 		u8 n_6ch;
97 		u8 pad2;
98 	} __packed hdr = {
99 		.bw_2g = 0,
100 		.bw_5g = 3, /* BW_20_40_80_160M */
101 		.bw_6g = 3,
102 	};
103 	struct mt76_connac_mcu_chan {
104 		__le16 hw_value;
105 		__le16 pad;
106 		__le32 flags;
107 	} __packed channel;
108 	struct mt76_dev *dev = phy->dev;
109 	struct ieee80211_channel *chan;
110 	struct sk_buff *skb;
111 
112 	n_max_channels = phy->sband_2g.sband.n_channels +
113 			 phy->sband_5g.sband.n_channels +
114 			 phy->sband_6g.sband.n_channels;
115 	len = sizeof(hdr) + n_max_channels * sizeof(channel);
116 
117 	skb = mt76_mcu_msg_alloc(dev, NULL, len);
118 	if (!skb)
119 		return -ENOMEM;
120 
121 	skb_reserve(skb, sizeof(hdr));
122 
123 	for (i = 0; i < phy->sband_2g.sband.n_channels; i++) {
124 		chan = &phy->sband_2g.sband.channels[i];
125 		if (chan->flags & IEEE80211_CHAN_DISABLED)
126 			continue;
127 
128 		channel.hw_value = cpu_to_le16(chan->hw_value);
129 		channel.flags = cpu_to_le32(chan->flags);
130 		channel.pad = 0;
131 
132 		skb_put_data(skb, &channel, sizeof(channel));
133 		n_2ch++;
134 	}
135 	for (i = 0; i < phy->sband_5g.sband.n_channels; i++) {
136 		chan = &phy->sband_5g.sband.channels[i];
137 		if (chan->flags & IEEE80211_CHAN_DISABLED)
138 			continue;
139 
140 		channel.hw_value = cpu_to_le16(chan->hw_value);
141 		channel.flags = cpu_to_le32(chan->flags);
142 		channel.pad = 0;
143 
144 		skb_put_data(skb, &channel, sizeof(channel));
145 		n_5ch++;
146 	}
147 	for (i = 0; i < phy->sband_6g.sband.n_channels; i++) {
148 		chan = &phy->sband_6g.sband.channels[i];
149 		if (chan->flags & IEEE80211_CHAN_DISABLED)
150 			continue;
151 
152 		channel.hw_value = cpu_to_le16(chan->hw_value);
153 		channel.flags = cpu_to_le32(chan->flags);
154 		channel.pad = 0;
155 
156 		skb_put_data(skb, &channel, sizeof(channel));
157 		n_6ch++;
158 	}
159 
160 	BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(hdr.alpha2));
161 	memcpy(hdr.alpha2, dev->alpha2, sizeof(dev->alpha2));
162 	hdr.n_2ch = n_2ch;
163 	hdr.n_5ch = n_5ch;
164 	hdr.n_6ch = n_6ch;
165 
166 	memcpy(__skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr));
167 
168 	return mt76_mcu_skb_send_msg(dev, skb, MCU_CE_CMD(SET_CHAN_DOMAIN),
169 				     false);
170 }
171 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_channel_domain);
172 
173 int mt76_connac_mcu_set_mac_enable(struct mt76_dev *dev, int band, bool enable,
174 				   bool hdr_trans)
175 {
176 	struct {
177 		u8 enable;
178 		u8 band;
179 		u8 rsv[2];
180 	} __packed req_mac = {
181 		.enable = enable,
182 		.band = band,
183 	};
184 
185 	return mt76_mcu_send_msg(dev, MCU_EXT_CMD(MAC_INIT_CTRL), &req_mac,
186 				 sizeof(req_mac), true);
187 }
188 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_mac_enable);
189 
190 int mt76_connac_mcu_set_vif_ps(struct mt76_dev *dev, struct ieee80211_vif *vif)
191 {
192 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
193 	struct {
194 		u8 bss_idx;
195 		u8 ps_state; /* 0: device awake
196 			      * 1: static power save
197 			      * 2: dynamic power saving
198 			      */
199 	} req = {
200 		.bss_idx = mvif->idx,
201 		.ps_state = vif->cfg.ps ? 2 : 0,
202 	};
203 
204 	if (vif->type != NL80211_IFTYPE_STATION)
205 		return -EOPNOTSUPP;
206 
207 	return mt76_mcu_send_msg(dev, MCU_CE_CMD(SET_PS_PROFILE),
208 				 &req, sizeof(req), false);
209 }
210 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_vif_ps);
211 
212 int mt76_connac_mcu_set_rts_thresh(struct mt76_dev *dev, u32 val, u8 band)
213 {
214 	struct {
215 		u8 prot_idx;
216 		u8 band;
217 		u8 rsv[2];
218 		__le32 len_thresh;
219 		__le32 pkt_thresh;
220 	} __packed req = {
221 		.prot_idx = 1,
222 		.band = band,
223 		.len_thresh = cpu_to_le32(val),
224 		.pkt_thresh = cpu_to_le32(0x2),
225 	};
226 
227 	return mt76_mcu_send_msg(dev, MCU_EXT_CMD(PROTECT_CTRL), &req,
228 				 sizeof(req), true);
229 }
230 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rts_thresh);
231 
232 void mt76_connac_mcu_beacon_loss_iter(void *priv, u8 *mac,
233 				      struct ieee80211_vif *vif)
234 {
235 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
236 	struct mt76_connac_beacon_loss_event *event = priv;
237 
238 	if (mvif->idx != event->bss_idx)
239 		return;
240 
241 	if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
242 		return;
243 
244 	ieee80211_beacon_loss(vif);
245 }
246 EXPORT_SYMBOL_GPL(mt76_connac_mcu_beacon_loss_iter);
247 
248 struct tlv *
249 mt76_connac_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len,
250 			       void *sta_ntlv, void *sta_wtbl)
251 {
252 	struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv;
253 	struct tlv *sta_hdr = sta_wtbl;
254 	struct tlv *ptlv, tlv = {
255 		.tag = cpu_to_le16(tag),
256 		.len = cpu_to_le16(len),
257 	};
258 	u16 ntlv;
259 
260 	ptlv = skb_put(skb, len);
261 	memcpy(ptlv, &tlv, sizeof(tlv));
262 
263 	ntlv = le16_to_cpu(ntlv_hdr->tlv_num);
264 	ntlv_hdr->tlv_num = cpu_to_le16(ntlv + 1);
265 
266 	if (sta_hdr) {
267 		len += le16_to_cpu(sta_hdr->len);
268 		sta_hdr->len = cpu_to_le16(len);
269 	}
270 
271 	return ptlv;
272 }
273 EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_nested_tlv);
274 
275 struct sk_buff *
276 __mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif *mvif,
277 				struct mt76_wcid *wcid, int len)
278 {
279 	struct sta_req_hdr hdr = {
280 		.bss_idx = mvif->idx,
281 		.muar_idx = wcid ? mvif->omac_idx : 0,
282 		.is_tlv_append = 1,
283 	};
284 	struct sk_buff *skb;
285 
286 	mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
287 				     &hdr.wlan_idx_hi);
288 	skb = mt76_mcu_msg_alloc(dev, NULL, len);
289 	if (!skb)
290 		return ERR_PTR(-ENOMEM);
291 
292 	skb_put_data(skb, &hdr, sizeof(hdr));
293 
294 	return skb;
295 }
296 EXPORT_SYMBOL_GPL(__mt76_connac_mcu_alloc_sta_req);
297 
298 struct wtbl_req_hdr *
299 mt76_connac_mcu_alloc_wtbl_req(struct mt76_dev *dev, struct mt76_wcid *wcid,
300 			       int cmd, void *sta_wtbl, struct sk_buff **skb)
301 {
302 	struct tlv *sta_hdr = sta_wtbl;
303 	struct wtbl_req_hdr hdr = {
304 		.operation = cmd,
305 	};
306 	struct sk_buff *nskb = *skb;
307 
308 	mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
309 				     &hdr.wlan_idx_hi);
310 	if (!nskb) {
311 		nskb = mt76_mcu_msg_alloc(dev, NULL,
312 					  MT76_CONNAC_WTBL_UPDATE_MAX_SIZE);
313 		if (!nskb)
314 			return ERR_PTR(-ENOMEM);
315 
316 		*skb = nskb;
317 	}
318 
319 	if (sta_hdr)
320 		le16_add_cpu(&sta_hdr->len, sizeof(hdr));
321 
322 	return skb_put_data(nskb, &hdr, sizeof(hdr));
323 }
324 EXPORT_SYMBOL_GPL(mt76_connac_mcu_alloc_wtbl_req);
325 
326 void mt76_connac_mcu_bss_omac_tlv(struct sk_buff *skb,
327 				  struct ieee80211_vif *vif)
328 {
329 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
330 	u8 omac_idx = mvif->omac_idx;
331 	struct bss_info_omac *omac;
332 	struct tlv *tlv;
333 	u32 type = 0;
334 
335 	switch (vif->type) {
336 	case NL80211_IFTYPE_MONITOR:
337 	case NL80211_IFTYPE_MESH_POINT:
338 	case NL80211_IFTYPE_AP:
339 		if (vif->p2p)
340 			type = CONNECTION_P2P_GO;
341 		else
342 			type = CONNECTION_INFRA_AP;
343 		break;
344 	case NL80211_IFTYPE_STATION:
345 		if (vif->p2p)
346 			type = CONNECTION_P2P_GC;
347 		else
348 			type = CONNECTION_INFRA_STA;
349 		break;
350 	case NL80211_IFTYPE_ADHOC:
351 		type = CONNECTION_IBSS_ADHOC;
352 		break;
353 	default:
354 		WARN_ON(1);
355 		break;
356 	}
357 
358 	tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
359 
360 	omac = (struct bss_info_omac *)tlv;
361 	omac->conn_type = cpu_to_le32(type);
362 	omac->omac_idx = mvif->omac_idx;
363 	omac->band_idx = mvif->band_idx;
364 	omac->hw_bss_idx = omac_idx > EXT_BSSID_START ? HW_BSSID_0 : omac_idx;
365 }
366 EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_omac_tlv);
367 
368 void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
369 				   struct ieee80211_vif *vif,
370 				   struct ieee80211_sta *sta,
371 				   bool enable, bool newly)
372 {
373 	struct sta_rec_basic *basic;
374 	struct tlv *tlv;
375 	int conn_type;
376 
377 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BASIC, sizeof(*basic));
378 
379 	basic = (struct sta_rec_basic *)tlv;
380 	basic->extra_info = cpu_to_le16(EXTRA_INFO_VER);
381 
382 	if (enable) {
383 		if (newly)
384 			basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
385 		basic->conn_state = CONN_STATE_PORT_SECURE;
386 	} else {
387 		basic->conn_state = CONN_STATE_DISCONNECT;
388 	}
389 
390 	if (!sta) {
391 		basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
392 		eth_broadcast_addr(basic->peer_addr);
393 		return;
394 	}
395 
396 	switch (vif->type) {
397 	case NL80211_IFTYPE_MESH_POINT:
398 	case NL80211_IFTYPE_AP:
399 		if (vif->p2p && !is_mt7921(dev))
400 			conn_type = CONNECTION_P2P_GC;
401 		else
402 			conn_type = CONNECTION_INFRA_STA;
403 		basic->conn_type = cpu_to_le32(conn_type);
404 		basic->aid = cpu_to_le16(sta->aid);
405 		break;
406 	case NL80211_IFTYPE_STATION:
407 		if (vif->p2p && !is_mt7921(dev))
408 			conn_type = CONNECTION_P2P_GO;
409 		else
410 			conn_type = CONNECTION_INFRA_AP;
411 		basic->conn_type = cpu_to_le32(conn_type);
412 		basic->aid = cpu_to_le16(vif->cfg.aid);
413 		break;
414 	case NL80211_IFTYPE_ADHOC:
415 		basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
416 		basic->aid = cpu_to_le16(sta->aid);
417 		break;
418 	default:
419 		WARN_ON(1);
420 		break;
421 	}
422 
423 	memcpy(basic->peer_addr, sta->addr, ETH_ALEN);
424 	basic->qos = sta->wme;
425 }
426 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_basic_tlv);
427 
428 void mt76_connac_mcu_sta_uapsd(struct sk_buff *skb, struct ieee80211_vif *vif,
429 			       struct ieee80211_sta *sta)
430 {
431 	struct sta_rec_uapsd *uapsd;
432 	struct tlv *tlv;
433 
434 	if (vif->type != NL80211_IFTYPE_AP || !sta->wme)
435 		return;
436 
437 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_APPS, sizeof(*uapsd));
438 	uapsd = (struct sta_rec_uapsd *)tlv;
439 
440 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) {
441 		uapsd->dac_map |= BIT(3);
442 		uapsd->tac_map |= BIT(3);
443 	}
444 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) {
445 		uapsd->dac_map |= BIT(2);
446 		uapsd->tac_map |= BIT(2);
447 	}
448 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) {
449 		uapsd->dac_map |= BIT(1);
450 		uapsd->tac_map |= BIT(1);
451 	}
452 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) {
453 		uapsd->dac_map |= BIT(0);
454 		uapsd->tac_map |= BIT(0);
455 	}
456 	uapsd->max_sp = sta->max_sp;
457 }
458 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_uapsd);
459 
460 void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb,
461 					struct ieee80211_vif *vif,
462 					struct mt76_wcid *wcid,
463 					void *sta_wtbl, void *wtbl_tlv)
464 {
465 	struct wtbl_hdr_trans *htr;
466 	struct tlv *tlv;
467 
468 	tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HDR_TRANS,
469 					     sizeof(*htr),
470 					     wtbl_tlv, sta_wtbl);
471 	htr = (struct wtbl_hdr_trans *)tlv;
472 	htr->no_rx_trans = true;
473 
474 	if (vif->type == NL80211_IFTYPE_STATION)
475 		htr->to_ds = true;
476 	else
477 		htr->from_ds = true;
478 
479 	if (!wcid)
480 		return;
481 
482 	htr->no_rx_trans = !test_bit(MT_WCID_FLAG_HDR_TRANS, &wcid->flags);
483 	if (test_bit(MT_WCID_FLAG_4ADDR, &wcid->flags)) {
484 		htr->to_ds = true;
485 		htr->from_ds = true;
486 	}
487 }
488 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_hdr_trans_tlv);
489 
490 int mt76_connac_mcu_sta_update_hdr_trans(struct mt76_dev *dev,
491 					 struct ieee80211_vif *vif,
492 					 struct mt76_wcid *wcid, int cmd)
493 {
494 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
495 	struct wtbl_req_hdr *wtbl_hdr;
496 	struct tlv *sta_wtbl;
497 	struct sk_buff *skb;
498 
499 	skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
500 	if (IS_ERR(skb))
501 		return PTR_ERR(skb);
502 
503 	sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
504 					   sizeof(struct tlv));
505 
506 	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET,
507 						  sta_wtbl, &skb);
508 	if (IS_ERR(wtbl_hdr))
509 		return PTR_ERR(wtbl_hdr);
510 
511 	mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, sta_wtbl, wtbl_hdr);
512 
513 	return mt76_mcu_skb_send_msg(dev, skb, cmd, true);
514 }
515 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_update_hdr_trans);
516 
517 int mt76_connac_mcu_wtbl_update_hdr_trans(struct mt76_dev *dev,
518 					  struct ieee80211_vif *vif,
519 					  struct ieee80211_sta *sta)
520 {
521 	struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
522 	struct wtbl_req_hdr *wtbl_hdr;
523 	struct sk_buff *skb = NULL;
524 
525 	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET, NULL,
526 						  &skb);
527 	if (IS_ERR(wtbl_hdr))
528 		return PTR_ERR(wtbl_hdr);
529 
530 	mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, NULL, wtbl_hdr);
531 
532 	return mt76_mcu_skb_send_msg(dev, skb, MCU_EXT_CMD(WTBL_UPDATE), true);
533 }
534 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_update_hdr_trans);
535 
536 void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev,
537 				      struct sk_buff *skb,
538 				      struct ieee80211_vif *vif,
539 				      struct ieee80211_sta *sta,
540 				      void *sta_wtbl, void *wtbl_tlv)
541 {
542 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
543 	struct wtbl_generic *generic;
544 	struct wtbl_rx *rx;
545 	struct wtbl_spe *spe;
546 	struct tlv *tlv;
547 
548 	tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_GENERIC,
549 					     sizeof(*generic),
550 					     wtbl_tlv, sta_wtbl);
551 
552 	generic = (struct wtbl_generic *)tlv;
553 
554 	if (sta) {
555 		if (vif->type == NL80211_IFTYPE_STATION)
556 			generic->partial_aid = cpu_to_le16(vif->cfg.aid);
557 		else
558 			generic->partial_aid = cpu_to_le16(sta->aid);
559 		memcpy(generic->peer_addr, sta->addr, ETH_ALEN);
560 		generic->muar_idx = mvif->omac_idx;
561 		generic->qos = sta->wme;
562 	} else {
563 		if (!is_connac_v1(dev) && vif->type == NL80211_IFTYPE_STATION)
564 			memcpy(generic->peer_addr, vif->bss_conf.bssid,
565 			       ETH_ALEN);
566 		else
567 			eth_broadcast_addr(generic->peer_addr);
568 
569 		generic->muar_idx = 0xe;
570 	}
571 
572 	tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_RX, sizeof(*rx),
573 					     wtbl_tlv, sta_wtbl);
574 
575 	rx = (struct wtbl_rx *)tlv;
576 	rx->rca1 = sta ? vif->type != NL80211_IFTYPE_AP : 1;
577 	rx->rca2 = 1;
578 	rx->rv = 1;
579 
580 	if (!is_connac_v1(dev))
581 		return;
582 
583 	tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SPE, sizeof(*spe),
584 					     wtbl_tlv, sta_wtbl);
585 	spe = (struct wtbl_spe *)tlv;
586 	spe->spe_idx = 24;
587 }
588 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_generic_tlv);
589 
590 static void
591 mt76_connac_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
592 			      struct ieee80211_vif *vif)
593 {
594 	struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
595 	struct sta_rec_amsdu *amsdu;
596 	struct tlv *tlv;
597 
598 	if (vif->type != NL80211_IFTYPE_AP &&
599 	    vif->type != NL80211_IFTYPE_STATION)
600 		return;
601 
602 	if (!sta->deflink.agg.max_amsdu_len)
603 		return;
604 
605 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
606 	amsdu = (struct sta_rec_amsdu *)tlv;
607 	amsdu->max_amsdu_num = 8;
608 	amsdu->amsdu_en = true;
609 	amsdu->max_mpdu_size = sta->deflink.agg.max_amsdu_len >=
610 			       IEEE80211_MAX_MPDU_LEN_VHT_7991;
611 
612 	wcid->amsdu = true;
613 }
614 
615 #define HE_PHY(p, c)	u8_get_bits(c, IEEE80211_HE_PHY_##p)
616 #define HE_MAC(m, c)	u8_get_bits(c, IEEE80211_HE_MAC_##m)
617 static void
618 mt76_connac_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
619 {
620 	struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
621 	struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
622 	struct sta_rec_he *he;
623 	struct tlv *tlv;
624 	u32 cap = 0;
625 
626 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
627 
628 	he = (struct sta_rec_he *)tlv;
629 
630 	if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE)
631 		cap |= STA_REC_HE_CAP_HTC;
632 
633 	if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
634 		cap |= STA_REC_HE_CAP_BSR;
635 
636 	if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
637 		cap |= STA_REC_HE_CAP_OM;
638 
639 	if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
640 		cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
641 
642 	if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
643 		cap |= STA_REC_HE_CAP_BQR;
644 
645 	if (elem->phy_cap_info[0] &
646 	    (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G |
647 	     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G))
648 		cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT;
649 
650 	if (elem->phy_cap_info[1] &
651 	    IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)
652 		cap |= STA_REC_HE_CAP_LDPC;
653 
654 	if (elem->phy_cap_info[1] &
655 	    IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US)
656 		cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI;
657 
658 	if (elem->phy_cap_info[2] &
659 	    IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US)
660 		cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI;
661 
662 	if (elem->phy_cap_info[2] &
663 	    IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ)
664 		cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC;
665 
666 	if (elem->phy_cap_info[2] &
667 	    IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
668 		cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC;
669 
670 	if (elem->phy_cap_info[6] &
671 	    IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE)
672 		cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE;
673 
674 	if (elem->phy_cap_info[7] &
675 	    IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI)
676 		cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI;
677 
678 	if (elem->phy_cap_info[7] &
679 	    IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ)
680 		cap |= STA_REC_HE_CAP_GT_80M_TX_STBC;
681 
682 	if (elem->phy_cap_info[7] &
683 	    IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ)
684 		cap |= STA_REC_HE_CAP_GT_80M_RX_STBC;
685 
686 	if (elem->phy_cap_info[8] &
687 	    IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI)
688 		cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI;
689 
690 	if (elem->phy_cap_info[8] &
691 	    IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI)
692 		cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI;
693 
694 	if (elem->phy_cap_info[9] &
695 	    IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK)
696 		cap |= STA_REC_HE_CAP_TRIG_CQI_FK;
697 
698 	if (elem->phy_cap_info[9] &
699 	    IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU)
700 		cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242;
701 
702 	if (elem->phy_cap_info[9] &
703 	    IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU)
704 		cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242;
705 
706 	he->he_cap = cpu_to_le32(cap);
707 
708 	switch (sta->deflink.bandwidth) {
709 	case IEEE80211_STA_RX_BW_160:
710 		if (elem->phy_cap_info[0] &
711 		    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
712 			he->max_nss_mcs[CMD_HE_MCS_BW8080] =
713 				he_cap->he_mcs_nss_supp.rx_mcs_80p80;
714 
715 		he->max_nss_mcs[CMD_HE_MCS_BW160] =
716 				he_cap->he_mcs_nss_supp.rx_mcs_160;
717 		fallthrough;
718 	default:
719 		he->max_nss_mcs[CMD_HE_MCS_BW80] =
720 				he_cap->he_mcs_nss_supp.rx_mcs_80;
721 		break;
722 	}
723 
724 	he->t_frame_dur =
725 		HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
726 	he->max_ampdu_exp =
727 		HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]);
728 
729 	he->bw_set =
730 		HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]);
731 	he->device_class =
732 		HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]);
733 	he->punc_pream_rx =
734 		HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
735 
736 	he->dcm_tx_mode =
737 		HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]);
738 	he->dcm_tx_max_nss =
739 		HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]);
740 	he->dcm_rx_mode =
741 		HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]);
742 	he->dcm_rx_max_nss =
743 		HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]);
744 	he->dcm_rx_max_nss =
745 		HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]);
746 
747 	he->pkt_ext = 2;
748 }
749 
750 void
751 mt76_connac_mcu_sta_he_tlv_v2(struct sk_buff *skb, struct ieee80211_sta *sta)
752 {
753 	struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
754 	struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
755 	struct sta_rec_he_v2 *he;
756 	struct tlv *tlv;
757 
758 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_V2, sizeof(*he));
759 
760 	he = (struct sta_rec_he_v2 *)tlv;
761 	memcpy(he->he_phy_cap, elem->phy_cap_info, sizeof(he->he_phy_cap));
762 	memcpy(he->he_mac_cap, elem->mac_cap_info, sizeof(he->he_mac_cap));
763 
764 	switch (sta->deflink.bandwidth) {
765 	case IEEE80211_STA_RX_BW_160:
766 		if (elem->phy_cap_info[0] &
767 		    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
768 			he->max_nss_mcs[CMD_HE_MCS_BW8080] =
769 				he_cap->he_mcs_nss_supp.rx_mcs_80p80;
770 
771 		he->max_nss_mcs[CMD_HE_MCS_BW160] =
772 				he_cap->he_mcs_nss_supp.rx_mcs_160;
773 		fallthrough;
774 	default:
775 		he->max_nss_mcs[CMD_HE_MCS_BW80] =
776 				he_cap->he_mcs_nss_supp.rx_mcs_80;
777 		break;
778 	}
779 
780 	he->pkt_ext = IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US;
781 }
782 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_he_tlv_v2);
783 
784 u8
785 mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
786 			    enum nl80211_band band, struct ieee80211_sta *sta)
787 {
788 	struct ieee80211_sta_ht_cap *ht_cap;
789 	struct ieee80211_sta_vht_cap *vht_cap;
790 	const struct ieee80211_sta_he_cap *he_cap;
791 	const struct ieee80211_sta_eht_cap *eht_cap;
792 	u8 mode = 0;
793 
794 	if (sta) {
795 		ht_cap = &sta->deflink.ht_cap;
796 		vht_cap = &sta->deflink.vht_cap;
797 		he_cap = &sta->deflink.he_cap;
798 		eht_cap = &sta->deflink.eht_cap;
799 	} else {
800 		struct ieee80211_supported_band *sband;
801 
802 		sband = mphy->hw->wiphy->bands[band];
803 		ht_cap = &sband->ht_cap;
804 		vht_cap = &sband->vht_cap;
805 		he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
806 		eht_cap = ieee80211_get_eht_iftype_cap(sband, vif->type);
807 	}
808 
809 	if (band == NL80211_BAND_2GHZ) {
810 		mode |= PHY_TYPE_BIT_HR_DSSS | PHY_TYPE_BIT_ERP;
811 
812 		if (ht_cap->ht_supported)
813 			mode |= PHY_TYPE_BIT_HT;
814 
815 		if (he_cap && he_cap->has_he)
816 			mode |= PHY_TYPE_BIT_HE;
817 
818 		if (eht_cap && eht_cap->has_eht)
819 			mode |= PHY_TYPE_BIT_BE;
820 	} else if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) {
821 		mode |= PHY_TYPE_BIT_OFDM;
822 
823 		if (ht_cap->ht_supported)
824 			mode |= PHY_TYPE_BIT_HT;
825 
826 		if (vht_cap->vht_supported)
827 			mode |= PHY_TYPE_BIT_VHT;
828 
829 		if (he_cap && he_cap->has_he)
830 			mode |= PHY_TYPE_BIT_HE;
831 
832 		if (eht_cap && eht_cap->has_eht)
833 			mode |= PHY_TYPE_BIT_BE;
834 	}
835 
836 	return mode;
837 }
838 EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode_v2);
839 
840 void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
841 			     struct ieee80211_sta *sta,
842 			     struct ieee80211_vif *vif,
843 			     u8 rcpi, u8 sta_state)
844 {
845 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
846 	struct cfg80211_chan_def *chandef = mvif->ctx ?
847 					    &mvif->ctx->def : &mphy->chandef;
848 	enum nl80211_band band = chandef->chan->band;
849 	struct mt76_dev *dev = mphy->dev;
850 	struct sta_rec_ra_info *ra_info;
851 	struct sta_rec_state *state;
852 	struct sta_rec_phy *phy;
853 	struct tlv *tlv;
854 	u16 supp_rates;
855 
856 	/* starec ht */
857 	if (sta->deflink.ht_cap.ht_supported) {
858 		struct sta_rec_ht *ht;
859 
860 		tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
861 		ht = (struct sta_rec_ht *)tlv;
862 		ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap);
863 	}
864 
865 	/* starec vht */
866 	if (sta->deflink.vht_cap.vht_supported) {
867 		struct sta_rec_vht *vht;
868 		int len;
869 
870 		len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
871 		tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len);
872 		vht = (struct sta_rec_vht *)tlv;
873 		vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
874 		vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
875 		vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
876 	}
877 
878 	/* starec uapsd */
879 	mt76_connac_mcu_sta_uapsd(skb, vif, sta);
880 
881 	if (!is_mt7921(dev))
882 		return;
883 
884 	if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he)
885 		mt76_connac_mcu_sta_amsdu_tlv(skb, sta, vif);
886 
887 	/* starec he */
888 	if (sta->deflink.he_cap.has_he) {
889 		mt76_connac_mcu_sta_he_tlv(skb, sta);
890 		mt76_connac_mcu_sta_he_tlv_v2(skb, sta);
891 		if (band == NL80211_BAND_6GHZ &&
892 		    sta_state == MT76_STA_INFO_STATE_ASSOC) {
893 			struct sta_rec_he_6g_capa *he_6g_capa;
894 
895 			tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_6G,
896 						      sizeof(*he_6g_capa));
897 			he_6g_capa = (struct sta_rec_he_6g_capa *)tlv;
898 			he_6g_capa->capa = sta->deflink.he_6ghz_capa.capa;
899 		}
900 	}
901 
902 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy));
903 	phy = (struct sta_rec_phy *)tlv;
904 	phy->phy_type = mt76_connac_get_phy_mode_v2(mphy, vif, band, sta);
905 	phy->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates);
906 	phy->rcpi = rcpi;
907 	phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR,
908 				sta->deflink.ht_cap.ampdu_factor) |
909 		     FIELD_PREP(IEEE80211_HT_AMPDU_PARM_DENSITY,
910 				sta->deflink.ht_cap.ampdu_density);
911 
912 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info));
913 	ra_info = (struct sta_rec_ra_info *)tlv;
914 
915 	supp_rates = sta->deflink.supp_rates[band];
916 	if (band == NL80211_BAND_2GHZ)
917 		supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates >> 4) |
918 			     FIELD_PREP(RA_LEGACY_CCK, supp_rates & 0xf);
919 	else
920 		supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates);
921 
922 	ra_info->legacy = cpu_to_le16(supp_rates);
923 
924 	if (sta->deflink.ht_cap.ht_supported)
925 		memcpy(ra_info->rx_mcs_bitmask,
926 		       sta->deflink.ht_cap.mcs.rx_mask,
927 		       HT_MCS_MASK_NUM);
928 
929 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state));
930 	state = (struct sta_rec_state *)tlv;
931 	state->state = sta_state;
932 
933 	if (sta->deflink.vht_cap.vht_supported) {
934 		state->vht_opmode = sta->deflink.bandwidth;
935 		state->vht_opmode |= (sta->deflink.rx_nss - 1) <<
936 			IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
937 	}
938 }
939 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_tlv);
940 
941 void mt76_connac_mcu_wtbl_smps_tlv(struct sk_buff *skb,
942 				   struct ieee80211_sta *sta,
943 				   void *sta_wtbl, void *wtbl_tlv)
944 {
945 	struct wtbl_smps *smps;
946 	struct tlv *tlv;
947 
948 	tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps),
949 					     wtbl_tlv, sta_wtbl);
950 	smps = (struct wtbl_smps *)tlv;
951 	smps->smps = (sta->deflink.smps_mode == IEEE80211_SMPS_DYNAMIC);
952 }
953 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_smps_tlv);
954 
955 void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
956 				 struct ieee80211_sta *sta, void *sta_wtbl,
957 				 void *wtbl_tlv, bool ht_ldpc, bool vht_ldpc)
958 {
959 	struct wtbl_ht *ht = NULL;
960 	struct tlv *tlv;
961 	u32 flags = 0;
962 
963 	if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_6ghz_capa.capa) {
964 		tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
965 						     wtbl_tlv, sta_wtbl);
966 		ht = (struct wtbl_ht *)tlv;
967 		ht->ldpc = ht_ldpc &&
968 			   !!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
969 
970 		if (sta->deflink.ht_cap.ht_supported) {
971 			ht->af = sta->deflink.ht_cap.ampdu_factor;
972 			ht->mm = sta->deflink.ht_cap.ampdu_density;
973 		} else {
974 			ht->af = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
975 					       IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
976 			ht->mm = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
977 					       IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
978 		}
979 
980 		ht->ht = true;
981 	}
982 
983 	if (sta->deflink.vht_cap.vht_supported || sta->deflink.he_6ghz_capa.capa) {
984 		struct wtbl_vht *vht;
985 		u8 af;
986 
987 		tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_VHT,
988 						     sizeof(*vht), wtbl_tlv,
989 						     sta_wtbl);
990 		vht = (struct wtbl_vht *)tlv;
991 		vht->ldpc = vht_ldpc &&
992 			    !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
993 		vht->vht = true;
994 
995 		af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
996 			       sta->deflink.vht_cap.cap);
997 		if (ht)
998 			ht->af = max(ht->af, af);
999 	}
1000 
1001 	mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_tlv);
1002 
1003 	if (is_connac_v1(dev) && sta->deflink.ht_cap.ht_supported) {
1004 		/* sgi */
1005 		u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 |
1006 			  MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160;
1007 		struct wtbl_raw *raw;
1008 
1009 		tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_RAW_DATA,
1010 						     sizeof(*raw), wtbl_tlv,
1011 						     sta_wtbl);
1012 
1013 		if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
1014 			flags |= MT_WTBL_W5_SHORT_GI_20;
1015 		if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
1016 			flags |= MT_WTBL_W5_SHORT_GI_40;
1017 
1018 		if (sta->deflink.vht_cap.vht_supported) {
1019 			if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
1020 				flags |= MT_WTBL_W5_SHORT_GI_80;
1021 			if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
1022 				flags |= MT_WTBL_W5_SHORT_GI_160;
1023 		}
1024 		raw = (struct wtbl_raw *)tlv;
1025 		raw->val = cpu_to_le32(flags);
1026 		raw->msk = cpu_to_le32(~msk);
1027 		raw->wtbl_idx = 1;
1028 		raw->dw = 5;
1029 	}
1030 }
1031 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ht_tlv);
1032 
1033 int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
1034 			    struct mt76_sta_cmd_info *info)
1035 {
1036 	struct mt76_vif *mvif = (struct mt76_vif *)info->vif->drv_priv;
1037 	struct mt76_dev *dev = phy->dev;
1038 	struct wtbl_req_hdr *wtbl_hdr;
1039 	struct tlv *sta_wtbl;
1040 	struct sk_buff *skb;
1041 
1042 	skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, info->wcid);
1043 	if (IS_ERR(skb))
1044 		return PTR_ERR(skb);
1045 
1046 	if (info->sta || !info->offload_fw)
1047 		mt76_connac_mcu_sta_basic_tlv(dev, skb, info->vif, info->sta,
1048 					      info->enable, info->newly);
1049 	if (info->sta && info->enable)
1050 		mt76_connac_mcu_sta_tlv(phy, skb, info->sta,
1051 					info->vif, info->rcpi,
1052 					info->state);
1053 
1054 	sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1055 					   sizeof(struct tlv));
1056 
1057 	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, info->wcid,
1058 						  WTBL_RESET_AND_SET,
1059 						  sta_wtbl, &skb);
1060 	if (IS_ERR(wtbl_hdr))
1061 		return PTR_ERR(wtbl_hdr);
1062 
1063 	if (info->enable) {
1064 		mt76_connac_mcu_wtbl_generic_tlv(dev, skb, info->vif,
1065 						 info->sta, sta_wtbl,
1066 						 wtbl_hdr);
1067 		mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, info->vif, info->wcid,
1068 						   sta_wtbl, wtbl_hdr);
1069 		if (info->sta)
1070 			mt76_connac_mcu_wtbl_ht_tlv(dev, skb, info->sta,
1071 						    sta_wtbl, wtbl_hdr,
1072 						    true, true);
1073 	}
1074 
1075 	return mt76_mcu_skb_send_msg(dev, skb, info->cmd, true);
1076 }
1077 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_cmd);
1078 
1079 void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb,
1080 				 struct ieee80211_ampdu_params *params,
1081 				 bool enable, bool tx, void *sta_wtbl,
1082 				 void *wtbl_tlv)
1083 {
1084 	struct wtbl_ba *ba;
1085 	struct tlv *tlv;
1086 
1087 	tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_BA, sizeof(*ba),
1088 					     wtbl_tlv, sta_wtbl);
1089 
1090 	ba = (struct wtbl_ba *)tlv;
1091 	ba->tid = params->tid;
1092 
1093 	if (tx) {
1094 		ba->ba_type = MT_BA_TYPE_ORIGINATOR;
1095 		ba->sn = enable ? cpu_to_le16(params->ssn) : 0;
1096 		ba->ba_winsize = enable ? cpu_to_le16(params->buf_size) : 0;
1097 		ba->ba_en = enable;
1098 	} else {
1099 		memcpy(ba->peer_addr, params->sta->addr, ETH_ALEN);
1100 		ba->ba_type = MT_BA_TYPE_RECIPIENT;
1101 		ba->rst_ba_tid = params->tid;
1102 		ba->rst_ba_sel = RST_BA_MAC_TID_MATCH;
1103 		ba->rst_ba_sb = 1;
1104 	}
1105 
1106 	if (!is_connac_v1(dev)) {
1107 		ba->ba_winsize = enable ? cpu_to_le16(params->buf_size) : 0;
1108 		return;
1109 	}
1110 
1111 	if (enable && tx) {
1112 		static const u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 };
1113 		int i;
1114 
1115 		for (i = 7; i > 0; i--) {
1116 			if (params->buf_size >= ba_range[i])
1117 				break;
1118 		}
1119 		ba->ba_winsize_idx = i;
1120 	}
1121 }
1122 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ba_tlv);
1123 
1124 int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
1125 				struct ieee80211_vif *vif,
1126 				struct mt76_wcid *wcid,
1127 				bool enable)
1128 {
1129 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1130 	struct mt76_dev *dev = phy->dev;
1131 	struct {
1132 		struct {
1133 			u8 omac_idx;
1134 			u8 band_idx;
1135 			__le16 pad;
1136 		} __packed hdr;
1137 		struct req_tlv {
1138 			__le16 tag;
1139 			__le16 len;
1140 			u8 active;
1141 			u8 pad;
1142 			u8 omac_addr[ETH_ALEN];
1143 		} __packed tlv;
1144 	} dev_req = {
1145 		.hdr = {
1146 			.omac_idx = mvif->omac_idx,
1147 			.band_idx = mvif->band_idx,
1148 		},
1149 		.tlv = {
1150 			.tag = cpu_to_le16(DEV_INFO_ACTIVE),
1151 			.len = cpu_to_le16(sizeof(struct req_tlv)),
1152 			.active = enable,
1153 		},
1154 	};
1155 	struct {
1156 		struct {
1157 			u8 bss_idx;
1158 			u8 pad[3];
1159 		} __packed hdr;
1160 		struct mt76_connac_bss_basic_tlv basic;
1161 	} basic_req = {
1162 		.hdr = {
1163 			.bss_idx = mvif->idx,
1164 		},
1165 		.basic = {
1166 			.tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
1167 			.len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)),
1168 			.omac_idx = mvif->omac_idx,
1169 			.band_idx = mvif->band_idx,
1170 			.wmm_idx = mvif->wmm_idx,
1171 			.active = enable,
1172 			.bmc_tx_wlan_idx = cpu_to_le16(wcid->idx),
1173 			.sta_idx = cpu_to_le16(wcid->idx),
1174 			.conn_state = 1,
1175 		},
1176 	};
1177 	int err, idx, cmd, len;
1178 	void *data;
1179 
1180 	switch (vif->type) {
1181 	case NL80211_IFTYPE_MESH_POINT:
1182 	case NL80211_IFTYPE_MONITOR:
1183 	case NL80211_IFTYPE_AP:
1184 		basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
1185 		break;
1186 	case NL80211_IFTYPE_STATION:
1187 		basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
1188 		break;
1189 	case NL80211_IFTYPE_ADHOC:
1190 		basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1191 		break;
1192 	default:
1193 		WARN_ON(1);
1194 		break;
1195 	}
1196 
1197 	idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
1198 	basic_req.basic.hw_bss_idx = idx;
1199 
1200 	memcpy(dev_req.tlv.omac_addr, vif->addr, ETH_ALEN);
1201 
1202 	cmd = enable ? MCU_UNI_CMD(DEV_INFO_UPDATE) : MCU_UNI_CMD(BSS_INFO_UPDATE);
1203 	data = enable ? (void *)&dev_req : (void *)&basic_req;
1204 	len = enable ? sizeof(dev_req) : sizeof(basic_req);
1205 
1206 	err = mt76_mcu_send_msg(dev, cmd, data, len, true);
1207 	if (err < 0)
1208 		return err;
1209 
1210 	cmd = enable ? MCU_UNI_CMD(BSS_INFO_UPDATE) : MCU_UNI_CMD(DEV_INFO_UPDATE);
1211 	data = enable ? (void *)&basic_req : (void *)&dev_req;
1212 	len = enable ? sizeof(basic_req) : sizeof(dev_req);
1213 
1214 	return mt76_mcu_send_msg(dev, cmd, data, len, true);
1215 }
1216 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_dev);
1217 
1218 void mt76_connac_mcu_sta_ba_tlv(struct sk_buff *skb,
1219 				struct ieee80211_ampdu_params *params,
1220 				bool enable, bool tx)
1221 {
1222 	struct sta_rec_ba *ba;
1223 	struct tlv *tlv;
1224 
1225 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
1226 
1227 	ba = (struct sta_rec_ba *)tlv;
1228 	ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT;
1229 	ba->winsize = cpu_to_le16(params->buf_size);
1230 	ba->ssn = cpu_to_le16(params->ssn);
1231 	ba->ba_en = enable << params->tid;
1232 	ba->amsdu = params->amsdu;
1233 	ba->tid = params->tid;
1234 }
1235 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba_tlv);
1236 
1237 int mt76_connac_mcu_sta_wed_update(struct mt76_dev *dev, struct sk_buff *skb)
1238 {
1239 	if (!mt76_is_mmio(dev))
1240 		return 0;
1241 
1242 	if (!mtk_wed_device_active(&dev->mmio.wed))
1243 		return 0;
1244 
1245 	return mtk_wed_device_update_msg(&dev->mmio.wed, WED_WO_STA_REC,
1246 					 skb->data, skb->len);
1247 }
1248 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_wed_update);
1249 
1250 int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
1251 			   struct ieee80211_ampdu_params *params,
1252 			   int cmd, bool enable, bool tx)
1253 {
1254 	struct mt76_wcid *wcid = (struct mt76_wcid *)params->sta->drv_priv;
1255 	struct wtbl_req_hdr *wtbl_hdr;
1256 	struct tlv *sta_wtbl;
1257 	struct sk_buff *skb;
1258 	int ret;
1259 
1260 	skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
1261 	if (IS_ERR(skb))
1262 		return PTR_ERR(skb);
1263 
1264 	sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1265 					   sizeof(struct tlv));
1266 
1267 	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET,
1268 						  sta_wtbl, &skb);
1269 	if (IS_ERR(wtbl_hdr))
1270 		return PTR_ERR(wtbl_hdr);
1271 
1272 	mt76_connac_mcu_wtbl_ba_tlv(dev, skb, params, enable, tx, sta_wtbl,
1273 				    wtbl_hdr);
1274 
1275 	ret = mt76_connac_mcu_sta_wed_update(dev, skb);
1276 	if (ret)
1277 		return ret;
1278 
1279 	ret = mt76_mcu_skb_send_msg(dev, skb, cmd, true);
1280 	if (ret)
1281 		return ret;
1282 
1283 	skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
1284 	if (IS_ERR(skb))
1285 		return PTR_ERR(skb);
1286 
1287 	mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx);
1288 
1289 	ret = mt76_connac_mcu_sta_wed_update(dev, skb);
1290 	if (ret)
1291 		return ret;
1292 
1293 	return mt76_mcu_skb_send_msg(dev, skb, cmd, true);
1294 }
1295 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba);
1296 
1297 u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
1298 			    enum nl80211_band band, struct ieee80211_sta *sta)
1299 {
1300 	struct mt76_dev *dev = phy->dev;
1301 	const struct ieee80211_sta_he_cap *he_cap;
1302 	struct ieee80211_sta_vht_cap *vht_cap;
1303 	struct ieee80211_sta_ht_cap *ht_cap;
1304 	u8 mode = 0;
1305 
1306 	if (is_connac_v1(dev))
1307 		return 0x38;
1308 
1309 	if (sta) {
1310 		ht_cap = &sta->deflink.ht_cap;
1311 		vht_cap = &sta->deflink.vht_cap;
1312 		he_cap = &sta->deflink.he_cap;
1313 	} else {
1314 		struct ieee80211_supported_band *sband;
1315 
1316 		sband = phy->hw->wiphy->bands[band];
1317 		ht_cap = &sband->ht_cap;
1318 		vht_cap = &sband->vht_cap;
1319 		he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
1320 	}
1321 
1322 	if (band == NL80211_BAND_2GHZ) {
1323 		mode |= PHY_MODE_B | PHY_MODE_G;
1324 
1325 		if (ht_cap->ht_supported)
1326 			mode |= PHY_MODE_GN;
1327 
1328 		if (he_cap && he_cap->has_he)
1329 			mode |= PHY_MODE_AX_24G;
1330 	} else if (band == NL80211_BAND_5GHZ) {
1331 		mode |= PHY_MODE_A;
1332 
1333 		if (ht_cap->ht_supported)
1334 			mode |= PHY_MODE_AN;
1335 
1336 		if (vht_cap->vht_supported)
1337 			mode |= PHY_MODE_AC;
1338 
1339 		if (he_cap && he_cap->has_he)
1340 			mode |= PHY_MODE_AX_5G;
1341 	} else if (band == NL80211_BAND_6GHZ) {
1342 		mode |= PHY_MODE_A | PHY_MODE_AN |
1343 			PHY_MODE_AC | PHY_MODE_AX_5G;
1344 	}
1345 
1346 	return mode;
1347 }
1348 EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode);
1349 
1350 u8 mt76_connac_get_phy_mode_ext(struct mt76_phy *phy, struct ieee80211_vif *vif,
1351 				enum nl80211_band band)
1352 {
1353 	const struct ieee80211_sta_eht_cap *eht_cap;
1354 	struct ieee80211_supported_band *sband;
1355 	u8 mode = 0;
1356 
1357 	if (band == NL80211_BAND_6GHZ)
1358 		mode |= PHY_MODE_AX_6G;
1359 
1360 	sband = phy->hw->wiphy->bands[band];
1361 	eht_cap = ieee80211_get_eht_iftype_cap(sband, vif->type);
1362 
1363 	if (!eht_cap || !eht_cap->has_eht || !vif->bss_conf.eht_support)
1364 		return mode;
1365 
1366 	switch (band) {
1367 	case NL80211_BAND_6GHZ:
1368 		mode |= PHY_MODE_BE_6G;
1369 		break;
1370 	case NL80211_BAND_5GHZ:
1371 		mode |= PHY_MODE_BE_5G;
1372 		break;
1373 	case NL80211_BAND_2GHZ:
1374 		mode |= PHY_MODE_BE_24G;
1375 		break;
1376 	default:
1377 		break;
1378 	}
1379 
1380 	return mode;
1381 }
1382 EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode_ext);
1383 
1384 const struct ieee80211_sta_he_cap *
1385 mt76_connac_get_he_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif)
1386 {
1387 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1388 	struct cfg80211_chan_def *chandef = mvif->ctx ?
1389 					    &mvif->ctx->def : &phy->chandef;
1390 	enum nl80211_band band = chandef->chan->band;
1391 	struct ieee80211_supported_band *sband;
1392 
1393 	sband = phy->hw->wiphy->bands[band];
1394 
1395 	return ieee80211_get_he_iftype_cap(sband, vif->type);
1396 }
1397 EXPORT_SYMBOL_GPL(mt76_connac_get_he_phy_cap);
1398 
1399 const struct ieee80211_sta_eht_cap *
1400 mt76_connac_get_eht_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif)
1401 {
1402 	enum nl80211_band band = phy->chandef.chan->band;
1403 	struct ieee80211_supported_band *sband;
1404 
1405 	sband = phy->hw->wiphy->bands[band];
1406 
1407 	return ieee80211_get_eht_iftype_cap(sband, vif->type);
1408 }
1409 EXPORT_SYMBOL_GPL(mt76_connac_get_eht_phy_cap);
1410 
1411 #define DEFAULT_HE_PE_DURATION		4
1412 #define DEFAULT_HE_DURATION_RTS_THRES	1023
1413 static void
1414 mt76_connac_mcu_uni_bss_he_tlv(struct mt76_phy *phy, struct ieee80211_vif *vif,
1415 			       struct tlv *tlv)
1416 {
1417 	const struct ieee80211_sta_he_cap *cap;
1418 	struct bss_info_uni_he *he;
1419 
1420 	cap = mt76_connac_get_he_phy_cap(phy, vif);
1421 
1422 	he = (struct bss_info_uni_he *)tlv;
1423 	he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext;
1424 	if (!he->he_pe_duration)
1425 		he->he_pe_duration = DEFAULT_HE_PE_DURATION;
1426 
1427 	he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th);
1428 	if (!he->he_rts_thres)
1429 		he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
1430 
1431 	he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
1432 	he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
1433 	he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
1434 }
1435 
1436 int mt76_connac_mcu_uni_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif,
1437 				  struct ieee80211_chanctx_conf *ctx)
1438 {
1439 	struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef;
1440 	int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
1441 	enum nl80211_band band = chandef->chan->band;
1442 	struct mt76_dev *mdev = phy->dev;
1443 	struct {
1444 		struct {
1445 			u8 bss_idx;
1446 			u8 pad[3];
1447 		} __packed hdr;
1448 		struct rlm_tlv {
1449 			__le16 tag;
1450 			__le16 len;
1451 			u8 control_channel;
1452 			u8 center_chan;
1453 			u8 center_chan2;
1454 			u8 bw;
1455 			u8 tx_streams;
1456 			u8 rx_streams;
1457 			u8 short_st;
1458 			u8 ht_op_info;
1459 			u8 sco;
1460 			u8 band;
1461 			u8 pad[2];
1462 		} __packed rlm;
1463 	} __packed rlm_req = {
1464 		.hdr = {
1465 			.bss_idx = mvif->idx,
1466 		},
1467 		.rlm = {
1468 			.tag = cpu_to_le16(UNI_BSS_INFO_RLM),
1469 			.len = cpu_to_le16(sizeof(struct rlm_tlv)),
1470 			.control_channel = chandef->chan->hw_value,
1471 			.center_chan = ieee80211_frequency_to_channel(freq1),
1472 			.center_chan2 = ieee80211_frequency_to_channel(freq2),
1473 			.tx_streams = hweight8(phy->antenna_mask),
1474 			.ht_op_info = 4, /* set HT 40M allowed */
1475 			.rx_streams = phy->chainmask,
1476 			.short_st = true,
1477 			.band = band,
1478 		},
1479 	};
1480 
1481 	switch (chandef->width) {
1482 	case NL80211_CHAN_WIDTH_40:
1483 		rlm_req.rlm.bw = CMD_CBW_40MHZ;
1484 		break;
1485 	case NL80211_CHAN_WIDTH_80:
1486 		rlm_req.rlm.bw = CMD_CBW_80MHZ;
1487 		break;
1488 	case NL80211_CHAN_WIDTH_80P80:
1489 		rlm_req.rlm.bw = CMD_CBW_8080MHZ;
1490 		break;
1491 	case NL80211_CHAN_WIDTH_160:
1492 		rlm_req.rlm.bw = CMD_CBW_160MHZ;
1493 		break;
1494 	case NL80211_CHAN_WIDTH_5:
1495 		rlm_req.rlm.bw = CMD_CBW_5MHZ;
1496 		break;
1497 	case NL80211_CHAN_WIDTH_10:
1498 		rlm_req.rlm.bw = CMD_CBW_10MHZ;
1499 		break;
1500 	case NL80211_CHAN_WIDTH_20_NOHT:
1501 	case NL80211_CHAN_WIDTH_20:
1502 	default:
1503 		rlm_req.rlm.bw = CMD_CBW_20MHZ;
1504 		rlm_req.rlm.ht_op_info = 0;
1505 		break;
1506 	}
1507 
1508 	if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan)
1509 		rlm_req.rlm.sco = 1; /* SCA */
1510 	else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan)
1511 		rlm_req.rlm.sco = 3; /* SCB */
1512 
1513 	return mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &rlm_req,
1514 				 sizeof(rlm_req), true);
1515 }
1516 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_set_chctx);
1517 
1518 int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
1519 				struct ieee80211_vif *vif,
1520 				struct mt76_wcid *wcid,
1521 				bool enable,
1522 				struct ieee80211_chanctx_conf *ctx)
1523 {
1524 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1525 	struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef;
1526 	enum nl80211_band band = chandef->chan->band;
1527 	struct mt76_dev *mdev = phy->dev;
1528 	struct {
1529 		struct {
1530 			u8 bss_idx;
1531 			u8 pad[3];
1532 		} __packed hdr;
1533 		struct mt76_connac_bss_basic_tlv basic;
1534 		struct mt76_connac_bss_qos_tlv qos;
1535 	} basic_req = {
1536 		.hdr = {
1537 			.bss_idx = mvif->idx,
1538 		},
1539 		.basic = {
1540 			.tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
1541 			.len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)),
1542 			.bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
1543 			.dtim_period = vif->bss_conf.dtim_period,
1544 			.omac_idx = mvif->omac_idx,
1545 			.band_idx = mvif->band_idx,
1546 			.wmm_idx = mvif->wmm_idx,
1547 			.active = true, /* keep bss deactivated */
1548 			.phymode = mt76_connac_get_phy_mode(phy, vif, band, NULL),
1549 		},
1550 		.qos = {
1551 			.tag = cpu_to_le16(UNI_BSS_INFO_QBSS),
1552 			.len = cpu_to_le16(sizeof(struct mt76_connac_bss_qos_tlv)),
1553 			.qos = vif->bss_conf.qos,
1554 		},
1555 	};
1556 	int err, conn_type;
1557 	u8 idx, basic_phy;
1558 
1559 	idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
1560 	basic_req.basic.hw_bss_idx = idx;
1561 	if (band == NL80211_BAND_6GHZ)
1562 		basic_req.basic.phymode_ext = PHY_MODE_AX_6G;
1563 
1564 	basic_phy = mt76_connac_get_phy_mode_v2(phy, vif, band, NULL);
1565 	basic_req.basic.nonht_basic_phy = cpu_to_le16(basic_phy);
1566 
1567 	switch (vif->type) {
1568 	case NL80211_IFTYPE_MESH_POINT:
1569 	case NL80211_IFTYPE_AP:
1570 		if (vif->p2p)
1571 			conn_type = CONNECTION_P2P_GO;
1572 		else
1573 			conn_type = CONNECTION_INFRA_AP;
1574 		basic_req.basic.conn_type = cpu_to_le32(conn_type);
1575 		/* Fully active/deactivate BSS network in AP mode only */
1576 		basic_req.basic.active = enable;
1577 		break;
1578 	case NL80211_IFTYPE_STATION:
1579 		if (vif->p2p)
1580 			conn_type = CONNECTION_P2P_GC;
1581 		else
1582 			conn_type = CONNECTION_INFRA_STA;
1583 		basic_req.basic.conn_type = cpu_to_le32(conn_type);
1584 		break;
1585 	case NL80211_IFTYPE_ADHOC:
1586 		basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1587 		break;
1588 	default:
1589 		WARN_ON(1);
1590 		break;
1591 	}
1592 
1593 	memcpy(basic_req.basic.bssid, vif->bss_conf.bssid, ETH_ALEN);
1594 	basic_req.basic.bmc_tx_wlan_idx = cpu_to_le16(wcid->idx);
1595 	basic_req.basic.sta_idx = cpu_to_le16(wcid->idx);
1596 	basic_req.basic.conn_state = !enable;
1597 
1598 	err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &basic_req,
1599 				sizeof(basic_req), true);
1600 	if (err < 0)
1601 		return err;
1602 
1603 	if (vif->bss_conf.he_support) {
1604 		struct {
1605 			struct {
1606 				u8 bss_idx;
1607 				u8 pad[3];
1608 			} __packed hdr;
1609 			struct bss_info_uni_he he;
1610 			struct bss_info_uni_bss_color bss_color;
1611 		} he_req = {
1612 			.hdr = {
1613 				.bss_idx = mvif->idx,
1614 			},
1615 			.he = {
1616 				.tag = cpu_to_le16(UNI_BSS_INFO_HE_BASIC),
1617 				.len = cpu_to_le16(sizeof(struct bss_info_uni_he)),
1618 			},
1619 			.bss_color = {
1620 				.tag = cpu_to_le16(UNI_BSS_INFO_BSS_COLOR),
1621 				.len = cpu_to_le16(sizeof(struct bss_info_uni_bss_color)),
1622 				.enable = 0,
1623 				.bss_color = 0,
1624 			},
1625 		};
1626 
1627 		if (enable) {
1628 			he_req.bss_color.enable =
1629 				vif->bss_conf.he_bss_color.enabled;
1630 			he_req.bss_color.bss_color =
1631 				vif->bss_conf.he_bss_color.color;
1632 		}
1633 
1634 		mt76_connac_mcu_uni_bss_he_tlv(phy, vif,
1635 					       (struct tlv *)&he_req.he);
1636 		err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE),
1637 					&he_req, sizeof(he_req), true);
1638 		if (err < 0)
1639 			return err;
1640 	}
1641 
1642 	return mt76_connac_mcu_uni_set_chctx(phy, mvif, ctx);
1643 }
1644 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_bss);
1645 
1646 #define MT76_CONNAC_SCAN_CHANNEL_TIME		60
1647 int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
1648 			    struct ieee80211_scan_request *scan_req)
1649 {
1650 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1651 	struct cfg80211_scan_request *sreq = &scan_req->req;
1652 	int n_ssids = 0, err, i, duration;
1653 	int ext_channels_num = max_t(int, sreq->n_channels - 32, 0);
1654 	struct ieee80211_channel **scan_list = sreq->channels;
1655 	struct mt76_dev *mdev = phy->dev;
1656 	struct mt76_connac_mcu_scan_channel *chan;
1657 	struct mt76_connac_hw_scan_req *req;
1658 	struct sk_buff *skb;
1659 
1660 	if (test_bit(MT76_HW_SCANNING, &phy->state))
1661 		return -EBUSY;
1662 
1663 	skb = mt76_mcu_msg_alloc(mdev, NULL, sizeof(*req));
1664 	if (!skb)
1665 		return -ENOMEM;
1666 
1667 	set_bit(MT76_HW_SCANNING, &phy->state);
1668 	mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
1669 
1670 	req = (struct mt76_connac_hw_scan_req *)skb_put(skb, sizeof(*req));
1671 
1672 	req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
1673 	req->bss_idx = mvif->idx;
1674 	req->scan_type = sreq->n_ssids ? 1 : 0;
1675 	req->probe_req_num = sreq->n_ssids ? 2 : 0;
1676 	req->version = 1;
1677 
1678 	for (i = 0; i < sreq->n_ssids; i++) {
1679 		if (!sreq->ssids[i].ssid_len)
1680 			continue;
1681 
1682 		req->ssids[i].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len);
1683 		memcpy(req->ssids[i].ssid, sreq->ssids[i].ssid,
1684 		       sreq->ssids[i].ssid_len);
1685 		n_ssids++;
1686 	}
1687 	req->ssid_type = n_ssids ? BIT(2) : BIT(0);
1688 	req->ssid_type_ext = n_ssids ? BIT(0) : 0;
1689 	req->ssids_num = n_ssids;
1690 
1691 	duration = is_mt7921(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME;
1692 	/* increase channel time for passive scan */
1693 	if (!sreq->n_ssids)
1694 		duration *= 2;
1695 	req->timeout_value = cpu_to_le16(sreq->n_channels * duration);
1696 	req->channel_min_dwell_time = cpu_to_le16(duration);
1697 	req->channel_dwell_time = cpu_to_le16(duration);
1698 
1699 	if (sreq->n_channels == 0 || sreq->n_channels > 64) {
1700 		req->channel_type = 0;
1701 		req->channels_num = 0;
1702 		req->ext_channels_num = 0;
1703 	} else {
1704 		req->channel_type = 4;
1705 		req->channels_num = min_t(u8, sreq->n_channels, 32);
1706 		req->ext_channels_num = min_t(u8, ext_channels_num, 32);
1707 	}
1708 
1709 	for (i = 0; i < req->channels_num + req->ext_channels_num; i++) {
1710 		if (i >= 32)
1711 			chan = &req->ext_channels[i - 32];
1712 		else
1713 			chan = &req->channels[i];
1714 
1715 		switch (scan_list[i]->band) {
1716 		case NL80211_BAND_2GHZ:
1717 			chan->band = 1;
1718 			break;
1719 		case NL80211_BAND_6GHZ:
1720 			chan->band = 3;
1721 			break;
1722 		default:
1723 			chan->band = 2;
1724 			break;
1725 		}
1726 		chan->channel_num = scan_list[i]->hw_value;
1727 	}
1728 
1729 	if (sreq->ie_len > 0) {
1730 		memcpy(req->ies, sreq->ie, sreq->ie_len);
1731 		req->ies_len = cpu_to_le16(sreq->ie_len);
1732 	}
1733 
1734 	if (is_mt7921(phy->dev))
1735 		req->scan_func |= SCAN_FUNC_SPLIT_SCAN;
1736 
1737 	memcpy(req->bssid, sreq->bssid, ETH_ALEN);
1738 	if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
1739 		get_random_mask_addr(req->random_mac, sreq->mac_addr,
1740 				     sreq->mac_addr_mask);
1741 		req->scan_func |= SCAN_FUNC_RANDOM_MAC;
1742 	}
1743 
1744 	err = mt76_mcu_skb_send_msg(mdev, skb, MCU_CE_CMD(START_HW_SCAN),
1745 				    false);
1746 	if (err < 0)
1747 		clear_bit(MT76_HW_SCANNING, &phy->state);
1748 
1749 	return err;
1750 }
1751 EXPORT_SYMBOL_GPL(mt76_connac_mcu_hw_scan);
1752 
1753 int mt76_connac_mcu_cancel_hw_scan(struct mt76_phy *phy,
1754 				   struct ieee80211_vif *vif)
1755 {
1756 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1757 	struct {
1758 		u8 seq_num;
1759 		u8 is_ext_channel;
1760 		u8 rsv[2];
1761 	} __packed req = {
1762 		.seq_num = mvif->scan_seq_num,
1763 	};
1764 
1765 	if (test_and_clear_bit(MT76_HW_SCANNING, &phy->state)) {
1766 		struct cfg80211_scan_info info = {
1767 			.aborted = true,
1768 		};
1769 
1770 		ieee80211_scan_completed(phy->hw, &info);
1771 	}
1772 
1773 	return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(CANCEL_HW_SCAN),
1774 				 &req, sizeof(req), false);
1775 }
1776 EXPORT_SYMBOL_GPL(mt76_connac_mcu_cancel_hw_scan);
1777 
1778 int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
1779 				   struct ieee80211_vif *vif,
1780 				   struct cfg80211_sched_scan_request *sreq)
1781 {
1782 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1783 	struct ieee80211_channel **scan_list = sreq->channels;
1784 	struct mt76_connac_mcu_scan_channel *chan;
1785 	struct mt76_connac_sched_scan_req *req;
1786 	struct mt76_dev *mdev = phy->dev;
1787 	struct cfg80211_match_set *match;
1788 	struct cfg80211_ssid *ssid;
1789 	struct sk_buff *skb;
1790 	int i;
1791 
1792 	skb = mt76_mcu_msg_alloc(mdev, NULL, sizeof(*req) + sreq->ie_len);
1793 	if (!skb)
1794 		return -ENOMEM;
1795 
1796 	mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
1797 
1798 	req = (struct mt76_connac_sched_scan_req *)skb_put(skb, sizeof(*req));
1799 	req->version = 1;
1800 	req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
1801 
1802 	if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
1803 		u8 *addr = is_mt7663(phy->dev) ? req->mt7663.random_mac
1804 					       : req->mt7921.random_mac;
1805 
1806 		req->scan_func = 1;
1807 		get_random_mask_addr(addr, sreq->mac_addr,
1808 				     sreq->mac_addr_mask);
1809 	}
1810 	if (is_mt7921(phy->dev)) {
1811 		req->mt7921.bss_idx = mvif->idx;
1812 		req->mt7921.delay = cpu_to_le32(sreq->delay);
1813 	}
1814 
1815 	req->ssids_num = sreq->n_ssids;
1816 	for (i = 0; i < req->ssids_num; i++) {
1817 		ssid = &sreq->ssids[i];
1818 		memcpy(req->ssids[i].ssid, ssid->ssid, ssid->ssid_len);
1819 		req->ssids[i].ssid_len = cpu_to_le32(ssid->ssid_len);
1820 	}
1821 
1822 	req->match_num = sreq->n_match_sets;
1823 	for (i = 0; i < req->match_num; i++) {
1824 		match = &sreq->match_sets[i];
1825 		memcpy(req->match[i].ssid, match->ssid.ssid,
1826 		       match->ssid.ssid_len);
1827 		req->match[i].rssi_th = cpu_to_le32(match->rssi_thold);
1828 		req->match[i].ssid_len = match->ssid.ssid_len;
1829 	}
1830 
1831 	req->channel_type = sreq->n_channels ? 4 : 0;
1832 	req->channels_num = min_t(u8, sreq->n_channels, 64);
1833 	for (i = 0; i < req->channels_num; i++) {
1834 		chan = &req->channels[i];
1835 
1836 		switch (scan_list[i]->band) {
1837 		case NL80211_BAND_2GHZ:
1838 			chan->band = 1;
1839 			break;
1840 		case NL80211_BAND_6GHZ:
1841 			chan->band = 3;
1842 			break;
1843 		default:
1844 			chan->band = 2;
1845 			break;
1846 		}
1847 		chan->channel_num = scan_list[i]->hw_value;
1848 	}
1849 
1850 	req->intervals_num = sreq->n_scan_plans;
1851 	for (i = 0; i < req->intervals_num; i++)
1852 		req->intervals[i] = cpu_to_le16(sreq->scan_plans[i].interval);
1853 
1854 	if (sreq->ie_len > 0) {
1855 		req->ie_len = cpu_to_le16(sreq->ie_len);
1856 		memcpy(skb_put(skb, sreq->ie_len), sreq->ie, sreq->ie_len);
1857 	}
1858 
1859 	return mt76_mcu_skb_send_msg(mdev, skb, MCU_CE_CMD(SCHED_SCAN_REQ),
1860 				     false);
1861 }
1862 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sched_scan_req);
1863 
1864 int mt76_connac_mcu_sched_scan_enable(struct mt76_phy *phy,
1865 				      struct ieee80211_vif *vif,
1866 				      bool enable)
1867 {
1868 	struct {
1869 		u8 active; /* 0: enabled 1: disabled */
1870 		u8 rsv[3];
1871 	} __packed req = {
1872 		.active = !enable,
1873 	};
1874 
1875 	if (enable)
1876 		set_bit(MT76_HW_SCHED_SCANNING, &phy->state);
1877 	else
1878 		clear_bit(MT76_HW_SCHED_SCANNING, &phy->state);
1879 
1880 	return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(SCHED_SCAN_ENABLE),
1881 				 &req, sizeof(req), false);
1882 }
1883 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sched_scan_enable);
1884 
1885 int mt76_connac_mcu_chip_config(struct mt76_dev *dev)
1886 {
1887 	struct mt76_connac_config req = {
1888 		.resp_type = 0,
1889 	};
1890 
1891 	memcpy(req.data, "assert", 7);
1892 
1893 	return mt76_mcu_send_msg(dev, MCU_CE_CMD(CHIP_CONFIG),
1894 				 &req, sizeof(req), false);
1895 }
1896 EXPORT_SYMBOL_GPL(mt76_connac_mcu_chip_config);
1897 
1898 int mt76_connac_mcu_set_deep_sleep(struct mt76_dev *dev, bool enable)
1899 {
1900 	struct mt76_connac_config req = {
1901 		.resp_type = 0,
1902 	};
1903 
1904 	snprintf(req.data, sizeof(req.data), "KeepFullPwr %d", !enable);
1905 
1906 	return mt76_mcu_send_msg(dev, MCU_CE_CMD(CHIP_CONFIG),
1907 				 &req, sizeof(req), false);
1908 }
1909 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_deep_sleep);
1910 
1911 int mt76_connac_sta_state_dp(struct mt76_dev *dev,
1912 			     enum ieee80211_sta_state old_state,
1913 			     enum ieee80211_sta_state new_state)
1914 {
1915 	if ((old_state == IEEE80211_STA_ASSOC &&
1916 	     new_state == IEEE80211_STA_AUTHORIZED) ||
1917 	    (old_state == IEEE80211_STA_NONE &&
1918 	     new_state == IEEE80211_STA_NOTEXIST))
1919 		mt76_connac_mcu_set_deep_sleep(dev, true);
1920 
1921 	if ((old_state == IEEE80211_STA_NOTEXIST &&
1922 	     new_state == IEEE80211_STA_NONE) ||
1923 	    (old_state == IEEE80211_STA_AUTHORIZED &&
1924 	     new_state == IEEE80211_STA_ASSOC))
1925 		mt76_connac_mcu_set_deep_sleep(dev, false);
1926 
1927 	return 0;
1928 }
1929 EXPORT_SYMBOL_GPL(mt76_connac_sta_state_dp);
1930 
1931 void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
1932 				    struct mt76_connac_coredump *coredump)
1933 {
1934 	spin_lock_bh(&dev->lock);
1935 	__skb_queue_tail(&coredump->msg_list, skb);
1936 	spin_unlock_bh(&dev->lock);
1937 
1938 	coredump->last_activity = jiffies;
1939 
1940 	queue_delayed_work(dev->wq, &coredump->work,
1941 			   MT76_CONNAC_COREDUMP_TIMEOUT);
1942 }
1943 EXPORT_SYMBOL_GPL(mt76_connac_mcu_coredump_event);
1944 
1945 static void
1946 mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
1947 			  struct mt76_power_limits *limits,
1948 			  enum nl80211_band band)
1949 {
1950 	int max_power = is_mt7921(dev) ? 127 : 63;
1951 	int i, offset = sizeof(limits->cck);
1952 
1953 	memset(sku, max_power, MT_SKU_POWER_LIMIT);
1954 
1955 	if (band == NL80211_BAND_2GHZ) {
1956 		/* cck */
1957 		memcpy(sku, limits->cck, sizeof(limits->cck));
1958 	}
1959 
1960 	/* ofdm */
1961 	memcpy(&sku[offset], limits->ofdm, sizeof(limits->ofdm));
1962 	offset += sizeof(limits->ofdm);
1963 
1964 	/* ht */
1965 	for (i = 0; i < 2; i++) {
1966 		memcpy(&sku[offset], limits->mcs[i], 8);
1967 		offset += 8;
1968 	}
1969 	sku[offset++] = limits->mcs[0][0];
1970 
1971 	/* vht */
1972 	for (i = 0; i < ARRAY_SIZE(limits->mcs); i++) {
1973 		memcpy(&sku[offset], limits->mcs[i],
1974 		       ARRAY_SIZE(limits->mcs[i]));
1975 		offset += 12;
1976 	}
1977 
1978 	if (!is_mt7921(dev))
1979 		return;
1980 
1981 	/* he */
1982 	for (i = 0; i < ARRAY_SIZE(limits->ru); i++) {
1983 		memcpy(&sku[offset], limits->ru[i], ARRAY_SIZE(limits->ru[i]));
1984 		offset += ARRAY_SIZE(limits->ru[i]);
1985 	}
1986 }
1987 
1988 s8 mt76_connac_get_ch_power(struct mt76_phy *phy,
1989 			    struct ieee80211_channel *chan,
1990 			    s8 target_power)
1991 {
1992 	struct mt76_dev *dev = phy->dev;
1993 	struct ieee80211_supported_band *sband;
1994 	int i;
1995 
1996 	switch (chan->band) {
1997 	case NL80211_BAND_2GHZ:
1998 		sband = &phy->sband_2g.sband;
1999 		break;
2000 	case NL80211_BAND_5GHZ:
2001 		sband = &phy->sband_5g.sband;
2002 		break;
2003 	case NL80211_BAND_6GHZ:
2004 		sband = &phy->sband_6g.sband;
2005 		break;
2006 	default:
2007 		return target_power;
2008 	}
2009 
2010 	for (i = 0; i < sband->n_channels; i++) {
2011 		struct ieee80211_channel *ch = &sband->channels[i];
2012 
2013 		if (ch->hw_value == chan->hw_value) {
2014 			if (!(ch->flags & IEEE80211_CHAN_DISABLED)) {
2015 				int power = 2 * ch->max_reg_power;
2016 
2017 				if (is_mt7663(dev) && (power > 63 || power < -64))
2018 					power = 63;
2019 				target_power = min_t(s8, power, target_power);
2020 			}
2021 			break;
2022 		}
2023 	}
2024 
2025 	return target_power;
2026 }
2027 EXPORT_SYMBOL_GPL(mt76_connac_get_ch_power);
2028 
2029 static int
2030 mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
2031 				  enum nl80211_band band)
2032 {
2033 	struct mt76_dev *dev = phy->dev;
2034 	int sku_len, batch_len = is_mt7921(dev) ? 8 : 16;
2035 	static const u8 chan_list_2ghz[] = {
2036 		1, 2,  3,  4,  5,  6,  7,
2037 		8, 9, 10, 11, 12, 13, 14
2038 	};
2039 	static const u8 chan_list_5ghz[] = {
2040 		 36,  38,  40,  42,  44,  46,  48,
2041 		 50,  52,  54,  56,  58,  60,  62,
2042 		 64, 100, 102, 104, 106, 108, 110,
2043 		112, 114, 116, 118, 120, 122, 124,
2044 		126, 128, 132, 134, 136, 138, 140,
2045 		142, 144, 149, 151, 153, 155, 157,
2046 		159, 161, 165, 169, 173, 177
2047 	};
2048 	static const u8 chan_list_6ghz[] = {
2049 		  1,   3,   5,   7,   9,  11,  13,
2050 		 15,  17,  19,  21,  23,  25,  27,
2051 		 29,  33,  35,  37,  39,  41,  43,
2052 		 45,  47,  49,  51,  53,  55,  57,
2053 		 59,  61,  65,  67,  69,  71,  73,
2054 		 75,  77,  79,  81,  83,  85,  87,
2055 		 89,  91,  93,  97,  99, 101, 103,
2056 		105, 107, 109, 111, 113, 115, 117,
2057 		119, 121, 123, 125, 129, 131, 133,
2058 		135, 137, 139, 141, 143, 145, 147,
2059 		149, 151, 153, 155, 157, 161, 163,
2060 		165, 167, 169, 171, 173, 175, 177,
2061 		179, 181, 183, 185, 187, 189, 193,
2062 		195, 197, 199, 201, 203, 205, 207,
2063 		209, 211, 213, 215, 217, 219, 221,
2064 		225, 227, 229, 233
2065 	};
2066 	int i, n_chan, batch_size, idx = 0, tx_power, last_ch, err = 0;
2067 	struct mt76_connac_sku_tlv sku_tlbv;
2068 	struct mt76_power_limits *limits;
2069 	const u8 *ch_list;
2070 
2071 	limits = devm_kmalloc(dev->dev, sizeof(*limits), GFP_KERNEL);
2072 	if (!limits)
2073 		return -ENOMEM;
2074 
2075 	sku_len = is_mt7921(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
2076 	tx_power = 2 * phy->hw->conf.power_level;
2077 	if (!tx_power)
2078 		tx_power = 127;
2079 
2080 	if (band == NL80211_BAND_2GHZ) {
2081 		n_chan = ARRAY_SIZE(chan_list_2ghz);
2082 		ch_list = chan_list_2ghz;
2083 	} else if (band == NL80211_BAND_6GHZ) {
2084 		n_chan = ARRAY_SIZE(chan_list_6ghz);
2085 		ch_list = chan_list_6ghz;
2086 	} else {
2087 		n_chan = ARRAY_SIZE(chan_list_5ghz);
2088 		ch_list = chan_list_5ghz;
2089 	}
2090 	batch_size = DIV_ROUND_UP(n_chan, batch_len);
2091 
2092 	if (phy->cap.has_6ghz)
2093 		last_ch = chan_list_6ghz[ARRAY_SIZE(chan_list_6ghz) - 1];
2094 	else if (phy->cap.has_5ghz)
2095 		last_ch = chan_list_5ghz[ARRAY_SIZE(chan_list_5ghz) - 1];
2096 	else
2097 		last_ch = chan_list_2ghz[ARRAY_SIZE(chan_list_2ghz) - 1];
2098 
2099 	for (i = 0; i < batch_size; i++) {
2100 		struct mt76_connac_tx_power_limit_tlv tx_power_tlv = {};
2101 		int j, msg_len, num_ch;
2102 		struct sk_buff *skb;
2103 
2104 		num_ch = i == batch_size - 1 ? n_chan % batch_len : batch_len;
2105 		msg_len = sizeof(tx_power_tlv) + num_ch * sizeof(sku_tlbv);
2106 		skb = mt76_mcu_msg_alloc(dev, NULL, msg_len);
2107 		if (!skb) {
2108 			err = -ENOMEM;
2109 			goto out;
2110 		}
2111 
2112 		skb_reserve(skb, sizeof(tx_power_tlv));
2113 
2114 		BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(tx_power_tlv.alpha2));
2115 		memcpy(tx_power_tlv.alpha2, dev->alpha2, sizeof(dev->alpha2));
2116 		tx_power_tlv.n_chan = num_ch;
2117 
2118 		switch (band) {
2119 		case NL80211_BAND_2GHZ:
2120 			tx_power_tlv.band = 1;
2121 			break;
2122 		case NL80211_BAND_6GHZ:
2123 			tx_power_tlv.band = 3;
2124 			break;
2125 		default:
2126 			tx_power_tlv.band = 2;
2127 			break;
2128 		}
2129 
2130 		for (j = 0; j < num_ch; j++, idx++) {
2131 			struct ieee80211_channel chan = {
2132 				.hw_value = ch_list[idx],
2133 				.band = band,
2134 			};
2135 			s8 reg_power, sar_power;
2136 
2137 			reg_power = mt76_connac_get_ch_power(phy, &chan,
2138 							     tx_power);
2139 			sar_power = mt76_get_sar_power(phy, &chan, reg_power);
2140 
2141 			mt76_get_rate_power_limits(phy, &chan, limits,
2142 						   sar_power);
2143 
2144 			tx_power_tlv.last_msg = ch_list[idx] == last_ch;
2145 			sku_tlbv.channel = ch_list[idx];
2146 
2147 			mt76_connac_mcu_build_sku(dev, sku_tlbv.pwr_limit,
2148 						  limits, band);
2149 			skb_put_data(skb, &sku_tlbv, sku_len);
2150 		}
2151 		__skb_push(skb, sizeof(tx_power_tlv));
2152 		memcpy(skb->data, &tx_power_tlv, sizeof(tx_power_tlv));
2153 
2154 		err = mt76_mcu_skb_send_msg(dev, skb,
2155 					    MCU_CE_CMD(SET_RATE_TX_POWER),
2156 					    false);
2157 		if (err < 0)
2158 			goto out;
2159 	}
2160 
2161 out:
2162 	devm_kfree(dev->dev, limits);
2163 	return err;
2164 }
2165 
2166 int mt76_connac_mcu_set_rate_txpower(struct mt76_phy *phy)
2167 {
2168 	int err;
2169 
2170 	if (phy->cap.has_2ghz) {
2171 		err = mt76_connac_mcu_rate_txpower_band(phy,
2172 							NL80211_BAND_2GHZ);
2173 		if (err < 0)
2174 			return err;
2175 	}
2176 	if (phy->cap.has_5ghz) {
2177 		err = mt76_connac_mcu_rate_txpower_band(phy,
2178 							NL80211_BAND_5GHZ);
2179 		if (err < 0)
2180 			return err;
2181 	}
2182 	if (phy->cap.has_6ghz) {
2183 		err = mt76_connac_mcu_rate_txpower_band(phy,
2184 							NL80211_BAND_6GHZ);
2185 		if (err < 0)
2186 			return err;
2187 	}
2188 
2189 	return 0;
2190 }
2191 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rate_txpower);
2192 
2193 int mt76_connac_mcu_update_arp_filter(struct mt76_dev *dev,
2194 				      struct mt76_vif *vif,
2195 				      struct ieee80211_bss_conf *info)
2196 {
2197 	struct ieee80211_vif *mvif = container_of(info, struct ieee80211_vif,
2198 						  bss_conf);
2199 	struct sk_buff *skb;
2200 	int i, len = min_t(int, mvif->cfg.arp_addr_cnt,
2201 			   IEEE80211_BSS_ARP_ADDR_LIST_LEN);
2202 	struct {
2203 		struct {
2204 			u8 bss_idx;
2205 			u8 pad[3];
2206 		} __packed hdr;
2207 		struct mt76_connac_arpns_tlv arp;
2208 	} req_hdr = {
2209 		.hdr = {
2210 			.bss_idx = vif->idx,
2211 		},
2212 		.arp = {
2213 			.tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
2214 			.len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
2215 			.ips_num = len,
2216 			.mode = 2,  /* update */
2217 			.option = 1,
2218 		},
2219 	};
2220 
2221 	skb = mt76_mcu_msg_alloc(dev, NULL,
2222 				 sizeof(req_hdr) + len * sizeof(__be32));
2223 	if (!skb)
2224 		return -ENOMEM;
2225 
2226 	skb_put_data(skb, &req_hdr, sizeof(req_hdr));
2227 	for (i = 0; i < len; i++)
2228 		skb_put_data(skb, &mvif->cfg.arp_addr_list[i], sizeof(__be32));
2229 
2230 	return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(OFFLOAD), true);
2231 }
2232 EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_arp_filter);
2233 
2234 int mt76_connac_mcu_set_p2p_oppps(struct ieee80211_hw *hw,
2235 				  struct ieee80211_vif *vif)
2236 {
2237 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2238 	int ct_window = vif->bss_conf.p2p_noa_attr.oppps_ctwindow;
2239 	struct mt76_phy *phy = hw->priv;
2240 	struct {
2241 		__le32 ct_win;
2242 		u8 bss_idx;
2243 		u8 rsv[3];
2244 	} __packed req = {
2245 		.ct_win = cpu_to_le32(ct_window),
2246 		.bss_idx = mvif->idx,
2247 	};
2248 
2249 	return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(SET_P2P_OPPPS),
2250 				 &req, sizeof(req), false);
2251 }
2252 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_p2p_oppps);
2253 
2254 #ifdef CONFIG_PM
2255 
2256 const struct wiphy_wowlan_support mt76_connac_wowlan_support = {
2257 	.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
2258 		 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | WIPHY_WOWLAN_NET_DETECT,
2259 	.n_patterns = 1,
2260 	.pattern_min_len = 1,
2261 	.pattern_max_len = MT76_CONNAC_WOW_PATTEN_MAX_LEN,
2262 	.max_nd_match_sets = 10,
2263 };
2264 EXPORT_SYMBOL_GPL(mt76_connac_wowlan_support);
2265 
2266 static void
2267 mt76_connac_mcu_key_iter(struct ieee80211_hw *hw,
2268 			 struct ieee80211_vif *vif,
2269 			 struct ieee80211_sta *sta,
2270 			 struct ieee80211_key_conf *key,
2271 			 void *data)
2272 {
2273 	struct mt76_connac_gtk_rekey_tlv *gtk_tlv = data;
2274 	u32 cipher;
2275 
2276 	if (key->cipher != WLAN_CIPHER_SUITE_AES_CMAC &&
2277 	    key->cipher != WLAN_CIPHER_SUITE_CCMP &&
2278 	    key->cipher != WLAN_CIPHER_SUITE_TKIP)
2279 		return;
2280 
2281 	if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
2282 		cipher = BIT(3);
2283 	else
2284 		cipher = BIT(4);
2285 
2286 	/* we are assuming here to have a single pairwise key */
2287 	if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
2288 		if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
2289 			gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1);
2290 		else
2291 			gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2);
2292 
2293 		gtk_tlv->pairwise_cipher = cpu_to_le32(cipher);
2294 		gtk_tlv->keyid = key->keyidx;
2295 	} else {
2296 		gtk_tlv->group_cipher = cpu_to_le32(cipher);
2297 	}
2298 }
2299 
2300 int mt76_connac_mcu_update_gtk_rekey(struct ieee80211_hw *hw,
2301 				     struct ieee80211_vif *vif,
2302 				     struct cfg80211_gtk_rekey_data *key)
2303 {
2304 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2305 	struct mt76_connac_gtk_rekey_tlv *gtk_tlv;
2306 	struct mt76_phy *phy = hw->priv;
2307 	struct sk_buff *skb;
2308 	struct {
2309 		u8 bss_idx;
2310 		u8 pad[3];
2311 	} __packed hdr = {
2312 		.bss_idx = mvif->idx,
2313 	};
2314 
2315 	skb = mt76_mcu_msg_alloc(phy->dev, NULL,
2316 				 sizeof(hdr) + sizeof(*gtk_tlv));
2317 	if (!skb)
2318 		return -ENOMEM;
2319 
2320 	skb_put_data(skb, &hdr, sizeof(hdr));
2321 	gtk_tlv = (struct mt76_connac_gtk_rekey_tlv *)skb_put(skb,
2322 							 sizeof(*gtk_tlv));
2323 	gtk_tlv->tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY);
2324 	gtk_tlv->len = cpu_to_le16(sizeof(*gtk_tlv));
2325 	gtk_tlv->rekey_mode = 2;
2326 	gtk_tlv->option = 1;
2327 
2328 	rcu_read_lock();
2329 	ieee80211_iter_keys_rcu(hw, vif, mt76_connac_mcu_key_iter, gtk_tlv);
2330 	rcu_read_unlock();
2331 
2332 	memcpy(gtk_tlv->kek, key->kek, NL80211_KEK_LEN);
2333 	memcpy(gtk_tlv->kck, key->kck, NL80211_KCK_LEN);
2334 	memcpy(gtk_tlv->replay_ctr, key->replay_ctr, NL80211_REPLAY_CTR_LEN);
2335 
2336 	return mt76_mcu_skb_send_msg(phy->dev, skb,
2337 				     MCU_UNI_CMD(OFFLOAD), true);
2338 }
2339 EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_gtk_rekey);
2340 
2341 static int
2342 mt76_connac_mcu_set_arp_filter(struct mt76_dev *dev, struct ieee80211_vif *vif,
2343 			       bool suspend)
2344 {
2345 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2346 	struct {
2347 		struct {
2348 			u8 bss_idx;
2349 			u8 pad[3];
2350 		} __packed hdr;
2351 		struct mt76_connac_arpns_tlv arpns;
2352 	} req = {
2353 		.hdr = {
2354 			.bss_idx = mvif->idx,
2355 		},
2356 		.arpns = {
2357 			.tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
2358 			.len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
2359 			.mode = suspend,
2360 		},
2361 	};
2362 
2363 	return mt76_mcu_send_msg(dev, MCU_UNI_CMD(OFFLOAD), &req,
2364 				 sizeof(req), true);
2365 }
2366 
2367 int
2368 mt76_connac_mcu_set_gtk_rekey(struct mt76_dev *dev, struct ieee80211_vif *vif,
2369 			      bool suspend)
2370 {
2371 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2372 	struct {
2373 		struct {
2374 			u8 bss_idx;
2375 			u8 pad[3];
2376 		} __packed hdr;
2377 		struct mt76_connac_gtk_rekey_tlv gtk_tlv;
2378 	} __packed req = {
2379 		.hdr = {
2380 			.bss_idx = mvif->idx,
2381 		},
2382 		.gtk_tlv = {
2383 			.tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY),
2384 			.len = cpu_to_le16(sizeof(struct mt76_connac_gtk_rekey_tlv)),
2385 			.rekey_mode = !suspend,
2386 		},
2387 	};
2388 
2389 	return mt76_mcu_send_msg(dev, MCU_UNI_CMD(OFFLOAD), &req,
2390 				 sizeof(req), true);
2391 }
2392 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_gtk_rekey);
2393 
2394 int
2395 mt76_connac_mcu_set_suspend_mode(struct mt76_dev *dev,
2396 				 struct ieee80211_vif *vif,
2397 				 bool enable, u8 mdtim,
2398 				 bool wow_suspend)
2399 {
2400 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2401 	struct {
2402 		struct {
2403 			u8 bss_idx;
2404 			u8 pad[3];
2405 		} __packed hdr;
2406 		struct mt76_connac_suspend_tlv suspend_tlv;
2407 	} req = {
2408 		.hdr = {
2409 			.bss_idx = mvif->idx,
2410 		},
2411 		.suspend_tlv = {
2412 			.tag = cpu_to_le16(UNI_SUSPEND_MODE_SETTING),
2413 			.len = cpu_to_le16(sizeof(struct mt76_connac_suspend_tlv)),
2414 			.enable = enable,
2415 			.mdtim = mdtim,
2416 			.wow_suspend = wow_suspend,
2417 		},
2418 	};
2419 
2420 	return mt76_mcu_send_msg(dev, MCU_UNI_CMD(SUSPEND), &req,
2421 				 sizeof(req), true);
2422 }
2423 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_suspend_mode);
2424 
2425 static int
2426 mt76_connac_mcu_set_wow_pattern(struct mt76_dev *dev,
2427 				struct ieee80211_vif *vif,
2428 				u8 index, bool enable,
2429 				struct cfg80211_pkt_pattern *pattern)
2430 {
2431 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2432 	struct mt76_connac_wow_pattern_tlv *ptlv;
2433 	struct sk_buff *skb;
2434 	struct req_hdr {
2435 		u8 bss_idx;
2436 		u8 pad[3];
2437 	} __packed hdr = {
2438 		.bss_idx = mvif->idx,
2439 	};
2440 
2441 	skb = mt76_mcu_msg_alloc(dev, NULL, sizeof(hdr) + sizeof(*ptlv));
2442 	if (!skb)
2443 		return -ENOMEM;
2444 
2445 	skb_put_data(skb, &hdr, sizeof(hdr));
2446 	ptlv = (struct mt76_connac_wow_pattern_tlv *)skb_put(skb, sizeof(*ptlv));
2447 	ptlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
2448 	ptlv->len = cpu_to_le16(sizeof(*ptlv));
2449 	ptlv->data_len = pattern->pattern_len;
2450 	ptlv->enable = enable;
2451 	ptlv->index = index;
2452 
2453 	memcpy(ptlv->pattern, pattern->pattern, pattern->pattern_len);
2454 	memcpy(ptlv->mask, pattern->mask, DIV_ROUND_UP(pattern->pattern_len, 8));
2455 
2456 	return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(SUSPEND), true);
2457 }
2458 
2459 int
2460 mt76_connac_mcu_set_wow_ctrl(struct mt76_phy *phy, struct ieee80211_vif *vif,
2461 			     bool suspend, struct cfg80211_wowlan *wowlan)
2462 {
2463 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2464 	struct mt76_dev *dev = phy->dev;
2465 	struct {
2466 		struct {
2467 			u8 bss_idx;
2468 			u8 pad[3];
2469 		} __packed hdr;
2470 		struct mt76_connac_wow_ctrl_tlv wow_ctrl_tlv;
2471 		struct mt76_connac_wow_gpio_param_tlv gpio_tlv;
2472 	} req = {
2473 		.hdr = {
2474 			.bss_idx = mvif->idx,
2475 		},
2476 		.wow_ctrl_tlv = {
2477 			.tag = cpu_to_le16(UNI_SUSPEND_WOW_CTRL),
2478 			.len = cpu_to_le16(sizeof(struct mt76_connac_wow_ctrl_tlv)),
2479 			.cmd = suspend ? 1 : 2,
2480 		},
2481 		.gpio_tlv = {
2482 			.tag = cpu_to_le16(UNI_SUSPEND_WOW_GPIO_PARAM),
2483 			.len = cpu_to_le16(sizeof(struct mt76_connac_wow_gpio_param_tlv)),
2484 			.gpio_pin = 0xff, /* follow fw about GPIO pin */
2485 		},
2486 	};
2487 
2488 	if (wowlan->magic_pkt)
2489 		req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_MAGIC;
2490 	if (wowlan->disconnect)
2491 		req.wow_ctrl_tlv.trigger |= (UNI_WOW_DETECT_TYPE_DISCONNECT |
2492 					     UNI_WOW_DETECT_TYPE_BCN_LOST);
2493 	if (wowlan->nd_config) {
2494 		mt76_connac_mcu_sched_scan_req(phy, vif, wowlan->nd_config);
2495 		req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_SCH_SCAN_HIT;
2496 		mt76_connac_mcu_sched_scan_enable(phy, vif, suspend);
2497 	}
2498 	if (wowlan->n_patterns)
2499 		req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_BITMAP;
2500 
2501 	if (mt76_is_mmio(dev))
2502 		req.wow_ctrl_tlv.wakeup_hif = WOW_PCIE;
2503 	else if (mt76_is_usb(dev))
2504 		req.wow_ctrl_tlv.wakeup_hif = WOW_USB;
2505 	else if (mt76_is_sdio(dev))
2506 		req.wow_ctrl_tlv.wakeup_hif = WOW_GPIO;
2507 
2508 	return mt76_mcu_send_msg(dev, MCU_UNI_CMD(SUSPEND), &req,
2509 				 sizeof(req), true);
2510 }
2511 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_wow_ctrl);
2512 
2513 int mt76_connac_mcu_set_hif_suspend(struct mt76_dev *dev, bool suspend)
2514 {
2515 	struct {
2516 		struct {
2517 			u8 hif_type; /* 0x0: HIF_SDIO
2518 				      * 0x1: HIF_USB
2519 				      * 0x2: HIF_PCIE
2520 				      */
2521 			u8 pad[3];
2522 		} __packed hdr;
2523 		struct hif_suspend_tlv {
2524 			__le16 tag;
2525 			__le16 len;
2526 			u8 suspend;
2527 		} __packed hif_suspend;
2528 	} req = {
2529 		.hif_suspend = {
2530 			.tag = cpu_to_le16(0), /* 0: UNI_HIF_CTRL_BASIC */
2531 			.len = cpu_to_le16(sizeof(struct hif_suspend_tlv)),
2532 			.suspend = suspend,
2533 		},
2534 	};
2535 
2536 	if (mt76_is_mmio(dev))
2537 		req.hdr.hif_type = 2;
2538 	else if (mt76_is_usb(dev))
2539 		req.hdr.hif_type = 1;
2540 	else if (mt76_is_sdio(dev))
2541 		req.hdr.hif_type = 0;
2542 
2543 	return mt76_mcu_send_msg(dev, MCU_UNI_CMD(HIF_CTRL), &req,
2544 				 sizeof(req), true);
2545 }
2546 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_hif_suspend);
2547 
2548 void mt76_connac_mcu_set_suspend_iter(void *priv, u8 *mac,
2549 				      struct ieee80211_vif *vif)
2550 {
2551 	struct mt76_phy *phy = priv;
2552 	bool suspend = !test_bit(MT76_STATE_RUNNING, &phy->state);
2553 	struct ieee80211_hw *hw = phy->hw;
2554 	struct cfg80211_wowlan *wowlan = hw->wiphy->wowlan_config;
2555 	int i;
2556 
2557 	mt76_connac_mcu_set_gtk_rekey(phy->dev, vif, suspend);
2558 	mt76_connac_mcu_set_arp_filter(phy->dev, vif, suspend);
2559 
2560 	mt76_connac_mcu_set_suspend_mode(phy->dev, vif, suspend, 1, true);
2561 
2562 	for (i = 0; i < wowlan->n_patterns; i++)
2563 		mt76_connac_mcu_set_wow_pattern(phy->dev, vif, i, suspend,
2564 						&wowlan->patterns[i]);
2565 	mt76_connac_mcu_set_wow_ctrl(phy, vif, suspend, wowlan);
2566 }
2567 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_suspend_iter);
2568 #endif /* CONFIG_PM */
2569 
2570 u32 mt76_connac_mcu_reg_rr(struct mt76_dev *dev, u32 offset)
2571 {
2572 	struct {
2573 		__le32 addr;
2574 		__le32 val;
2575 	} __packed req = {
2576 		.addr = cpu_to_le32(offset),
2577 	};
2578 
2579 	return mt76_mcu_send_msg(dev, MCU_CE_QUERY(REG_READ), &req,
2580 				 sizeof(req), true);
2581 }
2582 EXPORT_SYMBOL_GPL(mt76_connac_mcu_reg_rr);
2583 
2584 void mt76_connac_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val)
2585 {
2586 	struct {
2587 		__le32 addr;
2588 		__le32 val;
2589 	} __packed req = {
2590 		.addr = cpu_to_le32(offset),
2591 		.val = cpu_to_le32(val),
2592 	};
2593 
2594 	mt76_mcu_send_msg(dev, MCU_CE_CMD(REG_WRITE), &req,
2595 			  sizeof(req), false);
2596 }
2597 EXPORT_SYMBOL_GPL(mt76_connac_mcu_reg_wr);
2598 
2599 static int
2600 mt76_connac_mcu_sta_key_tlv(struct mt76_connac_sta_key_conf *sta_key_conf,
2601 			    struct sk_buff *skb,
2602 			    struct ieee80211_key_conf *key,
2603 			    enum set_key_cmd cmd)
2604 {
2605 	struct sta_rec_sec *sec;
2606 	u32 len = sizeof(*sec);
2607 	struct tlv *tlv;
2608 
2609 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_KEY_V2, sizeof(*sec));
2610 	sec = (struct sta_rec_sec *)tlv;
2611 	sec->add = cmd;
2612 
2613 	if (cmd == SET_KEY) {
2614 		struct sec_key *sec_key;
2615 		u8 cipher;
2616 
2617 		cipher = mt76_connac_mcu_get_cipher(key->cipher);
2618 		if (cipher == MCU_CIPHER_NONE)
2619 			return -EOPNOTSUPP;
2620 
2621 		sec_key = &sec->key[0];
2622 		sec_key->cipher_len = sizeof(*sec_key);
2623 
2624 		if (cipher == MCU_CIPHER_BIP_CMAC_128) {
2625 			sec_key->cipher_id = MCU_CIPHER_AES_CCMP;
2626 			sec_key->key_id = sta_key_conf->keyidx;
2627 			sec_key->key_len = 16;
2628 			memcpy(sec_key->key, sta_key_conf->key, 16);
2629 
2630 			sec_key = &sec->key[1];
2631 			sec_key->cipher_id = MCU_CIPHER_BIP_CMAC_128;
2632 			sec_key->cipher_len = sizeof(*sec_key);
2633 			sec_key->key_len = 16;
2634 			memcpy(sec_key->key, key->key, 16);
2635 			sec->n_cipher = 2;
2636 		} else {
2637 			sec_key->cipher_id = cipher;
2638 			sec_key->key_id = key->keyidx;
2639 			sec_key->key_len = key->keylen;
2640 			memcpy(sec_key->key, key->key, key->keylen);
2641 
2642 			if (cipher == MCU_CIPHER_TKIP) {
2643 				/* Rx/Tx MIC keys are swapped */
2644 				memcpy(sec_key->key + 16, key->key + 24, 8);
2645 				memcpy(sec_key->key + 24, key->key + 16, 8);
2646 			}
2647 
2648 			/* store key_conf for BIP batch update */
2649 			if (cipher == MCU_CIPHER_AES_CCMP) {
2650 				memcpy(sta_key_conf->key, key->key, key->keylen);
2651 				sta_key_conf->keyidx = key->keyidx;
2652 			}
2653 
2654 			len -= sizeof(*sec_key);
2655 			sec->n_cipher = 1;
2656 		}
2657 	} else {
2658 		len -= sizeof(sec->key);
2659 		sec->n_cipher = 0;
2660 	}
2661 	sec->len = cpu_to_le16(len);
2662 
2663 	return 0;
2664 }
2665 
2666 int mt76_connac_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif,
2667 			    struct mt76_connac_sta_key_conf *sta_key_conf,
2668 			    struct ieee80211_key_conf *key, int mcu_cmd,
2669 			    struct mt76_wcid *wcid, enum set_key_cmd cmd)
2670 {
2671 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2672 	struct sk_buff *skb;
2673 	int ret;
2674 
2675 	skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
2676 	if (IS_ERR(skb))
2677 		return PTR_ERR(skb);
2678 
2679 	ret = mt76_connac_mcu_sta_key_tlv(sta_key_conf, skb, key, cmd);
2680 	if (ret)
2681 		return ret;
2682 
2683 	ret = mt76_connac_mcu_sta_wed_update(dev, skb);
2684 	if (ret)
2685 		return ret;
2686 
2687 	return mt76_mcu_skb_send_msg(dev, skb, mcu_cmd, true);
2688 }
2689 EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_key);
2690 
2691 /* SIFS 20us + 512 byte beacon transmitted by 1Mbps (3906us) */
2692 #define BCN_TX_ESTIMATE_TIME (4096 + 20)
2693 void mt76_connac_mcu_bss_ext_tlv(struct sk_buff *skb, struct mt76_vif *mvif)
2694 {
2695 	struct bss_info_ext_bss *ext;
2696 	int ext_bss_idx, tsf_offset;
2697 	struct tlv *tlv;
2698 
2699 	ext_bss_idx = mvif->omac_idx - EXT_BSSID_START;
2700 	if (ext_bss_idx < 0)
2701 		return;
2702 
2703 	tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
2704 
2705 	ext = (struct bss_info_ext_bss *)tlv;
2706 	tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
2707 	ext->mbss_tsf_offset = cpu_to_le32(tsf_offset);
2708 }
2709 EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_ext_tlv);
2710 
2711 int mt76_connac_mcu_bss_basic_tlv(struct sk_buff *skb,
2712 				  struct ieee80211_vif *vif,
2713 				  struct ieee80211_sta *sta,
2714 				  struct mt76_phy *phy, u16 wlan_idx,
2715 				  bool enable)
2716 {
2717 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
2718 	u32 type = vif->p2p ? NETWORK_P2P : NETWORK_INFRA;
2719 	struct bss_info_basic *bss;
2720 	struct tlv *tlv;
2721 
2722 	tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
2723 	bss = (struct bss_info_basic *)tlv;
2724 
2725 	switch (vif->type) {
2726 	case NL80211_IFTYPE_MESH_POINT:
2727 	case NL80211_IFTYPE_MONITOR:
2728 		break;
2729 	case NL80211_IFTYPE_AP:
2730 		if (ieee80211_hw_check(phy->hw, SUPPORTS_MULTI_BSSID)) {
2731 			u8 bssid_id = vif->bss_conf.bssid_indicator;
2732 			struct wiphy *wiphy = phy->hw->wiphy;
2733 
2734 			if (bssid_id > ilog2(wiphy->mbssid_max_interfaces))
2735 				return -EINVAL;
2736 
2737 			bss->non_tx_bssid = vif->bss_conf.bssid_index;
2738 			bss->max_bssid = bssid_id;
2739 		}
2740 		break;
2741 	case NL80211_IFTYPE_STATION:
2742 		if (enable) {
2743 			rcu_read_lock();
2744 			if (!sta)
2745 				sta = ieee80211_find_sta(vif,
2746 							 vif->bss_conf.bssid);
2747 			/* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */
2748 			if (sta) {
2749 				struct mt76_wcid *wcid;
2750 
2751 				wcid = (struct mt76_wcid *)sta->drv_priv;
2752 				wlan_idx = wcid->idx;
2753 			}
2754 			rcu_read_unlock();
2755 		}
2756 		break;
2757 	case NL80211_IFTYPE_ADHOC:
2758 		type = NETWORK_IBSS;
2759 		break;
2760 	default:
2761 		WARN_ON(1);
2762 		break;
2763 	}
2764 
2765 	bss->network_type = cpu_to_le32(type);
2766 	bss->bmc_wcid_lo = to_wcid_lo(wlan_idx);
2767 	bss->bmc_wcid_hi = to_wcid_hi(wlan_idx);
2768 	bss->wmm_idx = mvif->wmm_idx;
2769 	bss->active = enable;
2770 	bss->cipher = mvif->cipher;
2771 
2772 	if (vif->type != NL80211_IFTYPE_MONITOR) {
2773 		struct cfg80211_chan_def *chandef = &phy->chandef;
2774 
2775 		memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
2776 		bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
2777 		bss->dtim_period = vif->bss_conf.dtim_period;
2778 		bss->phy_mode = mt76_connac_get_phy_mode(phy, vif,
2779 							 chandef->chan->band, NULL);
2780 	} else {
2781 		memcpy(bss->bssid, phy->macaddr, ETH_ALEN);
2782 	}
2783 
2784 	return 0;
2785 }
2786 EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_basic_tlv);
2787 
2788 #define ENTER_PM_STATE		1
2789 #define EXIT_PM_STATE		2
2790 int mt76_connac_mcu_set_pm(struct mt76_dev *dev, int band, int enter)
2791 {
2792 	struct {
2793 		u8 pm_number;
2794 		u8 pm_state;
2795 		u8 bssid[ETH_ALEN];
2796 		u8 dtim_period;
2797 		u8 wlan_idx_lo;
2798 		__le16 bcn_interval;
2799 		__le32 aid;
2800 		__le32 rx_filter;
2801 		u8 band_idx;
2802 		u8 wlan_idx_hi;
2803 		u8 rsv[2];
2804 		__le32 feature;
2805 		u8 omac_idx;
2806 		u8 wmm_idx;
2807 		u8 bcn_loss_cnt;
2808 		u8 bcn_sp_duration;
2809 	} __packed req = {
2810 		.pm_number = 5,
2811 		.pm_state = enter ? ENTER_PM_STATE : EXIT_PM_STATE,
2812 		.band_idx = band,
2813 	};
2814 
2815 	return mt76_mcu_send_msg(dev, MCU_EXT_CMD(PM_STATE_CTRL), &req,
2816 				 sizeof(req), true);
2817 }
2818 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_pm);
2819 
2820 int mt76_connac_mcu_restart(struct mt76_dev *dev)
2821 {
2822 	struct {
2823 		u8 power_mode;
2824 		u8 rsv[3];
2825 	} req = {
2826 		.power_mode = 1,
2827 	};
2828 
2829 	return mt76_mcu_send_msg(dev, MCU_CMD(NIC_POWER_CTRL), &req,
2830 				 sizeof(req), false);
2831 }
2832 EXPORT_SYMBOL_GPL(mt76_connac_mcu_restart);
2833 
2834 int mt76_connac_mcu_rdd_cmd(struct mt76_dev *dev, int cmd, u8 index,
2835 			    u8 rx_sel, u8 val)
2836 {
2837 	struct {
2838 		u8 ctrl;
2839 		u8 rdd_idx;
2840 		u8 rdd_rx_sel;
2841 		u8 val;
2842 		u8 rsv[4];
2843 	} __packed req = {
2844 		.ctrl = cmd,
2845 		.rdd_idx = index,
2846 		.rdd_rx_sel = rx_sel,
2847 		.val = val,
2848 	};
2849 
2850 	return mt76_mcu_send_msg(dev, MCU_EXT_CMD(SET_RDD_CTRL), &req,
2851 				 sizeof(req), true);
2852 }
2853 EXPORT_SYMBOL_GPL(mt76_connac_mcu_rdd_cmd);
2854 
2855 static int
2856 mt76_connac_mcu_send_ram_firmware(struct mt76_dev *dev,
2857 				  const struct mt76_connac2_fw_trailer *hdr,
2858 				  const u8 *data, bool is_wa)
2859 {
2860 	int i, offset = 0, max_len = mt76_is_sdio(dev) ? 2048 : 4096;
2861 	u32 override = 0, option = 0;
2862 
2863 	for (i = 0; i < hdr->n_region; i++) {
2864 		const struct mt76_connac2_fw_region *region;
2865 		u32 len, addr, mode;
2866 		int err;
2867 
2868 		region = (const void *)((const u8 *)hdr -
2869 					(hdr->n_region - i) * sizeof(*region));
2870 		mode = mt76_connac_mcu_gen_dl_mode(dev, region->feature_set,
2871 						   is_wa);
2872 		len = le32_to_cpu(region->len);
2873 		addr = le32_to_cpu(region->addr);
2874 
2875 		if (region->feature_set & FW_FEATURE_NON_DL)
2876 			goto next;
2877 
2878 		if (region->feature_set & FW_FEATURE_OVERRIDE_ADDR)
2879 			override = addr;
2880 
2881 		err = mt76_connac_mcu_init_download(dev, addr, len, mode);
2882 		if (err) {
2883 			dev_err(dev->dev, "Download request failed\n");
2884 			return err;
2885 		}
2886 
2887 		err = __mt76_mcu_send_firmware(dev, MCU_CMD(FW_SCATTER),
2888 					       data + offset, len, max_len);
2889 		if (err) {
2890 			dev_err(dev->dev, "Failed to send firmware.\n");
2891 			return err;
2892 		}
2893 
2894 next:
2895 		offset += len;
2896 	}
2897 
2898 	if (override)
2899 		option |= FW_START_OVERRIDE;
2900 	if (is_wa)
2901 		option |= FW_START_WORKING_PDA_CR4;
2902 
2903 	return mt76_connac_mcu_start_firmware(dev, override, option);
2904 }
2905 
2906 int mt76_connac2_load_ram(struct mt76_dev *dev, const char *fw_wm,
2907 			  const char *fw_wa)
2908 {
2909 	const struct mt76_connac2_fw_trailer *hdr;
2910 	const struct firmware *fw;
2911 	int ret;
2912 
2913 	ret = request_firmware(&fw, fw_wm, dev->dev);
2914 	if (ret)
2915 		return ret;
2916 
2917 	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2918 		dev_err(dev->dev, "Invalid firmware\n");
2919 		ret = -EINVAL;
2920 		goto out;
2921 	}
2922 
2923 	hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
2924 	dev_info(dev->dev, "WM Firmware Version: %.10s, Build Time: %.15s\n",
2925 		 hdr->fw_ver, hdr->build_date);
2926 
2927 	ret = mt76_connac_mcu_send_ram_firmware(dev, hdr, fw->data, false);
2928 	if (ret) {
2929 		dev_err(dev->dev, "Failed to start WM firmware\n");
2930 		goto out;
2931 	}
2932 
2933 	snprintf(dev->hw->wiphy->fw_version,
2934 		 sizeof(dev->hw->wiphy->fw_version),
2935 		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2936 
2937 	release_firmware(fw);
2938 
2939 	if (!fw_wa)
2940 		return 0;
2941 
2942 	ret = request_firmware(&fw, fw_wa, dev->dev);
2943 	if (ret)
2944 		return ret;
2945 
2946 	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2947 		dev_err(dev->dev, "Invalid firmware\n");
2948 		ret = -EINVAL;
2949 		goto out;
2950 	}
2951 
2952 	hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
2953 	dev_info(dev->dev, "WA Firmware Version: %.10s, Build Time: %.15s\n",
2954 		 hdr->fw_ver, hdr->build_date);
2955 
2956 	ret = mt76_connac_mcu_send_ram_firmware(dev, hdr, fw->data, true);
2957 	if (ret) {
2958 		dev_err(dev->dev, "Failed to start WA firmware\n");
2959 		goto out;
2960 	}
2961 
2962 	snprintf(dev->hw->wiphy->fw_version,
2963 		 sizeof(dev->hw->wiphy->fw_version),
2964 		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2965 
2966 out:
2967 	release_firmware(fw);
2968 
2969 	return ret;
2970 }
2971 EXPORT_SYMBOL_GPL(mt76_connac2_load_ram);
2972 
2973 static u32 mt76_connac2_get_data_mode(struct mt76_dev *dev, u32 info)
2974 {
2975 	u32 mode = DL_MODE_NEED_RSP;
2976 
2977 	if ((!is_mt7921(dev) && !is_mt7925(dev)) || info == PATCH_SEC_NOT_SUPPORT)
2978 		return mode;
2979 
2980 	switch (FIELD_GET(PATCH_SEC_ENC_TYPE_MASK, info)) {
2981 	case PATCH_SEC_ENC_TYPE_PLAIN:
2982 		break;
2983 	case PATCH_SEC_ENC_TYPE_AES:
2984 		mode |= DL_MODE_ENCRYPT;
2985 		mode |= FIELD_PREP(DL_MODE_KEY_IDX,
2986 				(info & PATCH_SEC_ENC_AES_KEY_MASK)) & DL_MODE_KEY_IDX;
2987 		mode |= DL_MODE_RESET_SEC_IV;
2988 		break;
2989 	case PATCH_SEC_ENC_TYPE_SCRAMBLE:
2990 		mode |= DL_MODE_ENCRYPT;
2991 		mode |= DL_CONFIG_ENCRY_MODE_SEL;
2992 		mode |= DL_MODE_RESET_SEC_IV;
2993 		break;
2994 	default:
2995 		dev_err(dev->dev, "Encryption type not support!\n");
2996 	}
2997 
2998 	return mode;
2999 }
3000 
3001 int mt76_connac2_load_patch(struct mt76_dev *dev, const char *fw_name)
3002 {
3003 	int i, ret, sem, max_len = mt76_is_sdio(dev) ? 2048 : 4096;
3004 	const struct mt76_connac2_patch_hdr *hdr;
3005 	const struct firmware *fw = NULL;
3006 
3007 	sem = mt76_connac_mcu_patch_sem_ctrl(dev, true);
3008 	switch (sem) {
3009 	case PATCH_IS_DL:
3010 		return 0;
3011 	case PATCH_NOT_DL_SEM_SUCCESS:
3012 		break;
3013 	default:
3014 		dev_err(dev->dev, "Failed to get patch semaphore\n");
3015 		return -EAGAIN;
3016 	}
3017 
3018 	ret = request_firmware(&fw, fw_name, dev->dev);
3019 	if (ret)
3020 		goto out;
3021 
3022 	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
3023 		dev_err(dev->dev, "Invalid firmware\n");
3024 		ret = -EINVAL;
3025 		goto out;
3026 	}
3027 
3028 	hdr = (const void *)fw->data;
3029 	dev_info(dev->dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
3030 		 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
3031 
3032 	for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
3033 		struct mt76_connac2_patch_sec *sec;
3034 		u32 len, addr, mode;
3035 		const u8 *dl;
3036 		u32 sec_info;
3037 
3038 		sec = (void *)(fw->data + sizeof(*hdr) + i * sizeof(*sec));
3039 		if ((be32_to_cpu(sec->type) & PATCH_SEC_TYPE_MASK) !=
3040 		    PATCH_SEC_TYPE_INFO) {
3041 			ret = -EINVAL;
3042 			goto out;
3043 		}
3044 
3045 		addr = be32_to_cpu(sec->info.addr);
3046 		len = be32_to_cpu(sec->info.len);
3047 		dl = fw->data + be32_to_cpu(sec->offs);
3048 		sec_info = be32_to_cpu(sec->info.sec_key_idx);
3049 		mode = mt76_connac2_get_data_mode(dev, sec_info);
3050 
3051 		ret = mt76_connac_mcu_init_download(dev, addr, len, mode);
3052 		if (ret) {
3053 			dev_err(dev->dev, "Download request failed\n");
3054 			goto out;
3055 		}
3056 
3057 		ret = __mt76_mcu_send_firmware(dev, MCU_CMD(FW_SCATTER),
3058 					       dl, len, max_len);
3059 		if (ret) {
3060 			dev_err(dev->dev, "Failed to send patch\n");
3061 			goto out;
3062 		}
3063 	}
3064 
3065 	ret = mt76_connac_mcu_start_patch(dev);
3066 	if (ret)
3067 		dev_err(dev->dev, "Failed to start patch\n");
3068 
3069 out:
3070 	sem = mt76_connac_mcu_patch_sem_ctrl(dev, false);
3071 	switch (sem) {
3072 	case PATCH_REL_SEM_SUCCESS:
3073 		break;
3074 	default:
3075 		ret = -EAGAIN;
3076 		dev_err(dev->dev, "Failed to release patch semaphore\n");
3077 		break;
3078 	}
3079 
3080 	release_firmware(fw);
3081 
3082 	return ret;
3083 }
3084 EXPORT_SYMBOL_GPL(mt76_connac2_load_patch);
3085 
3086 int mt76_connac2_mcu_fill_message(struct mt76_dev *dev, struct sk_buff *skb,
3087 				  int cmd, int *wait_seq)
3088 {
3089 	int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
3090 	struct mt76_connac2_mcu_uni_txd *uni_txd;
3091 	struct mt76_connac2_mcu_txd *mcu_txd;
3092 	__le32 *txd;
3093 	u32 val;
3094 	u8 seq;
3095 
3096 	/* TODO: make dynamic based on msg type */
3097 	dev->mcu.timeout = 20 * HZ;
3098 
3099 	seq = ++dev->mcu.msg_seq & 0xf;
3100 	if (!seq)
3101 		seq = ++dev->mcu.msg_seq & 0xf;
3102 
3103 	if (cmd == MCU_CMD(FW_SCATTER))
3104 		goto exit;
3105 
3106 	txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
3107 	txd = (__le32 *)skb_push(skb, txd_len);
3108 
3109 	val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
3110 	      FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) |
3111 	      FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0);
3112 	txd[0] = cpu_to_le32(val);
3113 
3114 	val = MT_TXD1_LONG_FORMAT |
3115 	      FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD);
3116 	txd[1] = cpu_to_le32(val);
3117 
3118 	if (cmd & __MCU_CMD_FIELD_UNI) {
3119 		uni_txd = (struct mt76_connac2_mcu_uni_txd *)txd;
3120 		uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
3121 		uni_txd->option = MCU_CMD_UNI_EXT_ACK;
3122 		uni_txd->cid = cpu_to_le16(mcu_cmd);
3123 		uni_txd->s2d_index = MCU_S2D_H2N;
3124 		uni_txd->pkt_type = MCU_PKT_ID;
3125 		uni_txd->seq = seq;
3126 
3127 		goto exit;
3128 	}
3129 
3130 	mcu_txd = (struct mt76_connac2_mcu_txd *)txd;
3131 	mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
3132 	mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU,
3133 					       MT_TX_MCU_PORT_RX_Q0));
3134 	mcu_txd->pkt_type = MCU_PKT_ID;
3135 	mcu_txd->seq = seq;
3136 	mcu_txd->cid = mcu_cmd;
3137 	mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
3138 
3139 	if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {
3140 		if (cmd & __MCU_CMD_FIELD_QUERY)
3141 			mcu_txd->set_query = MCU_Q_QUERY;
3142 		else
3143 			mcu_txd->set_query = MCU_Q_SET;
3144 		mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid;
3145 	} else {
3146 		mcu_txd->set_query = MCU_Q_NA;
3147 	}
3148 
3149 	if (cmd & __MCU_CMD_FIELD_WA)
3150 		mcu_txd->s2d_index = MCU_S2D_H2C;
3151 	else
3152 		mcu_txd->s2d_index = MCU_S2D_H2N;
3153 
3154 exit:
3155 	if (wait_seq)
3156 		*wait_seq = seq;
3157 
3158 	return 0;
3159 }
3160 EXPORT_SYMBOL_GPL(mt76_connac2_mcu_fill_message);
3161 
3162 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
3163 MODULE_DESCRIPTION("MediaTek MT76x connac layer helpers");
3164 MODULE_LICENSE("Dual BSD/GPL");
3165