mcu.c (62981B)
1// SPDX-License-Identifier: ISC 2/* Copyright (C) 2019 MediaTek Inc. 3 * 4 * Author: Roy Luo <royluo@google.com> 5 * Ryder Lee <ryder.lee@mediatek.com> 6 */ 7 8#include <linux/firmware.h> 9#include "mt7615.h" 10#include "mcu.h" 11#include "mac.h" 12#include "eeprom.h" 13 14static bool prefer_offload_fw = true; 15module_param(prefer_offload_fw, bool, 0644); 16MODULE_PARM_DESC(prefer_offload_fw, 17 "Prefer client mode offload firmware (MT7663)"); 18 19struct mt7615_patch_hdr { 20 char build_date[16]; 21 char platform[4]; 22 __be32 hw_sw_ver; 23 __be32 patch_ver; 24 __be16 checksum; 25} __packed; 26 27struct mt7615_fw_trailer { 28 __le32 addr; 29 u8 chip_id; 30 u8 feature_set; 31 u8 eco_code; 32 char fw_ver[10]; 33 char build_date[15]; 34 __le32 len; 35} __packed; 36 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) 42 43struct mt7663_fw_trailer { 44 u8 chip_id; 45 u8 eco_code; 46 u8 n_region; 47 u8 format_ver; 48 u8 format_flag; 49 u8 reserv[2]; 50 char fw_ver[10]; 51 char build_date[15]; 52 __le32 crc; 53} __packed; 54 55struct mt7663_fw_buf { 56 __le32 crc; 57 __le32 d_img_size; 58 __le32 block_size; 59 u8 rsv[4]; 60 __le32 img_dest_addr; 61 __le32 img_size; 62 u8 feature_set; 63}; 64 65#define MT7615_PATCH_ADDRESS 0x80000 66#define MT7622_PATCH_ADDRESS 0x9c000 67#define MT7663_PATCH_ADDRESS 0xdc000 68 69#define N9_REGION_NUM 2 70#define CR4_REGION_NUM 1 71 72#define IMG_CRC_LEN 4 73 74void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb, 75 int cmd, int *wait_seq) 76{ 77 int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd); 78 struct mt7615_uni_txd *uni_txd; 79 struct mt7615_mcu_txd *mcu_txd; 80 u8 seq, q_idx, pkt_fmt; 81 __le32 *txd; 82 u32 val; 83 84 /* TODO: make dynamic based on msg type */ 85 dev->mt76.mcu.timeout = 20 * HZ; 86 87 seq = ++dev->mt76.mcu.msg_seq & 0xf; 88 if (!seq) 89 seq = ++dev->mt76.mcu.msg_seq & 0xf; 90 if (wait_seq) 91 *wait_seq = seq; 92 93 txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd); 94 txd = (__le32 *)skb_push(skb, txd_len); 95 96 if (cmd != MCU_CMD(FW_SCATTER)) { 97 q_idx = MT_TX_MCU_PORT_RX_Q0; 98 pkt_fmt = MT_TX_TYPE_CMD; 99 } else { 100 q_idx = MT_TX_MCU_PORT_RX_FWDL; 101 pkt_fmt = MT_TX_TYPE_FW; 102 } 103 104 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) | 105 FIELD_PREP(MT_TXD0_P_IDX, MT_TX_PORT_IDX_MCU) | 106 FIELD_PREP(MT_TXD0_Q_IDX, q_idx); 107 txd[0] = cpu_to_le32(val); 108 109 val = MT_TXD1_LONG_FORMAT | 110 FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD) | 111 FIELD_PREP(MT_TXD1_PKT_FMT, pkt_fmt); 112 txd[1] = cpu_to_le32(val); 113 114 if (cmd & __MCU_CMD_FIELD_UNI) { 115 uni_txd = (struct mt7615_uni_txd *)txd; 116 uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd)); 117 uni_txd->option = MCU_CMD_UNI_EXT_ACK; 118 uni_txd->cid = cpu_to_le16(mcu_cmd); 119 uni_txd->s2d_index = MCU_S2D_H2N; 120 uni_txd->pkt_type = MCU_PKT_ID; 121 uni_txd->seq = seq; 122 123 return; 124 } 125 126 mcu_txd = (struct mt7615_mcu_txd *)txd; 127 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd)); 128 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU, q_idx)); 129 mcu_txd->s2d_index = MCU_S2D_H2N; 130 mcu_txd->pkt_type = MCU_PKT_ID; 131 mcu_txd->seq = seq; 132 mcu_txd->cid = mcu_cmd; 133 mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd); 134 135 if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) { 136 if (cmd & __MCU_CMD_FIELD_QUERY) 137 mcu_txd->set_query = MCU_Q_QUERY; 138 else 139 mcu_txd->set_query = MCU_Q_SET; 140 mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid; 141 } else { 142 mcu_txd->set_query = MCU_Q_NA; 143 } 144} 145EXPORT_SYMBOL_GPL(mt7615_mcu_fill_msg); 146 147int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd, 148 struct sk_buff *skb, int seq) 149{ 150 struct mt7615_mcu_rxd *rxd; 151 int ret = 0; 152 153 if (!skb) { 154 dev_err(mdev->dev, "Message %08x (seq %d) timeout\n", 155 cmd, seq); 156 return -ETIMEDOUT; 157 } 158 159 rxd = (struct mt7615_mcu_rxd *)skb->data; 160 if (seq != rxd->seq) 161 return -EAGAIN; 162 163 if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) { 164 skb_pull(skb, sizeof(*rxd) - 4); 165 ret = *skb->data; 166 } else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) { 167 skb_pull(skb, sizeof(*rxd)); 168 ret = le32_to_cpu(*(__le32 *)skb->data); 169 } else if (cmd == MCU_EXT_QUERY(RF_REG_ACCESS)) { 170 skb_pull(skb, sizeof(*rxd)); 171 ret = le32_to_cpu(*(__le32 *)&skb->data[8]); 172 } else if (cmd == MCU_UNI_CMD(DEV_INFO_UPDATE) || 173 cmd == MCU_UNI_CMD(BSS_INFO_UPDATE) || 174 cmd == MCU_UNI_CMD(STA_REC_UPDATE) || 175 cmd == MCU_UNI_CMD(HIF_CTRL) || 176 cmd == MCU_UNI_CMD(OFFLOAD) || 177 cmd == MCU_UNI_CMD(SUSPEND)) { 178 struct mt7615_mcu_uni_event *event; 179 180 skb_pull(skb, sizeof(*rxd)); 181 event = (struct mt7615_mcu_uni_event *)skb->data; 182 ret = le32_to_cpu(event->status); 183 } else if (cmd == MCU_CE_QUERY(REG_READ)) { 184 struct mt7615_mcu_reg_event *event; 185 186 skb_pull(skb, sizeof(*rxd)); 187 event = (struct mt7615_mcu_reg_event *)skb->data; 188 ret = (int)le32_to_cpu(event->val); 189 } 190 191 return ret; 192} 193EXPORT_SYMBOL_GPL(mt7615_mcu_parse_response); 194 195static int 196mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, 197 int cmd, int *seq) 198{ 199 struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76); 200 enum mt76_mcuq_id qid; 201 202 mt7615_mcu_fill_msg(dev, skb, cmd, seq); 203 if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state)) 204 qid = MT_MCUQ_WM; 205 else 206 qid = MT_MCUQ_FWDL; 207 208 return mt76_tx_queue_skb_raw(dev, dev->mt76.q_mcu[qid], skb, 0); 209} 210 211u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg) 212{ 213 struct { 214 __le32 wifi_stream; 215 __le32 address; 216 __le32 data; 217 } req = { 218 .wifi_stream = cpu_to_le32(wf), 219 .address = cpu_to_le32(reg), 220 }; 221 222 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_QUERY(RF_REG_ACCESS), 223 &req, sizeof(req), true); 224} 225 226int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val) 227{ 228 struct { 229 __le32 wifi_stream; 230 __le32 address; 231 __le32 data; 232 } req = { 233 .wifi_stream = cpu_to_le32(wf), 234 .address = cpu_to_le32(reg), 235 .data = cpu_to_le32(val), 236 }; 237 238 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RF_REG_ACCESS), 239 &req, sizeof(req), false); 240} 241 242void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en) 243{ 244 if (!is_mt7622(&dev->mt76)) 245 return; 246 247 regmap_update_bits(dev->infracfg, MT_INFRACFG_MISC, 248 MT_INFRACFG_MISC_AP2CONN_WAKE, 249 !en * MT_INFRACFG_MISC_AP2CONN_WAKE); 250} 251EXPORT_SYMBOL_GPL(mt7622_trigger_hif_int); 252 253static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev) 254{ 255 struct mt76_phy *mphy = &dev->mt76.phy; 256 struct mt76_connac_pm *pm = &dev->pm; 257 struct mt76_dev *mdev = &dev->mt76; 258 u32 addr; 259 int err; 260 261 if (is_mt7663(mdev)) { 262 /* Clear firmware own via N9 eint */ 263 mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN); 264 mt76_poll(dev, MT_CONN_ON_MISC, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000); 265 266 addr = MT_CONN_HIF_ON_LPCTL; 267 } else { 268 addr = MT_CFG_LPCR_HOST; 269 } 270 271 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_DRV_OWN); 272 273 mt7622_trigger_hif_int(dev, true); 274 275 err = !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000); 276 277 mt7622_trigger_hif_int(dev, false); 278 279 if (err) { 280 dev_err(mdev->dev, "driver own failed\n"); 281 return -ETIMEDOUT; 282 } 283 284 clear_bit(MT76_STATE_PM, &mphy->state); 285 286 pm->stats.last_wake_event = jiffies; 287 pm->stats.doze_time += pm->stats.last_wake_event - 288 pm->stats.last_doze_event; 289 290 return 0; 291} 292 293static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev) 294{ 295 struct mt76_phy *mphy = &dev->mt76.phy; 296 struct mt76_connac_pm *pm = &dev->pm; 297 int i, err = 0; 298 299 mutex_lock(&pm->mutex); 300 301 if (!test_bit(MT76_STATE_PM, &mphy->state)) 302 goto out; 303 304 for (i = 0; i < MT7615_DRV_OWN_RETRY_COUNT; i++) { 305 mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN); 306 if (mt76_poll_msec(dev, MT_CONN_HIF_ON_LPCTL, 307 MT_CFG_LPCR_HOST_FW_OWN, 0, 50)) 308 break; 309 } 310 311 if (i == MT7615_DRV_OWN_RETRY_COUNT) { 312 dev_err(dev->mt76.dev, "driver own failed\n"); 313 err = -EIO; 314 goto out; 315 } 316 clear_bit(MT76_STATE_PM, &mphy->state); 317 318 pm->stats.last_wake_event = jiffies; 319 pm->stats.doze_time += pm->stats.last_wake_event - 320 pm->stats.last_doze_event; 321out: 322 mutex_unlock(&pm->mutex); 323 324 return err; 325} 326 327static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev) 328{ 329 struct mt76_phy *mphy = &dev->mt76.phy; 330 struct mt76_connac_pm *pm = &dev->pm; 331 int err = 0; 332 u32 addr; 333 334 mutex_lock(&pm->mutex); 335 336 if (mt76_connac_skip_fw_pmctrl(mphy, pm)) 337 goto out; 338 339 mt7622_trigger_hif_int(dev, true); 340 341 addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST; 342 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN); 343 344 if (is_mt7622(&dev->mt76) && 345 !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 346 MT_CFG_LPCR_HOST_FW_OWN, 3000)) { 347 dev_err(dev->mt76.dev, "Timeout for firmware own\n"); 348 clear_bit(MT76_STATE_PM, &mphy->state); 349 err = -EIO; 350 } 351 352 mt7622_trigger_hif_int(dev, false); 353 354 pm->stats.last_doze_event = jiffies; 355 pm->stats.awake_time += pm->stats.last_doze_event - 356 pm->stats.last_wake_event; 357out: 358 mutex_unlock(&pm->mutex); 359 360 return err; 361} 362 363static void 364mt7615_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif) 365{ 366 if (vif->csa_active) 367 ieee80211_csa_finish(vif); 368} 369 370static void 371mt7615_mcu_rx_csa_notify(struct mt7615_dev *dev, struct sk_buff *skb) 372{ 373 struct mt7615_phy *ext_phy = mt7615_ext_phy(dev); 374 struct mt76_phy *mphy = &dev->mt76.phy; 375 struct mt7615_mcu_csa_notify *c; 376 377 c = (struct mt7615_mcu_csa_notify *)skb->data; 378 379 if (c->omac_idx > EXT_BSSID_MAX) 380 return; 381 382 if (ext_phy && ext_phy->omac_mask & BIT_ULL(c->omac_idx)) 383 mphy = dev->mt76.phy2; 384 385 ieee80211_iterate_active_interfaces_atomic(mphy->hw, 386 IEEE80211_IFACE_ITER_RESUME_ALL, 387 mt7615_mcu_csa_finish, mphy->hw); 388} 389 390static void 391mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb) 392{ 393 struct mt76_phy *mphy = &dev->mt76.phy; 394 struct mt7615_mcu_rdd_report *r; 395 396 r = (struct mt7615_mcu_rdd_report *)skb->data; 397 398 if (!dev->radar_pattern.n_pulses && !r->long_detected && 399 !r->constant_prf_detected && !r->staggered_prf_detected) 400 return; 401 402 if (r->band_idx && dev->mt76.phy2) 403 mphy = dev->mt76.phy2; 404 405 ieee80211_radar_detected(mphy->hw); 406 dev->hw_pattern++; 407} 408 409static void 410mt7615_mcu_rx_log_message(struct mt7615_dev *dev, struct sk_buff *skb) 411{ 412 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data; 413 const char *data = (char *)&rxd[1]; 414 const char *type; 415 416 switch (rxd->s2d_index) { 417 case 0: 418 type = "N9"; 419 break; 420 case 2: 421 type = "CR4"; 422 break; 423 default: 424 type = "unknown"; 425 break; 426 } 427 428 wiphy_info(mt76_hw(dev)->wiphy, "%s: %.*s", type, 429 (int)(skb->len - sizeof(*rxd)), data); 430} 431 432static void 433mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb) 434{ 435 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data; 436 437 switch (rxd->ext_eid) { 438 case MCU_EXT_EVENT_RDD_REPORT: 439 mt7615_mcu_rx_radar_detected(dev, skb); 440 break; 441 case MCU_EXT_EVENT_CSA_NOTIFY: 442 mt7615_mcu_rx_csa_notify(dev, skb); 443 break; 444 case MCU_EXT_EVENT_FW_LOG_2_HOST: 445 mt7615_mcu_rx_log_message(dev, skb); 446 break; 447 default: 448 break; 449 } 450} 451 452static void 453mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb) 454{ 455 u8 *seq_num = skb->data + sizeof(struct mt7615_mcu_rxd); 456 struct mt7615_phy *phy; 457 struct mt76_phy *mphy; 458 459 if (*seq_num & BIT(7) && dev->mt76.phy2) 460 mphy = dev->mt76.phy2; 461 else 462 mphy = &dev->mt76.phy; 463 464 phy = (struct mt7615_phy *)mphy->priv; 465 466 spin_lock_bh(&dev->mt76.lock); 467 __skb_queue_tail(&phy->scan_event_list, skb); 468 spin_unlock_bh(&dev->mt76.lock); 469 470 ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work, 471 MT7615_HW_SCAN_TIMEOUT); 472} 473 474static void 475mt7615_mcu_roc_event(struct mt7615_dev *dev, struct sk_buff *skb) 476{ 477 struct mt7615_roc_tlv *event; 478 struct mt7615_phy *phy; 479 struct mt76_phy *mphy; 480 int duration; 481 482 skb_pull(skb, sizeof(struct mt7615_mcu_rxd)); 483 event = (struct mt7615_roc_tlv *)skb->data; 484 485 if (event->dbdc_band && dev->mt76.phy2) 486 mphy = dev->mt76.phy2; 487 else 488 mphy = &dev->mt76.phy; 489 490 ieee80211_ready_on_channel(mphy->hw); 491 492 phy = (struct mt7615_phy *)mphy->priv; 493 phy->roc_grant = true; 494 wake_up(&phy->roc_wait); 495 496 duration = le32_to_cpu(event->max_interval); 497 mod_timer(&phy->roc_timer, 498 round_jiffies_up(jiffies + msecs_to_jiffies(duration))); 499} 500 501static void 502mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb) 503{ 504 struct mt76_connac_beacon_loss_event *event; 505 struct mt76_phy *mphy; 506 u8 band_idx = 0; /* DBDC support */ 507 508 skb_pull(skb, sizeof(struct mt7615_mcu_rxd)); 509 event = (struct mt76_connac_beacon_loss_event *)skb->data; 510 if (band_idx && dev->mt76.phy2) 511 mphy = dev->mt76.phy2; 512 else 513 mphy = &dev->mt76.phy; 514 515 ieee80211_iterate_active_interfaces_atomic(mphy->hw, 516 IEEE80211_IFACE_ITER_RESUME_ALL, 517 mt76_connac_mcu_beacon_loss_iter, 518 event); 519} 520 521static void 522mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb) 523{ 524 struct mt76_connac_mcu_bss_event *event; 525 struct mt76_phy *mphy; 526 u8 band_idx = 0; /* DBDC support */ 527 528 skb_pull(skb, sizeof(struct mt7615_mcu_rxd)); 529 event = (struct mt76_connac_mcu_bss_event *)skb->data; 530 531 if (band_idx && dev->mt76.phy2) 532 mphy = dev->mt76.phy2; 533 else 534 mphy = &dev->mt76.phy; 535 536 if (event->is_absent) 537 ieee80211_stop_queues(mphy->hw); 538 else 539 ieee80211_wake_queues(mphy->hw); 540} 541 542static void 543mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb) 544{ 545 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data; 546 547 switch (rxd->eid) { 548 case MCU_EVENT_EXT: 549 mt7615_mcu_rx_ext_event(dev, skb); 550 break; 551 case MCU_EVENT_BSS_BEACON_LOSS: 552 mt7615_mcu_beacon_loss_event(dev, skb); 553 break; 554 case MCU_EVENT_ROC: 555 mt7615_mcu_roc_event(dev, skb); 556 break; 557 case MCU_EVENT_SCHED_SCAN_DONE: 558 case MCU_EVENT_SCAN_DONE: 559 mt7615_mcu_scan_event(dev, skb); 560 return; 561 case MCU_EVENT_BSS_ABSENCE: 562 mt7615_mcu_bss_event(dev, skb); 563 break; 564 case MCU_EVENT_COREDUMP: 565 mt76_connac_mcu_coredump_event(&dev->mt76, skb, 566 &dev->coredump); 567 return; 568 default: 569 break; 570 } 571 dev_kfree_skb(skb); 572} 573 574void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb) 575{ 576 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data; 577 578 if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT || 579 rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST || 580 rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP || 581 rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC || 582 rxd->eid == MCU_EVENT_BSS_BEACON_LOSS || 583 rxd->eid == MCU_EVENT_SCHED_SCAN_DONE || 584 rxd->eid == MCU_EVENT_BSS_ABSENCE || 585 rxd->eid == MCU_EVENT_SCAN_DONE || 586 rxd->eid == MCU_EVENT_COREDUMP || 587 rxd->eid == MCU_EVENT_ROC || 588 !rxd->seq) 589 mt7615_mcu_rx_unsolicited_event(dev, skb); 590 else 591 mt76_mcu_rx_event(&dev->mt76, skb); 592} 593 594static int 595mt7615_mcu_muar_config(struct mt7615_dev *dev, struct ieee80211_vif *vif, 596 bool bssid, bool enable) 597{ 598 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 599 u32 idx = mvif->mt76.omac_idx - REPEATER_BSSID_START; 600 u32 mask = dev->omac_mask >> 32 & ~BIT(idx); 601 const u8 *addr = vif->addr; 602 struct { 603 u8 mode; 604 u8 force_clear; 605 u8 clear_bitmap[8]; 606 u8 entry_count; 607 u8 write; 608 609 u8 index; 610 u8 bssid; 611 u8 addr[ETH_ALEN]; 612 } __packed req = { 613 .mode = !!mask || enable, 614 .entry_count = 1, 615 .write = 1, 616 617 .index = idx * 2 + bssid, 618 }; 619 620 if (bssid) 621 addr = vif->bss_conf.bssid; 622 623 if (enable) 624 ether_addr_copy(req.addr, addr); 625 626 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE), 627 &req, sizeof(req), true); 628} 629 630static int 631mt7615_mcu_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif, 632 bool enable) 633{ 634 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 635 struct mt7615_dev *dev = phy->dev; 636 struct { 637 struct req_hdr { 638 u8 omac_idx; 639 u8 band_idx; 640 __le16 tlv_num; 641 u8 is_tlv_append; 642 u8 rsv[3]; 643 } __packed hdr; 644 struct req_tlv { 645 __le16 tag; 646 __le16 len; 647 u8 active; 648 u8 band_idx; 649 u8 omac_addr[ETH_ALEN]; 650 } __packed tlv; 651 } data = { 652 .hdr = { 653 .omac_idx = mvif->mt76.omac_idx, 654 .band_idx = mvif->mt76.band_idx, 655 .tlv_num = cpu_to_le16(1), 656 .is_tlv_append = 1, 657 }, 658 .tlv = { 659 .tag = cpu_to_le16(DEV_INFO_ACTIVE), 660 .len = cpu_to_le16(sizeof(struct req_tlv)), 661 .active = enable, 662 .band_idx = mvif->mt76.band_idx, 663 }, 664 }; 665 666 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START) 667 return mt7615_mcu_muar_config(dev, vif, false, enable); 668 669 memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN); 670 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE), 671 &data, sizeof(data), true); 672} 673 674static int 675mt7615_mcu_add_beacon_offload(struct mt7615_dev *dev, 676 struct ieee80211_hw *hw, 677 struct ieee80211_vif *vif, bool enable) 678{ 679 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 680 struct mt76_wcid *wcid = &dev->mt76.global_wcid; 681 struct ieee80211_mutable_offsets offs; 682 struct ieee80211_tx_info *info; 683 struct req { 684 u8 omac_idx; 685 u8 enable; 686 u8 wlan_idx; 687 u8 band_idx; 688 u8 pkt_type; 689 u8 need_pre_tbtt_int; 690 __le16 csa_ie_pos; 691 __le16 pkt_len; 692 __le16 tim_ie_pos; 693 u8 pkt[512]; 694 u8 csa_cnt; 695 /* bss color change */ 696 u8 bcc_cnt; 697 __le16 bcc_ie_pos; 698 } __packed req = { 699 .omac_idx = mvif->mt76.omac_idx, 700 .enable = enable, 701 .wlan_idx = wcid->idx, 702 .band_idx = mvif->mt76.band_idx, 703 }; 704 struct sk_buff *skb; 705 706 if (!enable) 707 goto out; 708 709 skb = ieee80211_beacon_get_template(hw, vif, &offs); 710 if (!skb) 711 return -EINVAL; 712 713 if (skb->len > 512 - MT_TXD_SIZE) { 714 dev_err(dev->mt76.dev, "Bcn size limit exceed\n"); 715 dev_kfree_skb(skb); 716 return -EINVAL; 717 } 718 719 if (mvif->mt76.band_idx) { 720 info = IEEE80211_SKB_CB(skb); 721 info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY; 722 } 723 724 mt7615_mac_write_txwi(dev, (__le32 *)(req.pkt), skb, wcid, NULL, 725 0, NULL, true); 726 memcpy(req.pkt + MT_TXD_SIZE, skb->data, skb->len); 727 req.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len); 728 req.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset); 729 if (offs.cntdwn_counter_offs[0]) { 730 u16 csa_offs; 731 732 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4; 733 req.csa_ie_pos = cpu_to_le16(csa_offs); 734 req.csa_cnt = skb->data[offs.cntdwn_counter_offs[0]]; 735 } 736 dev_kfree_skb(skb); 737 738out: 739 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(BCN_OFFLOAD), &req, 740 sizeof(req), true); 741} 742 743static int 744mt7615_mcu_ctrl_pm_state(struct mt7615_dev *dev, int band, int state) 745{ 746 return mt76_connac_mcu_set_pm(&dev->mt76, band, state); 747} 748 749static int 750mt7615_mcu_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif, 751 struct ieee80211_sta *sta, bool enable) 752{ 753 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 754 struct mt7615_dev *dev = phy->dev; 755 struct sk_buff *skb; 756 757 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START) 758 mt7615_mcu_muar_config(dev, vif, true, enable); 759 760 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL); 761 if (IS_ERR(skb)) 762 return PTR_ERR(skb); 763 764 if (enable) 765 mt76_connac_mcu_bss_omac_tlv(skb, vif); 766 767 mt76_connac_mcu_bss_basic_tlv(skb, vif, sta, phy->mt76, 768 mvif->sta.wcid.idx, enable); 769 770 if (enable && mvif->mt76.omac_idx >= EXT_BSSID_START && 771 mvif->mt76.omac_idx < REPEATER_BSSID_START) 772 mt76_connac_mcu_bss_ext_tlv(skb, &mvif->mt76); 773 774 return mt76_mcu_skb_send_msg(&dev->mt76, skb, 775 MCU_EXT_CMD(BSS_INFO_UPDATE), true); 776} 777 778static int 779mt7615_mcu_wtbl_tx_ba(struct mt7615_dev *dev, 780 struct ieee80211_ampdu_params *params, 781 bool enable) 782{ 783 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv; 784 struct mt7615_vif *mvif = msta->vif; 785 struct wtbl_req_hdr *wtbl_hdr; 786 struct sk_buff *skb = NULL; 787 int err; 788 789 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid, 790 WTBL_SET, NULL, &skb); 791 if (IS_ERR(wtbl_hdr)) 792 return PTR_ERR(wtbl_hdr); 793 794 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, true, 795 NULL, wtbl_hdr); 796 797 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, 798 MCU_EXT_CMD(WTBL_UPDATE), true); 799 if (err < 0) 800 return err; 801 802 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, 803 &msta->wcid); 804 if (IS_ERR(skb)) 805 return PTR_ERR(skb); 806 807 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, true); 808 809 return mt76_mcu_skb_send_msg(&dev->mt76, skb, 810 MCU_EXT_CMD(STA_REC_UPDATE), true); 811} 812 813static int 814mt7615_mcu_wtbl_rx_ba(struct mt7615_dev *dev, 815 struct ieee80211_ampdu_params *params, 816 bool enable) 817{ 818 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv; 819 struct mt7615_vif *mvif = msta->vif; 820 struct wtbl_req_hdr *wtbl_hdr; 821 struct sk_buff *skb; 822 int err; 823 824 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, 825 &msta->wcid); 826 if (IS_ERR(skb)) 827 return PTR_ERR(skb); 828 829 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false); 830 831 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, 832 MCU_EXT_CMD(STA_REC_UPDATE), true); 833 if (err < 0 || !enable) 834 return err; 835 836 skb = NULL; 837 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid, 838 WTBL_SET, NULL, &skb); 839 if (IS_ERR(wtbl_hdr)) 840 return PTR_ERR(wtbl_hdr); 841 842 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false, 843 NULL, wtbl_hdr); 844 845 return mt76_mcu_skb_send_msg(&dev->mt76, skb, 846 MCU_EXT_CMD(WTBL_UPDATE), true); 847} 848 849static int 850mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif, 851 struct ieee80211_sta *sta, bool enable) 852{ 853 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 854 struct sk_buff *skb, *sskb, *wskb = NULL; 855 struct mt7615_dev *dev = phy->dev; 856 struct wtbl_req_hdr *wtbl_hdr; 857 struct mt7615_sta *msta; 858 int cmd, err; 859 860 msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta; 861 862 sskb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, 863 &msta->wcid); 864 if (IS_ERR(sskb)) 865 return PTR_ERR(sskb); 866 867 mt76_connac_mcu_sta_basic_tlv(sskb, vif, sta, enable, true); 868 if (enable && sta) 869 mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0, 870 MT76_STA_INFO_STATE_ASSOC); 871 872 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid, 873 WTBL_RESET_AND_SET, NULL, 874 &wskb); 875 if (IS_ERR(wtbl_hdr)) 876 return PTR_ERR(wtbl_hdr); 877 878 if (enable) { 879 mt76_connac_mcu_wtbl_generic_tlv(&dev->mt76, wskb, vif, sta, 880 NULL, wtbl_hdr); 881 if (sta) 882 mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, wskb, sta, 883 NULL, wtbl_hdr, true, true); 884 mt76_connac_mcu_wtbl_hdr_trans_tlv(wskb, vif, &msta->wcid, 885 NULL, wtbl_hdr); 886 } 887 888 cmd = enable ? MCU_EXT_CMD(WTBL_UPDATE) : MCU_EXT_CMD(STA_REC_UPDATE); 889 skb = enable ? wskb : sskb; 890 891 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true); 892 if (err < 0) { 893 skb = enable ? sskb : wskb; 894 dev_kfree_skb(skb); 895 896 return err; 897 } 898 899 cmd = enable ? MCU_EXT_CMD(STA_REC_UPDATE) : MCU_EXT_CMD(WTBL_UPDATE); 900 skb = enable ? sskb : wskb; 901 902 return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true); 903} 904 905static int 906mt7615_mcu_wtbl_update_hdr_trans(struct mt7615_dev *dev, 907 struct ieee80211_vif *vif, 908 struct ieee80211_sta *sta) 909{ 910 return mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta); 911} 912 913static const struct mt7615_mcu_ops wtbl_update_ops = { 914 .add_beacon_offload = mt7615_mcu_add_beacon_offload, 915 .set_pm_state = mt7615_mcu_ctrl_pm_state, 916 .add_dev_info = mt7615_mcu_add_dev, 917 .add_bss_info = mt7615_mcu_add_bss, 918 .add_tx_ba = mt7615_mcu_wtbl_tx_ba, 919 .add_rx_ba = mt7615_mcu_wtbl_rx_ba, 920 .sta_add = mt7615_mcu_wtbl_sta_add, 921 .set_drv_ctrl = mt7615_mcu_drv_pmctrl, 922 .set_fw_ctrl = mt7615_mcu_fw_pmctrl, 923 .set_sta_decap_offload = mt7615_mcu_wtbl_update_hdr_trans, 924}; 925 926static int 927mt7615_mcu_sta_ba(struct mt7615_dev *dev, 928 struct ieee80211_ampdu_params *params, 929 bool enable, bool tx) 930{ 931 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv; 932 struct mt7615_vif *mvif = msta->vif; 933 struct wtbl_req_hdr *wtbl_hdr; 934 struct tlv *sta_wtbl; 935 struct sk_buff *skb; 936 937 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, 938 &msta->wcid); 939 if (IS_ERR(skb)) 940 return PTR_ERR(skb); 941 942 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx); 943 944 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv)); 945 946 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid, 947 WTBL_SET, sta_wtbl, &skb); 948 if (IS_ERR(wtbl_hdr)) 949 return PTR_ERR(wtbl_hdr); 950 951 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, tx, 952 sta_wtbl, wtbl_hdr); 953 954 return mt76_mcu_skb_send_msg(&dev->mt76, skb, 955 MCU_EXT_CMD(STA_REC_UPDATE), true); 956} 957 958static int 959mt7615_mcu_sta_tx_ba(struct mt7615_dev *dev, 960 struct ieee80211_ampdu_params *params, 961 bool enable) 962{ 963 return mt7615_mcu_sta_ba(dev, params, enable, true); 964} 965 966static int 967mt7615_mcu_sta_rx_ba(struct mt7615_dev *dev, 968 struct ieee80211_ampdu_params *params, 969 bool enable) 970{ 971 return mt7615_mcu_sta_ba(dev, params, enable, false); 972} 973 974static int 975__mt7615_mcu_add_sta(struct mt76_phy *phy, struct ieee80211_vif *vif, 976 struct ieee80211_sta *sta, bool enable, int cmd, 977 bool offload_fw) 978{ 979 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 980 struct mt76_sta_cmd_info info = { 981 .sta = sta, 982 .vif = vif, 983 .offload_fw = offload_fw, 984 .enable = enable, 985 .newly = true, 986 .cmd = cmd, 987 }; 988 989 info.wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid; 990 return mt76_connac_mcu_sta_cmd(phy, &info); 991} 992 993static int 994mt7615_mcu_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif, 995 struct ieee80211_sta *sta, bool enable) 996{ 997 return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable, 998 MCU_EXT_CMD(STA_REC_UPDATE), false); 999} 1000 1001static int 1002mt7615_mcu_sta_update_hdr_trans(struct mt7615_dev *dev, 1003 struct ieee80211_vif *vif, 1004 struct ieee80211_sta *sta) 1005{ 1006 struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv; 1007 1008 return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76, 1009 vif, &msta->wcid, 1010 MCU_EXT_CMD(STA_REC_UPDATE)); 1011} 1012 1013static const struct mt7615_mcu_ops sta_update_ops = { 1014 .add_beacon_offload = mt7615_mcu_add_beacon_offload, 1015 .set_pm_state = mt7615_mcu_ctrl_pm_state, 1016 .add_dev_info = mt7615_mcu_add_dev, 1017 .add_bss_info = mt7615_mcu_add_bss, 1018 .add_tx_ba = mt7615_mcu_sta_tx_ba, 1019 .add_rx_ba = mt7615_mcu_sta_rx_ba, 1020 .sta_add = mt7615_mcu_add_sta, 1021 .set_drv_ctrl = mt7615_mcu_drv_pmctrl, 1022 .set_fw_ctrl = mt7615_mcu_fw_pmctrl, 1023 .set_sta_decap_offload = mt7615_mcu_sta_update_hdr_trans, 1024}; 1025 1026static int 1027mt7615_mcu_uni_ctrl_pm_state(struct mt7615_dev *dev, int band, int state) 1028{ 1029 return 0; 1030} 1031 1032static int 1033mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev, 1034 struct ieee80211_hw *hw, 1035 struct ieee80211_vif *vif, 1036 bool enable) 1037{ 1038 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 1039 struct mt76_wcid *wcid = &dev->mt76.global_wcid; 1040 struct ieee80211_mutable_offsets offs; 1041 struct { 1042 struct req_hdr { 1043 u8 bss_idx; 1044 u8 pad[3]; 1045 } __packed hdr; 1046 struct bcn_content_tlv { 1047 __le16 tag; 1048 __le16 len; 1049 __le16 tim_ie_pos; 1050 __le16 csa_ie_pos; 1051 __le16 bcc_ie_pos; 1052 /* 0: disable beacon offload 1053 * 1: enable beacon offload 1054 * 2: update probe respond offload 1055 */ 1056 u8 enable; 1057 /* 0: legacy format (TXD + payload) 1058 * 1: only cap field IE 1059 */ 1060 u8 type; 1061 __le16 pkt_len; 1062 u8 pkt[512]; 1063 } __packed beacon_tlv; 1064 } req = { 1065 .hdr = { 1066 .bss_idx = mvif->mt76.idx, 1067 }, 1068 .beacon_tlv = { 1069 .tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT), 1070 .len = cpu_to_le16(sizeof(struct bcn_content_tlv)), 1071 .enable = enable, 1072 }, 1073 }; 1074 struct sk_buff *skb; 1075 1076 if (!enable) 1077 goto out; 1078 1079 skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs); 1080 if (!skb) 1081 return -EINVAL; 1082 1083 if (skb->len > 512 - MT_TXD_SIZE) { 1084 dev_err(dev->mt76.dev, "beacon size limit exceed\n"); 1085 dev_kfree_skb(skb); 1086 return -EINVAL; 1087 } 1088 1089 mt7615_mac_write_txwi(dev, (__le32 *)(req.beacon_tlv.pkt), skb, 1090 wcid, NULL, 0, NULL, true); 1091 memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len); 1092 req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len); 1093 req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset); 1094 1095 if (offs.cntdwn_counter_offs[0]) { 1096 u16 csa_offs; 1097 1098 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4; 1099 req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs); 1100 } 1101 dev_kfree_skb(skb); 1102 1103out: 1104 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE), 1105 &req, sizeof(req), true); 1106} 1107 1108static int 1109mt7615_mcu_uni_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif, 1110 bool enable) 1111{ 1112 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 1113 1114 return mt76_connac_mcu_uni_add_dev(phy->mt76, vif, &mvif->sta.wcid, 1115 enable); 1116} 1117 1118static int 1119mt7615_mcu_uni_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif, 1120 struct ieee80211_sta *sta, bool enable) 1121{ 1122 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 1123 1124 return mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid, 1125 enable); 1126} 1127 1128static inline int 1129mt7615_mcu_uni_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif, 1130 struct ieee80211_sta *sta, bool enable) 1131{ 1132 return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable, 1133 MCU_UNI_CMD(STA_REC_UPDATE), true); 1134} 1135 1136static int 1137mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev, 1138 struct ieee80211_ampdu_params *params, 1139 bool enable) 1140{ 1141 struct mt7615_sta *sta = (struct mt7615_sta *)params->sta->drv_priv; 1142 1143 return mt76_connac_mcu_sta_ba(&dev->mt76, &sta->vif->mt76, params, 1144 MCU_UNI_CMD(STA_REC_UPDATE), enable, 1145 true); 1146} 1147 1148static int 1149mt7615_mcu_uni_rx_ba(struct mt7615_dev *dev, 1150 struct ieee80211_ampdu_params *params, 1151 bool enable) 1152{ 1153 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv; 1154 struct mt7615_vif *mvif = msta->vif; 1155 struct wtbl_req_hdr *wtbl_hdr; 1156 struct tlv *sta_wtbl; 1157 struct sk_buff *skb; 1158 int err; 1159 1160 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, 1161 &msta->wcid); 1162 if (IS_ERR(skb)) 1163 return PTR_ERR(skb); 1164 1165 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false); 1166 1167 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, 1168 MCU_UNI_CMD(STA_REC_UPDATE), true); 1169 if (err < 0 || !enable) 1170 return err; 1171 1172 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, 1173 &msta->wcid); 1174 if (IS_ERR(skb)) 1175 return PTR_ERR(skb); 1176 1177 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, 1178 sizeof(struct tlv)); 1179 1180 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid, 1181 WTBL_SET, sta_wtbl, &skb); 1182 if (IS_ERR(wtbl_hdr)) 1183 return PTR_ERR(wtbl_hdr); 1184 1185 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false, 1186 sta_wtbl, wtbl_hdr); 1187 1188 return mt76_mcu_skb_send_msg(&dev->mt76, skb, 1189 MCU_UNI_CMD(STA_REC_UPDATE), true); 1190} 1191 1192static int 1193mt7615_mcu_sta_uni_update_hdr_trans(struct mt7615_dev *dev, 1194 struct ieee80211_vif *vif, 1195 struct ieee80211_sta *sta) 1196{ 1197 struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv; 1198 1199 return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76, 1200 vif, &msta->wcid, 1201 MCU_UNI_CMD(STA_REC_UPDATE)); 1202} 1203 1204static const struct mt7615_mcu_ops uni_update_ops = { 1205 .add_beacon_offload = mt7615_mcu_uni_add_beacon_offload, 1206 .set_pm_state = mt7615_mcu_uni_ctrl_pm_state, 1207 .add_dev_info = mt7615_mcu_uni_add_dev, 1208 .add_bss_info = mt7615_mcu_uni_add_bss, 1209 .add_tx_ba = mt7615_mcu_uni_tx_ba, 1210 .add_rx_ba = mt7615_mcu_uni_rx_ba, 1211 .sta_add = mt7615_mcu_uni_add_sta, 1212 .set_drv_ctrl = mt7615_mcu_lp_drv_pmctrl, 1213 .set_fw_ctrl = mt7615_mcu_fw_pmctrl, 1214 .set_sta_decap_offload = mt7615_mcu_sta_uni_update_hdr_trans, 1215}; 1216 1217int mt7615_mcu_restart(struct mt76_dev *dev) 1218{ 1219 return mt76_mcu_send_msg(dev, MCU_CMD(RESTART_DL_REQ), NULL, 0, true); 1220} 1221EXPORT_SYMBOL_GPL(mt7615_mcu_restart); 1222 1223static int mt7615_load_patch(struct mt7615_dev *dev, u32 addr, const char *name) 1224{ 1225 const struct mt7615_patch_hdr *hdr; 1226 const struct firmware *fw = NULL; 1227 int len, ret, sem; 1228 1229 ret = firmware_request_nowarn(&fw, name, dev->mt76.dev); 1230 if (ret) 1231 return ret; 1232 1233 if (!fw || !fw->data || fw->size < sizeof(*hdr)) { 1234 dev_err(dev->mt76.dev, "Invalid firmware\n"); 1235 ret = -EINVAL; 1236 goto release_fw; 1237 } 1238 1239 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, true); 1240 switch (sem) { 1241 case PATCH_IS_DL: 1242 goto release_fw; 1243 case PATCH_NOT_DL_SEM_SUCCESS: 1244 break; 1245 default: 1246 dev_err(dev->mt76.dev, "Failed to get patch semaphore\n"); 1247 ret = -EAGAIN; 1248 goto release_fw; 1249 } 1250 1251 hdr = (const struct mt7615_patch_hdr *)(fw->data); 1252 1253 dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n", 1254 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date); 1255 1256 len = fw->size - sizeof(*hdr); 1257 1258 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len, 1259 DL_MODE_NEED_RSP); 1260 if (ret) { 1261 dev_err(dev->mt76.dev, "Download request failed\n"); 1262 goto out; 1263 } 1264 1265 ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER), 1266 fw->data + sizeof(*hdr), len); 1267 if (ret) { 1268 dev_err(dev->mt76.dev, "Failed to send firmware to device\n"); 1269 goto out; 1270 } 1271 1272 ret = mt76_connac_mcu_start_patch(&dev->mt76); 1273 if (ret) 1274 dev_err(dev->mt76.dev, "Failed to start patch\n"); 1275 1276out: 1277 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false); 1278 switch (sem) { 1279 case PATCH_REL_SEM_SUCCESS: 1280 break; 1281 default: 1282 ret = -EAGAIN; 1283 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n"); 1284 break; 1285 } 1286 1287release_fw: 1288 release_firmware(fw); 1289 1290 return ret; 1291} 1292 1293static int 1294mt7615_mcu_send_ram_firmware(struct mt7615_dev *dev, 1295 const struct mt7615_fw_trailer *hdr, 1296 const u8 *data, bool is_cr4) 1297{ 1298 int n_region = is_cr4 ? CR4_REGION_NUM : N9_REGION_NUM; 1299 int err, i, offset = 0; 1300 u32 len, addr, mode; 1301 1302 for (i = 0; i < n_region; i++) { 1303 mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76, 1304 hdr[i].feature_set, is_cr4); 1305 len = le32_to_cpu(hdr[i].len) + IMG_CRC_LEN; 1306 addr = le32_to_cpu(hdr[i].addr); 1307 1308 err = mt76_connac_mcu_init_download(&dev->mt76, addr, len, 1309 mode); 1310 if (err) { 1311 dev_err(dev->mt76.dev, "Download request failed\n"); 1312 return err; 1313 } 1314 1315 err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER), 1316 data + offset, len); 1317 if (err) { 1318 dev_err(dev->mt76.dev, "Failed to send firmware to device\n"); 1319 return err; 1320 } 1321 1322 offset += len; 1323 } 1324 1325 return 0; 1326} 1327 1328static int mt7615_load_n9(struct mt7615_dev *dev, const char *name) 1329{ 1330 const struct mt7615_fw_trailer *hdr; 1331 const struct firmware *fw; 1332 int ret; 1333 1334 ret = request_firmware(&fw, name, dev->mt76.dev); 1335 if (ret) 1336 return ret; 1337 1338 if (!fw || !fw->data || fw->size < N9_REGION_NUM * sizeof(*hdr)) { 1339 dev_err(dev->mt76.dev, "Invalid firmware\n"); 1340 ret = -EINVAL; 1341 goto out; 1342 } 1343 1344 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size - 1345 N9_REGION_NUM * sizeof(*hdr)); 1346 1347 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n", 1348 hdr->fw_ver, hdr->build_date); 1349 1350 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, false); 1351 if (ret) 1352 goto out; 1353 1354 ret = mt76_connac_mcu_start_firmware(&dev->mt76, 1355 le32_to_cpu(hdr->addr), 1356 FW_START_OVERRIDE); 1357 if (ret) { 1358 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n"); 1359 goto out; 1360 } 1361 1362 snprintf(dev->mt76.hw->wiphy->fw_version, 1363 sizeof(dev->mt76.hw->wiphy->fw_version), 1364 "%.10s-%.15s", hdr->fw_ver, hdr->build_date); 1365 1366 if (!is_mt7615(&dev->mt76)) { 1367 dev->fw_ver = MT7615_FIRMWARE_V2; 1368 dev->mcu_ops = &sta_update_ops; 1369 } else { 1370 dev->fw_ver = MT7615_FIRMWARE_V1; 1371 dev->mcu_ops = &wtbl_update_ops; 1372 } 1373 1374out: 1375 release_firmware(fw); 1376 return ret; 1377} 1378 1379static int mt7615_load_cr4(struct mt7615_dev *dev, const char *name) 1380{ 1381 const struct mt7615_fw_trailer *hdr; 1382 const struct firmware *fw; 1383 int ret; 1384 1385 ret = request_firmware(&fw, name, dev->mt76.dev); 1386 if (ret) 1387 return ret; 1388 1389 if (!fw || !fw->data || fw->size < CR4_REGION_NUM * sizeof(*hdr)) { 1390 dev_err(dev->mt76.dev, "Invalid firmware\n"); 1391 ret = -EINVAL; 1392 goto out; 1393 } 1394 1395 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size - 1396 CR4_REGION_NUM * sizeof(*hdr)); 1397 1398 dev_info(dev->mt76.dev, "CR4 Firmware Version: %.10s, Build Time: %.15s\n", 1399 hdr->fw_ver, hdr->build_date); 1400 1401 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, true); 1402 if (ret) 1403 goto out; 1404 1405 ret = mt76_connac_mcu_start_firmware(&dev->mt76, 0, 1406 FW_START_WORKING_PDA_CR4); 1407 if (ret) { 1408 dev_err(dev->mt76.dev, "Failed to start CR4 firmware\n"); 1409 goto out; 1410 } 1411 1412out: 1413 release_firmware(fw); 1414 1415 return ret; 1416} 1417 1418static int mt7615_load_ram(struct mt7615_dev *dev) 1419{ 1420 int ret; 1421 1422 ret = mt7615_load_n9(dev, MT7615_FIRMWARE_N9); 1423 if (ret) 1424 return ret; 1425 1426 return mt7615_load_cr4(dev, MT7615_FIRMWARE_CR4); 1427} 1428 1429static int mt7615_load_firmware(struct mt7615_dev *dev) 1430{ 1431 int ret; 1432 u32 val; 1433 1434 val = mt76_get_field(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE); 1435 1436 if (val != FW_STATE_FW_DOWNLOAD) { 1437 dev_err(dev->mt76.dev, "Firmware is not ready for download\n"); 1438 return -EIO; 1439 } 1440 1441 ret = mt7615_load_patch(dev, MT7615_PATCH_ADDRESS, MT7615_ROM_PATCH); 1442 if (ret) 1443 return ret; 1444 1445 ret = mt7615_load_ram(dev); 1446 if (ret) 1447 return ret; 1448 1449 if (!mt76_poll_msec(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE, 1450 FIELD_PREP(MT_TOP_MISC2_FW_STATE, 1451 FW_STATE_RDY), 500)) { 1452 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n"); 1453 return -EIO; 1454 } 1455 1456 return 0; 1457} 1458 1459static int mt7622_load_firmware(struct mt7615_dev *dev) 1460{ 1461 int ret; 1462 u32 val; 1463 1464 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH); 1465 1466 val = mt76_get_field(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE); 1467 if (val != FW_STATE_FW_DOWNLOAD) { 1468 dev_err(dev->mt76.dev, "Firmware is not ready for download\n"); 1469 return -EIO; 1470 } 1471 1472 ret = mt7615_load_patch(dev, MT7622_PATCH_ADDRESS, MT7622_ROM_PATCH); 1473 if (ret) 1474 return ret; 1475 1476 ret = mt7615_load_n9(dev, MT7622_FIRMWARE_N9); 1477 if (ret) 1478 return ret; 1479 1480 if (!mt76_poll_msec(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE, 1481 FIELD_PREP(MT_TOP_OFF_RSV_FW_STATE, 1482 FW_STATE_NORMAL_TRX), 1500)) { 1483 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n"); 1484 return -EIO; 1485 } 1486 1487 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH); 1488 1489 return 0; 1490} 1491 1492int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl) 1493{ 1494 struct { 1495 u8 ctrl_val; 1496 u8 pad[3]; 1497 } data = { 1498 .ctrl_val = ctrl 1499 }; 1500 1501 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST), 1502 &data, sizeof(data), true); 1503} 1504 1505static int mt7615_mcu_cal_cache_apply(struct mt7615_dev *dev) 1506{ 1507 struct { 1508 bool cache_enable; 1509 u8 pad[3]; 1510 } data = { 1511 .cache_enable = true 1512 }; 1513 1514 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(CAL_CACHE), &data, 1515 sizeof(data), false); 1516} 1517 1518static int mt7663_load_n9(struct mt7615_dev *dev, const char *name) 1519{ 1520 u32 offset = 0, override_addr = 0, flag = FW_START_DLYCAL; 1521 const struct mt7663_fw_trailer *hdr; 1522 const struct mt7663_fw_buf *buf; 1523 const struct firmware *fw; 1524 const u8 *base_addr; 1525 int i, ret; 1526 1527 ret = request_firmware(&fw, name, dev->mt76.dev); 1528 if (ret) 1529 return ret; 1530 1531 if (!fw || !fw->data || fw->size < FW_V3_COMMON_TAILER_SIZE) { 1532 dev_err(dev->mt76.dev, "Invalid firmware\n"); 1533 ret = -EINVAL; 1534 goto out; 1535 } 1536 1537 hdr = (const struct mt7663_fw_trailer *)(fw->data + fw->size - 1538 FW_V3_COMMON_TAILER_SIZE); 1539 1540 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n", 1541 hdr->fw_ver, hdr->build_date); 1542 dev_info(dev->mt76.dev, "Region number: 0x%x\n", hdr->n_region); 1543 1544 base_addr = fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE; 1545 for (i = 0; i < hdr->n_region; i++) { 1546 u32 shift = (hdr->n_region - i) * FW_V3_REGION_TAILER_SIZE; 1547 u32 len, addr, mode; 1548 1549 dev_info(dev->mt76.dev, "Parsing tailer Region: %d\n", i); 1550 1551 buf = (const struct mt7663_fw_buf *)(base_addr - shift); 1552 mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76, 1553 buf->feature_set, false); 1554 addr = le32_to_cpu(buf->img_dest_addr); 1555 len = le32_to_cpu(buf->img_size); 1556 1557 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len, 1558 mode); 1559 if (ret) { 1560 dev_err(dev->mt76.dev, "Download request failed\n"); 1561 goto out; 1562 } 1563 1564 ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER), 1565 fw->data + offset, len); 1566 if (ret) { 1567 dev_err(dev->mt76.dev, "Failed to send firmware\n"); 1568 goto out; 1569 } 1570 1571 offset += le32_to_cpu(buf->img_size); 1572 if (buf->feature_set & DL_MODE_VALID_RAM_ENTRY) { 1573 override_addr = le32_to_cpu(buf->img_dest_addr); 1574 dev_info(dev->mt76.dev, "Region %d, override_addr = 0x%08x\n", 1575 i, override_addr); 1576 } 1577 } 1578 1579 if (override_addr) 1580 flag |= FW_START_OVERRIDE; 1581 1582 dev_info(dev->mt76.dev, "override_addr = 0x%08x, option = %d\n", 1583 override_addr, flag); 1584 1585 ret = mt76_connac_mcu_start_firmware(&dev->mt76, override_addr, flag); 1586 if (ret) { 1587 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n"); 1588 goto out; 1589 } 1590 1591 snprintf(dev->mt76.hw->wiphy->fw_version, 1592 sizeof(dev->mt76.hw->wiphy->fw_version), 1593 "%.10s-%.15s", hdr->fw_ver, hdr->build_date); 1594 1595out: 1596 release_firmware(fw); 1597 1598 return ret; 1599} 1600 1601static int 1602mt7663_load_rom_patch(struct mt7615_dev *dev, const char **n9_firmware) 1603{ 1604 const char *selected_rom, *secondary_rom = MT7663_ROM_PATCH; 1605 const char *primary_rom = MT7663_OFFLOAD_ROM_PATCH; 1606 int ret; 1607 1608 if (!prefer_offload_fw) { 1609 secondary_rom = MT7663_OFFLOAD_ROM_PATCH; 1610 primary_rom = MT7663_ROM_PATCH; 1611 } 1612 selected_rom = primary_rom; 1613 1614 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS, primary_rom); 1615 if (ret) { 1616 dev_info(dev->mt76.dev, "%s not found, switching to %s", 1617 primary_rom, secondary_rom); 1618 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS, 1619 secondary_rom); 1620 if (ret) { 1621 dev_err(dev->mt76.dev, "failed to load %s", 1622 secondary_rom); 1623 return ret; 1624 } 1625 selected_rom = secondary_rom; 1626 } 1627 1628 if (!strcmp(selected_rom, MT7663_OFFLOAD_ROM_PATCH)) { 1629 *n9_firmware = MT7663_OFFLOAD_FIRMWARE_N9; 1630 dev->fw_ver = MT7615_FIRMWARE_V3; 1631 dev->mcu_ops = &uni_update_ops; 1632 } else { 1633 *n9_firmware = MT7663_FIRMWARE_N9; 1634 dev->fw_ver = MT7615_FIRMWARE_V2; 1635 dev->mcu_ops = &sta_update_ops; 1636 } 1637 1638 return 0; 1639} 1640 1641int __mt7663_load_firmware(struct mt7615_dev *dev) 1642{ 1643 const char *n9_firmware; 1644 int ret; 1645 1646 ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY); 1647 if (ret) { 1648 dev_dbg(dev->mt76.dev, "Firmware is already download\n"); 1649 return -EIO; 1650 } 1651 1652 ret = mt7663_load_rom_patch(dev, &n9_firmware); 1653 if (ret) 1654 return ret; 1655 1656 ret = mt7663_load_n9(dev, n9_firmware); 1657 if (ret) 1658 return ret; 1659 1660 if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY, 1661 MT_TOP_MISC2_FW_N9_RDY, 1500)) { 1662 ret = mt76_get_field(dev, MT_CONN_ON_MISC, 1663 MT7663_TOP_MISC2_FW_STATE); 1664 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n"); 1665 return -EIO; 1666 } 1667 1668#ifdef CONFIG_PM 1669 if (mt7615_firmware_offload(dev)) 1670 dev->mt76.hw->wiphy->wowlan = &mt76_connac_wowlan_support; 1671#endif /* CONFIG_PM */ 1672 1673 dev_dbg(dev->mt76.dev, "Firmware init done\n"); 1674 1675 return 0; 1676} 1677EXPORT_SYMBOL_GPL(__mt7663_load_firmware); 1678 1679static int mt7663_load_firmware(struct mt7615_dev *dev) 1680{ 1681 int ret; 1682 1683 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH); 1684 1685 ret = __mt7663_load_firmware(dev); 1686 if (ret) 1687 return ret; 1688 1689 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH); 1690 1691 return 0; 1692} 1693 1694int mt7615_mcu_init(struct mt7615_dev *dev) 1695{ 1696 static const struct mt76_mcu_ops mt7615_mcu_ops = { 1697 .headroom = sizeof(struct mt7615_mcu_txd), 1698 .mcu_skb_send_msg = mt7615_mcu_send_message, 1699 .mcu_parse_response = mt7615_mcu_parse_response, 1700 .mcu_restart = mt7615_mcu_restart, 1701 }; 1702 int ret; 1703 1704 dev->mt76.mcu_ops = &mt7615_mcu_ops, 1705 1706 ret = mt7615_mcu_drv_pmctrl(dev); 1707 if (ret) 1708 return ret; 1709 1710 switch (mt76_chip(&dev->mt76)) { 1711 case 0x7622: 1712 ret = mt7622_load_firmware(dev); 1713 break; 1714 case 0x7663: 1715 ret = mt7663_load_firmware(dev); 1716 break; 1717 default: 1718 ret = mt7615_load_firmware(dev); 1719 break; 1720 } 1721 if (ret) 1722 return ret; 1723 1724 mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false); 1725 dev_dbg(dev->mt76.dev, "Firmware init done\n"); 1726 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state); 1727 1728 if (dev->dbdc_support) { 1729 ret = mt7615_mcu_cal_cache_apply(dev); 1730 if (ret) 1731 return ret; 1732 } 1733 1734 return mt7615_mcu_fw_log_2_host(dev, 0); 1735} 1736EXPORT_SYMBOL_GPL(mt7615_mcu_init); 1737 1738void mt7615_mcu_exit(struct mt7615_dev *dev) 1739{ 1740 __mt76_mcu_restart(&dev->mt76); 1741 mt7615_mcu_set_fw_ctrl(dev); 1742 skb_queue_purge(&dev->mt76.mcu.res_q); 1743} 1744EXPORT_SYMBOL_GPL(mt7615_mcu_exit); 1745 1746int mt7615_mcu_set_eeprom(struct mt7615_dev *dev) 1747{ 1748 struct { 1749 u8 buffer_mode; 1750 u8 content_format; 1751 __le16 len; 1752 } __packed req_hdr = { 1753 .buffer_mode = 1, 1754 }; 1755 u8 *eep = (u8 *)dev->mt76.eeprom.data; 1756 struct sk_buff *skb; 1757 int eep_len, offset; 1758 1759 switch (mt76_chip(&dev->mt76)) { 1760 case 0x7622: 1761 eep_len = MT7622_EE_MAX - MT_EE_NIC_CONF_0; 1762 offset = MT_EE_NIC_CONF_0; 1763 break; 1764 case 0x7663: 1765 eep_len = MT7663_EE_MAX - MT_EE_CHIP_ID; 1766 req_hdr.content_format = 1; 1767 offset = MT_EE_CHIP_ID; 1768 break; 1769 default: 1770 eep_len = MT7615_EE_MAX - MT_EE_NIC_CONF_0; 1771 offset = MT_EE_NIC_CONF_0; 1772 break; 1773 } 1774 1775 req_hdr.len = cpu_to_le16(eep_len); 1776 1777 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req_hdr) + eep_len); 1778 if (!skb) 1779 return -ENOMEM; 1780 1781 skb_put_data(skb, &req_hdr, sizeof(req_hdr)); 1782 skb_put_data(skb, eep + offset, eep_len); 1783 1784 return mt76_mcu_skb_send_msg(&dev->mt76, skb, 1785 MCU_EXT_CMD(EFUSE_BUFFER_MODE), true); 1786} 1787 1788int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue, 1789 const struct ieee80211_tx_queue_params *params) 1790{ 1791#define WMM_AIFS_SET BIT(0) 1792#define WMM_CW_MIN_SET BIT(1) 1793#define WMM_CW_MAX_SET BIT(2) 1794#define WMM_TXOP_SET BIT(3) 1795#define WMM_PARAM_SET (WMM_AIFS_SET | WMM_CW_MIN_SET | \ 1796 WMM_CW_MAX_SET | WMM_TXOP_SET) 1797 struct req_data { 1798 u8 number; 1799 u8 rsv[3]; 1800 u8 queue; 1801 u8 valid; 1802 u8 aifs; 1803 u8 cw_min; 1804 __le16 cw_max; 1805 __le16 txop; 1806 } __packed req = { 1807 .number = 1, 1808 .queue = queue, 1809 .valid = WMM_PARAM_SET, 1810 .aifs = params->aifs, 1811 .cw_min = 5, 1812 .cw_max = cpu_to_le16(10), 1813 .txop = cpu_to_le16(params->txop), 1814 }; 1815 1816 if (params->cw_min) 1817 req.cw_min = fls(params->cw_min); 1818 if (params->cw_max) 1819 req.cw_max = cpu_to_le16(fls(params->cw_max)); 1820 1821 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE), 1822 &req, sizeof(req), true); 1823} 1824 1825int mt7615_mcu_set_dbdc(struct mt7615_dev *dev) 1826{ 1827 struct mt7615_phy *ext_phy = mt7615_ext_phy(dev); 1828 struct dbdc_entry { 1829 u8 type; 1830 u8 index; 1831 u8 band; 1832 u8 _rsv; 1833 }; 1834 struct { 1835 u8 enable; 1836 u8 num; 1837 u8 _rsv[2]; 1838 struct dbdc_entry entry[64]; 1839 } req = { 1840 .enable = !!ext_phy, 1841 }; 1842 int i; 1843 1844 if (!ext_phy) 1845 goto out; 1846 1847#define ADD_DBDC_ENTRY(_type, _idx, _band) \ 1848 do { \ 1849 req.entry[req.num].type = _type; \ 1850 req.entry[req.num].index = _idx; \ 1851 req.entry[req.num++].band = _band; \ 1852 } while (0) 1853 1854 for (i = 0; i < 4; i++) { 1855 bool band = !!(ext_phy->omac_mask & BIT_ULL(i)); 1856 1857 ADD_DBDC_ENTRY(DBDC_TYPE_BSS, i, band); 1858 } 1859 1860 for (i = 0; i < 14; i++) { 1861 bool band = !!(ext_phy->omac_mask & BIT_ULL(0x11 + i)); 1862 1863 ADD_DBDC_ENTRY(DBDC_TYPE_MBSS, i, band); 1864 } 1865 1866 ADD_DBDC_ENTRY(DBDC_TYPE_MU, 0, 1); 1867 1868 for (i = 0; i < 3; i++) 1869 ADD_DBDC_ENTRY(DBDC_TYPE_BF, i, 1); 1870 1871 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 0, 0); 1872 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 1, 0); 1873 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 2, 1); 1874 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 3, 1); 1875 1876 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 0, 0); 1877 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 1, 1); 1878 1879out: 1880 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DBDC_CTRL), &req, 1881 sizeof(req), true); 1882} 1883 1884int mt7615_mcu_del_wtbl_all(struct mt7615_dev *dev) 1885{ 1886 struct wtbl_req_hdr req = { 1887 .operation = WTBL_RESET_ALL, 1888 }; 1889 1890 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(WTBL_UPDATE), 1891 &req, sizeof(req), true); 1892} 1893 1894int mt7615_mcu_set_fcc5_lpn(struct mt7615_dev *dev, int val) 1895{ 1896 struct { 1897 __le16 tag; 1898 __le16 min_lpn; 1899 } req = { 1900 .tag = cpu_to_le16(0x1), 1901 .min_lpn = cpu_to_le16(val), 1902 }; 1903 1904 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH), 1905 &req, sizeof(req), true); 1906} 1907 1908int mt7615_mcu_set_pulse_th(struct mt7615_dev *dev, 1909 const struct mt7615_dfs_pulse *pulse) 1910{ 1911 struct { 1912 __le16 tag; 1913 __le32 max_width; /* us */ 1914 __le32 max_pwr; /* dbm */ 1915 __le32 min_pwr; /* dbm */ 1916 __le32 min_stgr_pri; /* us */ 1917 __le32 max_stgr_pri; /* us */ 1918 __le32 min_cr_pri; /* us */ 1919 __le32 max_cr_pri; /* us */ 1920 } req = { 1921 .tag = cpu_to_le16(0x3), 1922#define __req_field(field) .field = cpu_to_le32(pulse->field) 1923 __req_field(max_width), 1924 __req_field(max_pwr), 1925 __req_field(min_pwr), 1926 __req_field(min_stgr_pri), 1927 __req_field(max_stgr_pri), 1928 __req_field(min_cr_pri), 1929 __req_field(max_cr_pri), 1930#undef __req_field 1931 }; 1932 1933 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH), 1934 &req, sizeof(req), true); 1935} 1936 1937int mt7615_mcu_set_radar_th(struct mt7615_dev *dev, int index, 1938 const struct mt7615_dfs_pattern *pattern) 1939{ 1940 struct { 1941 __le16 tag; 1942 __le16 radar_type; 1943 u8 enb; 1944 u8 stgr; 1945 u8 min_crpn; 1946 u8 max_crpn; 1947 u8 min_crpr; 1948 u8 min_pw; 1949 u8 max_pw; 1950 __le32 min_pri; 1951 __le32 max_pri; 1952 u8 min_crbn; 1953 u8 max_crbn; 1954 u8 min_stgpn; 1955 u8 max_stgpn; 1956 u8 min_stgpr; 1957 } req = { 1958 .tag = cpu_to_le16(0x2), 1959 .radar_type = cpu_to_le16(index), 1960#define __req_field_u8(field) .field = pattern->field 1961#define __req_field_u32(field) .field = cpu_to_le32(pattern->field) 1962 __req_field_u8(enb), 1963 __req_field_u8(stgr), 1964 __req_field_u8(min_crpn), 1965 __req_field_u8(max_crpn), 1966 __req_field_u8(min_crpr), 1967 __req_field_u8(min_pw), 1968 __req_field_u8(max_pw), 1969 __req_field_u32(min_pri), 1970 __req_field_u32(max_pri), 1971 __req_field_u8(min_crbn), 1972 __req_field_u8(max_crbn), 1973 __req_field_u8(min_stgpn), 1974 __req_field_u8(max_stgpn), 1975 __req_field_u8(min_stgpr), 1976#undef __req_field_u8 1977#undef __req_field_u32 1978 }; 1979 1980 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH), 1981 &req, sizeof(req), true); 1982} 1983 1984int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev) 1985{ 1986 struct { 1987 u8 pulse_num; 1988 u8 rsv[3]; 1989 struct { 1990 __le32 start_time; 1991 __le16 width; 1992 __le16 power; 1993 } pattern[32]; 1994 } req = { 1995 .pulse_num = dev->radar_pattern.n_pulses, 1996 }; 1997 u32 start_time = ktime_to_ms(ktime_get_boottime()); 1998 int i; 1999 2000 if (dev->radar_pattern.n_pulses > ARRAY_SIZE(req.pattern)) 2001 return -EINVAL; 2002 2003 /* TODO: add some noise here */ 2004 for (i = 0; i < dev->radar_pattern.n_pulses; i++) { 2005 u32 ts = start_time + i * dev->radar_pattern.period; 2006 2007 req.pattern[i].width = cpu_to_le16(dev->radar_pattern.width); 2008 req.pattern[i].power = cpu_to_le16(dev->radar_pattern.power); 2009 req.pattern[i].start_time = cpu_to_le32(ts); 2010 } 2011 2012 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_PATTERN), 2013 &req, sizeof(req), false); 2014} 2015 2016static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku) 2017{ 2018 struct mt76_phy *mphy = phy->mt76; 2019 struct ieee80211_hw *hw = mphy->hw; 2020 struct mt76_power_limits limits; 2021 s8 *limits_array = (s8 *)&limits; 2022 int n_chains = hweight8(mphy->antenna_mask); 2023 int tx_power = hw->conf.power_level * 2; 2024 int i; 2025 static const u8 sku_mapping[] = { 2026#define SKU_FIELD(_type, _field) \ 2027 [MT_SKU_##_type] = offsetof(struct mt76_power_limits, _field) 2028 SKU_FIELD(CCK_1_2, cck[0]), 2029 SKU_FIELD(CCK_55_11, cck[2]), 2030 SKU_FIELD(OFDM_6_9, ofdm[0]), 2031 SKU_FIELD(OFDM_12_18, ofdm[2]), 2032 SKU_FIELD(OFDM_24_36, ofdm[4]), 2033 SKU_FIELD(OFDM_48, ofdm[6]), 2034 SKU_FIELD(OFDM_54, ofdm[7]), 2035 SKU_FIELD(HT20_0_8, mcs[0][0]), 2036 SKU_FIELD(HT20_32, ofdm[0]), 2037 SKU_FIELD(HT20_1_2_9_10, mcs[0][1]), 2038 SKU_FIELD(HT20_3_4_11_12, mcs[0][3]), 2039 SKU_FIELD(HT20_5_13, mcs[0][5]), 2040 SKU_FIELD(HT20_6_14, mcs[0][6]), 2041 SKU_FIELD(HT20_7_15, mcs[0][7]), 2042 SKU_FIELD(HT40_0_8, mcs[1][0]), 2043 SKU_FIELD(HT40_32, ofdm[0]), 2044 SKU_FIELD(HT40_1_2_9_10, mcs[1][1]), 2045 SKU_FIELD(HT40_3_4_11_12, mcs[1][3]), 2046 SKU_FIELD(HT40_5_13, mcs[1][5]), 2047 SKU_FIELD(HT40_6_14, mcs[1][6]), 2048 SKU_FIELD(HT40_7_15, mcs[1][7]), 2049 SKU_FIELD(VHT20_0, mcs[0][0]), 2050 SKU_FIELD(VHT20_1_2, mcs[0][1]), 2051 SKU_FIELD(VHT20_3_4, mcs[0][3]), 2052 SKU_FIELD(VHT20_5_6, mcs[0][5]), 2053 SKU_FIELD(VHT20_7, mcs[0][7]), 2054 SKU_FIELD(VHT20_8, mcs[0][8]), 2055 SKU_FIELD(VHT20_9, mcs[0][9]), 2056 SKU_FIELD(VHT40_0, mcs[1][0]), 2057 SKU_FIELD(VHT40_1_2, mcs[1][1]), 2058 SKU_FIELD(VHT40_3_4, mcs[1][3]), 2059 SKU_FIELD(VHT40_5_6, mcs[1][5]), 2060 SKU_FIELD(VHT40_7, mcs[1][7]), 2061 SKU_FIELD(VHT40_8, mcs[1][8]), 2062 SKU_FIELD(VHT40_9, mcs[1][9]), 2063 SKU_FIELD(VHT80_0, mcs[2][0]), 2064 SKU_FIELD(VHT80_1_2, mcs[2][1]), 2065 SKU_FIELD(VHT80_3_4, mcs[2][3]), 2066 SKU_FIELD(VHT80_5_6, mcs[2][5]), 2067 SKU_FIELD(VHT80_7, mcs[2][7]), 2068 SKU_FIELD(VHT80_8, mcs[2][8]), 2069 SKU_FIELD(VHT80_9, mcs[2][9]), 2070 SKU_FIELD(VHT160_0, mcs[3][0]), 2071 SKU_FIELD(VHT160_1_2, mcs[3][1]), 2072 SKU_FIELD(VHT160_3_4, mcs[3][3]), 2073 SKU_FIELD(VHT160_5_6, mcs[3][5]), 2074 SKU_FIELD(VHT160_7, mcs[3][7]), 2075 SKU_FIELD(VHT160_8, mcs[3][8]), 2076 SKU_FIELD(VHT160_9, mcs[3][9]), 2077#undef SKU_FIELD 2078 }; 2079 2080 tx_power = mt76_get_sar_power(mphy, mphy->chandef.chan, tx_power); 2081 tx_power -= mt76_tx_power_nss_delta(n_chains); 2082 tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan, 2083 &limits, tx_power); 2084 mphy->txpower_cur = tx_power; 2085 2086 if (is_mt7663(mphy->dev)) { 2087 memset(sku, tx_power, MT_SKU_4SS_DELTA + 1); 2088 return; 2089 } 2090 2091 for (i = 0; i < MT_SKU_1SS_DELTA; i++) 2092 sku[i] = limits_array[sku_mapping[i]]; 2093 2094 for (i = 0; i < 4; i++) { 2095 int delta = 0; 2096 2097 if (i < n_chains - 1) 2098 delta = mt76_tx_power_nss_delta(n_chains) - 2099 mt76_tx_power_nss_delta(i + 1); 2100 sku[MT_SKU_1SS_DELTA + i] = delta; 2101 } 2102} 2103 2104static u8 mt7615_mcu_chan_bw(struct cfg80211_chan_def *chandef) 2105{ 2106 static const u8 width_to_bw[] = { 2107 [NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ, 2108 [NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ, 2109 [NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ, 2110 [NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ, 2111 [NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ, 2112 [NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ, 2113 [NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ, 2114 [NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ, 2115 }; 2116 2117 if (chandef->width >= ARRAY_SIZE(width_to_bw)) 2118 return 0; 2119 2120 return width_to_bw[chandef->width]; 2121} 2122 2123int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd) 2124{ 2125 struct mt7615_dev *dev = phy->dev; 2126 struct cfg80211_chan_def *chandef = &phy->mt76->chandef; 2127 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2; 2128 struct { 2129 u8 control_chan; 2130 u8 center_chan; 2131 u8 bw; 2132 u8 tx_streams; 2133 u8 rx_streams_mask; 2134 u8 switch_reason; 2135 u8 band_idx; 2136 /* for 80+80 only */ 2137 u8 center_chan2; 2138 __le16 cac_case; 2139 u8 channel_band; 2140 u8 rsv0; 2141 __le32 outband_freq; 2142 u8 txpower_drop; 2143 u8 rsv1[3]; 2144 u8 txpower_sku[53]; 2145 u8 rsv2[3]; 2146 } req = { 2147 .control_chan = chandef->chan->hw_value, 2148 .center_chan = ieee80211_frequency_to_channel(freq1), 2149 .tx_streams = hweight8(phy->mt76->antenna_mask), 2150 .rx_streams_mask = phy->mt76->chainmask, 2151 .center_chan2 = ieee80211_frequency_to_channel(freq2), 2152 }; 2153 2154 if (cmd == MCU_EXT_CMD(SET_RX_PATH) || 2155 dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR) 2156 req.switch_reason = CH_SWITCH_NORMAL; 2157 else if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) 2158 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD; 2159 else if (!cfg80211_reg_can_beacon(phy->mt76->hw->wiphy, chandef, 2160 NL80211_IFTYPE_AP)) 2161 req.switch_reason = CH_SWITCH_DFS; 2162 else 2163 req.switch_reason = CH_SWITCH_NORMAL; 2164 2165 req.band_idx = phy != &dev->phy; 2166 req.bw = mt7615_mcu_chan_bw(chandef); 2167 2168 if (mt76_testmode_enabled(phy->mt76)) 2169 memset(req.txpower_sku, 0x3f, 49); 2170 else 2171 mt7615_mcu_set_txpower_sku(phy, req.txpower_sku); 2172 2173 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true); 2174} 2175 2176int mt7615_mcu_get_temperature(struct mt7615_dev *dev) 2177{ 2178 struct { 2179 u8 action; 2180 u8 rsv[3]; 2181 } req = {}; 2182 2183 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL), 2184 &req, sizeof(req), true); 2185} 2186 2187int mt7615_mcu_set_test_param(struct mt7615_dev *dev, u8 param, bool test_mode, 2188 u32 val) 2189{ 2190 struct { 2191 u8 test_mode_en; 2192 u8 param_idx; 2193 u8 _rsv[2]; 2194 2195 __le32 value; 2196 2197 u8 pad[8]; 2198 } req = { 2199 .test_mode_en = test_mode, 2200 .param_idx = param, 2201 .value = cpu_to_le32(val), 2202 }; 2203 2204 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL), 2205 &req, sizeof(req), false); 2206} 2207 2208int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable) 2209{ 2210 struct mt7615_dev *dev = phy->dev; 2211 struct { 2212 u8 format_id; 2213 u8 sku_enable; 2214 u8 band_idx; 2215 u8 rsv; 2216 } req = { 2217 .format_id = 0, 2218 .band_idx = phy != &dev->phy, 2219 .sku_enable = enable, 2220 }; 2221 2222 return mt76_mcu_send_msg(&dev->mt76, 2223 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), 2224 &req, sizeof(req), true); 2225} 2226 2227static int mt7615_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur) 2228{ 2229 int i; 2230 2231 for (i = 0; i < n_freqs; i++) 2232 if (cur == freqs[i]) 2233 return i; 2234 2235 return -1; 2236} 2237 2238static int mt7615_dcoc_freq_idx(u16 freq, u8 bw) 2239{ 2240 static const u16 freq_list[] = { 2241 4980, 5805, 5905, 5190, 2242 5230, 5270, 5310, 5350, 2243 5390, 5430, 5470, 5510, 2244 5550, 5590, 5630, 5670, 2245 5710, 5755, 5795, 5835, 2246 5875, 5210, 5290, 5370, 2247 5450, 5530, 5610, 5690, 2248 5775, 5855 2249 }; 2250 static const u16 freq_bw40[] = { 2251 5190, 5230, 5270, 5310, 2252 5350, 5390, 5430, 5470, 2253 5510, 5550, 5590, 5630, 2254 5670, 5710, 5755, 5795, 2255 5835, 5875 2256 }; 2257 int offset_2g = ARRAY_SIZE(freq_list); 2258 int idx; 2259 2260 if (freq < 4000) { 2261 if (freq < 2427) 2262 return offset_2g; 2263 if (freq < 2442) 2264 return offset_2g + 1; 2265 if (freq < 2457) 2266 return offset_2g + 2; 2267 2268 return offset_2g + 3; 2269 } 2270 2271 switch (bw) { 2272 case NL80211_CHAN_WIDTH_80: 2273 case NL80211_CHAN_WIDTH_80P80: 2274 case NL80211_CHAN_WIDTH_160: 2275 break; 2276 default: 2277 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40), 2278 freq + 10); 2279 if (idx >= 0) { 2280 freq = freq_bw40[idx]; 2281 break; 2282 } 2283 2284 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40), 2285 freq - 10); 2286 if (idx >= 0) { 2287 freq = freq_bw40[idx]; 2288 break; 2289 } 2290 fallthrough; 2291 case NL80211_CHAN_WIDTH_40: 2292 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40), 2293 freq); 2294 if (idx >= 0) 2295 break; 2296 2297 return -1; 2298 2299 } 2300 2301 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq); 2302} 2303 2304int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy) 2305{ 2306 struct mt7615_dev *dev = phy->dev; 2307 struct cfg80211_chan_def *chandef = &phy->mt76->chandef; 2308 int freq2 = chandef->center_freq2; 2309 int ret; 2310 struct { 2311 u8 direction; 2312 u8 runtime_calibration; 2313 u8 _rsv[2]; 2314 2315 __le16 center_freq; 2316 u8 bw; 2317 u8 band; 2318 u8 is_freq2; 2319 u8 success; 2320 u8 dbdc_en; 2321 2322 u8 _rsv2; 2323 2324 struct { 2325 __le32 sx0_i_lna[4]; 2326 __le32 sx0_q_lna[4]; 2327 2328 __le32 sx2_i_lna[4]; 2329 __le32 sx2_q_lna[4]; 2330 } dcoc_data[4]; 2331 } req = { 2332 .direction = 1, 2333 2334 .bw = mt7615_mcu_chan_bw(chandef), 2335 .band = chandef->center_freq1 > 4000, 2336 .dbdc_en = !!dev->mt76.phy2, 2337 }; 2338 u16 center_freq = chandef->center_freq1; 2339 int freq_idx; 2340 u8 *eep = dev->mt76.eeprom.data; 2341 2342 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_RX_CAL)) 2343 return 0; 2344 2345 if (chandef->width == NL80211_CHAN_WIDTH_160) { 2346 freq2 = center_freq + 40; 2347 center_freq -= 40; 2348 } 2349 2350again: 2351 req.runtime_calibration = 1; 2352 freq_idx = mt7615_dcoc_freq_idx(center_freq, chandef->width); 2353 if (freq_idx < 0) 2354 goto out; 2355 2356 memcpy(req.dcoc_data, eep + MT7615_EEPROM_DCOC_OFFSET + 2357 freq_idx * MT7615_EEPROM_DCOC_SIZE, 2358 sizeof(req.dcoc_data)); 2359 req.runtime_calibration = 0; 2360 2361out: 2362 req.center_freq = cpu_to_le16(center_freq); 2363 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RXDCOC_CAL), &req, 2364 sizeof(req), true); 2365 2366 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 || 2367 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) { 2368 req.is_freq2 = true; 2369 center_freq = freq2; 2370 goto again; 2371 } 2372 2373 return ret; 2374} 2375 2376static int mt7615_dpd_freq_idx(u16 freq, u8 bw) 2377{ 2378 static const u16 freq_list[] = { 2379 4920, 4940, 4960, 4980, 2380 5040, 5060, 5080, 5180, 2381 5200, 5220, 5240, 5260, 2382 5280, 5300, 5320, 5340, 2383 5360, 5380, 5400, 5420, 2384 5440, 5460, 5480, 5500, 2385 5520, 5540, 5560, 5580, 2386 5600, 5620, 5640, 5660, 2387 5680, 5700, 5720, 5745, 2388 5765, 5785, 5805, 5825, 2389 5845, 5865, 5885, 5905 2390 }; 2391 int offset_2g = ARRAY_SIZE(freq_list); 2392 int idx; 2393 2394 if (freq < 4000) { 2395 if (freq < 2432) 2396 return offset_2g; 2397 if (freq < 2457) 2398 return offset_2g + 1; 2399 2400 return offset_2g + 2; 2401 } 2402 2403 if (bw != NL80211_CHAN_WIDTH_20) { 2404 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), 2405 freq + 10); 2406 if (idx >= 0) 2407 return idx; 2408 2409 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), 2410 freq - 10); 2411 if (idx >= 0) 2412 return idx; 2413 } 2414 2415 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq); 2416} 2417 2418 2419int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy) 2420{ 2421 struct mt7615_dev *dev = phy->dev; 2422 struct cfg80211_chan_def *chandef = &phy->mt76->chandef; 2423 int freq2 = chandef->center_freq2; 2424 int ret; 2425 struct { 2426 u8 direction; 2427 u8 runtime_calibration; 2428 u8 _rsv[2]; 2429 2430 __le16 center_freq; 2431 u8 bw; 2432 u8 band; 2433 u8 is_freq2; 2434 u8 success; 2435 u8 dbdc_en; 2436 2437 u8 _rsv2; 2438 2439 struct { 2440 struct { 2441 u32 dpd_g0; 2442 u8 data[32]; 2443 } wf0, wf1; 2444 2445 struct { 2446 u32 dpd_g0_prim; 2447 u32 dpd_g0_sec; 2448 u8 data_prim[32]; 2449 u8 data_sec[32]; 2450 } wf2, wf3; 2451 } dpd_data; 2452 } req = { 2453 .direction = 1, 2454 2455 .bw = mt7615_mcu_chan_bw(chandef), 2456 .band = chandef->center_freq1 > 4000, 2457 .dbdc_en = !!dev->mt76.phy2, 2458 }; 2459 u16 center_freq = chandef->center_freq1; 2460 int freq_idx; 2461 u8 *eep = dev->mt76.eeprom.data; 2462 2463 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_TX_DPD)) 2464 return 0; 2465 2466 if (chandef->width == NL80211_CHAN_WIDTH_160) { 2467 freq2 = center_freq + 40; 2468 center_freq -= 40; 2469 } 2470 2471again: 2472 req.runtime_calibration = 1; 2473 freq_idx = mt7615_dpd_freq_idx(center_freq, chandef->width); 2474 if (freq_idx < 0) 2475 goto out; 2476 2477 memcpy(&req.dpd_data, eep + MT7615_EEPROM_TXDPD_OFFSET + 2478 freq_idx * MT7615_EEPROM_TXDPD_SIZE, 2479 sizeof(req.dpd_data)); 2480 req.runtime_calibration = 0; 2481 2482out: 2483 req.center_freq = cpu_to_le16(center_freq); 2484 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXDPD_CAL), 2485 &req, sizeof(req), true); 2486 2487 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 || 2488 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) { 2489 req.is_freq2 = true; 2490 center_freq = freq2; 2491 goto again; 2492 } 2493 2494 return ret; 2495} 2496 2497int mt7615_mcu_set_rx_hdr_trans_blacklist(struct mt7615_dev *dev) 2498{ 2499 struct { 2500 u8 operation; 2501 u8 count; 2502 u8 _rsv[2]; 2503 u8 index; 2504 u8 enable; 2505 __le16 etype; 2506 } req = { 2507 .operation = 1, 2508 .count = 1, 2509 .enable = 1, 2510 .etype = cpu_to_le16(ETH_P_PAE), 2511 }; 2512 2513 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS), 2514 &req, sizeof(req), false); 2515} 2516 2517int mt7615_mcu_set_bss_pm(struct mt7615_dev *dev, struct ieee80211_vif *vif, 2518 bool enable) 2519{ 2520 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 2521 struct { 2522 u8 bss_idx; 2523 u8 dtim_period; 2524 __le16 aid; 2525 __le16 bcn_interval; 2526 __le16 atim_window; 2527 u8 uapsd; 2528 u8 bmc_delivered_ac; 2529 u8 bmc_triggered_ac; 2530 u8 pad; 2531 } req = { 2532 .bss_idx = mvif->mt76.idx, 2533 .aid = cpu_to_le16(vif->bss_conf.aid), 2534 .dtim_period = vif->bss_conf.dtim_period, 2535 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int), 2536 }; 2537 struct { 2538 u8 bss_idx; 2539 u8 pad[3]; 2540 } req_hdr = { 2541 .bss_idx = mvif->mt76.idx, 2542 }; 2543 int err; 2544 2545 if (vif->type != NL80211_IFTYPE_STATION) 2546 return 0; 2547 2548 err = mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_ABORT), 2549 &req_hdr, sizeof(req_hdr), false); 2550 if (err < 0 || !enable) 2551 return err; 2552 2553 return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_CONNECTED), 2554 &req, sizeof(req), false); 2555} 2556 2557int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif, 2558 struct ieee80211_channel *chan, int duration) 2559{ 2560 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 2561 struct mt7615_dev *dev = phy->dev; 2562 struct mt7615_roc_tlv req = { 2563 .bss_idx = mvif->mt76.idx, 2564 .active = !chan, 2565 .max_interval = cpu_to_le32(duration), 2566 .primary_chan = chan ? chan->hw_value : 0, 2567 .band = chan ? chan->band : 0, 2568 .req_type = 2, 2569 }; 2570 2571 phy->roc_grant = false; 2572 2573 return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_ROC), 2574 &req, sizeof(req), false); 2575}