xref: /linux/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c (revision 8be4d31cb8aaeea27bde4b7ddb26e28a89062ebf)
1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2020 MediaTek Inc. */
3 
4 #include <linux/fs.h>
5 #include "mt7915.h"
6 #include "mcu.h"
7 #include "mac.h"
8 #include "eeprom.h"
9 
10 #define fw_name(_dev, name, ...)	({			\
11 	char *_fw;						\
12 	switch (mt76_chip(&(_dev)->mt76)) {			\
13 	case 0x7915:						\
14 		_fw = MT7915_##name;				\
15 		break;						\
16 	case 0x7981:						\
17 		_fw = MT7981_##name;				\
18 		break;						\
19 	case 0x7986:						\
20 		_fw = MT7986_##name##__VA_ARGS__;		\
21 		break;						\
22 	default:						\
23 		_fw = MT7916_##name;				\
24 		break;						\
25 	}							\
26 	_fw;							\
27 })
28 
29 #define fw_name_var(_dev, name)		(mt7915_check_adie(dev, false) ?	\
30 					 fw_name(_dev, name) :			\
31 					 fw_name(_dev, name, _MT7975))
32 
33 #define MCU_PATCH_ADDRESS		0x200000
34 
35 #define HE_PHY(p, c)			u8_get_bits(c, IEEE80211_HE_PHY_##p)
36 #define HE_MAC(m, c)			u8_get_bits(c, IEEE80211_HE_MAC_##m)
37 
38 static bool sr_scene_detect = true;
39 module_param(sr_scene_detect, bool, 0644);
40 MODULE_PARM_DESC(sr_scene_detect, "Enable firmware scene detection algorithm");
41 
42 static u8
mt7915_mcu_get_sta_nss(u16 mcs_map)43 mt7915_mcu_get_sta_nss(u16 mcs_map)
44 {
45 	u8 nss;
46 
47 	for (nss = 8; nss > 0; nss--) {
48 		u8 nss_mcs = (mcs_map >> (2 * (nss - 1))) & 3;
49 
50 		if (nss_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED)
51 			break;
52 	}
53 
54 	return nss - 1;
55 }
56 
57 static void
mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta * sta,__le16 * he_mcs,u16 mcs_map)58 mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta *sta, __le16 *he_mcs,
59 			  u16 mcs_map)
60 {
61 	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
62 	struct mt7915_dev *dev = msta->vif->phy->dev;
63 	enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band;
64 	const u16 *mask = msta->vif->bitrate_mask.control[band].he_mcs;
65 	int nss, max_nss = sta->deflink.rx_nss > 3 ? 4 : sta->deflink.rx_nss;
66 
67 	for (nss = 0; nss < max_nss; nss++) {
68 		int mcs;
69 
70 		switch ((mcs_map >> (2 * nss)) & 0x3) {
71 		case IEEE80211_HE_MCS_SUPPORT_0_11:
72 			mcs = GENMASK(11, 0);
73 			break;
74 		case IEEE80211_HE_MCS_SUPPORT_0_9:
75 			mcs = GENMASK(9, 0);
76 			break;
77 		case IEEE80211_HE_MCS_SUPPORT_0_7:
78 			mcs = GENMASK(7, 0);
79 			break;
80 		default:
81 			mcs = 0;
82 		}
83 
84 		mcs = mcs ? fls(mcs & mask[nss]) - 1 : -1;
85 
86 		switch (mcs) {
87 		case 0 ... 7:
88 			mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
89 			break;
90 		case 8 ... 9:
91 			mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
92 			break;
93 		case 10 ... 11:
94 			mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
95 			break;
96 		default:
97 			mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
98 			break;
99 		}
100 		mcs_map &= ~(0x3 << (nss * 2));
101 		mcs_map |= mcs << (nss * 2);
102 
103 		/* only support 2ss on 160MHz for mt7915 */
104 		if (is_mt7915(&dev->mt76) && nss > 1 &&
105 		    sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
106 			break;
107 	}
108 
109 	*he_mcs = cpu_to_le16(mcs_map);
110 }
111 
112 static void
mt7915_mcu_set_sta_vht_mcs(struct ieee80211_sta * sta,__le16 * vht_mcs,const u16 * mask)113 mt7915_mcu_set_sta_vht_mcs(struct ieee80211_sta *sta, __le16 *vht_mcs,
114 			   const u16 *mask)
115 {
116 	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
117 	struct mt7915_dev *dev = msta->vif->phy->dev;
118 	u16 mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.rx_mcs_map);
119 	int nss, max_nss = sta->deflink.rx_nss > 3 ? 4 : sta->deflink.rx_nss;
120 	u16 mcs;
121 
122 	for (nss = 0; nss < max_nss; nss++, mcs_map >>= 2) {
123 		switch (mcs_map & 0x3) {
124 		case IEEE80211_VHT_MCS_SUPPORT_0_9:
125 			mcs = GENMASK(9, 0);
126 			break;
127 		case IEEE80211_VHT_MCS_SUPPORT_0_8:
128 			mcs = GENMASK(8, 0);
129 			break;
130 		case IEEE80211_VHT_MCS_SUPPORT_0_7:
131 			mcs = GENMASK(7, 0);
132 			break;
133 		default:
134 			mcs = 0;
135 		}
136 
137 		vht_mcs[nss] = cpu_to_le16(mcs & mask[nss]);
138 
139 		/* only support 2ss on 160MHz for mt7915 */
140 		if (is_mt7915(&dev->mt76) && nss > 1 &&
141 		    sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
142 			break;
143 	}
144 }
145 
146 static void
mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta * sta,u8 * ht_mcs,const u8 * mask)147 mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta *sta, u8 *ht_mcs,
148 			  const u8 *mask)
149 {
150 	int nss, max_nss = sta->deflink.rx_nss > 3 ? 4 : sta->deflink.rx_nss;
151 
152 	for (nss = 0; nss < max_nss; nss++)
153 		ht_mcs[nss] = sta->deflink.ht_cap.mcs.rx_mask[nss] & mask[nss];
154 }
155 
156 static int
mt7915_mcu_parse_response(struct mt76_dev * mdev,int cmd,struct sk_buff * skb,int seq)157 mt7915_mcu_parse_response(struct mt76_dev *mdev, int cmd,
158 			  struct sk_buff *skb, int seq)
159 {
160 	struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
161 	struct mt76_connac2_mcu_rxd *rxd;
162 	int ret = 0;
163 
164 	if (!skb) {
165 		dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
166 			cmd, seq);
167 
168 		if (!test_and_set_bit(MT76_MCU_RESET, &dev->mphy.state)) {
169 			dev->recovery.restart = true;
170 			wake_up(&dev->mt76.mcu.wait);
171 			queue_work(dev->mt76.wq, &dev->reset_work);
172 			wake_up(&dev->reset_wait);
173 		}
174 
175 		return -ETIMEDOUT;
176 	}
177 
178 	rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
179 	if (seq != rxd->seq &&
180 	    !(rxd->eid == MCU_CMD_EXT_CID &&
181 	      rxd->ext_eid == MCU_EXT_EVENT_WA_TX_STAT))
182 		return -EAGAIN;
183 
184 	if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) {
185 		skb_pull(skb, sizeof(*rxd) - 4);
186 		ret = *skb->data;
187 	} else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
188 		skb_pull(skb, sizeof(*rxd) + 4);
189 		ret = le32_to_cpu(*(__le32 *)skb->data);
190 	} else {
191 		skb_pull(skb, sizeof(struct mt76_connac2_mcu_rxd));
192 	}
193 
194 	return ret;
195 }
196 
197 static void
mt7915_mcu_set_timeout(struct mt76_dev * mdev,int cmd)198 mt7915_mcu_set_timeout(struct mt76_dev *mdev, int cmd)
199 {
200 	mdev->mcu.timeout = 5 * HZ;
201 
202 	if ((cmd & __MCU_CMD_FIELD_ID) != MCU_CMD_EXT_CID)
203 		return;
204 
205 	switch (FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd)) {
206 	case MCU_EXT_CMD_THERMAL_CTRL:
207 	case MCU_EXT_CMD_GET_MIB_INFO:
208 	case MCU_EXT_CMD_PHY_STAT_INFO:
209 	case MCU_EXT_CMD_STA_REC_UPDATE:
210 	case MCU_EXT_CMD_BSS_INFO_UPDATE:
211 		mdev->mcu.timeout = 2 * HZ;
212 		return;
213 	case MCU_EXT_CMD_EFUSE_BUFFER_MODE:
214 		mdev->mcu.timeout = 10 * HZ;
215 		return;
216 	default:
217 		break;
218 	}
219 }
220 
221 static int
mt7915_mcu_send_message(struct mt76_dev * mdev,struct sk_buff * skb,int cmd,int * wait_seq)222 mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
223 			int cmd, int *wait_seq)
224 {
225 	struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
226 	enum mt76_mcuq_id qid;
227 
228 	if (cmd == MCU_CMD(FW_SCATTER))
229 		qid = MT_MCUQ_FWDL;
230 	else if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
231 		qid = MT_MCUQ_WA;
232 	else
233 		qid = MT_MCUQ_WM;
234 
235 	mt7915_mcu_set_timeout(mdev, cmd);
236 
237 	return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[qid], skb, 0);
238 }
239 
mt7915_mcu_wa_cmd(struct mt7915_dev * dev,int cmd,u32 a1,u32 a2,u32 a3)240 int mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3)
241 {
242 	struct {
243 		__le32 args[3];
244 	} req = {
245 		.args = {
246 			cpu_to_le32(a1),
247 			cpu_to_le32(a2),
248 			cpu_to_le32(a3),
249 		},
250 	};
251 
252 	return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), false);
253 }
254 
255 static void
mt7915_mcu_csa_finish(void * priv,u8 * mac,struct ieee80211_vif * vif)256 mt7915_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
257 {
258 	if (!vif->bss_conf.csa_active || vif->type == NL80211_IFTYPE_STATION)
259 		return;
260 
261 	ieee80211_csa_finish(vif, 0);
262 }
263 
264 static void
mt7915_mcu_rx_csa_notify(struct mt7915_dev * dev,struct sk_buff * skb)265 mt7915_mcu_rx_csa_notify(struct mt7915_dev *dev, struct sk_buff *skb)
266 {
267 	struct mt76_phy *mphy = &dev->mt76.phy;
268 	struct mt7915_mcu_csa_notify *c;
269 
270 	c = (struct mt7915_mcu_csa_notify *)skb->data;
271 
272 	if (c->band_idx > MT_BAND1)
273 		return;
274 
275 	if ((c->band_idx && !dev->phy.mt76->band_idx) &&
276 	    dev->mt76.phys[MT_BAND1])
277 		mphy = dev->mt76.phys[MT_BAND1];
278 
279 	ieee80211_iterate_active_interfaces_atomic(mphy->hw,
280 			IEEE80211_IFACE_ITER_RESUME_ALL,
281 			mt7915_mcu_csa_finish, mphy->hw);
282 }
283 
284 static void
mt7915_mcu_rx_thermal_notify(struct mt7915_dev * dev,struct sk_buff * skb)285 mt7915_mcu_rx_thermal_notify(struct mt7915_dev *dev, struct sk_buff *skb)
286 {
287 	struct mt76_phy *mphy = &dev->mt76.phy;
288 	struct mt7915_mcu_thermal_notify *t;
289 	struct mt7915_phy *phy;
290 
291 	t = (struct mt7915_mcu_thermal_notify *)skb->data;
292 	if (t->ctrl.ctrl_id != THERMAL_PROTECT_ENABLE)
293 		return;
294 
295 	if (t->ctrl.band_idx > MT_BAND1)
296 		return;
297 
298 	if ((t->ctrl.band_idx && !dev->phy.mt76->band_idx) &&
299 	    dev->mt76.phys[MT_BAND1])
300 		mphy = dev->mt76.phys[MT_BAND1];
301 
302 	phy = mphy->priv;
303 	phy->throttle_state = t->ctrl.duty.duty_cycle;
304 }
305 
306 static void
mt7915_mcu_rx_radar_detected(struct mt7915_dev * dev,struct sk_buff * skb)307 mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb)
308 {
309 	struct mt76_phy *mphy = &dev->mt76.phy;
310 	struct mt7915_mcu_rdd_report *r;
311 	u32 sku;
312 
313 	r = (struct mt7915_mcu_rdd_report *)skb->data;
314 
315 	switch (r->rdd_idx) {
316 	case MT_RDD_IDX_BAND0:
317 		break;
318 	case MT_RDD_IDX_BAND1:
319 		sku = mt7915_check_adie(dev, true);
320 		/* the main phy is bound to band 1 for this sku */
321 		if (is_mt7986(&dev->mt76) &&
322 		    (sku == MT7975_ONE_ADIE || sku == MT7976_ONE_ADIE))
323 			break;
324 		mphy = dev->mt76.phys[MT_BAND1];
325 		break;
326 	case MT_RDD_IDX_BACKGROUND:
327 		if (!dev->rdd2_phy)
328 			return;
329 		mphy = dev->rdd2_phy->mt76;
330 		break;
331 	default:
332 		dev_err(dev->mt76.dev, "Unknown RDD idx %d\n", r->rdd_idx);
333 		return;
334 	}
335 
336 	if (!mphy)
337 		return;
338 
339 	if (r->rdd_idx == MT_RDD_IDX_BACKGROUND)
340 		cfg80211_background_radar_event(mphy->hw->wiphy,
341 						&dev->rdd2_chandef,
342 						GFP_ATOMIC);
343 	else
344 		ieee80211_radar_detected(mphy->hw, NULL);
345 	dev->hw_pattern++;
346 }
347 
348 static void
mt7915_mcu_rx_log_message(struct mt7915_dev * dev,struct sk_buff * skb)349 mt7915_mcu_rx_log_message(struct mt7915_dev *dev, struct sk_buff *skb)
350 {
351 	struct mt76_connac2_mcu_rxd *rxd;
352 	int len = skb->len - sizeof(*rxd);
353 	const char *data, *type;
354 
355 	rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
356 	data = (char *)&rxd[1];
357 
358 	switch (rxd->s2d_index) {
359 	case 0:
360 		if (mt7915_debugfs_rx_log(dev, data, len))
361 			return;
362 
363 		type = "WM";
364 		break;
365 	case 2:
366 		type = "WA";
367 		break;
368 	default:
369 		type = "unknown";
370 		break;
371 	}
372 
373 	wiphy_info(mt76_hw(dev)->wiphy, "%s: %.*s", type, len, data);
374 }
375 
376 static void
mt7915_mcu_cca_finish(void * priv,u8 * mac,struct ieee80211_vif * vif)377 mt7915_mcu_cca_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
378 {
379 	if (!vif->bss_conf.color_change_active || vif->type == NL80211_IFTYPE_STATION)
380 		return;
381 
382 	ieee80211_color_change_finish(vif, 0);
383 }
384 
385 static void
mt7915_mcu_rx_bcc_notify(struct mt7915_dev * dev,struct sk_buff * skb)386 mt7915_mcu_rx_bcc_notify(struct mt7915_dev *dev, struct sk_buff *skb)
387 {
388 	struct mt76_phy *mphy = &dev->mt76.phy;
389 	struct mt7915_mcu_bcc_notify *b;
390 
391 	b = (struct mt7915_mcu_bcc_notify *)skb->data;
392 
393 	if (b->band_idx > MT_BAND1)
394 		return;
395 
396 	if ((b->band_idx && !dev->phy.mt76->band_idx) &&
397 	    dev->mt76.phys[MT_BAND1])
398 		mphy = dev->mt76.phys[MT_BAND1];
399 
400 	ieee80211_iterate_active_interfaces_atomic(mphy->hw,
401 			IEEE80211_IFACE_ITER_RESUME_ALL,
402 			mt7915_mcu_cca_finish, mphy->hw);
403 }
404 
405 static void
mt7915_mcu_rx_ext_event(struct mt7915_dev * dev,struct sk_buff * skb)406 mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
407 {
408 	struct mt76_connac2_mcu_rxd *rxd;
409 
410 	rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
411 	switch (rxd->ext_eid) {
412 	case MCU_EXT_EVENT_THERMAL_PROTECT:
413 		mt7915_mcu_rx_thermal_notify(dev, skb);
414 		break;
415 	case MCU_EXT_EVENT_RDD_REPORT:
416 		mt7915_mcu_rx_radar_detected(dev, skb);
417 		break;
418 	case MCU_EXT_EVENT_CSA_NOTIFY:
419 		mt7915_mcu_rx_csa_notify(dev, skb);
420 		break;
421 	case MCU_EXT_EVENT_FW_LOG_2_HOST:
422 		mt7915_mcu_rx_log_message(dev, skb);
423 		break;
424 	case MCU_EXT_EVENT_BCC_NOTIFY:
425 		mt7915_mcu_rx_bcc_notify(dev, skb);
426 		break;
427 	default:
428 		break;
429 	}
430 }
431 
432 static void
mt7915_mcu_rx_unsolicited_event(struct mt7915_dev * dev,struct sk_buff * skb)433 mt7915_mcu_rx_unsolicited_event(struct mt7915_dev *dev, struct sk_buff *skb)
434 {
435 	struct mt76_connac2_mcu_rxd *rxd;
436 
437 	rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
438 	switch (rxd->eid) {
439 	case MCU_EVENT_EXT:
440 		mt7915_mcu_rx_ext_event(dev, skb);
441 		break;
442 	default:
443 		break;
444 	}
445 	dev_kfree_skb(skb);
446 }
447 
mt7915_mcu_rx_event(struct mt7915_dev * dev,struct sk_buff * skb)448 void mt7915_mcu_rx_event(struct mt7915_dev *dev, struct sk_buff *skb)
449 {
450 	struct mt76_connac2_mcu_rxd *rxd;
451 
452 	rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
453 	if ((rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
454 	     rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
455 	     rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
456 	     rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
457 	     rxd->ext_eid == MCU_EXT_EVENT_BCC_NOTIFY ||
458 	     !rxd->seq) &&
459 	     !(rxd->eid == MCU_CMD_EXT_CID &&
460 	       rxd->ext_eid == MCU_EXT_EVENT_WA_TX_STAT))
461 		mt7915_mcu_rx_unsolicited_event(dev, skb);
462 	else
463 		mt76_mcu_rx_event(&dev->mt76, skb);
464 }
465 
466 static struct tlv *
mt7915_mcu_add_nested_subtlv(struct sk_buff * skb,int sub_tag,int sub_len,__le16 * sub_ntlv,__le16 * len)467 mt7915_mcu_add_nested_subtlv(struct sk_buff *skb, int sub_tag, int sub_len,
468 			     __le16 *sub_ntlv, __le16 *len)
469 {
470 	struct tlv *ptlv, tlv = {
471 		.tag = cpu_to_le16(sub_tag),
472 		.len = cpu_to_le16(sub_len),
473 	};
474 
475 	ptlv = skb_put_zero(skb, sub_len);
476 	memcpy(ptlv, &tlv, sizeof(tlv));
477 
478 	le16_add_cpu(sub_ntlv, 1);
479 	le16_add_cpu(len, sub_len);
480 
481 	return ptlv;
482 }
483 
484 /** bss info **/
485 struct mt7915_he_obss_narrow_bw_ru_data {
486 	bool tolerated;
487 };
488 
mt7915_check_he_obss_narrow_bw_ru_iter(struct wiphy * wiphy,struct cfg80211_bss * bss,void * _data)489 static void mt7915_check_he_obss_narrow_bw_ru_iter(struct wiphy *wiphy,
490 						   struct cfg80211_bss *bss,
491 						   void *_data)
492 {
493 	struct mt7915_he_obss_narrow_bw_ru_data *data = _data;
494 	const struct element *elem;
495 
496 	rcu_read_lock();
497 	elem = ieee80211_bss_get_elem(bss, WLAN_EID_EXT_CAPABILITY);
498 
499 	if (!elem || elem->datalen <= 10 ||
500 	    !(elem->data[10] &
501 	      WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT))
502 		data->tolerated = false;
503 
504 	rcu_read_unlock();
505 }
506 
mt7915_check_he_obss_narrow_bw_ru(struct ieee80211_hw * hw,struct ieee80211_vif * vif)507 static bool mt7915_check_he_obss_narrow_bw_ru(struct ieee80211_hw *hw,
508 					      struct ieee80211_vif *vif)
509 {
510 	struct mt7915_he_obss_narrow_bw_ru_data iter_data = {
511 		.tolerated = true,
512 	};
513 
514 	if (!(vif->bss_conf.chanreq.oper.chan->flags & IEEE80211_CHAN_RADAR))
515 		return false;
516 
517 	cfg80211_bss_iter(hw->wiphy, &vif->bss_conf.chanreq.oper,
518 			  mt7915_check_he_obss_narrow_bw_ru_iter,
519 			  &iter_data);
520 
521 	/*
522 	 * If there is at least one AP on radar channel that cannot
523 	 * tolerate 26-tone RU UL OFDMA transmissions using HE TB PPDU.
524 	 */
525 	return !iter_data.tolerated;
526 }
527 
528 static void
mt7915_mcu_bss_rfch_tlv(struct sk_buff * skb,struct ieee80211_vif * vif,struct mt7915_phy * phy)529 mt7915_mcu_bss_rfch_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
530 			struct mt7915_phy *phy)
531 {
532 	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
533 	struct bss_info_rf_ch *ch;
534 	struct tlv *tlv;
535 	int freq1 = chandef->center_freq1;
536 
537 	tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_RF_CH, sizeof(*ch));
538 
539 	ch = (struct bss_info_rf_ch *)tlv;
540 	ch->pri_ch = chandef->chan->hw_value;
541 	ch->center_ch0 = ieee80211_frequency_to_channel(freq1);
542 	ch->bw = mt76_connac_chan_bw(chandef);
543 
544 	if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
545 		int freq2 = chandef->center_freq2;
546 
547 		ch->center_ch1 = ieee80211_frequency_to_channel(freq2);
548 	}
549 
550 	if (vif->bss_conf.he_support && vif->type == NL80211_IFTYPE_STATION) {
551 		struct mt76_phy *mphy = phy->mt76;
552 
553 		ch->he_ru26_block =
554 			mt7915_check_he_obss_narrow_bw_ru(mphy->hw, vif);
555 		ch->he_all_disable = false;
556 	} else {
557 		ch->he_all_disable = true;
558 	}
559 }
560 
561 static void
mt7915_mcu_bss_ra_tlv(struct sk_buff * skb,struct ieee80211_vif * vif,struct mt7915_phy * phy)562 mt7915_mcu_bss_ra_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
563 		      struct mt7915_phy *phy)
564 {
565 	int max_nss = hweight8(phy->mt76->antenna_mask);
566 	struct bss_info_ra *ra;
567 	struct tlv *tlv;
568 
569 	tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_RA, sizeof(*ra));
570 
571 	ra = (struct bss_info_ra *)tlv;
572 	ra->op_mode = vif->type == NL80211_IFTYPE_AP;
573 	ra->adhoc_en = vif->type == NL80211_IFTYPE_ADHOC;
574 	ra->short_preamble = true;
575 	ra->tx_streams = max_nss;
576 	ra->rx_streams = max_nss;
577 	ra->algo = 4;
578 	ra->train_up_rule = 2;
579 	ra->train_up_high_thres = 110;
580 	ra->train_up_rule_rssi = -70;
581 	ra->low_traffic_thres = 2;
582 	ra->phy_cap = cpu_to_le32(0xfdf);
583 	ra->interval = cpu_to_le32(500);
584 	ra->fast_interval = cpu_to_le32(100);
585 }
586 
587 static void
mt7915_mcu_bss_he_tlv(struct sk_buff * skb,struct ieee80211_vif * vif,struct mt7915_phy * phy)588 mt7915_mcu_bss_he_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
589 		      struct mt7915_phy *phy)
590 {
591 #define DEFAULT_HE_PE_DURATION		4
592 #define DEFAULT_HE_DURATION_RTS_THRES	1023
593 	const struct ieee80211_sta_he_cap *cap;
594 	struct bss_info_he *he;
595 	struct tlv *tlv;
596 
597 	cap = mt76_connac_get_he_phy_cap(phy->mt76, vif);
598 
599 	tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_HE_BASIC, sizeof(*he));
600 
601 	he = (struct bss_info_he *)tlv;
602 	he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext;
603 	if (!he->he_pe_duration)
604 		he->he_pe_duration = DEFAULT_HE_PE_DURATION;
605 
606 	he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th);
607 	if (!he->he_rts_thres)
608 		he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
609 
610 	he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
611 	he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
612 	he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
613 }
614 
615 static void
mt7915_mcu_bss_hw_amsdu_tlv(struct sk_buff * skb)616 mt7915_mcu_bss_hw_amsdu_tlv(struct sk_buff *skb)
617 {
618 #define TXD_CMP_MAP1		GENMASK(15, 0)
619 #define TXD_CMP_MAP2		(GENMASK(31, 0) & ~BIT(23))
620 	struct bss_info_hw_amsdu *amsdu;
621 	struct tlv *tlv;
622 
623 	tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_HW_AMSDU, sizeof(*amsdu));
624 
625 	amsdu = (struct bss_info_hw_amsdu *)tlv;
626 	amsdu->cmp_bitmap_0 = cpu_to_le32(TXD_CMP_MAP1);
627 	amsdu->cmp_bitmap_1 = cpu_to_le32(TXD_CMP_MAP2);
628 	amsdu->trig_thres = cpu_to_le16(2);
629 	amsdu->enable = true;
630 }
631 
632 static void
mt7915_mcu_bss_bmc_tlv(struct sk_buff * skb,struct mt7915_phy * phy)633 mt7915_mcu_bss_bmc_tlv(struct sk_buff *skb, struct mt7915_phy *phy)
634 {
635 	struct bss_info_bmc_rate *bmc;
636 	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
637 	enum nl80211_band band = chandef->chan->band;
638 	struct tlv *tlv;
639 
640 	tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BMC_RATE, sizeof(*bmc));
641 
642 	bmc = (struct bss_info_bmc_rate *)tlv;
643 	if (band == NL80211_BAND_2GHZ) {
644 		bmc->short_preamble = true;
645 	} else {
646 		bmc->bc_trans = cpu_to_le16(0x2000);
647 		bmc->mc_trans = cpu_to_le16(0x2080);
648 	}
649 }
650 
651 static int
mt7915_mcu_muar_config(struct mt7915_phy * phy,struct ieee80211_vif * vif,bool bssid,bool enable)652 mt7915_mcu_muar_config(struct mt7915_phy *phy, struct ieee80211_vif *vif,
653 		       bool bssid, bool enable)
654 {
655 	struct mt7915_dev *dev = phy->dev;
656 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
657 	u32 idx = mvif->mt76.omac_idx - REPEATER_BSSID_START;
658 	u32 mask = phy->omac_mask >> 32 & ~BIT(idx);
659 	const u8 *addr = vif->addr;
660 	struct {
661 		u8 mode;
662 		u8 force_clear;
663 		u8 clear_bitmap[8];
664 		u8 entry_count;
665 		u8 write;
666 		u8 band;
667 
668 		u8 index;
669 		u8 bssid;
670 		u8 addr[ETH_ALEN];
671 	} __packed req = {
672 		.mode = !!mask || enable,
673 		.entry_count = 1,
674 		.write = 1,
675 		.band = phy->mt76->band_idx,
676 		.index = idx * 2 + bssid,
677 	};
678 
679 	if (bssid)
680 		addr = vif->bss_conf.bssid;
681 
682 	if (enable)
683 		ether_addr_copy(req.addr, addr);
684 
685 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE), &req,
686 				 sizeof(req), true);
687 }
688 
mt7915_mcu_add_bss_info(struct mt7915_phy * phy,struct ieee80211_vif * vif,int enable)689 int mt7915_mcu_add_bss_info(struct mt7915_phy *phy,
690 			    struct ieee80211_vif *vif, int enable)
691 {
692 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
693 	struct mt7915_dev *dev = phy->dev;
694 	struct sk_buff *skb;
695 
696 	if (mvif->mt76.omac_idx >= REPEATER_BSSID_START) {
697 		mt7915_mcu_muar_config(phy, vif, false, enable);
698 		mt7915_mcu_muar_config(phy, vif, true, enable);
699 	}
700 
701 	skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL,
702 					      MT7915_BSS_UPDATE_MAX_SIZE);
703 	if (IS_ERR(skb))
704 		return PTR_ERR(skb);
705 
706 	/* bss_omac must be first */
707 	if (enable)
708 		mt76_connac_mcu_bss_omac_tlv(skb, vif);
709 
710 	mt76_connac_mcu_bss_basic_tlv(skb, vif, NULL, phy->mt76,
711 				      mvif->sta.wcid.idx, enable);
712 
713 	if (vif->type == NL80211_IFTYPE_MONITOR)
714 		goto out;
715 
716 	if (enable) {
717 		mt7915_mcu_bss_rfch_tlv(skb, vif, phy);
718 		mt7915_mcu_bss_bmc_tlv(skb, phy);
719 		mt7915_mcu_bss_ra_tlv(skb, vif, phy);
720 		mt7915_mcu_bss_hw_amsdu_tlv(skb);
721 
722 		if (vif->bss_conf.he_support)
723 			mt7915_mcu_bss_he_tlv(skb, vif, phy);
724 
725 		if (mvif->mt76.omac_idx >= EXT_BSSID_START &&
726 		    mvif->mt76.omac_idx < REPEATER_BSSID_START)
727 			mt76_connac_mcu_bss_ext_tlv(skb, &mvif->mt76);
728 	}
729 out:
730 	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
731 				     MCU_EXT_CMD(BSS_INFO_UPDATE), true);
732 }
733 
734 /** starec & wtbl **/
mt7915_mcu_add_tx_ba(struct mt7915_dev * dev,struct ieee80211_ampdu_params * params,bool enable)735 int mt7915_mcu_add_tx_ba(struct mt7915_dev *dev,
736 			 struct ieee80211_ampdu_params *params,
737 			 bool enable)
738 {
739 	struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
740 	struct mt7915_vif *mvif = msta->vif;
741 	int ret;
742 
743 	mt76_worker_disable(&dev->mt76.tx_worker);
744 	if (enable && !params->amsdu)
745 		msta->wcid.amsdu = false;
746 	ret = mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
747 				     MCU_EXT_CMD(STA_REC_UPDATE),
748 				     enable, true);
749 	mt76_worker_enable(&dev->mt76.tx_worker);
750 
751 	return ret;
752 }
753 
mt7915_mcu_add_rx_ba(struct mt7915_dev * dev,struct ieee80211_ampdu_params * params,bool enable)754 int mt7915_mcu_add_rx_ba(struct mt7915_dev *dev,
755 			 struct ieee80211_ampdu_params *params,
756 			 bool enable)
757 {
758 	struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
759 	struct mt7915_vif *mvif = msta->vif;
760 
761 	return mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
762 				      MCU_EXT_CMD(STA_REC_UPDATE),
763 				      enable, false);
764 }
765 
766 static void
mt7915_mcu_sta_he_tlv(struct sk_buff * skb,struct ieee80211_sta * sta,struct ieee80211_vif * vif)767 mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
768 		      struct ieee80211_vif *vif)
769 {
770 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
771 	struct ieee80211_he_cap_elem *elem = &sta->deflink.he_cap.he_cap_elem;
772 	struct ieee80211_he_mcs_nss_supp mcs_map;
773 	struct sta_rec_he *he;
774 	struct tlv *tlv;
775 	u32 cap = 0;
776 
777 	if (!sta->deflink.he_cap.has_he)
778 		return;
779 
780 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
781 
782 	he = (struct sta_rec_he *)tlv;
783 
784 	if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE)
785 		cap |= STA_REC_HE_CAP_HTC;
786 
787 	if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
788 		cap |= STA_REC_HE_CAP_BSR;
789 
790 	if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
791 		cap |= STA_REC_HE_CAP_OM;
792 
793 	if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
794 		cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
795 
796 	if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
797 		cap |= STA_REC_HE_CAP_BQR;
798 
799 	if (elem->phy_cap_info[0] &
800 	    (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G |
801 	     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G))
802 		cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT;
803 
804 	if (mvif->cap.he_ldpc &&
805 	    (elem->phy_cap_info[1] &
806 	     IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD))
807 		cap |= STA_REC_HE_CAP_LDPC;
808 
809 	if (elem->phy_cap_info[1] &
810 	    IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US)
811 		cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI;
812 
813 	if (elem->phy_cap_info[2] &
814 	    IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US)
815 		cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI;
816 
817 	if (elem->phy_cap_info[2] &
818 	    IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ)
819 		cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC;
820 
821 	if (elem->phy_cap_info[2] &
822 	    IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
823 		cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC;
824 
825 	if (elem->phy_cap_info[6] &
826 	    IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB)
827 		cap |= STA_REC_HE_CAP_TRIG_CQI_FK;
828 
829 	if (elem->phy_cap_info[6] &
830 	    IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE)
831 		cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE;
832 
833 	if (elem->phy_cap_info[7] &
834 	    IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI)
835 		cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI;
836 
837 	if (elem->phy_cap_info[7] &
838 	    IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ)
839 		cap |= STA_REC_HE_CAP_GT_80M_TX_STBC;
840 
841 	if (elem->phy_cap_info[7] &
842 	    IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ)
843 		cap |= STA_REC_HE_CAP_GT_80M_RX_STBC;
844 
845 	if (elem->phy_cap_info[8] &
846 	    IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI)
847 		cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI;
848 
849 	if (elem->phy_cap_info[8] &
850 	    IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI)
851 		cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI;
852 
853 	if (elem->phy_cap_info[9] &
854 	    IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU)
855 		cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242;
856 
857 	if (elem->phy_cap_info[9] &
858 	    IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU)
859 		cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242;
860 
861 	he->he_cap = cpu_to_le32(cap);
862 
863 	mcs_map = sta->deflink.he_cap.he_mcs_nss_supp;
864 	switch (sta->deflink.bandwidth) {
865 	case IEEE80211_STA_RX_BW_160:
866 		if (elem->phy_cap_info[0] &
867 		    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
868 			mt7915_mcu_set_sta_he_mcs(sta,
869 						  &he->max_nss_mcs[CMD_HE_MCS_BW8080],
870 						  le16_to_cpu(mcs_map.rx_mcs_80p80));
871 
872 		mt7915_mcu_set_sta_he_mcs(sta,
873 					  &he->max_nss_mcs[CMD_HE_MCS_BW160],
874 					  le16_to_cpu(mcs_map.rx_mcs_160));
875 		fallthrough;
876 	default:
877 		mt7915_mcu_set_sta_he_mcs(sta,
878 					  &he->max_nss_mcs[CMD_HE_MCS_BW80],
879 					  le16_to_cpu(mcs_map.rx_mcs_80));
880 		break;
881 	}
882 
883 	he->t_frame_dur =
884 		HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
885 	he->max_ampdu_exp =
886 		HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]);
887 
888 	he->bw_set =
889 		HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]);
890 	he->device_class =
891 		HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]);
892 	he->punc_pream_rx =
893 		HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
894 
895 	he->dcm_tx_mode =
896 		HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]);
897 	he->dcm_tx_max_nss =
898 		HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]);
899 	he->dcm_rx_mode =
900 		HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]);
901 	he->dcm_rx_max_nss =
902 		HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]);
903 	he->dcm_rx_max_nss =
904 		HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]);
905 
906 	he->pkt_ext = 2;
907 }
908 
909 static void
mt7915_mcu_sta_muru_tlv(struct mt7915_dev * dev,struct sk_buff * skb,struct ieee80211_sta * sta,struct ieee80211_vif * vif)910 mt7915_mcu_sta_muru_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
911 			struct ieee80211_sta *sta, struct ieee80211_vif *vif)
912 {
913 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
914 	struct ieee80211_he_cap_elem *elem = &sta->deflink.he_cap.he_cap_elem;
915 	struct sta_rec_muru *muru;
916 	struct tlv *tlv;
917 
918 	if (vif->type != NL80211_IFTYPE_STATION &&
919 	    vif->type != NL80211_IFTYPE_AP)
920 		return;
921 
922 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_MURU, sizeof(*muru));
923 
924 	muru = (struct sta_rec_muru *)tlv;
925 
926 	muru->cfg.mimo_dl_en = mvif->cap.he_mu_ebfer ||
927 			       mvif->cap.vht_mu_ebfer ||
928 			       mvif->cap.vht_mu_ebfee;
929 	if (!is_mt7915(&dev->mt76))
930 		muru->cfg.mimo_ul_en = true;
931 	muru->cfg.ofdma_dl_en = true;
932 
933 	if (sta->deflink.vht_cap.vht_supported)
934 		muru->mimo_dl.vht_mu_bfee =
935 			!!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
936 
937 	if (!sta->deflink.he_cap.has_he)
938 		return;
939 
940 	muru->mimo_dl.partial_bw_dl_mimo =
941 		HE_PHY(CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO, elem->phy_cap_info[6]);
942 
943 	muru->mimo_ul.full_ul_mimo =
944 		HE_PHY(CAP2_UL_MU_FULL_MU_MIMO, elem->phy_cap_info[2]);
945 	muru->mimo_ul.partial_ul_mimo =
946 		HE_PHY(CAP2_UL_MU_PARTIAL_MU_MIMO, elem->phy_cap_info[2]);
947 
948 	muru->ofdma_dl.punc_pream_rx =
949 		HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
950 	muru->ofdma_dl.he_20m_in_40m_2g =
951 		HE_PHY(CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G, elem->phy_cap_info[8]);
952 	muru->ofdma_dl.he_20m_in_160m =
953 		HE_PHY(CAP8_20MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
954 	muru->ofdma_dl.he_80m_in_160m =
955 		HE_PHY(CAP8_80MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
956 
957 	muru->ofdma_ul.t_frame_dur =
958 		HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
959 	muru->ofdma_ul.mu_cascading =
960 		HE_MAC(CAP2_MU_CASCADING, elem->mac_cap_info[2]);
961 	muru->ofdma_ul.uo_ra =
962 		HE_MAC(CAP3_OFDMA_RA, elem->mac_cap_info[3]);
963 	muru->ofdma_ul.rx_ctrl_frame_to_mbss =
964 		HE_MAC(CAP3_RX_CTRL_FRAME_TO_MULTIBSS, elem->mac_cap_info[3]);
965 }
966 
967 static void
mt7915_mcu_sta_ht_tlv(struct sk_buff * skb,struct ieee80211_sta * sta)968 mt7915_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
969 {
970 	struct sta_rec_ht *ht;
971 	struct tlv *tlv;
972 
973 	if (!sta->deflink.ht_cap.ht_supported)
974 		return;
975 
976 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
977 
978 	ht = (struct sta_rec_ht *)tlv;
979 	ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap);
980 }
981 
982 static void
mt7915_mcu_sta_vht_tlv(struct sk_buff * skb,struct ieee80211_sta * sta)983 mt7915_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
984 {
985 	struct sta_rec_vht *vht;
986 	struct tlv *tlv;
987 
988 	if (!sta->deflink.vht_cap.vht_supported)
989 		return;
990 
991 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
992 
993 	vht = (struct sta_rec_vht *)tlv;
994 	vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
995 	vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
996 	vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
997 }
998 
999 static void
mt7915_mcu_sta_amsdu_tlv(struct mt7915_dev * dev,struct sk_buff * skb,struct ieee80211_vif * vif,struct ieee80211_sta * sta)1000 mt7915_mcu_sta_amsdu_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1001 			 struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1002 {
1003 	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1004 	struct sta_rec_amsdu *amsdu;
1005 	struct tlv *tlv;
1006 
1007 	if (vif->type != NL80211_IFTYPE_STATION &&
1008 	    vif->type != NL80211_IFTYPE_AP)
1009 		return;
1010 
1011 	if (!sta->deflink.agg.max_amsdu_len)
1012 	    return;
1013 
1014 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
1015 	amsdu = (struct sta_rec_amsdu *)tlv;
1016 	amsdu->max_amsdu_num = 8;
1017 	amsdu->amsdu_en = true;
1018 	msta->wcid.amsdu = true;
1019 
1020 	switch (sta->deflink.agg.max_amsdu_len) {
1021 	case IEEE80211_MAX_MPDU_LEN_VHT_11454:
1022 		if (!is_mt7915(&dev->mt76)) {
1023 			amsdu->max_mpdu_size =
1024 				IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
1025 			return;
1026 		}
1027 		fallthrough;
1028 	case IEEE80211_MAX_MPDU_LEN_HT_7935:
1029 	case IEEE80211_MAX_MPDU_LEN_VHT_7991:
1030 		amsdu->max_mpdu_size = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
1031 		return;
1032 	default:
1033 		amsdu->max_mpdu_size = IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
1034 		return;
1035 	}
1036 }
1037 
1038 static int
mt7915_mcu_sta_wtbl_tlv(struct mt7915_dev * dev,struct sk_buff * skb,struct ieee80211_vif * vif,struct ieee80211_sta * sta)1039 mt7915_mcu_sta_wtbl_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1040 			struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1041 {
1042 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1043 	struct mt7915_sta *msta;
1044 	struct wtbl_req_hdr *wtbl_hdr;
1045 	struct mt76_wcid *wcid;
1046 	struct tlv *tlv;
1047 
1048 	msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
1049 	wcid = sta ? &msta->wcid : NULL;
1050 
1051 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1052 	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1053 						  WTBL_RESET_AND_SET, tlv,
1054 						  &skb);
1055 	if (IS_ERR(wtbl_hdr))
1056 		return PTR_ERR(wtbl_hdr);
1057 
1058 	mt76_connac_mcu_wtbl_generic_tlv(&dev->mt76, skb, vif, sta, tlv,
1059 					 wtbl_hdr);
1060 	mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, tlv, wtbl_hdr);
1061 	if (sta)
1062 		mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, skb, sta, tlv,
1063 					    wtbl_hdr, mvif->cap.ht_ldpc,
1064 					    mvif->cap.vht_ldpc);
1065 
1066 	return 0;
1067 }
1068 
1069 static inline bool
mt7915_is_ebf_supported(struct mt7915_phy * phy,struct ieee80211_vif * vif,struct ieee80211_sta * sta,bool bfee)1070 mt7915_is_ebf_supported(struct mt7915_phy *phy, struct ieee80211_vif *vif,
1071 			struct ieee80211_sta *sta, bool bfee)
1072 {
1073 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1074 	int sts = hweight16(phy->mt76->chainmask);
1075 
1076 	if (vif->type != NL80211_IFTYPE_STATION &&
1077 	    vif->type != NL80211_IFTYPE_AP)
1078 		return false;
1079 
1080 	if (!bfee && sts < 2)
1081 		return false;
1082 
1083 	if (sta->deflink.he_cap.has_he) {
1084 		struct ieee80211_he_cap_elem *pe = &sta->deflink.he_cap.he_cap_elem;
1085 
1086 		if (bfee)
1087 			return mvif->cap.he_su_ebfee &&
1088 			       HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]);
1089 		else
1090 			return mvif->cap.he_su_ebfer &&
1091 			       HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]);
1092 	}
1093 
1094 	if (sta->deflink.vht_cap.vht_supported) {
1095 		u32 cap = sta->deflink.vht_cap.cap;
1096 
1097 		if (bfee)
1098 			return mvif->cap.vht_su_ebfee &&
1099 			       (cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
1100 		else
1101 			return mvif->cap.vht_su_ebfer &&
1102 			       (cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
1103 	}
1104 
1105 	return false;
1106 }
1107 
1108 static void
mt7915_mcu_sta_sounding_rate(struct sta_rec_bf * bf)1109 mt7915_mcu_sta_sounding_rate(struct sta_rec_bf *bf)
1110 {
1111 	bf->sounding_phy = MT_PHY_TYPE_OFDM;
1112 	bf->ndp_rate = 0;				/* mcs0 */
1113 	bf->ndpa_rate = MT7915_CFEND_RATE_DEFAULT;	/* ofdm 24m */
1114 	bf->rept_poll_rate = MT7915_CFEND_RATE_DEFAULT;	/* ofdm 24m */
1115 }
1116 
1117 static void
mt7915_mcu_sta_bfer_ht(struct ieee80211_sta * sta,struct mt7915_phy * phy,struct sta_rec_bf * bf)1118 mt7915_mcu_sta_bfer_ht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
1119 		       struct sta_rec_bf *bf)
1120 {
1121 	struct ieee80211_mcs_info *mcs = &sta->deflink.ht_cap.mcs;
1122 	u8 n = 0;
1123 
1124 	bf->tx_mode = MT_PHY_TYPE_HT;
1125 
1126 	if ((mcs->tx_params & IEEE80211_HT_MCS_TX_RX_DIFF) &&
1127 	    (mcs->tx_params & IEEE80211_HT_MCS_TX_DEFINED))
1128 		n = FIELD_GET(IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK,
1129 			      mcs->tx_params);
1130 	else if (mcs->rx_mask[3])
1131 		n = 3;
1132 	else if (mcs->rx_mask[2])
1133 		n = 2;
1134 	else if (mcs->rx_mask[1])
1135 		n = 1;
1136 
1137 	bf->nrow = hweight8(phy->mt76->chainmask) - 1;
1138 	bf->ncol = min_t(u8, bf->nrow, n);
1139 	bf->ibf_ncol = n;
1140 }
1141 
1142 static void
mt7915_mcu_sta_bfer_vht(struct ieee80211_sta * sta,struct mt7915_phy * phy,struct sta_rec_bf * bf,bool explicit)1143 mt7915_mcu_sta_bfer_vht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
1144 			struct sta_rec_bf *bf, bool explicit)
1145 {
1146 	struct ieee80211_sta_vht_cap *pc = &sta->deflink.vht_cap;
1147 	struct ieee80211_sta_vht_cap *vc = &phy->mt76->sband_5g.sband.vht_cap;
1148 	u16 mcs_map = le16_to_cpu(pc->vht_mcs.rx_mcs_map);
1149 	u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1150 	u8 tx_ant = hweight8(phy->mt76->chainmask) - 1;
1151 
1152 	bf->tx_mode = MT_PHY_TYPE_VHT;
1153 
1154 	if (explicit) {
1155 		u8 sts, snd_dim;
1156 
1157 		mt7915_mcu_sta_sounding_rate(bf);
1158 
1159 		sts = FIELD_GET(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK,
1160 				pc->cap);
1161 		snd_dim = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
1162 				    vc->cap);
1163 		bf->nrow = min_t(u8, min_t(u8, snd_dim, sts), tx_ant);
1164 		bf->ncol = min_t(u8, nss_mcs, bf->nrow);
1165 		bf->ibf_ncol = bf->ncol;
1166 
1167 		if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
1168 			bf->nrow = 1;
1169 	} else {
1170 		bf->nrow = tx_ant;
1171 		bf->ncol = min_t(u8, nss_mcs, bf->nrow);
1172 		bf->ibf_ncol = nss_mcs;
1173 
1174 		if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
1175 			bf->ibf_nrow = 1;
1176 	}
1177 }
1178 
1179 static void
mt7915_mcu_sta_bfer_he(struct ieee80211_sta * sta,struct ieee80211_vif * vif,struct mt7915_phy * phy,struct sta_rec_bf * bf)1180 mt7915_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
1181 		       struct mt7915_phy *phy, struct sta_rec_bf *bf)
1182 {
1183 	struct ieee80211_sta_he_cap *pc = &sta->deflink.he_cap;
1184 	struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem;
1185 	const struct ieee80211_sta_he_cap *vc =
1186 		mt76_connac_get_he_phy_cap(phy->mt76, vif);
1187 	const struct ieee80211_he_cap_elem *ve = &vc->he_cap_elem;
1188 	u16 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80);
1189 	u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1190 	u8 snd_dim, sts;
1191 
1192 	bf->tx_mode = MT_PHY_TYPE_HE_SU;
1193 
1194 	mt7915_mcu_sta_sounding_rate(bf);
1195 
1196 	bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMING_FB,
1197 				pe->phy_cap_info[6]);
1198 	bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB,
1199 				pe->phy_cap_info[6]);
1200 	snd_dim = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
1201 			 ve->phy_cap_info[5]);
1202 	sts = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK,
1203 		     pe->phy_cap_info[4]);
1204 	bf->nrow = min_t(u8, snd_dim, sts);
1205 	bf->ncol = min_t(u8, nss_mcs, bf->nrow);
1206 	bf->ibf_ncol = bf->ncol;
1207 
1208 	if (sta->deflink.bandwidth != IEEE80211_STA_RX_BW_160)
1209 		return;
1210 
1211 	/* go over for 160MHz and 80p80 */
1212 	if (pe->phy_cap_info[0] &
1213 	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) {
1214 		mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_160);
1215 		nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1216 
1217 		bf->ncol_gt_bw80 = nss_mcs;
1218 	}
1219 
1220 	if (pe->phy_cap_info[0] &
1221 	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
1222 		mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80p80);
1223 		nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1224 
1225 		if (bf->ncol_gt_bw80)
1226 			bf->ncol_gt_bw80 = min_t(u8, bf->ncol_gt_bw80, nss_mcs);
1227 		else
1228 			bf->ncol_gt_bw80 = nss_mcs;
1229 	}
1230 
1231 	snd_dim = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK,
1232 			 ve->phy_cap_info[5]);
1233 	sts = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK,
1234 		     pe->phy_cap_info[4]);
1235 
1236 	bf->nrow_gt_bw80 = min_t(int, snd_dim, sts);
1237 }
1238 
1239 static void
mt7915_mcu_sta_bfer_tlv(struct mt7915_dev * dev,struct sk_buff * skb,struct ieee80211_vif * vif,struct ieee80211_sta * sta)1240 mt7915_mcu_sta_bfer_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1241 			struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1242 {
1243 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1244 	struct mt7915_phy *phy = mvif->phy;
1245 	int tx_ant = hweight8(phy->mt76->chainmask) - 1;
1246 	struct sta_rec_bf *bf;
1247 	struct tlv *tlv;
1248 	static const u8 matrix[4][4] = {
1249 		{0, 0, 0, 0},
1250 		{1, 1, 0, 0},	/* 2x1, 2x2, 2x3, 2x4 */
1251 		{2, 4, 4, 0},	/* 3x1, 3x2, 3x3, 3x4 */
1252 		{3, 5, 6, 0}	/* 4x1, 4x2, 4x3, 4x4 */
1253 	};
1254 	bool ebf;
1255 
1256 	if (!(sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he))
1257 		return;
1258 
1259 	ebf = mt7915_is_ebf_supported(phy, vif, sta, false);
1260 	if (!ebf && !dev->ibf)
1261 		return;
1262 
1263 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BF, sizeof(*bf));
1264 	bf = (struct sta_rec_bf *)tlv;
1265 
1266 	/* he: eBF only, in accordance with spec
1267 	 * vht: support eBF and iBF
1268 	 * ht: iBF only, since mac80211 lacks of eBF support
1269 	 */
1270 	if (sta->deflink.he_cap.has_he && ebf)
1271 		mt7915_mcu_sta_bfer_he(sta, vif, phy, bf);
1272 	else if (sta->deflink.vht_cap.vht_supported)
1273 		mt7915_mcu_sta_bfer_vht(sta, phy, bf, ebf);
1274 	else if (sta->deflink.ht_cap.ht_supported)
1275 		mt7915_mcu_sta_bfer_ht(sta, phy, bf);
1276 	else
1277 		return;
1278 
1279 	bf->bf_cap = ebf ? ebf : dev->ibf << 1;
1280 	bf->bw = sta->deflink.bandwidth;
1281 	bf->ibf_dbw = sta->deflink.bandwidth;
1282 	bf->ibf_nrow = tx_ant;
1283 
1284 	if (!ebf && sta->deflink.bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->ncol)
1285 		bf->ibf_timeout = 0x48;
1286 	else
1287 		bf->ibf_timeout = 0x18;
1288 
1289 	if (ebf && bf->nrow != tx_ant)
1290 		bf->mem_20m = matrix[tx_ant][bf->ncol];
1291 	else
1292 		bf->mem_20m = matrix[bf->nrow][bf->ncol];
1293 
1294 	switch (sta->deflink.bandwidth) {
1295 	case IEEE80211_STA_RX_BW_160:
1296 	case IEEE80211_STA_RX_BW_80:
1297 		bf->mem_total = bf->mem_20m * 2;
1298 		break;
1299 	case IEEE80211_STA_RX_BW_40:
1300 		bf->mem_total = bf->mem_20m;
1301 		break;
1302 	case IEEE80211_STA_RX_BW_20:
1303 	default:
1304 		break;
1305 	}
1306 }
1307 
1308 static void
mt7915_mcu_sta_bfee_tlv(struct mt7915_dev * dev,struct sk_buff * skb,struct ieee80211_vif * vif,struct ieee80211_sta * sta)1309 mt7915_mcu_sta_bfee_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1310 			struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1311 {
1312 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1313 	struct mt7915_phy *phy = mvif->phy;
1314 	int tx_ant = hweight8(phy->mt76->chainmask) - 1;
1315 	struct sta_rec_bfee *bfee;
1316 	struct tlv *tlv;
1317 	u8 nrow = 0;
1318 
1319 	if (!(sta->deflink.vht_cap.vht_supported || sta->deflink.he_cap.has_he))
1320 		return;
1321 
1322 	if (!mt7915_is_ebf_supported(phy, vif, sta, true))
1323 		return;
1324 
1325 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BFEE, sizeof(*bfee));
1326 	bfee = (struct sta_rec_bfee *)tlv;
1327 
1328 	if (sta->deflink.he_cap.has_he) {
1329 		struct ieee80211_he_cap_elem *pe = &sta->deflink.he_cap.he_cap_elem;
1330 
1331 		nrow = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
1332 			      pe->phy_cap_info[5]);
1333 	} else if (sta->deflink.vht_cap.vht_supported) {
1334 		struct ieee80211_sta_vht_cap *pc = &sta->deflink.vht_cap;
1335 
1336 		nrow = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
1337 				 pc->cap);
1338 	}
1339 
1340 	/* reply with identity matrix to avoid 2x2 BF negative gain */
1341 	bfee->fb_identity_matrix = (nrow == 1 && tx_ant == 2);
1342 }
1343 
1344 static enum mcu_mmps_mode
mt7915_mcu_get_mmps_mode(enum ieee80211_smps_mode smps)1345 mt7915_mcu_get_mmps_mode(enum ieee80211_smps_mode smps)
1346 {
1347 	switch (smps) {
1348 	case IEEE80211_SMPS_OFF:
1349 		return MCU_MMPS_DISABLE;
1350 	case IEEE80211_SMPS_STATIC:
1351 		return MCU_MMPS_STATIC;
1352 	case IEEE80211_SMPS_DYNAMIC:
1353 		return MCU_MMPS_DYNAMIC;
1354 	default:
1355 		return MCU_MMPS_DISABLE;
1356 	}
1357 }
1358 
mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev * dev,struct ieee80211_vif * vif,struct ieee80211_sta * sta,void * data,u32 field)1359 int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
1360 				   struct ieee80211_vif *vif,
1361 				   struct ieee80211_sta *sta,
1362 				   void *data, u32 field)
1363 {
1364 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1365 	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1366 	struct sta_phy *phy = data;
1367 	struct sta_rec_ra_fixed *ra;
1368 	struct sk_buff *skb;
1369 	struct tlv *tlv;
1370 
1371 	skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1372 					    &msta->wcid);
1373 	if (IS_ERR(skb))
1374 		return PTR_ERR(skb);
1375 
1376 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA_UPDATE, sizeof(*ra));
1377 	ra = (struct sta_rec_ra_fixed *)tlv;
1378 
1379 	switch (field) {
1380 	case RATE_PARAM_AUTO:
1381 		break;
1382 	case RATE_PARAM_FIXED:
1383 	case RATE_PARAM_FIXED_MCS:
1384 	case RATE_PARAM_FIXED_GI:
1385 	case RATE_PARAM_FIXED_HE_LTF:
1386 		if (phy)
1387 			ra->phy = *phy;
1388 		break;
1389 	case RATE_PARAM_MMPS_UPDATE:
1390 		ra->mmps_mode = mt7915_mcu_get_mmps_mode(sta->deflink.smps_mode);
1391 		break;
1392 	case RATE_PARAM_SPE_UPDATE:
1393 		ra->spe_idx = *(u8 *)data;
1394 		break;
1395 	default:
1396 		break;
1397 	}
1398 	ra->field = cpu_to_le32(field);
1399 
1400 	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1401 				     MCU_EXT_CMD(STA_REC_UPDATE), true);
1402 }
1403 
mt7915_mcu_add_smps(struct mt7915_dev * dev,struct ieee80211_vif * vif,struct ieee80211_sta * sta)1404 int mt7915_mcu_add_smps(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1405 			struct ieee80211_sta *sta)
1406 {
1407 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1408 	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1409 	struct wtbl_req_hdr *wtbl_hdr;
1410 	struct tlv *sta_wtbl;
1411 	struct sk_buff *skb;
1412 	int ret;
1413 
1414 	skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1415 					    &msta->wcid);
1416 	if (IS_ERR(skb))
1417 		return PTR_ERR(skb);
1418 
1419 	sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1420 					   sizeof(struct tlv));
1421 	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1422 						  WTBL_SET, sta_wtbl, &skb);
1423 	if (IS_ERR(wtbl_hdr))
1424 		return PTR_ERR(wtbl_hdr);
1425 
1426 	mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_hdr);
1427 
1428 	ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1429 				    MCU_EXT_CMD(STA_REC_UPDATE), true);
1430 	if (ret)
1431 		return ret;
1432 
1433 	return mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, NULL,
1434 					      RATE_PARAM_MMPS_UPDATE);
1435 }
1436 
1437 static int
mt7915_mcu_set_spe_idx(struct mt7915_dev * dev,struct ieee80211_vif * vif,struct ieee80211_sta * sta)1438 mt7915_mcu_set_spe_idx(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1439 		       struct ieee80211_sta *sta)
1440 {
1441 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1442 	struct mt76_phy *mphy = mvif->phy->mt76;
1443 	u8 spe_idx = mt76_connac_spe_idx(mphy->antenna_mask);
1444 
1445 	return mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &spe_idx,
1446 					      RATE_PARAM_SPE_UPDATE);
1447 }
1448 
1449 static int
mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev * dev,struct ieee80211_vif * vif,struct ieee80211_sta * sta)1450 mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev *dev,
1451 			       struct ieee80211_vif *vif,
1452 			       struct ieee80211_sta *sta)
1453 {
1454 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1455 	struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;
1456 	struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;
1457 	enum nl80211_band band = chandef->chan->band;
1458 	struct sta_phy phy = {};
1459 	int ret, nrates = 0;
1460 
1461 #define __sta_phy_bitrate_mask_check(_mcs, _gi, _ht, _he)			\
1462 	do {									\
1463 		u8 i, gi = mask->control[band]._gi;				\
1464 		gi = (_he) ? gi : gi == NL80211_TXRATE_FORCE_SGI;		\
1465 		for (i = 0; i <= sta->deflink.bandwidth; i++) {			\
1466 			phy.sgi |= gi << (i << (_he));				\
1467 			phy.he_ltf |= mask->control[band].he_ltf << (i << (_he));\
1468 		}								\
1469 		for (i = 0; i < ARRAY_SIZE(mask->control[band]._mcs); i++) {	\
1470 			if (!mask->control[band]._mcs[i])			\
1471 				continue;					\
1472 			nrates += hweight16(mask->control[band]._mcs[i]);	\
1473 			phy.mcs = ffs(mask->control[band]._mcs[i]) - 1;		\
1474 			if (_ht)						\
1475 				phy.mcs += 8 * i;				\
1476 		}								\
1477 	} while (0)
1478 
1479 	if (sta->deflink.he_cap.has_he) {
1480 		__sta_phy_bitrate_mask_check(he_mcs, he_gi, 0, 1);
1481 	} else if (sta->deflink.vht_cap.vht_supported) {
1482 		__sta_phy_bitrate_mask_check(vht_mcs, gi, 0, 0);
1483 	} else if (sta->deflink.ht_cap.ht_supported) {
1484 		__sta_phy_bitrate_mask_check(ht_mcs, gi, 1, 0);
1485 	} else {
1486 		nrates = hweight32(mask->control[band].legacy);
1487 		phy.mcs = ffs(mask->control[band].legacy) - 1;
1488 	}
1489 #undef __sta_phy_bitrate_mask_check
1490 
1491 	/* fall back to auto rate control */
1492 	if (mask->control[band].gi == NL80211_TXRATE_DEFAULT_GI &&
1493 	    mask->control[band].he_gi == GENMASK(7, 0) &&
1494 	    mask->control[band].he_ltf == GENMASK(7, 0) &&
1495 	    nrates != 1)
1496 		return 0;
1497 
1498 	/* fixed single rate */
1499 	if (nrates == 1) {
1500 		ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,
1501 						     RATE_PARAM_FIXED_MCS);
1502 		if (ret)
1503 			return ret;
1504 	}
1505 
1506 	/* fixed GI */
1507 	if (mask->control[band].gi != NL80211_TXRATE_DEFAULT_GI ||
1508 	    mask->control[band].he_gi != GENMASK(7, 0)) {
1509 		struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1510 		u32 addr;
1511 
1512 		/* firmware updates only TXCMD but doesn't take WTBL into
1513 		 * account, so driver should update here to reflect the
1514 		 * actual txrate hardware sends out.
1515 		 */
1516 		addr = mt7915_mac_wtbl_lmac_addr(dev, msta->wcid.idx, 7);
1517 		if (sta->deflink.he_cap.has_he)
1518 			mt76_rmw_field(dev, addr, GENMASK(31, 24), phy.sgi);
1519 		else
1520 			mt76_rmw_field(dev, addr, GENMASK(15, 12), phy.sgi);
1521 
1522 		ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,
1523 						     RATE_PARAM_FIXED_GI);
1524 		if (ret)
1525 			return ret;
1526 	}
1527 
1528 	/* fixed HE_LTF */
1529 	if (mask->control[band].he_ltf != GENMASK(7, 0)) {
1530 		ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,
1531 						     RATE_PARAM_FIXED_HE_LTF);
1532 		if (ret)
1533 			return ret;
1534 	}
1535 
1536 	return mt7915_mcu_set_spe_idx(dev, vif, sta);
1537 }
1538 
1539 static void
mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff * skb,struct mt7915_dev * dev,struct ieee80211_vif * vif,struct ieee80211_sta * sta)1540 mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
1541 			     struct ieee80211_vif *vif, struct ieee80211_sta *sta)
1542 {
1543 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1544 	struct mt76_phy *mphy = mvif->phy->mt76;
1545 	struct cfg80211_chan_def *chandef = &mphy->chandef;
1546 	struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;
1547 	enum nl80211_band band = chandef->chan->band;
1548 	struct sta_rec_ra *ra;
1549 	struct tlv *tlv;
1550 	u32 supp_rate = sta->deflink.supp_rates[band];
1551 	u32 cap = sta->wme ? STA_CAP_WMM : 0;
1552 
1553 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra));
1554 	ra = (struct sta_rec_ra *)tlv;
1555 
1556 	ra->valid = true;
1557 	ra->auto_rate = true;
1558 	ra->phy_mode = mt76_connac_get_phy_mode(mphy, vif, band, &sta->deflink);
1559 	ra->channel = chandef->chan->hw_value;
1560 	ra->bw = sta->deflink.bandwidth;
1561 	ra->phy.bw = sta->deflink.bandwidth;
1562 	ra->mmps_mode = mt7915_mcu_get_mmps_mode(sta->deflink.smps_mode);
1563 
1564 	if (supp_rate) {
1565 		supp_rate &= mask->control[band].legacy;
1566 		ra->rate_len = hweight32(supp_rate);
1567 
1568 		if (band == NL80211_BAND_2GHZ) {
1569 			ra->supp_mode = MODE_CCK;
1570 			ra->supp_cck_rate = supp_rate & GENMASK(3, 0);
1571 
1572 			if (ra->rate_len > 4) {
1573 				ra->supp_mode |= MODE_OFDM;
1574 				ra->supp_ofdm_rate = supp_rate >> 4;
1575 			}
1576 		} else {
1577 			ra->supp_mode = MODE_OFDM;
1578 			ra->supp_ofdm_rate = supp_rate;
1579 		}
1580 	}
1581 
1582 	if (sta->deflink.ht_cap.ht_supported) {
1583 		ra->supp_mode |= MODE_HT;
1584 		ra->af = sta->deflink.ht_cap.ampdu_factor;
1585 		ra->ht_gf = !!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
1586 
1587 		cap |= STA_CAP_HT;
1588 		if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
1589 			cap |= STA_CAP_SGI_20;
1590 		if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
1591 			cap |= STA_CAP_SGI_40;
1592 		if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)
1593 			cap |= STA_CAP_TX_STBC;
1594 		if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
1595 			cap |= STA_CAP_RX_STBC;
1596 		if (mvif->cap.ht_ldpc &&
1597 		    (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING))
1598 			cap |= STA_CAP_LDPC;
1599 
1600 		mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs,
1601 					  mask->control[band].ht_mcs);
1602 		ra->supp_ht_mcs = *(__le32 *)ra->ht_mcs;
1603 	}
1604 
1605 	if (sta->deflink.vht_cap.vht_supported) {
1606 		u8 af;
1607 
1608 		ra->supp_mode |= MODE_VHT;
1609 		af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
1610 			       sta->deflink.vht_cap.cap);
1611 		ra->af = max_t(u8, ra->af, af);
1612 
1613 		cap |= STA_CAP_VHT;
1614 		if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
1615 			cap |= STA_CAP_VHT_SGI_80;
1616 		if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
1617 			cap |= STA_CAP_VHT_SGI_160;
1618 		if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_TXSTBC)
1619 			cap |= STA_CAP_VHT_TX_STBC;
1620 		if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1)
1621 			cap |= STA_CAP_VHT_RX_STBC;
1622 		if (mvif->cap.vht_ldpc &&
1623 		    (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC))
1624 			cap |= STA_CAP_VHT_LDPC;
1625 
1626 		mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs,
1627 					   mask->control[band].vht_mcs);
1628 	}
1629 
1630 	if (sta->deflink.he_cap.has_he) {
1631 		ra->supp_mode |= MODE_HE;
1632 		cap |= STA_CAP_HE;
1633 
1634 		if (sta->deflink.he_6ghz_capa.capa)
1635 			ra->af = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
1636 					       IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
1637 	}
1638 
1639 	ra->sta_cap = cpu_to_le32(cap);
1640 }
1641 
mt7915_mcu_add_rate_ctrl(struct mt7915_dev * dev,struct ieee80211_vif * vif,struct ieee80211_sta * sta,bool changed)1642 int mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1643 			     struct ieee80211_sta *sta, bool changed)
1644 {
1645 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1646 	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1647 	struct sk_buff *skb;
1648 	int ret;
1649 
1650 	skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1651 					    &msta->wcid);
1652 	if (IS_ERR(skb))
1653 		return PTR_ERR(skb);
1654 
1655 	/* firmware rc algorithm refers to sta_rec_he for HE control.
1656 	 * once dev->rc_work changes the settings driver should also
1657 	 * update sta_rec_he here.
1658 	 */
1659 	if (changed)
1660 		mt7915_mcu_sta_he_tlv(skb, sta, vif);
1661 
1662 	/* sta_rec_ra accommodates BW, NSS and only MCS range format
1663 	 * i.e 0-{7,8,9} for VHT.
1664 	 */
1665 	mt7915_mcu_sta_rate_ctrl_tlv(skb, dev, vif, sta);
1666 
1667 	ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1668 				    MCU_EXT_CMD(STA_REC_UPDATE), true);
1669 	if (ret)
1670 		return ret;
1671 
1672 	/* sta_rec_ra_fixed accommodates single rate, (HE)GI and HE_LTE,
1673 	 * and updates as peer fixed rate parameters, which overrides
1674 	 * sta_rec_ra and firmware rate control algorithm.
1675 	 */
1676 	return mt7915_mcu_add_rate_ctrl_fixed(dev, vif, sta);
1677 }
1678 
1679 static int
mt7915_mcu_add_group(struct mt7915_dev * dev,struct ieee80211_vif * vif,struct ieee80211_sta * sta)1680 mt7915_mcu_add_group(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1681 		     struct ieee80211_sta *sta)
1682 {
1683 #define MT_STA_BSS_GROUP		1
1684 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1685 	struct mt7915_sta *msta;
1686 	struct {
1687 		__le32 action;
1688 		u8 wlan_idx_lo;
1689 		u8 status;
1690 		u8 wlan_idx_hi;
1691 		u8 rsv0[5];
1692 		__le32 val;
1693 		u8 rsv1[8];
1694 	} __packed req = {
1695 		.action = cpu_to_le32(MT_STA_BSS_GROUP),
1696 		.val = cpu_to_le32(mvif->mt76.idx % 16),
1697 	};
1698 
1699 	msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
1700 	req.wlan_idx_lo = to_wcid_lo(msta->wcid.idx);
1701 	req.wlan_idx_hi = to_wcid_hi(msta->wcid.idx);
1702 
1703 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_DRR_CTRL), &req,
1704 				 sizeof(req), true);
1705 }
1706 
mt7915_mcu_add_sta(struct mt7915_dev * dev,struct ieee80211_vif * vif,struct ieee80211_sta * sta,int conn_state,bool newly)1707 int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1708 		       struct ieee80211_sta *sta, int conn_state, bool newly)
1709 {
1710 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1711 	struct ieee80211_link_sta *link_sta;
1712 	struct mt7915_sta *msta;
1713 	struct sk_buff *skb;
1714 	int ret;
1715 
1716 	msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
1717 	link_sta = sta ? &sta->deflink : NULL;
1718 
1719 	skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1720 					    &msta->wcid);
1721 	if (IS_ERR(skb))
1722 		return PTR_ERR(skb);
1723 
1724 	/* starec basic */
1725 	mt76_connac_mcu_sta_basic_tlv(&dev->mt76, skb, &vif->bss_conf, link_sta,
1726 				      conn_state, newly);
1727 	/* tag order is in accordance with firmware dependency. */
1728 	if (sta && conn_state != CONN_STATE_DISCONNECT) {
1729 		/* starec bfer */
1730 		mt7915_mcu_sta_bfer_tlv(dev, skb, vif, sta);
1731 		/* starec ht */
1732 		mt7915_mcu_sta_ht_tlv(skb, sta);
1733 		/* starec vht */
1734 		mt7915_mcu_sta_vht_tlv(skb, sta);
1735 		/* starec uapsd */
1736 		mt76_connac_mcu_sta_uapsd(skb, vif, sta);
1737 	}
1738 
1739 	if (newly || conn_state != CONN_STATE_DISCONNECT) {
1740 		ret = mt7915_mcu_sta_wtbl_tlv(dev, skb, vif, sta);
1741 		if (ret) {
1742 			dev_kfree_skb(skb);
1743 			return ret;
1744 		}
1745 	}
1746 
1747 	if (conn_state == CONN_STATE_DISCONNECT)
1748 		goto out;
1749 
1750 	if (sta) {
1751 		/* starec amsdu */
1752 		mt7915_mcu_sta_amsdu_tlv(dev, skb, vif, sta);
1753 		/* starec he */
1754 		mt7915_mcu_sta_he_tlv(skb, sta, vif);
1755 		/* starec muru */
1756 		mt7915_mcu_sta_muru_tlv(dev, skb, sta, vif);
1757 		/* starec bfee */
1758 		mt7915_mcu_sta_bfee_tlv(dev, skb, vif, sta);
1759 	}
1760 
1761 	ret = mt7915_mcu_add_group(dev, vif, sta);
1762 	if (ret) {
1763 		dev_kfree_skb(skb);
1764 		return ret;
1765 	}
1766 out:
1767 	ret = mt76_connac_mcu_sta_wed_update(&dev->mt76, skb);
1768 	if (ret)
1769 		return ret;
1770 
1771 	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1772 				     MCU_EXT_CMD(STA_REC_UPDATE), true);
1773 }
1774 
mt7915_mcu_wed_enable_rx_stats(struct mt7915_dev * dev)1775 int mt7915_mcu_wed_enable_rx_stats(struct mt7915_dev *dev)
1776 {
1777 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
1778 	struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
1779 	struct {
1780 		__le32 args[2];
1781 	} req = {
1782 		.args[0] = cpu_to_le32(1),
1783 		.args[1] = cpu_to_le32(6),
1784 	};
1785 
1786 	return mtk_wed_device_update_msg(wed, MTK_WED_WO_CMD_RXCNT_CTRL,
1787 					 &req, sizeof(req));
1788 #else
1789 	return 0;
1790 #endif
1791 }
1792 
mt7915_mcu_add_dev_info(struct mt7915_phy * phy,struct ieee80211_vif * vif,bool enable)1793 int mt7915_mcu_add_dev_info(struct mt7915_phy *phy,
1794 			    struct ieee80211_vif *vif, bool enable)
1795 {
1796 	struct mt7915_dev *dev = phy->dev;
1797 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1798 	struct {
1799 		struct req_hdr {
1800 			u8 omac_idx;
1801 			u8 band_idx;
1802 			__le16 tlv_num;
1803 			u8 is_tlv_append;
1804 			u8 rsv[3];
1805 		} __packed hdr;
1806 		struct req_tlv {
1807 			__le16 tag;
1808 			__le16 len;
1809 			u8 active;
1810 			u8 band_idx;
1811 			u8 omac_addr[ETH_ALEN];
1812 		} __packed tlv;
1813 	} data = {
1814 		.hdr = {
1815 			.omac_idx = mvif->mt76.omac_idx,
1816 			.band_idx = mvif->mt76.band_idx,
1817 			.tlv_num = cpu_to_le16(1),
1818 			.is_tlv_append = 1,
1819 		},
1820 		.tlv = {
1821 			.tag = cpu_to_le16(DEV_INFO_ACTIVE),
1822 			.len = cpu_to_le16(sizeof(struct req_tlv)),
1823 			.active = enable,
1824 			.band_idx = mvif->mt76.band_idx,
1825 		},
1826 	};
1827 
1828 	if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
1829 		return mt7915_mcu_muar_config(phy, vif, false, enable);
1830 
1831 	memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
1832 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE),
1833 				 &data, sizeof(data), true);
1834 }
1835 
1836 static void
mt7915_mcu_beacon_cntdwn(struct ieee80211_vif * vif,struct sk_buff * rskb,struct sk_buff * skb,struct bss_info_bcn * bcn,struct ieee80211_mutable_offsets * offs)1837 mt7915_mcu_beacon_cntdwn(struct ieee80211_vif *vif, struct sk_buff *rskb,
1838 			 struct sk_buff *skb, struct bss_info_bcn *bcn,
1839 			 struct ieee80211_mutable_offsets *offs)
1840 {
1841 	struct bss_info_bcn_cntdwn *info;
1842 	struct tlv *tlv;
1843 	int sub_tag;
1844 
1845 	if (!offs->cntdwn_counter_offs[0])
1846 		return;
1847 
1848 	sub_tag = vif->bss_conf.csa_active ? BSS_INFO_BCN_CSA : BSS_INFO_BCN_BCC;
1849 	tlv = mt7915_mcu_add_nested_subtlv(rskb, sub_tag, sizeof(*info),
1850 					   &bcn->sub_ntlv, &bcn->len);
1851 	info = (struct bss_info_bcn_cntdwn *)tlv;
1852 	info->cnt = skb->data[offs->cntdwn_counter_offs[0]];
1853 }
1854 
1855 static void
mt7915_mcu_beacon_mbss(struct sk_buff * rskb,struct sk_buff * skb,struct ieee80211_vif * vif,struct bss_info_bcn * bcn,struct ieee80211_mutable_offsets * offs)1856 mt7915_mcu_beacon_mbss(struct sk_buff *rskb, struct sk_buff *skb,
1857 		       struct ieee80211_vif *vif, struct bss_info_bcn *bcn,
1858 		       struct ieee80211_mutable_offsets *offs)
1859 {
1860 	struct bss_info_bcn_mbss *mbss;
1861 	const struct element *elem;
1862 	struct tlv *tlv;
1863 
1864 	if (!vif->bss_conf.bssid_indicator)
1865 		return;
1866 
1867 	tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_MBSSID,
1868 					   sizeof(*mbss), &bcn->sub_ntlv,
1869 					   &bcn->len);
1870 
1871 	mbss = (struct bss_info_bcn_mbss *)tlv;
1872 	mbss->offset[0] = cpu_to_le16(offs->tim_offset);
1873 	mbss->bitmap = cpu_to_le32(1);
1874 
1875 	for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID,
1876 			    &skb->data[offs->mbssid_off],
1877 			    skb->len - offs->mbssid_off) {
1878 		const struct element *sub_elem;
1879 
1880 		if (elem->datalen < 2)
1881 			continue;
1882 
1883 		for_each_element(sub_elem, elem->data + 1, elem->datalen - 1) {
1884 			const struct ieee80211_bssid_index *idx;
1885 			const u8 *idx_ie;
1886 
1887 			if (sub_elem->id || sub_elem->datalen < 4)
1888 				continue; /* not a valid BSS profile */
1889 
1890 			/* Find WLAN_EID_MULTI_BSSID_IDX
1891 			 * in the merged nontransmitted profile
1892 			 */
1893 			idx_ie = cfg80211_find_ie(WLAN_EID_MULTI_BSSID_IDX,
1894 						  sub_elem->data,
1895 						  sub_elem->datalen);
1896 			if (!idx_ie || idx_ie[1] < sizeof(*idx))
1897 				continue;
1898 
1899 			idx = (void *)(idx_ie + 2);
1900 			if (!idx->bssid_index || idx->bssid_index > 31)
1901 				continue;
1902 
1903 			mbss->offset[idx->bssid_index] =
1904 				cpu_to_le16(idx_ie - skb->data);
1905 			mbss->bitmap |= cpu_to_le32(BIT(idx->bssid_index));
1906 		}
1907 	}
1908 }
1909 
1910 static void
mt7915_mcu_beacon_cont(struct mt7915_dev * dev,struct ieee80211_vif * vif,struct sk_buff * rskb,struct sk_buff * skb,struct bss_info_bcn * bcn,struct ieee80211_mutable_offsets * offs)1911 mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1912 		       struct sk_buff *rskb, struct sk_buff *skb,
1913 		       struct bss_info_bcn *bcn,
1914 		       struct ieee80211_mutable_offsets *offs)
1915 {
1916 	struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1917 	struct bss_info_bcn_cont *cont;
1918 	struct tlv *tlv;
1919 	u8 *buf;
1920 	int len = sizeof(*cont) + MT_TXD_SIZE + skb->len;
1921 
1922 	len = (len & 0x3) ? ((len | 0x3) + 1) : len;
1923 	tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_CONTENT,
1924 					   len, &bcn->sub_ntlv, &bcn->len);
1925 
1926 	cont = (struct bss_info_bcn_cont *)tlv;
1927 	cont->pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
1928 	cont->tim_ofs = cpu_to_le16(offs->tim_offset);
1929 
1930 	if (offs->cntdwn_counter_offs[0]) {
1931 		u16 offset = offs->cntdwn_counter_offs[0];
1932 
1933 		if (vif->bss_conf.csa_active)
1934 			cont->csa_ofs = cpu_to_le16(offset - 4);
1935 		if (vif->bss_conf.color_change_active)
1936 			cont->bcc_ofs = cpu_to_le16(offset - 3);
1937 	}
1938 
1939 	buf = (u8 *)tlv + sizeof(*cont);
1940 	mt7915_mac_write_txwi(&dev->mt76, (__le32 *)buf, skb, wcid, 0, NULL,
1941 			      0, BSS_CHANGED_BEACON);
1942 	memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
1943 }
1944 
1945 int
mt7915_mcu_add_inband_discov(struct mt7915_dev * dev,struct ieee80211_vif * vif,u32 changed)1946 mt7915_mcu_add_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1947 			     u32 changed)
1948 {
1949 #define OFFLOAD_TX_MODE_SU	BIT(0)
1950 #define OFFLOAD_TX_MODE_MU	BIT(1)
1951 	struct ieee80211_hw *hw = mt76_hw(dev);
1952 	struct mt7915_phy *phy = mt7915_hw_phy(hw);
1953 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1954 	struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;
1955 	enum nl80211_band band = chandef->chan->band;
1956 	struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1957 	struct bss_info_bcn *bcn;
1958 	struct bss_info_inband_discovery *discov;
1959 	struct ieee80211_tx_info *info;
1960 	struct sk_buff *rskb, *skb = NULL;
1961 	struct tlv *tlv, *sub_tlv;
1962 	bool ext_phy = phy != &dev->phy;
1963 	u8 *buf, interval;
1964 	int len;
1965 
1966 	if (vif->bss_conf.nontransmitted)
1967 		return 0;
1968 
1969 	rskb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL,
1970 					       MT7915_MAX_BSS_OFFLOAD_SIZE);
1971 	if (IS_ERR(rskb))
1972 		return PTR_ERR(rskb);
1973 
1974 	tlv = mt76_connac_mcu_add_tlv(rskb, BSS_INFO_OFFLOAD, sizeof(*bcn));
1975 	bcn = (struct bss_info_bcn *)tlv;
1976 	bcn->enable = true;
1977 
1978 	if (changed & BSS_CHANGED_FILS_DISCOVERY) {
1979 		interval = vif->bss_conf.fils_discovery.max_interval;
1980 		skb = ieee80211_get_fils_discovery_tmpl(hw, vif);
1981 	} else if (changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP &&
1982 		   vif->bss_conf.unsol_bcast_probe_resp_interval) {
1983 		interval = vif->bss_conf.unsol_bcast_probe_resp_interval;
1984 		skb = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
1985 	}
1986 
1987 	if (!skb) {
1988 		dev_kfree_skb(rskb);
1989 		return -EINVAL;
1990 	}
1991 
1992 	info = IEEE80211_SKB_CB(skb);
1993 	info->control.vif = vif;
1994 	info->band = band;
1995 	info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, ext_phy);
1996 
1997 	len = sizeof(*discov) + MT_TXD_SIZE + skb->len;
1998 	len = (len & 0x3) ? ((len | 0x3) + 1) : len;
1999 
2000 	if (skb->len > MT7915_MAX_BEACON_SIZE) {
2001 		dev_err(dev->mt76.dev, "inband discovery size limit exceed\n");
2002 		dev_kfree_skb(rskb);
2003 		dev_kfree_skb(skb);
2004 		return -EINVAL;
2005 	}
2006 
2007 	sub_tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_DISCOV,
2008 					       len, &bcn->sub_ntlv, &bcn->len);
2009 	discov = (struct bss_info_inband_discovery *)sub_tlv;
2010 	discov->tx_mode = OFFLOAD_TX_MODE_SU;
2011 	/* 0: UNSOL PROBE RESP, 1: FILS DISCOV */
2012 	discov->tx_type = !!(changed & BSS_CHANGED_FILS_DISCOVERY);
2013 	discov->tx_interval = interval;
2014 	discov->prob_rsp_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
2015 	discov->enable = !!interval;
2016 
2017 	buf = (u8 *)sub_tlv + sizeof(*discov);
2018 
2019 	mt7915_mac_write_txwi(&dev->mt76, (__le32 *)buf, skb, wcid, 0, NULL,
2020 			      0, changed);
2021 	memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
2022 
2023 	dev_kfree_skb(skb);
2024 
2025 	return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb,
2026 				     MCU_EXT_CMD(BSS_INFO_UPDATE), true);
2027 }
2028 
mt7915_mcu_add_beacon(struct ieee80211_hw * hw,struct ieee80211_vif * vif,int en,u32 changed)2029 int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2030 			  int en, u32 changed)
2031 {
2032 	struct mt7915_dev *dev = mt7915_hw_dev(hw);
2033 	struct mt7915_phy *phy = mt7915_hw_phy(hw);
2034 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2035 	struct ieee80211_mutable_offsets offs;
2036 	struct ieee80211_tx_info *info;
2037 	struct sk_buff *skb, *rskb;
2038 	struct tlv *tlv;
2039 	struct bss_info_bcn *bcn;
2040 	int len = MT7915_MAX_BSS_OFFLOAD_SIZE;
2041 	bool ext_phy = phy != &dev->phy;
2042 
2043 	if (vif->bss_conf.nontransmitted)
2044 		return 0;
2045 
2046 	rskb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
2047 					       NULL, len);
2048 	if (IS_ERR(rskb))
2049 		return PTR_ERR(rskb);
2050 
2051 	tlv = mt76_connac_mcu_add_tlv(rskb, BSS_INFO_OFFLOAD, sizeof(*bcn));
2052 	bcn = (struct bss_info_bcn *)tlv;
2053 	bcn->enable = en;
2054 
2055 	if (!en)
2056 		goto out;
2057 
2058 	skb = ieee80211_beacon_get_template(hw, vif, &offs, 0);
2059 	if (!skb) {
2060 		dev_kfree_skb(rskb);
2061 		return -EINVAL;
2062 	}
2063 
2064 	if (skb->len > MT7915_MAX_BEACON_SIZE) {
2065 		dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
2066 		dev_kfree_skb(rskb);
2067 		dev_kfree_skb(skb);
2068 		return -EINVAL;
2069 	}
2070 
2071 	info = IEEE80211_SKB_CB(skb);
2072 	info->hw_queue = FIELD_PREP(MT_TX_HW_QUEUE_PHY, ext_phy);
2073 
2074 	mt7915_mcu_beacon_cntdwn(vif, rskb, skb, bcn, &offs);
2075 	mt7915_mcu_beacon_mbss(rskb, skb, vif, bcn, &offs);
2076 	mt7915_mcu_beacon_cont(dev, vif, rskb, skb, bcn, &offs);
2077 	dev_kfree_skb(skb);
2078 
2079 out:
2080 	return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb,
2081 				     MCU_EXT_CMD(BSS_INFO_UPDATE), true);
2082 }
2083 
mt7915_driver_own(struct mt7915_dev * dev,u8 band)2084 static int mt7915_driver_own(struct mt7915_dev *dev, u8 band)
2085 {
2086 	mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(band), MT_TOP_LPCR_HOST_DRV_OWN);
2087 	if (!mt76_poll_msec(dev, MT_TOP_LPCR_HOST_BAND(band),
2088 			    MT_TOP_LPCR_HOST_FW_OWN_STAT, 0, 500)) {
2089 		dev_err(dev->mt76.dev, "Timeout for driver own\n");
2090 		return -EIO;
2091 	}
2092 
2093 	/* clear irq when the driver own success */
2094 	mt76_wr(dev, MT_TOP_LPCR_HOST_BAND_IRQ_STAT(band),
2095 		MT_TOP_LPCR_HOST_BAND_STAT);
2096 
2097 	return 0;
2098 }
2099 
2100 static int
mt7915_firmware_state(struct mt7915_dev * dev,bool wa)2101 mt7915_firmware_state(struct mt7915_dev *dev, bool wa)
2102 {
2103 	u32 state = FIELD_PREP(MT_TOP_MISC_FW_STATE,
2104 			       wa ? FW_STATE_RDY : FW_STATE_FW_DOWNLOAD);
2105 
2106 	if (!mt76_poll_msec(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE,
2107 			    state, 1000)) {
2108 		dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
2109 		return -EIO;
2110 	}
2111 	return 0;
2112 }
2113 
mt7915_load_firmware(struct mt7915_dev * dev)2114 static int mt7915_load_firmware(struct mt7915_dev *dev)
2115 {
2116 	int ret;
2117 
2118 	/* Release Semaphore if taken by previous failed attempt */
2119 	ret = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false);
2120 	if (ret != PATCH_REL_SEM_SUCCESS) {
2121 		dev_err(dev->mt76.dev, "Could not release semaphore\n");
2122 		/* Continue anyways */
2123 	}
2124 
2125 	/* Always restart MCU firmware */
2126 	mt76_connac_mcu_restart(&dev->mt76);
2127 
2128 	/* Check if MCU is ready */
2129 	ret = mt7915_firmware_state(dev, false);
2130 	if (ret) {
2131 		dev_err(dev->mt76.dev, "Firmware did not enter download state\n");
2132 		return ret;
2133 	}
2134 
2135 	ret = mt76_connac2_load_patch(&dev->mt76, fw_name_var(dev, ROM_PATCH));
2136 	if (ret)
2137 		return ret;
2138 
2139 	ret = mt76_connac2_load_ram(&dev->mt76, fw_name_var(dev, FIRMWARE_WM),
2140 				    fw_name(dev, FIRMWARE_WA));
2141 	if (ret)
2142 		return ret;
2143 
2144 	ret = mt7915_firmware_state(dev, true);
2145 	if (ret)
2146 		return ret;
2147 
2148 	mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
2149 
2150 	dev_dbg(dev->mt76.dev, "Firmware init done\n");
2151 
2152 	return 0;
2153 }
2154 
mt7915_mcu_fw_log_2_host(struct mt7915_dev * dev,u8 type,u8 ctrl)2155 int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 type, u8 ctrl)
2156 {
2157 	struct {
2158 		u8 ctrl_val;
2159 		u8 pad[3];
2160 	} data = {
2161 		.ctrl_val = ctrl
2162 	};
2163 
2164 	if (type == MCU_FW_LOG_WA)
2165 		return mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(FW_LOG_2_HOST),
2166 					 &data, sizeof(data), true);
2167 
2168 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST), &data,
2169 				 sizeof(data), true);
2170 }
2171 
mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev * dev,u32 module,u8 level)2172 int mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev *dev, u32 module, u8 level)
2173 {
2174 	struct {
2175 		u8 ver;
2176 		u8 pad;
2177 		__le16 len;
2178 		u8 level;
2179 		u8 rsv[3];
2180 		__le32 module_idx;
2181 	} data = {
2182 		.module_idx = cpu_to_le32(module),
2183 		.level = level,
2184 	};
2185 
2186 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_DBG_CTRL), &data,
2187 				 sizeof(data), false);
2188 }
2189 
mt7915_mcu_muru_debug_set(struct mt7915_dev * dev,bool enabled)2190 int mt7915_mcu_muru_debug_set(struct mt7915_dev *dev, bool enabled)
2191 {
2192 	struct {
2193 		__le32 cmd;
2194 		u8 enable;
2195 	} data = {
2196 		.cmd = cpu_to_le32(MURU_SET_TXC_TX_STATS_EN),
2197 		.enable = enabled,
2198 	};
2199 
2200 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL), &data,
2201 				sizeof(data), false);
2202 }
2203 
mt7915_mcu_muru_debug_get(struct mt7915_phy * phy)2204 int mt7915_mcu_muru_debug_get(struct mt7915_phy *phy)
2205 {
2206 	struct mt7915_dev *dev = phy->dev;
2207 	struct sk_buff *skb;
2208 	struct mt7915_mcu_muru_stats *mu_stats;
2209 	int ret;
2210 
2211 	struct {
2212 		__le32 cmd;
2213 		u8 band_idx;
2214 	} req = {
2215 		.cmd = cpu_to_le32(MURU_GET_TXC_TX_STATS),
2216 		.band_idx = phy->mt76->band_idx,
2217 	};
2218 
2219 	ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL),
2220 					&req, sizeof(req), true, &skb);
2221 	if (ret)
2222 		return ret;
2223 
2224 	mu_stats = (struct mt7915_mcu_muru_stats *)(skb->data);
2225 
2226 	/* accumulate stats, these are clear-on-read */
2227 #define __dl_u32(s)	 phy->mib.dl_##s += le32_to_cpu(mu_stats->dl.s)
2228 #define __ul_u32(s)	 phy->mib.ul_##s += le32_to_cpu(mu_stats->ul.s)
2229 	__dl_u32(cck_cnt);
2230 	__dl_u32(ofdm_cnt);
2231 	__dl_u32(htmix_cnt);
2232 	__dl_u32(htgf_cnt);
2233 	__dl_u32(vht_su_cnt);
2234 	__dl_u32(vht_2mu_cnt);
2235 	__dl_u32(vht_3mu_cnt);
2236 	__dl_u32(vht_4mu_cnt);
2237 	__dl_u32(he_su_cnt);
2238 	__dl_u32(he_2ru_cnt);
2239 	__dl_u32(he_2mu_cnt);
2240 	__dl_u32(he_3ru_cnt);
2241 	__dl_u32(he_3mu_cnt);
2242 	__dl_u32(he_4ru_cnt);
2243 	__dl_u32(he_4mu_cnt);
2244 	__dl_u32(he_5to8ru_cnt);
2245 	__dl_u32(he_9to16ru_cnt);
2246 	__dl_u32(he_gtr16ru_cnt);
2247 
2248 	__ul_u32(hetrig_su_cnt);
2249 	__ul_u32(hetrig_2ru_cnt);
2250 	__ul_u32(hetrig_3ru_cnt);
2251 	__ul_u32(hetrig_4ru_cnt);
2252 	__ul_u32(hetrig_5to8ru_cnt);
2253 	__ul_u32(hetrig_9to16ru_cnt);
2254 	__ul_u32(hetrig_gtr16ru_cnt);
2255 	__ul_u32(hetrig_2mu_cnt);
2256 	__ul_u32(hetrig_3mu_cnt);
2257 	__ul_u32(hetrig_4mu_cnt);
2258 #undef __dl_u32
2259 #undef __ul_u32
2260 
2261 	dev_kfree_skb(skb);
2262 
2263 	return 0;
2264 }
2265 
mt7915_mcu_set_mwds(struct mt7915_dev * dev,bool enabled)2266 static int mt7915_mcu_set_mwds(struct mt7915_dev *dev, bool enabled)
2267 {
2268 	struct {
2269 		u8 enable;
2270 		u8 _rsv[3];
2271 	} __packed req = {
2272 		.enable = enabled
2273 	};
2274 
2275 	return mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(MWDS_SUPPORT), &req,
2276 				 sizeof(req), false);
2277 }
2278 
mt7915_mcu_set_muru_ctrl(struct mt7915_dev * dev,u32 cmd,u32 val)2279 int mt7915_mcu_set_muru_ctrl(struct mt7915_dev *dev, u32 cmd, u32 val)
2280 {
2281 	struct {
2282 		__le32 cmd;
2283 		u8 val[4];
2284 	} __packed req = {
2285 		.cmd = cpu_to_le32(cmd),
2286 	};
2287 
2288 	put_unaligned_le32(val, req.val);
2289 
2290 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL), &req,
2291 				 sizeof(req), false);
2292 }
2293 
2294 static int
mt7915_mcu_init_rx_airtime(struct mt7915_dev * dev)2295 mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev)
2296 {
2297 #define RX_AIRTIME_FEATURE_CTRL		1
2298 #define RX_AIRTIME_BITWISE_CTRL		2
2299 #define RX_AIRTIME_CLEAR_EN	1
2300 	struct {
2301 		__le16 field;
2302 		__le16 sub_field;
2303 		__le32 set_status;
2304 		__le32 get_status;
2305 		u8 _rsv[12];
2306 
2307 		bool airtime_en;
2308 		bool mibtime_en;
2309 		bool earlyend_en;
2310 		u8 _rsv1[9];
2311 
2312 		bool airtime_clear;
2313 		bool mibtime_clear;
2314 		u8 _rsv2[98];
2315 	} __packed req = {
2316 		.field = cpu_to_le16(RX_AIRTIME_BITWISE_CTRL),
2317 		.sub_field = cpu_to_le16(RX_AIRTIME_CLEAR_EN),
2318 		.airtime_clear = true,
2319 	};
2320 	int ret;
2321 
2322 	ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_AIRTIME_CTRL), &req,
2323 				sizeof(req), true);
2324 	if (ret)
2325 		return ret;
2326 
2327 	req.field = cpu_to_le16(RX_AIRTIME_FEATURE_CTRL);
2328 	req.sub_field = cpu_to_le16(RX_AIRTIME_CLEAR_EN);
2329 	req.airtime_en = true;
2330 
2331 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_AIRTIME_CTRL), &req,
2332 				 sizeof(req), true);
2333 }
2334 
mt7915_red_set_watermark(struct mt7915_dev * dev)2335 static int mt7915_red_set_watermark(struct mt7915_dev *dev)
2336 {
2337 #define RED_GLOBAL_TOKEN_WATERMARK 2
2338 	struct {
2339 		__le32 args[3];
2340 		u8 cmd;
2341 		u8 version;
2342 		u8 __rsv1[4];
2343 		__le16 len;
2344 		__le16 high_mark;
2345 		__le16 low_mark;
2346 		u8 __rsv2[12];
2347 	} __packed req = {
2348 		.args[0] = cpu_to_le32(MCU_WA_PARAM_RED_SETTING),
2349 		.cmd = RED_GLOBAL_TOKEN_WATERMARK,
2350 		.len = cpu_to_le16(sizeof(req) - sizeof(req.args)),
2351 		.high_mark = cpu_to_le16(MT7915_HW_TOKEN_SIZE - 256),
2352 		.low_mark = cpu_to_le16(MT7915_HW_TOKEN_SIZE - 256 - 1536),
2353 	};
2354 
2355 	return mt76_mcu_send_msg(&dev->mt76, MCU_WA_PARAM_CMD(SET), &req,
2356 				 sizeof(req), false);
2357 }
2358 
mt7915_mcu_set_red(struct mt7915_dev * dev,bool enabled)2359 static int mt7915_mcu_set_red(struct mt7915_dev *dev, bool enabled)
2360 {
2361 #define RED_DISABLE		0
2362 #define RED_BY_WA_ENABLE	2
2363 	int ret;
2364 	u32 red_type = enabled ? RED_BY_WA_ENABLE : RED_DISABLE;
2365 	__le32 req = cpu_to_le32(red_type);
2366 
2367 	if (enabled) {
2368 		ret = mt7915_red_set_watermark(dev);
2369 		if (ret < 0)
2370 			return ret;
2371 	}
2372 
2373 	ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RED_ENABLE), &req,
2374 				sizeof(req), false);
2375 	if (ret < 0)
2376 		return ret;
2377 
2378 	return mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
2379 				 MCU_WA_PARAM_RED, enabled, 0);
2380 }
2381 
mt7915_mcu_init_firmware(struct mt7915_dev * dev)2382 int mt7915_mcu_init_firmware(struct mt7915_dev *dev)
2383 {
2384 	int ret;
2385 
2386 	/* force firmware operation mode into normal state,
2387 	 * which should be set before firmware download stage.
2388 	 */
2389 	mt76_wr(dev, MT_SWDEF_MODE, MT_SWDEF_NORMAL_MODE);
2390 
2391 	ret = mt7915_driver_own(dev, 0);
2392 	if (ret)
2393 		return ret;
2394 	/* set driver own for band1 when two hif exist */
2395 	if (dev->hif2) {
2396 		ret = mt7915_driver_own(dev, 1);
2397 		if (ret)
2398 			return ret;
2399 	}
2400 
2401 	ret = mt7915_load_firmware(dev);
2402 	if (ret)
2403 		return ret;
2404 
2405 	set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
2406 	ret = mt7915_mcu_fw_log_2_host(dev, MCU_FW_LOG_WM, 0);
2407 	if (ret)
2408 		return ret;
2409 
2410 	ret = mt7915_mcu_fw_log_2_host(dev, MCU_FW_LOG_WA, 0);
2411 	if (ret)
2412 		return ret;
2413 
2414 	mt76_connac_mcu_del_wtbl_all(&dev->mt76);
2415 
2416 	if ((mtk_wed_device_active(&dev->mt76.mmio.wed) &&
2417 	     is_mt7915(&dev->mt76)) ||
2418 	    !mtk_wed_get_rx_capa(&dev->mt76.mmio.wed))
2419 		mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(CAPABILITY), 0, 0, 0);
2420 
2421 	ret = mt7915_mcu_set_mwds(dev, 1);
2422 	if (ret)
2423 		return ret;
2424 
2425 	ret = mt7915_mcu_set_muru_ctrl(dev, MURU_SET_PLATFORM_TYPE,
2426 				       MURU_PLATFORM_TYPE_PERF_LEVEL_2);
2427 	if (ret)
2428 		return ret;
2429 
2430 	ret = mt7915_mcu_init_rx_airtime(dev);
2431 	if (ret)
2432 		return ret;
2433 
2434 	return mt7915_mcu_set_red(dev, mtk_wed_device_active(&dev->mt76.mmio.wed));
2435 }
2436 
mt7915_mcu_init(struct mt7915_dev * dev)2437 int mt7915_mcu_init(struct mt7915_dev *dev)
2438 {
2439 	static const struct mt76_mcu_ops mt7915_mcu_ops = {
2440 		.max_retry = 1,
2441 		.headroom = sizeof(struct mt76_connac2_mcu_txd),
2442 		.mcu_skb_prepare_msg = mt76_connac2_mcu_fill_message,
2443 		.mcu_skb_send_msg = mt7915_mcu_send_message,
2444 		.mcu_parse_response = mt7915_mcu_parse_response,
2445 	};
2446 
2447 	dev->mt76.mcu_ops = &mt7915_mcu_ops;
2448 
2449 	return mt7915_mcu_init_firmware(dev);
2450 }
2451 
mt7915_mcu_exit(struct mt7915_dev * dev)2452 void mt7915_mcu_exit(struct mt7915_dev *dev)
2453 {
2454 	mt76_connac_mcu_restart(&dev->mt76);
2455 	if (mt7915_firmware_state(dev, false)) {
2456 		dev_err(dev->mt76.dev, "Failed to exit mcu\n");
2457 		goto out;
2458 	}
2459 
2460 	mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(0), MT_TOP_LPCR_HOST_FW_OWN);
2461 	if (dev->hif2)
2462 		mt76_wr(dev, MT_TOP_LPCR_HOST_BAND(1),
2463 			MT_TOP_LPCR_HOST_FW_OWN);
2464 out:
2465 	skb_queue_purge(&dev->mt76.mcu.res_q);
2466 }
2467 
2468 static int
mt7915_mcu_set_rx_hdr_trans_blacklist(struct mt7915_dev * dev,int band)2469 mt7915_mcu_set_rx_hdr_trans_blacklist(struct mt7915_dev *dev, int band)
2470 {
2471 	struct {
2472 		u8 operation;
2473 		u8 count;
2474 		u8 _rsv[2];
2475 		u8 index;
2476 		u8 enable;
2477 		__le16 etype;
2478 	} req = {
2479 		.operation = 1,
2480 		.count = 1,
2481 		.enable = 1,
2482 		.etype = cpu_to_le16(ETH_P_PAE),
2483 	};
2484 
2485 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
2486 				 &req, sizeof(req), false);
2487 }
2488 
mt7915_mcu_set_mac(struct mt7915_dev * dev,int band,bool enable,bool hdr_trans)2489 int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band,
2490 		       bool enable, bool hdr_trans)
2491 {
2492 	struct {
2493 		u8 operation;
2494 		u8 enable;
2495 		u8 check_bssid;
2496 		u8 insert_vlan;
2497 		u8 remove_vlan;
2498 		u8 tid;
2499 		u8 mode;
2500 		u8 rsv;
2501 	} __packed req_trans = {
2502 		.enable = hdr_trans,
2503 	};
2504 	struct {
2505 		u8 enable;
2506 		u8 band;
2507 		u8 rsv[2];
2508 	} __packed req_mac = {
2509 		.enable = enable,
2510 		.band = band,
2511 	};
2512 	int ret;
2513 
2514 	ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
2515 				&req_trans, sizeof(req_trans), false);
2516 	if (ret)
2517 		return ret;
2518 
2519 	if (hdr_trans)
2520 		mt7915_mcu_set_rx_hdr_trans_blacklist(dev, band);
2521 
2522 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MAC_INIT_CTRL),
2523 				 &req_mac, sizeof(req_mac), true);
2524 }
2525 
mt7915_mcu_update_edca(struct mt7915_dev * dev,void * param)2526 int mt7915_mcu_update_edca(struct mt7915_dev *dev, void *param)
2527 {
2528 	struct mt7915_mcu_tx *req = (struct mt7915_mcu_tx *)param;
2529 	u8 num = req->total;
2530 	size_t len = sizeof(*req) -
2531 		     (IEEE80211_NUM_ACS - num) * sizeof(struct edca);
2532 
2533 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE), req,
2534 				 len, true);
2535 }
2536 
mt7915_mcu_set_tx(struct mt7915_dev * dev,struct ieee80211_vif * vif)2537 int mt7915_mcu_set_tx(struct mt7915_dev *dev, struct ieee80211_vif *vif)
2538 {
2539 #define TX_CMD_MODE		1
2540 	struct mt7915_mcu_tx req = {
2541 		.valid = true,
2542 		.mode = TX_CMD_MODE,
2543 		.total = IEEE80211_NUM_ACS,
2544 	};
2545 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2546 	int ac;
2547 
2548 	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
2549 		struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac];
2550 		struct edca *e = &req.edca[ac];
2551 
2552 		e->set = WMM_PARAM_SET;
2553 		e->queue = ac + mvif->mt76.wmm_idx * MT76_CONNAC_MAX_WMM_SETS;
2554 		e->aifs = q->aifs;
2555 		e->txop = cpu_to_le16(q->txop);
2556 
2557 		if (q->cw_min)
2558 			e->cw_min = fls(q->cw_min);
2559 		else
2560 			e->cw_min = 5;
2561 
2562 		if (q->cw_max)
2563 			e->cw_max = cpu_to_le16(fls(q->cw_max));
2564 		else
2565 			e->cw_max = cpu_to_le16(10);
2566 	}
2567 
2568 	return mt7915_mcu_update_edca(dev, &req);
2569 }
2570 
mt7915_mcu_set_fcc5_lpn(struct mt7915_dev * dev,int val)2571 int mt7915_mcu_set_fcc5_lpn(struct mt7915_dev *dev, int val)
2572 {
2573 	struct {
2574 		__le32 tag;
2575 		__le16 min_lpn;
2576 		u8 rsv[2];
2577 	} __packed req = {
2578 		.tag = cpu_to_le32(0x1),
2579 		.min_lpn = cpu_to_le16(val),
2580 	};
2581 
2582 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
2583 				 sizeof(req), true);
2584 }
2585 
mt7915_mcu_set_pulse_th(struct mt7915_dev * dev,const struct mt7915_dfs_pulse * pulse)2586 int mt7915_mcu_set_pulse_th(struct mt7915_dev *dev,
2587 			    const struct mt7915_dfs_pulse *pulse)
2588 {
2589 	struct {
2590 		__le32 tag;
2591 
2592 		__le32 max_width;		/* us */
2593 		__le32 max_pwr;			/* dbm */
2594 		__le32 min_pwr;			/* dbm */
2595 		__le32 min_stgr_pri;		/* us */
2596 		__le32 max_stgr_pri;		/* us */
2597 		__le32 min_cr_pri;		/* us */
2598 		__le32 max_cr_pri;		/* us */
2599 	} __packed req = {
2600 		.tag = cpu_to_le32(0x3),
2601 
2602 #define __req_field(field) .field = cpu_to_le32(pulse->field)
2603 		__req_field(max_width),
2604 		__req_field(max_pwr),
2605 		__req_field(min_pwr),
2606 		__req_field(min_stgr_pri),
2607 		__req_field(max_stgr_pri),
2608 		__req_field(min_cr_pri),
2609 		__req_field(max_cr_pri),
2610 #undef __req_field
2611 	};
2612 
2613 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
2614 				 sizeof(req), true);
2615 }
2616 
mt7915_mcu_set_radar_th(struct mt7915_dev * dev,int index,const struct mt7915_dfs_pattern * pattern)2617 int mt7915_mcu_set_radar_th(struct mt7915_dev *dev, int index,
2618 			    const struct mt7915_dfs_pattern *pattern)
2619 {
2620 	struct {
2621 		__le32 tag;
2622 		__le16 radar_type;
2623 
2624 		u8 enb;
2625 		u8 stgr;
2626 		u8 min_crpn;
2627 		u8 max_crpn;
2628 		u8 min_crpr;
2629 		u8 min_pw;
2630 		__le32 min_pri;
2631 		__le32 max_pri;
2632 		u8 max_pw;
2633 		u8 min_crbn;
2634 		u8 max_crbn;
2635 		u8 min_stgpn;
2636 		u8 max_stgpn;
2637 		u8 min_stgpr;
2638 		u8 rsv[2];
2639 		__le32 min_stgpr_diff;
2640 	} __packed req = {
2641 		.tag = cpu_to_le32(0x2),
2642 		.radar_type = cpu_to_le16(index),
2643 
2644 #define __req_field_u8(field) .field = pattern->field
2645 #define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
2646 		__req_field_u8(enb),
2647 		__req_field_u8(stgr),
2648 		__req_field_u8(min_crpn),
2649 		__req_field_u8(max_crpn),
2650 		__req_field_u8(min_crpr),
2651 		__req_field_u8(min_pw),
2652 		__req_field_u32(min_pri),
2653 		__req_field_u32(max_pri),
2654 		__req_field_u8(max_pw),
2655 		__req_field_u8(min_crbn),
2656 		__req_field_u8(max_crbn),
2657 		__req_field_u8(min_stgpn),
2658 		__req_field_u8(max_stgpn),
2659 		__req_field_u8(min_stgpr),
2660 		__req_field_u32(min_stgpr_diff),
2661 #undef __req_field_u8
2662 #undef __req_field_u32
2663 	};
2664 
2665 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
2666 				 sizeof(req), true);
2667 }
2668 
2669 static int
mt7915_mcu_background_chain_ctrl(struct mt7915_phy * phy,struct cfg80211_chan_def * chandef,int cmd)2670 mt7915_mcu_background_chain_ctrl(struct mt7915_phy *phy,
2671 				 struct cfg80211_chan_def *chandef,
2672 				 int cmd)
2673 {
2674 	struct mt7915_dev *dev = phy->dev;
2675 	struct mt76_phy *mphy = phy->mt76;
2676 	struct ieee80211_channel *chan = mphy->chandef.chan;
2677 	int freq = mphy->chandef.center_freq1;
2678 	struct mt7915_mcu_background_chain_ctrl req = {
2679 		.monitor_scan_type = 2, /* simple rx */
2680 	};
2681 
2682 	if (!chandef && cmd != CH_SWITCH_BACKGROUND_SCAN_STOP)
2683 		return -EINVAL;
2684 
2685 	if (!cfg80211_chandef_valid(&mphy->chandef))
2686 		return -EINVAL;
2687 
2688 	switch (cmd) {
2689 	case CH_SWITCH_BACKGROUND_SCAN_START: {
2690 		req.chan = chan->hw_value;
2691 		req.central_chan = ieee80211_frequency_to_channel(freq);
2692 		req.bw = mt76_connac_chan_bw(&mphy->chandef);
2693 		req.monitor_chan = chandef->chan->hw_value;
2694 		req.monitor_central_chan =
2695 			ieee80211_frequency_to_channel(chandef->center_freq1);
2696 		req.monitor_bw = mt76_connac_chan_bw(chandef);
2697 		req.band_idx = phy->mt76->band_idx;
2698 		req.scan_mode = 1;
2699 		break;
2700 	}
2701 	case CH_SWITCH_BACKGROUND_SCAN_RUNNING:
2702 		req.monitor_chan = chandef->chan->hw_value;
2703 		req.monitor_central_chan =
2704 			ieee80211_frequency_to_channel(chandef->center_freq1);
2705 		req.band_idx = phy->mt76->band_idx;
2706 		req.scan_mode = 2;
2707 		break;
2708 	case CH_SWITCH_BACKGROUND_SCAN_STOP:
2709 		req.chan = chan->hw_value;
2710 		req.central_chan = ieee80211_frequency_to_channel(freq);
2711 		req.bw = mt76_connac_chan_bw(&mphy->chandef);
2712 		req.tx_stream = hweight8(mphy->antenna_mask);
2713 		req.rx_stream = mphy->antenna_mask;
2714 		break;
2715 	default:
2716 		return -EINVAL;
2717 	}
2718 	req.band = chandef ? chandef->chan->band == NL80211_BAND_5GHZ : 1;
2719 
2720 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(OFFCH_SCAN_CTRL),
2721 				 &req, sizeof(req), false);
2722 }
2723 
mt7915_mcu_rdd_background_enable(struct mt7915_phy * phy,struct cfg80211_chan_def * chandef)2724 int mt7915_mcu_rdd_background_enable(struct mt7915_phy *phy,
2725 				     struct cfg80211_chan_def *chandef)
2726 {
2727 	struct mt7915_dev *dev = phy->dev;
2728 	int err, region, rdd_idx;
2729 
2730 	rdd_idx = mt7915_get_rdd_idx(phy, true);
2731 	if (rdd_idx < 0)
2732 		return -EINVAL;
2733 
2734 	if (!chandef) { /* disable offchain */
2735 		err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_STOP, rdd_idx, 0, 0);
2736 		if (err)
2737 			return err;
2738 
2739 		return mt7915_mcu_background_chain_ctrl(phy, NULL,
2740 				CH_SWITCH_BACKGROUND_SCAN_STOP);
2741 	}
2742 
2743 	err = mt7915_mcu_background_chain_ctrl(phy, chandef,
2744 					       CH_SWITCH_BACKGROUND_SCAN_START);
2745 	if (err)
2746 		return err;
2747 
2748 	switch (dev->mt76.region) {
2749 	case NL80211_DFS_ETSI:
2750 		region = 0;
2751 		break;
2752 	case NL80211_DFS_JP:
2753 		region = 2;
2754 		break;
2755 	case NL80211_DFS_FCC:
2756 	default:
2757 		region = 1;
2758 		break;
2759 	}
2760 
2761 	return mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_START, rdd_idx, 0, region);
2762 }
2763 
mt7915_mcu_set_chan_info(struct mt7915_phy * phy,int cmd)2764 int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
2765 {
2766 	static const u8 ch_band[] = {
2767 		[NL80211_BAND_2GHZ] = 0,
2768 		[NL80211_BAND_5GHZ] = 1,
2769 		[NL80211_BAND_6GHZ] = 2,
2770 	};
2771 	struct mt7915_dev *dev = phy->dev;
2772 	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2773 	int freq1 = chandef->center_freq1;
2774 	u8 band = phy->mt76->band_idx;
2775 	struct {
2776 		u8 control_ch;
2777 		u8 center_ch;
2778 		u8 bw;
2779 		u8 tx_path_num;
2780 		u8 rx_path;	/* mask or num */
2781 		u8 switch_reason;
2782 		u8 band_idx;
2783 		u8 center_ch2;	/* for 80+80 only */
2784 		__le16 cac_case;
2785 		u8 channel_band;
2786 		u8 rsv0;
2787 		__le32 outband_freq;
2788 		u8 txpower_drop;
2789 		u8 ap_bw;
2790 		u8 ap_center_ch;
2791 		u8 rsv1[57];
2792 	} __packed req = {
2793 		.control_ch = chandef->chan->hw_value,
2794 		.center_ch = ieee80211_frequency_to_channel(freq1),
2795 		.bw = mt76_connac_chan_bw(chandef),
2796 		.tx_path_num = hweight16(phy->mt76->chainmask),
2797 		.rx_path = phy->mt76->chainmask >> (dev->chainshift * band),
2798 		.band_idx = band,
2799 		.channel_band = ch_band[chandef->chan->band],
2800 	};
2801 
2802 #ifdef CONFIG_NL80211_TESTMODE
2803 	if (phy->mt76->test.tx_antenna_mask &&
2804 	    mt76_testmode_enabled(phy->mt76)) {
2805 		req.tx_path_num = fls(phy->mt76->test.tx_antenna_mask);
2806 		req.rx_path = phy->mt76->test.tx_antenna_mask;
2807 	}
2808 #endif
2809 
2810 	if (mt76_connac_spe_idx(phy->mt76->antenna_mask))
2811 		req.tx_path_num = fls(phy->mt76->antenna_mask);
2812 
2813 	if (phy->mt76->hw->conf.flags & IEEE80211_CONF_MONITOR)
2814 		req.switch_reason = CH_SWITCH_NORMAL;
2815 	else if (phy->mt76->offchannel ||
2816 		 phy->mt76->hw->conf.flags & IEEE80211_CONF_IDLE)
2817 		req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
2818 	else if (!cfg80211_reg_can_beacon(phy->mt76->hw->wiphy, chandef,
2819 					  NL80211_IFTYPE_AP))
2820 		req.switch_reason = CH_SWITCH_DFS;
2821 	else
2822 		req.switch_reason = CH_SWITCH_NORMAL;
2823 
2824 	if (cmd == MCU_EXT_CMD(CHANNEL_SWITCH))
2825 		req.rx_path = hweight8(req.rx_path);
2826 
2827 	if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
2828 		int freq2 = chandef->center_freq2;
2829 
2830 		req.center_ch2 = ieee80211_frequency_to_channel(freq2);
2831 	}
2832 
2833 	return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
2834 }
2835 
mt7915_mcu_set_eeprom_flash(struct mt7915_dev * dev)2836 static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)
2837 {
2838 #define MAX_PAGE_IDX_MASK	GENMASK(7, 5)
2839 #define PAGE_IDX_MASK		GENMASK(4, 2)
2840 #define PER_PAGE_SIZE		0x400
2841 	struct mt7915_mcu_eeprom req = { .buffer_mode = EE_MODE_BUFFER };
2842 	u16 eeprom_size = mt7915_eeprom_size(dev);
2843 	u8 total = DIV_ROUND_UP(eeprom_size, PER_PAGE_SIZE);
2844 	u8 *eep = (u8 *)dev->mt76.eeprom.data;
2845 	int eep_len;
2846 	int i;
2847 
2848 	for (i = 0; i < total; i++, eep += eep_len) {
2849 		struct sk_buff *skb;
2850 		int ret;
2851 
2852 		if (i == total - 1 && !!(eeprom_size % PER_PAGE_SIZE))
2853 			eep_len = eeprom_size % PER_PAGE_SIZE;
2854 		else
2855 			eep_len = PER_PAGE_SIZE;
2856 
2857 		skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
2858 					 sizeof(req) + eep_len);
2859 		if (!skb)
2860 			return -ENOMEM;
2861 
2862 		req.format = FIELD_PREP(MAX_PAGE_IDX_MASK, total - 1) |
2863 			     FIELD_PREP(PAGE_IDX_MASK, i) | EE_FORMAT_WHOLE;
2864 		req.len = cpu_to_le16(eep_len);
2865 
2866 		skb_put_data(skb, &req, sizeof(req));
2867 		skb_put_data(skb, eep, eep_len);
2868 
2869 		ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
2870 					    MCU_EXT_CMD(EFUSE_BUFFER_MODE), true);
2871 		if (ret)
2872 			return ret;
2873 	}
2874 
2875 	return 0;
2876 }
2877 
mt7915_mcu_set_eeprom(struct mt7915_dev * dev)2878 int mt7915_mcu_set_eeprom(struct mt7915_dev *dev)
2879 {
2880 	struct mt7915_mcu_eeprom req = {
2881 		.buffer_mode = EE_MODE_EFUSE,
2882 		.format = EE_FORMAT_WHOLE,
2883 	};
2884 
2885 	if (dev->flash_mode)
2886 		return mt7915_mcu_set_eeprom_flash(dev);
2887 
2888 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EFUSE_BUFFER_MODE),
2889 				 &req, sizeof(req), true);
2890 }
2891 
mt7915_mcu_get_eeprom(struct mt7915_dev * dev,u32 offset,u8 * read_buf)2892 int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset, u8 *read_buf)
2893 {
2894 	struct mt7915_mcu_eeprom_info req = {
2895 		.addr = cpu_to_le32(round_down(offset,
2896 				    MT7915_EEPROM_BLOCK_SIZE)),
2897 	};
2898 	struct mt7915_mcu_eeprom_info *res;
2899 	struct sk_buff *skb;
2900 	u8 *buf = read_buf;
2901 	int ret;
2902 
2903 	ret = mt76_mcu_send_and_get_msg(&dev->mt76,
2904 					MCU_EXT_QUERY(EFUSE_ACCESS),
2905 					&req, sizeof(req), true, &skb);
2906 	if (ret)
2907 		return ret;
2908 
2909 	res = (struct mt7915_mcu_eeprom_info *)skb->data;
2910 	if (!buf)
2911 		buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
2912 	memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
2913 
2914 	dev_kfree_skb(skb);
2915 
2916 	return 0;
2917 }
2918 
mt7915_mcu_get_eeprom_free_block(struct mt7915_dev * dev,u8 * block_num)2919 int mt7915_mcu_get_eeprom_free_block(struct mt7915_dev *dev, u8 *block_num)
2920 {
2921 	struct {
2922 		u8 _rsv;
2923 		u8 version;
2924 		u8 die_idx;
2925 		u8 _rsv2;
2926 	} __packed req = {
2927 		.version = 1,
2928 	};
2929 	struct sk_buff *skb;
2930 	int ret;
2931 
2932 	ret = mt76_mcu_send_and_get_msg(&dev->mt76,
2933 					MCU_EXT_QUERY(EFUSE_FREE_BLOCK),
2934 					&req, sizeof(req), true, &skb);
2935 	if (ret)
2936 		return ret;
2937 
2938 	*block_num = *(u8 *)skb->data;
2939 	dev_kfree_skb(skb);
2940 
2941 	return 0;
2942 }
2943 
mt7915_mcu_set_pre_cal(struct mt7915_dev * dev,u8 idx,u8 * data,u32 len,int cmd)2944 static int mt7915_mcu_set_pre_cal(struct mt7915_dev *dev, u8 idx,
2945 				  u8 *data, u32 len, int cmd)
2946 {
2947 	struct {
2948 		u8 dir;
2949 		u8 valid;
2950 		__le16 bitmap;
2951 		s8 precal;
2952 		u8 action;
2953 		u8 band;
2954 		u8 idx;
2955 		u8 rsv[4];
2956 		__le32 len;
2957 	} req = {};
2958 	struct sk_buff *skb;
2959 
2960 	skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req) + len);
2961 	if (!skb)
2962 		return -ENOMEM;
2963 
2964 	req.idx = idx;
2965 	req.len = cpu_to_le32(len);
2966 	skb_put_data(skb, &req, sizeof(req));
2967 	skb_put_data(skb, data, len);
2968 
2969 	return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, false);
2970 }
2971 
mt7915_mcu_apply_group_cal(struct mt7915_dev * dev)2972 int mt7915_mcu_apply_group_cal(struct mt7915_dev *dev)
2973 {
2974 	u8 idx = 0, *cal = dev->cal, *eep = dev->mt76.eeprom.data;
2975 	u32 total = mt7915_get_cal_group_size(dev);
2976 	u32 offs = is_mt7915(&dev->mt76) ? MT_EE_DO_PRE_CAL : MT_EE_DO_PRE_CAL_V2;
2977 
2978 	if (!(eep[offs] & MT_EE_WIFI_CAL_GROUP))
2979 		return 0;
2980 
2981 	/*
2982 	 * Items: Rx DCOC, RSSI DCOC, Tx TSSI DCOC, Tx LPFG
2983 	 * Tx FDIQ, Tx DCIQ, Rx FDIQ, Rx FIIQ, ADCDCOC
2984 	 */
2985 	while (total > 0) {
2986 		int ret, len;
2987 
2988 		len = min_t(u32, total, MT_EE_CAL_UNIT);
2989 
2990 		ret = mt7915_mcu_set_pre_cal(dev, idx, cal, len,
2991 					     MCU_EXT_CMD(GROUP_PRE_CAL_INFO));
2992 		if (ret)
2993 			return ret;
2994 
2995 		total -= len;
2996 		cal += len;
2997 		idx++;
2998 	}
2999 
3000 	return 0;
3001 }
3002 
mt7915_find_freq_idx(const u16 * freqs,int n_freqs,u16 cur)3003 static int mt7915_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
3004 {
3005 	int i;
3006 
3007 	for (i = 0; i < n_freqs; i++)
3008 		if (cur == freqs[i])
3009 			return i;
3010 
3011 	return -1;
3012 }
3013 
mt7915_dpd_freq_idx(struct mt7915_dev * dev,u16 freq,u8 bw)3014 static int mt7915_dpd_freq_idx(struct mt7915_dev *dev, u16 freq, u8 bw)
3015 {
3016 	static const u16 freq_list_v1[] = {
3017 		5180, 5200, 5220, 5240,
3018 		5260, 5280, 5300, 5320,
3019 		5500, 5520, 5540, 5560,
3020 		5580, 5600, 5620, 5640,
3021 		5660, 5680, 5700, 5745,
3022 		5765, 5785, 5805, 5825
3023 	};
3024 	static const u16 freq_list_v2[] = {
3025 		/* 6G BW20*/
3026 		5955, 5975, 5995, 6015,
3027 		6035, 6055, 6075, 6095,
3028 		6115, 6135, 6155, 6175,
3029 		6195, 6215, 6235, 6255,
3030 		6275, 6295, 6315, 6335,
3031 		6355, 6375, 6395, 6415,
3032 		6435, 6455, 6475, 6495,
3033 		6515, 6535, 6555, 6575,
3034 		6595, 6615, 6635, 6655,
3035 		6675, 6695, 6715, 6735,
3036 		6755, 6775, 6795, 6815,
3037 		6835, 6855, 6875, 6895,
3038 		6915, 6935, 6955, 6975,
3039 		6995, 7015, 7035, 7055,
3040 		7075, 7095, 7115,
3041 		/* 6G BW160 */
3042 		6025, 6185, 6345, 6505,
3043 		6665, 6825, 6985,
3044 		/* 5G BW20 */
3045 		5180, 5200, 5220, 5240,
3046 		5260, 5280, 5300, 5320,
3047 		5500, 5520, 5540, 5560,
3048 		5580, 5600, 5620, 5640,
3049 		5660, 5680, 5700, 5720,
3050 		5745, 5765, 5785, 5805,
3051 		5825, 5845, 5865, 5885,
3052 		/* 5G BW160 */
3053 		5250, 5570, 5815
3054 	};
3055 	static const u16 freq_list_v2_7981[] = {
3056 		/* 5G BW20 */
3057 		5180, 5200, 5220, 5240,
3058 		5260, 5280, 5300, 5320,
3059 		5500, 5520, 5540, 5560,
3060 		5580, 5600, 5620, 5640,
3061 		5660, 5680, 5700, 5720,
3062 		5745, 5765, 5785, 5805,
3063 		5825, 5845, 5865, 5885,
3064 		/* 5G BW160 */
3065 		5250, 5570, 5815
3066 	};
3067 	const u16 *freq_list = freq_list_v1;
3068 	int n_freqs = ARRAY_SIZE(freq_list_v1);
3069 	int idx;
3070 
3071 	if (!is_mt7915(&dev->mt76)) {
3072 		if (is_mt7981(&dev->mt76)) {
3073 			freq_list = freq_list_v2_7981;
3074 			n_freqs = ARRAY_SIZE(freq_list_v2_7981);
3075 		} else {
3076 			freq_list = freq_list_v2;
3077 			n_freqs = ARRAY_SIZE(freq_list_v2);
3078 		}
3079 	}
3080 
3081 	if (freq < 4000) {
3082 		if (freq < 2432)
3083 			return n_freqs;
3084 		if (freq < 2457)
3085 			return n_freqs + 1;
3086 
3087 		return n_freqs + 2;
3088 	}
3089 
3090 	if (bw == NL80211_CHAN_WIDTH_80P80)
3091 		return -1;
3092 
3093 	if (bw != NL80211_CHAN_WIDTH_20) {
3094 		idx = mt7915_find_freq_idx(freq_list, n_freqs, freq + 10);
3095 		if (idx >= 0)
3096 			return idx;
3097 
3098 		idx = mt7915_find_freq_idx(freq_list, n_freqs, freq - 10);
3099 		if (idx >= 0)
3100 			return idx;
3101 	}
3102 
3103 	return mt7915_find_freq_idx(freq_list, n_freqs, freq);
3104 }
3105 
mt7915_mcu_apply_tx_dpd(struct mt7915_phy * phy)3106 int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy)
3107 {
3108 	struct mt7915_dev *dev = phy->dev;
3109 	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
3110 	enum nl80211_band band = chandef->chan->band;
3111 	u32 offs = is_mt7915(&dev->mt76) ? MT_EE_DO_PRE_CAL : MT_EE_DO_PRE_CAL_V2;
3112 	u16 center_freq = chandef->center_freq1;
3113 	u8 *cal = dev->cal, *eep = dev->mt76.eeprom.data;
3114 	u8 dpd_mask, cal_num = is_mt7915(&dev->mt76) ? 2 : 3;
3115 	int idx;
3116 
3117 	switch (band) {
3118 	case NL80211_BAND_2GHZ:
3119 		dpd_mask = MT_EE_WIFI_CAL_DPD_2G;
3120 		break;
3121 	case NL80211_BAND_5GHZ:
3122 		dpd_mask = MT_EE_WIFI_CAL_DPD_5G;
3123 		break;
3124 	case NL80211_BAND_6GHZ:
3125 		dpd_mask = MT_EE_WIFI_CAL_DPD_6G;
3126 		break;
3127 	default:
3128 		dpd_mask = 0;
3129 		break;
3130 	}
3131 
3132 	if (!(eep[offs] & dpd_mask))
3133 		return 0;
3134 
3135 	idx = mt7915_dpd_freq_idx(dev, center_freq, chandef->width);
3136 	if (idx < 0)
3137 		return -EINVAL;
3138 
3139 	/* Items: Tx DPD, Tx Flatness */
3140 	idx = idx * cal_num;
3141 	cal += mt7915_get_cal_group_size(dev) + (idx * MT_EE_CAL_UNIT);
3142 
3143 	while (cal_num--) {
3144 		int ret;
3145 
3146 		ret = mt7915_mcu_set_pre_cal(dev, idx, cal, MT_EE_CAL_UNIT,
3147 					     MCU_EXT_CMD(DPD_PRE_CAL_INFO));
3148 		if (ret)
3149 			return ret;
3150 
3151 		idx++;
3152 		cal += MT_EE_CAL_UNIT;
3153 	}
3154 
3155 	return 0;
3156 }
3157 
mt7915_mcu_get_chan_mib_info(struct mt7915_phy * phy,bool chan_switch)3158 int mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch)
3159 {
3160 	struct mt76_channel_state *state = phy->mt76->chan_state;
3161 	struct mt76_channel_state *state_ts = &phy->state_ts;
3162 	struct mt7915_dev *dev = phy->dev;
3163 	struct mt7915_mcu_mib *res, req[5];
3164 	struct sk_buff *skb;
3165 	static const u32 *offs;
3166 	int i, ret, len, offs_cc;
3167 	u64 cc_tx;
3168 
3169 	/* strict order */
3170 	if (is_mt7915(&dev->mt76)) {
3171 		static const u32 chip_offs[] = {
3172 			MIB_NON_WIFI_TIME,
3173 			MIB_TX_TIME,
3174 			MIB_RX_TIME,
3175 			MIB_OBSS_AIRTIME,
3176 			MIB_TXOP_INIT_COUNT,
3177 		};
3178 		len = ARRAY_SIZE(chip_offs);
3179 		offs = chip_offs;
3180 		offs_cc = 20;
3181 	} else {
3182 		static const u32 chip_offs[] = {
3183 			MIB_NON_WIFI_TIME_V2,
3184 			MIB_TX_TIME_V2,
3185 			MIB_RX_TIME_V2,
3186 			MIB_OBSS_AIRTIME_V2
3187 		};
3188 		len = ARRAY_SIZE(chip_offs);
3189 		offs = chip_offs;
3190 		offs_cc = 0;
3191 	}
3192 
3193 	for (i = 0; i < len; i++) {
3194 		req[i].band = cpu_to_le32(phy->mt76->band_idx);
3195 		req[i].offs = cpu_to_le32(offs[i]);
3196 	}
3197 
3198 	ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(GET_MIB_INFO),
3199 					req, len * sizeof(req[0]), true, &skb);
3200 	if (ret)
3201 		return ret;
3202 
3203 	res = (struct mt7915_mcu_mib *)(skb->data + offs_cc);
3204 
3205 #define __res_u64(s) le64_to_cpu(res[s].data)
3206 	/* subtract Tx backoff time from Tx duration for MT7915 */
3207 	if (is_mt7915(&dev->mt76)) {
3208 		u64 backoff = (__res_u64(4) & 0xffff) * 79;  /* 16us + 9us * 7 */
3209 		cc_tx = __res_u64(1) - backoff;
3210 	} else {
3211 		cc_tx = __res_u64(1);
3212 	}
3213 
3214 	if (chan_switch)
3215 		goto out;
3216 
3217 	state->cc_tx += cc_tx - state_ts->cc_tx;
3218 	state->cc_bss_rx += __res_u64(2) - state_ts->cc_bss_rx;
3219 	state->cc_rx += __res_u64(2) + __res_u64(3) - state_ts->cc_rx;
3220 	state->cc_busy += __res_u64(0) + cc_tx + __res_u64(2) + __res_u64(3) -
3221 			  state_ts->cc_busy;
3222 
3223 out:
3224 	state_ts->cc_tx = cc_tx;
3225 	state_ts->cc_bss_rx = __res_u64(2);
3226 	state_ts->cc_rx = __res_u64(2) + __res_u64(3);
3227 	state_ts->cc_busy = __res_u64(0) + cc_tx + __res_u64(2) + __res_u64(3);
3228 #undef __res_u64
3229 
3230 	dev_kfree_skb(skb);
3231 
3232 	return 0;
3233 }
3234 
mt7915_mcu_get_temperature(struct mt7915_phy * phy)3235 int mt7915_mcu_get_temperature(struct mt7915_phy *phy)
3236 {
3237 	struct mt7915_dev *dev = phy->dev;
3238 	struct {
3239 		u8 ctrl_id;
3240 		u8 action;
3241 		u8 band_idx;
3242 		u8 rsv[5];
3243 	} req = {
3244 		.ctrl_id = THERMAL_SENSOR_TEMP_QUERY,
3245 		.band_idx = phy->mt76->band_idx,
3246 	};
3247 
3248 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL), &req,
3249 				 sizeof(req), true);
3250 }
3251 
mt7915_mcu_set_thermal_throttling(struct mt7915_phy * phy,u8 state)3252 int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state)
3253 {
3254 	struct mt7915_dev *dev = phy->dev;
3255 	struct mt7915_mcu_thermal_ctrl req = {
3256 		.band_idx = phy->mt76->band_idx,
3257 		.ctrl_id = THERMAL_PROTECT_DUTY_CONFIG,
3258 	};
3259 	int level, ret;
3260 
3261 	/* set duty cycle and level */
3262 	for (level = 0; level < 4; level++) {
3263 		req.duty.duty_level = level;
3264 		req.duty.duty_cycle = state;
3265 		state /= 2;
3266 
3267 		ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3268 					&req, sizeof(req), false);
3269 		if (ret)
3270 			return ret;
3271 	}
3272 	return 0;
3273 }
3274 
mt7915_mcu_set_thermal_protect(struct mt7915_phy * phy)3275 int mt7915_mcu_set_thermal_protect(struct mt7915_phy *phy)
3276 {
3277 	struct mt7915_dev *dev = phy->dev;
3278 	struct {
3279 		struct mt7915_mcu_thermal_ctrl ctrl;
3280 
3281 		__le32 trigger_temp;
3282 		__le32 restore_temp;
3283 		__le16 sustain_time;
3284 		u8 rsv[2];
3285 	} __packed req = {
3286 		.ctrl = {
3287 			.band_idx = phy->mt76->band_idx,
3288 			.type.protect_type = 1,
3289 			.type.trigger_type = 1,
3290 		},
3291 	};
3292 	int ret;
3293 
3294 	req.ctrl.ctrl_id = THERMAL_PROTECT_DISABLE;
3295 	ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3296 				&req, sizeof(req.ctrl), false);
3297 
3298 	if (ret)
3299 		return ret;
3300 
3301 	/* set high-temperature trigger threshold */
3302 	req.ctrl.ctrl_id = THERMAL_PROTECT_ENABLE;
3303 	/* add a safety margin ~10 */
3304 	req.restore_temp = cpu_to_le32(phy->throttle_temp[0] - 10);
3305 	req.trigger_temp = cpu_to_le32(phy->throttle_temp[1]);
3306 	req.sustain_time = cpu_to_le16(10);
3307 
3308 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3309 				 &req, sizeof(req), false);
3310 }
3311 
mt7915_mcu_set_txpower_frame_min(struct mt7915_phy * phy,s8 txpower)3312 int mt7915_mcu_set_txpower_frame_min(struct mt7915_phy *phy, s8 txpower)
3313 {
3314 	struct mt7915_dev *dev = phy->dev;
3315 	struct {
3316 		u8 format_id;
3317 		u8 rsv;
3318 		u8 band_idx;
3319 		s8 txpower_min;
3320 	} __packed req = {
3321 		.format_id = TX_POWER_LIMIT_FRAME_MIN,
3322 		.band_idx = phy->mt76->band_idx,
3323 		.txpower_min = txpower * 2, /* 0.5db */
3324 	};
3325 
3326 	return mt76_mcu_send_msg(&dev->mt76,
3327 				 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3328 				 sizeof(req), true);
3329 }
3330 
mt7915_mcu_set_txpower_frame(struct mt7915_phy * phy,struct ieee80211_vif * vif,struct ieee80211_sta * sta,s8 txpower)3331 int mt7915_mcu_set_txpower_frame(struct mt7915_phy *phy,
3332 				 struct ieee80211_vif *vif,
3333 				 struct ieee80211_sta *sta, s8 txpower)
3334 {
3335 	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
3336 	struct mt7915_dev *dev = phy->dev;
3337 	struct mt76_phy *mphy = phy->mt76;
3338 	struct {
3339 		u8 format_id;
3340 		u8 rsv[3];
3341 		u8 band_idx;
3342 		s8 txpower_max;
3343 		__le16 wcid;
3344 		s8 txpower_offs[48];
3345 	} __packed req = {
3346 		.format_id = TX_POWER_LIMIT_FRAME,
3347 		.band_idx = phy->mt76->band_idx,
3348 		.txpower_max = DIV_ROUND_UP(mphy->txpower_cur, 2),
3349 		.wcid = cpu_to_le16(msta->wcid.idx),
3350 	};
3351 	int ret;
3352 	s8 txpower_sku[MT7915_SKU_RATE_NUM];
3353 
3354 	ret = mt7915_mcu_get_txpower_sku(phy, txpower_sku, sizeof(txpower_sku));
3355 	if (ret)
3356 		return ret;
3357 
3358 	txpower = mt76_get_power_bound(mphy, txpower);
3359 	if (txpower > mphy->txpower_cur || txpower < 0)
3360 		return -EINVAL;
3361 
3362 	if (txpower) {
3363 		u32 offs, len, i;
3364 
3365 		if (sta->deflink.ht_cap.ht_supported) {
3366 			const u8 *sku_len = mt7915_sku_group_len;
3367 
3368 			offs = sku_len[SKU_CCK] + sku_len[SKU_OFDM];
3369 			len = sku_len[SKU_HT_BW20] + sku_len[SKU_HT_BW40];
3370 
3371 			if (sta->deflink.vht_cap.vht_supported) {
3372 				offs += len;
3373 				len = sku_len[SKU_VHT_BW20] * 4;
3374 
3375 				if (sta->deflink.he_cap.has_he) {
3376 					offs += len + sku_len[SKU_HE_RU26] * 3;
3377 					len = sku_len[SKU_HE_RU242] * 4;
3378 				}
3379 			}
3380 		} else {
3381 			return -EINVAL;
3382 		}
3383 
3384 		for (i = 0; i < len; i++, offs++)
3385 			req.txpower_offs[i] =
3386 				DIV_ROUND_UP(txpower - txpower_sku[offs], 2);
3387 	}
3388 
3389 	return mt76_mcu_send_msg(&dev->mt76,
3390 				 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3391 				 sizeof(req), true);
3392 }
3393 
mt7915_mcu_set_txpower_sku(struct mt7915_phy * phy)3394 int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
3395 {
3396 	struct mt7915_dev *dev = phy->dev;
3397 	struct mt76_phy *mphy = phy->mt76;
3398 	struct ieee80211_hw *hw = mphy->hw;
3399 	struct mt7915_mcu_txpower_sku req = {
3400 		.format_id = TX_POWER_LIMIT_TABLE,
3401 		.band_idx = phy->mt76->band_idx,
3402 	};
3403 	struct mt76_power_limits limits_array;
3404 	s8 *la = (s8 *)&limits_array;
3405 	int i, idx;
3406 	int tx_power;
3407 
3408 	tx_power = mt76_get_power_bound(mphy, hw->conf.power_level);
3409 	tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
3410 					      &limits_array, tx_power);
3411 	mphy->txpower_cur = tx_power;
3412 
3413 	for (i = 0, idx = 0; i < ARRAY_SIZE(mt7915_sku_group_len); i++) {
3414 		u8 mcs_num, len = mt7915_sku_group_len[i];
3415 		int j;
3416 
3417 		if (i >= SKU_HT_BW20 && i <= SKU_VHT_BW160) {
3418 			mcs_num = 10;
3419 
3420 			if (i == SKU_HT_BW20 || i == SKU_VHT_BW20)
3421 				la = (s8 *)&limits_array + 12;
3422 		} else {
3423 			mcs_num = len;
3424 		}
3425 
3426 		for (j = 0; j < min_t(u8, mcs_num, len); j++)
3427 			req.txpower_sku[idx + j] = la[j];
3428 
3429 		la += mcs_num;
3430 		idx += len;
3431 	}
3432 
3433 	return mt76_mcu_send_msg(&dev->mt76,
3434 				 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3435 				 sizeof(req), true);
3436 }
3437 
mt7915_mcu_get_txpower_sku(struct mt7915_phy * phy,s8 * txpower,int len)3438 int mt7915_mcu_get_txpower_sku(struct mt7915_phy *phy, s8 *txpower, int len)
3439 {
3440 #define RATE_POWER_INFO	2
3441 	struct mt7915_dev *dev = phy->dev;
3442 	struct {
3443 		u8 format_id;
3444 		u8 category;
3445 		u8 band_idx;
3446 		u8 _rsv;
3447 	} __packed req = {
3448 		.format_id = TX_POWER_LIMIT_INFO,
3449 		.category = RATE_POWER_INFO,
3450 		.band_idx = phy->mt76->band_idx,
3451 	};
3452 	s8 txpower_sku[MT7915_SKU_RATE_NUM][2];
3453 	struct sk_buff *skb;
3454 	int ret, i;
3455 
3456 	ret = mt76_mcu_send_and_get_msg(&dev->mt76,
3457 					MCU_EXT_CMD(TX_POWER_FEATURE_CTRL),
3458 					&req, sizeof(req), true, &skb);
3459 	if (ret)
3460 		return ret;
3461 
3462 	memcpy(txpower_sku, skb->data + 4, sizeof(txpower_sku));
3463 	for (i = 0; i < len; i++)
3464 		txpower[i] = txpower_sku[i][req.band_idx];
3465 
3466 	dev_kfree_skb(skb);
3467 
3468 	return 0;
3469 }
3470 
mt7915_mcu_set_test_param(struct mt7915_dev * dev,u8 param,bool test_mode,u8 en)3471 int mt7915_mcu_set_test_param(struct mt7915_dev *dev, u8 param, bool test_mode,
3472 			      u8 en)
3473 {
3474 	struct {
3475 		u8 test_mode_en;
3476 		u8 param_idx;
3477 		u8 _rsv[2];
3478 
3479 		u8 enable;
3480 		u8 _rsv2[3];
3481 
3482 		u8 pad[8];
3483 	} __packed req = {
3484 		.test_mode_en = test_mode,
3485 		.param_idx = param,
3486 		.enable = en,
3487 	};
3488 
3489 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL), &req,
3490 				 sizeof(req), false);
3491 }
3492 
mt7915_mcu_set_sku_en(struct mt7915_phy * phy,bool enable)3493 int mt7915_mcu_set_sku_en(struct mt7915_phy *phy, bool enable)
3494 {
3495 	struct mt7915_dev *dev = phy->dev;
3496 	struct mt7915_sku {
3497 		u8 format_id;
3498 		u8 sku_enable;
3499 		u8 band_idx;
3500 		u8 rsv;
3501 	} __packed req = {
3502 		.format_id = TX_POWER_LIMIT_ENABLE,
3503 		.band_idx = phy->mt76->band_idx,
3504 		.sku_enable = enable,
3505 	};
3506 
3507 	return mt76_mcu_send_msg(&dev->mt76,
3508 				 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3509 				 sizeof(req), true);
3510 }
3511 
mt7915_mcu_set_ser(struct mt7915_dev * dev,u8 action,u8 set,u8 band)3512 int mt7915_mcu_set_ser(struct mt7915_dev *dev, u8 action, u8 set, u8 band)
3513 {
3514 	struct {
3515 		u8 action;
3516 		u8 set;
3517 		u8 band;
3518 		u8 rsv;
3519 	} req = {
3520 		.action = action,
3521 		.set = set,
3522 		.band = band,
3523 	};
3524 
3525 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SER_TRIGGER),
3526 				 &req, sizeof(req), false);
3527 }
3528 
mt7915_mcu_set_txbf(struct mt7915_dev * dev,u8 action)3529 int mt7915_mcu_set_txbf(struct mt7915_dev *dev, u8 action)
3530 {
3531 	struct {
3532 		u8 action;
3533 		union {
3534 			struct {
3535 				u8 snd_mode;
3536 				u8 sta_num;
3537 				u8 rsv;
3538 				u8 wlan_idx[4];
3539 				__le32 snd_period;	/* ms */
3540 			} __packed snd;
3541 			struct {
3542 				bool ebf;
3543 				bool ibf;
3544 				u8 rsv;
3545 			} __packed type;
3546 			struct {
3547 				u8 bf_num;
3548 				u8 bf_bitmap;
3549 				u8 bf_sel[8];
3550 				u8 rsv[5];
3551 			} __packed mod;
3552 		};
3553 	} __packed req = {
3554 		.action = action,
3555 	};
3556 
3557 #define MT_BF_PROCESSING	4
3558 	switch (action) {
3559 	case MT_BF_SOUNDING_ON:
3560 		req.snd.snd_mode = MT_BF_PROCESSING;
3561 		break;
3562 	case MT_BF_TYPE_UPDATE:
3563 		req.type.ebf = true;
3564 		req.type.ibf = dev->ibf;
3565 		break;
3566 	case MT_BF_MODULE_UPDATE:
3567 		req.mod.bf_num = 2;
3568 		req.mod.bf_bitmap = GENMASK(1, 0);
3569 		break;
3570 	default:
3571 		return -EINVAL;
3572 	}
3573 
3574 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
3575 				 sizeof(req), true);
3576 }
3577 
3578 static int
mt7915_mcu_enable_obss_spr(struct mt7915_phy * phy,u8 action,u8 val)3579 mt7915_mcu_enable_obss_spr(struct mt7915_phy *phy, u8 action, u8 val)
3580 {
3581 	struct mt7915_dev *dev = phy->dev;
3582 	struct mt7915_mcu_sr_ctrl req = {
3583 		.action = action,
3584 		.argnum = 1,
3585 		.band_idx = phy->mt76->band_idx,
3586 		.val = cpu_to_le32(val),
3587 	};
3588 
3589 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SPR), &req,
3590 				 sizeof(req), true);
3591 }
3592 
3593 static int
mt7915_mcu_set_obss_spr_pd(struct mt7915_phy * phy,struct ieee80211_he_obss_pd * he_obss_pd)3594 mt7915_mcu_set_obss_spr_pd(struct mt7915_phy *phy,
3595 			   struct ieee80211_he_obss_pd *he_obss_pd)
3596 {
3597 	struct mt7915_dev *dev = phy->dev;
3598 	struct {
3599 		struct mt7915_mcu_sr_ctrl ctrl;
3600 		struct {
3601 			u8 pd_th_non_srg;
3602 			u8 pd_th_srg;
3603 			u8 period_offs;
3604 			u8 rcpi_src;
3605 			__le16 obss_pd_min;
3606 			__le16 obss_pd_min_srg;
3607 			u8 resp_txpwr_mode;
3608 			u8 txpwr_restrict_mode;
3609 			u8 txpwr_ref;
3610 			u8 rsv[3];
3611 		} __packed param;
3612 	} __packed req = {
3613 		.ctrl = {
3614 			.action = SPR_SET_PARAM,
3615 			.argnum = 9,
3616 			.band_idx = phy->mt76->band_idx,
3617 		},
3618 	};
3619 	int ret;
3620 	u8 max_th = 82, non_srg_max_th = 62;
3621 
3622 	/* disable firmware dynamical PD asjustment */
3623 	ret = mt7915_mcu_enable_obss_spr(phy, SPR_ENABLE_DPD, false);
3624 	if (ret)
3625 		return ret;
3626 
3627 	if (he_obss_pd->sr_ctrl &
3628 	    IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED)
3629 		req.param.pd_th_non_srg = max_th;
3630 	else if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
3631 		req.param.pd_th_non_srg  = max_th - he_obss_pd->non_srg_max_offset;
3632 	else
3633 		req.param.pd_th_non_srg  = non_srg_max_th;
3634 
3635 	if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT)
3636 		req.param.pd_th_srg = max_th - he_obss_pd->max_offset;
3637 
3638 	req.param.obss_pd_min = cpu_to_le16(82);
3639 	req.param.obss_pd_min_srg = cpu_to_le16(82);
3640 	req.param.txpwr_restrict_mode = 2;
3641 	req.param.txpwr_ref = 21;
3642 
3643 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SPR), &req,
3644 				 sizeof(req), true);
3645 }
3646 
3647 static int
mt7915_mcu_set_obss_spr_siga(struct mt7915_phy * phy,struct ieee80211_vif * vif,struct ieee80211_he_obss_pd * he_obss_pd)3648 mt7915_mcu_set_obss_spr_siga(struct mt7915_phy *phy, struct ieee80211_vif *vif,
3649 			     struct ieee80211_he_obss_pd *he_obss_pd)
3650 {
3651 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3652 	struct mt7915_dev *dev = phy->dev;
3653 	u8 omac = mvif->mt76.omac_idx;
3654 	struct {
3655 		struct mt7915_mcu_sr_ctrl ctrl;
3656 		struct {
3657 			u8 omac;
3658 			u8 rsv[3];
3659 			u8 flag[20];
3660 		} __packed siga;
3661 	} __packed req = {
3662 		.ctrl = {
3663 			.action = SPR_SET_SIGA,
3664 			.argnum = 1,
3665 			.band_idx = phy->mt76->band_idx,
3666 		},
3667 		.siga = {
3668 			.omac = omac > HW_BSSID_MAX ? omac - 12 : omac,
3669 		},
3670 	};
3671 	int ret;
3672 
3673 	if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED)
3674 		req.siga.flag[req.siga.omac] = 0xf;
3675 	else
3676 		return 0;
3677 
3678 	/* switch to normal AP mode */
3679 	ret = mt7915_mcu_enable_obss_spr(phy, SPR_ENABLE_MODE, 0);
3680 	if (ret)
3681 		return ret;
3682 
3683 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SPR), &req,
3684 				 sizeof(req), true);
3685 }
3686 
3687 static int
mt7915_mcu_set_obss_spr_bitmap(struct mt7915_phy * phy,struct ieee80211_he_obss_pd * he_obss_pd)3688 mt7915_mcu_set_obss_spr_bitmap(struct mt7915_phy *phy,
3689 			       struct ieee80211_he_obss_pd *he_obss_pd)
3690 {
3691 	struct mt7915_dev *dev = phy->dev;
3692 	struct {
3693 		struct mt7915_mcu_sr_ctrl ctrl;
3694 		struct {
3695 			__le32 color_l[2];
3696 			__le32 color_h[2];
3697 			__le32 bssid_l[2];
3698 			__le32 bssid_h[2];
3699 		} __packed bitmap;
3700 	} __packed req = {
3701 		.ctrl = {
3702 			.action = SPR_SET_SRG_BITMAP,
3703 			.argnum = 4,
3704 			.band_idx = phy->mt76->band_idx,
3705 		},
3706 	};
3707 	u32 bitmap;
3708 
3709 	memcpy(&bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
3710 	req.bitmap.color_l[req.ctrl.band_idx] = cpu_to_le32(bitmap);
3711 
3712 	memcpy(&bitmap, he_obss_pd->bss_color_bitmap + 4, sizeof(bitmap));
3713 	req.bitmap.color_h[req.ctrl.band_idx] = cpu_to_le32(bitmap);
3714 
3715 	memcpy(&bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
3716 	req.bitmap.bssid_l[req.ctrl.band_idx] = cpu_to_le32(bitmap);
3717 
3718 	memcpy(&bitmap, he_obss_pd->partial_bssid_bitmap + 4, sizeof(bitmap));
3719 	req.bitmap.bssid_h[req.ctrl.band_idx] = cpu_to_le32(bitmap);
3720 
3721 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SPR), &req,
3722 				 sizeof(req), true);
3723 }
3724 
mt7915_mcu_add_obss_spr(struct mt7915_phy * phy,struct ieee80211_vif * vif,struct ieee80211_he_obss_pd * he_obss_pd)3725 int mt7915_mcu_add_obss_spr(struct mt7915_phy *phy, struct ieee80211_vif *vif,
3726 			    struct ieee80211_he_obss_pd *he_obss_pd)
3727 {
3728 	int ret;
3729 
3730 	/* enable firmware scene detection algorithms */
3731 	ret = mt7915_mcu_enable_obss_spr(phy, SPR_ENABLE_SD, sr_scene_detect);
3732 	if (ret)
3733 		return ret;
3734 
3735 	/* firmware dynamically adjusts PD threshold so skip manual control */
3736 	if (sr_scene_detect && !he_obss_pd->enable)
3737 		return 0;
3738 
3739 	/* enable spatial reuse */
3740 	ret = mt7915_mcu_enable_obss_spr(phy, SPR_ENABLE, he_obss_pd->enable);
3741 	if (ret)
3742 		return ret;
3743 
3744 	if (sr_scene_detect || !he_obss_pd->enable)
3745 		return 0;
3746 
3747 	ret = mt7915_mcu_enable_obss_spr(phy, SPR_ENABLE_TX, true);
3748 	if (ret)
3749 		return ret;
3750 
3751 	/* set SRG/non-SRG OBSS PD threshold */
3752 	ret = mt7915_mcu_set_obss_spr_pd(phy, he_obss_pd);
3753 	if (ret)
3754 		return ret;
3755 
3756 	/* Set SR prohibit */
3757 	ret = mt7915_mcu_set_obss_spr_siga(phy, vif, he_obss_pd);
3758 	if (ret)
3759 		return ret;
3760 
3761 	/* set SRG BSS color/BSSID bitmap */
3762 	return mt7915_mcu_set_obss_spr_bitmap(phy, he_obss_pd);
3763 }
3764 
mt7915_mcu_get_rx_rate(struct mt7915_phy * phy,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct rate_info * rate)3765 int mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif,
3766 			   struct ieee80211_sta *sta, struct rate_info *rate)
3767 {
3768 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3769 	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
3770 	struct mt7915_dev *dev = phy->dev;
3771 	struct mt76_phy *mphy = phy->mt76;
3772 	struct {
3773 		u8 category;
3774 		u8 band;
3775 		__le16 wcid;
3776 	} __packed req = {
3777 		.category = MCU_PHY_STATE_CONTENTION_RX_RATE,
3778 		.band = mvif->mt76.band_idx,
3779 		.wcid = cpu_to_le16(msta->wcid.idx),
3780 	};
3781 	struct ieee80211_supported_band *sband;
3782 	struct mt7915_mcu_phy_rx_info *res;
3783 	struct sk_buff *skb;
3784 	int ret;
3785 	bool cck = false;
3786 
3787 	ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(PHY_STAT_INFO),
3788 					&req, sizeof(req), true, &skb);
3789 	if (ret)
3790 		return ret;
3791 
3792 	res = (struct mt7915_mcu_phy_rx_info *)skb->data;
3793 
3794 	rate->mcs = res->rate;
3795 	rate->nss = res->nsts + 1;
3796 
3797 	switch (res->mode) {
3798 	case MT_PHY_TYPE_CCK:
3799 		cck = true;
3800 		fallthrough;
3801 	case MT_PHY_TYPE_OFDM:
3802 		if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)
3803 			sband = &mphy->sband_5g.sband;
3804 		else if (mphy->chandef.chan->band == NL80211_BAND_6GHZ)
3805 			sband = &mphy->sband_6g.sband;
3806 		else
3807 			sband = &mphy->sband_2g.sband;
3808 
3809 		rate->mcs = mt76_get_rate(&dev->mt76, sband, rate->mcs, cck);
3810 		rate->legacy = sband->bitrates[rate->mcs].bitrate;
3811 		break;
3812 	case MT_PHY_TYPE_HT:
3813 	case MT_PHY_TYPE_HT_GF:
3814 		if (rate->mcs > 31) {
3815 			ret = -EINVAL;
3816 			goto out;
3817 		}
3818 
3819 		rate->flags = RATE_INFO_FLAGS_MCS;
3820 		if (res->gi)
3821 			rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
3822 		break;
3823 	case MT_PHY_TYPE_VHT:
3824 		if (rate->mcs > 9) {
3825 			ret = -EINVAL;
3826 			goto out;
3827 		}
3828 
3829 		rate->flags = RATE_INFO_FLAGS_VHT_MCS;
3830 		if (res->gi)
3831 			rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
3832 		break;
3833 	case MT_PHY_TYPE_HE_SU:
3834 	case MT_PHY_TYPE_HE_EXT_SU:
3835 	case MT_PHY_TYPE_HE_TB:
3836 	case MT_PHY_TYPE_HE_MU:
3837 		if (res->gi > NL80211_RATE_INFO_HE_GI_3_2 || rate->mcs > 11) {
3838 			ret = -EINVAL;
3839 			goto out;
3840 		}
3841 		rate->he_gi = res->gi;
3842 		rate->flags = RATE_INFO_FLAGS_HE_MCS;
3843 		break;
3844 	default:
3845 		ret = -EINVAL;
3846 		goto out;
3847 	}
3848 
3849 	switch (res->bw) {
3850 	case IEEE80211_STA_RX_BW_160:
3851 		rate->bw = RATE_INFO_BW_160;
3852 		break;
3853 	case IEEE80211_STA_RX_BW_80:
3854 		rate->bw = RATE_INFO_BW_80;
3855 		break;
3856 	case IEEE80211_STA_RX_BW_40:
3857 		rate->bw = RATE_INFO_BW_40;
3858 		break;
3859 	default:
3860 		rate->bw = RATE_INFO_BW_20;
3861 		break;
3862 	}
3863 
3864 out:
3865 	dev_kfree_skb(skb);
3866 
3867 	return ret;
3868 }
3869 
mt7915_mcu_update_bss_color(struct mt7915_dev * dev,struct ieee80211_vif * vif,struct cfg80211_he_bss_color * he_bss_color)3870 int mt7915_mcu_update_bss_color(struct mt7915_dev *dev, struct ieee80211_vif *vif,
3871 				struct cfg80211_he_bss_color *he_bss_color)
3872 {
3873 	int len = sizeof(struct sta_req_hdr) + sizeof(struct bss_info_color);
3874 	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3875 	struct bss_info_color *bss_color;
3876 	struct sk_buff *skb;
3877 	struct tlv *tlv;
3878 
3879 	skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
3880 					      NULL, len);
3881 	if (IS_ERR(skb))
3882 		return PTR_ERR(skb);
3883 
3884 	tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BSS_COLOR,
3885 				      sizeof(*bss_color));
3886 	bss_color = (struct bss_info_color *)tlv;
3887 	bss_color->disable = !he_bss_color->enabled;
3888 	bss_color->color = he_bss_color->color;
3889 
3890 	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
3891 				     MCU_EXT_CMD(BSS_INFO_UPDATE), true);
3892 }
3893 
3894 #define TWT_AGRT_TRIGGER	BIT(0)
3895 #define TWT_AGRT_ANNOUNCE	BIT(1)
3896 #define TWT_AGRT_PROTECT	BIT(2)
3897 
mt7915_mcu_twt_agrt_update(struct mt7915_dev * dev,struct mt7915_vif * mvif,struct mt7915_twt_flow * flow,int cmd)3898 int mt7915_mcu_twt_agrt_update(struct mt7915_dev *dev,
3899 			       struct mt7915_vif *mvif,
3900 			       struct mt7915_twt_flow *flow,
3901 			       int cmd)
3902 {
3903 	struct {
3904 		u8 tbl_idx;
3905 		u8 cmd;
3906 		u8 own_mac_idx;
3907 		u8 flowid; /* 0xff for group id */
3908 		__le16 peer_id; /* specify the peer_id (msb=0)
3909 				 * or group_id (msb=1)
3910 				 */
3911 		u8 duration; /* 256 us */
3912 		u8 bss_idx;
3913 		__le64 start_tsf;
3914 		__le16 mantissa;
3915 		u8 exponent;
3916 		u8 is_ap;
3917 		u8 agrt_params;
3918 		u8 rsv[23];
3919 	} __packed req = {
3920 		.tbl_idx = flow->table_id,
3921 		.cmd = cmd,
3922 		.own_mac_idx = mvif->mt76.omac_idx,
3923 		.flowid = flow->id,
3924 		.peer_id = cpu_to_le16(flow->wcid),
3925 		.duration = flow->duration,
3926 		.bss_idx = mvif->mt76.idx,
3927 		.start_tsf = cpu_to_le64(flow->tsf),
3928 		.mantissa = flow->mantissa,
3929 		.exponent = flow->exp,
3930 		.is_ap = true,
3931 	};
3932 
3933 	if (flow->protection)
3934 		req.agrt_params |= TWT_AGRT_PROTECT;
3935 	if (!flow->flowtype)
3936 		req.agrt_params |= TWT_AGRT_ANNOUNCE;
3937 	if (flow->trigger)
3938 		req.agrt_params |= TWT_AGRT_TRIGGER;
3939 
3940 	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TWT_AGRT_UPDATE),
3941 				 &req, sizeof(req), true);
3942 }
3943 
mt7915_mcu_wed_wa_tx_stats(struct mt7915_dev * dev,u16 wlan_idx)3944 int mt7915_mcu_wed_wa_tx_stats(struct mt7915_dev *dev, u16 wlan_idx)
3945 {
3946 	struct {
3947 		__le32 cmd;
3948 		__le32 arg0;
3949 		__le32 arg1;
3950 		__le16 arg2;
3951 	} __packed req = {
3952 		.cmd = cpu_to_le32(0x15),
3953 	};
3954 	struct mt7915_mcu_wa_tx_stat {
3955 		__le16 wcid;
3956 		u8 __rsv2[2];
3957 
3958 		/* tx_bytes is deprecated since WA byte counter uses u32,
3959 		 * which easily leads to overflow.
3960 		 */
3961 		__le32 tx_bytes;
3962 		__le32 tx_packets;
3963 	} __packed *res;
3964 	struct mt76_wcid *wcid;
3965 	struct sk_buff *skb;
3966 	int ret, len;
3967 	u16 ret_wcid;
3968 
3969 	if (is_mt7915(&dev->mt76)) {
3970 		req.arg0 = cpu_to_le32(wlan_idx);
3971 		len = sizeof(req) - sizeof(req.arg2);
3972 	} else {
3973 		req.arg0 = cpu_to_le32(1);
3974 		req.arg2 = cpu_to_le16(wlan_idx);
3975 		len = sizeof(req);
3976 	}
3977 
3978 	ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_WA_PARAM_CMD(QUERY),
3979 					&req, len, true, &skb);
3980 	if (ret)
3981 		return ret;
3982 
3983 	if (!is_mt7915(&dev->mt76))
3984 		skb_pull(skb, 4);
3985 
3986 	res = (struct mt7915_mcu_wa_tx_stat *)skb->data;
3987 
3988 	ret_wcid = le16_to_cpu(res->wcid);
3989 	if (is_mt7915(&dev->mt76))
3990 		ret_wcid &= 0xff;
3991 
3992 	if (ret_wcid != wlan_idx) {
3993 		ret = -EINVAL;
3994 		goto out;
3995 	}
3996 
3997 	rcu_read_lock();
3998 
3999 	wcid = mt76_wcid_ptr(dev, wlan_idx);
4000 	if (wcid)
4001 		wcid->stats.tx_packets += le32_to_cpu(res->tx_packets);
4002 	else
4003 		ret = -EINVAL;
4004 
4005 	rcu_read_unlock();
4006 out:
4007 	dev_kfree_skb(skb);
4008 
4009 	return ret;
4010 }
4011 
mt7915_mcu_rf_regval(struct mt7915_dev * dev,u32 regidx,u32 * val,bool set)4012 int mt7915_mcu_rf_regval(struct mt7915_dev *dev, u32 regidx, u32 *val, bool set)
4013 {
4014 	struct {
4015 		__le32 idx;
4016 		__le32 ofs;
4017 		__le32 data;
4018 	} __packed req = {
4019 		.idx = cpu_to_le32(u32_get_bits(regidx, GENMASK(31, 24))),
4020 		.ofs = cpu_to_le32(u32_get_bits(regidx, GENMASK(23, 0))),
4021 		.data = set ? cpu_to_le32(*val) : 0,
4022 	};
4023 	struct sk_buff *skb;
4024 	int ret;
4025 
4026 	if (set)
4027 		return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RF_REG_ACCESS),
4028 					 &req, sizeof(req), false);
4029 
4030 	ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(RF_REG_ACCESS),
4031 					&req, sizeof(req), true, &skb);
4032 	if (ret)
4033 		return ret;
4034 
4035 	*val = le32_to_cpu(*(__le32 *)(skb->data + 8));
4036 	dev_kfree_skb(skb);
4037 
4038 	return 0;
4039 }
4040