1 // SPDX-License-Identifier: ISC 2 /* Copyright (C) 2020 MediaTek Inc. */ 3 4 #include <linux/firmware.h> 5 #include "mt76_connac2_mac.h" 6 #include "mt76_connac_mcu.h" 7 8 int mt76_connac_mcu_start_firmware(struct mt76_dev *dev, u32 addr, u32 option) 9 { 10 struct { 11 __le32 option; 12 __le32 addr; 13 } req = { 14 .option = cpu_to_le32(option), 15 .addr = cpu_to_le32(addr), 16 }; 17 18 return mt76_mcu_send_msg(dev, MCU_CMD(FW_START_REQ), &req, 19 sizeof(req), true); 20 } 21 EXPORT_SYMBOL_GPL(mt76_connac_mcu_start_firmware); 22 23 int mt76_connac_mcu_patch_sem_ctrl(struct mt76_dev *dev, bool get) 24 { 25 u32 op = get ? PATCH_SEM_GET : PATCH_SEM_RELEASE; 26 struct { 27 __le32 op; 28 } req = { 29 .op = cpu_to_le32(op), 30 }; 31 32 return mt76_mcu_send_msg(dev, MCU_CMD(PATCH_SEM_CONTROL), 33 &req, sizeof(req), true); 34 } 35 EXPORT_SYMBOL_GPL(mt76_connac_mcu_patch_sem_ctrl); 36 37 int mt76_connac_mcu_start_patch(struct mt76_dev *dev) 38 { 39 struct { 40 u8 check_crc; 41 u8 reserved[3]; 42 } req = { 43 .check_crc = 0, 44 }; 45 46 return mt76_mcu_send_msg(dev, MCU_CMD(PATCH_FINISH_REQ), 47 &req, sizeof(req), true); 48 } 49 EXPORT_SYMBOL_GPL(mt76_connac_mcu_start_patch); 50 51 #define MCU_PATCH_ADDRESS 0x200000 52 53 int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len, 54 u32 mode) 55 { 56 struct { 57 __le32 addr; 58 __le32 len; 59 __le32 mode; 60 } req = { 61 .addr = cpu_to_le32(addr), 62 .len = cpu_to_le32(len), 63 .mode = cpu_to_le32(mode), 64 }; 65 int cmd; 66 67 if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) || 68 (is_mt7921(dev) && addr == 0x900000) || 69 (is_mt7925(dev) && (addr == 0x900000 || addr == 0xe0002800)) || 70 (is_mt799x(dev) && addr == 0x900000)) 71 cmd = MCU_CMD(PATCH_START_REQ); 72 else 73 cmd = MCU_CMD(TARGET_ADDRESS_LEN_REQ); 74 75 return mt76_mcu_send_msg(dev, cmd, &req, sizeof(req), true); 76 } 77 EXPORT_SYMBOL_GPL(mt76_connac_mcu_init_download); 78 79 int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy) 80 { 81 int len, i, n_max_channels, n_2ch = 0, n_5ch = 0, n_6ch = 0; 82 struct mt76_connac_mcu_channel_domain { 83 u8 alpha2[4]; /* regulatory_request.alpha2 */ 84 u8 bw_2g; /* BW_20_40M 0 85 * BW_20M 1 86 * BW_20_40_80M 2 87 * BW_20_40_80_160M 3 88 * BW_20_40_80_8080M 4 89 */ 90 u8 bw_5g; 91 u8 bw_6g; 92 u8 pad; 93 u8 n_2ch; 94 u8 n_5ch; 95 u8 n_6ch; 96 u8 pad2; 97 } __packed hdr = { 98 .bw_2g = 0, 99 .bw_5g = 3, /* BW_20_40_80_160M */ 100 .bw_6g = 3, 101 }; 102 struct mt76_connac_mcu_chan { 103 __le16 hw_value; 104 __le16 pad; 105 __le32 flags; 106 } __packed channel; 107 struct mt76_dev *dev = phy->dev; 108 struct ieee80211_channel *chan; 109 struct sk_buff *skb; 110 111 n_max_channels = phy->sband_2g.sband.n_channels + 112 phy->sband_5g.sband.n_channels + 113 phy->sband_6g.sband.n_channels; 114 len = sizeof(hdr) + n_max_channels * sizeof(channel); 115 116 skb = mt76_mcu_msg_alloc(dev, NULL, len); 117 if (!skb) 118 return -ENOMEM; 119 120 skb_reserve(skb, sizeof(hdr)); 121 122 for (i = 0; i < phy->sband_2g.sband.n_channels; i++) { 123 chan = &phy->sband_2g.sband.channels[i]; 124 if (chan->flags & IEEE80211_CHAN_DISABLED) 125 continue; 126 127 channel.hw_value = cpu_to_le16(chan->hw_value); 128 channel.flags = cpu_to_le32(chan->flags); 129 channel.pad = 0; 130 131 skb_put_data(skb, &channel, sizeof(channel)); 132 n_2ch++; 133 } 134 for (i = 0; i < phy->sband_5g.sband.n_channels; i++) { 135 chan = &phy->sband_5g.sband.channels[i]; 136 if (chan->flags & IEEE80211_CHAN_DISABLED) 137 continue; 138 139 channel.hw_value = cpu_to_le16(chan->hw_value); 140 channel.flags = cpu_to_le32(chan->flags); 141 channel.pad = 0; 142 143 skb_put_data(skb, &channel, sizeof(channel)); 144 n_5ch++; 145 } 146 for (i = 0; i < phy->sband_6g.sband.n_channels; i++) { 147 chan = &phy->sband_6g.sband.channels[i]; 148 if (chan->flags & IEEE80211_CHAN_DISABLED) 149 continue; 150 151 channel.hw_value = cpu_to_le16(chan->hw_value); 152 channel.flags = cpu_to_le32(chan->flags); 153 channel.pad = 0; 154 155 skb_put_data(skb, &channel, sizeof(channel)); 156 n_6ch++; 157 } 158 159 BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(hdr.alpha2)); 160 memcpy(hdr.alpha2, dev->alpha2, sizeof(dev->alpha2)); 161 hdr.n_2ch = n_2ch; 162 hdr.n_5ch = n_5ch; 163 hdr.n_6ch = n_6ch; 164 165 memcpy(__skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr)); 166 167 return mt76_mcu_skb_send_msg(dev, skb, MCU_CE_CMD(SET_CHAN_DOMAIN), 168 false); 169 } 170 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_channel_domain); 171 172 int mt76_connac_mcu_set_mac_enable(struct mt76_dev *dev, int band, bool enable, 173 bool hdr_trans) 174 { 175 struct { 176 u8 enable; 177 u8 band; 178 u8 rsv[2]; 179 } __packed req_mac = { 180 .enable = enable, 181 .band = band, 182 }; 183 184 return mt76_mcu_send_msg(dev, MCU_EXT_CMD(MAC_INIT_CTRL), &req_mac, 185 sizeof(req_mac), true); 186 } 187 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_mac_enable); 188 189 int mt76_connac_mcu_set_vif_ps(struct mt76_dev *dev, struct ieee80211_vif *vif) 190 { 191 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 192 struct { 193 u8 bss_idx; 194 u8 ps_state; /* 0: device awake 195 * 1: static power save 196 * 2: dynamic power saving 197 */ 198 } req = { 199 .bss_idx = mvif->idx, 200 .ps_state = vif->cfg.ps ? 2 : 0, 201 }; 202 203 if (vif->type != NL80211_IFTYPE_STATION) 204 return -EOPNOTSUPP; 205 206 return mt76_mcu_send_msg(dev, MCU_CE_CMD(SET_PS_PROFILE), 207 &req, sizeof(req), false); 208 } 209 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_vif_ps); 210 211 int mt76_connac_mcu_set_rts_thresh(struct mt76_dev *dev, u32 val, u8 band) 212 { 213 struct { 214 u8 prot_idx; 215 u8 band; 216 u8 rsv[2]; 217 __le32 len_thresh; 218 __le32 pkt_thresh; 219 } __packed req = { 220 .prot_idx = 1, 221 .band = band, 222 .len_thresh = cpu_to_le32(val), 223 .pkt_thresh = cpu_to_le32(0x2), 224 }; 225 226 return mt76_mcu_send_msg(dev, MCU_EXT_CMD(PROTECT_CTRL), &req, 227 sizeof(req), true); 228 } 229 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rts_thresh); 230 231 void mt76_connac_mcu_beacon_loss_iter(void *priv, u8 *mac, 232 struct ieee80211_vif *vif) 233 { 234 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 235 struct mt76_connac_beacon_loss_event *event = priv; 236 237 if (mvif->idx != event->bss_idx) 238 return; 239 240 if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER)) 241 return; 242 243 ieee80211_beacon_loss(vif); 244 } 245 EXPORT_SYMBOL_GPL(mt76_connac_mcu_beacon_loss_iter); 246 247 struct tlv * 248 mt76_connac_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len, 249 void *sta_ntlv, void *sta_wtbl) 250 { 251 struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv; 252 struct tlv *sta_hdr = sta_wtbl; 253 struct tlv *ptlv, tlv = { 254 .tag = cpu_to_le16(tag), 255 .len = cpu_to_le16(len), 256 }; 257 u16 ntlv; 258 259 ptlv = skb_put_zero(skb, len); 260 memcpy(ptlv, &tlv, sizeof(tlv)); 261 262 ntlv = le16_to_cpu(ntlv_hdr->tlv_num); 263 ntlv_hdr->tlv_num = cpu_to_le16(ntlv + 1); 264 265 if (sta_hdr) { 266 len += le16_to_cpu(sta_hdr->len); 267 sta_hdr->len = cpu_to_le16(len); 268 } 269 270 return ptlv; 271 } 272 EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_nested_tlv); 273 274 struct sk_buff * 275 __mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif_link *mvif, 276 struct mt76_wcid *wcid, int len) 277 { 278 struct sta_req_hdr hdr = { 279 .bss_idx = mvif->idx, 280 .muar_idx = wcid ? mvif->omac_idx : 0, 281 .is_tlv_append = 1, 282 }; 283 struct sk_buff *skb; 284 285 if (wcid && !wcid->sta && !wcid->sta_disabled) 286 hdr.muar_idx = 0xe; 287 288 mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo, 289 &hdr.wlan_idx_hi); 290 skb = __mt76_mcu_msg_alloc(dev, NULL, len, len, GFP_ATOMIC); 291 if (!skb) 292 return ERR_PTR(-ENOMEM); 293 294 skb_put_data(skb, &hdr, sizeof(hdr)); 295 296 return skb; 297 } 298 EXPORT_SYMBOL_GPL(__mt76_connac_mcu_alloc_sta_req); 299 300 struct wtbl_req_hdr * 301 mt76_connac_mcu_alloc_wtbl_req(struct mt76_dev *dev, struct mt76_wcid *wcid, 302 int cmd, void *sta_wtbl, struct sk_buff **skb) 303 { 304 struct tlv *sta_hdr = sta_wtbl; 305 struct wtbl_req_hdr hdr = { 306 .operation = cmd, 307 }; 308 struct sk_buff *nskb = *skb; 309 310 mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo, 311 &hdr.wlan_idx_hi); 312 if (!nskb) { 313 nskb = mt76_mcu_msg_alloc(dev, NULL, 314 MT76_CONNAC_WTBL_UPDATE_MAX_SIZE); 315 if (!nskb) 316 return ERR_PTR(-ENOMEM); 317 318 *skb = nskb; 319 } 320 321 if (sta_hdr) 322 le16_add_cpu(&sta_hdr->len, sizeof(hdr)); 323 324 return skb_put_data(nskb, &hdr, sizeof(hdr)); 325 } 326 EXPORT_SYMBOL_GPL(mt76_connac_mcu_alloc_wtbl_req); 327 328 void mt76_connac_mcu_bss_omac_tlv(struct sk_buff *skb, 329 struct ieee80211_vif *vif) 330 { 331 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 332 u8 omac_idx = mvif->omac_idx; 333 struct bss_info_omac *omac; 334 struct tlv *tlv; 335 u32 type = 0; 336 337 switch (vif->type) { 338 case NL80211_IFTYPE_MONITOR: 339 case NL80211_IFTYPE_MESH_POINT: 340 case NL80211_IFTYPE_AP: 341 if (vif->p2p) 342 type = CONNECTION_P2P_GO; 343 else 344 type = CONNECTION_INFRA_AP; 345 break; 346 case NL80211_IFTYPE_STATION: 347 if (vif->p2p) 348 type = CONNECTION_P2P_GC; 349 else 350 type = CONNECTION_INFRA_STA; 351 break; 352 case NL80211_IFTYPE_ADHOC: 353 type = CONNECTION_IBSS_ADHOC; 354 break; 355 default: 356 WARN_ON(1); 357 break; 358 } 359 360 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac)); 361 362 omac = (struct bss_info_omac *)tlv; 363 omac->conn_type = cpu_to_le32(type); 364 omac->omac_idx = mvif->omac_idx; 365 omac->band_idx = mvif->band_idx; 366 omac->hw_bss_idx = omac_idx > EXT_BSSID_START ? HW_BSSID_0 : omac_idx; 367 } 368 EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_omac_tlv); 369 370 void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb, 371 struct ieee80211_bss_conf *link_conf, 372 struct ieee80211_link_sta *link_sta, 373 int conn_state, bool newly) 374 { 375 struct ieee80211_vif *vif = link_conf->vif; 376 struct sta_rec_basic *basic; 377 struct tlv *tlv; 378 int conn_type; 379 380 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BASIC, sizeof(*basic)); 381 382 basic = (struct sta_rec_basic *)tlv; 383 basic->extra_info = cpu_to_le16(EXTRA_INFO_VER); 384 385 if (newly && conn_state != CONN_STATE_DISCONNECT) 386 basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW); 387 basic->conn_state = conn_state; 388 389 if (!link_sta) { 390 basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC); 391 392 if (vif->type == NL80211_IFTYPE_STATION && 393 !is_zero_ether_addr(link_conf->bssid)) { 394 memcpy(basic->peer_addr, link_conf->bssid, ETH_ALEN); 395 basic->aid = cpu_to_le16(vif->cfg.aid); 396 } else { 397 eth_broadcast_addr(basic->peer_addr); 398 } 399 return; 400 } 401 402 switch (vif->type) { 403 case NL80211_IFTYPE_MESH_POINT: 404 case NL80211_IFTYPE_AP: 405 if (vif->p2p && !is_mt7921(dev)) 406 conn_type = CONNECTION_P2P_GC; 407 else 408 conn_type = CONNECTION_INFRA_STA; 409 basic->conn_type = cpu_to_le32(conn_type); 410 basic->aid = cpu_to_le16(link_sta->sta->aid); 411 break; 412 case NL80211_IFTYPE_STATION: 413 if (vif->p2p && !is_mt7921(dev)) 414 conn_type = CONNECTION_P2P_GO; 415 else 416 conn_type = CONNECTION_INFRA_AP; 417 basic->conn_type = cpu_to_le32(conn_type); 418 basic->aid = cpu_to_le16(vif->cfg.aid); 419 break; 420 case NL80211_IFTYPE_ADHOC: 421 basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC); 422 basic->aid = cpu_to_le16(link_sta->sta->aid); 423 break; 424 default: 425 WARN_ON(1); 426 break; 427 } 428 429 memcpy(basic->peer_addr, link_sta->addr, ETH_ALEN); 430 basic->qos = link_sta->sta->wme; 431 } 432 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_basic_tlv); 433 434 void mt76_connac_mcu_sta_uapsd(struct sk_buff *skb, struct ieee80211_vif *vif, 435 struct ieee80211_sta *sta) 436 { 437 struct sta_rec_uapsd *uapsd; 438 struct tlv *tlv; 439 440 if (vif->type != NL80211_IFTYPE_AP || !sta->wme) 441 return; 442 443 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_APPS, sizeof(*uapsd)); 444 uapsd = (struct sta_rec_uapsd *)tlv; 445 446 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) { 447 uapsd->dac_map |= BIT(3); 448 uapsd->tac_map |= BIT(3); 449 } 450 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) { 451 uapsd->dac_map |= BIT(2); 452 uapsd->tac_map |= BIT(2); 453 } 454 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) { 455 uapsd->dac_map |= BIT(1); 456 uapsd->tac_map |= BIT(1); 457 } 458 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) { 459 uapsd->dac_map |= BIT(0); 460 uapsd->tac_map |= BIT(0); 461 } 462 uapsd->max_sp = sta->max_sp; 463 } 464 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_uapsd); 465 466 void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb, 467 struct ieee80211_vif *vif, 468 struct mt76_wcid *wcid, 469 void *sta_wtbl, void *wtbl_tlv) 470 { 471 struct wtbl_hdr_trans *htr; 472 struct tlv *tlv; 473 474 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HDR_TRANS, 475 sizeof(*htr), 476 wtbl_tlv, sta_wtbl); 477 htr = (struct wtbl_hdr_trans *)tlv; 478 htr->no_rx_trans = true; 479 480 if (vif->type == NL80211_IFTYPE_STATION) 481 htr->to_ds = true; 482 else 483 htr->from_ds = true; 484 485 if (!wcid) 486 return; 487 488 htr->no_rx_trans = !test_bit(MT_WCID_FLAG_HDR_TRANS, &wcid->flags); 489 if (test_bit(MT_WCID_FLAG_4ADDR, &wcid->flags)) { 490 htr->to_ds = true; 491 htr->from_ds = true; 492 } 493 } 494 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_hdr_trans_tlv); 495 496 int mt76_connac_mcu_sta_update_hdr_trans(struct mt76_dev *dev, 497 struct ieee80211_vif *vif, 498 struct mt76_wcid *wcid, int cmd) 499 { 500 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 501 struct wtbl_req_hdr *wtbl_hdr; 502 struct tlv *sta_wtbl; 503 struct sk_buff *skb; 504 505 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid); 506 if (IS_ERR(skb)) 507 return PTR_ERR(skb); 508 509 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, 510 sizeof(struct tlv)); 511 512 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET, 513 sta_wtbl, &skb); 514 if (IS_ERR(wtbl_hdr)) 515 return PTR_ERR(wtbl_hdr); 516 517 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, sta_wtbl, wtbl_hdr); 518 519 return mt76_mcu_skb_send_msg(dev, skb, cmd, true); 520 } 521 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_update_hdr_trans); 522 523 int mt76_connac_mcu_wtbl_update_hdr_trans(struct mt76_dev *dev, 524 struct ieee80211_vif *vif, 525 struct ieee80211_sta *sta) 526 { 527 struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv; 528 struct wtbl_req_hdr *wtbl_hdr; 529 struct sk_buff *skb = NULL; 530 531 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET, NULL, 532 &skb); 533 if (IS_ERR(wtbl_hdr)) 534 return PTR_ERR(wtbl_hdr); 535 536 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, NULL, wtbl_hdr); 537 538 return mt76_mcu_skb_send_msg(dev, skb, MCU_EXT_CMD(WTBL_UPDATE), true); 539 } 540 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_update_hdr_trans); 541 542 void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev, 543 struct sk_buff *skb, 544 struct ieee80211_vif *vif, 545 struct ieee80211_sta *sta, 546 void *sta_wtbl, void *wtbl_tlv) 547 { 548 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 549 struct wtbl_generic *generic; 550 struct wtbl_rx *rx; 551 struct wtbl_spe *spe; 552 struct tlv *tlv; 553 554 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_GENERIC, 555 sizeof(*generic), 556 wtbl_tlv, sta_wtbl); 557 558 generic = (struct wtbl_generic *)tlv; 559 560 if (sta) { 561 if (vif->type == NL80211_IFTYPE_STATION) 562 generic->partial_aid = cpu_to_le16(vif->cfg.aid); 563 else 564 generic->partial_aid = cpu_to_le16(sta->aid); 565 memcpy(generic->peer_addr, sta->addr, ETH_ALEN); 566 generic->muar_idx = mvif->omac_idx; 567 generic->qos = sta->wme; 568 } else { 569 if (!is_connac_v1(dev) && vif->type == NL80211_IFTYPE_STATION) 570 memcpy(generic->peer_addr, vif->bss_conf.bssid, 571 ETH_ALEN); 572 else 573 eth_broadcast_addr(generic->peer_addr); 574 575 generic->muar_idx = 0xe; 576 } 577 578 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_RX, sizeof(*rx), 579 wtbl_tlv, sta_wtbl); 580 581 rx = (struct wtbl_rx *)tlv; 582 rx->rca1 = sta ? vif->type != NL80211_IFTYPE_AP : 1; 583 rx->rca2 = 1; 584 rx->rv = 1; 585 586 if (!is_connac_v1(dev)) 587 return; 588 589 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SPE, sizeof(*spe), 590 wtbl_tlv, sta_wtbl); 591 spe = (struct wtbl_spe *)tlv; 592 spe->spe_idx = 24; 593 } 594 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_generic_tlv); 595 596 static void 597 mt76_connac_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_sta *sta, 598 struct ieee80211_vif *vif) 599 { 600 struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv; 601 struct sta_rec_amsdu *amsdu; 602 struct tlv *tlv; 603 604 if (vif->type != NL80211_IFTYPE_AP && 605 vif->type != NL80211_IFTYPE_STATION) 606 return; 607 608 if (!sta->deflink.agg.max_amsdu_len) 609 return; 610 611 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu)); 612 amsdu = (struct sta_rec_amsdu *)tlv; 613 amsdu->max_amsdu_num = 8; 614 amsdu->amsdu_en = true; 615 amsdu->max_mpdu_size = sta->deflink.agg.max_amsdu_len >= 616 IEEE80211_MAX_MPDU_LEN_VHT_7991; 617 618 wcid->amsdu = true; 619 } 620 621 #define HE_PHY(p, c) u8_get_bits(c, IEEE80211_HE_PHY_##p) 622 #define HE_MAC(m, c) u8_get_bits(c, IEEE80211_HE_MAC_##m) 623 static void 624 mt76_connac_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta) 625 { 626 struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap; 627 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; 628 struct sta_rec_he *he; 629 struct tlv *tlv; 630 u32 cap = 0; 631 632 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he)); 633 634 he = (struct sta_rec_he *)tlv; 635 636 if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE) 637 cap |= STA_REC_HE_CAP_HTC; 638 639 if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR) 640 cap |= STA_REC_HE_CAP_BSR; 641 642 if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL) 643 cap |= STA_REC_HE_CAP_OM; 644 645 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU) 646 cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU; 647 648 if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR) 649 cap |= STA_REC_HE_CAP_BQR; 650 651 if (elem->phy_cap_info[0] & 652 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G | 653 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G)) 654 cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT; 655 656 if (elem->phy_cap_info[1] & 657 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD) 658 cap |= STA_REC_HE_CAP_LDPC; 659 660 if (elem->phy_cap_info[1] & 661 IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US) 662 cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI; 663 664 if (elem->phy_cap_info[2] & 665 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US) 666 cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI; 667 668 if (elem->phy_cap_info[2] & 669 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ) 670 cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC; 671 672 if (elem->phy_cap_info[2] & 673 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ) 674 cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC; 675 676 if (elem->phy_cap_info[6] & 677 IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE) 678 cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE; 679 680 if (elem->phy_cap_info[7] & 681 IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI) 682 cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI; 683 684 if (elem->phy_cap_info[7] & 685 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ) 686 cap |= STA_REC_HE_CAP_GT_80M_TX_STBC; 687 688 if (elem->phy_cap_info[7] & 689 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ) 690 cap |= STA_REC_HE_CAP_GT_80M_RX_STBC; 691 692 if (elem->phy_cap_info[8] & 693 IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI) 694 cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI; 695 696 if (elem->phy_cap_info[8] & 697 IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI) 698 cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI; 699 700 if (elem->phy_cap_info[9] & 701 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK) 702 cap |= STA_REC_HE_CAP_TRIG_CQI_FK; 703 704 if (elem->phy_cap_info[9] & 705 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU) 706 cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242; 707 708 if (elem->phy_cap_info[9] & 709 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU) 710 cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242; 711 712 he->he_cap = cpu_to_le32(cap); 713 714 switch (sta->deflink.bandwidth) { 715 case IEEE80211_STA_RX_BW_160: 716 if (elem->phy_cap_info[0] & 717 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) 718 he->max_nss_mcs[CMD_HE_MCS_BW8080] = 719 he_cap->he_mcs_nss_supp.rx_mcs_80p80; 720 721 he->max_nss_mcs[CMD_HE_MCS_BW160] = 722 he_cap->he_mcs_nss_supp.rx_mcs_160; 723 fallthrough; 724 default: 725 he->max_nss_mcs[CMD_HE_MCS_BW80] = 726 he_cap->he_mcs_nss_supp.rx_mcs_80; 727 break; 728 } 729 730 he->t_frame_dur = 731 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]); 732 he->max_ampdu_exp = 733 HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]); 734 735 he->bw_set = 736 HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]); 737 he->device_class = 738 HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]); 739 he->punc_pream_rx = 740 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]); 741 742 he->dcm_tx_mode = 743 HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]); 744 he->dcm_tx_max_nss = 745 HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]); 746 he->dcm_rx_mode = 747 HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]); 748 he->dcm_rx_max_nss = 749 HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]); 750 he->dcm_rx_max_nss = 751 HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]); 752 753 he->pkt_ext = 2; 754 } 755 756 void 757 mt76_connac_mcu_sta_he_tlv_v2(struct sk_buff *skb, struct ieee80211_sta *sta) 758 { 759 struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap; 760 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; 761 struct sta_rec_he_v2 *he; 762 struct tlv *tlv; 763 764 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_V2, sizeof(*he)); 765 766 he = (struct sta_rec_he_v2 *)tlv; 767 memcpy(he->he_phy_cap, elem->phy_cap_info, sizeof(he->he_phy_cap)); 768 memcpy(he->he_mac_cap, elem->mac_cap_info, sizeof(he->he_mac_cap)); 769 770 switch (sta->deflink.bandwidth) { 771 case IEEE80211_STA_RX_BW_160: 772 if (elem->phy_cap_info[0] & 773 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) 774 he->max_nss_mcs[CMD_HE_MCS_BW8080] = 775 he_cap->he_mcs_nss_supp.rx_mcs_80p80; 776 777 he->max_nss_mcs[CMD_HE_MCS_BW160] = 778 he_cap->he_mcs_nss_supp.rx_mcs_160; 779 fallthrough; 780 default: 781 he->max_nss_mcs[CMD_HE_MCS_BW80] = 782 he_cap->he_mcs_nss_supp.rx_mcs_80; 783 break; 784 } 785 786 he->pkt_ext = IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US; 787 } 788 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_he_tlv_v2); 789 790 u8 791 mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif, 792 enum nl80211_band band, 793 struct ieee80211_link_sta *link_sta) 794 { 795 struct ieee80211_sta_ht_cap *ht_cap; 796 struct ieee80211_sta_vht_cap *vht_cap; 797 const struct ieee80211_sta_he_cap *he_cap; 798 const struct ieee80211_sta_eht_cap *eht_cap; 799 u8 mode = 0; 800 801 if (link_sta) { 802 ht_cap = &link_sta->ht_cap; 803 vht_cap = &link_sta->vht_cap; 804 he_cap = &link_sta->he_cap; 805 eht_cap = &link_sta->eht_cap; 806 } else { 807 struct ieee80211_supported_band *sband; 808 809 sband = mphy->hw->wiphy->bands[band]; 810 ht_cap = &sband->ht_cap; 811 vht_cap = &sband->vht_cap; 812 he_cap = ieee80211_get_he_iftype_cap(sband, vif->type); 813 eht_cap = ieee80211_get_eht_iftype_cap(sband, vif->type); 814 } 815 816 if (band == NL80211_BAND_2GHZ) { 817 mode |= PHY_TYPE_BIT_HR_DSSS | PHY_TYPE_BIT_ERP; 818 819 if (ht_cap->ht_supported) 820 mode |= PHY_TYPE_BIT_HT; 821 822 if (he_cap && he_cap->has_he) 823 mode |= PHY_TYPE_BIT_HE; 824 825 if (eht_cap && eht_cap->has_eht) 826 mode |= PHY_TYPE_BIT_BE; 827 } else if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) { 828 mode |= PHY_TYPE_BIT_OFDM; 829 830 if (ht_cap->ht_supported) 831 mode |= PHY_TYPE_BIT_HT; 832 833 if (vht_cap->vht_supported) 834 mode |= PHY_TYPE_BIT_VHT; 835 836 if (he_cap && he_cap->has_he) 837 mode |= PHY_TYPE_BIT_HE; 838 839 if (eht_cap && eht_cap->has_eht) 840 mode |= PHY_TYPE_BIT_BE; 841 } 842 843 return mode; 844 } 845 EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode_v2); 846 847 void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb, 848 struct ieee80211_sta *sta, 849 struct ieee80211_vif *vif, 850 u8 rcpi, u8 sta_state) 851 { 852 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 853 struct cfg80211_chan_def *chandef = mvif->ctx ? 854 &mvif->ctx->def : &mphy->chandef; 855 enum nl80211_band band = chandef->chan->band; 856 struct mt76_dev *dev = mphy->dev; 857 struct sta_rec_ra_info *ra_info; 858 struct sta_rec_state *state; 859 struct sta_rec_phy *phy; 860 struct tlv *tlv; 861 u16 supp_rates; 862 863 /* starec ht */ 864 if (sta->deflink.ht_cap.ht_supported) { 865 struct sta_rec_ht *ht; 866 867 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht)); 868 ht = (struct sta_rec_ht *)tlv; 869 ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap); 870 } 871 872 /* starec vht */ 873 if (sta->deflink.vht_cap.vht_supported) { 874 struct sta_rec_vht *vht; 875 int len; 876 877 len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4; 878 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len); 879 vht = (struct sta_rec_vht *)tlv; 880 vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap); 881 vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map; 882 vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map; 883 } 884 885 /* starec uapsd */ 886 mt76_connac_mcu_sta_uapsd(skb, vif, sta); 887 888 if (!is_mt7921(dev)) 889 return; 890 891 if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he) 892 mt76_connac_mcu_sta_amsdu_tlv(skb, sta, vif); 893 894 /* starec he */ 895 if (sta->deflink.he_cap.has_he) { 896 mt76_connac_mcu_sta_he_tlv(skb, sta); 897 mt76_connac_mcu_sta_he_tlv_v2(skb, sta); 898 if (band == NL80211_BAND_6GHZ && 899 sta_state == MT76_STA_INFO_STATE_ASSOC) { 900 struct sta_rec_he_6g_capa *he_6g_capa; 901 902 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_6G, 903 sizeof(*he_6g_capa)); 904 he_6g_capa = (struct sta_rec_he_6g_capa *)tlv; 905 he_6g_capa->capa = sta->deflink.he_6ghz_capa.capa; 906 } 907 } 908 909 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy)); 910 phy = (struct sta_rec_phy *)tlv; 911 phy->phy_type = mt76_connac_get_phy_mode_v2(mphy, vif, band, 912 &sta->deflink); 913 phy->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates); 914 phy->rcpi = rcpi; 915 phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR, 916 sta->deflink.ht_cap.ampdu_factor) | 917 FIELD_PREP(IEEE80211_HT_AMPDU_PARM_DENSITY, 918 sta->deflink.ht_cap.ampdu_density); 919 920 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info)); 921 ra_info = (struct sta_rec_ra_info *)tlv; 922 923 supp_rates = sta->deflink.supp_rates[band]; 924 if (band == NL80211_BAND_2GHZ) 925 supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates >> 4) | 926 FIELD_PREP(RA_LEGACY_CCK, supp_rates & 0xf); 927 else 928 supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates); 929 930 ra_info->legacy = cpu_to_le16(supp_rates); 931 932 if (sta->deflink.ht_cap.ht_supported) 933 memcpy(ra_info->rx_mcs_bitmask, 934 sta->deflink.ht_cap.mcs.rx_mask, 935 HT_MCS_MASK_NUM); 936 937 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state)); 938 state = (struct sta_rec_state *)tlv; 939 state->state = sta_state; 940 941 if (sta->deflink.vht_cap.vht_supported) { 942 state->vht_opmode = sta->deflink.bandwidth; 943 state->vht_opmode |= (sta->deflink.rx_nss - 1) << 944 IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT; 945 } 946 } 947 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_tlv); 948 949 void mt76_connac_mcu_wtbl_smps_tlv(struct sk_buff *skb, 950 struct ieee80211_sta *sta, 951 void *sta_wtbl, void *wtbl_tlv) 952 { 953 struct wtbl_smps *smps; 954 struct tlv *tlv; 955 956 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps), 957 wtbl_tlv, sta_wtbl); 958 smps = (struct wtbl_smps *)tlv; 959 smps->smps = (sta->deflink.smps_mode == IEEE80211_SMPS_DYNAMIC); 960 } 961 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_smps_tlv); 962 963 void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb, 964 struct ieee80211_sta *sta, void *sta_wtbl, 965 void *wtbl_tlv, bool ht_ldpc, bool vht_ldpc) 966 { 967 struct wtbl_ht *ht = NULL; 968 struct tlv *tlv; 969 u32 flags = 0; 970 971 if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_6ghz_capa.capa) { 972 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht), 973 wtbl_tlv, sta_wtbl); 974 ht = (struct wtbl_ht *)tlv; 975 ht->ldpc = ht_ldpc && 976 !!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING); 977 978 if (sta->deflink.ht_cap.ht_supported) { 979 ht->af = sta->deflink.ht_cap.ampdu_factor; 980 ht->mm = sta->deflink.ht_cap.ampdu_density; 981 } else { 982 ht->af = le16_get_bits(sta->deflink.he_6ghz_capa.capa, 983 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 984 ht->mm = le16_get_bits(sta->deflink.he_6ghz_capa.capa, 985 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START); 986 } 987 988 ht->ht = true; 989 } 990 991 if (sta->deflink.vht_cap.vht_supported || sta->deflink.he_6ghz_capa.capa) { 992 struct wtbl_vht *vht; 993 u8 af; 994 995 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_VHT, 996 sizeof(*vht), wtbl_tlv, 997 sta_wtbl); 998 vht = (struct wtbl_vht *)tlv; 999 vht->ldpc = vht_ldpc && 1000 !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC); 1001 vht->vht = true; 1002 1003 af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK, 1004 sta->deflink.vht_cap.cap); 1005 if (ht) 1006 ht->af = max(ht->af, af); 1007 } 1008 1009 mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_tlv); 1010 1011 if (is_connac_v1(dev) && sta->deflink.ht_cap.ht_supported) { 1012 /* sgi */ 1013 u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 | 1014 MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160; 1015 struct wtbl_raw *raw; 1016 1017 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_RAW_DATA, 1018 sizeof(*raw), wtbl_tlv, 1019 sta_wtbl); 1020 1021 if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) 1022 flags |= MT_WTBL_W5_SHORT_GI_20; 1023 if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) 1024 flags |= MT_WTBL_W5_SHORT_GI_40; 1025 1026 if (sta->deflink.vht_cap.vht_supported) { 1027 if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80) 1028 flags |= MT_WTBL_W5_SHORT_GI_80; 1029 if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160) 1030 flags |= MT_WTBL_W5_SHORT_GI_160; 1031 } 1032 raw = (struct wtbl_raw *)tlv; 1033 raw->val = cpu_to_le32(flags); 1034 raw->msk = cpu_to_le32(~msk); 1035 raw->wtbl_idx = 1; 1036 raw->dw = 5; 1037 } 1038 } 1039 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ht_tlv); 1040 1041 int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy, 1042 struct mt76_sta_cmd_info *info) 1043 { 1044 struct mt76_vif_link *mvif = (struct mt76_vif_link *)info->vif->drv_priv; 1045 struct ieee80211_link_sta *link_sta; 1046 struct mt76_dev *dev = phy->dev; 1047 struct wtbl_req_hdr *wtbl_hdr; 1048 struct tlv *sta_wtbl; 1049 struct sk_buff *skb; 1050 int conn_state; 1051 1052 if (!info->link_conf) 1053 info->link_conf = &info->vif->bss_conf; 1054 1055 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, info->wcid); 1056 if (IS_ERR(skb)) 1057 return PTR_ERR(skb); 1058 1059 conn_state = info->enable ? CONN_STATE_PORT_SECURE : 1060 CONN_STATE_DISCONNECT; 1061 link_sta = info->sta ? &info->sta->deflink : NULL; 1062 if (info->sta || !info->offload_fw) 1063 mt76_connac_mcu_sta_basic_tlv(dev, skb, info->link_conf, 1064 link_sta, conn_state, 1065 info->newly); 1066 if (info->sta && info->enable) 1067 mt76_connac_mcu_sta_tlv(phy, skb, info->sta, 1068 info->vif, info->rcpi, 1069 info->state); 1070 1071 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, 1072 sizeof(struct tlv)); 1073 1074 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, info->wcid, 1075 WTBL_RESET_AND_SET, 1076 sta_wtbl, &skb); 1077 if (IS_ERR(wtbl_hdr)) 1078 return PTR_ERR(wtbl_hdr); 1079 1080 if (info->enable) { 1081 mt76_connac_mcu_wtbl_generic_tlv(dev, skb, info->vif, 1082 info->sta, sta_wtbl, 1083 wtbl_hdr); 1084 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, info->vif, info->wcid, 1085 sta_wtbl, wtbl_hdr); 1086 if (info->sta) 1087 mt76_connac_mcu_wtbl_ht_tlv(dev, skb, info->sta, 1088 sta_wtbl, wtbl_hdr, 1089 true, true); 1090 } 1091 1092 return mt76_mcu_skb_send_msg(dev, skb, info->cmd, true); 1093 } 1094 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_cmd); 1095 1096 void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb, 1097 struct ieee80211_ampdu_params *params, 1098 bool enable, bool tx, void *sta_wtbl, 1099 void *wtbl_tlv) 1100 { 1101 struct wtbl_ba *ba; 1102 struct tlv *tlv; 1103 1104 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_BA, sizeof(*ba), 1105 wtbl_tlv, sta_wtbl); 1106 1107 ba = (struct wtbl_ba *)tlv; 1108 ba->tid = params->tid; 1109 1110 if (tx) { 1111 ba->ba_type = MT_BA_TYPE_ORIGINATOR; 1112 ba->sn = enable ? cpu_to_le16(params->ssn) : 0; 1113 ba->ba_winsize = enable ? cpu_to_le16(params->buf_size) : 0; 1114 ba->ba_en = enable; 1115 } else { 1116 memcpy(ba->peer_addr, params->sta->addr, ETH_ALEN); 1117 ba->ba_type = MT_BA_TYPE_RECIPIENT; 1118 ba->rst_ba_tid = params->tid; 1119 ba->rst_ba_sel = RST_BA_MAC_TID_MATCH; 1120 ba->rst_ba_sb = 1; 1121 } 1122 1123 if (!is_connac_v1(dev)) { 1124 ba->ba_winsize = enable ? cpu_to_le16(params->buf_size) : 0; 1125 return; 1126 } 1127 1128 if (enable && tx) { 1129 static const u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 }; 1130 int i; 1131 1132 for (i = 7; i > 0; i--) { 1133 if (params->buf_size >= ba_range[i]) 1134 break; 1135 } 1136 ba->ba_winsize_idx = i; 1137 } 1138 } 1139 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ba_tlv); 1140 1141 int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy, 1142 struct ieee80211_bss_conf *bss_conf, 1143 struct mt76_vif_link *mvif, 1144 struct mt76_wcid *wcid, 1145 bool enable) 1146 { 1147 struct mt76_dev *dev = phy->dev; 1148 struct { 1149 struct { 1150 u8 omac_idx; 1151 u8 band_idx; 1152 __le16 pad; 1153 } __packed hdr; 1154 struct req_tlv { 1155 __le16 tag; 1156 __le16 len; 1157 u8 active; 1158 u8 link_idx; /* not link_id */ 1159 u8 omac_addr[ETH_ALEN]; 1160 } __packed tlv; 1161 } dev_req = { 1162 .hdr = { 1163 .omac_idx = mvif->omac_idx, 1164 .band_idx = mvif->band_idx, 1165 }, 1166 .tlv = { 1167 .tag = cpu_to_le16(DEV_INFO_ACTIVE), 1168 .len = cpu_to_le16(sizeof(struct req_tlv)), 1169 .active = enable, 1170 .link_idx = mvif->link_idx, 1171 }, 1172 }; 1173 struct { 1174 struct { 1175 u8 bss_idx; 1176 u8 pad[3]; 1177 } __packed hdr; 1178 struct mt76_connac_bss_basic_tlv basic; 1179 } basic_req = { 1180 .hdr = { 1181 .bss_idx = mvif->idx, 1182 }, 1183 .basic = { 1184 .tag = cpu_to_le16(UNI_BSS_INFO_BASIC), 1185 .len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)), 1186 .omac_idx = mvif->omac_idx, 1187 .band_idx = mvif->band_idx, 1188 .wmm_idx = mvif->wmm_idx, 1189 .active = enable, 1190 .bmc_tx_wlan_idx = cpu_to_le16(wcid->idx), 1191 .sta_idx = cpu_to_le16(wcid->idx), 1192 .conn_state = 1, 1193 .link_idx = mvif->link_idx, 1194 }, 1195 }; 1196 int err, idx, cmd, len; 1197 void *data; 1198 1199 switch (bss_conf->vif->type) { 1200 case NL80211_IFTYPE_MESH_POINT: 1201 case NL80211_IFTYPE_MONITOR: 1202 case NL80211_IFTYPE_AP: 1203 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_AP); 1204 break; 1205 case NL80211_IFTYPE_STATION: 1206 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_STA); 1207 break; 1208 case NL80211_IFTYPE_P2P_DEVICE: 1209 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_P2P_GO); 1210 break; 1211 case NL80211_IFTYPE_ADHOC: 1212 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC); 1213 break; 1214 default: 1215 WARN_ON(1); 1216 break; 1217 } 1218 1219 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx; 1220 basic_req.basic.hw_bss_idx = idx; 1221 1222 memcpy(dev_req.tlv.omac_addr, bss_conf->addr, ETH_ALEN); 1223 1224 cmd = enable ? MCU_UNI_CMD(DEV_INFO_UPDATE) : MCU_UNI_CMD(BSS_INFO_UPDATE); 1225 data = enable ? (void *)&dev_req : (void *)&basic_req; 1226 len = enable ? sizeof(dev_req) : sizeof(basic_req); 1227 1228 err = mt76_mcu_send_msg(dev, cmd, data, len, true); 1229 if (err < 0) 1230 return err; 1231 1232 cmd = enable ? MCU_UNI_CMD(BSS_INFO_UPDATE) : MCU_UNI_CMD(DEV_INFO_UPDATE); 1233 data = enable ? (void *)&basic_req : (void *)&dev_req; 1234 len = enable ? sizeof(basic_req) : sizeof(dev_req); 1235 1236 return mt76_mcu_send_msg(dev, cmd, data, len, true); 1237 } 1238 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_dev); 1239 1240 void mt76_connac_mcu_sta_ba_tlv(struct sk_buff *skb, 1241 struct ieee80211_ampdu_params *params, 1242 bool enable, bool tx) 1243 { 1244 struct sta_rec_ba *ba; 1245 struct tlv *tlv; 1246 1247 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba)); 1248 1249 ba = (struct sta_rec_ba *)tlv; 1250 ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT; 1251 ba->winsize = cpu_to_le16(params->buf_size); 1252 ba->ssn = cpu_to_le16(params->ssn); 1253 ba->ba_en = enable << params->tid; 1254 ba->amsdu = params->amsdu; 1255 ba->tid = params->tid; 1256 } 1257 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba_tlv); 1258 1259 int mt76_connac_mcu_sta_wed_update(struct mt76_dev *dev, struct sk_buff *skb) 1260 { 1261 if (!mt76_is_mmio(dev)) 1262 return 0; 1263 1264 if (!mtk_wed_device_active(&dev->mmio.wed)) 1265 return 0; 1266 1267 return mtk_wed_device_update_msg(&dev->mmio.wed, WED_WO_STA_REC, 1268 skb->data, skb->len); 1269 } 1270 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_wed_update); 1271 1272 int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif_link *mvif, 1273 struct ieee80211_ampdu_params *params, 1274 int cmd, bool enable, bool tx) 1275 { 1276 struct mt76_wcid *wcid = (struct mt76_wcid *)params->sta->drv_priv; 1277 struct wtbl_req_hdr *wtbl_hdr; 1278 struct tlv *sta_wtbl; 1279 struct sk_buff *skb; 1280 int ret; 1281 1282 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid); 1283 if (IS_ERR(skb)) 1284 return PTR_ERR(skb); 1285 1286 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, 1287 sizeof(struct tlv)); 1288 1289 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid, WTBL_SET, 1290 sta_wtbl, &skb); 1291 if (IS_ERR(wtbl_hdr)) 1292 return PTR_ERR(wtbl_hdr); 1293 1294 mt76_connac_mcu_wtbl_ba_tlv(dev, skb, params, enable, tx, sta_wtbl, 1295 wtbl_hdr); 1296 1297 ret = mt76_connac_mcu_sta_wed_update(dev, skb); 1298 if (ret) 1299 return ret; 1300 1301 ret = mt76_mcu_skb_send_msg(dev, skb, cmd, true); 1302 if (ret) 1303 return ret; 1304 1305 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid); 1306 if (IS_ERR(skb)) 1307 return PTR_ERR(skb); 1308 1309 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx); 1310 1311 ret = mt76_connac_mcu_sta_wed_update(dev, skb); 1312 if (ret) 1313 return ret; 1314 1315 return mt76_mcu_skb_send_msg(dev, skb, cmd, true); 1316 } 1317 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba); 1318 1319 u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif, 1320 enum nl80211_band band, 1321 struct ieee80211_link_sta *link_sta) 1322 { 1323 struct mt76_dev *dev = phy->dev; 1324 const struct ieee80211_sta_he_cap *he_cap; 1325 struct ieee80211_sta_vht_cap *vht_cap; 1326 struct ieee80211_sta_ht_cap *ht_cap; 1327 u8 mode = 0; 1328 1329 if (is_connac_v1(dev)) 1330 return 0x38; 1331 1332 if (link_sta) { 1333 ht_cap = &link_sta->ht_cap; 1334 vht_cap = &link_sta->vht_cap; 1335 he_cap = &link_sta->he_cap; 1336 } else { 1337 struct ieee80211_supported_band *sband; 1338 1339 sband = phy->hw->wiphy->bands[band]; 1340 ht_cap = &sband->ht_cap; 1341 vht_cap = &sband->vht_cap; 1342 he_cap = ieee80211_get_he_iftype_cap(sband, vif->type); 1343 } 1344 1345 if (band == NL80211_BAND_2GHZ) { 1346 mode |= PHY_MODE_B | PHY_MODE_G; 1347 1348 if (ht_cap->ht_supported) 1349 mode |= PHY_MODE_GN; 1350 1351 if (he_cap && he_cap->has_he) 1352 mode |= PHY_MODE_AX_24G; 1353 } else if (band == NL80211_BAND_5GHZ) { 1354 mode |= PHY_MODE_A; 1355 1356 if (ht_cap->ht_supported) 1357 mode |= PHY_MODE_AN; 1358 1359 if (vht_cap->vht_supported) 1360 mode |= PHY_MODE_AC; 1361 1362 if (he_cap && he_cap->has_he) 1363 mode |= PHY_MODE_AX_5G; 1364 } else if (band == NL80211_BAND_6GHZ) { 1365 mode |= PHY_MODE_A | PHY_MODE_AN | 1366 PHY_MODE_AC | PHY_MODE_AX_5G; 1367 } 1368 1369 return mode; 1370 } 1371 EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode); 1372 1373 u8 mt76_connac_get_phy_mode_ext(struct mt76_phy *phy, struct ieee80211_bss_conf *conf, 1374 enum nl80211_band band) 1375 { 1376 const struct ieee80211_sta_eht_cap *eht_cap; 1377 struct ieee80211_supported_band *sband; 1378 u8 mode = 0; 1379 1380 if (band == NL80211_BAND_6GHZ) 1381 mode |= PHY_MODE_AX_6G; 1382 1383 sband = phy->hw->wiphy->bands[band]; 1384 eht_cap = ieee80211_get_eht_iftype_cap(sband, conf->vif->type); 1385 1386 if (!eht_cap || !eht_cap->has_eht || !conf->eht_support) 1387 return mode; 1388 1389 switch (band) { 1390 case NL80211_BAND_6GHZ: 1391 mode |= PHY_MODE_BE_6G; 1392 break; 1393 case NL80211_BAND_5GHZ: 1394 mode |= PHY_MODE_BE_5G; 1395 break; 1396 case NL80211_BAND_2GHZ: 1397 mode |= PHY_MODE_BE_24G; 1398 break; 1399 default: 1400 break; 1401 } 1402 1403 return mode; 1404 } 1405 EXPORT_SYMBOL_GPL(mt76_connac_get_phy_mode_ext); 1406 1407 const struct ieee80211_sta_he_cap * 1408 mt76_connac_get_he_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif) 1409 { 1410 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 1411 struct cfg80211_chan_def *chandef = mvif->ctx ? 1412 &mvif->ctx->def : &phy->chandef; 1413 enum nl80211_band band = chandef->chan->band; 1414 struct ieee80211_supported_band *sband; 1415 1416 sband = phy->hw->wiphy->bands[band]; 1417 1418 return ieee80211_get_he_iftype_cap(sband, vif->type); 1419 } 1420 EXPORT_SYMBOL_GPL(mt76_connac_get_he_phy_cap); 1421 1422 const struct ieee80211_sta_eht_cap * 1423 mt76_connac_get_eht_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif) 1424 { 1425 enum nl80211_band band = phy->chandef.chan->band; 1426 struct ieee80211_supported_band *sband; 1427 1428 sband = phy->hw->wiphy->bands[band]; 1429 1430 return ieee80211_get_eht_iftype_cap(sband, vif->type); 1431 } 1432 EXPORT_SYMBOL_GPL(mt76_connac_get_eht_phy_cap); 1433 1434 #define DEFAULT_HE_PE_DURATION 4 1435 #define DEFAULT_HE_DURATION_RTS_THRES 1023 1436 static void 1437 mt76_connac_mcu_uni_bss_he_tlv(struct mt76_phy *phy, struct ieee80211_vif *vif, 1438 struct tlv *tlv) 1439 { 1440 const struct ieee80211_sta_he_cap *cap; 1441 struct bss_info_uni_he *he; 1442 1443 cap = mt76_connac_get_he_phy_cap(phy, vif); 1444 1445 he = (struct bss_info_uni_he *)tlv; 1446 he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext; 1447 if (!he->he_pe_duration) 1448 he->he_pe_duration = DEFAULT_HE_PE_DURATION; 1449 1450 he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th); 1451 if (!he->he_rts_thres) 1452 he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES); 1453 1454 he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80; 1455 he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160; 1456 he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80; 1457 } 1458 1459 int mt76_connac_mcu_uni_set_chctx(struct mt76_phy *phy, struct mt76_vif_link *mvif, 1460 struct ieee80211_chanctx_conf *ctx) 1461 { 1462 struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef; 1463 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2; 1464 enum nl80211_band band = chandef->chan->band; 1465 struct mt76_dev *mdev = phy->dev; 1466 struct { 1467 struct { 1468 u8 bss_idx; 1469 u8 pad[3]; 1470 } __packed hdr; 1471 struct rlm_tlv { 1472 __le16 tag; 1473 __le16 len; 1474 u8 control_channel; 1475 u8 center_chan; 1476 u8 center_chan2; 1477 u8 bw; 1478 u8 tx_streams; 1479 u8 rx_streams; 1480 u8 short_st; 1481 u8 ht_op_info; 1482 u8 sco; 1483 u8 band; 1484 u8 pad[2]; 1485 } __packed rlm; 1486 } __packed rlm_req = { 1487 .hdr = { 1488 .bss_idx = mvif->idx, 1489 }, 1490 .rlm = { 1491 .tag = cpu_to_le16(UNI_BSS_INFO_RLM), 1492 .len = cpu_to_le16(sizeof(struct rlm_tlv)), 1493 .control_channel = chandef->chan->hw_value, 1494 .center_chan = ieee80211_frequency_to_channel(freq1), 1495 .center_chan2 = ieee80211_frequency_to_channel(freq2), 1496 .tx_streams = hweight8(phy->antenna_mask), 1497 .ht_op_info = 4, /* set HT 40M allowed */ 1498 .rx_streams = phy->chainmask, 1499 .short_st = true, 1500 .band = band, 1501 }, 1502 }; 1503 1504 switch (chandef->width) { 1505 case NL80211_CHAN_WIDTH_40: 1506 rlm_req.rlm.bw = CMD_CBW_40MHZ; 1507 break; 1508 case NL80211_CHAN_WIDTH_80: 1509 rlm_req.rlm.bw = CMD_CBW_80MHZ; 1510 break; 1511 case NL80211_CHAN_WIDTH_80P80: 1512 rlm_req.rlm.bw = CMD_CBW_8080MHZ; 1513 break; 1514 case NL80211_CHAN_WIDTH_160: 1515 rlm_req.rlm.bw = CMD_CBW_160MHZ; 1516 break; 1517 case NL80211_CHAN_WIDTH_5: 1518 rlm_req.rlm.bw = CMD_CBW_5MHZ; 1519 break; 1520 case NL80211_CHAN_WIDTH_10: 1521 rlm_req.rlm.bw = CMD_CBW_10MHZ; 1522 break; 1523 case NL80211_CHAN_WIDTH_20_NOHT: 1524 case NL80211_CHAN_WIDTH_20: 1525 default: 1526 rlm_req.rlm.bw = CMD_CBW_20MHZ; 1527 rlm_req.rlm.ht_op_info = 0; 1528 break; 1529 } 1530 1531 if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan) 1532 rlm_req.rlm.sco = 1; /* SCA */ 1533 else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan) 1534 rlm_req.rlm.sco = 3; /* SCB */ 1535 1536 return mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &rlm_req, 1537 sizeof(rlm_req), true); 1538 } 1539 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_set_chctx); 1540 1541 int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy, 1542 struct ieee80211_vif *vif, 1543 struct mt76_wcid *wcid, 1544 bool enable, 1545 struct ieee80211_chanctx_conf *ctx) 1546 { 1547 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 1548 struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef; 1549 enum nl80211_band band = chandef->chan->band; 1550 struct mt76_dev *mdev = phy->dev; 1551 struct { 1552 struct { 1553 u8 bss_idx; 1554 u8 pad[3]; 1555 } __packed hdr; 1556 struct mt76_connac_bss_basic_tlv basic; 1557 struct mt76_connac_bss_qos_tlv qos; 1558 } basic_req = { 1559 .hdr = { 1560 .bss_idx = mvif->idx, 1561 }, 1562 .basic = { 1563 .tag = cpu_to_le16(UNI_BSS_INFO_BASIC), 1564 .len = cpu_to_le16(sizeof(struct mt76_connac_bss_basic_tlv)), 1565 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int), 1566 .dtim_period = vif->bss_conf.dtim_period, 1567 .omac_idx = mvif->omac_idx, 1568 .band_idx = mvif->band_idx, 1569 .wmm_idx = mvif->wmm_idx, 1570 .active = true, /* keep bss deactivated */ 1571 .phymode = mt76_connac_get_phy_mode(phy, vif, band, NULL), 1572 }, 1573 .qos = { 1574 .tag = cpu_to_le16(UNI_BSS_INFO_QBSS), 1575 .len = cpu_to_le16(sizeof(struct mt76_connac_bss_qos_tlv)), 1576 .qos = vif->bss_conf.qos, 1577 }, 1578 }; 1579 int err, conn_type; 1580 u8 idx, basic_phy; 1581 1582 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx; 1583 basic_req.basic.hw_bss_idx = idx; 1584 if (band == NL80211_BAND_6GHZ) 1585 basic_req.basic.phymode_ext = PHY_MODE_AX_6G; 1586 1587 basic_phy = mt76_connac_get_phy_mode_v2(phy, vif, band, NULL); 1588 basic_req.basic.nonht_basic_phy = cpu_to_le16(basic_phy); 1589 1590 switch (vif->type) { 1591 case NL80211_IFTYPE_MESH_POINT: 1592 case NL80211_IFTYPE_AP: 1593 if (vif->p2p) 1594 conn_type = CONNECTION_P2P_GO; 1595 else 1596 conn_type = CONNECTION_INFRA_AP; 1597 basic_req.basic.conn_type = cpu_to_le32(conn_type); 1598 /* Fully active/deactivate BSS network in AP mode only */ 1599 basic_req.basic.active = enable; 1600 break; 1601 case NL80211_IFTYPE_STATION: 1602 if (vif->p2p) 1603 conn_type = CONNECTION_P2P_GC; 1604 else 1605 conn_type = CONNECTION_INFRA_STA; 1606 basic_req.basic.conn_type = cpu_to_le32(conn_type); 1607 break; 1608 case NL80211_IFTYPE_ADHOC: 1609 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC); 1610 break; 1611 default: 1612 WARN_ON(1); 1613 break; 1614 } 1615 1616 memcpy(basic_req.basic.bssid, vif->bss_conf.bssid, ETH_ALEN); 1617 basic_req.basic.bmc_tx_wlan_idx = cpu_to_le16(wcid->idx); 1618 basic_req.basic.sta_idx = cpu_to_le16(wcid->idx); 1619 basic_req.basic.conn_state = !enable; 1620 1621 err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &basic_req, 1622 sizeof(basic_req), true); 1623 if (err < 0) 1624 return err; 1625 1626 if (vif->bss_conf.he_support) { 1627 struct { 1628 struct { 1629 u8 bss_idx; 1630 u8 pad[3]; 1631 } __packed hdr; 1632 struct bss_info_uni_he he; 1633 struct bss_info_uni_bss_color bss_color; 1634 } he_req = { 1635 .hdr = { 1636 .bss_idx = mvif->idx, 1637 }, 1638 .he = { 1639 .tag = cpu_to_le16(UNI_BSS_INFO_HE_BASIC), 1640 .len = cpu_to_le16(sizeof(struct bss_info_uni_he)), 1641 }, 1642 .bss_color = { 1643 .tag = cpu_to_le16(UNI_BSS_INFO_BSS_COLOR), 1644 .len = cpu_to_le16(sizeof(struct bss_info_uni_bss_color)), 1645 .enable = 0, 1646 .bss_color = 0, 1647 }, 1648 }; 1649 1650 if (enable) { 1651 he_req.bss_color.enable = 1652 vif->bss_conf.he_bss_color.enabled; 1653 he_req.bss_color.bss_color = 1654 vif->bss_conf.he_bss_color.color; 1655 } 1656 1657 mt76_connac_mcu_uni_bss_he_tlv(phy, vif, 1658 (struct tlv *)&he_req.he); 1659 err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), 1660 &he_req, sizeof(he_req), true); 1661 if (err < 0) 1662 return err; 1663 } 1664 1665 if (enable && vif->bss_conf.bssid_indicator) { 1666 struct { 1667 struct { 1668 u8 bss_idx; 1669 u8 pad[3]; 1670 } __packed hdr; 1671 struct bss_info_uni_mbssid mbssid; 1672 } mbssid_req = { 1673 .hdr = { 1674 .bss_idx = mvif->idx, 1675 }, 1676 .mbssid = { 1677 .tag = cpu_to_le16(UNI_BSS_INFO_11V_MBSSID), 1678 .len = cpu_to_le16(sizeof(struct bss_info_uni_mbssid)), 1679 .max_indicator = vif->bss_conf.bssid_indicator, 1680 .mbss_idx = vif->bss_conf.bssid_index, 1681 }, 1682 }; 1683 1684 err = mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), 1685 &mbssid_req, sizeof(mbssid_req), true); 1686 if (err < 0) 1687 return err; 1688 } 1689 1690 return mt76_connac_mcu_uni_set_chctx(phy, mvif, ctx); 1691 } 1692 EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_bss); 1693 1694 void mt76_connac_mcu_build_rnr_scan_param(struct mt76_dev *mdev, 1695 struct cfg80211_scan_request *sreq) 1696 { 1697 struct ieee80211_channel **scan_list = sreq->channels; 1698 int i, bssid_index = 0; 1699 1700 /* clear 6G active Scan BSSID table */ 1701 memset(&mdev->rnr, 0, sizeof(mdev->rnr)); 1702 1703 for (i = 0; i < sreq->n_6ghz_params; i++) { 1704 u8 ch_idx = sreq->scan_6ghz_params[i].channel_idx; 1705 int k = 0; 1706 1707 /* Remove the duplicated BSSID */ 1708 for (k = 0; k < bssid_index; k++) { 1709 if (!memcmp(&mdev->rnr.bssid[k], 1710 sreq->scan_6ghz_params[i].bssid, 1711 ETH_ALEN)) 1712 break; 1713 } 1714 1715 if (k == bssid_index && 1716 bssid_index < MT76_RNR_SCAN_MAX_BSSIDS) { 1717 memcpy(&mdev->rnr.bssid[bssid_index++], 1718 sreq->scan_6ghz_params[i].bssid, ETH_ALEN); 1719 mdev->rnr.channel[k] = scan_list[ch_idx]->hw_value; 1720 } 1721 } 1722 1723 mdev->rnr.bssid_num = bssid_index; 1724 1725 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 1726 memcpy(mdev->rnr.random_mac, sreq->mac_addr, ETH_ALEN); 1727 mdev->rnr.sreq_flag = sreq->flags; 1728 } 1729 } 1730 EXPORT_SYMBOL_GPL(mt76_connac_mcu_build_rnr_scan_param); 1731 1732 #define MT76_CONNAC_SCAN_CHANNEL_TIME 60 1733 int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif, 1734 struct ieee80211_scan_request *scan_req) 1735 { 1736 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 1737 struct cfg80211_scan_request *sreq = &scan_req->req; 1738 int n_ssids = 0, err, i, duration; 1739 int ext_channels_num = max_t(int, sreq->n_channels - 32, 0); 1740 struct ieee80211_channel **scan_list = sreq->channels; 1741 struct mt76_dev *mdev = phy->dev; 1742 struct mt76_connac_mcu_scan_channel *chan; 1743 struct mt76_connac_hw_scan_req *req; 1744 struct sk_buff *skb; 1745 1746 if (test_bit(MT76_HW_SCANNING, &phy->state)) 1747 return -EBUSY; 1748 1749 skb = mt76_mcu_msg_alloc(mdev, NULL, sizeof(*req)); 1750 if (!skb) 1751 return -ENOMEM; 1752 1753 set_bit(MT76_HW_SCANNING, &phy->state); 1754 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f; 1755 1756 req = (struct mt76_connac_hw_scan_req *)skb_put_zero(skb, sizeof(*req)); 1757 1758 req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7; 1759 req->bss_idx = mvif->idx; 1760 req->scan_type = sreq->n_ssids ? 1 : 0; 1761 req->probe_req_num = sreq->n_ssids ? 2 : 0; 1762 req->version = 1; 1763 1764 for (i = 0; i < sreq->n_ssids; i++) { 1765 if (!sreq->ssids[i].ssid_len) 1766 continue; 1767 1768 req->ssids[n_ssids].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len); 1769 memcpy(req->ssids[n_ssids].ssid, sreq->ssids[i].ssid, 1770 sreq->ssids[i].ssid_len); 1771 n_ssids++; 1772 } 1773 req->ssid_type = n_ssids ? BIT(2) : BIT(0); 1774 req->ssid_type_ext = n_ssids ? BIT(0) : 0; 1775 req->ssids_num = n_ssids; 1776 1777 duration = is_mt7921(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME; 1778 /* increase channel time for passive scan */ 1779 if (!sreq->n_ssids) 1780 duration *= 2; 1781 req->timeout_value = cpu_to_le16(sreq->n_channels * duration); 1782 req->channel_min_dwell_time = cpu_to_le16(duration); 1783 req->channel_dwell_time = cpu_to_le16(duration); 1784 1785 if (sreq->n_channels == 0 || sreq->n_channels > 64) { 1786 req->channel_type = 0; 1787 req->channels_num = 0; 1788 req->ext_channels_num = 0; 1789 } else { 1790 req->channel_type = 4; 1791 req->channels_num = min_t(u8, sreq->n_channels, 32); 1792 req->ext_channels_num = min_t(u8, ext_channels_num, 32); 1793 } 1794 1795 for (i = 0; i < req->channels_num + req->ext_channels_num; i++) { 1796 if (i >= 32) 1797 chan = &req->ext_channels[i - 32]; 1798 else 1799 chan = &req->channels[i]; 1800 1801 switch (scan_list[i]->band) { 1802 case NL80211_BAND_2GHZ: 1803 chan->band = 1; 1804 break; 1805 case NL80211_BAND_6GHZ: 1806 chan->band = 3; 1807 break; 1808 default: 1809 chan->band = 2; 1810 break; 1811 } 1812 chan->channel_num = scan_list[i]->hw_value; 1813 } 1814 1815 if (sreq->ie_len > 0) { 1816 memcpy(req->ies, sreq->ie, sreq->ie_len); 1817 req->ies_len = cpu_to_le16(sreq->ie_len); 1818 } 1819 1820 if (is_mt7921(phy->dev)) 1821 req->scan_func |= SCAN_FUNC_SPLIT_SCAN; 1822 1823 memcpy(req->bssid, sreq->bssid, ETH_ALEN); 1824 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 1825 get_random_mask_addr(req->random_mac, sreq->mac_addr, 1826 sreq->mac_addr_mask); 1827 req->scan_func |= SCAN_FUNC_RANDOM_MAC; 1828 } 1829 1830 err = mt76_mcu_skb_send_msg(mdev, skb, MCU_CE_CMD(START_HW_SCAN), 1831 false); 1832 if (err < 0) 1833 clear_bit(MT76_HW_SCANNING, &phy->state); 1834 1835 return err; 1836 } 1837 EXPORT_SYMBOL_GPL(mt76_connac_mcu_hw_scan); 1838 1839 int mt76_connac_mcu_cancel_hw_scan(struct mt76_phy *phy, 1840 struct ieee80211_vif *vif) 1841 { 1842 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 1843 struct { 1844 u8 seq_num; 1845 u8 is_ext_channel; 1846 u8 rsv[2]; 1847 } __packed req = { 1848 .seq_num = mvif->scan_seq_num, 1849 }; 1850 1851 if (test_and_clear_bit(MT76_HW_SCANNING, &phy->state)) { 1852 struct cfg80211_scan_info info = { 1853 .aborted = true, 1854 }; 1855 1856 ieee80211_scan_completed(phy->hw, &info); 1857 } 1858 1859 return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(CANCEL_HW_SCAN), 1860 &req, sizeof(req), false); 1861 } 1862 EXPORT_SYMBOL_GPL(mt76_connac_mcu_cancel_hw_scan); 1863 1864 int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy, 1865 struct ieee80211_vif *vif, 1866 struct cfg80211_sched_scan_request *sreq) 1867 { 1868 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 1869 struct ieee80211_channel **scan_list = sreq->channels; 1870 struct mt76_connac_mcu_scan_channel *chan; 1871 struct mt76_connac_sched_scan_req *req; 1872 struct mt76_dev *mdev = phy->dev; 1873 struct cfg80211_match_set *match; 1874 struct cfg80211_ssid *ssid; 1875 struct sk_buff *skb; 1876 int i; 1877 1878 skb = mt76_mcu_msg_alloc(mdev, NULL, sizeof(*req) + sreq->ie_len); 1879 if (!skb) 1880 return -ENOMEM; 1881 1882 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f; 1883 1884 req = (struct mt76_connac_sched_scan_req *)skb_put_zero(skb, sizeof(*req)); 1885 req->version = 1; 1886 req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7; 1887 1888 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 1889 u8 *addr = is_mt7663(phy->dev) ? req->mt7663.random_mac 1890 : req->mt7921.random_mac; 1891 1892 req->scan_func = 1; 1893 get_random_mask_addr(addr, sreq->mac_addr, 1894 sreq->mac_addr_mask); 1895 } 1896 if (is_mt7921(phy->dev)) { 1897 req->mt7921.bss_idx = mvif->idx; 1898 req->mt7921.delay = cpu_to_le32(sreq->delay); 1899 } 1900 1901 req->ssids_num = sreq->n_ssids; 1902 for (i = 0; i < req->ssids_num; i++) { 1903 ssid = &sreq->ssids[i]; 1904 memcpy(req->ssids[i].ssid, ssid->ssid, ssid->ssid_len); 1905 req->ssids[i].ssid_len = cpu_to_le32(ssid->ssid_len); 1906 } 1907 1908 req->match_num = sreq->n_match_sets; 1909 for (i = 0; i < req->match_num; i++) { 1910 match = &sreq->match_sets[i]; 1911 memcpy(req->match[i].ssid, match->ssid.ssid, 1912 match->ssid.ssid_len); 1913 req->match[i].rssi_th = cpu_to_le32(match->rssi_thold); 1914 req->match[i].ssid_len = match->ssid.ssid_len; 1915 } 1916 1917 req->channel_type = sreq->n_channels ? 4 : 0; 1918 req->channels_num = min_t(u8, sreq->n_channels, 64); 1919 for (i = 0; i < req->channels_num; i++) { 1920 chan = &req->channels[i]; 1921 1922 switch (scan_list[i]->band) { 1923 case NL80211_BAND_2GHZ: 1924 chan->band = 1; 1925 break; 1926 case NL80211_BAND_6GHZ: 1927 chan->band = 3; 1928 break; 1929 default: 1930 chan->band = 2; 1931 break; 1932 } 1933 chan->channel_num = scan_list[i]->hw_value; 1934 } 1935 1936 req->intervals_num = sreq->n_scan_plans; 1937 for (i = 0; i < req->intervals_num; i++) 1938 req->intervals[i] = cpu_to_le16(sreq->scan_plans[i].interval); 1939 1940 if (sreq->ie_len > 0) { 1941 req->ie_len = cpu_to_le16(sreq->ie_len); 1942 memcpy(skb_put(skb, sreq->ie_len), sreq->ie, sreq->ie_len); 1943 } 1944 1945 return mt76_mcu_skb_send_msg(mdev, skb, MCU_CE_CMD(SCHED_SCAN_REQ), 1946 false); 1947 } 1948 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sched_scan_req); 1949 1950 int mt76_connac_mcu_sched_scan_enable(struct mt76_phy *phy, 1951 struct ieee80211_vif *vif, 1952 bool enable) 1953 { 1954 struct { 1955 u8 active; /* 0: enabled 1: disabled */ 1956 u8 rsv[3]; 1957 } __packed req = { 1958 .active = !enable, 1959 }; 1960 1961 if (enable) 1962 set_bit(MT76_HW_SCHED_SCANNING, &phy->state); 1963 else 1964 clear_bit(MT76_HW_SCHED_SCANNING, &phy->state); 1965 1966 return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(SCHED_SCAN_ENABLE), 1967 &req, sizeof(req), false); 1968 } 1969 EXPORT_SYMBOL_GPL(mt76_connac_mcu_sched_scan_enable); 1970 1971 int mt76_connac_mcu_chip_config(struct mt76_dev *dev) 1972 { 1973 struct mt76_connac_config req = { 1974 .resp_type = 0, 1975 }; 1976 1977 memcpy(req.data, "assert", 7); 1978 1979 return mt76_mcu_send_msg(dev, MCU_CE_CMD(CHIP_CONFIG), 1980 &req, sizeof(req), false); 1981 } 1982 EXPORT_SYMBOL_GPL(mt76_connac_mcu_chip_config); 1983 1984 int mt76_connac_mcu_set_deep_sleep(struct mt76_dev *dev, bool enable) 1985 { 1986 struct mt76_connac_config req = { 1987 .resp_type = 0, 1988 }; 1989 1990 snprintf(req.data, sizeof(req.data), "KeepFullPwr %d", !enable); 1991 1992 return mt76_mcu_send_msg(dev, MCU_CE_CMD(CHIP_CONFIG), 1993 &req, sizeof(req), false); 1994 } 1995 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_deep_sleep); 1996 1997 int mt76_connac_sta_state_dp(struct mt76_dev *dev, 1998 enum ieee80211_sta_state old_state, 1999 enum ieee80211_sta_state new_state) 2000 { 2001 if ((old_state == IEEE80211_STA_ASSOC && 2002 new_state == IEEE80211_STA_AUTHORIZED) || 2003 (old_state == IEEE80211_STA_NONE && 2004 new_state == IEEE80211_STA_NOTEXIST)) 2005 mt76_connac_mcu_set_deep_sleep(dev, true); 2006 2007 if ((old_state == IEEE80211_STA_NOTEXIST && 2008 new_state == IEEE80211_STA_NONE) || 2009 (old_state == IEEE80211_STA_AUTHORIZED && 2010 new_state == IEEE80211_STA_ASSOC)) 2011 mt76_connac_mcu_set_deep_sleep(dev, false); 2012 2013 return 0; 2014 } 2015 EXPORT_SYMBOL_GPL(mt76_connac_sta_state_dp); 2016 2017 void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb, 2018 struct mt76_connac_coredump *coredump) 2019 { 2020 spin_lock_bh(&dev->lock); 2021 __skb_queue_tail(&coredump->msg_list, skb); 2022 spin_unlock_bh(&dev->lock); 2023 2024 coredump->last_activity = jiffies; 2025 2026 queue_delayed_work(dev->wq, &coredump->work, 2027 MT76_CONNAC_COREDUMP_TIMEOUT); 2028 } 2029 EXPORT_SYMBOL_GPL(mt76_connac_mcu_coredump_event); 2030 2031 static void 2032 mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku, 2033 struct mt76_power_limits *limits, 2034 enum nl80211_band band) 2035 { 2036 int max_power = is_mt7921(dev) ? 127 : 63; 2037 int i, offset = sizeof(limits->cck); 2038 2039 memset(sku, max_power, MT_SKU_POWER_LIMIT); 2040 2041 if (band == NL80211_BAND_2GHZ) { 2042 /* cck */ 2043 memcpy(sku, limits->cck, sizeof(limits->cck)); 2044 } 2045 2046 /* ofdm */ 2047 memcpy(&sku[offset], limits->ofdm, sizeof(limits->ofdm)); 2048 offset += sizeof(limits->ofdm); 2049 2050 /* ht */ 2051 for (i = 0; i < 2; i++) { 2052 memcpy(&sku[offset], limits->mcs[i], 8); 2053 offset += 8; 2054 } 2055 sku[offset++] = limits->mcs[0][0]; 2056 2057 /* vht */ 2058 for (i = 0; i < ARRAY_SIZE(limits->mcs); i++) { 2059 memcpy(&sku[offset], limits->mcs[i], 2060 ARRAY_SIZE(limits->mcs[i])); 2061 offset += 12; 2062 } 2063 2064 if (!is_mt7921(dev)) 2065 return; 2066 2067 /* he */ 2068 for (i = 0; i < ARRAY_SIZE(limits->ru); i++) { 2069 memcpy(&sku[offset], limits->ru[i], ARRAY_SIZE(limits->ru[i])); 2070 offset += ARRAY_SIZE(limits->ru[i]); 2071 } 2072 } 2073 2074 s8 mt76_connac_get_ch_power(struct mt76_phy *phy, 2075 struct ieee80211_channel *chan, 2076 s8 target_power) 2077 { 2078 struct mt76_dev *dev = phy->dev; 2079 struct ieee80211_supported_band *sband; 2080 int i; 2081 2082 switch (chan->band) { 2083 case NL80211_BAND_2GHZ: 2084 sband = &phy->sband_2g.sband; 2085 break; 2086 case NL80211_BAND_5GHZ: 2087 sband = &phy->sband_5g.sband; 2088 break; 2089 case NL80211_BAND_6GHZ: 2090 sband = &phy->sband_6g.sband; 2091 break; 2092 default: 2093 return target_power; 2094 } 2095 2096 for (i = 0; i < sband->n_channels; i++) { 2097 struct ieee80211_channel *ch = &sband->channels[i]; 2098 2099 if (ch->hw_value == chan->hw_value) { 2100 if (!(ch->flags & IEEE80211_CHAN_DISABLED)) { 2101 int power = 2 * ch->max_reg_power; 2102 2103 if (is_mt7663(dev) && (power > 63 || power < -64)) 2104 power = 63; 2105 target_power = min_t(s8, power, target_power); 2106 } 2107 break; 2108 } 2109 } 2110 2111 return target_power; 2112 } 2113 EXPORT_SYMBOL_GPL(mt76_connac_get_ch_power); 2114 2115 static int 2116 mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy, 2117 enum nl80211_band band) 2118 { 2119 struct mt76_dev *dev = phy->dev; 2120 int sku_len, batch_len = is_mt7921(dev) ? 8 : 16; 2121 static const u8 chan_list_2ghz[] = { 2122 1, 2, 3, 4, 5, 6, 7, 2123 8, 9, 10, 11, 12, 13, 14 2124 }; 2125 static const u8 chan_list_5ghz[] = { 2126 36, 38, 40, 42, 44, 46, 48, 2127 50, 52, 54, 56, 58, 60, 62, 2128 64, 100, 102, 104, 106, 108, 110, 2129 112, 114, 116, 118, 120, 122, 124, 2130 126, 128, 132, 134, 136, 138, 140, 2131 142, 144, 149, 151, 153, 155, 157, 2132 159, 161, 165, 169, 173, 177 2133 }; 2134 static const u8 chan_list_6ghz[] = { 2135 1, 3, 5, 7, 9, 11, 13, 2136 15, 17, 19, 21, 23, 25, 27, 2137 29, 33, 35, 37, 39, 41, 43, 2138 45, 47, 49, 51, 53, 55, 57, 2139 59, 61, 65, 67, 69, 71, 73, 2140 75, 77, 79, 81, 83, 85, 87, 2141 89, 91, 93, 97, 99, 101, 103, 2142 105, 107, 109, 111, 113, 115, 117, 2143 119, 121, 123, 125, 129, 131, 133, 2144 135, 137, 139, 141, 143, 145, 147, 2145 149, 151, 153, 155, 157, 161, 163, 2146 165, 167, 169, 171, 173, 175, 177, 2147 179, 181, 183, 185, 187, 189, 193, 2148 195, 197, 199, 201, 203, 205, 207, 2149 209, 211, 213, 215, 217, 219, 221, 2150 225, 227, 229, 233 2151 }; 2152 int i, n_chan, batch_size, idx = 0, tx_power, last_ch, err = 0; 2153 struct mt76_connac_sku_tlv sku_tlbv; 2154 struct mt76_power_limits *limits; 2155 const u8 *ch_list; 2156 2157 limits = devm_kmalloc(dev->dev, sizeof(*limits), GFP_KERNEL); 2158 if (!limits) 2159 return -ENOMEM; 2160 2161 sku_len = is_mt7921(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92; 2162 tx_power = 2 * phy->hw->conf.power_level; 2163 if (!tx_power) 2164 tx_power = 127; 2165 2166 if (band == NL80211_BAND_2GHZ) { 2167 n_chan = ARRAY_SIZE(chan_list_2ghz); 2168 ch_list = chan_list_2ghz; 2169 } else if (band == NL80211_BAND_6GHZ) { 2170 n_chan = ARRAY_SIZE(chan_list_6ghz); 2171 ch_list = chan_list_6ghz; 2172 } else { 2173 n_chan = ARRAY_SIZE(chan_list_5ghz); 2174 ch_list = chan_list_5ghz; 2175 } 2176 batch_size = DIV_ROUND_UP(n_chan, batch_len); 2177 2178 if (phy->cap.has_6ghz) 2179 last_ch = chan_list_6ghz[ARRAY_SIZE(chan_list_6ghz) - 1]; 2180 else if (phy->cap.has_5ghz) 2181 last_ch = chan_list_5ghz[ARRAY_SIZE(chan_list_5ghz) - 1]; 2182 else 2183 last_ch = chan_list_2ghz[ARRAY_SIZE(chan_list_2ghz) - 1]; 2184 2185 for (i = 0; i < batch_size; i++) { 2186 struct mt76_connac_tx_power_limit_tlv tx_power_tlv = {}; 2187 int j, msg_len, num_ch; 2188 struct sk_buff *skb; 2189 2190 num_ch = i == batch_size - 1 ? n_chan - i * batch_len : batch_len; 2191 msg_len = sizeof(tx_power_tlv) + num_ch * sizeof(sku_tlbv); 2192 skb = mt76_mcu_msg_alloc(dev, NULL, msg_len); 2193 if (!skb) { 2194 err = -ENOMEM; 2195 goto out; 2196 } 2197 2198 skb_reserve(skb, sizeof(tx_power_tlv)); 2199 2200 BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(tx_power_tlv.alpha2)); 2201 memcpy(tx_power_tlv.alpha2, dev->alpha2, sizeof(dev->alpha2)); 2202 tx_power_tlv.n_chan = num_ch; 2203 2204 switch (band) { 2205 case NL80211_BAND_2GHZ: 2206 tx_power_tlv.band = 1; 2207 break; 2208 case NL80211_BAND_6GHZ: 2209 tx_power_tlv.band = 3; 2210 break; 2211 default: 2212 tx_power_tlv.band = 2; 2213 break; 2214 } 2215 2216 for (j = 0; j < num_ch; j++, idx++) { 2217 struct ieee80211_channel chan = { 2218 .hw_value = ch_list[idx], 2219 .band = band, 2220 }; 2221 s8 reg_power, sar_power; 2222 2223 reg_power = mt76_connac_get_ch_power(phy, &chan, 2224 tx_power); 2225 sar_power = mt76_get_sar_power(phy, &chan, reg_power); 2226 2227 mt76_get_rate_power_limits(phy, &chan, limits, 2228 sar_power); 2229 2230 tx_power_tlv.last_msg = ch_list[idx] == last_ch; 2231 sku_tlbv.channel = ch_list[idx]; 2232 2233 mt76_connac_mcu_build_sku(dev, sku_tlbv.pwr_limit, 2234 limits, band); 2235 skb_put_data(skb, &sku_tlbv, sku_len); 2236 } 2237 __skb_push(skb, sizeof(tx_power_tlv)); 2238 memcpy(skb->data, &tx_power_tlv, sizeof(tx_power_tlv)); 2239 2240 err = mt76_mcu_skb_send_msg(dev, skb, 2241 MCU_CE_CMD(SET_RATE_TX_POWER), 2242 false); 2243 if (err < 0) 2244 goto out; 2245 } 2246 2247 out: 2248 devm_kfree(dev->dev, limits); 2249 return err; 2250 } 2251 2252 int mt76_connac_mcu_set_rate_txpower(struct mt76_phy *phy) 2253 { 2254 int err; 2255 2256 if (phy->cap.has_2ghz) { 2257 err = mt76_connac_mcu_rate_txpower_band(phy, 2258 NL80211_BAND_2GHZ); 2259 if (err < 0) 2260 return err; 2261 } 2262 if (phy->cap.has_5ghz) { 2263 err = mt76_connac_mcu_rate_txpower_band(phy, 2264 NL80211_BAND_5GHZ); 2265 if (err < 0) 2266 return err; 2267 } 2268 if (phy->cap.has_6ghz) { 2269 err = mt76_connac_mcu_rate_txpower_band(phy, 2270 NL80211_BAND_6GHZ); 2271 if (err < 0) 2272 return err; 2273 } 2274 2275 return 0; 2276 } 2277 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_rate_txpower); 2278 2279 int mt76_connac_mcu_update_arp_filter(struct mt76_dev *dev, 2280 struct mt76_vif_link *vif, 2281 struct ieee80211_bss_conf *info) 2282 { 2283 struct ieee80211_vif *mvif = container_of(info, struct ieee80211_vif, 2284 bss_conf); 2285 struct sk_buff *skb; 2286 int i, len = min_t(int, mvif->cfg.arp_addr_cnt, 2287 IEEE80211_BSS_ARP_ADDR_LIST_LEN); 2288 struct { 2289 struct { 2290 u8 bss_idx; 2291 u8 pad[3]; 2292 } __packed hdr; 2293 struct mt76_connac_arpns_tlv arp; 2294 } req_hdr = { 2295 .hdr = { 2296 .bss_idx = vif->idx, 2297 }, 2298 .arp = { 2299 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP), 2300 .len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)), 2301 .ips_num = len, 2302 .mode = 2, /* update */ 2303 .option = 1, 2304 }, 2305 }; 2306 2307 skb = mt76_mcu_msg_alloc(dev, NULL, 2308 sizeof(req_hdr) + len * sizeof(__be32)); 2309 if (!skb) 2310 return -ENOMEM; 2311 2312 skb_put_data(skb, &req_hdr, sizeof(req_hdr)); 2313 for (i = 0; i < len; i++) 2314 skb_put_data(skb, &mvif->cfg.arp_addr_list[i], sizeof(__be32)); 2315 2316 return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(OFFLOAD), true); 2317 } 2318 EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_arp_filter); 2319 2320 int mt76_connac_mcu_set_p2p_oppps(struct ieee80211_hw *hw, 2321 struct ieee80211_vif *vif) 2322 { 2323 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 2324 int ct_window = vif->bss_conf.p2p_noa_attr.oppps_ctwindow; 2325 struct mt76_phy *phy = hw->priv; 2326 struct { 2327 __le32 ct_win; 2328 u8 bss_idx; 2329 u8 rsv[3]; 2330 } __packed req = { 2331 .ct_win = cpu_to_le32(ct_window), 2332 .bss_idx = mvif->idx, 2333 }; 2334 2335 return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(SET_P2P_OPPPS), 2336 &req, sizeof(req), false); 2337 } 2338 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_p2p_oppps); 2339 2340 #ifdef CONFIG_PM 2341 2342 const struct wiphy_wowlan_support mt76_connac_wowlan_support = { 2343 .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT | 2344 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | WIPHY_WOWLAN_NET_DETECT, 2345 .n_patterns = 1, 2346 .pattern_min_len = 1, 2347 .pattern_max_len = MT76_CONNAC_WOW_PATTEN_MAX_LEN, 2348 .max_nd_match_sets = 10, 2349 }; 2350 EXPORT_SYMBOL_GPL(mt76_connac_wowlan_support); 2351 2352 static void 2353 mt76_connac_mcu_key_iter(struct ieee80211_hw *hw, 2354 struct ieee80211_vif *vif, 2355 struct ieee80211_sta *sta, 2356 struct ieee80211_key_conf *key, 2357 void *data) 2358 { 2359 struct mt76_connac_gtk_rekey_tlv *gtk_tlv = data; 2360 u32 cipher; 2361 2362 if (key->cipher != WLAN_CIPHER_SUITE_AES_CMAC && 2363 key->cipher != WLAN_CIPHER_SUITE_CCMP && 2364 key->cipher != WLAN_CIPHER_SUITE_TKIP) 2365 return; 2366 2367 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) 2368 cipher = BIT(3); 2369 else 2370 cipher = BIT(4); 2371 2372 /* we are assuming here to have a single pairwise key */ 2373 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { 2374 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) 2375 gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1); 2376 else 2377 gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2); 2378 2379 gtk_tlv->pairwise_cipher = cpu_to_le32(cipher); 2380 gtk_tlv->keyid = key->keyidx; 2381 } else { 2382 gtk_tlv->group_cipher = cpu_to_le32(cipher); 2383 } 2384 } 2385 2386 int mt76_connac_mcu_update_gtk_rekey(struct ieee80211_hw *hw, 2387 struct ieee80211_vif *vif, 2388 struct cfg80211_gtk_rekey_data *key) 2389 { 2390 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 2391 struct mt76_connac_gtk_rekey_tlv *gtk_tlv; 2392 struct mt76_phy *phy = hw->priv; 2393 struct sk_buff *skb; 2394 struct { 2395 u8 bss_idx; 2396 u8 pad[3]; 2397 } __packed hdr = { 2398 .bss_idx = mvif->idx, 2399 }; 2400 2401 skb = mt76_mcu_msg_alloc(phy->dev, NULL, 2402 sizeof(hdr) + sizeof(*gtk_tlv)); 2403 if (!skb) 2404 return -ENOMEM; 2405 2406 skb_put_data(skb, &hdr, sizeof(hdr)); 2407 gtk_tlv = (struct mt76_connac_gtk_rekey_tlv *)skb_put_zero(skb, 2408 sizeof(*gtk_tlv)); 2409 gtk_tlv->tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY); 2410 gtk_tlv->len = cpu_to_le16(sizeof(*gtk_tlv)); 2411 gtk_tlv->rekey_mode = 2; 2412 gtk_tlv->option = 1; 2413 2414 rcu_read_lock(); 2415 ieee80211_iter_keys_rcu(hw, vif, mt76_connac_mcu_key_iter, gtk_tlv); 2416 rcu_read_unlock(); 2417 2418 memcpy(gtk_tlv->kek, key->kek, NL80211_KEK_LEN); 2419 memcpy(gtk_tlv->kck, key->kck, NL80211_KCK_LEN); 2420 memcpy(gtk_tlv->replay_ctr, key->replay_ctr, NL80211_REPLAY_CTR_LEN); 2421 2422 return mt76_mcu_skb_send_msg(phy->dev, skb, 2423 MCU_UNI_CMD(OFFLOAD), true); 2424 } 2425 EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_gtk_rekey); 2426 2427 static int 2428 mt76_connac_mcu_set_arp_filter(struct mt76_dev *dev, struct ieee80211_vif *vif, 2429 bool suspend) 2430 { 2431 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 2432 struct { 2433 struct { 2434 u8 bss_idx; 2435 u8 pad[3]; 2436 } __packed hdr; 2437 struct mt76_connac_arpns_tlv arpns; 2438 } req = { 2439 .hdr = { 2440 .bss_idx = mvif->idx, 2441 }, 2442 .arpns = { 2443 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP), 2444 .len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)), 2445 .mode = suspend, 2446 }, 2447 }; 2448 2449 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(OFFLOAD), &req, 2450 sizeof(req), true); 2451 } 2452 2453 int 2454 mt76_connac_mcu_set_gtk_rekey(struct mt76_dev *dev, struct ieee80211_vif *vif, 2455 bool suspend) 2456 { 2457 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 2458 struct { 2459 struct { 2460 u8 bss_idx; 2461 u8 pad[3]; 2462 } __packed hdr; 2463 struct mt76_connac_gtk_rekey_tlv gtk_tlv; 2464 } __packed req = { 2465 .hdr = { 2466 .bss_idx = mvif->idx, 2467 }, 2468 .gtk_tlv = { 2469 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY), 2470 .len = cpu_to_le16(sizeof(struct mt76_connac_gtk_rekey_tlv)), 2471 .rekey_mode = !suspend, 2472 }, 2473 }; 2474 2475 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(OFFLOAD), &req, 2476 sizeof(req), true); 2477 } 2478 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_gtk_rekey); 2479 2480 int 2481 mt76_connac_mcu_set_suspend_mode(struct mt76_dev *dev, 2482 struct ieee80211_vif *vif, 2483 bool enable, u8 mdtim, 2484 bool wow_suspend) 2485 { 2486 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 2487 struct { 2488 struct { 2489 u8 bss_idx; 2490 u8 pad[3]; 2491 } __packed hdr; 2492 struct mt76_connac_suspend_tlv suspend_tlv; 2493 } req = { 2494 .hdr = { 2495 .bss_idx = mvif->idx, 2496 }, 2497 .suspend_tlv = { 2498 .tag = cpu_to_le16(UNI_SUSPEND_MODE_SETTING), 2499 .len = cpu_to_le16(sizeof(struct mt76_connac_suspend_tlv)), 2500 .enable = enable, 2501 .mdtim = mdtim, 2502 .wow_suspend = wow_suspend, 2503 }, 2504 }; 2505 2506 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(SUSPEND), &req, 2507 sizeof(req), true); 2508 } 2509 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_suspend_mode); 2510 2511 static int 2512 mt76_connac_mcu_set_wow_pattern(struct mt76_dev *dev, 2513 struct ieee80211_vif *vif, 2514 u8 index, bool enable, 2515 struct cfg80211_pkt_pattern *pattern) 2516 { 2517 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 2518 struct mt76_connac_wow_pattern_tlv *ptlv; 2519 struct sk_buff *skb; 2520 struct req_hdr { 2521 u8 bss_idx; 2522 u8 pad[3]; 2523 } __packed hdr = { 2524 .bss_idx = mvif->idx, 2525 }; 2526 2527 skb = mt76_mcu_msg_alloc(dev, NULL, sizeof(hdr) + sizeof(*ptlv)); 2528 if (!skb) 2529 return -ENOMEM; 2530 2531 skb_put_data(skb, &hdr, sizeof(hdr)); 2532 ptlv = (struct mt76_connac_wow_pattern_tlv *)skb_put_zero(skb, sizeof(*ptlv)); 2533 ptlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN); 2534 ptlv->len = cpu_to_le16(sizeof(*ptlv)); 2535 ptlv->data_len = pattern->pattern_len; 2536 ptlv->enable = enable; 2537 ptlv->index = index; 2538 2539 memcpy(ptlv->pattern, pattern->pattern, pattern->pattern_len); 2540 memcpy(ptlv->mask, pattern->mask, DIV_ROUND_UP(pattern->pattern_len, 8)); 2541 2542 return mt76_mcu_skb_send_msg(dev, skb, MCU_UNI_CMD(SUSPEND), true); 2543 } 2544 2545 int 2546 mt76_connac_mcu_set_wow_ctrl(struct mt76_phy *phy, struct ieee80211_vif *vif, 2547 bool suspend, struct cfg80211_wowlan *wowlan) 2548 { 2549 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 2550 struct mt76_dev *dev = phy->dev; 2551 struct { 2552 struct { 2553 u8 bss_idx; 2554 u8 pad[3]; 2555 } __packed hdr; 2556 struct mt76_connac_wow_ctrl_tlv wow_ctrl_tlv; 2557 struct mt76_connac_wow_gpio_param_tlv gpio_tlv; 2558 } req = { 2559 .hdr = { 2560 .bss_idx = mvif->idx, 2561 }, 2562 .wow_ctrl_tlv = { 2563 .tag = cpu_to_le16(UNI_SUSPEND_WOW_CTRL), 2564 .len = cpu_to_le16(sizeof(struct mt76_connac_wow_ctrl_tlv)), 2565 .cmd = suspend ? 1 : 2, 2566 }, 2567 .gpio_tlv = { 2568 .tag = cpu_to_le16(UNI_SUSPEND_WOW_GPIO_PARAM), 2569 .len = cpu_to_le16(sizeof(struct mt76_connac_wow_gpio_param_tlv)), 2570 .gpio_pin = 0xff, /* follow fw about GPIO pin */ 2571 }, 2572 }; 2573 2574 if (wowlan->magic_pkt) 2575 req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_MAGIC; 2576 if (wowlan->disconnect) 2577 req.wow_ctrl_tlv.trigger |= (UNI_WOW_DETECT_TYPE_DISCONNECT | 2578 UNI_WOW_DETECT_TYPE_BCN_LOST); 2579 if (wowlan->nd_config) { 2580 mt76_connac_mcu_sched_scan_req(phy, vif, wowlan->nd_config); 2581 req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_SCH_SCAN_HIT; 2582 mt76_connac_mcu_sched_scan_enable(phy, vif, suspend); 2583 } 2584 if (wowlan->n_patterns) 2585 req.wow_ctrl_tlv.trigger |= UNI_WOW_DETECT_TYPE_BITMAP; 2586 2587 if (mt76_is_mmio(dev)) 2588 req.wow_ctrl_tlv.wakeup_hif = WOW_PCIE; 2589 else if (mt76_is_usb(dev)) 2590 req.wow_ctrl_tlv.wakeup_hif = WOW_USB; 2591 else if (mt76_is_sdio(dev)) 2592 req.wow_ctrl_tlv.wakeup_hif = WOW_GPIO; 2593 2594 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(SUSPEND), &req, 2595 sizeof(req), true); 2596 } 2597 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_wow_ctrl); 2598 2599 int mt76_connac_mcu_set_hif_suspend(struct mt76_dev *dev, bool suspend, bool wait_resp) 2600 { 2601 struct { 2602 struct { 2603 u8 hif_type; /* 0x0: HIF_SDIO 2604 * 0x1: HIF_USB 2605 * 0x2: HIF_PCIE 2606 */ 2607 u8 pad[3]; 2608 } __packed hdr; 2609 struct hif_suspend_tlv { 2610 __le16 tag; 2611 __le16 len; 2612 u8 suspend; 2613 u8 pad[7]; 2614 } __packed hif_suspend; 2615 } req = { 2616 .hif_suspend = { 2617 .tag = cpu_to_le16(0), /* 0: UNI_HIF_CTRL_BASIC */ 2618 .len = cpu_to_le16(sizeof(struct hif_suspend_tlv)), 2619 .suspend = suspend, 2620 }, 2621 }; 2622 2623 if (mt76_is_mmio(dev)) 2624 req.hdr.hif_type = 2; 2625 else if (mt76_is_usb(dev)) 2626 req.hdr.hif_type = 1; 2627 else if (mt76_is_sdio(dev)) 2628 req.hdr.hif_type = 0; 2629 2630 return mt76_mcu_send_msg(dev, MCU_UNI_CMD(HIF_CTRL), &req, 2631 sizeof(req), wait_resp); 2632 } 2633 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_hif_suspend); 2634 2635 void mt76_connac_mcu_set_suspend_iter(void *priv, u8 *mac, 2636 struct ieee80211_vif *vif) 2637 { 2638 struct mt76_phy *phy = priv; 2639 bool suspend = !test_bit(MT76_STATE_RUNNING, &phy->state); 2640 struct ieee80211_hw *hw = phy->hw; 2641 struct cfg80211_wowlan *wowlan = hw->wiphy->wowlan_config; 2642 int i; 2643 2644 mt76_connac_mcu_set_gtk_rekey(phy->dev, vif, suspend); 2645 mt76_connac_mcu_set_arp_filter(phy->dev, vif, suspend); 2646 2647 mt76_connac_mcu_set_suspend_mode(phy->dev, vif, suspend, 1, true); 2648 2649 for (i = 0; i < wowlan->n_patterns; i++) 2650 mt76_connac_mcu_set_wow_pattern(phy->dev, vif, i, suspend, 2651 &wowlan->patterns[i]); 2652 mt76_connac_mcu_set_wow_ctrl(phy, vif, suspend, wowlan); 2653 } 2654 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_suspend_iter); 2655 #endif /* CONFIG_PM */ 2656 2657 u32 mt76_connac_mcu_reg_rr(struct mt76_dev *dev, u32 offset) 2658 { 2659 struct { 2660 __le32 addr; 2661 __le32 val; 2662 } __packed req = { 2663 .addr = cpu_to_le32(offset), 2664 }; 2665 2666 return mt76_mcu_send_msg(dev, MCU_CE_QUERY(REG_READ), &req, 2667 sizeof(req), true); 2668 } 2669 EXPORT_SYMBOL_GPL(mt76_connac_mcu_reg_rr); 2670 2671 void mt76_connac_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val) 2672 { 2673 struct { 2674 __le32 addr; 2675 __le32 val; 2676 } __packed req = { 2677 .addr = cpu_to_le32(offset), 2678 .val = cpu_to_le32(val), 2679 }; 2680 2681 mt76_mcu_send_msg(dev, MCU_CE_CMD(REG_WRITE), &req, 2682 sizeof(req), false); 2683 } 2684 EXPORT_SYMBOL_GPL(mt76_connac_mcu_reg_wr); 2685 2686 static int 2687 mt76_connac_mcu_sta_key_tlv(struct mt76_connac_sta_key_conf *sta_key_conf, 2688 struct sk_buff *skb, 2689 struct ieee80211_key_conf *key, 2690 enum set_key_cmd cmd) 2691 { 2692 struct sta_rec_sec *sec; 2693 u32 len = sizeof(*sec); 2694 struct tlv *tlv; 2695 2696 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_KEY_V2, sizeof(*sec)); 2697 sec = (struct sta_rec_sec *)tlv; 2698 sec->add = cmd; 2699 2700 if (cmd == SET_KEY) { 2701 struct sec_key *sec_key; 2702 u8 cipher; 2703 2704 cipher = mt76_connac_mcu_get_cipher(key->cipher); 2705 if (cipher == MCU_CIPHER_NONE) 2706 return -EOPNOTSUPP; 2707 2708 sec_key = &sec->key[0]; 2709 sec_key->cipher_len = sizeof(*sec_key); 2710 2711 if (cipher == MCU_CIPHER_BIP_CMAC_128) { 2712 sec_key->cipher_id = MCU_CIPHER_AES_CCMP; 2713 sec_key->key_id = sta_key_conf->keyidx; 2714 sec_key->key_len = 16; 2715 memcpy(sec_key->key, sta_key_conf->key, 16); 2716 2717 sec_key = &sec->key[1]; 2718 sec_key->cipher_id = MCU_CIPHER_BIP_CMAC_128; 2719 sec_key->cipher_len = sizeof(*sec_key); 2720 sec_key->key_len = 16; 2721 memcpy(sec_key->key, key->key, 16); 2722 sec->n_cipher = 2; 2723 } else { 2724 sec_key->cipher_id = cipher; 2725 sec_key->key_id = key->keyidx; 2726 sec_key->key_len = key->keylen; 2727 memcpy(sec_key->key, key->key, key->keylen); 2728 2729 if (cipher == MCU_CIPHER_TKIP) { 2730 /* Rx/Tx MIC keys are swapped */ 2731 memcpy(sec_key->key + 16, key->key + 24, 8); 2732 memcpy(sec_key->key + 24, key->key + 16, 8); 2733 } 2734 2735 /* store key_conf for BIP batch update */ 2736 if (cipher == MCU_CIPHER_AES_CCMP) { 2737 memcpy(sta_key_conf->key, key->key, key->keylen); 2738 sta_key_conf->keyidx = key->keyidx; 2739 } 2740 2741 len -= sizeof(*sec_key); 2742 sec->n_cipher = 1; 2743 } 2744 } else { 2745 len -= sizeof(sec->key); 2746 sec->n_cipher = 0; 2747 } 2748 sec->len = cpu_to_le16(len); 2749 2750 return 0; 2751 } 2752 2753 int mt76_connac_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif, 2754 struct mt76_connac_sta_key_conf *sta_key_conf, 2755 struct ieee80211_key_conf *key, int mcu_cmd, 2756 struct mt76_wcid *wcid, enum set_key_cmd cmd) 2757 { 2758 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 2759 struct sk_buff *skb; 2760 int ret; 2761 2762 skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid); 2763 if (IS_ERR(skb)) 2764 return PTR_ERR(skb); 2765 2766 ret = mt76_connac_mcu_sta_key_tlv(sta_key_conf, skb, key, cmd); 2767 if (ret) 2768 return ret; 2769 2770 ret = mt76_connac_mcu_sta_wed_update(dev, skb); 2771 if (ret) 2772 return ret; 2773 2774 return mt76_mcu_skb_send_msg(dev, skb, mcu_cmd, true); 2775 } 2776 EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_key); 2777 2778 /* SIFS 20us + 512 byte beacon transmitted by 1Mbps (3906us) */ 2779 #define BCN_TX_ESTIMATE_TIME (4096 + 20) 2780 void mt76_connac_mcu_bss_ext_tlv(struct sk_buff *skb, struct mt76_vif_link *mvif) 2781 { 2782 struct bss_info_ext_bss *ext; 2783 int ext_bss_idx, tsf_offset; 2784 struct tlv *tlv; 2785 2786 ext_bss_idx = mvif->omac_idx - EXT_BSSID_START; 2787 if (ext_bss_idx < 0) 2788 return; 2789 2790 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext)); 2791 2792 ext = (struct bss_info_ext_bss *)tlv; 2793 tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME; 2794 ext->mbss_tsf_offset = cpu_to_le32(tsf_offset); 2795 } 2796 EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_ext_tlv); 2797 2798 int mt76_connac_mcu_bss_basic_tlv(struct sk_buff *skb, 2799 struct ieee80211_vif *vif, 2800 struct ieee80211_sta *sta, 2801 struct mt76_phy *phy, u16 wlan_idx, 2802 bool enable) 2803 { 2804 struct mt76_vif_link *mvif = (struct mt76_vif_link *)vif->drv_priv; 2805 u32 type = vif->p2p ? NETWORK_P2P : NETWORK_INFRA; 2806 struct bss_info_basic *bss; 2807 struct tlv *tlv; 2808 2809 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss)); 2810 bss = (struct bss_info_basic *)tlv; 2811 2812 switch (vif->type) { 2813 case NL80211_IFTYPE_MESH_POINT: 2814 case NL80211_IFTYPE_MONITOR: 2815 break; 2816 case NL80211_IFTYPE_AP: 2817 if (ieee80211_hw_check(phy->hw, SUPPORTS_MULTI_BSSID)) { 2818 u8 bssid_id = vif->bss_conf.bssid_indicator; 2819 struct wiphy *wiphy = phy->hw->wiphy; 2820 2821 if (bssid_id > ilog2(wiphy->mbssid_max_interfaces)) 2822 return -EINVAL; 2823 2824 bss->non_tx_bssid = vif->bss_conf.bssid_index; 2825 bss->max_bssid = bssid_id; 2826 } 2827 break; 2828 case NL80211_IFTYPE_STATION: 2829 if (enable) { 2830 rcu_read_lock(); 2831 if (!sta) 2832 sta = ieee80211_find_sta(vif, 2833 vif->bss_conf.bssid); 2834 /* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */ 2835 if (sta) { 2836 struct mt76_wcid *wcid; 2837 2838 wcid = (struct mt76_wcid *)sta->drv_priv; 2839 wlan_idx = wcid->idx; 2840 } 2841 rcu_read_unlock(); 2842 } 2843 break; 2844 case NL80211_IFTYPE_ADHOC: 2845 type = NETWORK_IBSS; 2846 break; 2847 default: 2848 WARN_ON(1); 2849 break; 2850 } 2851 2852 bss->network_type = cpu_to_le32(type); 2853 bss->bmc_wcid_lo = to_wcid_lo(wlan_idx); 2854 bss->bmc_wcid_hi = to_wcid_hi(wlan_idx); 2855 bss->wmm_idx = mvif->wmm_idx; 2856 bss->active = enable; 2857 bss->cipher = mvif->cipher; 2858 2859 if (vif->type != NL80211_IFTYPE_MONITOR) { 2860 struct cfg80211_chan_def *chandef = &phy->chandef; 2861 2862 memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN); 2863 bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int); 2864 bss->dtim_period = vif->bss_conf.dtim_period; 2865 bss->phy_mode = mt76_connac_get_phy_mode(phy, vif, 2866 chandef->chan->band, NULL); 2867 } else { 2868 memcpy(bss->bssid, phy->macaddr, ETH_ALEN); 2869 } 2870 2871 return 0; 2872 } 2873 EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_basic_tlv); 2874 2875 #define ENTER_PM_STATE 1 2876 #define EXIT_PM_STATE 2 2877 int mt76_connac_mcu_set_pm(struct mt76_dev *dev, int band, int enter) 2878 { 2879 struct { 2880 u8 pm_number; 2881 u8 pm_state; 2882 u8 bssid[ETH_ALEN]; 2883 u8 dtim_period; 2884 u8 wlan_idx_lo; 2885 __le16 bcn_interval; 2886 __le32 aid; 2887 __le32 rx_filter; 2888 u8 band_idx; 2889 u8 wlan_idx_hi; 2890 u8 rsv[2]; 2891 __le32 feature; 2892 u8 omac_idx; 2893 u8 wmm_idx; 2894 u8 bcn_loss_cnt; 2895 u8 bcn_sp_duration; 2896 } __packed req = { 2897 .pm_number = 5, 2898 .pm_state = enter ? ENTER_PM_STATE : EXIT_PM_STATE, 2899 .band_idx = band, 2900 }; 2901 2902 return mt76_mcu_send_msg(dev, MCU_EXT_CMD(PM_STATE_CTRL), &req, 2903 sizeof(req), true); 2904 } 2905 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_pm); 2906 2907 int mt76_connac_mcu_restart(struct mt76_dev *dev) 2908 { 2909 struct { 2910 u8 power_mode; 2911 u8 rsv[3]; 2912 } req = { 2913 .power_mode = 1, 2914 }; 2915 2916 return mt76_mcu_send_msg(dev, MCU_CMD(NIC_POWER_CTRL), &req, 2917 sizeof(req), false); 2918 } 2919 EXPORT_SYMBOL_GPL(mt76_connac_mcu_restart); 2920 2921 int mt76_connac_mcu_del_wtbl_all(struct mt76_dev *dev) 2922 { 2923 struct wtbl_req_hdr req = { 2924 .operation = WTBL_RESET_ALL, 2925 }; 2926 2927 return mt76_mcu_send_msg(dev, MCU_EXT_CMD(WTBL_UPDATE), 2928 &req, sizeof(req), true); 2929 } 2930 EXPORT_SYMBOL_GPL(mt76_connac_mcu_del_wtbl_all); 2931 2932 int mt76_connac_mcu_rdd_cmd(struct mt76_dev *dev, int cmd, u8 index, 2933 u8 rx_sel, u8 val) 2934 { 2935 struct { 2936 u8 ctrl; 2937 u8 rdd_idx; 2938 u8 rdd_rx_sel; 2939 u8 val; 2940 u8 rsv[4]; 2941 } __packed req = { 2942 .ctrl = cmd, 2943 .rdd_idx = index, 2944 .rdd_rx_sel = rx_sel, 2945 .val = val, 2946 }; 2947 2948 return mt76_mcu_send_msg(dev, MCU_EXT_CMD(SET_RDD_CTRL), &req, 2949 sizeof(req), true); 2950 } 2951 EXPORT_SYMBOL_GPL(mt76_connac_mcu_rdd_cmd); 2952 2953 static int 2954 mt76_connac_mcu_send_ram_firmware(struct mt76_dev *dev, 2955 const struct mt76_connac2_fw_trailer *hdr, 2956 const u8 *data, bool is_wa) 2957 { 2958 int i, offset = 0, max_len = mt76_is_sdio(dev) ? 2048 : 4096; 2959 u32 override = 0, option = 0; 2960 2961 for (i = 0; i < hdr->n_region; i++) { 2962 const struct mt76_connac2_fw_region *region; 2963 u32 len, addr, mode; 2964 int err; 2965 2966 region = (const void *)((const u8 *)hdr - 2967 (hdr->n_region - i) * sizeof(*region)); 2968 mode = mt76_connac_mcu_gen_dl_mode(dev, region->feature_set, 2969 is_wa); 2970 len = le32_to_cpu(region->len); 2971 addr = le32_to_cpu(region->addr); 2972 2973 if (region->feature_set & FW_FEATURE_NON_DL) 2974 goto next; 2975 2976 if (region->feature_set & FW_FEATURE_OVERRIDE_ADDR) 2977 override = addr; 2978 2979 err = mt76_connac_mcu_init_download(dev, addr, len, mode); 2980 if (err) { 2981 dev_err(dev->dev, "Download request failed\n"); 2982 return err; 2983 } 2984 2985 err = __mt76_mcu_send_firmware(dev, MCU_CMD(FW_SCATTER), 2986 data + offset, len, max_len); 2987 if (err) { 2988 dev_err(dev->dev, "Failed to send firmware.\n"); 2989 return err; 2990 } 2991 2992 next: 2993 offset += len; 2994 } 2995 2996 if (override) 2997 option |= FW_START_OVERRIDE; 2998 if (is_wa) 2999 option |= FW_START_WORKING_PDA_CR4; 3000 3001 return mt76_connac_mcu_start_firmware(dev, override, option); 3002 } 3003 3004 int mt76_connac2_load_ram(struct mt76_dev *dev, const char *fw_wm, 3005 const char *fw_wa) 3006 { 3007 const struct mt76_connac2_fw_trailer *hdr; 3008 const struct firmware *fw; 3009 int ret; 3010 3011 ret = request_firmware(&fw, fw_wm, dev->dev); 3012 if (ret) 3013 return ret; 3014 3015 if (!fw || !fw->data || fw->size < sizeof(*hdr)) { 3016 dev_err(dev->dev, "Invalid firmware\n"); 3017 ret = -EINVAL; 3018 goto out; 3019 } 3020 3021 hdr = (const void *)(fw->data + fw->size - sizeof(*hdr)); 3022 dev_info(dev->dev, "WM Firmware Version: %.10s, Build Time: %.15s\n", 3023 hdr->fw_ver, hdr->build_date); 3024 3025 ret = mt76_connac_mcu_send_ram_firmware(dev, hdr, fw->data, false); 3026 if (ret) { 3027 dev_err(dev->dev, "Failed to start WM firmware\n"); 3028 goto out; 3029 } 3030 3031 snprintf(dev->hw->wiphy->fw_version, 3032 sizeof(dev->hw->wiphy->fw_version), 3033 "%.10s-%.15s", hdr->fw_ver, hdr->build_date); 3034 3035 release_firmware(fw); 3036 3037 if (!fw_wa) 3038 return 0; 3039 3040 ret = request_firmware(&fw, fw_wa, dev->dev); 3041 if (ret) 3042 return ret; 3043 3044 if (!fw || !fw->data || fw->size < sizeof(*hdr)) { 3045 dev_err(dev->dev, "Invalid firmware\n"); 3046 ret = -EINVAL; 3047 goto out; 3048 } 3049 3050 hdr = (const void *)(fw->data + fw->size - sizeof(*hdr)); 3051 dev_info(dev->dev, "WA Firmware Version: %.10s, Build Time: %.15s\n", 3052 hdr->fw_ver, hdr->build_date); 3053 3054 ret = mt76_connac_mcu_send_ram_firmware(dev, hdr, fw->data, true); 3055 if (ret) { 3056 dev_err(dev->dev, "Failed to start WA firmware\n"); 3057 goto out; 3058 } 3059 3060 snprintf(dev->hw->wiphy->fw_version, 3061 sizeof(dev->hw->wiphy->fw_version), 3062 "%.10s-%.15s", hdr->fw_ver, hdr->build_date); 3063 3064 out: 3065 release_firmware(fw); 3066 3067 return ret; 3068 } 3069 EXPORT_SYMBOL_GPL(mt76_connac2_load_ram); 3070 3071 static u32 mt76_connac2_get_data_mode(struct mt76_dev *dev, u32 info) 3072 { 3073 u32 mode = DL_MODE_NEED_RSP; 3074 3075 if ((!is_mt7921(dev) && !is_mt7925(dev)) || info == PATCH_SEC_NOT_SUPPORT) 3076 return mode; 3077 3078 switch (FIELD_GET(PATCH_SEC_ENC_TYPE_MASK, info)) { 3079 case PATCH_SEC_ENC_TYPE_PLAIN: 3080 break; 3081 case PATCH_SEC_ENC_TYPE_AES: 3082 mode |= DL_MODE_ENCRYPT; 3083 mode |= FIELD_PREP(DL_MODE_KEY_IDX, 3084 (info & PATCH_SEC_ENC_AES_KEY_MASK)) & DL_MODE_KEY_IDX; 3085 mode |= DL_MODE_RESET_SEC_IV; 3086 break; 3087 case PATCH_SEC_ENC_TYPE_SCRAMBLE: 3088 mode |= DL_MODE_ENCRYPT; 3089 mode |= DL_CONFIG_ENCRY_MODE_SEL; 3090 mode |= DL_MODE_RESET_SEC_IV; 3091 break; 3092 default: 3093 dev_err(dev->dev, "Encryption type not support!\n"); 3094 } 3095 3096 return mode; 3097 } 3098 3099 int mt76_connac2_load_patch(struct mt76_dev *dev, const char *fw_name) 3100 { 3101 int i, ret, sem, max_len = mt76_is_sdio(dev) ? 2048 : 4096; 3102 const struct mt76_connac2_patch_hdr *hdr; 3103 const struct firmware *fw = NULL; 3104 3105 sem = mt76_connac_mcu_patch_sem_ctrl(dev, true); 3106 switch (sem) { 3107 case PATCH_IS_DL: 3108 return 0; 3109 case PATCH_NOT_DL_SEM_SUCCESS: 3110 break; 3111 default: 3112 dev_err(dev->dev, "Failed to get patch semaphore\n"); 3113 return -EAGAIN; 3114 } 3115 3116 ret = request_firmware(&fw, fw_name, dev->dev); 3117 if (ret) 3118 goto out; 3119 3120 if (!fw || !fw->data || fw->size < sizeof(*hdr)) { 3121 dev_err(dev->dev, "Invalid firmware\n"); 3122 ret = -EINVAL; 3123 goto out; 3124 } 3125 3126 hdr = (const void *)fw->data; 3127 dev_info(dev->dev, "HW/SW Version: 0x%x, Build Time: %.16s\n", 3128 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date); 3129 3130 for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) { 3131 struct mt76_connac2_patch_sec *sec; 3132 u32 len, addr, mode; 3133 const u8 *dl; 3134 u32 sec_info; 3135 3136 sec = (void *)(fw->data + sizeof(*hdr) + i * sizeof(*sec)); 3137 if ((be32_to_cpu(sec->type) & PATCH_SEC_TYPE_MASK) != 3138 PATCH_SEC_TYPE_INFO) { 3139 ret = -EINVAL; 3140 goto out; 3141 } 3142 3143 addr = be32_to_cpu(sec->info.addr); 3144 len = be32_to_cpu(sec->info.len); 3145 dl = fw->data + be32_to_cpu(sec->offs); 3146 sec_info = be32_to_cpu(sec->info.sec_key_idx); 3147 mode = mt76_connac2_get_data_mode(dev, sec_info); 3148 3149 ret = mt76_connac_mcu_init_download(dev, addr, len, mode); 3150 if (ret) { 3151 dev_err(dev->dev, "Download request failed\n"); 3152 goto out; 3153 } 3154 3155 ret = __mt76_mcu_send_firmware(dev, MCU_CMD(FW_SCATTER), 3156 dl, len, max_len); 3157 if (ret) { 3158 dev_err(dev->dev, "Failed to send patch\n"); 3159 goto out; 3160 } 3161 } 3162 3163 ret = mt76_connac_mcu_start_patch(dev); 3164 if (ret) 3165 dev_err(dev->dev, "Failed to start patch\n"); 3166 3167 out: 3168 sem = mt76_connac_mcu_patch_sem_ctrl(dev, false); 3169 switch (sem) { 3170 case PATCH_REL_SEM_SUCCESS: 3171 break; 3172 default: 3173 ret = -EAGAIN; 3174 dev_err(dev->dev, "Failed to release patch semaphore\n"); 3175 break; 3176 } 3177 3178 release_firmware(fw); 3179 3180 return ret; 3181 } 3182 EXPORT_SYMBOL_GPL(mt76_connac2_load_patch); 3183 3184 int mt76_connac2_mcu_fill_message(struct mt76_dev *dev, struct sk_buff *skb, 3185 int cmd, int *wait_seq) 3186 { 3187 int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd); 3188 struct mt76_connac2_mcu_uni_txd *uni_txd; 3189 struct mt76_connac2_mcu_txd *mcu_txd; 3190 __le32 *txd; 3191 u32 val; 3192 u8 seq; 3193 3194 /* TODO: make dynamic based on msg type */ 3195 dev->mcu.timeout = 20 * HZ; 3196 3197 seq = ++dev->mcu.msg_seq & 0xf; 3198 if (!seq) 3199 seq = ++dev->mcu.msg_seq & 0xf; 3200 3201 if (cmd == MCU_CMD(FW_SCATTER)) 3202 goto exit; 3203 3204 txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd); 3205 txd = (__le32 *)skb_push(skb, txd_len); 3206 3207 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) | 3208 FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) | 3209 FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0); 3210 txd[0] = cpu_to_le32(val); 3211 3212 val = MT_TXD1_LONG_FORMAT | 3213 FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD); 3214 txd[1] = cpu_to_le32(val); 3215 3216 if (cmd & __MCU_CMD_FIELD_UNI) { 3217 uni_txd = (struct mt76_connac2_mcu_uni_txd *)txd; 3218 uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd)); 3219 uni_txd->option = MCU_CMD_UNI_EXT_ACK; 3220 uni_txd->cid = cpu_to_le16(mcu_cmd); 3221 uni_txd->s2d_index = MCU_S2D_H2N; 3222 uni_txd->pkt_type = MCU_PKT_ID; 3223 uni_txd->seq = seq; 3224 3225 goto exit; 3226 } 3227 3228 mcu_txd = (struct mt76_connac2_mcu_txd *)txd; 3229 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd)); 3230 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU, 3231 MT_TX_MCU_PORT_RX_Q0)); 3232 mcu_txd->pkt_type = MCU_PKT_ID; 3233 mcu_txd->seq = seq; 3234 mcu_txd->cid = mcu_cmd; 3235 mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd); 3236 3237 if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) { 3238 if (cmd & __MCU_CMD_FIELD_QUERY) 3239 mcu_txd->set_query = MCU_Q_QUERY; 3240 else 3241 mcu_txd->set_query = MCU_Q_SET; 3242 mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid; 3243 } else { 3244 mcu_txd->set_query = MCU_Q_NA; 3245 } 3246 3247 if (cmd & __MCU_CMD_FIELD_WA) 3248 mcu_txd->s2d_index = MCU_S2D_H2C; 3249 else 3250 mcu_txd->s2d_index = MCU_S2D_H2N; 3251 3252 exit: 3253 if (wait_seq) 3254 *wait_seq = seq; 3255 3256 return 0; 3257 } 3258 EXPORT_SYMBOL_GPL(mt76_connac2_mcu_fill_message); 3259 3260 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 3261 MODULE_DESCRIPTION("MediaTek MT76x connac layer helpers"); 3262 MODULE_LICENSE("Dual BSD/GPL"); 3263