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