wifi: mt76: mt7921: move connac nic capability handling to mt7921
[linux-2.6-microblaze.git] / drivers / net / wireless / mediatek / mt76 / mt7921 / mcu.c
1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2020 MediaTek Inc. */
3
4 #include <linux/fs.h>
5 #include <linux/firmware.h>
6 #include "mt7921.h"
7 #include "mcu.h"
8 #include "../mt76_connac2_mac.h"
9 #include "../mt792x_trace.h"
10
11 #define MT_STA_BFER                     BIT(0)
12 #define MT_STA_BFEE                     BIT(1)
13
14 static bool mt7921_disable_clc;
15 module_param_named(disable_clc, mt7921_disable_clc, bool, 0644);
16 MODULE_PARM_DESC(disable_clc, "disable CLC support");
17
18 int mt7921_mcu_parse_response(struct mt76_dev *mdev, int cmd,
19                               struct sk_buff *skb, int seq)
20 {
21         int mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
22         struct mt76_connac2_mcu_rxd *rxd;
23         int ret = 0;
24
25         if (!skb) {
26                 dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
27                         cmd, seq);
28                 mt792x_reset(mdev);
29
30                 return -ETIMEDOUT;
31         }
32
33         rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
34         if (seq != rxd->seq)
35                 return -EAGAIN;
36
37         if (cmd == MCU_CMD(PATCH_SEM_CONTROL) ||
38             cmd == MCU_CMD(PATCH_FINISH_REQ)) {
39                 skb_pull(skb, sizeof(*rxd) - 4);
40                 ret = *skb->data;
41         } else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
42                 skb_pull(skb, sizeof(*rxd) + 4);
43                 ret = le32_to_cpu(*(__le32 *)skb->data);
44         } else if (cmd == MCU_UNI_CMD(DEV_INFO_UPDATE) ||
45                    cmd == MCU_UNI_CMD(BSS_INFO_UPDATE) ||
46                    cmd == MCU_UNI_CMD(STA_REC_UPDATE) ||
47                    cmd == MCU_UNI_CMD(HIF_CTRL) ||
48                    cmd == MCU_UNI_CMD(OFFLOAD) ||
49                    cmd == MCU_UNI_CMD(SUSPEND)) {
50                 struct mt76_connac_mcu_uni_event *event;
51
52                 skb_pull(skb, sizeof(*rxd));
53                 event = (struct mt76_connac_mcu_uni_event *)skb->data;
54                 ret = le32_to_cpu(event->status);
55                 /* skip invalid event */
56                 if (mcu_cmd != event->cid)
57                         ret = -EAGAIN;
58         } else if (cmd == MCU_CE_QUERY(REG_READ)) {
59                 struct mt76_connac_mcu_reg_event *event;
60
61                 skb_pull(skb, sizeof(*rxd));
62                 event = (struct mt76_connac_mcu_reg_event *)skb->data;
63                 ret = (int)le32_to_cpu(event->val);
64         } else {
65                 skb_pull(skb, sizeof(struct mt76_connac2_mcu_rxd));
66         }
67
68         return ret;
69 }
70 EXPORT_SYMBOL_GPL(mt7921_mcu_parse_response);
71
72 static int mt7921_mcu_read_eeprom(struct mt792x_dev *dev, u32 offset, u8 *val)
73 {
74         struct mt7921_mcu_eeprom_info *res, req = {
75                 .addr = cpu_to_le32(round_down(offset,
76                                     MT7921_EEPROM_BLOCK_SIZE)),
77         };
78         struct sk_buff *skb;
79         int ret;
80
81         ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(EFUSE_ACCESS),
82                                         &req, sizeof(req), true, &skb);
83         if (ret)
84                 return ret;
85
86         res = (struct mt7921_mcu_eeprom_info *)skb->data;
87         *val = res->data[offset % MT7921_EEPROM_BLOCK_SIZE];
88         dev_kfree_skb(skb);
89
90         return 0;
91 }
92
93 #ifdef CONFIG_PM
94
95 static int
96 mt7921_mcu_set_ipv6_ns_filter(struct mt76_dev *dev,
97                               struct ieee80211_vif *vif, bool suspend)
98 {
99         struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
100         struct {
101                 struct {
102                         u8 bss_idx;
103                         u8 pad[3];
104                 } __packed hdr;
105                 struct mt76_connac_arpns_tlv arpns;
106         } req = {
107                 .hdr = {
108                         .bss_idx = mvif->mt76.idx,
109                 },
110                 .arpns = {
111                         .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ND),
112                         .len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
113                         .mode = suspend,
114                 },
115         };
116
117         return mt76_mcu_send_msg(dev, MCU_UNI_CMD_OFFLOAD, &req, sizeof(req),
118                                  true);
119 }
120
121 void mt7921_mcu_set_suspend_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
122 {
123         if (IS_ENABLED(CONFIG_IPV6)) {
124                 struct mt76_phy *phy = priv;
125
126                 mt7921_mcu_set_ipv6_ns_filter(phy->dev, vif,
127                                               !test_bit(MT76_STATE_RUNNING,
128                                               &phy->state));
129         }
130
131         mt76_connac_mcu_set_suspend_iter(priv, mac, vif);
132 }
133
134 #endif /* CONFIG_PM */
135
136 static void
137 mt7921_mcu_uni_roc_event(struct mt792x_dev *dev, struct sk_buff *skb)
138 {
139         struct mt7921_roc_grant_tlv *grant;
140         struct mt76_connac2_mcu_rxd *rxd;
141         int duration;
142
143         rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
144         grant = (struct mt7921_roc_grant_tlv *)(rxd->tlv + 4);
145
146         /* should never happen */
147         WARN_ON_ONCE((le16_to_cpu(grant->tag) != UNI_EVENT_ROC_GRANT));
148
149         if (grant->reqtype == MT7921_ROC_REQ_ROC)
150                 ieee80211_ready_on_channel(dev->mt76.phy.hw);
151
152         dev->phy.roc_grant = true;
153         wake_up(&dev->phy.roc_wait);
154         duration = le32_to_cpu(grant->max_interval);
155         mod_timer(&dev->phy.roc_timer,
156                   jiffies + msecs_to_jiffies(duration));
157 }
158
159 static void
160 mt7921_mcu_scan_event(struct mt792x_dev *dev, struct sk_buff *skb)
161 {
162         struct mt76_phy *mphy = &dev->mt76.phy;
163         struct mt792x_phy *phy = (struct mt792x_phy *)mphy->priv;
164
165         spin_lock_bh(&dev->mt76.lock);
166         __skb_queue_tail(&phy->scan_event_list, skb);
167         spin_unlock_bh(&dev->mt76.lock);
168
169         ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work,
170                                      MT792x_HW_SCAN_TIMEOUT);
171 }
172
173 static void
174 mt7921_mcu_connection_loss_iter(void *priv, u8 *mac,
175                                 struct ieee80211_vif *vif)
176 {
177         struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
178         struct mt76_connac_beacon_loss_event *event = priv;
179
180         if (mvif->idx != event->bss_idx)
181                 return;
182
183         if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER) ||
184             vif->type != NL80211_IFTYPE_STATION)
185                 return;
186
187         ieee80211_connection_loss(vif);
188 }
189
190 static void
191 mt7921_mcu_connection_loss_event(struct mt792x_dev *dev, struct sk_buff *skb)
192 {
193         struct mt76_connac_beacon_loss_event *event;
194         struct mt76_phy *mphy = &dev->mt76.phy;
195
196         skb_pull(skb, sizeof(struct mt76_connac2_mcu_rxd));
197         event = (struct mt76_connac_beacon_loss_event *)skb->data;
198
199         ieee80211_iterate_active_interfaces_atomic(mphy->hw,
200                                         IEEE80211_IFACE_ITER_RESUME_ALL,
201                                         mt7921_mcu_connection_loss_iter, event);
202 }
203
204 static void
205 mt7921_mcu_debug_msg_event(struct mt792x_dev *dev, struct sk_buff *skb)
206 {
207         struct mt7921_debug_msg {
208                 __le16 id;
209                 u8 type;
210                 u8 flag;
211                 __le32 value;
212                 __le16 len;
213                 u8 content[512];
214         } __packed * msg;
215
216         skb_pull(skb, sizeof(struct mt76_connac2_mcu_rxd));
217         msg = (struct mt7921_debug_msg *)skb->data;
218
219         if (msg->type == 3) { /* fw log */
220                 u16 len = min_t(u16, le16_to_cpu(msg->len), 512);
221                 int i;
222
223                 for (i = 0 ; i < len; i++) {
224                         if (!msg->content[i])
225                                 msg->content[i] = ' ';
226                 }
227                 wiphy_info(mt76_hw(dev)->wiphy, "%.*s", len, msg->content);
228         }
229 }
230
231 static void
232 mt7921_mcu_low_power_event(struct mt792x_dev *dev, struct sk_buff *skb)
233 {
234         struct mt7921_mcu_lp_event {
235                 u8 state;
236                 u8 reserved[3];
237         } __packed * event;
238
239         skb_pull(skb, sizeof(struct mt76_connac2_mcu_rxd));
240         event = (struct mt7921_mcu_lp_event *)skb->data;
241
242         trace_lp_event(dev, event->state);
243 }
244
245 static void
246 mt7921_mcu_tx_done_event(struct mt792x_dev *dev, struct sk_buff *skb)
247 {
248         struct mt7921_mcu_tx_done_event *event;
249
250         skb_pull(skb, sizeof(struct mt76_connac2_mcu_rxd));
251         event = (struct mt7921_mcu_tx_done_event *)skb->data;
252
253         mt7921_mac_add_txs(dev, event->txs);
254 }
255
256 static void
257 mt7921_mcu_rx_unsolicited_event(struct mt792x_dev *dev, struct sk_buff *skb)
258 {
259         struct mt76_connac2_mcu_rxd *rxd;
260
261         rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
262         switch (rxd->eid) {
263         case MCU_EVENT_BSS_BEACON_LOSS:
264                 mt7921_mcu_connection_loss_event(dev, skb);
265                 break;
266         case MCU_EVENT_SCHED_SCAN_DONE:
267         case MCU_EVENT_SCAN_DONE:
268                 mt7921_mcu_scan_event(dev, skb);
269                 return;
270         case MCU_EVENT_DBG_MSG:
271                 mt7921_mcu_debug_msg_event(dev, skb);
272                 break;
273         case MCU_EVENT_COREDUMP:
274                 dev->fw_assert = true;
275                 mt76_connac_mcu_coredump_event(&dev->mt76, skb,
276                                                &dev->coredump);
277                 return;
278         case MCU_EVENT_LP_INFO:
279                 mt7921_mcu_low_power_event(dev, skb);
280                 break;
281         case MCU_EVENT_TX_DONE:
282                 mt7921_mcu_tx_done_event(dev, skb);
283                 break;
284         default:
285                 break;
286         }
287         dev_kfree_skb(skb);
288 }
289
290 static void
291 mt7921_mcu_uni_rx_unsolicited_event(struct mt792x_dev *dev,
292                                     struct sk_buff *skb)
293 {
294         struct mt76_connac2_mcu_rxd *rxd;
295
296         rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
297
298         switch (rxd->eid) {
299         case MCU_UNI_EVENT_ROC:
300                 mt7921_mcu_uni_roc_event(dev, skb);
301                 break;
302         default:
303                 break;
304         }
305         dev_kfree_skb(skb);
306 }
307
308 void mt7921_mcu_rx_event(struct mt792x_dev *dev, struct sk_buff *skb)
309 {
310         struct mt76_connac2_mcu_rxd *rxd;
311
312         if (skb_linearize(skb))
313                 return;
314
315         rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
316
317         if (rxd->option & MCU_UNI_CMD_UNSOLICITED_EVENT) {
318                 mt7921_mcu_uni_rx_unsolicited_event(dev, skb);
319                 return;
320         }
321
322         if (rxd->eid == 0x6) {
323                 mt76_mcu_rx_event(&dev->mt76, skb);
324                 return;
325         }
326
327         if (rxd->ext_eid == MCU_EXT_EVENT_RATE_REPORT ||
328             rxd->eid == MCU_EVENT_BSS_BEACON_LOSS ||
329             rxd->eid == MCU_EVENT_SCHED_SCAN_DONE ||
330             rxd->eid == MCU_EVENT_SCAN_DONE ||
331             rxd->eid == MCU_EVENT_TX_DONE ||
332             rxd->eid == MCU_EVENT_DBG_MSG ||
333             rxd->eid == MCU_EVENT_COREDUMP ||
334             rxd->eid == MCU_EVENT_LP_INFO ||
335             !rxd->seq)
336                 mt7921_mcu_rx_unsolicited_event(dev, skb);
337         else
338                 mt76_mcu_rx_event(&dev->mt76, skb);
339 }
340
341 /** starec & wtbl **/
342 int mt7921_mcu_uni_tx_ba(struct mt792x_dev *dev,
343                          struct ieee80211_ampdu_params *params,
344                          bool enable)
345 {
346         struct mt792x_sta *msta = (struct mt792x_sta *)params->sta->drv_priv;
347
348         if (enable && !params->amsdu)
349                 msta->wcid.amsdu = false;
350
351         return mt76_connac_mcu_sta_ba(&dev->mt76, &msta->vif->mt76, params,
352                                       MCU_UNI_CMD(STA_REC_UPDATE),
353                                       enable, true);
354 }
355
356 int mt7921_mcu_uni_rx_ba(struct mt792x_dev *dev,
357                          struct ieee80211_ampdu_params *params,
358                          bool enable)
359 {
360         struct mt792x_sta *msta = (struct mt792x_sta *)params->sta->drv_priv;
361
362         return mt76_connac_mcu_sta_ba(&dev->mt76, &msta->vif->mt76, params,
363                                       MCU_UNI_CMD(STA_REC_UPDATE),
364                                       enable, false);
365 }
366
367 static int mt7921_load_clc(struct mt792x_dev *dev, const char *fw_name)
368 {
369         const struct mt76_connac2_fw_trailer *hdr;
370         const struct mt76_connac2_fw_region *region;
371         const struct mt7921_clc *clc;
372         struct mt76_dev *mdev = &dev->mt76;
373         struct mt792x_phy *phy = &dev->phy;
374         const struct firmware *fw;
375         int ret, i, len, offset = 0;
376         u8 *clc_base = NULL, hw_encap = 0;
377
378         if (mt7921_disable_clc ||
379             mt76_is_usb(&dev->mt76))
380                 return 0;
381
382         if (mt76_is_mmio(&dev->mt76)) {
383                 ret = mt7921_mcu_read_eeprom(dev, MT_EE_HW_TYPE, &hw_encap);
384                 if (ret)
385                         return ret;
386                 hw_encap = u8_get_bits(hw_encap, MT_EE_HW_TYPE_ENCAP);
387         }
388
389         ret = request_firmware(&fw, fw_name, mdev->dev);
390         if (ret)
391                 return ret;
392
393         if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
394                 dev_err(mdev->dev, "Invalid firmware\n");
395                 ret = -EINVAL;
396                 goto out;
397         }
398
399         hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
400         for (i = 0; i < hdr->n_region; i++) {
401                 region = (const void *)((const u8 *)hdr -
402                                         (hdr->n_region - i) * sizeof(*region));
403                 len = le32_to_cpu(region->len);
404
405                 /* check if we have valid buffer size */
406                 if (offset + len > fw->size) {
407                         dev_err(mdev->dev, "Invalid firmware region\n");
408                         ret = -EINVAL;
409                         goto out;
410                 }
411
412                 if ((region->feature_set & FW_FEATURE_NON_DL) &&
413                     region->type == FW_TYPE_CLC) {
414                         clc_base = (u8 *)(fw->data + offset);
415                         break;
416                 }
417                 offset += len;
418         }
419
420         if (!clc_base)
421                 goto out;
422
423         for (offset = 0; offset < len; offset += le32_to_cpu(clc->len)) {
424                 clc = (const struct mt7921_clc *)(clc_base + offset);
425
426                 /* do not init buf again if chip reset triggered */
427                 if (phy->clc[clc->idx])
428                         continue;
429
430                 /* header content sanity */
431                 if (clc->idx == MT7921_CLC_POWER &&
432                     u8_get_bits(clc->type, MT_EE_HW_TYPE_ENCAP) != hw_encap)
433                         continue;
434
435                 phy->clc[clc->idx] = devm_kmemdup(mdev->dev, clc,
436                                                   le32_to_cpu(clc->len),
437                                                   GFP_KERNEL);
438
439                 if (!phy->clc[clc->idx]) {
440                         ret = -ENOMEM;
441                         goto out;
442                 }
443         }
444         ret = mt7921_mcu_set_clc(dev, "00", ENVIRON_INDOOR);
445 out:
446         release_firmware(fw);
447
448         return ret;
449 }
450
451 static void mt7921_mcu_parse_tx_resource(struct mt76_dev *dev,
452                                          struct sk_buff *skb)
453 {
454         struct mt76_sdio *sdio = &dev->sdio;
455         struct mt7921_tx_resource {
456                 __le32 version;
457                 __le32 pse_data_quota;
458                 __le32 pse_mcu_quota;
459                 __le32 ple_data_quota;
460                 __le32 ple_mcu_quota;
461                 __le16 pse_page_size;
462                 __le16 ple_page_size;
463                 u8 pp_padding;
464                 u8 pad[3];
465         } __packed * tx_res;
466
467         tx_res = (struct mt7921_tx_resource *)skb->data;
468         sdio->sched.pse_data_quota = le32_to_cpu(tx_res->pse_data_quota);
469         sdio->sched.pse_mcu_quota = le32_to_cpu(tx_res->pse_mcu_quota);
470         sdio->sched.ple_data_quota = le32_to_cpu(tx_res->ple_data_quota);
471         sdio->sched.pse_page_size = le16_to_cpu(tx_res->pse_page_size);
472         sdio->sched.deficit = tx_res->pp_padding;
473 }
474
475 static void mt7921_mcu_parse_phy_cap(struct mt76_dev *dev,
476                                      struct sk_buff *skb)
477 {
478         struct mt7921_phy_cap {
479                 u8 ht;
480                 u8 vht;
481                 u8 _5g;
482                 u8 max_bw;
483                 u8 nss;
484                 u8 dbdc;
485                 u8 tx_ldpc;
486                 u8 rx_ldpc;
487                 u8 tx_stbc;
488                 u8 rx_stbc;
489                 u8 hw_path;
490                 u8 he;
491         } __packed * cap;
492
493         enum {
494                 WF0_24G,
495                 WF0_5G
496         };
497
498         cap = (struct mt7921_phy_cap *)skb->data;
499
500         dev->phy.antenna_mask = BIT(cap->nss) - 1;
501         dev->phy.chainmask = dev->phy.antenna_mask;
502         dev->phy.cap.has_2ghz = cap->hw_path & BIT(WF0_24G);
503         dev->phy.cap.has_5ghz = cap->hw_path & BIT(WF0_5G);
504 }
505
506 static int mt7921_mcu_get_nic_capability(struct mt792x_phy *mphy)
507 {
508         struct mt76_connac_cap_hdr {
509                 __le16 n_element;
510                 u8 rsv[2];
511         } __packed * hdr;
512         struct sk_buff *skb;
513         struct mt76_phy *phy = mphy->mt76;
514         int ret, i;
515
516         ret = mt76_mcu_send_and_get_msg(phy->dev, MCU_CE_CMD(GET_NIC_CAPAB),
517                                         NULL, 0, true, &skb);
518         if (ret)
519                 return ret;
520
521         hdr = (struct mt76_connac_cap_hdr *)skb->data;
522         if (skb->len < sizeof(*hdr)) {
523                 ret = -EINVAL;
524                 goto out;
525         }
526
527         skb_pull(skb, sizeof(*hdr));
528
529         for (i = 0; i < le16_to_cpu(hdr->n_element); i++) {
530                 struct tlv_hdr {
531                         __le32 type;
532                         __le32 len;
533                 } __packed * tlv = (struct tlv_hdr *)skb->data;
534                 int len;
535
536                 if (skb->len < sizeof(*tlv))
537                         break;
538
539                 skb_pull(skb, sizeof(*tlv));
540
541                 len = le32_to_cpu(tlv->len);
542                 if (skb->len < len)
543                         break;
544
545                 switch (le32_to_cpu(tlv->type)) {
546                 case MT_NIC_CAP_6G:
547                         phy->cap.has_6ghz = skb->data[0];
548                         break;
549                 case MT_NIC_CAP_MAC_ADDR:
550                         memcpy(phy->macaddr, (void *)skb->data, ETH_ALEN);
551                         break;
552                 case MT_NIC_CAP_PHY:
553                         mt7921_mcu_parse_phy_cap(phy->dev, skb);
554                         break;
555                 case MT_NIC_CAP_TX_RESOURCE:
556                         if (mt76_is_sdio(phy->dev))
557                                 mt7921_mcu_parse_tx_resource(phy->dev,
558                                                              skb);
559                         break;
560                 default:
561                         break;
562                 }
563                 skb_pull(skb, len);
564         }
565 out:
566         dev_kfree_skb(skb);
567
568         return ret;
569 }
570
571 int mt7921_mcu_fw_log_2_host(struct mt792x_dev *dev, u8 ctrl)
572 {
573         struct {
574                 u8 ctrl_val;
575                 u8 pad[3];
576         } data = {
577                 .ctrl_val = ctrl
578         };
579
580         return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(FWLOG_2_HOST),
581                                  &data, sizeof(data), false);
582 }
583
584 int mt7921_run_firmware(struct mt792x_dev *dev)
585 {
586         int err;
587
588         err = mt792x_load_firmware(dev);
589         if (err)
590                 return err;
591
592         err = mt7921_mcu_get_nic_capability(&dev->phy);
593         if (err)
594                 return err;
595
596         set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
597         err = mt7921_load_clc(dev, mt792x_ram_name(dev));
598         if (err)
599                 return err;
600
601         return mt7921_mcu_fw_log_2_host(dev, 1);
602 }
603 EXPORT_SYMBOL_GPL(mt7921_run_firmware);
604
605 int mt7921_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif)
606 {
607         struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
608         struct edca {
609                 __le16 cw_min;
610                 __le16 cw_max;
611                 __le16 txop;
612                 __le16 aifs;
613                 u8 guardtime;
614                 u8 acm;
615         } __packed;
616         struct mt7921_mcu_tx {
617                 struct edca edca[IEEE80211_NUM_ACS];
618                 u8 bss_idx;
619                 u8 qos;
620                 u8 wmm_idx;
621                 u8 pad;
622         } __packed req = {
623                 .bss_idx = mvif->mt76.idx,
624                 .qos = vif->bss_conf.qos,
625                 .wmm_idx = mvif->mt76.wmm_idx,
626         };
627         struct mu_edca {
628                 u8 cw_min;
629                 u8 cw_max;
630                 u8 aifsn;
631                 u8 acm;
632                 u8 timer;
633                 u8 padding[3];
634         };
635         struct mt7921_mcu_mu_tx {
636                 u8 ver;
637                 u8 pad0;
638                 __le16 len;
639                 u8 bss_idx;
640                 u8 qos;
641                 u8 wmm_idx;
642                 u8 pad1;
643                 struct mu_edca edca[IEEE80211_NUM_ACS];
644                 u8 pad3[32];
645         } __packed req_mu = {
646                 .bss_idx = mvif->mt76.idx,
647                 .qos = vif->bss_conf.qos,
648                 .wmm_idx = mvif->mt76.wmm_idx,
649         };
650         static const int to_aci[] = { 1, 0, 2, 3 };
651         int ac, ret;
652
653         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
654                 struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac];
655                 struct edca *e = &req.edca[to_aci[ac]];
656
657                 e->aifs = cpu_to_le16(q->aifs);
658                 e->txop = cpu_to_le16(q->txop);
659
660                 if (q->cw_min)
661                         e->cw_min = cpu_to_le16(q->cw_min);
662                 else
663                         e->cw_min = cpu_to_le16(5);
664
665                 if (q->cw_max)
666                         e->cw_max = cpu_to_le16(q->cw_max);
667                 else
668                         e->cw_max = cpu_to_le16(10);
669         }
670
671         ret = mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_EDCA_PARMS), &req,
672                                 sizeof(req), false);
673         if (ret)
674                 return ret;
675
676         if (!vif->bss_conf.he_support)
677                 return 0;
678
679         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
680                 struct ieee80211_he_mu_edca_param_ac_rec *q;
681                 struct mu_edca *e;
682
683                 if (!mvif->queue_params[ac].mu_edca)
684                         break;
685
686                 q = &mvif->queue_params[ac].mu_edca_param_rec;
687                 e = &(req_mu.edca[to_aci[ac]]);
688
689                 e->cw_min = q->ecw_min_max & 0xf;
690                 e->cw_max = (q->ecw_min_max & 0xf0) >> 4;
691                 e->aifsn = q->aifsn;
692                 e->timer = q->mu_edca_timer;
693         }
694
695         return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_MU_EDCA_PARMS),
696                                  &req_mu, sizeof(req_mu), false);
697 }
698
699 int mt7921_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,
700                        struct ieee80211_channel *chan, int duration,
701                        enum mt7921_roc_req type, u8 token_id)
702 {
703         int center_ch = ieee80211_frequency_to_channel(chan->center_freq);
704         struct mt792x_dev *dev = phy->dev;
705         struct {
706                 struct {
707                         u8 rsv[4];
708                 } __packed hdr;
709                 struct roc_acquire_tlv {
710                         __le16 tag;
711                         __le16 len;
712                         u8 bss_idx;
713                         u8 tokenid;
714                         u8 control_channel;
715                         u8 sco;
716                         u8 band;
717                         u8 bw;
718                         u8 center_chan;
719                         u8 center_chan2;
720                         u8 bw_from_ap;
721                         u8 center_chan_from_ap;
722                         u8 center_chan2_from_ap;
723                         u8 reqtype;
724                         __le32 maxinterval;
725                         u8 dbdcband;
726                         u8 rsv[3];
727                 } __packed roc;
728         } __packed req = {
729                 .roc = {
730                         .tag = cpu_to_le16(UNI_ROC_ACQUIRE),
731                         .len = cpu_to_le16(sizeof(struct roc_acquire_tlv)),
732                         .tokenid = token_id,
733                         .reqtype = type,
734                         .maxinterval = cpu_to_le32(duration),
735                         .bss_idx = vif->mt76.idx,
736                         .control_channel = chan->hw_value,
737                         .bw = CMD_CBW_20MHZ,
738                         .bw_from_ap = CMD_CBW_20MHZ,
739                         .center_chan = center_ch,
740                         .center_chan_from_ap = center_ch,
741                         .dbdcband = 0xff, /* auto */
742                 },
743         };
744
745         if (chan->hw_value < center_ch)
746                 req.roc.sco = 1; /* SCA */
747         else if (chan->hw_value > center_ch)
748                 req.roc.sco = 3; /* SCB */
749
750         switch (chan->band) {
751         case NL80211_BAND_6GHZ:
752                 req.roc.band = 3;
753                 break;
754         case NL80211_BAND_5GHZ:
755                 req.roc.band = 2;
756                 break;
757         default:
758                 req.roc.band = 1;
759                 break;
760         }
761
762         return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(ROC),
763                                  &req, sizeof(req), false);
764 }
765
766 int mt7921_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,
767                          u8 token_id)
768 {
769         struct mt792x_dev *dev = phy->dev;
770         struct {
771                 struct {
772                         u8 rsv[4];
773                 } __packed hdr;
774                 struct roc_abort_tlv {
775                         __le16 tag;
776                         __le16 len;
777                         u8 bss_idx;
778                         u8 tokenid;
779                         u8 dbdcband;
780                         u8 rsv[5];
781                 } __packed abort;
782         } __packed req = {
783                 .abort = {
784                         .tag = cpu_to_le16(UNI_ROC_ABORT),
785                         .len = cpu_to_le16(sizeof(struct roc_abort_tlv)),
786                         .tokenid = token_id,
787                         .bss_idx = vif->mt76.idx,
788                         .dbdcband = 0xff, /* auto*/
789                 },
790         };
791
792         return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(ROC),
793                                  &req, sizeof(req), false);
794 }
795
796 int mt7921_mcu_set_chan_info(struct mt792x_phy *phy, int cmd)
797 {
798         struct mt792x_dev *dev = phy->dev;
799         struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
800         int freq1 = chandef->center_freq1;
801         struct {
802                 u8 control_ch;
803                 u8 center_ch;
804                 u8 bw;
805                 u8 tx_streams_num;
806                 u8 rx_streams;  /* mask or num */
807                 u8 switch_reason;
808                 u8 band_idx;
809                 u8 center_ch2;  /* for 80+80 only */
810                 __le16 cac_case;
811                 u8 channel_band;
812                 u8 rsv0;
813                 __le32 outband_freq;
814                 u8 txpower_drop;
815                 u8 ap_bw;
816                 u8 ap_center_ch;
817                 u8 rsv1[57];
818         } __packed req = {
819                 .control_ch = chandef->chan->hw_value,
820                 .center_ch = ieee80211_frequency_to_channel(freq1),
821                 .bw = mt76_connac_chan_bw(chandef),
822                 .tx_streams_num = hweight8(phy->mt76->antenna_mask),
823                 .rx_streams = phy->mt76->antenna_mask,
824                 .band_idx = phy != &dev->phy,
825         };
826
827         if (chandef->chan->band == NL80211_BAND_6GHZ)
828                 req.channel_band = 2;
829         else
830                 req.channel_band = chandef->chan->band;
831
832         if (cmd == MCU_EXT_CMD(SET_RX_PATH) ||
833             dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR)
834                 req.switch_reason = CH_SWITCH_NORMAL;
835         else if (dev->mt76.hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
836                 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
837         else if (!cfg80211_reg_can_beacon(dev->mt76.hw->wiphy, chandef,
838                                           NL80211_IFTYPE_AP))
839                 req.switch_reason = CH_SWITCH_DFS;
840         else
841                 req.switch_reason = CH_SWITCH_NORMAL;
842
843         if (cmd == MCU_EXT_CMD(CHANNEL_SWITCH))
844                 req.rx_streams = hweight8(req.rx_streams);
845
846         if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
847                 int freq2 = chandef->center_freq2;
848
849                 req.center_ch2 = ieee80211_frequency_to_channel(freq2);
850         }
851
852         return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
853 }
854
855 int mt7921_mcu_set_eeprom(struct mt792x_dev *dev)
856 {
857         struct req_hdr {
858                 u8 buffer_mode;
859                 u8 format;
860                 __le16 len;
861         } __packed req = {
862                 .buffer_mode = EE_MODE_EFUSE,
863                 .format = EE_FORMAT_WHOLE,
864         };
865
866         return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EFUSE_BUFFER_MODE),
867                                  &req, sizeof(req), true);
868 }
869 EXPORT_SYMBOL_GPL(mt7921_mcu_set_eeprom);
870
871 int mt7921_mcu_uni_bss_ps(struct mt792x_dev *dev, struct ieee80211_vif *vif)
872 {
873         struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
874         struct {
875                 struct {
876                         u8 bss_idx;
877                         u8 pad[3];
878                 } __packed hdr;
879                 struct ps_tlv {
880                         __le16 tag;
881                         __le16 len;
882                         u8 ps_state; /* 0: device awake
883                                       * 1: static power save
884                                       * 2: dynamic power saving
885                                       * 3: enter TWT power saving
886                                       * 4: leave TWT power saving
887                                       */
888                         u8 pad[3];
889                 } __packed ps;
890         } __packed ps_req = {
891                 .hdr = {
892                         .bss_idx = mvif->mt76.idx,
893                 },
894                 .ps = {
895                         .tag = cpu_to_le16(UNI_BSS_INFO_PS),
896                         .len = cpu_to_le16(sizeof(struct ps_tlv)),
897                         .ps_state = vif->cfg.ps ? 2 : 0,
898                 },
899         };
900
901         if (vif->type != NL80211_IFTYPE_STATION)
902                 return -EOPNOTSUPP;
903
904         return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
905                                  &ps_req, sizeof(ps_req), true);
906 }
907
908 static int
909 mt7921_mcu_uni_bss_bcnft(struct mt792x_dev *dev, struct ieee80211_vif *vif,
910                          bool enable)
911 {
912         struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
913         struct {
914                 struct {
915                         u8 bss_idx;
916                         u8 pad[3];
917                 } __packed hdr;
918                 struct bcnft_tlv {
919                         __le16 tag;
920                         __le16 len;
921                         __le16 bcn_interval;
922                         u8 dtim_period;
923                         u8 pad;
924                 } __packed bcnft;
925         } __packed bcnft_req = {
926                 .hdr = {
927                         .bss_idx = mvif->mt76.idx,
928                 },
929                 .bcnft = {
930                         .tag = cpu_to_le16(UNI_BSS_INFO_BCNFT),
931                         .len = cpu_to_le16(sizeof(struct bcnft_tlv)),
932                         .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
933                         .dtim_period = vif->bss_conf.dtim_period,
934                 },
935         };
936
937         if (vif->type != NL80211_IFTYPE_STATION)
938                 return 0;
939
940         return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
941                                  &bcnft_req, sizeof(bcnft_req), true);
942 }
943
944 int
945 mt7921_mcu_set_bss_pm(struct mt792x_dev *dev, struct ieee80211_vif *vif,
946                       bool enable)
947 {
948         struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
949         struct {
950                 u8 bss_idx;
951                 u8 dtim_period;
952                 __le16 aid;
953                 __le16 bcn_interval;
954                 __le16 atim_window;
955                 u8 uapsd;
956                 u8 bmc_delivered_ac;
957                 u8 bmc_triggered_ac;
958                 u8 pad;
959         } req = {
960                 .bss_idx = mvif->mt76.idx,
961                 .aid = cpu_to_le16(vif->cfg.aid),
962                 .dtim_period = vif->bss_conf.dtim_period,
963                 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
964         };
965         struct {
966                 u8 bss_idx;
967                 u8 pad[3];
968         } req_hdr = {
969                 .bss_idx = mvif->mt76.idx,
970         };
971         int err;
972
973         err = mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_ABORT),
974                                 &req_hdr, sizeof(req_hdr), false);
975         if (err < 0 || !enable)
976                 return err;
977
978         return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_CONNECTED),
979                                  &req, sizeof(req), false);
980 }
981
982 int mt7921_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta,
983                           struct ieee80211_vif *vif, bool enable,
984                           enum mt76_sta_info_state state)
985 {
986         struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
987         int rssi = -ewma_rssi_read(&mvif->rssi);
988         struct mt76_sta_cmd_info info = {
989                 .sta = sta,
990                 .vif = vif,
991                 .enable = enable,
992                 .cmd = MCU_UNI_CMD(STA_REC_UPDATE),
993                 .state = state,
994                 .offload_fw = true,
995                 .rcpi = to_rcpi(rssi),
996         };
997         struct mt792x_sta *msta;
998
999         msta = sta ? (struct mt792x_sta *)sta->drv_priv : NULL;
1000         info.wcid = msta ? &msta->wcid : &mvif->sta.wcid;
1001         info.newly = msta ? state != MT76_STA_INFO_STATE_ASSOC : true;
1002
1003         return mt76_connac_mcu_sta_cmd(&dev->mphy, &info);
1004 }
1005
1006 int mt7921_mcu_set_beacon_filter(struct mt792x_dev *dev,
1007                                  struct ieee80211_vif *vif,
1008                                  bool enable)
1009 {
1010 #define MT7921_FIF_BIT_CLR              BIT(1)
1011 #define MT7921_FIF_BIT_SET              BIT(0)
1012         int err;
1013
1014         if (enable) {
1015                 err = mt7921_mcu_uni_bss_bcnft(dev, vif, true);
1016                 if (err)
1017                         return err;
1018
1019                 err = mt7921_mcu_set_rxfilter(dev, 0,
1020                                               MT7921_FIF_BIT_SET,
1021                                               MT_WF_RFCR_DROP_OTHER_BEACON);
1022                 if (err)
1023                         return err;
1024
1025                 return 0;
1026         }
1027
1028         err = mt7921_mcu_set_bss_pm(dev, vif, false);
1029         if (err)
1030                 return err;
1031
1032         err = mt7921_mcu_set_rxfilter(dev, 0,
1033                                       MT7921_FIF_BIT_CLR,
1034                                       MT_WF_RFCR_DROP_OTHER_BEACON);
1035         if (err)
1036                 return err;
1037
1038         return 0;
1039 }
1040
1041 int mt7921_get_txpwr_info(struct mt792x_dev *dev, struct mt7921_txpwr *txpwr)
1042 {
1043         struct mt7921_txpwr_event *event;
1044         struct mt7921_txpwr_req req = {
1045                 .dbdc_idx = 0,
1046         };
1047         struct sk_buff *skb;
1048         int ret;
1049
1050         ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_CE_CMD(GET_TXPWR),
1051                                         &req, sizeof(req), true, &skb);
1052         if (ret)
1053                 return ret;
1054
1055         event = (struct mt7921_txpwr_event *)skb->data;
1056         WARN_ON(skb->len != le16_to_cpu(event->len));
1057         memcpy(txpwr, &event->txpwr, sizeof(event->txpwr));
1058
1059         dev_kfree_skb(skb);
1060
1061         return 0;
1062 }
1063
1064 int mt7921_mcu_set_sniffer(struct mt792x_dev *dev, struct ieee80211_vif *vif,
1065                            bool enable)
1066 {
1067         struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1068         struct {
1069                 struct {
1070                         u8 band_idx;
1071                         u8 pad[3];
1072                 } __packed hdr;
1073                 struct sniffer_enable_tlv {
1074                         __le16 tag;
1075                         __le16 len;
1076                         u8 enable;
1077                         u8 pad[3];
1078                 } __packed enable;
1079         } req = {
1080                 .hdr = {
1081                         .band_idx = mvif->band_idx,
1082                 },
1083                 .enable = {
1084                         .tag = cpu_to_le16(0),
1085                         .len = cpu_to_le16(sizeof(struct sniffer_enable_tlv)),
1086                         .enable = enable,
1087                 },
1088         };
1089
1090         return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(SNIFFER), &req, sizeof(req),
1091                                  true);
1092 }
1093
1094 int mt7921_mcu_config_sniffer(struct mt792x_vif *vif,
1095                               struct ieee80211_chanctx_conf *ctx)
1096 {
1097         struct cfg80211_chan_def *chandef = &ctx->def;
1098         int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
1099         const u8 ch_band[] = {
1100                 [NL80211_BAND_2GHZ] = 1,
1101                 [NL80211_BAND_5GHZ] = 2,
1102                 [NL80211_BAND_6GHZ] = 3,
1103         };
1104         const u8 ch_width[] = {
1105                 [NL80211_CHAN_WIDTH_20_NOHT] = 0,
1106                 [NL80211_CHAN_WIDTH_20] = 0,
1107                 [NL80211_CHAN_WIDTH_40] = 0,
1108                 [NL80211_CHAN_WIDTH_80] = 1,
1109                 [NL80211_CHAN_WIDTH_160] = 2,
1110                 [NL80211_CHAN_WIDTH_80P80] = 3,
1111                 [NL80211_CHAN_WIDTH_5] = 4,
1112                 [NL80211_CHAN_WIDTH_10] = 5,
1113                 [NL80211_CHAN_WIDTH_320] = 6,
1114         };
1115         struct {
1116                 struct {
1117                         u8 band_idx;
1118                         u8 pad[3];
1119                 } __packed hdr;
1120                 struct config_tlv {
1121                         __le16 tag;
1122                         __le16 len;
1123                         u16 aid;
1124                         u8 ch_band;
1125                         u8 bw;
1126                         u8 control_ch;
1127                         u8 sco;
1128                         u8 center_ch;
1129                         u8 center_ch2;
1130                         u8 drop_err;
1131                         u8 pad[3];
1132                 } __packed tlv;
1133         } __packed req = {
1134                 .hdr = {
1135                         .band_idx = vif->mt76.band_idx,
1136                 },
1137                 .tlv = {
1138                         .tag = cpu_to_le16(1),
1139                         .len = cpu_to_le16(sizeof(req.tlv)),
1140                         .control_ch = chandef->chan->hw_value,
1141                         .center_ch = ieee80211_frequency_to_channel(freq1),
1142                         .drop_err = 1,
1143                 },
1144         };
1145         if (chandef->chan->band < ARRAY_SIZE(ch_band))
1146                 req.tlv.ch_band = ch_band[chandef->chan->band];
1147         if (chandef->width < ARRAY_SIZE(ch_width))
1148                 req.tlv.bw = ch_width[chandef->width];
1149
1150         if (freq2)
1151                 req.tlv.center_ch2 = ieee80211_frequency_to_channel(freq2);
1152
1153         if (req.tlv.control_ch < req.tlv.center_ch)
1154                 req.tlv.sco = 1; /* SCA */
1155         else if (req.tlv.control_ch > req.tlv.center_ch)
1156                 req.tlv.sco = 3; /* SCB */
1157
1158         return mt76_mcu_send_msg(vif->phy->mt76->dev, MCU_UNI_CMD(SNIFFER),
1159                                  &req, sizeof(req), true);
1160 }
1161
1162 int
1163 mt7921_mcu_uni_add_beacon_offload(struct mt792x_dev *dev,
1164                                   struct ieee80211_hw *hw,
1165                                   struct ieee80211_vif *vif,
1166                                   bool enable)
1167 {
1168         struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
1169         struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1170         struct ieee80211_mutable_offsets offs;
1171         struct {
1172                 struct req_hdr {
1173                         u8 bss_idx;
1174                         u8 pad[3];
1175                 } __packed hdr;
1176                 struct bcn_content_tlv {
1177                         __le16 tag;
1178                         __le16 len;
1179                         __le16 tim_ie_pos;
1180                         __le16 csa_ie_pos;
1181                         __le16 bcc_ie_pos;
1182                         /* 0: disable beacon offload
1183                          * 1: enable beacon offload
1184                          * 2: update probe respond offload
1185                          */
1186                         u8 enable;
1187                         /* 0: legacy format (TXD + payload)
1188                          * 1: only cap field IE
1189                          */
1190                         u8 type;
1191                         __le16 pkt_len;
1192                         u8 pkt[512];
1193                 } __packed beacon_tlv;
1194         } req = {
1195                 .hdr = {
1196                         .bss_idx = mvif->mt76.idx,
1197                 },
1198                 .beacon_tlv = {
1199                         .tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
1200                         .len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
1201                         .enable = enable,
1202                 },
1203         };
1204         struct sk_buff *skb;
1205
1206         /* support enable/update process only
1207          * disable flow would be handled in bss stop handler automatically
1208          */
1209         if (!enable)
1210                 return -EOPNOTSUPP;
1211
1212         skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs, 0);
1213         if (!skb)
1214                 return -EINVAL;
1215
1216         if (skb->len > 512 - MT_TXD_SIZE) {
1217                 dev_err(dev->mt76.dev, "beacon size limit exceed\n");
1218                 dev_kfree_skb(skb);
1219                 return -EINVAL;
1220         }
1221
1222         mt76_connac2_mac_write_txwi(&dev->mt76, (__le32 *)(req.beacon_tlv.pkt),
1223                                     skb, wcid, NULL, 0, 0, BSS_CHANGED_BEACON);
1224         memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
1225         req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
1226         req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
1227
1228         if (offs.cntdwn_counter_offs[0]) {
1229                 u16 csa_offs;
1230
1231                 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
1232                 req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
1233         }
1234         dev_kfree_skb(skb);
1235
1236         return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1237                                  &req, sizeof(req), true);
1238 }
1239
1240 static
1241 int __mt7921_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,
1242                          enum environment_cap env_cap,
1243                          struct mt7921_clc *clc,
1244                          u8 idx)
1245 {
1246         struct sk_buff *skb;
1247         struct {
1248                 u8 ver;
1249                 u8 pad0;
1250                 __le16 len;
1251                 u8 idx;
1252                 u8 env;
1253                 u8 acpi_conf;
1254                 u8 pad1;
1255                 u8 alpha2[2];
1256                 u8 type[2];
1257                 u8 rsvd[64];
1258         } __packed req = {
1259                 .idx = idx,
1260                 .env = env_cap,
1261                 .acpi_conf = mt792x_acpi_get_flags(&dev->phy),
1262         };
1263         int ret, valid_cnt = 0;
1264         u8 i, *pos;
1265
1266         if (!clc)
1267                 return 0;
1268
1269         pos = clc->data;
1270         for (i = 0; i < clc->nr_country; i++) {
1271                 struct mt7921_clc_rule *rule = (struct mt7921_clc_rule *)pos;
1272                 u16 len = le16_to_cpu(rule->len);
1273
1274                 pos += len + sizeof(*rule);
1275                 if (rule->alpha2[0] != alpha2[0] ||
1276                     rule->alpha2[1] != alpha2[1])
1277                         continue;
1278
1279                 memcpy(req.alpha2, rule->alpha2, 2);
1280                 memcpy(req.type, rule->type, 2);
1281
1282                 req.len = cpu_to_le16(sizeof(req) + len);
1283                 skb = __mt76_mcu_msg_alloc(&dev->mt76, &req,
1284                                            le16_to_cpu(req.len),
1285                                            sizeof(req), GFP_KERNEL);
1286                 if (!skb)
1287                         return -ENOMEM;
1288                 skb_put_data(skb, rule->data, len);
1289
1290                 ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1291                                             MCU_CE_CMD(SET_CLC), false);
1292                 if (ret < 0)
1293                         return ret;
1294                 valid_cnt++;
1295         }
1296
1297         if (!valid_cnt)
1298                 return -ENOENT;
1299
1300         return 0;
1301 }
1302
1303 int mt7921_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,
1304                        enum environment_cap env_cap)
1305 {
1306         struct mt792x_phy *phy = (struct mt792x_phy *)&dev->phy;
1307         int i, ret;
1308
1309         /* submit all clc config */
1310         for (i = 0; i < ARRAY_SIZE(phy->clc); i++) {
1311                 ret = __mt7921_mcu_set_clc(dev, alpha2, env_cap,
1312                                            phy->clc[i], i);
1313
1314                 /* If no country found, set "00" as default */
1315                 if (ret == -ENOENT)
1316                         ret = __mt7921_mcu_set_clc(dev, "00",
1317                                                    ENVIRON_INDOOR,
1318                                                    phy->clc[i], i);
1319                 if (ret < 0)
1320                         return ret;
1321         }
1322         return 0;
1323 }
1324
1325 int mt7921_mcu_get_temperature(struct mt792x_phy *phy)
1326 {
1327         struct mt792x_dev *dev = phy->dev;
1328         struct {
1329                 u8 ctrl_id;
1330                 u8 action;
1331                 u8 band_idx;
1332                 u8 rsv[5];
1333         } req = {
1334                 .ctrl_id = THERMAL_SENSOR_TEMP_QUERY,
1335                 .band_idx = phy->mt76->band_idx,
1336         };
1337
1338         return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL), &req,
1339                                  sizeof(req), true);
1340 }
1341
1342 int mt7921_mcu_set_rxfilter(struct mt792x_dev *dev, u32 fif,
1343                             u8 bit_op, u32 bit_map)
1344 {
1345         struct {
1346                 u8 rsv[4];
1347                 u8 mode;
1348                 u8 rsv2[3];
1349                 __le32 fif;
1350                 __le32 bit_map; /* bit_* for bitmap update */
1351                 u8 bit_op;
1352                 u8 pad[51];
1353         } __packed data = {
1354                 .mode = fif ? 1 : 2,
1355                 .fif = cpu_to_le32(fif),
1356                 .bit_map = cpu_to_le32(bit_map),
1357                 .bit_op = bit_op,
1358         };
1359
1360         return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_RX_FILTER),
1361                                  &data, sizeof(data), false);
1362 }