1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2019 MediaTek Inc.
4 * Author: Roy Luo <royluo@google.com>
5 * Ryder Lee <ryder.lee@mediatek.com>
8 #include <linux/firmware.h>
14 static bool prefer_offload_fw = true;
15 module_param(prefer_offload_fw, bool, 0644);
16 MODULE_PARM_DESC(prefer_offload_fw,
17 "Prefer client mode offload firmware (MT7663)");
19 struct mt7615_patch_hdr {
27 struct mt7615_fw_trailer {
37 #define FW_V3_COMMON_TAILER_SIZE 36
38 #define FW_V3_REGION_TAILER_SIZE 40
39 #define FW_START_OVERRIDE BIT(0)
40 #define FW_START_DLYCAL BIT(1)
41 #define FW_START_WORKING_PDA_CR4 BIT(2)
43 struct mt7663_fw_trailer {
55 struct mt7663_fw_buf {
65 #define MT7615_PATCH_ADDRESS 0x80000
66 #define MT7622_PATCH_ADDRESS 0x9c000
67 #define MT7663_PATCH_ADDRESS 0xdc000
69 #define N9_REGION_NUM 2
70 #define CR4_REGION_NUM 1
74 #define FW_FEATURE_SET_ENCRYPT BIT(0)
75 #define FW_FEATURE_SET_KEY_IDX GENMASK(2, 1)
77 #define DL_MODE_ENCRYPT BIT(0)
78 #define DL_MODE_KEY_IDX GENMASK(2, 1)
79 #define DL_MODE_RESET_SEC_IV BIT(3)
80 #define DL_MODE_WORKING_PDA_CR4 BIT(4)
81 #define DL_MODE_VALID_RAM_ENTRY BIT(5)
82 #define DL_MODE_NEED_RSP BIT(31)
84 #define FW_START_OVERRIDE BIT(0)
85 #define FW_START_WORKING_PDA_CR4 BIT(2)
87 void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
88 int cmd, int *wait_seq)
90 int txd_len, mcu_cmd = cmd & MCU_CMD_MASK;
91 struct mt7615_uni_txd *uni_txd;
92 struct mt7615_mcu_txd *mcu_txd;
93 u8 seq, q_idx, pkt_fmt;
97 /* TODO: make dynamic based on msg type */
98 dev->mt76.mcu.timeout = 20 * HZ;
100 seq = ++dev->mt76.mcu.msg_seq & 0xf;
102 seq = ++dev->mt76.mcu.msg_seq & 0xf;
106 txd_len = cmd & MCU_UNI_PREFIX ? sizeof(*uni_txd) : sizeof(*mcu_txd);
107 txd = (__le32 *)skb_push(skb, txd_len);
109 if (cmd != MCU_CMD_FW_SCATTER) {
110 q_idx = MT_TX_MCU_PORT_RX_Q0;
111 pkt_fmt = MT_TX_TYPE_CMD;
113 q_idx = MT_TX_MCU_PORT_RX_FWDL;
114 pkt_fmt = MT_TX_TYPE_FW;
117 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
118 FIELD_PREP(MT_TXD0_P_IDX, MT_TX_PORT_IDX_MCU) |
119 FIELD_PREP(MT_TXD0_Q_IDX, q_idx);
120 txd[0] = cpu_to_le32(val);
122 val = MT_TXD1_LONG_FORMAT |
123 FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD) |
124 FIELD_PREP(MT_TXD1_PKT_FMT, pkt_fmt);
125 txd[1] = cpu_to_le32(val);
127 if (cmd & MCU_UNI_PREFIX) {
128 uni_txd = (struct mt7615_uni_txd *)txd;
129 uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
130 uni_txd->option = MCU_CMD_UNI_EXT_ACK;
131 uni_txd->cid = cpu_to_le16(mcu_cmd);
132 uni_txd->s2d_index = MCU_S2D_H2N;
133 uni_txd->pkt_type = MCU_PKT_ID;
139 mcu_txd = (struct mt7615_mcu_txd *)txd;
140 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
141 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU, q_idx));
142 mcu_txd->s2d_index = MCU_S2D_H2N;
143 mcu_txd->pkt_type = MCU_PKT_ID;
146 switch (cmd & ~MCU_CMD_MASK) {
148 mcu_txd->set_query = MCU_Q_NA;
149 mcu_txd->cid = mcu_cmd;
152 if (cmd & MCU_QUERY_MASK)
153 mcu_txd->set_query = MCU_Q_QUERY;
155 mcu_txd->set_query = MCU_Q_SET;
156 mcu_txd->cid = mcu_cmd;
159 mcu_txd->cid = MCU_CMD_EXT_CID;
160 if (cmd & MCU_QUERY_PREFIX)
161 mcu_txd->set_query = MCU_Q_QUERY;
163 mcu_txd->set_query = MCU_Q_SET;
164 mcu_txd->ext_cid = mcu_cmd;
165 mcu_txd->ext_cid_ack = 1;
169 EXPORT_SYMBOL_GPL(mt7615_mcu_fill_msg);
171 int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd,
172 struct sk_buff *skb, int seq)
174 struct mt7615_mcu_rxd *rxd;
178 dev_err(mdev->dev, "Message %ld (seq %d) timeout\n",
179 cmd & MCU_CMD_MASK, seq);
183 rxd = (struct mt7615_mcu_rxd *)skb->data;
188 case MCU_CMD_PATCH_SEM_CONTROL:
189 skb_pull(skb, sizeof(*rxd) - 4);
192 case MCU_EXT_CMD_GET_TEMP:
193 skb_pull(skb, sizeof(*rxd));
194 ret = le32_to_cpu(*(__le32 *)skb->data);
196 case MCU_EXT_CMD_RF_REG_ACCESS | MCU_QUERY_PREFIX:
197 skb_pull(skb, sizeof(*rxd));
198 ret = le32_to_cpu(*(__le32 *)&skb->data[8]);
200 case MCU_UNI_CMD_DEV_INFO_UPDATE:
201 case MCU_UNI_CMD_BSS_INFO_UPDATE:
202 case MCU_UNI_CMD_STA_REC_UPDATE:
203 case MCU_UNI_CMD_HIF_CTRL:
204 case MCU_UNI_CMD_OFFLOAD:
205 case MCU_UNI_CMD_SUSPEND: {
206 struct mt7615_mcu_uni_event *event;
208 skb_pull(skb, sizeof(*rxd));
209 event = (struct mt7615_mcu_uni_event *)skb->data;
210 ret = le32_to_cpu(event->status);
213 case MCU_CMD_REG_READ: {
214 struct mt7615_mcu_reg_event *event;
216 skb_pull(skb, sizeof(*rxd));
217 event = (struct mt7615_mcu_reg_event *)skb->data;
218 ret = (int)le32_to_cpu(event->val);
227 EXPORT_SYMBOL_GPL(mt7615_mcu_parse_response);
230 mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
233 struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
234 enum mt76_txq_id qid;
236 mt7615_mcu_fill_msg(dev, skb, cmd, seq);
237 if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
242 return mt76_tx_queue_skb_raw(dev, qid, skb, 0);
245 u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg)
252 .wifi_stream = cpu_to_le32(wf),
253 .address = cpu_to_le32(reg),
256 return mt76_mcu_send_msg(&dev->mt76,
257 MCU_EXT_CMD_RF_REG_ACCESS | MCU_QUERY_PREFIX,
258 &req, sizeof(req), true);
261 int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val)
268 .wifi_stream = cpu_to_le32(wf),
269 .address = cpu_to_le32(reg),
270 .data = cpu_to_le32(val),
273 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_RF_REG_ACCESS, &req,
277 static void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en)
279 if (!is_mt7622(&dev->mt76))
282 regmap_update_bits(dev->infracfg, MT_INFRACFG_MISC,
283 MT_INFRACFG_MISC_AP2CONN_WAKE,
284 !en * MT_INFRACFG_MISC_AP2CONN_WAKE);
287 static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev)
289 struct mt76_phy *mphy = &dev->mt76.phy;
290 struct mt76_dev *mdev = &dev->mt76;
294 addr = is_mt7663(mdev) ? MT_PCIE_DOORBELL_PUSH : MT_CFG_LPCR_HOST;
295 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_DRV_OWN);
297 mt7622_trigger_hif_int(dev, true);
299 addr = is_mt7663(mdev) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
300 err = !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);
302 mt7622_trigger_hif_int(dev, false);
305 dev_err(mdev->dev, "driver own failed\n");
309 clear_bit(MT76_STATE_PM, &mphy->state);
314 static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev)
316 struct mt76_phy *mphy = &dev->mt76.phy;
319 if (!test_and_clear_bit(MT76_STATE_PM, &mphy->state))
322 for (i = 0; i < MT7615_DRV_OWN_RETRY_COUNT; i++) {
323 mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
324 if (mt76_poll_msec(dev, MT_CONN_HIF_ON_LPCTL,
325 MT_CFG_LPCR_HOST_FW_OWN, 0, 50))
329 if (i == MT7615_DRV_OWN_RETRY_COUNT) {
330 dev_err(dev->mt76.dev, "driver own failed\n");
331 set_bit(MT76_STATE_PM, &mphy->state);
336 dev->pm.last_activity = jiffies;
341 static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev)
343 struct mt76_phy *mphy = &dev->mt76.phy;
347 if (test_and_set_bit(MT76_STATE_PM, &mphy->state))
350 mt7622_trigger_hif_int(dev, true);
352 addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
353 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN);
355 if (is_mt7622(&dev->mt76) &&
356 !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN,
357 MT_CFG_LPCR_HOST_FW_OWN, 3000)) {
358 dev_err(dev->mt76.dev, "Timeout for firmware own\n");
359 clear_bit(MT76_STATE_PM, &mphy->state);
363 mt7622_trigger_hif_int(dev, false);
369 mt7615_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
372 ieee80211_csa_finish(vif);
376 mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
378 struct mt76_phy *mphy = &dev->mt76.phy;
379 struct mt7615_mcu_rdd_report *r;
381 r = (struct mt7615_mcu_rdd_report *)skb->data;
383 if (r->idx && dev->mt76.phy2)
384 mphy = dev->mt76.phy2;
386 ieee80211_radar_detected(mphy->hw);
391 mt7615_mcu_rx_log_message(struct mt7615_dev *dev, struct sk_buff *skb)
393 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
394 const char *data = (char *)&rxd[1];
397 switch (rxd->s2d_index) {
409 wiphy_info(mt76_hw(dev)->wiphy, "%s: %s", type, data);
413 mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb)
415 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
417 switch (rxd->ext_eid) {
418 case MCU_EXT_EVENT_RDD_REPORT:
419 mt7615_mcu_rx_radar_detected(dev, skb);
421 case MCU_EXT_EVENT_CSA_NOTIFY:
422 ieee80211_iterate_active_interfaces_atomic(dev->mt76.hw,
423 IEEE80211_IFACE_ITER_RESUME_ALL,
424 mt7615_mcu_csa_finish, dev);
426 case MCU_EXT_EVENT_FW_LOG_2_HOST:
427 mt7615_mcu_rx_log_message(dev, skb);
435 mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb)
437 u8 *seq_num = skb->data + sizeof(struct mt7615_mcu_rxd);
438 struct mt7615_phy *phy;
439 struct mt76_phy *mphy;
441 if (*seq_num & BIT(7) && dev->mt76.phy2)
442 mphy = dev->mt76.phy2;
444 mphy = &dev->mt76.phy;
446 phy = (struct mt7615_phy *)mphy->priv;
448 spin_lock_bh(&dev->mt76.lock);
449 __skb_queue_tail(&phy->scan_event_list, skb);
450 spin_unlock_bh(&dev->mt76.lock);
452 ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work,
453 MT7615_HW_SCAN_TIMEOUT);
457 mt7615_mcu_roc_event(struct mt7615_dev *dev, struct sk_buff *skb)
459 struct mt7615_roc_tlv *event;
460 struct mt7615_phy *phy;
461 struct mt76_phy *mphy;
464 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
465 event = (struct mt7615_roc_tlv *)skb->data;
467 if (event->dbdc_band && dev->mt76.phy2)
468 mphy = dev->mt76.phy2;
470 mphy = &dev->mt76.phy;
472 ieee80211_ready_on_channel(mphy->hw);
474 phy = (struct mt7615_phy *)mphy->priv;
475 phy->roc_grant = true;
476 wake_up(&phy->roc_wait);
478 duration = le32_to_cpu(event->max_interval);
479 mod_timer(&phy->roc_timer,
480 round_jiffies_up(jiffies + msecs_to_jiffies(duration)));
484 mt7615_mcu_beacon_loss_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
486 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
487 struct mt7615_beacon_loss_event *event = priv;
489 if (mvif->idx != event->bss_idx)
492 if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
495 ieee80211_beacon_loss(vif);
499 mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb)
501 struct mt7615_beacon_loss_event *event;
502 struct mt76_phy *mphy;
503 u8 band_idx = 0; /* DBDC support */
505 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
506 event = (struct mt7615_beacon_loss_event *)skb->data;
507 if (band_idx && dev->mt76.phy2)
508 mphy = dev->mt76.phy2;
510 mphy = &dev->mt76.phy;
512 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
513 IEEE80211_IFACE_ITER_RESUME_ALL,
514 mt7615_mcu_beacon_loss_iter, event);
518 mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb)
520 struct mt7615_mcu_bss_event *event;
521 struct mt76_phy *mphy;
522 u8 band_idx = 0; /* DBDC support */
524 event = (struct mt7615_mcu_bss_event *)(skb->data +
525 sizeof(struct mt7615_mcu_rxd));
527 if (band_idx && dev->mt76.phy2)
528 mphy = dev->mt76.phy2;
530 mphy = &dev->mt76.phy;
532 if (event->is_absent)
533 ieee80211_stop_queues(mphy->hw);
535 ieee80211_wake_queues(mphy->hw);
539 mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb)
541 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
545 mt7615_mcu_rx_ext_event(dev, skb);
547 case MCU_EVENT_BSS_BEACON_LOSS:
548 mt7615_mcu_beacon_loss_event(dev, skb);
551 mt7615_mcu_roc_event(dev, skb);
553 case MCU_EVENT_SCHED_SCAN_DONE:
554 case MCU_EVENT_SCAN_DONE:
555 mt7615_mcu_scan_event(dev, skb);
557 case MCU_EVENT_BSS_ABSENCE:
558 mt7615_mcu_bss_event(dev, skb);
566 void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb)
568 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
570 if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
571 rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
572 rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
573 rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
574 rxd->eid == MCU_EVENT_BSS_BEACON_LOSS ||
575 rxd->eid == MCU_EVENT_SCHED_SCAN_DONE ||
576 rxd->eid == MCU_EVENT_BSS_ABSENCE ||
577 rxd->eid == MCU_EVENT_SCAN_DONE ||
578 rxd->eid == MCU_EVENT_ROC ||
580 mt7615_mcu_rx_unsolicited_event(dev, skb);
582 mt76_mcu_rx_event(&dev->mt76, skb);
585 static int mt7615_mcu_init_download(struct mt7615_dev *dev, u32 addr,
593 .addr = cpu_to_le32(addr),
594 .len = cpu_to_le32(len),
595 .mode = cpu_to_le32(mode),
598 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_TARGET_ADDRESS_LEN_REQ,
599 &req, sizeof(req), true);
603 mt7615_mcu_add_dev(struct mt7615_dev *dev, struct ieee80211_vif *vif,
606 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
620 u8 omac_addr[ETH_ALEN];
624 .omac_idx = mvif->omac_idx,
625 .band_idx = mvif->band_idx,
626 .tlv_num = cpu_to_le16(1),
630 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
631 .len = cpu_to_le16(sizeof(struct req_tlv)),
633 .band_idx = mvif->band_idx,
637 memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
638 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_DEV_INFO_UPDATE,
639 &data, sizeof(data), true);
643 mt7615_mcu_add_beacon_offload(struct mt7615_dev *dev,
644 struct ieee80211_hw *hw,
645 struct ieee80211_vif *vif, bool enable)
647 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
648 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
649 struct ieee80211_mutable_offsets offs;
650 struct ieee80211_tx_info *info;
657 u8 need_pre_tbtt_int;
663 /* bss color change */
667 .omac_idx = mvif->omac_idx,
669 .wlan_idx = wcid->idx,
670 .band_idx = mvif->band_idx,
674 skb = ieee80211_beacon_get_template(hw, vif, &offs);
678 if (skb->len > 512 - MT_TXD_SIZE) {
679 dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
684 if (mvif->band_idx) {
685 info = IEEE80211_SKB_CB(skb);
686 info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
689 mt7615_mac_write_txwi(dev, (__le32 *)(req.pkt), skb, wcid, NULL,
691 memcpy(req.pkt + MT_TXD_SIZE, skb->data, skb->len);
692 req.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
693 req.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
694 if (offs.cntdwn_counter_offs[0]) {
697 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
698 req.csa_ie_pos = cpu_to_le16(csa_offs);
699 req.csa_cnt = skb->data[offs.cntdwn_counter_offs[0]];
703 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_BCN_OFFLOAD, &req,
708 mt7615_mcu_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
710 #define ENTER_PM_STATE 1
711 #define EXIT_PM_STATE 2
730 .pm_state = state ? ENTER_PM_STATE : EXIT_PM_STATE,
734 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_PM_STATE_CTRL, &req,
738 static struct sk_buff *
739 mt7615_mcu_alloc_sta_req(struct mt7615_dev *dev, struct mt7615_vif *mvif,
740 struct mt7615_sta *msta)
742 struct sta_req_hdr hdr = {
743 .bss_idx = mvif->idx,
744 .wlan_idx = msta ? msta->wcid.idx : 0,
745 .muar_idx = msta ? mvif->omac_idx : 0,
750 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, MT7615_STA_UPDATE_MAX_SIZE);
752 return ERR_PTR(-ENOMEM);
754 skb_put_data(skb, &hdr, sizeof(hdr));
759 static struct wtbl_req_hdr *
760 mt7615_mcu_alloc_wtbl_req(struct mt7615_dev *dev, struct mt7615_sta *msta,
761 int cmd, void *sta_wtbl, struct sk_buff **skb)
763 struct tlv *sta_hdr = sta_wtbl;
764 struct wtbl_req_hdr hdr = {
765 .wlan_idx = msta->wcid.idx,
768 struct sk_buff *nskb = *skb;
771 nskb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
772 MT7615_WTBL_UPDATE_BA_SIZE);
774 return ERR_PTR(-ENOMEM);
780 sta_hdr->len = cpu_to_le16(sizeof(hdr));
782 return skb_put_data(nskb, &hdr, sizeof(hdr));
786 mt7615_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len,
787 void *sta_ntlv, void *sta_wtbl)
789 struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv;
790 struct tlv *sta_hdr = sta_wtbl;
791 struct tlv *ptlv, tlv = {
792 .tag = cpu_to_le16(tag),
793 .len = cpu_to_le16(len),
797 ptlv = skb_put(skb, len);
798 memcpy(ptlv, &tlv, sizeof(tlv));
800 ntlv = le16_to_cpu(ntlv_hdr->tlv_num);
801 ntlv_hdr->tlv_num = cpu_to_le16(ntlv + 1);
804 u16 size = le16_to_cpu(sta_hdr->len);
806 sta_hdr->len = cpu_to_le16(size + len);
813 mt7615_mcu_add_tlv(struct sk_buff *skb, int tag, int len)
815 return mt7615_mcu_add_nested_tlv(skb, tag, len, skb->data, NULL);
819 mt7615_mcu_bss_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
820 struct ieee80211_sta *sta, bool enable)
822 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
823 u32 type = vif->p2p ? NETWORK_P2P : NETWORK_INFRA;
824 struct bss_info_basic *bss;
825 u8 wlan_idx = mvif->sta.wcid.idx;
828 tlv = mt7615_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
831 case NL80211_IFTYPE_MESH_POINT:
832 case NL80211_IFTYPE_AP:
834 case NL80211_IFTYPE_STATION:
835 /* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */
837 struct mt7615_sta *msta;
839 msta = (struct mt7615_sta *)sta->drv_priv;
840 wlan_idx = msta->wcid.idx;
843 case NL80211_IFTYPE_ADHOC:
851 bss = (struct bss_info_basic *)tlv;
852 memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
853 bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
854 bss->network_type = cpu_to_le32(type);
855 bss->dtim_period = vif->bss_conf.dtim_period;
856 bss->bmc_tx_wlan_idx = wlan_idx;
857 bss->wmm_idx = mvif->wmm_idx;
858 bss->active = enable;
864 mt7615_mcu_bss_omac_tlv(struct sk_buff *skb, struct ieee80211_vif *vif)
866 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
867 struct bss_info_omac *omac;
872 tlv = mt7615_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
875 case NL80211_IFTYPE_MESH_POINT:
876 case NL80211_IFTYPE_AP:
878 type = CONNECTION_P2P_GO;
880 type = CONNECTION_INFRA_AP;
882 case NL80211_IFTYPE_STATION:
884 type = CONNECTION_P2P_GC;
886 type = CONNECTION_INFRA_STA;
888 case NL80211_IFTYPE_ADHOC:
889 type = CONNECTION_IBSS_ADHOC;
896 omac = (struct bss_info_omac *)tlv;
897 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
898 omac->conn_type = cpu_to_le32(type);
899 omac->omac_idx = mvif->omac_idx;
900 omac->band_idx = mvif->band_idx;
901 omac->hw_bss_idx = idx;
904 /* SIFS 20us + 512 byte beacon tranmitted by 1Mbps (3906us) */
905 #define BCN_TX_ESTIMATE_TIME (4096 + 20)
907 mt7615_mcu_bss_ext_tlv(struct sk_buff *skb, struct mt7615_vif *mvif)
909 struct bss_info_ext_bss *ext;
910 int ext_bss_idx, tsf_offset;
913 ext_bss_idx = mvif->omac_idx - EXT_BSSID_START;
917 tlv = mt7615_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
919 ext = (struct bss_info_ext_bss *)tlv;
920 tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
921 ext->mbss_tsf_offset = cpu_to_le32(tsf_offset);
925 mt7615_mcu_sta_ba_tlv(struct sk_buff *skb,
926 struct ieee80211_ampdu_params *params,
927 bool enable, bool tx)
929 struct sta_rec_ba *ba;
932 tlv = mt7615_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
934 ba = (struct sta_rec_ba *)tlv;
935 ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT,
936 ba->winsize = cpu_to_le16(params->buf_size);
937 ba->ssn = cpu_to_le16(params->ssn);
938 ba->ba_en = enable << params->tid;
939 ba->amsdu = params->amsdu;
940 ba->tid = params->tid;
944 mt7615_mcu_sta_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
945 struct ieee80211_sta *sta, bool enable)
947 struct sta_rec_basic *basic;
951 tlv = mt7615_mcu_add_tlv(skb, STA_REC_BASIC, sizeof(*basic));
953 basic = (struct sta_rec_basic *)tlv;
954 basic->extra_info = cpu_to_le16(EXTRA_INFO_VER);
957 basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
958 basic->conn_state = CONN_STATE_PORT_SECURE;
960 basic->conn_state = CONN_STATE_DISCONNECT;
964 basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
965 eth_broadcast_addr(basic->peer_addr);
970 case NL80211_IFTYPE_MESH_POINT:
971 case NL80211_IFTYPE_AP:
973 conn_type = CONNECTION_P2P_GC;
975 conn_type = CONNECTION_INFRA_STA;
976 basic->conn_type = cpu_to_le32(conn_type);
977 basic->aid = cpu_to_le16(sta->aid);
979 case NL80211_IFTYPE_STATION:
981 conn_type = CONNECTION_P2P_GO;
983 conn_type = CONNECTION_INFRA_AP;
984 basic->conn_type = cpu_to_le32(conn_type);
985 basic->aid = cpu_to_le16(vif->bss_conf.aid);
987 case NL80211_IFTYPE_ADHOC:
988 basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
989 basic->aid = cpu_to_le16(sta->aid);
996 memcpy(basic->peer_addr, sta->addr, ETH_ALEN);
997 basic->qos = sta->wme;
1001 mt7615_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1005 if (sta->ht_cap.ht_supported) {
1006 struct sta_rec_ht *ht;
1008 tlv = mt7615_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
1009 ht = (struct sta_rec_ht *)tlv;
1010 ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
1012 if (sta->vht_cap.vht_supported) {
1013 struct sta_rec_vht *vht;
1015 tlv = mt7615_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
1016 vht = (struct sta_rec_vht *)tlv;
1017 vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
1018 vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
1019 vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
1024 mt7615_mcu_sta_uapsd(struct sk_buff *skb, struct ieee80211_vif *vif,
1025 struct ieee80211_sta *sta)
1027 struct sta_rec_uapsd *uapsd;
1030 if (vif->type != NL80211_IFTYPE_AP || !sta->wme)
1033 tlv = mt7615_mcu_add_tlv(skb, STA_REC_APPS, sizeof(*uapsd));
1034 uapsd = (struct sta_rec_uapsd *)tlv;
1036 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) {
1037 uapsd->dac_map |= BIT(3);
1038 uapsd->tac_map |= BIT(3);
1040 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) {
1041 uapsd->dac_map |= BIT(2);
1042 uapsd->tac_map |= BIT(2);
1044 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) {
1045 uapsd->dac_map |= BIT(1);
1046 uapsd->tac_map |= BIT(1);
1048 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) {
1049 uapsd->dac_map |= BIT(0);
1050 uapsd->tac_map |= BIT(0);
1052 uapsd->max_sp = sta->max_sp;
1056 mt7615_mcu_wtbl_ba_tlv(struct sk_buff *skb,
1057 struct ieee80211_ampdu_params *params,
1058 bool enable, bool tx, void *sta_wtbl,
1064 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_BA, sizeof(*ba),
1065 wtbl_tlv, sta_wtbl);
1067 ba = (struct wtbl_ba *)tlv;
1068 ba->tid = params->tid;
1071 ba->ba_type = MT_BA_TYPE_ORIGINATOR;
1072 ba->sn = enable ? cpu_to_le16(params->ssn) : 0;
1073 ba->ba_winsize = cpu_to_le16(params->buf_size);
1076 memcpy(ba->peer_addr, params->sta->addr, ETH_ALEN);
1077 ba->ba_type = MT_BA_TYPE_RECIPIENT;
1078 ba->rst_ba_tid = params->tid;
1079 ba->rst_ba_sel = RST_BA_MAC_TID_MATCH;
1084 u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 };
1087 for (i = 7; i > 0; i--) {
1088 if (params->buf_size >= ba_range[i])
1091 ba->ba_winsize_idx = i;
1096 mt7615_mcu_wtbl_generic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
1097 struct ieee80211_sta *sta, void *sta_wtbl,
1100 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1101 struct wtbl_generic *generic;
1103 struct wtbl_spe *spe;
1106 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_GENERIC, sizeof(*generic),
1107 wtbl_tlv, sta_wtbl);
1109 generic = (struct wtbl_generic *)tlv;
1112 if (vif->type == NL80211_IFTYPE_STATION)
1113 generic->partial_aid = cpu_to_le16(vif->bss_conf.aid);
1115 generic->partial_aid = cpu_to_le16(sta->aid);
1116 memcpy(generic->peer_addr, sta->addr, ETH_ALEN);
1117 generic->muar_idx = mvif->omac_idx;
1118 generic->qos = sta->wme;
1120 eth_broadcast_addr(generic->peer_addr);
1121 generic->muar_idx = 0xe;
1124 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_RX, sizeof(*rx),
1125 wtbl_tlv, sta_wtbl);
1127 rx = (struct wtbl_rx *)tlv;
1128 rx->rca1 = sta ? vif->type != NL80211_IFTYPE_AP : 1;
1132 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_SPE, sizeof(*spe),
1133 wtbl_tlv, sta_wtbl);
1134 spe = (struct wtbl_spe *)tlv;
1139 mt7615_mcu_wtbl_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
1140 void *sta_wtbl, void *wtbl_tlv)
1143 struct wtbl_ht *ht = NULL;
1146 if (sta->ht_cap.ht_supported) {
1147 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
1148 wtbl_tlv, sta_wtbl);
1149 ht = (struct wtbl_ht *)tlv;
1150 ht->ldpc = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
1151 ht->af = sta->ht_cap.ampdu_factor;
1152 ht->mm = sta->ht_cap.ampdu_density;
1155 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
1156 flags |= MT_WTBL_W5_SHORT_GI_20;
1157 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
1158 flags |= MT_WTBL_W5_SHORT_GI_40;
1161 if (sta->vht_cap.vht_supported) {
1162 struct wtbl_vht *vht;
1165 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_VHT, sizeof(*vht),
1166 wtbl_tlv, sta_wtbl);
1167 vht = (struct wtbl_vht *)tlv;
1168 vht->ldpc = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
1171 af = (sta->vht_cap.cap &
1172 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1173 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1176 ht->af = max(ht->af, af);
1178 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
1179 flags |= MT_WTBL_W5_SHORT_GI_80;
1180 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
1181 flags |= MT_WTBL_W5_SHORT_GI_160;
1185 if (sta->smps_mode == IEEE80211_SMPS_DYNAMIC) {
1186 struct wtbl_smps *smps;
1188 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps),
1189 wtbl_tlv, sta_wtbl);
1190 smps = (struct wtbl_smps *)tlv;
1194 if (sta->ht_cap.ht_supported) {
1196 u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 |
1197 MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160;
1198 struct wtbl_raw *raw;
1200 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_RAW_DATA,
1201 sizeof(*raw), wtbl_tlv,
1203 raw = (struct wtbl_raw *)tlv;
1204 raw->val = cpu_to_le32(flags);
1205 raw->msk = cpu_to_le32(~msk);
1212 mt7615_mcu_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1213 struct ieee80211_sta *sta, bool enable)
1215 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1216 struct mt7615_dev *dev = phy->dev;
1217 struct sk_buff *skb;
1219 skb = mt7615_mcu_alloc_sta_req(dev, mvif, NULL);
1221 return PTR_ERR(skb);
1224 mt7615_mcu_bss_omac_tlv(skb, vif);
1226 mt7615_mcu_bss_basic_tlv(skb, vif, sta, enable);
1228 if (enable && mvif->omac_idx > EXT_BSSID_START)
1229 mt7615_mcu_bss_ext_tlv(skb, mvif);
1231 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1232 MCU_EXT_CMD_BSS_INFO_UPDATE, true);
1236 mt7615_mcu_wtbl_tx_ba(struct mt7615_dev *dev,
1237 struct ieee80211_ampdu_params *params,
1240 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1241 struct mt7615_vif *mvif = msta->vif;
1242 struct wtbl_req_hdr *wtbl_hdr;
1243 struct sk_buff *skb = NULL;
1246 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, NULL, &skb);
1247 if (IS_ERR(wtbl_hdr))
1248 return PTR_ERR(wtbl_hdr);
1250 mt7615_mcu_wtbl_ba_tlv(skb, params, enable, true, NULL, wtbl_hdr);
1252 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD_WTBL_UPDATE,
1257 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1259 return PTR_ERR(skb);
1261 mt7615_mcu_sta_ba_tlv(skb, params, enable, true);
1263 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1264 MCU_EXT_CMD_STA_REC_UPDATE, true);
1268 mt7615_mcu_wtbl_rx_ba(struct mt7615_dev *dev,
1269 struct ieee80211_ampdu_params *params,
1272 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1273 struct mt7615_vif *mvif = msta->vif;
1274 struct wtbl_req_hdr *wtbl_hdr;
1275 struct sk_buff *skb;
1278 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1280 return PTR_ERR(skb);
1282 mt7615_mcu_sta_ba_tlv(skb, params, enable, false);
1284 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1285 MCU_EXT_CMD_STA_REC_UPDATE, true);
1286 if (err < 0 || !enable)
1290 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, NULL, &skb);
1291 if (IS_ERR(wtbl_hdr))
1292 return PTR_ERR(wtbl_hdr);
1294 mt7615_mcu_wtbl_ba_tlv(skb, params, enable, false, NULL, wtbl_hdr);
1296 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD_WTBL_UPDATE,
1301 mt7615_mcu_wtbl_sta_add(struct mt7615_dev *dev, struct ieee80211_vif *vif,
1302 struct ieee80211_sta *sta, bool enable)
1304 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1305 struct sk_buff *skb, *sskb, *wskb = NULL;
1306 struct wtbl_req_hdr *wtbl_hdr;
1307 struct mt7615_sta *msta;
1310 msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
1312 sskb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1314 return PTR_ERR(sskb);
1316 mt7615_mcu_sta_basic_tlv(sskb, vif, sta, enable);
1317 if (enable && sta) {
1318 mt7615_mcu_sta_ht_tlv(sskb, sta);
1319 mt7615_mcu_sta_uapsd(sskb, vif, sta);
1322 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_RESET_AND_SET,
1324 if (IS_ERR(wtbl_hdr))
1325 return PTR_ERR(wtbl_hdr);
1328 mt7615_mcu_wtbl_generic_tlv(wskb, vif, sta, NULL, wtbl_hdr);
1330 mt7615_mcu_wtbl_ht_tlv(wskb, sta, NULL, wtbl_hdr);
1333 cmd = enable ? MCU_EXT_CMD_WTBL_UPDATE : MCU_EXT_CMD_STA_REC_UPDATE;
1334 skb = enable ? wskb : sskb;
1336 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
1338 skb = enable ? sskb : wskb;
1344 cmd = enable ? MCU_EXT_CMD_STA_REC_UPDATE : MCU_EXT_CMD_WTBL_UPDATE;
1345 skb = enable ? sskb : wskb;
1347 return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
1350 static const struct mt7615_mcu_ops wtbl_update_ops = {
1351 .add_beacon_offload = mt7615_mcu_add_beacon_offload,
1352 .set_pm_state = mt7615_mcu_ctrl_pm_state,
1353 .add_dev_info = mt7615_mcu_add_dev,
1354 .add_bss_info = mt7615_mcu_add_bss,
1355 .add_tx_ba = mt7615_mcu_wtbl_tx_ba,
1356 .add_rx_ba = mt7615_mcu_wtbl_rx_ba,
1357 .sta_add = mt7615_mcu_wtbl_sta_add,
1358 .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
1359 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1363 mt7615_mcu_sta_ba(struct mt7615_dev *dev,
1364 struct ieee80211_ampdu_params *params,
1365 bool enable, bool tx)
1367 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1368 struct mt7615_vif *mvif = msta->vif;
1369 struct wtbl_req_hdr *wtbl_hdr;
1370 struct tlv *sta_wtbl;
1371 struct sk_buff *skb;
1373 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1375 return PTR_ERR(skb);
1377 mt7615_mcu_sta_ba_tlv(skb, params, enable, tx);
1379 sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1381 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
1383 mt7615_mcu_wtbl_ba_tlv(skb, params, enable, tx, sta_wtbl, wtbl_hdr);
1385 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1386 MCU_EXT_CMD_STA_REC_UPDATE, true);
1390 mt7615_mcu_sta_tx_ba(struct mt7615_dev *dev,
1391 struct ieee80211_ampdu_params *params,
1394 return mt7615_mcu_sta_ba(dev, params, enable, true);
1398 mt7615_mcu_sta_rx_ba(struct mt7615_dev *dev,
1399 struct ieee80211_ampdu_params *params,
1402 return mt7615_mcu_sta_ba(dev, params, enable, false);
1406 mt7615_mcu_add_sta_cmd(struct mt7615_dev *dev, struct ieee80211_vif *vif,
1407 struct ieee80211_sta *sta, bool enable, int cmd)
1409 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1410 struct wtbl_req_hdr *wtbl_hdr;
1411 struct mt7615_sta *msta;
1412 struct tlv *sta_wtbl;
1413 struct sk_buff *skb;
1415 msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
1417 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1419 return PTR_ERR(skb);
1421 mt7615_mcu_sta_basic_tlv(skb, vif, sta, enable);
1422 if (enable && sta) {
1423 mt7615_mcu_sta_ht_tlv(skb, sta);
1424 mt7615_mcu_sta_uapsd(skb, vif, sta);
1427 sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1429 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_RESET_AND_SET,
1432 mt7615_mcu_wtbl_generic_tlv(skb, vif, sta, sta_wtbl, wtbl_hdr);
1434 mt7615_mcu_wtbl_ht_tlv(skb, sta, sta_wtbl, wtbl_hdr);
1437 return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
1441 mt7615_mcu_add_sta(struct mt7615_dev *dev, struct ieee80211_vif *vif,
1442 struct ieee80211_sta *sta, bool enable)
1444 return mt7615_mcu_add_sta_cmd(dev, vif, sta, enable,
1445 MCU_EXT_CMD_STA_REC_UPDATE);
1448 static const struct mt7615_mcu_ops sta_update_ops = {
1449 .add_beacon_offload = mt7615_mcu_add_beacon_offload,
1450 .set_pm_state = mt7615_mcu_ctrl_pm_state,
1451 .add_dev_info = mt7615_mcu_add_dev,
1452 .add_bss_info = mt7615_mcu_add_bss,
1453 .add_tx_ba = mt7615_mcu_sta_tx_ba,
1454 .add_rx_ba = mt7615_mcu_sta_rx_ba,
1455 .sta_add = mt7615_mcu_add_sta,
1456 .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
1457 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1461 mt7615_mcu_uni_add_dev(struct mt7615_dev *dev,
1462 struct ieee80211_vif *vif, bool enable)
1464 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1476 u8 omac_addr[ETH_ALEN];
1480 .omac_idx = mvif->omac_idx,
1481 .band_idx = mvif->band_idx,
1484 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
1485 .len = cpu_to_le16(sizeof(struct req_tlv)),
1494 struct mt7615_bss_basic_tlv basic;
1497 .bss_idx = mvif->idx,
1500 .tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
1501 .len = cpu_to_le16(sizeof(struct mt7615_bss_basic_tlv)),
1502 .omac_idx = mvif->omac_idx,
1503 .band_idx = mvif->band_idx,
1504 .wmm_idx = mvif->wmm_idx,
1506 .bmc_tx_wlan_idx = cpu_to_le16(mvif->sta.wcid.idx),
1507 .sta_idx = cpu_to_le16(mvif->sta.wcid.idx),
1511 int err, idx, cmd, len;
1514 switch (vif->type) {
1515 case NL80211_IFTYPE_MESH_POINT:
1516 case NL80211_IFTYPE_AP:
1517 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
1519 case NL80211_IFTYPE_STATION:
1520 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
1522 case NL80211_IFTYPE_ADHOC:
1523 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1530 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
1531 basic_req.basic.hw_bss_idx = idx;
1533 memcpy(dev_req.tlv.omac_addr, vif->addr, ETH_ALEN);
1535 cmd = enable ? MCU_UNI_CMD_DEV_INFO_UPDATE : MCU_UNI_CMD_BSS_INFO_UPDATE;
1536 data = enable ? (void *)&dev_req : (void *)&basic_req;
1537 len = enable ? sizeof(dev_req) : sizeof(basic_req);
1539 err = mt76_mcu_send_msg(&dev->mt76, cmd, data, len, true);
1543 cmd = enable ? MCU_UNI_CMD_BSS_INFO_UPDATE : MCU_UNI_CMD_DEV_INFO_UPDATE;
1544 data = enable ? (void *)&basic_req : (void *)&dev_req;
1545 len = enable ? sizeof(basic_req) : sizeof(dev_req);
1547 return mt76_mcu_send_msg(&dev->mt76, cmd, data, len, true);
1551 mt7615_mcu_uni_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
1557 mt7615_mcu_uni_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1558 struct ieee80211_sta *sta, bool enable)
1560 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1561 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
1562 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
1563 struct mt7615_dev *dev = phy->dev;
1569 struct mt7615_bss_basic_tlv basic;
1570 struct mt7615_bss_qos_tlv qos;
1573 .bss_idx = mvif->idx,
1576 .tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
1577 .len = cpu_to_le16(sizeof(struct mt7615_bss_basic_tlv)),
1578 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
1579 .dtim_period = vif->bss_conf.dtim_period,
1580 .omac_idx = mvif->omac_idx,
1581 .band_idx = mvif->band_idx,
1582 .wmm_idx = mvif->wmm_idx,
1583 .active = true, /* keep bss deactivated */
1587 .tag = cpu_to_le16(UNI_BSS_INFO_QBSS),
1588 .len = cpu_to_le16(sizeof(struct mt7615_bss_qos_tlv)),
1589 .qos = vif->bss_conf.qos,
1611 } __packed rlm_req = {
1613 .bss_idx = mvif->idx,
1616 .tag = cpu_to_le16(UNI_BSS_INFO_RLM),
1617 .len = cpu_to_le16(sizeof(struct rlm_tlv)),
1618 .control_channel = chandef->chan->hw_value,
1619 .center_chan = ieee80211_frequency_to_channel(freq1),
1620 .center_chan2 = ieee80211_frequency_to_channel(freq2),
1621 .tx_streams = hweight8(phy->mt76->antenna_mask),
1622 .rx_streams = phy->chainmask,
1629 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
1630 basic_req.basic.hw_bss_idx = idx;
1632 switch (vif->type) {
1633 case NL80211_IFTYPE_MESH_POINT:
1634 case NL80211_IFTYPE_AP:
1636 conn_type = CONNECTION_P2P_GO;
1638 conn_type = CONNECTION_INFRA_AP;
1639 basic_req.basic.conn_type = cpu_to_le32(conn_type);
1641 case NL80211_IFTYPE_STATION:
1643 conn_type = CONNECTION_P2P_GC;
1645 conn_type = CONNECTION_INFRA_STA;
1646 basic_req.basic.conn_type = cpu_to_le32(conn_type);
1648 case NL80211_IFTYPE_ADHOC:
1649 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1656 memcpy(basic_req.basic.bssid, vif->bss_conf.bssid, ETH_ALEN);
1657 basic_req.basic.bmc_tx_wlan_idx = cpu_to_le16(mvif->sta.wcid.idx);
1658 basic_req.basic.sta_idx = cpu_to_le16(mvif->sta.wcid.idx);
1659 basic_req.basic.conn_state = !enable;
1661 err = mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
1662 &basic_req, sizeof(basic_req), true);
1666 switch (chandef->width) {
1667 case NL80211_CHAN_WIDTH_40:
1668 rlm_req.rlm.bw = CMD_CBW_40MHZ;
1670 case NL80211_CHAN_WIDTH_80:
1671 rlm_req.rlm.bw = CMD_CBW_80MHZ;
1673 case NL80211_CHAN_WIDTH_80P80:
1674 rlm_req.rlm.bw = CMD_CBW_8080MHZ;
1676 case NL80211_CHAN_WIDTH_160:
1677 rlm_req.rlm.bw = CMD_CBW_160MHZ;
1679 case NL80211_CHAN_WIDTH_5:
1680 rlm_req.rlm.bw = CMD_CBW_5MHZ;
1682 case NL80211_CHAN_WIDTH_10:
1683 rlm_req.rlm.bw = CMD_CBW_10MHZ;
1685 case NL80211_CHAN_WIDTH_20_NOHT:
1686 case NL80211_CHAN_WIDTH_20:
1688 rlm_req.rlm.bw = CMD_CBW_20MHZ;
1692 if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan)
1693 rlm_req.rlm.sco = 1; /* SCA */
1694 else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan)
1695 rlm_req.rlm.sco = 3; /* SCB */
1697 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
1698 &rlm_req, sizeof(rlm_req), true);
1702 mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev,
1703 struct ieee80211_hw *hw,
1704 struct ieee80211_vif *vif,
1707 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1708 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1709 struct ieee80211_mutable_offsets offs;
1715 struct bcn_content_tlv {
1721 /* 0: enable beacon offload
1722 * 1: disable beacon offload
1723 * 2: update probe respond offload
1726 /* 0: legacy format (TXD + payload)
1727 * 1: only cap field IE
1732 } __packed beacon_tlv;
1735 .bss_idx = mvif->idx,
1738 .tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
1739 .len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
1743 struct sk_buff *skb;
1745 skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs);
1749 if (skb->len > 512 - MT_TXD_SIZE) {
1750 dev_err(dev->mt76.dev, "beacon size limit exceed\n");
1755 mt7615_mac_write_txwi(dev, (__le32 *)(req.beacon_tlv.pkt), skb,
1756 wcid, NULL, 0, NULL, true);
1757 memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
1758 req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
1759 req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
1761 if (offs.cntdwn_counter_offs[0]) {
1764 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
1765 req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
1769 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
1770 &req, sizeof(req), true);
1774 mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev,
1775 struct ieee80211_ampdu_params *params,
1778 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1779 struct mt7615_vif *mvif = msta->vif;
1780 struct wtbl_req_hdr *wtbl_hdr;
1781 struct tlv *sta_wtbl;
1782 struct sk_buff *skb;
1785 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1787 return PTR_ERR(skb);
1789 sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1791 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
1793 if (IS_ERR(wtbl_hdr))
1794 return PTR_ERR(wtbl_hdr);
1796 mt7615_mcu_wtbl_ba_tlv(skb, params, enable, true, sta_wtbl,
1799 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1800 MCU_UNI_CMD_STA_REC_UPDATE, true);
1804 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1806 return PTR_ERR(skb);
1808 mt7615_mcu_sta_ba_tlv(skb, params, enable, true);
1810 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1811 MCU_UNI_CMD_STA_REC_UPDATE, true);
1815 mt7615_mcu_uni_rx_ba(struct mt7615_dev *dev,
1816 struct ieee80211_ampdu_params *params,
1819 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1820 struct mt7615_vif *mvif = msta->vif;
1821 struct wtbl_req_hdr *wtbl_hdr;
1822 struct tlv *sta_wtbl;
1823 struct sk_buff *skb;
1826 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1828 return PTR_ERR(skb);
1830 mt7615_mcu_sta_ba_tlv(skb, params, enable, false);
1832 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1833 MCU_UNI_CMD_STA_REC_UPDATE, true);
1834 if (err < 0 || !enable)
1837 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1839 return PTR_ERR(skb);
1841 sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1843 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
1845 if (IS_ERR(wtbl_hdr))
1846 return PTR_ERR(wtbl_hdr);
1848 mt7615_mcu_wtbl_ba_tlv(skb, params, enable, false, sta_wtbl,
1851 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1852 MCU_UNI_CMD_STA_REC_UPDATE, true);
1856 mt7615_mcu_uni_add_sta(struct mt7615_dev *dev, struct ieee80211_vif *vif,
1857 struct ieee80211_sta *sta, bool enable)
1859 return mt7615_mcu_add_sta_cmd(dev, vif, sta, enable,
1860 MCU_UNI_CMD_STA_REC_UPDATE);
1863 static const struct mt7615_mcu_ops uni_update_ops = {
1864 .add_beacon_offload = mt7615_mcu_uni_add_beacon_offload,
1865 .set_pm_state = mt7615_mcu_uni_ctrl_pm_state,
1866 .add_dev_info = mt7615_mcu_uni_add_dev,
1867 .add_bss_info = mt7615_mcu_uni_add_bss,
1868 .add_tx_ba = mt7615_mcu_uni_tx_ba,
1869 .add_rx_ba = mt7615_mcu_uni_rx_ba,
1870 .sta_add = mt7615_mcu_uni_add_sta,
1871 .set_drv_ctrl = mt7615_mcu_lp_drv_pmctrl,
1872 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1875 static int mt7615_mcu_send_firmware(struct mt7615_dev *dev, const void *data,
1878 int ret = 0, cur_len;
1881 cur_len = min_t(int, 4096 - dev->mt76.mcu_ops->headroom, len);
1883 ret = mt76_mcu_send_msg(&dev->mt76, MCU_CMD_FW_SCATTER, data,
1891 if (mt76_is_mmio(&dev->mt76))
1892 mt76_queue_tx_cleanup(dev, MT_TXQ_FWDL, false);
1898 static int mt7615_mcu_start_firmware(struct mt7615_dev *dev, u32 addr,
1905 .option = cpu_to_le32(option),
1906 .addr = cpu_to_le32(addr),
1909 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_FW_START_REQ, &req,
1913 int mt7615_mcu_restart(struct mt76_dev *dev)
1915 return mt76_mcu_send_msg(dev, MCU_CMD_RESTART_DL_REQ, NULL, 0, true);
1917 EXPORT_SYMBOL_GPL(mt7615_mcu_restart);
1919 static int mt7615_mcu_patch_sem_ctrl(struct mt7615_dev *dev, bool get)
1924 .op = cpu_to_le32(get ? PATCH_SEM_GET : PATCH_SEM_RELEASE),
1927 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_PATCH_SEM_CONTROL, &req,
1931 static int mt7615_mcu_start_patch(struct mt7615_dev *dev)
1940 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_PATCH_FINISH_REQ, &req,
1944 static int mt7615_load_patch(struct mt7615_dev *dev, u32 addr, const char *name)
1946 const struct mt7615_patch_hdr *hdr;
1947 const struct firmware *fw = NULL;
1950 sem = mt7615_mcu_patch_sem_ctrl(dev, 1);
1954 case PATCH_NOT_DL_SEM_SUCCESS:
1957 dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
1961 ret = firmware_request_nowarn(&fw, name, dev->mt76.dev);
1965 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
1966 dev_err(dev->mt76.dev, "Invalid firmware\n");
1971 hdr = (const struct mt7615_patch_hdr *)(fw->data);
1973 dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
1974 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
1976 len = fw->size - sizeof(*hdr);
1978 ret = mt7615_mcu_init_download(dev, addr, len, DL_MODE_NEED_RSP);
1980 dev_err(dev->mt76.dev, "Download request failed\n");
1984 ret = mt7615_mcu_send_firmware(dev, fw->data + sizeof(*hdr), len);
1986 dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1990 ret = mt7615_mcu_start_patch(dev);
1992 dev_err(dev->mt76.dev, "Failed to start patch\n");
1995 release_firmware(fw);
1997 sem = mt7615_mcu_patch_sem_ctrl(dev, 0);
1999 case PATCH_REL_SEM_SUCCESS:
2003 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
2010 static u32 mt7615_mcu_gen_dl_mode(u8 feature_set, bool is_cr4)
2014 ret |= (feature_set & FW_FEATURE_SET_ENCRYPT) ?
2015 (DL_MODE_ENCRYPT | DL_MODE_RESET_SEC_IV) : 0;
2016 ret |= FIELD_PREP(DL_MODE_KEY_IDX,
2017 FIELD_GET(FW_FEATURE_SET_KEY_IDX, feature_set));
2018 ret |= DL_MODE_NEED_RSP;
2019 ret |= is_cr4 ? DL_MODE_WORKING_PDA_CR4 : 0;
2025 mt7615_mcu_send_ram_firmware(struct mt7615_dev *dev,
2026 const struct mt7615_fw_trailer *hdr,
2027 const u8 *data, bool is_cr4)
2029 int n_region = is_cr4 ? CR4_REGION_NUM : N9_REGION_NUM;
2030 int err, i, offset = 0;
2031 u32 len, addr, mode;
2033 for (i = 0; i < n_region; i++) {
2034 mode = mt7615_mcu_gen_dl_mode(hdr[i].feature_set, is_cr4);
2035 len = le32_to_cpu(hdr[i].len) + IMG_CRC_LEN;
2036 addr = le32_to_cpu(hdr[i].addr);
2038 err = mt7615_mcu_init_download(dev, addr, len, mode);
2040 dev_err(dev->mt76.dev, "Download request failed\n");
2044 err = mt7615_mcu_send_firmware(dev, data + offset, len);
2046 dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
2056 static const struct wiphy_wowlan_support mt7615_wowlan_support = {
2057 .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
2058 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | WIPHY_WOWLAN_NET_DETECT,
2060 .pattern_min_len = 1,
2061 .pattern_max_len = MT7615_WOW_PATTEN_MAX_LEN,
2062 .max_nd_match_sets = 10,
2065 static int mt7615_load_n9(struct mt7615_dev *dev, const char *name)
2067 const struct mt7615_fw_trailer *hdr;
2068 const struct firmware *fw;
2071 ret = request_firmware(&fw, name, dev->mt76.dev);
2075 if (!fw || !fw->data || fw->size < N9_REGION_NUM * sizeof(*hdr)) {
2076 dev_err(dev->mt76.dev, "Invalid firmware\n");
2081 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
2082 N9_REGION_NUM * sizeof(*hdr));
2084 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
2085 hdr->fw_ver, hdr->build_date);
2087 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, false);
2091 ret = mt7615_mcu_start_firmware(dev, le32_to_cpu(hdr->addr),
2094 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
2098 snprintf(dev->mt76.hw->wiphy->fw_version,
2099 sizeof(dev->mt76.hw->wiphy->fw_version),
2100 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2102 if (!is_mt7615(&dev->mt76) &&
2103 !strncmp(hdr->fw_ver, "2.0", sizeof(hdr->fw_ver))) {
2104 dev->fw_ver = MT7615_FIRMWARE_V2;
2105 dev->mcu_ops = &sta_update_ops;
2107 dev->fw_ver = MT7615_FIRMWARE_V1;
2108 dev->mcu_ops = &wtbl_update_ops;
2112 release_firmware(fw);
2116 static int mt7615_load_cr4(struct mt7615_dev *dev, const char *name)
2118 const struct mt7615_fw_trailer *hdr;
2119 const struct firmware *fw;
2122 ret = request_firmware(&fw, name, dev->mt76.dev);
2126 if (!fw || !fw->data || fw->size < CR4_REGION_NUM * sizeof(*hdr)) {
2127 dev_err(dev->mt76.dev, "Invalid firmware\n");
2132 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
2133 CR4_REGION_NUM * sizeof(*hdr));
2135 dev_info(dev->mt76.dev, "CR4 Firmware Version: %.10s, Build Time: %.15s\n",
2136 hdr->fw_ver, hdr->build_date);
2138 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, true);
2142 ret = mt7615_mcu_start_firmware(dev, 0, FW_START_WORKING_PDA_CR4);
2144 dev_err(dev->mt76.dev, "Failed to start CR4 firmware\n");
2149 release_firmware(fw);
2154 static int mt7615_load_ram(struct mt7615_dev *dev)
2158 ret = mt7615_load_n9(dev, MT7615_FIRMWARE_N9);
2162 return mt7615_load_cr4(dev, MT7615_FIRMWARE_CR4);
2165 static int mt7615_load_firmware(struct mt7615_dev *dev)
2170 val = mt76_get_field(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE);
2172 if (val != FW_STATE_FW_DOWNLOAD) {
2173 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
2177 ret = mt7615_load_patch(dev, MT7615_PATCH_ADDRESS, MT7615_ROM_PATCH);
2181 ret = mt7615_load_ram(dev);
2185 if (!mt76_poll_msec(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE,
2186 FIELD_PREP(MT_TOP_MISC2_FW_STATE,
2187 FW_STATE_CR4_RDY), 500)) {
2188 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
2195 static int mt7622_load_firmware(struct mt7615_dev *dev)
2200 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
2202 val = mt76_get_field(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE);
2203 if (val != FW_STATE_FW_DOWNLOAD) {
2204 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
2208 ret = mt7615_load_patch(dev, MT7622_PATCH_ADDRESS, MT7622_ROM_PATCH);
2212 ret = mt7615_load_n9(dev, MT7622_FIRMWARE_N9);
2216 if (!mt76_poll_msec(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE,
2217 FIELD_PREP(MT_TOP_OFF_RSV_FW_STATE,
2218 FW_STATE_NORMAL_TRX), 1500)) {
2219 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
2223 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
2228 int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl)
2237 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_FW_LOG_2_HOST, &data,
2238 sizeof(data), true);
2241 static int mt7663_load_n9(struct mt7615_dev *dev, const char *name)
2243 u32 offset = 0, override_addr = 0, flag = FW_START_DLYCAL;
2244 const struct mt7663_fw_trailer *hdr;
2245 const struct mt7663_fw_buf *buf;
2246 const struct firmware *fw;
2247 const u8 *base_addr;
2250 ret = request_firmware(&fw, name, dev->mt76.dev);
2254 if (!fw || !fw->data || fw->size < FW_V3_COMMON_TAILER_SIZE) {
2255 dev_err(dev->mt76.dev, "Invalid firmware\n");
2260 hdr = (const struct mt7663_fw_trailer *)(fw->data + fw->size -
2261 FW_V3_COMMON_TAILER_SIZE);
2263 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
2264 hdr->fw_ver, hdr->build_date);
2265 dev_info(dev->mt76.dev, "Region number: 0x%x\n", hdr->n_region);
2267 base_addr = fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE;
2268 for (i = 0; i < hdr->n_region; i++) {
2269 u32 shift = (hdr->n_region - i) * FW_V3_REGION_TAILER_SIZE;
2270 u32 len, addr, mode;
2272 dev_info(dev->mt76.dev, "Parsing tailer Region: %d\n", i);
2274 buf = (const struct mt7663_fw_buf *)(base_addr - shift);
2275 mode = mt7615_mcu_gen_dl_mode(buf->feature_set, false);
2276 addr = le32_to_cpu(buf->img_dest_addr);
2277 len = le32_to_cpu(buf->img_size);
2279 ret = mt7615_mcu_init_download(dev, addr, len, mode);
2281 dev_err(dev->mt76.dev, "Download request failed\n");
2285 ret = mt7615_mcu_send_firmware(dev, fw->data + offset, len);
2287 dev_err(dev->mt76.dev, "Failed to send firmware\n");
2291 offset += le32_to_cpu(buf->img_size);
2292 if (buf->feature_set & DL_MODE_VALID_RAM_ENTRY) {
2293 override_addr = le32_to_cpu(buf->img_dest_addr);
2294 dev_info(dev->mt76.dev, "Region %d, override_addr = 0x%08x\n",
2300 flag |= FW_START_OVERRIDE;
2302 dev_info(dev->mt76.dev, "override_addr = 0x%08x, option = %d\n",
2303 override_addr, flag);
2305 ret = mt7615_mcu_start_firmware(dev, override_addr, flag);
2307 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
2311 snprintf(dev->mt76.hw->wiphy->fw_version,
2312 sizeof(dev->mt76.hw->wiphy->fw_version),
2313 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2316 release_firmware(fw);
2322 mt7663_load_rom_patch(struct mt7615_dev *dev, const char **n9_firmware)
2324 const char *selected_rom, *secondary_rom = MT7663_ROM_PATCH;
2325 const char *primary_rom = MT7663_OFFLOAD_ROM_PATCH;
2328 if (!prefer_offload_fw) {
2329 secondary_rom = MT7663_OFFLOAD_ROM_PATCH;
2330 primary_rom = MT7663_ROM_PATCH;
2332 selected_rom = primary_rom;
2334 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS, primary_rom);
2336 dev_info(dev->mt76.dev, "%s not found, switching to %s",
2337 primary_rom, secondary_rom);
2338 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS,
2341 dev_err(dev->mt76.dev, "failed to load %s",
2345 selected_rom = secondary_rom;
2348 if (!strcmp(selected_rom, MT7663_OFFLOAD_ROM_PATCH)) {
2349 *n9_firmware = MT7663_OFFLOAD_FIRMWARE_N9;
2350 dev->fw_ver = MT7615_FIRMWARE_V3;
2351 dev->mcu_ops = &uni_update_ops;
2353 *n9_firmware = MT7663_FIRMWARE_N9;
2354 dev->fw_ver = MT7615_FIRMWARE_V2;
2355 dev->mcu_ops = &sta_update_ops;
2361 int __mt7663_load_firmware(struct mt7615_dev *dev)
2363 const char *n9_firmware;
2366 ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY);
2368 dev_dbg(dev->mt76.dev, "Firmware is already download\n");
2372 ret = mt7663_load_rom_patch(dev, &n9_firmware);
2376 ret = mt7663_load_n9(dev, n9_firmware);
2380 if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY,
2381 MT_TOP_MISC2_FW_N9_RDY, 1500)) {
2382 ret = mt76_get_field(dev, MT_CONN_ON_MISC,
2383 MT7663_TOP_MISC2_FW_STATE);
2384 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
2389 if (mt7615_firmware_offload(dev))
2390 dev->mt76.hw->wiphy->wowlan = &mt7615_wowlan_support;
2391 #endif /* CONFIG_PM */
2393 dev_dbg(dev->mt76.dev, "Firmware init done\n");
2397 EXPORT_SYMBOL_GPL(__mt7663_load_firmware);
2399 static int mt7663_load_firmware(struct mt7615_dev *dev)
2403 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
2405 ret = __mt7663_load_firmware(dev);
2409 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
2414 int mt7615_mcu_init(struct mt7615_dev *dev)
2416 static const struct mt76_mcu_ops mt7615_mcu_ops = {
2417 .headroom = sizeof(struct mt7615_mcu_txd),
2418 .mcu_skb_send_msg = mt7615_mcu_send_message,
2419 .mcu_parse_response = mt7615_mcu_parse_response,
2420 .mcu_restart = mt7615_mcu_restart,
2424 dev->mt76.mcu_ops = &mt7615_mcu_ops,
2426 ret = mt7615_mcu_drv_pmctrl(dev);
2430 switch (mt76_chip(&dev->mt76)) {
2432 ret = mt7622_load_firmware(dev);
2435 ret = mt7663_load_firmware(dev);
2438 ret = mt7615_load_firmware(dev);
2444 mt76_queue_tx_cleanup(dev, MT_TXQ_FWDL, false);
2445 dev_dbg(dev->mt76.dev, "Firmware init done\n");
2446 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
2447 mt7615_mcu_fw_log_2_host(dev, 0);
2451 EXPORT_SYMBOL_GPL(mt7615_mcu_init);
2453 void mt7615_mcu_exit(struct mt7615_dev *dev)
2455 __mt76_mcu_restart(&dev->mt76);
2456 mt7615_mcu_set_fw_ctrl(dev);
2457 skb_queue_purge(&dev->mt76.mcu.res_q);
2459 EXPORT_SYMBOL_GPL(mt7615_mcu_exit);
2461 int mt7615_mcu_set_eeprom(struct mt7615_dev *dev)
2467 } __packed req_hdr = {
2470 u8 *eep = (u8 *)dev->mt76.eeprom.data;
2471 struct sk_buff *skb;
2472 int eep_len, offset;
2474 switch (mt76_chip(&dev->mt76)) {
2476 eep_len = MT7622_EE_MAX - MT_EE_NIC_CONF_0;
2477 offset = MT_EE_NIC_CONF_0;
2480 eep_len = MT7663_EE_MAX - MT_EE_CHIP_ID;
2481 req_hdr.content_format = 1;
2482 offset = MT_EE_CHIP_ID;
2485 eep_len = MT7615_EE_MAX - MT_EE_NIC_CONF_0;
2486 offset = MT_EE_NIC_CONF_0;
2490 req_hdr.len = cpu_to_le16(eep_len);
2492 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req_hdr) + eep_len);
2496 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
2497 skb_put_data(skb, eep + offset, eep_len);
2499 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2500 MCU_EXT_CMD_EFUSE_BUFFER_MODE, true);
2502 EXPORT_SYMBOL_GPL(mt7615_mcu_set_eeprom);
2504 int mt7615_mcu_set_mac_enable(struct mt7615_dev *dev, int band, bool enable)
2515 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_MAC_INIT_CTRL, &req,
2519 int mt7615_mcu_set_rts_thresh(struct mt7615_phy *phy, u32 val)
2521 struct mt7615_dev *dev = phy->dev;
2530 .band = phy != &dev->phy,
2531 .len_thresh = cpu_to_le32(val),
2532 .pkt_thresh = cpu_to_le32(0x2),
2535 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_PROTECT_CTRL, &req,
2539 int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue,
2540 const struct ieee80211_tx_queue_params *params)
2542 #define WMM_AIFS_SET BIT(0)
2543 #define WMM_CW_MIN_SET BIT(1)
2544 #define WMM_CW_MAX_SET BIT(2)
2545 #define WMM_TXOP_SET BIT(3)
2546 #define WMM_PARAM_SET (WMM_AIFS_SET | WMM_CW_MIN_SET | \
2547 WMM_CW_MAX_SET | WMM_TXOP_SET)
2560 .valid = WMM_PARAM_SET,
2561 .aifs = params->aifs,
2563 .cw_max = cpu_to_le16(10),
2564 .txop = cpu_to_le16(params->txop),
2568 req.cw_min = fls(params->cw_min);
2570 req.cw_max = cpu_to_le16(fls(params->cw_max));
2572 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EDCA_UPDATE, &req,
2576 int mt7615_mcu_set_dbdc(struct mt7615_dev *dev)
2578 struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
2589 struct dbdc_entry entry[64];
2591 .enable = !!ext_phy,
2598 #define ADD_DBDC_ENTRY(_type, _idx, _band) \
2600 req.entry[req.num].type = _type; \
2601 req.entry[req.num].index = _idx; \
2602 req.entry[req.num++].band = _band; \
2605 for (i = 0; i < 4; i++) {
2606 bool band = !!(ext_phy->omac_mask & BIT(i));
2608 ADD_DBDC_ENTRY(DBDC_TYPE_BSS, i, band);
2611 for (i = 0; i < 14; i++) {
2612 bool band = !!(ext_phy->omac_mask & BIT(0x11 + i));
2614 ADD_DBDC_ENTRY(DBDC_TYPE_MBSS, i, band);
2617 ADD_DBDC_ENTRY(DBDC_TYPE_MU, 0, 1);
2619 for (i = 0; i < 3; i++)
2620 ADD_DBDC_ENTRY(DBDC_TYPE_BF, i, 1);
2622 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 0, 0);
2623 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 1, 0);
2624 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 2, 1);
2625 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 3, 1);
2627 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 0, 0);
2628 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 1, 1);
2631 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_DBDC_CTRL, &req,
2635 int mt7615_mcu_del_wtbl_all(struct mt7615_dev *dev)
2637 struct wtbl_req_hdr req = {
2638 .operation = WTBL_RESET_ALL,
2641 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_WTBL_UPDATE, &req,
2644 EXPORT_SYMBOL_GPL(mt7615_mcu_del_wtbl_all);
2646 int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev,
2647 enum mt7615_rdd_cmd cmd, u8 index,
2659 .rdd_rx_sel = rx_sel,
2663 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_CTRL, &req,
2667 int mt7615_mcu_set_fcc5_lpn(struct mt7615_dev *dev, int val)
2677 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
2681 int mt7615_mcu_set_pulse_th(struct mt7615_dev *dev,
2682 const struct mt7615_dfs_pulse *pulse)
2686 struct mt7615_dfs_pulse pulse;
2691 memcpy(&req.pulse, pulse, sizeof(*pulse));
2693 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
2697 int mt7615_mcu_set_radar_th(struct mt7615_dev *dev, int index,
2698 const struct mt7615_dfs_pattern *pattern)
2703 struct mt7615_dfs_pattern pattern;
2706 .radar_type = index,
2709 memcpy(&req.pattern, pattern, sizeof(*pattern));
2711 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
2715 int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev)
2726 .pulse_num = dev->radar_pattern.n_pulses,
2728 u32 start_time = ktime_to_ms(ktime_get_boottime());
2731 if (dev->radar_pattern.n_pulses > ARRAY_SIZE(req.pattern))
2734 /* TODO: add some noise here */
2735 for (i = 0; i < dev->radar_pattern.n_pulses; i++) {
2736 req.pattern[i].width = dev->radar_pattern.width;
2737 req.pattern[i].power = dev->radar_pattern.power;
2738 req.pattern[i].start_time = start_time +
2739 i * dev->radar_pattern.period;
2742 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_PATTERN,
2743 &req, sizeof(req), false);
2746 static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
2748 struct mt76_phy *mphy = phy->mt76;
2749 struct ieee80211_hw *hw = mphy->hw;
2750 int n_chains = hweight8(mphy->antenna_mask);
2754 tx_power = hw->conf.power_level * 2 -
2755 mt76_tx_power_nss_delta(n_chains);
2756 mphy->txpower_cur = tx_power;
2758 for (i = 0; i < MT_SKU_1SS_DELTA; i++)
2761 for (i = 0; i < 4; i++) {
2764 if (i < n_chains - 1)
2765 delta = mt76_tx_power_nss_delta(n_chains) -
2766 mt76_tx_power_nss_delta(i + 1);
2767 sku[MT_SKU_1SS_DELTA + i] = delta;
2771 static u8 mt7615_mcu_chan_bw(struct cfg80211_chan_def *chandef)
2773 static const u8 width_to_bw[] = {
2774 [NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ,
2775 [NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ,
2776 [NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ,
2777 [NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ,
2778 [NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ,
2779 [NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ,
2780 [NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ,
2781 [NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ,
2784 if (chandef->width >= ARRAY_SIZE(width_to_bw))
2787 return width_to_bw[chandef->width];
2790 int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd)
2792 struct mt7615_dev *dev = phy->dev;
2793 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2794 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
2803 /* for 80+80 only */
2808 __le32 outband_freq;
2814 .control_chan = chandef->chan->hw_value,
2815 .center_chan = ieee80211_frequency_to_channel(freq1),
2816 .tx_streams = hweight8(phy->mt76->antenna_mask),
2817 .rx_streams_mask = phy->chainmask,
2818 .center_chan2 = ieee80211_frequency_to_channel(freq2),
2821 if (dev->mt76.hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
2822 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
2823 else if ((chandef->chan->flags & IEEE80211_CHAN_RADAR) &&
2824 chandef->chan->dfs_state != NL80211_DFS_AVAILABLE)
2825 req.switch_reason = CH_SWITCH_DFS;
2827 req.switch_reason = CH_SWITCH_NORMAL;
2829 req.band_idx = phy != &dev->phy;
2830 req.bw = mt7615_mcu_chan_bw(chandef);
2832 if (mt76_testmode_enabled(&dev->mt76))
2833 memset(req.txpower_sku, 0x3f, 49);
2835 mt7615_mcu_set_txpower_sku(phy, req.txpower_sku);
2837 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
2840 int mt7615_mcu_get_temperature(struct mt7615_dev *dev, int index)
2849 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_GET_TEMP, &req,
2853 int mt7615_mcu_set_test_param(struct mt7615_dev *dev, u8 param, bool test_mode,
2865 .test_mode_en = test_mode,
2867 .value = cpu_to_le32(val),
2870 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_ATE_CTRL, &req,
2871 sizeof(req), false);
2874 int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable)
2876 struct mt7615_dev *dev = phy->dev;
2884 .band_idx = phy != &dev->phy,
2885 .sku_enable = enable,
2888 return mt76_mcu_send_msg(&dev->mt76,
2889 MCU_EXT_CMD_TX_POWER_FEATURE_CTRL, &req,
2893 int mt7615_mcu_set_vif_ps(struct mt7615_dev *dev, struct ieee80211_vif *vif)
2895 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2898 u8 ps_state; /* 0: device awake
2899 * 1: static power save
2900 * 2: dynamic power saving
2903 .bss_idx = mvif->idx,
2904 .ps_state = vif->bss_conf.ps ? 2 : 0,
2907 if (vif->type != NL80211_IFTYPE_STATION)
2910 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_PS_PROFILE, &req,
2911 sizeof(req), false);
2914 int mt7615_mcu_set_channel_domain(struct mt7615_phy *phy)
2916 struct mt76_phy *mphy = phy->mt76;
2917 struct mt7615_dev *dev = phy->dev;
2918 struct mt7615_mcu_channel_domain {
2919 __le32 country_code; /* regulatory_request.alpha2 */
2920 u8 bw_2g; /* BW_20_40M 0
2923 * BW_20_40_80_160M 3
2924 * BW_20_40_80_8080M 4
2934 .n_2ch = mphy->sband_2g.sband.n_channels,
2935 .n_5ch = mphy->sband_5g.sband.n_channels,
2937 struct mt7615_mcu_chan {
2942 int i, n_channels = hdr.n_2ch + hdr.n_5ch;
2943 int len = sizeof(hdr) + n_channels * sizeof(struct mt7615_mcu_chan);
2944 struct sk_buff *skb;
2946 if (!mt7615_firmware_offload(dev))
2949 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, len);
2953 skb_put_data(skb, &hdr, sizeof(hdr));
2955 for (i = 0; i < n_channels; i++) {
2956 struct ieee80211_channel *chan;
2957 struct mt7615_mcu_chan channel;
2960 chan = &mphy->sband_2g.sband.channels[i];
2962 chan = &mphy->sband_5g.sband.channels[i - hdr.n_2ch];
2964 channel.hw_value = cpu_to_le16(chan->hw_value);
2965 channel.flags = cpu_to_le32(chan->flags);
2968 skb_put_data(skb, &channel, sizeof(channel));
2971 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_CMD_SET_CHAN_DOMAIN,
2975 #define MT7615_SCAN_CHANNEL_TIME 60
2976 int mt7615_mcu_hw_scan(struct mt7615_phy *phy, struct ieee80211_vif *vif,
2977 struct ieee80211_scan_request *scan_req)
2979 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2980 struct cfg80211_scan_request *sreq = &scan_req->req;
2981 int n_ssids = 0, err, i, duration = MT7615_SCAN_CHANNEL_TIME;
2982 int ext_channels_num = max_t(int, sreq->n_channels - 32, 0);
2983 struct ieee80211_channel **scan_list = sreq->channels;
2984 struct mt7615_dev *dev = phy->dev;
2985 bool ext_phy = phy != &dev->phy;
2986 struct mt7615_mcu_scan_channel *chan;
2987 struct mt7615_hw_scan_req *req;
2988 struct sk_buff *skb;
2990 /* fall-back to sw-scan */
2991 if (!mt7615_firmware_offload(dev))
2994 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(*req));
2998 set_bit(MT76_HW_SCANNING, &phy->mt76->state);
2999 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
3001 req = (struct mt7615_hw_scan_req *)skb_put(skb, sizeof(*req));
3003 req->seq_num = mvif->scan_seq_num | ext_phy << 7;
3004 req->bss_idx = mvif->idx;
3005 req->scan_type = sreq->n_ssids ? 1 : 0;
3006 req->probe_req_num = sreq->n_ssids ? 2 : 0;
3009 for (i = 0; i < sreq->n_ssids; i++) {
3010 if (!sreq->ssids[i].ssid_len)
3013 req->ssids[i].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len);
3014 memcpy(req->ssids[i].ssid, sreq->ssids[i].ssid,
3015 sreq->ssids[i].ssid_len);
3018 req->ssid_type = n_ssids ? BIT(2) : BIT(0);
3019 req->ssid_type_ext = n_ssids ? BIT(0) : 0;
3020 req->ssids_num = n_ssids;
3022 /* increase channel time for passive scan */
3025 req->timeout_value = cpu_to_le16(sreq->n_channels * duration);
3026 req->channel_min_dwell_time = cpu_to_le16(duration);
3027 req->channel_dwell_time = cpu_to_le16(duration);
3029 req->channels_num = min_t(u8, sreq->n_channels, 32);
3030 req->ext_channels_num = min_t(u8, ext_channels_num, 32);
3031 for (i = 0; i < req->channels_num + req->ext_channels_num; i++) {
3033 chan = &req->ext_channels[i - 32];
3035 chan = &req->channels[i];
3037 chan->band = scan_list[i]->band == NL80211_BAND_2GHZ ? 1 : 2;
3038 chan->channel_num = scan_list[i]->hw_value;
3040 req->channel_type = sreq->n_channels ? 4 : 0;
3042 if (sreq->ie_len > 0) {
3043 memcpy(req->ies, sreq->ie, sreq->ie_len);
3044 req->ies_len = cpu_to_le16(sreq->ie_len);
3047 memcpy(req->bssid, sreq->bssid, ETH_ALEN);
3048 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
3049 get_random_mask_addr(req->random_mac, sreq->mac_addr,
3050 sreq->mac_addr_mask);
3054 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_CMD_START_HW_SCAN,
3057 clear_bit(MT76_HW_SCANNING, &phy->mt76->state);
3062 int mt7615_mcu_cancel_hw_scan(struct mt7615_phy *phy,
3063 struct ieee80211_vif *vif)
3065 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3066 struct mt7615_dev *dev = phy->dev;
3072 .seq_num = mvif->scan_seq_num,
3075 if (test_and_clear_bit(MT76_HW_SCANNING, &phy->mt76->state)) {
3076 struct cfg80211_scan_info info = {
3080 ieee80211_scan_completed(phy->mt76->hw, &info);
3083 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_CANCEL_HW_SCAN, &req,
3084 sizeof(req), false);
3087 int mt7615_mcu_sched_scan_req(struct mt7615_phy *phy,
3088 struct ieee80211_vif *vif,
3089 struct cfg80211_sched_scan_request *sreq)
3091 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3092 struct ieee80211_channel **scan_list = sreq->channels;
3093 struct mt7615_dev *dev = phy->dev;
3094 bool ext_phy = phy != &dev->phy;
3095 struct mt7615_mcu_scan_channel *chan;
3096 struct mt7615_sched_scan_req *req;
3097 struct cfg80211_match_set *match;
3098 struct cfg80211_ssid *ssid;
3099 struct sk_buff *skb;
3102 if (!mt7615_firmware_offload(dev))
3105 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
3106 sizeof(*req) + sreq->ie_len);
3110 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
3112 req = (struct mt7615_sched_scan_req *)skb_put(skb, sizeof(*req));
3114 req->seq_num = mvif->scan_seq_num | ext_phy << 7;
3116 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
3117 get_random_mask_addr(req->random_mac, sreq->mac_addr,
3118 sreq->mac_addr_mask);
3122 req->ssids_num = sreq->n_ssids;
3123 for (i = 0; i < req->ssids_num; i++) {
3124 ssid = &sreq->ssids[i];
3125 memcpy(req->ssids[i].ssid, ssid->ssid, ssid->ssid_len);
3126 req->ssids[i].ssid_len = cpu_to_le32(ssid->ssid_len);
3129 req->match_num = sreq->n_match_sets;
3130 for (i = 0; i < req->match_num; i++) {
3131 match = &sreq->match_sets[i];
3132 memcpy(req->match[i].ssid, match->ssid.ssid,
3133 match->ssid.ssid_len);
3134 req->match[i].rssi_th = cpu_to_le32(match->rssi_thold);
3135 req->match[i].ssid_len = match->ssid.ssid_len;
3138 req->channel_type = sreq->n_channels ? 4 : 0;
3139 req->channels_num = min_t(u8, sreq->n_channels, 64);
3140 for (i = 0; i < req->channels_num; i++) {
3141 chan = &req->channels[i];
3142 chan->band = scan_list[i]->band == NL80211_BAND_2GHZ ? 1 : 2;
3143 chan->channel_num = scan_list[i]->hw_value;
3146 req->intervals_num = sreq->n_scan_plans;
3147 for (i = 0; i < req->intervals_num; i++)
3148 req->intervals[i] = cpu_to_le16(sreq->scan_plans[i].interval);
3150 if (sreq->ie_len > 0) {
3151 req->ie_len = cpu_to_le16(sreq->ie_len);
3152 memcpy(skb_put(skb, sreq->ie_len), sreq->ie, sreq->ie_len);
3155 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_CMD_SCHED_SCAN_REQ,
3159 int mt7615_mcu_sched_scan_enable(struct mt7615_phy *phy,
3160 struct ieee80211_vif *vif,
3163 struct mt7615_dev *dev = phy->dev;
3165 u8 active; /* 0: enabled 1: disabled */
3171 if (!mt7615_firmware_offload(dev))
3175 set_bit(MT76_HW_SCHED_SCANNING, &phy->mt76->state);
3177 clear_bit(MT76_HW_SCHED_SCANNING, &phy->mt76->state);
3179 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SCHED_SCAN_ENABLE, &req,
3180 sizeof(req), false);
3183 static int mt7615_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
3187 for (i = 0; i < n_freqs; i++)
3188 if (cur == freqs[i])
3194 static int mt7615_dcoc_freq_idx(u16 freq, u8 bw)
3196 static const u16 freq_list[] = {
3197 4980, 5805, 5905, 5190,
3198 5230, 5270, 5310, 5350,
3199 5390, 5430, 5470, 5510,
3200 5550, 5590, 5630, 5670,
3201 5710, 5755, 5795, 5835,
3202 5875, 5210, 5290, 5370,
3203 5450, 5530, 5610, 5690,
3206 static const u16 freq_bw40[] = {
3207 5190, 5230, 5270, 5310,
3208 5350, 5390, 5430, 5470,
3209 5510, 5550, 5590, 5630,
3210 5670, 5710, 5755, 5795,
3213 int offset_2g = ARRAY_SIZE(freq_list);
3220 return offset_2g + 1;
3222 return offset_2g + 2;
3224 return offset_2g + 3;
3228 case NL80211_CHAN_WIDTH_80:
3229 case NL80211_CHAN_WIDTH_80P80:
3230 case NL80211_CHAN_WIDTH_160:
3233 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
3236 freq = freq_bw40[idx];
3240 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
3243 freq = freq_bw40[idx];
3247 case NL80211_CHAN_WIDTH_40:
3248 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
3257 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
3260 int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy)
3262 struct mt7615_dev *dev = phy->dev;
3263 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
3264 int freq2 = chandef->center_freq2;
3268 u8 runtime_calibration;
3281 __le32 sx0_i_lna[4];
3282 __le32 sx0_q_lna[4];
3284 __le32 sx2_i_lna[4];
3285 __le32 sx2_q_lna[4];
3290 .bw = mt7615_mcu_chan_bw(chandef),
3291 .band = chandef->center_freq1 > 4000,
3292 .dbdc_en = !!dev->mt76.phy2,
3294 u16 center_freq = chandef->center_freq1;
3296 u8 *eep = dev->mt76.eeprom.data;
3298 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_RX_CAL))
3301 if (chandef->width == NL80211_CHAN_WIDTH_160) {
3302 freq2 = center_freq + 40;
3307 req.runtime_calibration = 1;
3308 freq_idx = mt7615_dcoc_freq_idx(center_freq, chandef->width);
3312 memcpy(req.dcoc_data, eep + MT7615_EEPROM_DCOC_OFFSET +
3313 freq_idx * MT7615_EEPROM_DCOC_SIZE,
3314 sizeof(req.dcoc_data));
3315 req.runtime_calibration = 0;
3318 req.center_freq = cpu_to_le16(center_freq);
3319 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_RXDCOC_CAL, &req,
3322 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
3323 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
3324 req.is_freq2 = true;
3325 center_freq = freq2;
3332 static int mt7615_dpd_freq_idx(u16 freq, u8 bw)
3334 static const u16 freq_list[] = {
3335 4920, 4940, 4960, 4980,
3336 5040, 5060, 5080, 5180,
3337 5200, 5220, 5240, 5260,
3338 5280, 5300, 5320, 5340,
3339 5360, 5380, 5400, 5420,
3340 5440, 5460, 5480, 5500,
3341 5520, 5540, 5560, 5580,
3342 5600, 5620, 5640, 5660,
3343 5680, 5700, 5720, 5745,
3344 5765, 5785, 5805, 5825,
3345 5845, 5865, 5885, 5905
3347 int offset_2g = ARRAY_SIZE(freq_list);
3354 return offset_2g + 1;
3356 return offset_2g + 2;
3359 if (bw != NL80211_CHAN_WIDTH_20) {
3360 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3365 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3371 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
3375 int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy)
3377 struct mt7615_dev *dev = phy->dev;
3378 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
3379 int freq2 = chandef->center_freq2;
3383 u8 runtime_calibration;
3411 .bw = mt7615_mcu_chan_bw(chandef),
3412 .band = chandef->center_freq1 > 4000,
3413 .dbdc_en = !!dev->mt76.phy2,
3415 u16 center_freq = chandef->center_freq1;
3417 u8 *eep = dev->mt76.eeprom.data;
3419 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_TX_DPD))
3422 if (chandef->width == NL80211_CHAN_WIDTH_160) {
3423 freq2 = center_freq + 40;
3428 req.runtime_calibration = 1;
3429 freq_idx = mt7615_dpd_freq_idx(center_freq, chandef->width);
3433 memcpy(&req.dpd_data, eep + MT7615_EEPROM_TXDPD_OFFSET +
3434 freq_idx * MT7615_EEPROM_TXDPD_SIZE,
3435 sizeof(req.dpd_data));
3436 req.runtime_calibration = 0;
3439 req.center_freq = cpu_to_le16(center_freq);
3440 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_TXDPD_CAL, &req,
3443 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
3444 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
3445 req.is_freq2 = true;
3446 center_freq = freq2;
3453 int mt7615_mcu_set_bss_pm(struct mt7615_dev *dev, struct ieee80211_vif *vif,
3456 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3461 __le16 bcn_interval;
3464 u8 bmc_delivered_ac;
3465 u8 bmc_triggered_ac;
3468 .bss_idx = mvif->idx,
3469 .aid = cpu_to_le16(vif->bss_conf.aid),
3470 .dtim_period = vif->bss_conf.dtim_period,
3471 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
3477 .bss_idx = mvif->idx,
3481 if (vif->type != NL80211_IFTYPE_STATION ||
3482 !mt7615_firmware_offload(dev))
3485 err = mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_BSS_ABORT, &req_hdr,
3486 sizeof(req_hdr), false);
3487 if (err < 0 || !enable)
3490 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_BSS_CONNECTED, &req,
3491 sizeof(req), false);
3495 int mt7615_mcu_set_hif_suspend(struct mt7615_dev *dev, bool suspend)
3499 u8 hif_type; /* 0x0: HIF_SDIO
3505 struct hif_suspend_tlv {
3509 } __packed hif_suspend;
3512 .tag = cpu_to_le16(0), /* 0: UNI_HIF_CTRL_BASIC */
3513 .len = cpu_to_le16(sizeof(struct hif_suspend_tlv)),
3518 if (mt76_is_mmio(&dev->mt76))
3519 req.hdr.hif_type = 2;
3520 else if (mt76_is_usb(&dev->mt76))
3521 req.hdr.hif_type = 1;
3523 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_HIF_CTRL, &req,
3526 EXPORT_SYMBOL_GPL(mt7615_mcu_set_hif_suspend);
3529 mt7615_mcu_set_wow_ctrl(struct mt7615_phy *phy, struct ieee80211_vif *vif,
3530 bool suspend, struct cfg80211_wowlan *wowlan)
3532 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3533 struct mt7615_dev *dev = phy->dev;
3539 struct mt7615_wow_ctrl_tlv wow_ctrl_tlv;
3542 .bss_idx = mvif->idx,
3545 .tag = cpu_to_le16(UNI_SUSPEND_WOW_CTRL),
3546 .len = cpu_to_le16(sizeof(struct mt7615_wow_ctrl_tlv)),
3547 .cmd = suspend ? 1 : 2,
3551 if (wowlan->magic_pkt)
3552 req.wow_ctrl_tlv.trigger |= BIT(0);
3553 if (wowlan->disconnect)
3554 req.wow_ctrl_tlv.trigger |= BIT(2);
3555 if (wowlan->nd_config) {
3556 mt7615_mcu_sched_scan_req(phy, vif, wowlan->nd_config);
3557 req.wow_ctrl_tlv.trigger |= BIT(5);
3558 mt7615_mcu_sched_scan_enable(phy, vif, suspend);
3561 if (mt76_is_mmio(&dev->mt76))
3562 req.wow_ctrl_tlv.wakeup_hif = 2;
3563 else if (mt76_is_usb(&dev->mt76))
3564 req.wow_ctrl_tlv.wakeup_hif = 1;
3566 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_SUSPEND, &req,
3571 mt7615_mcu_set_wow_pattern(struct mt7615_dev *dev,
3572 struct ieee80211_vif *vif,
3573 u8 index, bool enable,
3574 struct cfg80211_pkt_pattern *pattern)
3576 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3577 struct mt7615_wow_pattern_tlv *ptlv;
3578 struct sk_buff *skb;
3583 .bss_idx = mvif->idx,
3586 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
3587 sizeof(hdr) + sizeof(*ptlv));
3591 skb_put_data(skb, &hdr, sizeof(hdr));
3592 ptlv = (struct mt7615_wow_pattern_tlv *)skb_put(skb, sizeof(*ptlv));
3593 ptlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
3594 ptlv->len = cpu_to_le16(sizeof(*ptlv));
3595 ptlv->data_len = pattern->pattern_len;
3596 ptlv->enable = enable;
3597 ptlv->index = index;
3599 memcpy(ptlv->pattern, pattern->pattern, pattern->pattern_len);
3600 memcpy(ptlv->mask, pattern->mask, pattern->pattern_len / 8);
3602 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_SUSPEND,
3607 mt7615_mcu_set_suspend_mode(struct mt7615_dev *dev,
3608 struct ieee80211_vif *vif,
3609 bool enable, u8 mdtim, bool wow_suspend)
3611 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3617 struct mt7615_suspend_tlv suspend_tlv;
3620 .bss_idx = mvif->idx,
3623 .tag = cpu_to_le16(UNI_SUSPEND_MODE_SETTING),
3624 .len = cpu_to_le16(sizeof(struct mt7615_suspend_tlv)),
3627 .wow_suspend = wow_suspend,
3631 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_SUSPEND, &req,
3636 mt7615_mcu_set_gtk_rekey(struct mt7615_dev *dev,
3637 struct ieee80211_vif *vif,
3640 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3646 struct mt7615_gtk_rekey_tlv gtk_tlv;
3649 .bss_idx = mvif->idx,
3652 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY),
3653 .len = cpu_to_le16(sizeof(struct mt7615_gtk_rekey_tlv)),
3654 .rekey_mode = !suspend,
3658 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_OFFLOAD, &req,
3663 mt7615_mcu_set_arp_filter(struct mt7615_dev *dev, struct ieee80211_vif *vif,
3666 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3672 struct mt7615_arpns_tlv arpns;
3675 .bss_idx = mvif->idx,
3678 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
3679 .len = cpu_to_le16(sizeof(struct mt7615_arpns_tlv)),
3684 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_OFFLOAD, &req,
3688 void mt7615_mcu_set_suspend_iter(void *priv, u8 *mac,
3689 struct ieee80211_vif *vif)
3691 struct mt7615_phy *phy = priv;
3692 bool suspend = test_bit(MT76_STATE_SUSPEND, &phy->mt76->state);
3693 struct ieee80211_hw *hw = phy->mt76->hw;
3694 struct cfg80211_wowlan *wowlan = hw->wiphy->wowlan_config;
3697 mt7615_mcu_set_bss_pm(phy->dev, vif, suspend);
3699 mt7615_mcu_set_gtk_rekey(phy->dev, vif, suspend);
3700 mt7615_mcu_set_arp_filter(phy->dev, vif, suspend);
3702 mt7615_mcu_set_suspend_mode(phy->dev, vif, suspend, 1, true);
3704 for (i = 0; i < wowlan->n_patterns; i++)
3705 mt7615_mcu_set_wow_pattern(phy->dev, vif, i, suspend,
3706 &wowlan->patterns[i]);
3707 mt7615_mcu_set_wow_ctrl(phy, vif, suspend, wowlan);
3711 mt7615_mcu_key_iter(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
3712 struct ieee80211_sta *sta, struct ieee80211_key_conf *key,
3715 struct mt7615_gtk_rekey_tlv *gtk_tlv = data;
3718 if (key->cipher != WLAN_CIPHER_SUITE_AES_CMAC &&
3719 key->cipher != WLAN_CIPHER_SUITE_CCMP &&
3720 key->cipher != WLAN_CIPHER_SUITE_TKIP)
3723 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
3724 gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1);
3727 gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2);
3731 /* we are assuming here to have a single pairwise key */
3732 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3733 gtk_tlv->pairwise_cipher = cpu_to_le32(cipher);
3734 gtk_tlv->group_cipher = cpu_to_le32(cipher);
3735 gtk_tlv->keyid = key->keyidx;
3739 int mt7615_mcu_update_gtk_rekey(struct ieee80211_hw *hw,
3740 struct ieee80211_vif *vif,
3741 struct cfg80211_gtk_rekey_data *key)
3743 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3744 struct mt7615_dev *dev = mt7615_hw_dev(hw);
3745 struct mt7615_gtk_rekey_tlv *gtk_tlv;
3746 struct sk_buff *skb;
3751 .bss_idx = mvif->idx,
3754 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
3755 sizeof(hdr) + sizeof(*gtk_tlv));
3759 skb_put_data(skb, &hdr, sizeof(hdr));
3760 gtk_tlv = (struct mt7615_gtk_rekey_tlv *)skb_put(skb,
3762 gtk_tlv->tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY);
3763 gtk_tlv->len = cpu_to_le16(sizeof(*gtk_tlv));
3764 gtk_tlv->rekey_mode = 2;
3765 gtk_tlv->option = 1;
3768 ieee80211_iter_keys_rcu(hw, vif, mt7615_mcu_key_iter, gtk_tlv);
3771 memcpy(gtk_tlv->kek, key->kek, NL80211_KEK_LEN);
3772 memcpy(gtk_tlv->kck, key->kck, NL80211_KCK_LEN);
3773 memcpy(gtk_tlv->replay_ctr, key->replay_ctr, NL80211_REPLAY_CTR_LEN);
3775 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_OFFLOAD,
3778 #endif /* CONFIG_PM */
3780 int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
3781 struct ieee80211_channel *chan, int duration)
3783 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3784 struct mt7615_dev *dev = phy->dev;
3785 struct mt7615_roc_tlv req = {
3786 .bss_idx = mvif->idx,
3788 .max_interval = cpu_to_le32(duration),
3789 .primary_chan = chan ? chan->hw_value : 0,
3790 .band = chan ? chan->band : 0,
3794 phy->roc_grant = false;
3796 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_ROC, &req,
3797 sizeof(req), false);
3800 int mt7615_mcu_update_arp_filter(struct ieee80211_hw *hw,
3801 struct ieee80211_vif *vif,
3802 struct ieee80211_bss_conf *info)
3804 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3805 struct mt7615_dev *dev = mt7615_hw_dev(hw);
3806 struct sk_buff *skb;
3807 int i, len = min_t(int, info->arp_addr_cnt,
3808 IEEE80211_BSS_ARP_ADDR_LIST_LEN);
3814 struct mt7615_arpns_tlv arp;
3817 .bss_idx = mvif->idx,
3820 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
3821 .len = cpu_to_le16(sizeof(struct mt7615_arpns_tlv)),
3823 .mode = 2, /* update */
3828 if (!mt7615_firmware_offload(dev))
3831 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
3832 sizeof(req_hdr) + len * sizeof(__be32));
3836 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
3837 for (i = 0; i < len; i++) {
3838 u8 *addr = (u8 *)skb_put(skb, sizeof(__be32));
3840 memcpy(addr, &info->arp_addr_list[i], sizeof(__be32));
3843 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_OFFLOAD,
3847 int mt7615_mcu_set_p2p_oppps(struct ieee80211_hw *hw,
3848 struct ieee80211_vif *vif)
3850 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
3851 int ct_window = vif->bss_conf.p2p_noa_attr.oppps_ctwindow;
3852 struct mt7615_dev *dev = mt7615_hw_dev(hw);
3858 .ct_win = cpu_to_le32(ct_window),
3859 .bss_idx = mvif->idx,
3862 if (!mt7615_firmware_offload(dev))
3865 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_P2P_OPPPS, &req,
3866 sizeof(req), false);
3869 u32 mt7615_mcu_reg_rr(struct mt76_dev *dev, u32 offset)
3875 .addr = cpu_to_le32(offset),
3878 return mt76_mcu_send_msg(dev, MCU_CMD_REG_READ, &req, sizeof(req),
3881 EXPORT_SYMBOL_GPL(mt7615_mcu_reg_rr);
3883 void mt7615_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val)
3889 .addr = cpu_to_le32(offset),
3890 .val = cpu_to_le32(val),
3893 mt76_mcu_send_msg(dev, MCU_CMD_REG_WRITE, &req, sizeof(req), false);
3895 EXPORT_SYMBOL_GPL(mt7615_mcu_reg_wr);