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