0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/firmware.h>
0009 #include "mt7615.h"
0010 #include "mcu.h"
0011 #include "mac.h"
0012 #include "eeprom.h"
0013
0014 static bool prefer_offload_fw = true;
0015 module_param(prefer_offload_fw, bool, 0644);
0016 MODULE_PARM_DESC(prefer_offload_fw,
0017 "Prefer client mode offload firmware (MT7663)");
0018
0019 struct mt7615_patch_hdr {
0020 char build_date[16];
0021 char platform[4];
0022 __be32 hw_sw_ver;
0023 __be32 patch_ver;
0024 __be16 checksum;
0025 } __packed;
0026
0027 struct mt7615_fw_trailer {
0028 __le32 addr;
0029 u8 chip_id;
0030 u8 feature_set;
0031 u8 eco_code;
0032 char fw_ver[10];
0033 char build_date[15];
0034 __le32 len;
0035 } __packed;
0036
0037 #define FW_V3_COMMON_TAILER_SIZE 36
0038 #define FW_V3_REGION_TAILER_SIZE 40
0039 #define FW_START_OVERRIDE BIT(0)
0040 #define FW_START_DLYCAL BIT(1)
0041 #define FW_START_WORKING_PDA_CR4 BIT(2)
0042
0043 struct mt7663_fw_buf {
0044 __le32 crc;
0045 __le32 d_img_size;
0046 __le32 block_size;
0047 u8 rsv[4];
0048 __le32 img_dest_addr;
0049 __le32 img_size;
0050 u8 feature_set;
0051 };
0052
0053 #define MT7615_PATCH_ADDRESS 0x80000
0054 #define MT7622_PATCH_ADDRESS 0x9c000
0055 #define MT7663_PATCH_ADDRESS 0xdc000
0056
0057 #define N9_REGION_NUM 2
0058 #define CR4_REGION_NUM 1
0059
0060 #define IMG_CRC_LEN 4
0061
0062 void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
0063 int cmd, int *wait_seq)
0064 {
0065 int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
0066 struct mt7615_uni_txd *uni_txd;
0067 struct mt7615_mcu_txd *mcu_txd;
0068 u8 seq, q_idx, pkt_fmt;
0069 __le32 *txd;
0070 u32 val;
0071
0072
0073 dev->mt76.mcu.timeout = 20 * HZ;
0074
0075 seq = ++dev->mt76.mcu.msg_seq & 0xf;
0076 if (!seq)
0077 seq = ++dev->mt76.mcu.msg_seq & 0xf;
0078 if (wait_seq)
0079 *wait_seq = seq;
0080
0081 txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
0082 txd = (__le32 *)skb_push(skb, txd_len);
0083
0084 if (cmd != MCU_CMD(FW_SCATTER)) {
0085 q_idx = MT_TX_MCU_PORT_RX_Q0;
0086 pkt_fmt = MT_TX_TYPE_CMD;
0087 } else {
0088 q_idx = MT_TX_MCU_PORT_RX_FWDL;
0089 pkt_fmt = MT_TX_TYPE_FW;
0090 }
0091
0092 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
0093 FIELD_PREP(MT_TXD0_P_IDX, MT_TX_PORT_IDX_MCU) |
0094 FIELD_PREP(MT_TXD0_Q_IDX, q_idx);
0095 txd[0] = cpu_to_le32(val);
0096
0097 val = MT_TXD1_LONG_FORMAT |
0098 FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD) |
0099 FIELD_PREP(MT_TXD1_PKT_FMT, pkt_fmt);
0100 txd[1] = cpu_to_le32(val);
0101
0102 if (cmd & __MCU_CMD_FIELD_UNI) {
0103 uni_txd = (struct mt7615_uni_txd *)txd;
0104 uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
0105 uni_txd->option = MCU_CMD_UNI_EXT_ACK;
0106 uni_txd->cid = cpu_to_le16(mcu_cmd);
0107 uni_txd->s2d_index = MCU_S2D_H2N;
0108 uni_txd->pkt_type = MCU_PKT_ID;
0109 uni_txd->seq = seq;
0110
0111 return;
0112 }
0113
0114 mcu_txd = (struct mt7615_mcu_txd *)txd;
0115 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
0116 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU, q_idx));
0117 mcu_txd->s2d_index = MCU_S2D_H2N;
0118 mcu_txd->pkt_type = MCU_PKT_ID;
0119 mcu_txd->seq = seq;
0120 mcu_txd->cid = mcu_cmd;
0121 mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
0122
0123 if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {
0124 if (cmd & __MCU_CMD_FIELD_QUERY)
0125 mcu_txd->set_query = MCU_Q_QUERY;
0126 else
0127 mcu_txd->set_query = MCU_Q_SET;
0128 mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid;
0129 } else {
0130 mcu_txd->set_query = MCU_Q_NA;
0131 }
0132 }
0133 EXPORT_SYMBOL_GPL(mt7615_mcu_fill_msg);
0134
0135 int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd,
0136 struct sk_buff *skb, int seq)
0137 {
0138 struct mt7615_mcu_rxd *rxd;
0139 int ret = 0;
0140
0141 if (!skb) {
0142 dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
0143 cmd, seq);
0144 return -ETIMEDOUT;
0145 }
0146
0147 rxd = (struct mt7615_mcu_rxd *)skb->data;
0148 if (seq != rxd->seq)
0149 return -EAGAIN;
0150
0151 if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) {
0152 skb_pull(skb, sizeof(*rxd) - 4);
0153 ret = *skb->data;
0154 } else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
0155 skb_pull(skb, sizeof(*rxd));
0156 ret = le32_to_cpu(*(__le32 *)skb->data);
0157 } else if (cmd == MCU_EXT_QUERY(RF_REG_ACCESS)) {
0158 skb_pull(skb, sizeof(*rxd));
0159 ret = le32_to_cpu(*(__le32 *)&skb->data[8]);
0160 } else if (cmd == MCU_UNI_CMD(DEV_INFO_UPDATE) ||
0161 cmd == MCU_UNI_CMD(BSS_INFO_UPDATE) ||
0162 cmd == MCU_UNI_CMD(STA_REC_UPDATE) ||
0163 cmd == MCU_UNI_CMD(HIF_CTRL) ||
0164 cmd == MCU_UNI_CMD(OFFLOAD) ||
0165 cmd == MCU_UNI_CMD(SUSPEND)) {
0166 struct mt7615_mcu_uni_event *event;
0167
0168 skb_pull(skb, sizeof(*rxd));
0169 event = (struct mt7615_mcu_uni_event *)skb->data;
0170 ret = le32_to_cpu(event->status);
0171 } else if (cmd == MCU_CE_QUERY(REG_READ)) {
0172 struct mt7615_mcu_reg_event *event;
0173
0174 skb_pull(skb, sizeof(*rxd));
0175 event = (struct mt7615_mcu_reg_event *)skb->data;
0176 ret = (int)le32_to_cpu(event->val);
0177 }
0178
0179 return ret;
0180 }
0181 EXPORT_SYMBOL_GPL(mt7615_mcu_parse_response);
0182
0183 static int
0184 mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
0185 int cmd, int *seq)
0186 {
0187 struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
0188 enum mt76_mcuq_id qid;
0189
0190 mt7615_mcu_fill_msg(dev, skb, cmd, seq);
0191 if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
0192 qid = MT_MCUQ_WM;
0193 else
0194 qid = MT_MCUQ_FWDL;
0195
0196 return mt76_tx_queue_skb_raw(dev, dev->mt76.q_mcu[qid], skb, 0);
0197 }
0198
0199 u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg)
0200 {
0201 struct {
0202 __le32 wifi_stream;
0203 __le32 address;
0204 __le32 data;
0205 } req = {
0206 .wifi_stream = cpu_to_le32(wf),
0207 .address = cpu_to_le32(reg),
0208 };
0209
0210 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_QUERY(RF_REG_ACCESS),
0211 &req, sizeof(req), true);
0212 }
0213
0214 int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val)
0215 {
0216 struct {
0217 __le32 wifi_stream;
0218 __le32 address;
0219 __le32 data;
0220 } req = {
0221 .wifi_stream = cpu_to_le32(wf),
0222 .address = cpu_to_le32(reg),
0223 .data = cpu_to_le32(val),
0224 };
0225
0226 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RF_REG_ACCESS),
0227 &req, sizeof(req), false);
0228 }
0229
0230 void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en)
0231 {
0232 if (!is_mt7622(&dev->mt76))
0233 return;
0234
0235 regmap_update_bits(dev->infracfg, MT_INFRACFG_MISC,
0236 MT_INFRACFG_MISC_AP2CONN_WAKE,
0237 !en * MT_INFRACFG_MISC_AP2CONN_WAKE);
0238 }
0239 EXPORT_SYMBOL_GPL(mt7622_trigger_hif_int);
0240
0241 static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev)
0242 {
0243 struct mt76_phy *mphy = &dev->mt76.phy;
0244 struct mt76_connac_pm *pm = &dev->pm;
0245 struct mt76_dev *mdev = &dev->mt76;
0246 u32 addr;
0247 int err;
0248
0249 if (is_mt7663(mdev)) {
0250
0251 mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
0252 mt76_poll(dev, MT_CONN_ON_MISC, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);
0253
0254 addr = MT_CONN_HIF_ON_LPCTL;
0255 } else {
0256 addr = MT_CFG_LPCR_HOST;
0257 }
0258
0259 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_DRV_OWN);
0260
0261 mt7622_trigger_hif_int(dev, true);
0262
0263 err = !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);
0264
0265 mt7622_trigger_hif_int(dev, false);
0266
0267 if (err) {
0268 dev_err(mdev->dev, "driver own failed\n");
0269 return -ETIMEDOUT;
0270 }
0271
0272 clear_bit(MT76_STATE_PM, &mphy->state);
0273
0274 pm->stats.last_wake_event = jiffies;
0275 pm->stats.doze_time += pm->stats.last_wake_event -
0276 pm->stats.last_doze_event;
0277
0278 return 0;
0279 }
0280
0281 static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev)
0282 {
0283 struct mt76_phy *mphy = &dev->mt76.phy;
0284 struct mt76_connac_pm *pm = &dev->pm;
0285 int i, err = 0;
0286
0287 mutex_lock(&pm->mutex);
0288
0289 if (!test_bit(MT76_STATE_PM, &mphy->state))
0290 goto out;
0291
0292 for (i = 0; i < MT7615_DRV_OWN_RETRY_COUNT; i++) {
0293 mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
0294 if (mt76_poll_msec(dev, MT_CONN_HIF_ON_LPCTL,
0295 MT_CFG_LPCR_HOST_FW_OWN, 0, 50))
0296 break;
0297 }
0298
0299 if (i == MT7615_DRV_OWN_RETRY_COUNT) {
0300 dev_err(dev->mt76.dev, "driver own failed\n");
0301 err = -EIO;
0302 goto out;
0303 }
0304 clear_bit(MT76_STATE_PM, &mphy->state);
0305
0306 pm->stats.last_wake_event = jiffies;
0307 pm->stats.doze_time += pm->stats.last_wake_event -
0308 pm->stats.last_doze_event;
0309 out:
0310 mutex_unlock(&pm->mutex);
0311
0312 return err;
0313 }
0314
0315 static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev)
0316 {
0317 struct mt76_phy *mphy = &dev->mt76.phy;
0318 struct mt76_connac_pm *pm = &dev->pm;
0319 int err = 0;
0320 u32 addr;
0321
0322 mutex_lock(&pm->mutex);
0323
0324 if (mt76_connac_skip_fw_pmctrl(mphy, pm))
0325 goto out;
0326
0327 mt7622_trigger_hif_int(dev, true);
0328
0329 addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
0330 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN);
0331
0332 if (is_mt7622(&dev->mt76) &&
0333 !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN,
0334 MT_CFG_LPCR_HOST_FW_OWN, 3000)) {
0335 dev_err(dev->mt76.dev, "Timeout for firmware own\n");
0336 clear_bit(MT76_STATE_PM, &mphy->state);
0337 err = -EIO;
0338 }
0339
0340 mt7622_trigger_hif_int(dev, false);
0341 if (!err) {
0342 pm->stats.last_doze_event = jiffies;
0343 pm->stats.awake_time += pm->stats.last_doze_event -
0344 pm->stats.last_wake_event;
0345 }
0346 out:
0347 mutex_unlock(&pm->mutex);
0348
0349 return err;
0350 }
0351
0352 static void
0353 mt7615_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
0354 {
0355 if (vif->bss_conf.csa_active)
0356 ieee80211_csa_finish(vif);
0357 }
0358
0359 static void
0360 mt7615_mcu_rx_csa_notify(struct mt7615_dev *dev, struct sk_buff *skb)
0361 {
0362 struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
0363 struct mt76_phy *mphy = &dev->mt76.phy;
0364 struct mt7615_mcu_csa_notify *c;
0365
0366 c = (struct mt7615_mcu_csa_notify *)skb->data;
0367
0368 if (c->omac_idx > EXT_BSSID_MAX)
0369 return;
0370
0371 if (ext_phy && ext_phy->omac_mask & BIT_ULL(c->omac_idx))
0372 mphy = dev->mt76.phys[MT_BAND1];
0373
0374 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
0375 IEEE80211_IFACE_ITER_RESUME_ALL,
0376 mt7615_mcu_csa_finish, mphy->hw);
0377 }
0378
0379 static void
0380 mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
0381 {
0382 struct mt76_phy *mphy = &dev->mt76.phy;
0383 struct mt7615_mcu_rdd_report *r;
0384
0385 r = (struct mt7615_mcu_rdd_report *)skb->data;
0386
0387 if (!dev->radar_pattern.n_pulses && !r->long_detected &&
0388 !r->constant_prf_detected && !r->staggered_prf_detected)
0389 return;
0390
0391 if (r->band_idx && dev->mt76.phys[MT_BAND1])
0392 mphy = dev->mt76.phys[MT_BAND1];
0393
0394 if (mt76_phy_dfs_state(mphy) < MT_DFS_STATE_CAC)
0395 return;
0396
0397 ieee80211_radar_detected(mphy->hw);
0398 dev->hw_pattern++;
0399 }
0400
0401 static void
0402 mt7615_mcu_rx_log_message(struct mt7615_dev *dev, struct sk_buff *skb)
0403 {
0404 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
0405 const char *data = (char *)&rxd[1];
0406 const char *type;
0407
0408 switch (rxd->s2d_index) {
0409 case 0:
0410 type = "N9";
0411 break;
0412 case 2:
0413 type = "CR4";
0414 break;
0415 default:
0416 type = "unknown";
0417 break;
0418 }
0419
0420 wiphy_info(mt76_hw(dev)->wiphy, "%s: %.*s", type,
0421 (int)(skb->len - sizeof(*rxd)), data);
0422 }
0423
0424 static void
0425 mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb)
0426 {
0427 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
0428
0429 switch (rxd->ext_eid) {
0430 case MCU_EXT_EVENT_RDD_REPORT:
0431 mt7615_mcu_rx_radar_detected(dev, skb);
0432 break;
0433 case MCU_EXT_EVENT_CSA_NOTIFY:
0434 mt7615_mcu_rx_csa_notify(dev, skb);
0435 break;
0436 case MCU_EXT_EVENT_FW_LOG_2_HOST:
0437 mt7615_mcu_rx_log_message(dev, skb);
0438 break;
0439 default:
0440 break;
0441 }
0442 }
0443
0444 static void
0445 mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb)
0446 {
0447 u8 *seq_num = skb->data + sizeof(struct mt7615_mcu_rxd);
0448 struct mt7615_phy *phy;
0449 struct mt76_phy *mphy;
0450
0451 if (*seq_num & BIT(7) && dev->mt76.phys[MT_BAND1])
0452 mphy = dev->mt76.phys[MT_BAND1];
0453 else
0454 mphy = &dev->mt76.phy;
0455
0456 phy = (struct mt7615_phy *)mphy->priv;
0457
0458 spin_lock_bh(&dev->mt76.lock);
0459 __skb_queue_tail(&phy->scan_event_list, skb);
0460 spin_unlock_bh(&dev->mt76.lock);
0461
0462 ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work,
0463 MT7615_HW_SCAN_TIMEOUT);
0464 }
0465
0466 static void
0467 mt7615_mcu_roc_event(struct mt7615_dev *dev, struct sk_buff *skb)
0468 {
0469 struct mt7615_roc_tlv *event;
0470 struct mt7615_phy *phy;
0471 struct mt76_phy *mphy;
0472 int duration;
0473
0474 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
0475 event = (struct mt7615_roc_tlv *)skb->data;
0476
0477 if (event->dbdc_band && dev->mt76.phys[MT_BAND1])
0478 mphy = dev->mt76.phys[MT_BAND1];
0479 else
0480 mphy = &dev->mt76.phy;
0481
0482 ieee80211_ready_on_channel(mphy->hw);
0483
0484 phy = (struct mt7615_phy *)mphy->priv;
0485 phy->roc_grant = true;
0486 wake_up(&phy->roc_wait);
0487
0488 duration = le32_to_cpu(event->max_interval);
0489 mod_timer(&phy->roc_timer,
0490 round_jiffies_up(jiffies + msecs_to_jiffies(duration)));
0491 }
0492
0493 static void
0494 mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb)
0495 {
0496 struct mt76_connac_beacon_loss_event *event;
0497 struct mt76_phy *mphy;
0498 u8 band_idx = 0;
0499
0500 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
0501 event = (struct mt76_connac_beacon_loss_event *)skb->data;
0502 if (band_idx && dev->mt76.phys[MT_BAND1])
0503 mphy = dev->mt76.phys[MT_BAND1];
0504 else
0505 mphy = &dev->mt76.phy;
0506
0507 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
0508 IEEE80211_IFACE_ITER_RESUME_ALL,
0509 mt76_connac_mcu_beacon_loss_iter,
0510 event);
0511 }
0512
0513 static void
0514 mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb)
0515 {
0516 struct mt76_connac_mcu_bss_event *event;
0517 struct mt76_phy *mphy;
0518 u8 band_idx = 0;
0519
0520 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
0521 event = (struct mt76_connac_mcu_bss_event *)skb->data;
0522
0523 if (band_idx && dev->mt76.phys[MT_BAND1])
0524 mphy = dev->mt76.phys[MT_BAND1];
0525 else
0526 mphy = &dev->mt76.phy;
0527
0528 if (event->is_absent)
0529 ieee80211_stop_queues(mphy->hw);
0530 else
0531 ieee80211_wake_queues(mphy->hw);
0532 }
0533
0534 static void
0535 mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb)
0536 {
0537 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
0538
0539 switch (rxd->eid) {
0540 case MCU_EVENT_EXT:
0541 mt7615_mcu_rx_ext_event(dev, skb);
0542 break;
0543 case MCU_EVENT_BSS_BEACON_LOSS:
0544 mt7615_mcu_beacon_loss_event(dev, skb);
0545 break;
0546 case MCU_EVENT_ROC:
0547 mt7615_mcu_roc_event(dev, skb);
0548 break;
0549 case MCU_EVENT_SCHED_SCAN_DONE:
0550 case MCU_EVENT_SCAN_DONE:
0551 mt7615_mcu_scan_event(dev, skb);
0552 return;
0553 case MCU_EVENT_BSS_ABSENCE:
0554 mt7615_mcu_bss_event(dev, skb);
0555 break;
0556 case MCU_EVENT_COREDUMP:
0557 mt76_connac_mcu_coredump_event(&dev->mt76, skb,
0558 &dev->coredump);
0559 return;
0560 default:
0561 break;
0562 }
0563 dev_kfree_skb(skb);
0564 }
0565
0566 void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb)
0567 {
0568 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
0569
0570 if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
0571 rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
0572 rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
0573 rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
0574 rxd->eid == MCU_EVENT_BSS_BEACON_LOSS ||
0575 rxd->eid == MCU_EVENT_SCHED_SCAN_DONE ||
0576 rxd->eid == MCU_EVENT_BSS_ABSENCE ||
0577 rxd->eid == MCU_EVENT_SCAN_DONE ||
0578 rxd->eid == MCU_EVENT_COREDUMP ||
0579 rxd->eid == MCU_EVENT_ROC ||
0580 !rxd->seq)
0581 mt7615_mcu_rx_unsolicited_event(dev, skb);
0582 else
0583 mt76_mcu_rx_event(&dev->mt76, skb);
0584 }
0585
0586 static int
0587 mt7615_mcu_muar_config(struct mt7615_dev *dev, struct ieee80211_vif *vif,
0588 bool bssid, bool enable)
0589 {
0590 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
0591 u32 idx = mvif->mt76.omac_idx - REPEATER_BSSID_START;
0592 u32 mask = dev->omac_mask >> 32 & ~BIT(idx);
0593 const u8 *addr = vif->addr;
0594 struct {
0595 u8 mode;
0596 u8 force_clear;
0597 u8 clear_bitmap[8];
0598 u8 entry_count;
0599 u8 write;
0600
0601 u8 index;
0602 u8 bssid;
0603 u8 addr[ETH_ALEN];
0604 } __packed req = {
0605 .mode = !!mask || enable,
0606 .entry_count = 1,
0607 .write = 1,
0608
0609 .index = idx * 2 + bssid,
0610 };
0611
0612 if (bssid)
0613 addr = vif->bss_conf.bssid;
0614
0615 if (enable)
0616 ether_addr_copy(req.addr, addr);
0617
0618 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE),
0619 &req, sizeof(req), true);
0620 }
0621
0622 static int
0623 mt7615_mcu_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
0624 bool enable)
0625 {
0626 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
0627 struct mt7615_dev *dev = phy->dev;
0628 struct {
0629 struct req_hdr {
0630 u8 omac_idx;
0631 u8 band_idx;
0632 __le16 tlv_num;
0633 u8 is_tlv_append;
0634 u8 rsv[3];
0635 } __packed hdr;
0636 struct req_tlv {
0637 __le16 tag;
0638 __le16 len;
0639 u8 active;
0640 u8 band_idx;
0641 u8 omac_addr[ETH_ALEN];
0642 } __packed tlv;
0643 } data = {
0644 .hdr = {
0645 .omac_idx = mvif->mt76.omac_idx,
0646 .band_idx = mvif->mt76.band_idx,
0647 .tlv_num = cpu_to_le16(1),
0648 .is_tlv_append = 1,
0649 },
0650 .tlv = {
0651 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
0652 .len = cpu_to_le16(sizeof(struct req_tlv)),
0653 .active = enable,
0654 .band_idx = mvif->mt76.band_idx,
0655 },
0656 };
0657
0658 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
0659 return mt7615_mcu_muar_config(dev, vif, false, enable);
0660
0661 memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
0662 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE),
0663 &data, sizeof(data), true);
0664 }
0665
0666 static int
0667 mt7615_mcu_add_beacon_offload(struct mt7615_dev *dev,
0668 struct ieee80211_hw *hw,
0669 struct ieee80211_vif *vif, bool enable)
0670 {
0671 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
0672 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
0673 struct ieee80211_mutable_offsets offs;
0674 struct ieee80211_tx_info *info;
0675 struct req {
0676 u8 omac_idx;
0677 u8 enable;
0678 u8 wlan_idx;
0679 u8 band_idx;
0680 u8 pkt_type;
0681 u8 need_pre_tbtt_int;
0682 __le16 csa_ie_pos;
0683 __le16 pkt_len;
0684 __le16 tim_ie_pos;
0685 u8 pkt[512];
0686 u8 csa_cnt;
0687
0688 u8 bcc_cnt;
0689 __le16 bcc_ie_pos;
0690 } __packed req = {
0691 .omac_idx = mvif->mt76.omac_idx,
0692 .enable = enable,
0693 .wlan_idx = wcid->idx,
0694 .band_idx = mvif->mt76.band_idx,
0695 };
0696 struct sk_buff *skb;
0697
0698 if (!enable)
0699 goto out;
0700
0701 skb = ieee80211_beacon_get_template(hw, vif, &offs, 0);
0702 if (!skb)
0703 return -EINVAL;
0704
0705 if (skb->len > 512 - MT_TXD_SIZE) {
0706 dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
0707 dev_kfree_skb(skb);
0708 return -EINVAL;
0709 }
0710
0711 info = IEEE80211_SKB_CB(skb);
0712 info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, mvif->mt76.band_idx);
0713
0714 mt7615_mac_write_txwi(dev, (__le32 *)(req.pkt), skb, wcid, NULL,
0715 0, NULL, 0, true);
0716 memcpy(req.pkt + MT_TXD_SIZE, skb->data, skb->len);
0717 req.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
0718 req.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
0719 if (offs.cntdwn_counter_offs[0]) {
0720 u16 csa_offs;
0721
0722 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
0723 req.csa_ie_pos = cpu_to_le16(csa_offs);
0724 req.csa_cnt = skb->data[offs.cntdwn_counter_offs[0]];
0725 }
0726 dev_kfree_skb(skb);
0727
0728 out:
0729 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(BCN_OFFLOAD), &req,
0730 sizeof(req), true);
0731 }
0732
0733 static int
0734 mt7615_mcu_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
0735 {
0736 return mt76_connac_mcu_set_pm(&dev->mt76, band, state);
0737 }
0738
0739 static int
0740 mt7615_mcu_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
0741 struct ieee80211_sta *sta, bool enable)
0742 {
0743 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
0744 struct mt7615_dev *dev = phy->dev;
0745 struct sk_buff *skb;
0746
0747 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
0748 mt7615_mcu_muar_config(dev, vif, true, enable);
0749
0750 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL);
0751 if (IS_ERR(skb))
0752 return PTR_ERR(skb);
0753
0754 if (enable)
0755 mt76_connac_mcu_bss_omac_tlv(skb, vif);
0756
0757 mt76_connac_mcu_bss_basic_tlv(skb, vif, sta, phy->mt76,
0758 mvif->sta.wcid.idx, enable);
0759
0760 if (enable && mvif->mt76.omac_idx >= EXT_BSSID_START &&
0761 mvif->mt76.omac_idx < REPEATER_BSSID_START)
0762 mt76_connac_mcu_bss_ext_tlv(skb, &mvif->mt76);
0763
0764 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
0765 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
0766 }
0767
0768 static int
0769 mt7615_mcu_wtbl_tx_ba(struct mt7615_dev *dev,
0770 struct ieee80211_ampdu_params *params,
0771 bool enable)
0772 {
0773 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
0774 struct mt7615_vif *mvif = msta->vif;
0775 struct wtbl_req_hdr *wtbl_hdr;
0776 struct sk_buff *skb = NULL;
0777 int err;
0778
0779 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
0780 WTBL_SET, NULL, &skb);
0781 if (IS_ERR(wtbl_hdr))
0782 return PTR_ERR(wtbl_hdr);
0783
0784 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, true,
0785 NULL, wtbl_hdr);
0786
0787 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
0788 MCU_EXT_CMD(WTBL_UPDATE), true);
0789 if (err < 0)
0790 return err;
0791
0792 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
0793 &msta->wcid);
0794 if (IS_ERR(skb))
0795 return PTR_ERR(skb);
0796
0797 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, true);
0798
0799 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
0800 MCU_EXT_CMD(STA_REC_UPDATE), true);
0801 }
0802
0803 static int
0804 mt7615_mcu_wtbl_rx_ba(struct mt7615_dev *dev,
0805 struct ieee80211_ampdu_params *params,
0806 bool enable)
0807 {
0808 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
0809 struct mt7615_vif *mvif = msta->vif;
0810 struct wtbl_req_hdr *wtbl_hdr;
0811 struct sk_buff *skb;
0812 int err;
0813
0814 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
0815 &msta->wcid);
0816 if (IS_ERR(skb))
0817 return PTR_ERR(skb);
0818
0819 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
0820
0821 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
0822 MCU_EXT_CMD(STA_REC_UPDATE), true);
0823 if (err < 0 || !enable)
0824 return err;
0825
0826 skb = NULL;
0827 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
0828 WTBL_SET, NULL, &skb);
0829 if (IS_ERR(wtbl_hdr))
0830 return PTR_ERR(wtbl_hdr);
0831
0832 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
0833 NULL, wtbl_hdr);
0834
0835 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
0836 MCU_EXT_CMD(WTBL_UPDATE), true);
0837 }
0838
0839 static int
0840 mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
0841 struct ieee80211_sta *sta, bool enable)
0842 {
0843 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
0844 struct sk_buff *skb, *sskb, *wskb = NULL;
0845 struct mt7615_dev *dev = phy->dev;
0846 struct wtbl_req_hdr *wtbl_hdr;
0847 struct mt7615_sta *msta;
0848 bool new_entry = true;
0849 int cmd, err;
0850
0851 msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
0852
0853 sskb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
0854 &msta->wcid);
0855 if (IS_ERR(sskb))
0856 return PTR_ERR(sskb);
0857
0858 if (!sta) {
0859 if (mvif->sta_added)
0860 new_entry = false;
0861 else
0862 mvif->sta_added = true;
0863 }
0864 mt76_connac_mcu_sta_basic_tlv(sskb, vif, sta, enable, new_entry);
0865 if (enable && sta)
0866 mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0,
0867 MT76_STA_INFO_STATE_ASSOC);
0868
0869 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
0870 WTBL_RESET_AND_SET, NULL,
0871 &wskb);
0872 if (IS_ERR(wtbl_hdr))
0873 return PTR_ERR(wtbl_hdr);
0874
0875 if (enable) {
0876 mt76_connac_mcu_wtbl_generic_tlv(&dev->mt76, wskb, vif, sta,
0877 NULL, wtbl_hdr);
0878 if (sta)
0879 mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, wskb, sta,
0880 NULL, wtbl_hdr, true, true);
0881 mt76_connac_mcu_wtbl_hdr_trans_tlv(wskb, vif, &msta->wcid,
0882 NULL, wtbl_hdr);
0883 }
0884
0885 cmd = enable ? MCU_EXT_CMD(WTBL_UPDATE) : MCU_EXT_CMD(STA_REC_UPDATE);
0886 skb = enable ? wskb : sskb;
0887
0888 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
0889 if (err < 0) {
0890 skb = enable ? sskb : wskb;
0891 dev_kfree_skb(skb);
0892
0893 return err;
0894 }
0895
0896 cmd = enable ? MCU_EXT_CMD(STA_REC_UPDATE) : MCU_EXT_CMD(WTBL_UPDATE);
0897 skb = enable ? sskb : wskb;
0898
0899 return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
0900 }
0901
0902 static int
0903 mt7615_mcu_wtbl_update_hdr_trans(struct mt7615_dev *dev,
0904 struct ieee80211_vif *vif,
0905 struct ieee80211_sta *sta)
0906 {
0907 return mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta);
0908 }
0909
0910 static const struct mt7615_mcu_ops wtbl_update_ops = {
0911 .add_beacon_offload = mt7615_mcu_add_beacon_offload,
0912 .set_pm_state = mt7615_mcu_ctrl_pm_state,
0913 .add_dev_info = mt7615_mcu_add_dev,
0914 .add_bss_info = mt7615_mcu_add_bss,
0915 .add_tx_ba = mt7615_mcu_wtbl_tx_ba,
0916 .add_rx_ba = mt7615_mcu_wtbl_rx_ba,
0917 .sta_add = mt7615_mcu_wtbl_sta_add,
0918 .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
0919 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
0920 .set_sta_decap_offload = mt7615_mcu_wtbl_update_hdr_trans,
0921 };
0922
0923 static int
0924 mt7615_mcu_sta_ba(struct mt7615_dev *dev,
0925 struct ieee80211_ampdu_params *params,
0926 bool enable, bool tx)
0927 {
0928 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
0929 struct mt7615_vif *mvif = msta->vif;
0930 struct wtbl_req_hdr *wtbl_hdr;
0931 struct tlv *sta_wtbl;
0932 struct sk_buff *skb;
0933
0934 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
0935 &msta->wcid);
0936 if (IS_ERR(skb))
0937 return PTR_ERR(skb);
0938
0939 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx);
0940
0941 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
0942
0943 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
0944 WTBL_SET, sta_wtbl, &skb);
0945 if (IS_ERR(wtbl_hdr))
0946 return PTR_ERR(wtbl_hdr);
0947
0948 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, tx,
0949 sta_wtbl, wtbl_hdr);
0950
0951 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
0952 MCU_EXT_CMD(STA_REC_UPDATE), true);
0953 }
0954
0955 static int
0956 mt7615_mcu_sta_tx_ba(struct mt7615_dev *dev,
0957 struct ieee80211_ampdu_params *params,
0958 bool enable)
0959 {
0960 return mt7615_mcu_sta_ba(dev, params, enable, true);
0961 }
0962
0963 static int
0964 mt7615_mcu_sta_rx_ba(struct mt7615_dev *dev,
0965 struct ieee80211_ampdu_params *params,
0966 bool enable)
0967 {
0968 return mt7615_mcu_sta_ba(dev, params, enable, false);
0969 }
0970
0971 static int
0972 __mt7615_mcu_add_sta(struct mt76_phy *phy, struct ieee80211_vif *vif,
0973 struct ieee80211_sta *sta, bool enable, int cmd,
0974 bool offload_fw)
0975 {
0976 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
0977 struct mt76_sta_cmd_info info = {
0978 .sta = sta,
0979 .vif = vif,
0980 .offload_fw = offload_fw,
0981 .enable = enable,
0982 .newly = true,
0983 .cmd = cmd,
0984 };
0985
0986 info.wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid;
0987 return mt76_connac_mcu_sta_cmd(phy, &info);
0988 }
0989
0990 static int
0991 mt7615_mcu_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
0992 struct ieee80211_sta *sta, bool enable)
0993 {
0994 return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
0995 MCU_EXT_CMD(STA_REC_UPDATE), false);
0996 }
0997
0998 static int
0999 mt7615_mcu_sta_update_hdr_trans(struct mt7615_dev *dev,
1000 struct ieee80211_vif *vif,
1001 struct ieee80211_sta *sta)
1002 {
1003 struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
1004
1005 return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76,
1006 vif, &msta->wcid,
1007 MCU_EXT_CMD(STA_REC_UPDATE));
1008 }
1009
1010 static const struct mt7615_mcu_ops sta_update_ops = {
1011 .add_beacon_offload = mt7615_mcu_add_beacon_offload,
1012 .set_pm_state = mt7615_mcu_ctrl_pm_state,
1013 .add_dev_info = mt7615_mcu_add_dev,
1014 .add_bss_info = mt7615_mcu_add_bss,
1015 .add_tx_ba = mt7615_mcu_sta_tx_ba,
1016 .add_rx_ba = mt7615_mcu_sta_rx_ba,
1017 .sta_add = mt7615_mcu_add_sta,
1018 .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
1019 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1020 .set_sta_decap_offload = mt7615_mcu_sta_update_hdr_trans,
1021 };
1022
1023 static int
1024 mt7615_mcu_uni_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
1025 {
1026 return 0;
1027 }
1028
1029 static int
1030 mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev,
1031 struct ieee80211_hw *hw,
1032 struct ieee80211_vif *vif,
1033 bool enable)
1034 {
1035 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1036 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1037 struct ieee80211_mutable_offsets offs;
1038 struct {
1039 struct req_hdr {
1040 u8 bss_idx;
1041 u8 pad[3];
1042 } __packed hdr;
1043 struct bcn_content_tlv {
1044 __le16 tag;
1045 __le16 len;
1046 __le16 tim_ie_pos;
1047 __le16 csa_ie_pos;
1048 __le16 bcc_ie_pos;
1049
1050
1051
1052
1053 u8 enable;
1054
1055
1056
1057 u8 type;
1058 __le16 pkt_len;
1059 u8 pkt[512];
1060 } __packed beacon_tlv;
1061 } req = {
1062 .hdr = {
1063 .bss_idx = mvif->mt76.idx,
1064 },
1065 .beacon_tlv = {
1066 .tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
1067 .len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
1068 .enable = enable,
1069 },
1070 };
1071 struct sk_buff *skb;
1072
1073 if (!enable)
1074 goto out;
1075
1076 skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs, 0);
1077 if (!skb)
1078 return -EINVAL;
1079
1080 if (skb->len > 512 - MT_TXD_SIZE) {
1081 dev_err(dev->mt76.dev, "beacon size limit exceed\n");
1082 dev_kfree_skb(skb);
1083 return -EINVAL;
1084 }
1085
1086 mt7615_mac_write_txwi(dev, (__le32 *)(req.beacon_tlv.pkt), skb,
1087 wcid, NULL, 0, NULL, 0, true);
1088 memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
1089 req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
1090 req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
1091
1092 if (offs.cntdwn_counter_offs[0]) {
1093 u16 csa_offs;
1094
1095 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
1096 req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
1097 }
1098 dev_kfree_skb(skb);
1099
1100 out:
1101 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1102 &req, sizeof(req), true);
1103 }
1104
1105 static int
1106 mt7615_mcu_uni_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1107 bool enable)
1108 {
1109 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1110
1111 return mt76_connac_mcu_uni_add_dev(phy->mt76, vif, &mvif->sta.wcid,
1112 enable);
1113 }
1114
1115 static int
1116 mt7615_mcu_uni_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1117 struct ieee80211_sta *sta, bool enable)
1118 {
1119 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1120
1121 return mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid,
1122 enable);
1123 }
1124
1125 static inline int
1126 mt7615_mcu_uni_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1127 struct ieee80211_sta *sta, bool enable)
1128 {
1129 return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
1130 MCU_UNI_CMD(STA_REC_UPDATE), true);
1131 }
1132
1133 static int
1134 mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev,
1135 struct ieee80211_ampdu_params *params,
1136 bool enable)
1137 {
1138 struct mt7615_sta *sta = (struct mt7615_sta *)params->sta->drv_priv;
1139
1140 return mt76_connac_mcu_sta_ba(&dev->mt76, &sta->vif->mt76, params,
1141 MCU_UNI_CMD(STA_REC_UPDATE), enable,
1142 true);
1143 }
1144
1145 static int
1146 mt7615_mcu_uni_rx_ba(struct mt7615_dev *dev,
1147 struct ieee80211_ampdu_params *params,
1148 bool enable)
1149 {
1150 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1151 struct mt7615_vif *mvif = msta->vif;
1152 struct wtbl_req_hdr *wtbl_hdr;
1153 struct tlv *sta_wtbl;
1154 struct sk_buff *skb;
1155 int err;
1156
1157 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1158 &msta->wcid);
1159 if (IS_ERR(skb))
1160 return PTR_ERR(skb);
1161
1162 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
1163
1164 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1165 MCU_UNI_CMD(STA_REC_UPDATE), true);
1166 if (err < 0 || !enable)
1167 return err;
1168
1169 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1170 &msta->wcid);
1171 if (IS_ERR(skb))
1172 return PTR_ERR(skb);
1173
1174 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1175 sizeof(struct tlv));
1176
1177 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1178 WTBL_SET, sta_wtbl, &skb);
1179 if (IS_ERR(wtbl_hdr))
1180 return PTR_ERR(wtbl_hdr);
1181
1182 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
1183 sta_wtbl, wtbl_hdr);
1184
1185 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1186 MCU_UNI_CMD(STA_REC_UPDATE), true);
1187 }
1188
1189 static int
1190 mt7615_mcu_sta_uni_update_hdr_trans(struct mt7615_dev *dev,
1191 struct ieee80211_vif *vif,
1192 struct ieee80211_sta *sta)
1193 {
1194 struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
1195
1196 return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76,
1197 vif, &msta->wcid,
1198 MCU_UNI_CMD(STA_REC_UPDATE));
1199 }
1200
1201 static const struct mt7615_mcu_ops uni_update_ops = {
1202 .add_beacon_offload = mt7615_mcu_uni_add_beacon_offload,
1203 .set_pm_state = mt7615_mcu_uni_ctrl_pm_state,
1204 .add_dev_info = mt7615_mcu_uni_add_dev,
1205 .add_bss_info = mt7615_mcu_uni_add_bss,
1206 .add_tx_ba = mt7615_mcu_uni_tx_ba,
1207 .add_rx_ba = mt7615_mcu_uni_rx_ba,
1208 .sta_add = mt7615_mcu_uni_add_sta,
1209 .set_drv_ctrl = mt7615_mcu_lp_drv_pmctrl,
1210 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1211 .set_sta_decap_offload = mt7615_mcu_sta_uni_update_hdr_trans,
1212 };
1213
1214 int mt7615_mcu_restart(struct mt76_dev *dev)
1215 {
1216 return mt76_mcu_send_msg(dev, MCU_CMD(RESTART_DL_REQ), NULL, 0, true);
1217 }
1218 EXPORT_SYMBOL_GPL(mt7615_mcu_restart);
1219
1220 static int mt7615_load_patch(struct mt7615_dev *dev, u32 addr, const char *name)
1221 {
1222 const struct mt7615_patch_hdr *hdr;
1223 const struct firmware *fw = NULL;
1224 int len, ret, sem;
1225
1226 ret = firmware_request_nowarn(&fw, name, dev->mt76.dev);
1227 if (ret)
1228 return ret;
1229
1230 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
1231 dev_err(dev->mt76.dev, "Invalid firmware\n");
1232 ret = -EINVAL;
1233 goto release_fw;
1234 }
1235
1236 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, true);
1237 switch (sem) {
1238 case PATCH_IS_DL:
1239 goto release_fw;
1240 case PATCH_NOT_DL_SEM_SUCCESS:
1241 break;
1242 default:
1243 dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
1244 ret = -EAGAIN;
1245 goto release_fw;
1246 }
1247
1248 hdr = (const struct mt7615_patch_hdr *)(fw->data);
1249
1250 dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
1251 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
1252
1253 len = fw->size - sizeof(*hdr);
1254
1255 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1256 DL_MODE_NEED_RSP);
1257 if (ret) {
1258 dev_err(dev->mt76.dev, "Download request failed\n");
1259 goto out;
1260 }
1261
1262 ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
1263 fw->data + sizeof(*hdr), len);
1264 if (ret) {
1265 dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1266 goto out;
1267 }
1268
1269 ret = mt76_connac_mcu_start_patch(&dev->mt76);
1270 if (ret)
1271 dev_err(dev->mt76.dev, "Failed to start patch\n");
1272
1273 out:
1274 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false);
1275 switch (sem) {
1276 case PATCH_REL_SEM_SUCCESS:
1277 break;
1278 default:
1279 ret = -EAGAIN;
1280 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
1281 break;
1282 }
1283
1284 release_fw:
1285 release_firmware(fw);
1286
1287 return ret;
1288 }
1289
1290 static int
1291 mt7615_mcu_send_ram_firmware(struct mt7615_dev *dev,
1292 const struct mt7615_fw_trailer *hdr,
1293 const u8 *data, bool is_cr4)
1294 {
1295 int n_region = is_cr4 ? CR4_REGION_NUM : N9_REGION_NUM;
1296 int err, i, offset = 0;
1297 u32 len, addr, mode;
1298
1299 for (i = 0; i < n_region; i++) {
1300 mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
1301 hdr[i].feature_set, is_cr4);
1302 len = le32_to_cpu(hdr[i].len) + IMG_CRC_LEN;
1303 addr = le32_to_cpu(hdr[i].addr);
1304
1305 err = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1306 mode);
1307 if (err) {
1308 dev_err(dev->mt76.dev, "Download request failed\n");
1309 return err;
1310 }
1311
1312 err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
1313 data + offset, len);
1314 if (err) {
1315 dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1316 return err;
1317 }
1318
1319 offset += len;
1320 }
1321
1322 return 0;
1323 }
1324
1325 static int mt7615_load_n9(struct mt7615_dev *dev, const char *name)
1326 {
1327 const struct mt7615_fw_trailer *hdr;
1328 const struct firmware *fw;
1329 int ret;
1330
1331 ret = request_firmware(&fw, name, dev->mt76.dev);
1332 if (ret)
1333 return ret;
1334
1335 if (!fw || !fw->data || fw->size < N9_REGION_NUM * sizeof(*hdr)) {
1336 dev_err(dev->mt76.dev, "Invalid firmware\n");
1337 ret = -EINVAL;
1338 goto out;
1339 }
1340
1341 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1342 N9_REGION_NUM * sizeof(*hdr));
1343
1344 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1345 hdr->fw_ver, hdr->build_date);
1346
1347 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, false);
1348 if (ret)
1349 goto out;
1350
1351 ret = mt76_connac_mcu_start_firmware(&dev->mt76,
1352 le32_to_cpu(hdr->addr),
1353 FW_START_OVERRIDE);
1354 if (ret) {
1355 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1356 goto out;
1357 }
1358
1359 snprintf(dev->mt76.hw->wiphy->fw_version,
1360 sizeof(dev->mt76.hw->wiphy->fw_version),
1361 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1362
1363 if (!is_mt7615(&dev->mt76)) {
1364 dev->fw_ver = MT7615_FIRMWARE_V2;
1365 dev->mcu_ops = &sta_update_ops;
1366 } else {
1367 dev->fw_ver = MT7615_FIRMWARE_V1;
1368 dev->mcu_ops = &wtbl_update_ops;
1369 }
1370
1371 out:
1372 release_firmware(fw);
1373 return ret;
1374 }
1375
1376 static int mt7615_load_cr4(struct mt7615_dev *dev, const char *name)
1377 {
1378 const struct mt7615_fw_trailer *hdr;
1379 const struct firmware *fw;
1380 int ret;
1381
1382 ret = request_firmware(&fw, name, dev->mt76.dev);
1383 if (ret)
1384 return ret;
1385
1386 if (!fw || !fw->data || fw->size < CR4_REGION_NUM * sizeof(*hdr)) {
1387 dev_err(dev->mt76.dev, "Invalid firmware\n");
1388 ret = -EINVAL;
1389 goto out;
1390 }
1391
1392 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1393 CR4_REGION_NUM * sizeof(*hdr));
1394
1395 dev_info(dev->mt76.dev, "CR4 Firmware Version: %.10s, Build Time: %.15s\n",
1396 hdr->fw_ver, hdr->build_date);
1397
1398 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, true);
1399 if (ret)
1400 goto out;
1401
1402 ret = mt76_connac_mcu_start_firmware(&dev->mt76, 0,
1403 FW_START_WORKING_PDA_CR4);
1404 if (ret) {
1405 dev_err(dev->mt76.dev, "Failed to start CR4 firmware\n");
1406 goto out;
1407 }
1408
1409 out:
1410 release_firmware(fw);
1411
1412 return ret;
1413 }
1414
1415 static int mt7615_load_ram(struct mt7615_dev *dev)
1416 {
1417 int ret;
1418
1419 ret = mt7615_load_n9(dev, MT7615_FIRMWARE_N9);
1420 if (ret)
1421 return ret;
1422
1423 return mt7615_load_cr4(dev, MT7615_FIRMWARE_CR4);
1424 }
1425
1426 static int mt7615_load_firmware(struct mt7615_dev *dev)
1427 {
1428 int ret;
1429 u32 val;
1430
1431 val = mt76_get_field(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE);
1432
1433 if (val != FW_STATE_FW_DOWNLOAD) {
1434 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1435 return -EIO;
1436 }
1437
1438 ret = mt7615_load_patch(dev, MT7615_PATCH_ADDRESS, MT7615_ROM_PATCH);
1439 if (ret)
1440 return ret;
1441
1442 ret = mt7615_load_ram(dev);
1443 if (ret)
1444 return ret;
1445
1446 if (!mt76_poll_msec(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE,
1447 FIELD_PREP(MT_TOP_MISC2_FW_STATE,
1448 FW_STATE_RDY), 500)) {
1449 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1450 return -EIO;
1451 }
1452
1453 return 0;
1454 }
1455
1456 static int mt7622_load_firmware(struct mt7615_dev *dev)
1457 {
1458 int ret;
1459 u32 val;
1460
1461 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1462
1463 val = mt76_get_field(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE);
1464 if (val != FW_STATE_FW_DOWNLOAD) {
1465 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1466 return -EIO;
1467 }
1468
1469 ret = mt7615_load_patch(dev, MT7622_PATCH_ADDRESS, MT7622_ROM_PATCH);
1470 if (ret)
1471 return ret;
1472
1473 ret = mt7615_load_n9(dev, MT7622_FIRMWARE_N9);
1474 if (ret)
1475 return ret;
1476
1477 if (!mt76_poll_msec(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE,
1478 FIELD_PREP(MT_TOP_OFF_RSV_FW_STATE,
1479 FW_STATE_NORMAL_TRX), 1500)) {
1480 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1481 return -EIO;
1482 }
1483
1484 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1485
1486 return 0;
1487 }
1488
1489 int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl)
1490 {
1491 struct {
1492 u8 ctrl_val;
1493 u8 pad[3];
1494 } data = {
1495 .ctrl_val = ctrl
1496 };
1497
1498 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST),
1499 &data, sizeof(data), true);
1500 }
1501
1502 static int mt7615_mcu_cal_cache_apply(struct mt7615_dev *dev)
1503 {
1504 struct {
1505 bool cache_enable;
1506 u8 pad[3];
1507 } data = {
1508 .cache_enable = true
1509 };
1510
1511 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(CAL_CACHE), &data,
1512 sizeof(data), false);
1513 }
1514
1515 static int mt7663_load_n9(struct mt7615_dev *dev, const char *name)
1516 {
1517 u32 offset = 0, override_addr = 0, flag = FW_START_DLYCAL;
1518 const struct mt76_connac2_fw_trailer *hdr;
1519 const struct mt7663_fw_buf *buf;
1520 const struct firmware *fw;
1521 const u8 *base_addr;
1522 int i, ret;
1523
1524 ret = request_firmware(&fw, name, dev->mt76.dev);
1525 if (ret)
1526 return ret;
1527
1528 if (!fw || !fw->data || fw->size < FW_V3_COMMON_TAILER_SIZE) {
1529 dev_err(dev->mt76.dev, "Invalid firmware\n");
1530 ret = -EINVAL;
1531 goto out;
1532 }
1533
1534 hdr = (const void *)(fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE);
1535 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1536 hdr->fw_ver, hdr->build_date);
1537 dev_info(dev->mt76.dev, "Region number: 0x%x\n", hdr->n_region);
1538
1539 base_addr = fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE;
1540 for (i = 0; i < hdr->n_region; i++) {
1541 u32 shift = (hdr->n_region - i) * FW_V3_REGION_TAILER_SIZE;
1542 u32 len, addr, mode;
1543
1544 dev_info(dev->mt76.dev, "Parsing tailer Region: %d\n", i);
1545
1546 buf = (const struct mt7663_fw_buf *)(base_addr - shift);
1547 mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
1548 buf->feature_set, false);
1549 addr = le32_to_cpu(buf->img_dest_addr);
1550 len = le32_to_cpu(buf->img_size);
1551
1552 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1553 mode);
1554 if (ret) {
1555 dev_err(dev->mt76.dev, "Download request failed\n");
1556 goto out;
1557 }
1558
1559 ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
1560 fw->data + offset, len);
1561 if (ret) {
1562 dev_err(dev->mt76.dev, "Failed to send firmware\n");
1563 goto out;
1564 }
1565
1566 offset += le32_to_cpu(buf->img_size);
1567 if (buf->feature_set & DL_MODE_VALID_RAM_ENTRY) {
1568 override_addr = le32_to_cpu(buf->img_dest_addr);
1569 dev_info(dev->mt76.dev, "Region %d, override_addr = 0x%08x\n",
1570 i, override_addr);
1571 }
1572 }
1573
1574 if (override_addr)
1575 flag |= FW_START_OVERRIDE;
1576
1577 dev_info(dev->mt76.dev, "override_addr = 0x%08x, option = %d\n",
1578 override_addr, flag);
1579
1580 ret = mt76_connac_mcu_start_firmware(&dev->mt76, override_addr, flag);
1581 if (ret) {
1582 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1583 goto out;
1584 }
1585
1586 snprintf(dev->mt76.hw->wiphy->fw_version,
1587 sizeof(dev->mt76.hw->wiphy->fw_version),
1588 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1589
1590 out:
1591 release_firmware(fw);
1592
1593 return ret;
1594 }
1595
1596 static int
1597 mt7663_load_rom_patch(struct mt7615_dev *dev, const char **n9_firmware)
1598 {
1599 const char *selected_rom, *secondary_rom = MT7663_ROM_PATCH;
1600 const char *primary_rom = MT7663_OFFLOAD_ROM_PATCH;
1601 int ret;
1602
1603 if (!prefer_offload_fw) {
1604 secondary_rom = MT7663_OFFLOAD_ROM_PATCH;
1605 primary_rom = MT7663_ROM_PATCH;
1606 }
1607 selected_rom = primary_rom;
1608
1609 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS, primary_rom);
1610 if (ret) {
1611 dev_info(dev->mt76.dev, "%s not found, switching to %s",
1612 primary_rom, secondary_rom);
1613 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS,
1614 secondary_rom);
1615 if (ret) {
1616 dev_err(dev->mt76.dev, "failed to load %s",
1617 secondary_rom);
1618 return ret;
1619 }
1620 selected_rom = secondary_rom;
1621 }
1622
1623 if (!strcmp(selected_rom, MT7663_OFFLOAD_ROM_PATCH)) {
1624 *n9_firmware = MT7663_OFFLOAD_FIRMWARE_N9;
1625 dev->fw_ver = MT7615_FIRMWARE_V3;
1626 dev->mcu_ops = &uni_update_ops;
1627 } else {
1628 *n9_firmware = MT7663_FIRMWARE_N9;
1629 dev->fw_ver = MT7615_FIRMWARE_V2;
1630 dev->mcu_ops = &sta_update_ops;
1631 }
1632
1633 return 0;
1634 }
1635
1636 int __mt7663_load_firmware(struct mt7615_dev *dev)
1637 {
1638 const char *n9_firmware;
1639 int ret;
1640
1641 ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY);
1642 if (ret) {
1643 dev_dbg(dev->mt76.dev, "Firmware is already download\n");
1644 return -EIO;
1645 }
1646
1647 ret = mt7663_load_rom_patch(dev, &n9_firmware);
1648 if (ret)
1649 return ret;
1650
1651 ret = mt7663_load_n9(dev, n9_firmware);
1652 if (ret)
1653 return ret;
1654
1655 if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY,
1656 MT_TOP_MISC2_FW_N9_RDY, 1500)) {
1657 ret = mt76_get_field(dev, MT_CONN_ON_MISC,
1658 MT7663_TOP_MISC2_FW_STATE);
1659 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1660 return -EIO;
1661 }
1662
1663 #ifdef CONFIG_PM
1664 if (mt7615_firmware_offload(dev))
1665 dev->mt76.hw->wiphy->wowlan = &mt76_connac_wowlan_support;
1666 #endif
1667
1668 dev_dbg(dev->mt76.dev, "Firmware init done\n");
1669
1670 return 0;
1671 }
1672 EXPORT_SYMBOL_GPL(__mt7663_load_firmware);
1673
1674 static int mt7663_load_firmware(struct mt7615_dev *dev)
1675 {
1676 int ret;
1677
1678 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1679
1680 ret = __mt7663_load_firmware(dev);
1681 if (ret)
1682 return ret;
1683
1684 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1685
1686 return 0;
1687 }
1688
1689 int mt7615_mcu_init(struct mt7615_dev *dev)
1690 {
1691 static const struct mt76_mcu_ops mt7615_mcu_ops = {
1692 .headroom = sizeof(struct mt7615_mcu_txd),
1693 .mcu_skb_send_msg = mt7615_mcu_send_message,
1694 .mcu_parse_response = mt7615_mcu_parse_response,
1695 .mcu_restart = mt7615_mcu_restart,
1696 };
1697 int ret;
1698
1699 dev->mt76.mcu_ops = &mt7615_mcu_ops,
1700
1701 ret = mt7615_mcu_drv_pmctrl(dev);
1702 if (ret)
1703 return ret;
1704
1705 switch (mt76_chip(&dev->mt76)) {
1706 case 0x7622:
1707 ret = mt7622_load_firmware(dev);
1708 break;
1709 case 0x7663:
1710 ret = mt7663_load_firmware(dev);
1711 break;
1712 default:
1713 ret = mt7615_load_firmware(dev);
1714 break;
1715 }
1716 if (ret)
1717 return ret;
1718
1719 mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
1720 dev_dbg(dev->mt76.dev, "Firmware init done\n");
1721 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
1722
1723 if (dev->dbdc_support) {
1724 ret = mt7615_mcu_cal_cache_apply(dev);
1725 if (ret)
1726 return ret;
1727 }
1728
1729 return mt7615_mcu_fw_log_2_host(dev, 0);
1730 }
1731 EXPORT_SYMBOL_GPL(mt7615_mcu_init);
1732
1733 void mt7615_mcu_exit(struct mt7615_dev *dev)
1734 {
1735 __mt76_mcu_restart(&dev->mt76);
1736 mt7615_mcu_set_fw_ctrl(dev);
1737 skb_queue_purge(&dev->mt76.mcu.res_q);
1738 }
1739 EXPORT_SYMBOL_GPL(mt7615_mcu_exit);
1740
1741 int mt7615_mcu_set_eeprom(struct mt7615_dev *dev)
1742 {
1743 struct {
1744 u8 buffer_mode;
1745 u8 content_format;
1746 __le16 len;
1747 } __packed req_hdr = {
1748 .buffer_mode = 1,
1749 };
1750 u8 *eep = (u8 *)dev->mt76.eeprom.data;
1751 struct sk_buff *skb;
1752 int eep_len, offset;
1753
1754 switch (mt76_chip(&dev->mt76)) {
1755 case 0x7622:
1756 eep_len = MT7622_EE_MAX - MT_EE_NIC_CONF_0;
1757 offset = MT_EE_NIC_CONF_0;
1758 break;
1759 case 0x7663:
1760 eep_len = MT7663_EE_MAX - MT_EE_CHIP_ID;
1761 req_hdr.content_format = 1;
1762 offset = MT_EE_CHIP_ID;
1763 break;
1764 default:
1765 eep_len = MT7615_EE_MAX - MT_EE_NIC_CONF_0;
1766 offset = MT_EE_NIC_CONF_0;
1767 break;
1768 }
1769
1770 req_hdr.len = cpu_to_le16(eep_len);
1771
1772 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req_hdr) + eep_len);
1773 if (!skb)
1774 return -ENOMEM;
1775
1776 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
1777 skb_put_data(skb, eep + offset, eep_len);
1778
1779 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1780 MCU_EXT_CMD(EFUSE_BUFFER_MODE), true);
1781 }
1782
1783 int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue,
1784 const struct ieee80211_tx_queue_params *params)
1785 {
1786 #define WMM_AIFS_SET BIT(0)
1787 #define WMM_CW_MIN_SET BIT(1)
1788 #define WMM_CW_MAX_SET BIT(2)
1789 #define WMM_TXOP_SET BIT(3)
1790 #define WMM_PARAM_SET (WMM_AIFS_SET | WMM_CW_MIN_SET | \
1791 WMM_CW_MAX_SET | WMM_TXOP_SET)
1792 struct req_data {
1793 u8 number;
1794 u8 rsv[3];
1795 u8 queue;
1796 u8 valid;
1797 u8 aifs;
1798 u8 cw_min;
1799 __le16 cw_max;
1800 __le16 txop;
1801 } __packed req = {
1802 .number = 1,
1803 .queue = queue,
1804 .valid = WMM_PARAM_SET,
1805 .aifs = params->aifs,
1806 .cw_min = 5,
1807 .cw_max = cpu_to_le16(10),
1808 .txop = cpu_to_le16(params->txop),
1809 };
1810
1811 if (params->cw_min)
1812 req.cw_min = fls(params->cw_min);
1813 if (params->cw_max)
1814 req.cw_max = cpu_to_le16(fls(params->cw_max));
1815
1816 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE),
1817 &req, sizeof(req), true);
1818 }
1819
1820 int mt7615_mcu_set_dbdc(struct mt7615_dev *dev)
1821 {
1822 struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
1823 struct dbdc_entry {
1824 u8 type;
1825 u8 index;
1826 u8 band;
1827 u8 _rsv;
1828 };
1829 struct {
1830 u8 enable;
1831 u8 num;
1832 u8 _rsv[2];
1833 struct dbdc_entry entry[64];
1834 } req = {
1835 .enable = !!ext_phy,
1836 };
1837 int i;
1838
1839 if (!ext_phy)
1840 goto out;
1841
1842 #define ADD_DBDC_ENTRY(_type, _idx, _band) \
1843 do { \
1844 req.entry[req.num].type = _type; \
1845 req.entry[req.num].index = _idx; \
1846 req.entry[req.num++].band = _band; \
1847 } while (0)
1848
1849 for (i = 0; i < 4; i++) {
1850 bool band = !!(ext_phy->omac_mask & BIT_ULL(i));
1851
1852 ADD_DBDC_ENTRY(DBDC_TYPE_BSS, i, band);
1853 }
1854
1855 for (i = 0; i < 14; i++) {
1856 bool band = !!(ext_phy->omac_mask & BIT_ULL(0x11 + i));
1857
1858 ADD_DBDC_ENTRY(DBDC_TYPE_MBSS, i, band);
1859 }
1860
1861 ADD_DBDC_ENTRY(DBDC_TYPE_MU, 0, 1);
1862
1863 for (i = 0; i < 3; i++)
1864 ADD_DBDC_ENTRY(DBDC_TYPE_BF, i, 1);
1865
1866 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 0, 0);
1867 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 1, 0);
1868 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 2, 1);
1869 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 3, 1);
1870
1871 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 0, 0);
1872 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 1, 1);
1873
1874 out:
1875 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DBDC_CTRL), &req,
1876 sizeof(req), true);
1877 }
1878
1879 int mt7615_mcu_del_wtbl_all(struct mt7615_dev *dev)
1880 {
1881 struct wtbl_req_hdr req = {
1882 .operation = WTBL_RESET_ALL,
1883 };
1884
1885 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(WTBL_UPDATE),
1886 &req, sizeof(req), true);
1887 }
1888
1889 int mt7615_mcu_set_fcc5_lpn(struct mt7615_dev *dev, int val)
1890 {
1891 struct {
1892 __le16 tag;
1893 __le16 min_lpn;
1894 } req = {
1895 .tag = cpu_to_le16(0x1),
1896 .min_lpn = cpu_to_le16(val),
1897 };
1898
1899 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
1900 &req, sizeof(req), true);
1901 }
1902
1903 int mt7615_mcu_set_pulse_th(struct mt7615_dev *dev,
1904 const struct mt7615_dfs_pulse *pulse)
1905 {
1906 struct {
1907 __le16 tag;
1908 __le32 max_width;
1909 __le32 max_pwr;
1910 __le32 min_pwr;
1911 __le32 min_stgr_pri;
1912 __le32 max_stgr_pri;
1913 __le32 min_cr_pri;
1914 __le32 max_cr_pri;
1915 } req = {
1916 .tag = cpu_to_le16(0x3),
1917 #define __req_field(field) .field = cpu_to_le32(pulse->field)
1918 __req_field(max_width),
1919 __req_field(max_pwr),
1920 __req_field(min_pwr),
1921 __req_field(min_stgr_pri),
1922 __req_field(max_stgr_pri),
1923 __req_field(min_cr_pri),
1924 __req_field(max_cr_pri),
1925 #undef __req_field
1926 };
1927
1928 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
1929 &req, sizeof(req), true);
1930 }
1931
1932 int mt7615_mcu_set_radar_th(struct mt7615_dev *dev, int index,
1933 const struct mt7615_dfs_pattern *pattern)
1934 {
1935 struct {
1936 __le16 tag;
1937 __le16 radar_type;
1938 u8 enb;
1939 u8 stgr;
1940 u8 min_crpn;
1941 u8 max_crpn;
1942 u8 min_crpr;
1943 u8 min_pw;
1944 u8 max_pw;
1945 __le32 min_pri;
1946 __le32 max_pri;
1947 u8 min_crbn;
1948 u8 max_crbn;
1949 u8 min_stgpn;
1950 u8 max_stgpn;
1951 u8 min_stgpr;
1952 } req = {
1953 .tag = cpu_to_le16(0x2),
1954 .radar_type = cpu_to_le16(index),
1955 #define __req_field_u8(field) .field = pattern->field
1956 #define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
1957 __req_field_u8(enb),
1958 __req_field_u8(stgr),
1959 __req_field_u8(min_crpn),
1960 __req_field_u8(max_crpn),
1961 __req_field_u8(min_crpr),
1962 __req_field_u8(min_pw),
1963 __req_field_u8(max_pw),
1964 __req_field_u32(min_pri),
1965 __req_field_u32(max_pri),
1966 __req_field_u8(min_crbn),
1967 __req_field_u8(max_crbn),
1968 __req_field_u8(min_stgpn),
1969 __req_field_u8(max_stgpn),
1970 __req_field_u8(min_stgpr),
1971 #undef __req_field_u8
1972 #undef __req_field_u32
1973 };
1974
1975 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
1976 &req, sizeof(req), true);
1977 }
1978
1979 int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev)
1980 {
1981 struct {
1982 u8 pulse_num;
1983 u8 rsv[3];
1984 struct {
1985 __le32 start_time;
1986 __le16 width;
1987 __le16 power;
1988 } pattern[32];
1989 } req = {
1990 .pulse_num = dev->radar_pattern.n_pulses,
1991 };
1992 u32 start_time = ktime_to_ms(ktime_get_boottime());
1993 int i;
1994
1995 if (dev->radar_pattern.n_pulses > ARRAY_SIZE(req.pattern))
1996 return -EINVAL;
1997
1998
1999 for (i = 0; i < dev->radar_pattern.n_pulses; i++) {
2000 u32 ts = start_time + i * dev->radar_pattern.period;
2001
2002 req.pattern[i].width = cpu_to_le16(dev->radar_pattern.width);
2003 req.pattern[i].power = cpu_to_le16(dev->radar_pattern.power);
2004 req.pattern[i].start_time = cpu_to_le32(ts);
2005 }
2006
2007 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_PATTERN),
2008 &req, sizeof(req), false);
2009 }
2010
2011 static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
2012 {
2013 struct mt76_phy *mphy = phy->mt76;
2014 struct ieee80211_hw *hw = mphy->hw;
2015 struct mt76_power_limits limits;
2016 s8 *limits_array = (s8 *)&limits;
2017 int n_chains = hweight8(mphy->antenna_mask);
2018 int tx_power = hw->conf.power_level * 2;
2019 int i;
2020 static const u8 sku_mapping[] = {
2021 #define SKU_FIELD(_type, _field) \
2022 [MT_SKU_##_type] = offsetof(struct mt76_power_limits, _field)
2023 SKU_FIELD(CCK_1_2, cck[0]),
2024 SKU_FIELD(CCK_55_11, cck[2]),
2025 SKU_FIELD(OFDM_6_9, ofdm[0]),
2026 SKU_FIELD(OFDM_12_18, ofdm[2]),
2027 SKU_FIELD(OFDM_24_36, ofdm[4]),
2028 SKU_FIELD(OFDM_48, ofdm[6]),
2029 SKU_FIELD(OFDM_54, ofdm[7]),
2030 SKU_FIELD(HT20_0_8, mcs[0][0]),
2031 SKU_FIELD(HT20_32, ofdm[0]),
2032 SKU_FIELD(HT20_1_2_9_10, mcs[0][1]),
2033 SKU_FIELD(HT20_3_4_11_12, mcs[0][3]),
2034 SKU_FIELD(HT20_5_13, mcs[0][5]),
2035 SKU_FIELD(HT20_6_14, mcs[0][6]),
2036 SKU_FIELD(HT20_7_15, mcs[0][7]),
2037 SKU_FIELD(HT40_0_8, mcs[1][0]),
2038 SKU_FIELD(HT40_32, ofdm[0]),
2039 SKU_FIELD(HT40_1_2_9_10, mcs[1][1]),
2040 SKU_FIELD(HT40_3_4_11_12, mcs[1][3]),
2041 SKU_FIELD(HT40_5_13, mcs[1][5]),
2042 SKU_FIELD(HT40_6_14, mcs[1][6]),
2043 SKU_FIELD(HT40_7_15, mcs[1][7]),
2044 SKU_FIELD(VHT20_0, mcs[0][0]),
2045 SKU_FIELD(VHT20_1_2, mcs[0][1]),
2046 SKU_FIELD(VHT20_3_4, mcs[0][3]),
2047 SKU_FIELD(VHT20_5_6, mcs[0][5]),
2048 SKU_FIELD(VHT20_7, mcs[0][7]),
2049 SKU_FIELD(VHT20_8, mcs[0][8]),
2050 SKU_FIELD(VHT20_9, mcs[0][9]),
2051 SKU_FIELD(VHT40_0, mcs[1][0]),
2052 SKU_FIELD(VHT40_1_2, mcs[1][1]),
2053 SKU_FIELD(VHT40_3_4, mcs[1][3]),
2054 SKU_FIELD(VHT40_5_6, mcs[1][5]),
2055 SKU_FIELD(VHT40_7, mcs[1][7]),
2056 SKU_FIELD(VHT40_8, mcs[1][8]),
2057 SKU_FIELD(VHT40_9, mcs[1][9]),
2058 SKU_FIELD(VHT80_0, mcs[2][0]),
2059 SKU_FIELD(VHT80_1_2, mcs[2][1]),
2060 SKU_FIELD(VHT80_3_4, mcs[2][3]),
2061 SKU_FIELD(VHT80_5_6, mcs[2][5]),
2062 SKU_FIELD(VHT80_7, mcs[2][7]),
2063 SKU_FIELD(VHT80_8, mcs[2][8]),
2064 SKU_FIELD(VHT80_9, mcs[2][9]),
2065 SKU_FIELD(VHT160_0, mcs[3][0]),
2066 SKU_FIELD(VHT160_1_2, mcs[3][1]),
2067 SKU_FIELD(VHT160_3_4, mcs[3][3]),
2068 SKU_FIELD(VHT160_5_6, mcs[3][5]),
2069 SKU_FIELD(VHT160_7, mcs[3][7]),
2070 SKU_FIELD(VHT160_8, mcs[3][8]),
2071 SKU_FIELD(VHT160_9, mcs[3][9]),
2072 #undef SKU_FIELD
2073 };
2074
2075 tx_power = mt76_get_sar_power(mphy, mphy->chandef.chan, tx_power);
2076 tx_power -= mt76_tx_power_nss_delta(n_chains);
2077 tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
2078 &limits, tx_power);
2079 mphy->txpower_cur = tx_power;
2080
2081 if (is_mt7663(mphy->dev)) {
2082 memset(sku, tx_power, MT_SKU_4SS_DELTA + 1);
2083 return;
2084 }
2085
2086 for (i = 0; i < MT_SKU_1SS_DELTA; i++)
2087 sku[i] = limits_array[sku_mapping[i]];
2088
2089 for (i = 0; i < 4; i++) {
2090 int delta = 0;
2091
2092 if (i < n_chains - 1)
2093 delta = mt76_tx_power_nss_delta(n_chains) -
2094 mt76_tx_power_nss_delta(i + 1);
2095 sku[MT_SKU_1SS_DELTA + i] = delta;
2096 }
2097 }
2098
2099 static u8 mt7615_mcu_chan_bw(struct cfg80211_chan_def *chandef)
2100 {
2101 static const u8 width_to_bw[] = {
2102 [NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ,
2103 [NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ,
2104 [NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ,
2105 [NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ,
2106 [NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ,
2107 [NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ,
2108 [NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ,
2109 [NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ,
2110 };
2111
2112 if (chandef->width >= ARRAY_SIZE(width_to_bw))
2113 return 0;
2114
2115 return width_to_bw[chandef->width];
2116 }
2117
2118 int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd)
2119 {
2120 struct mt7615_dev *dev = phy->dev;
2121 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2122 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
2123 struct {
2124 u8 control_chan;
2125 u8 center_chan;
2126 u8 bw;
2127 u8 tx_streams;
2128 u8 rx_streams_mask;
2129 u8 switch_reason;
2130 u8 band_idx;
2131
2132 u8 center_chan2;
2133 __le16 cac_case;
2134 u8 channel_band;
2135 u8 rsv0;
2136 __le32 outband_freq;
2137 u8 txpower_drop;
2138 u8 rsv1[3];
2139 u8 txpower_sku[53];
2140 u8 rsv2[3];
2141 } req = {
2142 .control_chan = chandef->chan->hw_value,
2143 .center_chan = ieee80211_frequency_to_channel(freq1),
2144 .tx_streams = hweight8(phy->mt76->antenna_mask),
2145 .rx_streams_mask = phy->mt76->chainmask,
2146 .center_chan2 = ieee80211_frequency_to_channel(freq2),
2147 };
2148
2149 if (cmd == MCU_EXT_CMD(SET_RX_PATH) ||
2150 dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR)
2151 req.switch_reason = CH_SWITCH_NORMAL;
2152 else if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
2153 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
2154 else if (!cfg80211_reg_can_beacon(phy->mt76->hw->wiphy, chandef,
2155 NL80211_IFTYPE_AP))
2156 req.switch_reason = CH_SWITCH_DFS;
2157 else
2158 req.switch_reason = CH_SWITCH_NORMAL;
2159
2160 req.band_idx = phy != &dev->phy;
2161 req.bw = mt7615_mcu_chan_bw(chandef);
2162
2163 if (mt76_testmode_enabled(phy->mt76))
2164 memset(req.txpower_sku, 0x3f, 49);
2165 else
2166 mt7615_mcu_set_txpower_sku(phy, req.txpower_sku);
2167
2168 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
2169 }
2170
2171 int mt7615_mcu_get_temperature(struct mt7615_dev *dev)
2172 {
2173 struct {
2174 u8 action;
2175 u8 rsv[3];
2176 } req = {};
2177
2178 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL),
2179 &req, sizeof(req), true);
2180 }
2181
2182 int mt7615_mcu_set_test_param(struct mt7615_dev *dev, u8 param, bool test_mode,
2183 u32 val)
2184 {
2185 struct {
2186 u8 test_mode_en;
2187 u8 param_idx;
2188 u8 _rsv[2];
2189
2190 __le32 value;
2191
2192 u8 pad[8];
2193 } req = {
2194 .test_mode_en = test_mode,
2195 .param_idx = param,
2196 .value = cpu_to_le32(val),
2197 };
2198
2199 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL),
2200 &req, sizeof(req), false);
2201 }
2202
2203 int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable)
2204 {
2205 struct mt7615_dev *dev = phy->dev;
2206 struct {
2207 u8 format_id;
2208 u8 sku_enable;
2209 u8 band_idx;
2210 u8 rsv;
2211 } req = {
2212 .format_id = 0,
2213 .band_idx = phy != &dev->phy,
2214 .sku_enable = enable,
2215 };
2216
2217 return mt76_mcu_send_msg(&dev->mt76,
2218 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL),
2219 &req, sizeof(req), true);
2220 }
2221
2222 static int mt7615_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
2223 {
2224 int i;
2225
2226 for (i = 0; i < n_freqs; i++)
2227 if (cur == freqs[i])
2228 return i;
2229
2230 return -1;
2231 }
2232
2233 static int mt7615_dcoc_freq_idx(u16 freq, u8 bw)
2234 {
2235 static const u16 freq_list[] = {
2236 4980, 5805, 5905, 5190,
2237 5230, 5270, 5310, 5350,
2238 5390, 5430, 5470, 5510,
2239 5550, 5590, 5630, 5670,
2240 5710, 5755, 5795, 5835,
2241 5875, 5210, 5290, 5370,
2242 5450, 5530, 5610, 5690,
2243 5775, 5855
2244 };
2245 static const u16 freq_bw40[] = {
2246 5190, 5230, 5270, 5310,
2247 5350, 5390, 5430, 5470,
2248 5510, 5550, 5590, 5630,
2249 5670, 5710, 5755, 5795,
2250 5835, 5875
2251 };
2252 int offset_2g = ARRAY_SIZE(freq_list);
2253 int idx;
2254
2255 if (freq < 4000) {
2256 if (freq < 2427)
2257 return offset_2g;
2258 if (freq < 2442)
2259 return offset_2g + 1;
2260 if (freq < 2457)
2261 return offset_2g + 2;
2262
2263 return offset_2g + 3;
2264 }
2265
2266 switch (bw) {
2267 case NL80211_CHAN_WIDTH_80:
2268 case NL80211_CHAN_WIDTH_80P80:
2269 case NL80211_CHAN_WIDTH_160:
2270 break;
2271 default:
2272 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2273 freq + 10);
2274 if (idx >= 0) {
2275 freq = freq_bw40[idx];
2276 break;
2277 }
2278
2279 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2280 freq - 10);
2281 if (idx >= 0) {
2282 freq = freq_bw40[idx];
2283 break;
2284 }
2285 fallthrough;
2286 case NL80211_CHAN_WIDTH_40:
2287 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2288 freq);
2289 if (idx >= 0)
2290 break;
2291
2292 return -1;
2293
2294 }
2295
2296 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2297 }
2298
2299 int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy)
2300 {
2301 struct mt7615_dev *dev = phy->dev;
2302 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2303 int freq2 = chandef->center_freq2;
2304 int ret;
2305 struct {
2306 u8 direction;
2307 u8 runtime_calibration;
2308 u8 _rsv[2];
2309
2310 __le16 center_freq;
2311 u8 bw;
2312 u8 band;
2313 u8 is_freq2;
2314 u8 success;
2315 u8 dbdc_en;
2316
2317 u8 _rsv2;
2318
2319 struct {
2320 __le32 sx0_i_lna[4];
2321 __le32 sx0_q_lna[4];
2322
2323 __le32 sx2_i_lna[4];
2324 __le32 sx2_q_lna[4];
2325 } dcoc_data[4];
2326 } req = {
2327 .direction = 1,
2328
2329 .bw = mt7615_mcu_chan_bw(chandef),
2330 .band = chandef->center_freq1 > 4000,
2331 .dbdc_en = !!dev->mt76.phys[MT_BAND1],
2332 };
2333 u16 center_freq = chandef->center_freq1;
2334 int freq_idx;
2335 u8 *eep = dev->mt76.eeprom.data;
2336
2337 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_RX_CAL))
2338 return 0;
2339
2340 if (chandef->width == NL80211_CHAN_WIDTH_160) {
2341 freq2 = center_freq + 40;
2342 center_freq -= 40;
2343 }
2344
2345 again:
2346 req.runtime_calibration = 1;
2347 freq_idx = mt7615_dcoc_freq_idx(center_freq, chandef->width);
2348 if (freq_idx < 0)
2349 goto out;
2350
2351 memcpy(req.dcoc_data, eep + MT7615_EEPROM_DCOC_OFFSET +
2352 freq_idx * MT7615_EEPROM_DCOC_SIZE,
2353 sizeof(req.dcoc_data));
2354 req.runtime_calibration = 0;
2355
2356 out:
2357 req.center_freq = cpu_to_le16(center_freq);
2358 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RXDCOC_CAL), &req,
2359 sizeof(req), true);
2360
2361 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2362 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2363 req.is_freq2 = true;
2364 center_freq = freq2;
2365 goto again;
2366 }
2367
2368 return ret;
2369 }
2370
2371 static int mt7615_dpd_freq_idx(u16 freq, u8 bw)
2372 {
2373 static const u16 freq_list[] = {
2374 4920, 4940, 4960, 4980,
2375 5040, 5060, 5080, 5180,
2376 5200, 5220, 5240, 5260,
2377 5280, 5300, 5320, 5340,
2378 5360, 5380, 5400, 5420,
2379 5440, 5460, 5480, 5500,
2380 5520, 5540, 5560, 5580,
2381 5600, 5620, 5640, 5660,
2382 5680, 5700, 5720, 5745,
2383 5765, 5785, 5805, 5825,
2384 5845, 5865, 5885, 5905
2385 };
2386 int offset_2g = ARRAY_SIZE(freq_list);
2387 int idx;
2388
2389 if (freq < 4000) {
2390 if (freq < 2432)
2391 return offset_2g;
2392 if (freq < 2457)
2393 return offset_2g + 1;
2394
2395 return offset_2g + 2;
2396 }
2397
2398 if (bw != NL80211_CHAN_WIDTH_20) {
2399 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
2400 freq + 10);
2401 if (idx >= 0)
2402 return idx;
2403
2404 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
2405 freq - 10);
2406 if (idx >= 0)
2407 return idx;
2408 }
2409
2410 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2411 }
2412
2413
2414 int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy)
2415 {
2416 struct mt7615_dev *dev = phy->dev;
2417 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2418 int freq2 = chandef->center_freq2;
2419 int ret;
2420 struct {
2421 u8 direction;
2422 u8 runtime_calibration;
2423 u8 _rsv[2];
2424
2425 __le16 center_freq;
2426 u8 bw;
2427 u8 band;
2428 u8 is_freq2;
2429 u8 success;
2430 u8 dbdc_en;
2431
2432 u8 _rsv2;
2433
2434 struct {
2435 struct {
2436 u32 dpd_g0;
2437 u8 data[32];
2438 } wf0, wf1;
2439
2440 struct {
2441 u32 dpd_g0_prim;
2442 u32 dpd_g0_sec;
2443 u8 data_prim[32];
2444 u8 data_sec[32];
2445 } wf2, wf3;
2446 } dpd_data;
2447 } req = {
2448 .direction = 1,
2449
2450 .bw = mt7615_mcu_chan_bw(chandef),
2451 .band = chandef->center_freq1 > 4000,
2452 .dbdc_en = !!dev->mt76.phys[MT_BAND1],
2453 };
2454 u16 center_freq = chandef->center_freq1;
2455 int freq_idx;
2456 u8 *eep = dev->mt76.eeprom.data;
2457
2458 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_TX_DPD))
2459 return 0;
2460
2461 if (chandef->width == NL80211_CHAN_WIDTH_160) {
2462 freq2 = center_freq + 40;
2463 center_freq -= 40;
2464 }
2465
2466 again:
2467 req.runtime_calibration = 1;
2468 freq_idx = mt7615_dpd_freq_idx(center_freq, chandef->width);
2469 if (freq_idx < 0)
2470 goto out;
2471
2472 memcpy(&req.dpd_data, eep + MT7615_EEPROM_TXDPD_OFFSET +
2473 freq_idx * MT7615_EEPROM_TXDPD_SIZE,
2474 sizeof(req.dpd_data));
2475 req.runtime_calibration = 0;
2476
2477 out:
2478 req.center_freq = cpu_to_le16(center_freq);
2479 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXDPD_CAL),
2480 &req, sizeof(req), true);
2481
2482 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2483 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2484 req.is_freq2 = true;
2485 center_freq = freq2;
2486 goto again;
2487 }
2488
2489 return ret;
2490 }
2491
2492 int mt7615_mcu_set_rx_hdr_trans_blacklist(struct mt7615_dev *dev)
2493 {
2494 struct {
2495 u8 operation;
2496 u8 count;
2497 u8 _rsv[2];
2498 u8 index;
2499 u8 enable;
2500 __le16 etype;
2501 } req = {
2502 .operation = 1,
2503 .count = 1,
2504 .enable = 1,
2505 .etype = cpu_to_le16(ETH_P_PAE),
2506 };
2507
2508 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
2509 &req, sizeof(req), false);
2510 }
2511
2512 int mt7615_mcu_set_bss_pm(struct mt7615_dev *dev, struct ieee80211_vif *vif,
2513 bool enable)
2514 {
2515 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2516 struct {
2517 u8 bss_idx;
2518 u8 dtim_period;
2519 __le16 aid;
2520 __le16 bcn_interval;
2521 __le16 atim_window;
2522 u8 uapsd;
2523 u8 bmc_delivered_ac;
2524 u8 bmc_triggered_ac;
2525 u8 pad;
2526 } req = {
2527 .bss_idx = mvif->mt76.idx,
2528 .aid = cpu_to_le16(vif->cfg.aid),
2529 .dtim_period = vif->bss_conf.dtim_period,
2530 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
2531 };
2532 struct {
2533 u8 bss_idx;
2534 u8 pad[3];
2535 } req_hdr = {
2536 .bss_idx = mvif->mt76.idx,
2537 };
2538 int err;
2539
2540 if (vif->type != NL80211_IFTYPE_STATION)
2541 return 0;
2542
2543 err = mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_ABORT),
2544 &req_hdr, sizeof(req_hdr), false);
2545 if (err < 0 || !enable)
2546 return err;
2547
2548 return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_CONNECTED),
2549 &req, sizeof(req), false);
2550 }
2551
2552 int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
2553 struct ieee80211_channel *chan, int duration)
2554 {
2555 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2556 struct mt7615_dev *dev = phy->dev;
2557 struct mt7615_roc_tlv req = {
2558 .bss_idx = mvif->mt76.idx,
2559 .active = !chan,
2560 .max_interval = cpu_to_le32(duration),
2561 .primary_chan = chan ? chan->hw_value : 0,
2562 .band = chan ? chan->band : 0,
2563 .req_type = 2,
2564 };
2565
2566 phy->roc_grant = false;
2567
2568 return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_ROC),
2569 &req, sizeof(req), false);
2570 }