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