Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'mt76-for-kvalo-2021-10-20' of https://github.com/nbd168/wireless

mt76 patches for 5.16

* various bugfixes
* endian fixes
* mt7921 aspm support
* cleanup
* mt7921 testmode support
* rate handling fixes
* tx status fixes/improvements
* mt7921 power management improvements
* mt7915 LED support
* DBDC fixes
* mt7921 6GHz support
* support for eeprom data in DT
* mt7915 TWT support
* mt7915 txbf + MU-MIMO improvements

# gpg: Signature made Wed 20 Oct 2021 12:24:46 PM EEST
# gpg: using DSA key D77D141D02A76EF5
# gpg: Good signature from "Felix Fietkau <nbd@nbd.name>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg: There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 75D1 1A7D 91A7 710F 4900 42EF D77D 141D 02A7 6EF5

+6144 -2569
+5
Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
··· 47 47 48 48 ieee80211-freq-limit: true 49 49 50 + mediatek,eeprom-data: 51 + $ref: /schemas/types.yaml#/definitions/uint32-array 52 + description: 53 + EEPROM data embedded as array. 54 + 50 55 mediatek,mtd-eeprom: 51 56 $ref: /schemas/types.yaml#/definitions/phandle-array 52 57 description:
+1 -1
drivers/net/wireless/mediatek/mt76/Makefile
··· 14 14 mt76-$(CONFIG_NL80211_TESTMODE) += testmode.o 15 15 16 16 mt76-usb-y := usb.o usb_trace.o 17 - mt76-sdio-y := sdio.o 17 + mt76-sdio-y := sdio.o sdio_txrx.o 18 18 19 19 CFLAGS_trace.o := -I$(src) 20 20 CFLAGS_usb_trace.o := -I$(src)
+13 -9
drivers/net/wireless/mediatek/mt76/debugfs.c
··· 56 56 struct mt76_dev *dev = dev_get_drvdata(s->private); 57 57 int i; 58 58 59 + seq_puts(s, " queue | hw-queued | head | tail |\n"); 59 60 for (i = 0; i < ARRAY_SIZE(dev->phy.q_tx); i++) { 60 61 struct mt76_queue *q = dev->phy.q_tx[i]; 61 62 62 63 if (!q) 63 64 continue; 64 65 65 - seq_printf(s, 66 - "%d: queued=%d head=%d tail=%d\n", 66 + seq_printf(s, " %9d | %9d | %9d | %9d |\n", 67 67 i, q->queued, q->head, q->tail); 68 68 } 69 69 ··· 76 76 struct mt76_dev *dev = dev_get_drvdata(s->private); 77 77 int i, queued; 78 78 79 + seq_puts(s, " queue | hw-queued | head | tail |\n"); 79 80 mt76_for_each_q_rx(dev, i) { 80 81 struct mt76_queue *q = &dev->q_rx[i]; 81 82 82 83 queued = mt76_is_usb(dev) ? q->ndesc - q->queued : q->queued; 83 - seq_printf(s, "%d: queued=%d head=%d tail=%d\n", 84 - i, queued, q->head, q->tail); 84 + seq_printf(s, " %9d | %9d | %9d | %9d |\n", 85 + i, q->queued, q->head, q->tail); 85 86 } 86 87 87 88 return 0; ··· 117 116 return 0; 118 117 } 119 118 120 - struct dentry *mt76_register_debugfs(struct mt76_dev *dev) 119 + struct dentry * 120 + mt76_register_debugfs_fops(struct mt76_phy *phy, 121 + const struct file_operations *ops) 121 122 { 123 + const struct file_operations *fops = ops ? ops : &fops_regval; 124 + struct mt76_dev *dev = phy->dev; 122 125 struct dentry *dir; 123 126 124 - dir = debugfs_create_dir("mt76", dev->hw->wiphy->debugfsdir); 127 + dir = debugfs_create_dir("mt76", phy->hw->wiphy->debugfsdir); 125 128 if (!dir) 126 129 return NULL; 127 130 128 131 debugfs_create_u8("led_pin", 0600, dir, &dev->led_pin); 129 132 debugfs_create_u32("regidx", 0600, dir, &dev->debugfs_reg); 130 - debugfs_create_file_unsafe("regval", 0600, dir, dev, 131 - &fops_regval); 133 + debugfs_create_file_unsafe("regval", 0600, dir, dev, fops); 132 134 debugfs_create_file_unsafe("napi_threaded", 0600, dir, dev, 133 135 &fops_napi_threaded); 134 136 debugfs_create_blob("eeprom", 0400, dir, &dev->eeprom); ··· 144 140 145 141 return dir; 146 142 } 147 - EXPORT_SYMBOL_GPL(mt76_register_debugfs); 143 + EXPORT_SYMBOL_GPL(mt76_register_debugfs_fops);
+14
drivers/net/wireless/mediatek/mt76/eeprom.c
··· 15 15 struct device_node *np = dev->dev->of_node; 16 16 struct mtd_info *mtd; 17 17 const __be32 *list; 18 + const void *data; 18 19 const char *part; 19 20 phandle phandle; 20 21 int size; ··· 24 23 25 24 if (!np) 26 25 return -ENOENT; 26 + 27 + data = of_get_property(np, "mediatek,eeprom-data", &size); 28 + if (data) { 29 + if (size > len) 30 + return -EINVAL; 31 + 32 + memcpy(eep, data, size); 33 + 34 + return 0; 35 + } 27 36 28 37 list = of_get_property(np, "mediatek,mtd-eeprom", &size); 29 38 if (!list) ··· 295 284 break; 296 285 case NL80211_BAND_5GHZ: 297 286 band = '5'; 287 + break; 288 + case NL80211_BAND_6GHZ: 289 + band = '6'; 298 290 break; 299 291 default: 300 292 return target_power;
+221 -21
drivers/net/wireless/mediatek/mt76/mac80211.c
··· 20 20 .max_power = 30, \ 21 21 } 22 22 23 + #define CHAN6G(_idx, _freq) { \ 24 + .band = NL80211_BAND_6GHZ, \ 25 + .center_freq = (_freq), \ 26 + .hw_value = (_idx), \ 27 + .max_power = 30, \ 28 + } 29 + 23 30 static const struct ieee80211_channel mt76_channels_2ghz[] = { 24 31 CHAN2G(1, 2412), 25 32 CHAN2G(2, 2417), ··· 77 70 CHAN5G(173, 5865), 78 71 }; 79 72 73 + static const struct ieee80211_channel mt76_channels_6ghz[] = { 74 + /* UNII-5 */ 75 + CHAN6G(1, 5955), 76 + CHAN6G(5, 5975), 77 + CHAN6G(9, 5995), 78 + CHAN6G(13, 6015), 79 + CHAN6G(17, 6035), 80 + CHAN6G(21, 6055), 81 + CHAN6G(25, 6075), 82 + CHAN6G(29, 6095), 83 + CHAN6G(33, 6115), 84 + CHAN6G(37, 6135), 85 + CHAN6G(41, 6155), 86 + CHAN6G(45, 6175), 87 + CHAN6G(49, 6195), 88 + CHAN6G(53, 6215), 89 + CHAN6G(57, 6235), 90 + CHAN6G(61, 6255), 91 + CHAN6G(65, 6275), 92 + CHAN6G(69, 6295), 93 + CHAN6G(73, 6315), 94 + CHAN6G(77, 6335), 95 + CHAN6G(81, 6355), 96 + CHAN6G(85, 6375), 97 + CHAN6G(89, 6395), 98 + CHAN6G(93, 6415), 99 + /* UNII-6 */ 100 + CHAN6G(97, 6435), 101 + CHAN6G(101, 6455), 102 + CHAN6G(105, 6475), 103 + CHAN6G(109, 6495), 104 + CHAN6G(113, 6515), 105 + CHAN6G(117, 6535), 106 + /* UNII-7 */ 107 + CHAN6G(121, 6555), 108 + CHAN6G(125, 6575), 109 + CHAN6G(129, 6595), 110 + CHAN6G(133, 6615), 111 + CHAN6G(137, 6635), 112 + CHAN6G(141, 6655), 113 + CHAN6G(145, 6675), 114 + CHAN6G(149, 6695), 115 + CHAN6G(153, 6715), 116 + CHAN6G(157, 6735), 117 + CHAN6G(161, 6755), 118 + CHAN6G(165, 6775), 119 + CHAN6G(169, 6795), 120 + CHAN6G(173, 6815), 121 + CHAN6G(177, 6835), 122 + CHAN6G(181, 6855), 123 + CHAN6G(185, 6875), 124 + /* UNII-8 */ 125 + CHAN6G(189, 6895), 126 + CHAN6G(193, 6915), 127 + CHAN6G(197, 6935), 128 + CHAN6G(201, 6955), 129 + CHAN6G(205, 6975), 130 + CHAN6G(209, 6995), 131 + CHAN6G(213, 7015), 132 + CHAN6G(217, 7035), 133 + CHAN6G(221, 7055), 134 + CHAN6G(225, 7075), 135 + CHAN6G(229, 7095), 136 + CHAN6G(233, 7115), 137 + }; 138 + 80 139 static const struct ieee80211_tpt_blink mt76_tpt_blink[] = { 81 140 { .throughput = 0 * 1024, .blink_time = 334 }, 82 141 { .throughput = 1 * 1024, .blink_time = 260 }, ··· 171 98 OFDM_RATE(12, 540), 172 99 }; 173 100 EXPORT_SYMBOL_GPL(mt76_rates); 101 + 102 + static const struct cfg80211_sar_freq_ranges mt76_sar_freq_ranges[] = { 103 + { .start_freq = 2402, .end_freq = 2494, }, 104 + { .start_freq = 5150, .end_freq = 5350, }, 105 + { .start_freq = 5350, .end_freq = 5470, }, 106 + { .start_freq = 5470, .end_freq = 5725, }, 107 + { .start_freq = 5725, .end_freq = 5950, }, 108 + }; 109 + 110 + const struct cfg80211_sar_capa mt76_sar_capa = { 111 + .type = NL80211_SAR_TYPE_POWER, 112 + .num_freq_ranges = ARRAY_SIZE(mt76_sar_freq_ranges), 113 + .freq_ranges = &mt76_sar_freq_ranges[0], 114 + }; 115 + EXPORT_SYMBOL_GPL(mt76_sar_capa); 174 116 175 117 static int mt76_led_init(struct mt76_dev *dev) 176 118 { ··· 267 179 mt76_init_stream_cap(phy, &phy->sband_2g.sband, false); 268 180 if (phy->cap.has_5ghz) 269 181 mt76_init_stream_cap(phy, &phy->sband_5g.sband, vht); 182 + if (phy->cap.has_6ghz) 183 + mt76_init_stream_cap(phy, &phy->sband_6g.sband, vht); 270 184 } 271 185 EXPORT_SYMBOL_GPL(mt76_set_stream_caps); 272 186 273 187 static int 274 188 mt76_init_sband(struct mt76_phy *phy, struct mt76_sband *msband, 275 189 const struct ieee80211_channel *chan, int n_chan, 276 - struct ieee80211_rate *rates, int n_rates, bool vht) 190 + struct ieee80211_rate *rates, int n_rates, 191 + bool ht, bool vht) 277 192 { 278 193 struct ieee80211_supported_band *sband = &msband->sband; 279 194 struct ieee80211_sta_vht_cap *vht_cap; ··· 299 208 sband->n_channels = n_chan; 300 209 sband->bitrates = rates; 301 210 sband->n_bitrates = n_rates; 211 + 212 + if (!ht) 213 + return 0; 302 214 303 215 ht_cap = &sband->ht_cap; 304 216 ht_cap->ht_supported = true; ··· 339 245 340 246 return mt76_init_sband(phy, &phy->sband_2g, mt76_channels_2ghz, 341 247 ARRAY_SIZE(mt76_channels_2ghz), rates, 342 - n_rates, false); 248 + n_rates, true, false); 343 249 } 344 250 345 251 static int ··· 350 256 351 257 return mt76_init_sband(phy, &phy->sband_5g, mt76_channels_5ghz, 352 258 ARRAY_SIZE(mt76_channels_5ghz), rates, 353 - n_rates, vht); 259 + n_rates, true, vht); 260 + } 261 + 262 + static int 263 + mt76_init_sband_6g(struct mt76_phy *phy, struct ieee80211_rate *rates, 264 + int n_rates) 265 + { 266 + phy->hw->wiphy->bands[NL80211_BAND_6GHZ] = &phy->sband_6g.sband; 267 + 268 + return mt76_init_sband(phy, &phy->sband_6g, mt76_channels_6ghz, 269 + ARRAY_SIZE(mt76_channels_6ghz), rates, 270 + n_rates, false, false); 354 271 } 355 272 356 273 static void ··· 427 322 ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS); 428 323 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU); 429 324 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER); 430 - 431 - if (!(dev->drv->drv_flags & MT_DRV_AMSDU_OFFLOAD)) { 432 - ieee80211_hw_set(hw, TX_AMSDU); 433 - ieee80211_hw_set(hw, TX_FRAG_LIST); 434 - } 435 - 325 + ieee80211_hw_set(hw, TX_AMSDU); 326 + ieee80211_hw_set(hw, TX_FRAG_LIST); 436 327 ieee80211_hw_set(hw, MFP_CAPABLE); 437 328 ieee80211_hw_set(hw, AP_LINK_PS); 438 329 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS); ··· 486 385 return ret; 487 386 } 488 387 388 + if (phy->cap.has_6ghz) { 389 + ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4); 390 + if (ret) 391 + return ret; 392 + } 393 + 489 394 wiphy_read_of_freq_limits(phy->hw->wiphy); 490 395 mt76_check_sband(phy, &phy->sband_2g, NL80211_BAND_2GHZ); 491 396 mt76_check_sband(phy, &phy->sband_5g, NL80211_BAND_5GHZ); 397 + mt76_check_sband(phy, &phy->sband_6g, NL80211_BAND_6GHZ); 492 398 493 399 ret = ieee80211_register_hw(phy->hw); 494 400 if (ret) ··· 511 403 { 512 404 struct mt76_dev *dev = phy->dev; 513 405 514 - mt76_tx_status_check(dev, NULL, true); 406 + mt76_tx_status_check(dev, true); 515 407 ieee80211_unregister_hw(phy->hw); 516 408 dev->phy2 = NULL; 517 409 } ··· 543 435 spin_lock_init(&dev->rx_lock); 544 436 spin_lock_init(&dev->lock); 545 437 spin_lock_init(&dev->cc_lock); 438 + spin_lock_init(&dev->status_lock); 546 439 mutex_init(&dev->mutex); 547 440 init_waitqueue_head(&dev->tx_wait); 548 - skb_queue_head_init(&dev->status_list); 549 441 550 442 skb_queue_head_init(&dev->mcu.res_q); 551 443 init_waitqueue_head(&dev->mcu.wait); ··· 565 457 566 458 spin_lock_init(&dev->token_lock); 567 459 idr_init(&dev->token); 460 + 461 + INIT_LIST_HEAD(&dev->wcid_list); 568 462 569 463 INIT_LIST_HEAD(&dev->txwi_cache); 570 464 ··· 605 495 return ret; 606 496 } 607 497 498 + if (phy->cap.has_6ghz) { 499 + ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4); 500 + if (ret) 501 + return ret; 502 + } 503 + 608 504 wiphy_read_of_freq_limits(hw->wiphy); 609 505 mt76_check_sband(&dev->phy, &phy->sband_2g, NL80211_BAND_2GHZ); 610 506 mt76_check_sband(&dev->phy, &phy->sband_5g, NL80211_BAND_5GHZ); 507 + mt76_check_sband(&dev->phy, &phy->sband_6g, NL80211_BAND_6GHZ); 611 508 612 509 if (IS_ENABLED(CONFIG_MT76_LEDS)) { 613 510 ret = mt76_led_init(dev); ··· 639 522 640 523 if (IS_ENABLED(CONFIG_MT76_LEDS)) 641 524 mt76_led_cleanup(dev); 642 - mt76_tx_status_check(dev, NULL, true); 525 + mt76_tx_status_check(dev, true); 643 526 ieee80211_unregister_hw(hw); 644 527 } 645 528 EXPORT_SYMBOL_GPL(mt76_unregister_device); ··· 759 642 760 643 if (c->band == NL80211_BAND_2GHZ) 761 644 msband = &phy->sband_2g; 645 + else if (c->band == NL80211_BAND_6GHZ) 646 + msband = &phy->sband_6g; 762 647 else 763 648 msband = &phy->sband_5g; 764 649 ··· 836 717 if (idx == 0 && dev->drv->update_survey) 837 718 mt76_update_survey(phy); 838 719 839 - sband = &phy->sband_2g; 840 - if (idx >= sband->sband.n_channels) { 841 - idx -= sband->sband.n_channels; 720 + if (idx >= phy->sband_2g.sband.n_channels + 721 + phy->sband_5g.sband.n_channels) { 722 + idx -= (phy->sband_2g.sband.n_channels + 723 + phy->sband_5g.sband.n_channels); 724 + sband = &phy->sband_6g; 725 + } else if (idx >= phy->sband_2g.sband.n_channels) { 726 + idx -= phy->sband_2g.sband.n_channels; 842 727 sband = &phy->sband_5g; 728 + } else { 729 + sband = &phy->sband_2g; 843 730 } 844 731 845 732 if (idx >= sband->sband.n_channels) { ··· 902 777 return; 903 778 904 779 wcid->rx_check_pn = true; 780 + 781 + /* data frame */ 905 782 for (i = 0; i < IEEE80211_NUM_TIDS; i++) { 906 783 ieee80211_get_key_rx_seq(key, i, &seq); 907 784 memcpy(wcid->rx_key_pn[i], seq.ccmp.pn, sizeof(seq.ccmp.pn)); 908 785 } 786 + 787 + /* robust management frame */ 788 + ieee80211_get_key_rx_seq(key, -1, &seq); 789 + memcpy(wcid->rx_key_pn[i], seq.ccmp.pn, sizeof(seq.ccmp.pn)); 790 + 909 791 } 910 792 EXPORT_SYMBOL(mt76_wcid_key_setup); 911 793 ··· 922 790 struct ieee80211_sta **sta) 923 791 { 924 792 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 793 + struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb); 925 794 struct mt76_rx_status mstat; 926 795 927 796 mstat = *((struct mt76_rx_status *)skb->cb); ··· 945 812 status->device_timestamp = mstat.timestamp; 946 813 status->mactime = mstat.timestamp; 947 814 815 + if (ieee80211_is_beacon(hdr->frame_control) || 816 + ieee80211_is_probe_resp(hdr->frame_control)) 817 + status->boottime_ns = ktime_get_boottime_ns(); 818 + 948 819 BUILD_BUG_ON(sizeof(mstat) > sizeof(skb->cb)); 949 820 BUILD_BUG_ON(sizeof(status->chain_signal) != 950 821 sizeof(mstat.chain_signal)); ··· 965 828 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; 966 829 struct mt76_wcid *wcid = status->wcid; 967 830 struct ieee80211_hdr *hdr; 968 - u8 tidno = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK; 831 + int security_idx; 969 832 int ret; 970 833 971 834 if (!(status->flag & RX_FLAG_DECRYPTED)) ··· 974 837 if (!wcid || !wcid->rx_check_pn) 975 838 return 0; 976 839 840 + security_idx = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK; 841 + if (status->flag & RX_FLAG_8023) 842 + goto skip_hdr_check; 843 + 844 + hdr = mt76_skb_get_hdr(skb); 977 845 if (!(status->flag & RX_FLAG_IV_STRIPPED)) { 978 846 /* 979 847 * Validate the first fragment both here and in mac80211 980 848 * All further fragments will be validated by mac80211 only. 981 849 */ 982 - hdr = mt76_skb_get_hdr(skb); 983 850 if (ieee80211_is_frag(hdr) && 984 851 !ieee80211_is_first_frag(hdr->frame_control)) 985 852 return 0; 986 853 } 987 854 855 + /* IEEE 802.11-2020, 12.5.3.4.4 "PN and replay detection" c): 856 + * 857 + * the recipient shall maintain a single replay counter for received 858 + * individually addressed robust Management frames that are received 859 + * with the To DS subfield equal to 0, [...] 860 + */ 861 + if (ieee80211_is_mgmt(hdr->frame_control) && 862 + !ieee80211_has_tods(hdr->frame_control)) 863 + security_idx = IEEE80211_NUM_TIDS; 864 + 865 + skip_hdr_check: 988 866 BUILD_BUG_ON(sizeof(status->iv) != sizeof(wcid->rx_key_pn[0])); 989 - ret = memcmp(status->iv, wcid->rx_key_pn[tidno], 867 + ret = memcmp(status->iv, wcid->rx_key_pn[security_idx], 990 868 sizeof(status->iv)); 991 869 if (ret <= 0) 992 870 return -EINVAL; /* replay */ 993 871 994 - memcpy(wcid->rx_key_pn[tidno], status->iv, sizeof(status->iv)); 872 + memcpy(wcid->rx_key_pn[security_idx], status->iv, sizeof(status->iv)); 995 873 996 874 if (status->flag & RX_FLAG_IV_STRIPPED) 997 875 status->flag |= RX_FLAG_PN_VALIDATED; ··· 1261 1109 wcid->ext_phy = ext_phy; 1262 1110 rcu_assign_pointer(dev->wcid[wcid->idx], wcid); 1263 1111 1112 + mt76_packet_id_init(wcid); 1264 1113 out: 1265 1114 mutex_unlock(&dev->mutex); 1266 1115 ··· 1280 1127 if (dev->drv->sta_remove) 1281 1128 dev->drv->sta_remove(dev, vif, sta); 1282 1129 1283 - mt76_tx_status_check(dev, wcid, true); 1130 + mt76_packet_id_flush(dev, wcid); 1131 + 1284 1132 mt76_wcid_mask_clear(dev->wcid_mask, idx); 1285 1133 mt76_wcid_mask_clear(dev->wcid_phy_mask, idx); 1286 1134 } ··· 1424 1270 int i, offset = 0, len = sband->n_bitrates; 1425 1271 1426 1272 if (cck) { 1427 - if (sband == &dev->phy.sband_5g.sband) 1273 + if (sband != &dev->phy.sband_2g.sband) 1428 1274 return 0; 1429 1275 1430 1276 idx &= ~BIT(2); /* short preamble */ ··· 1490 1336 return hwq; 1491 1337 } 1492 1338 EXPORT_SYMBOL_GPL(mt76_init_queue); 1339 + 1340 + u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx) 1341 + { 1342 + int offset = 0; 1343 + struct ieee80211_rate *rate; 1344 + 1345 + if (phy->chandef.chan->band != NL80211_BAND_2GHZ) 1346 + offset = 4; 1347 + 1348 + /* pick the lowest rate for hidden nodes */ 1349 + if (rateidx < 0) 1350 + rateidx = 0; 1351 + 1352 + rate = &mt76_rates[offset + rateidx]; 1353 + 1354 + return rate->hw_value; 1355 + } 1356 + EXPORT_SYMBOL_GPL(mt76_calculate_default_rate); 1357 + 1358 + void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi, 1359 + struct mt76_sta_stats *stats) 1360 + { 1361 + int i, ei = wi->initial_stat_idx; 1362 + u64 *data = wi->data; 1363 + 1364 + wi->sta_count++; 1365 + 1366 + data[ei++] += stats->tx_mode[MT_PHY_TYPE_CCK]; 1367 + data[ei++] += stats->tx_mode[MT_PHY_TYPE_OFDM]; 1368 + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HT]; 1369 + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HT_GF]; 1370 + data[ei++] += stats->tx_mode[MT_PHY_TYPE_VHT]; 1371 + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_SU]; 1372 + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_EXT_SU]; 1373 + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_TB]; 1374 + data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_MU]; 1375 + 1376 + for (i = 0; i < ARRAY_SIZE(stats->tx_bw); i++) 1377 + data[ei++] += stats->tx_bw[i]; 1378 + 1379 + for (i = 0; i < 12; i++) 1380 + data[ei++] += stats->tx_mcs[i]; 1381 + 1382 + wi->worker_stat_count = ei - wi->initial_stat_idx; 1383 + } 1384 + EXPORT_SYMBOL_GPL(mt76_ethtool_worker);
+4 -4
drivers/net/wireless/mediatek/mt76/mcu.c
··· 106 106 } 107 107 EXPORT_SYMBOL_GPL(mt76_mcu_skb_send_and_get_msg); 108 108 109 - int mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, 110 - int len) 109 + int __mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, 110 + int len, int max_len) 111 111 { 112 112 int err, cur_len; 113 113 114 114 while (len > 0) { 115 - cur_len = min_t(int, 4096 - dev->mcu_ops->headroom, len); 115 + cur_len = min_t(int, max_len, len); 116 116 117 117 err = mt76_mcu_send_msg(dev, cmd, data, cur_len, false); 118 118 if (err) ··· 129 129 130 130 return 0; 131 131 } 132 - EXPORT_SYMBOL_GPL(mt76_mcu_send_firmware); 132 + EXPORT_SYMBOL_GPL(__mt76_mcu_send_firmware);
+106 -22
drivers/net/wireless/mediatek/mt76/mt76.h
··· 29 29 struct mt76_dev; 30 30 struct mt76_phy; 31 31 struct mt76_wcid; 32 + struct mt76s_intr; 32 33 33 34 struct mt76_reg_pair { 34 35 u32 reg; ··· 245 244 struct ewma_signal rssi; 246 245 int inactive_count; 247 246 247 + struct rate_info rate; 248 + 248 249 u16 idx; 249 250 u8 hw_key_idx; 250 251 u8 hw_key_idx2; ··· 256 253 u8 amsdu:1; 257 254 258 255 u8 rx_check_pn; 259 - u8 rx_key_pn[IEEE80211_NUM_TIDS][6]; 256 + u8 rx_key_pn[IEEE80211_NUM_TIDS + 1][6]; 260 257 u16 cipher; 261 258 262 259 u32 tx_info; 263 260 bool sw_iv; 264 261 265 - u8 packet_id; 262 + struct list_head list; 263 + struct idr pktid; 266 264 }; 267 265 268 266 struct mt76_txq { ··· 309 305 #define MT_PACKET_ID_NO_SKB 1 310 306 #define MT_PACKET_ID_FIRST 2 311 307 #define MT_PACKET_ID_HAS_RATE BIT(7) 312 - 313 - #define MT_TX_STATUS_SKB_TIMEOUT HZ 308 + /* This is timer for when to give up when waiting for TXS callback, 309 + * with starting time being the time at which the DMA_DONE callback 310 + * was seen (so, we know packet was processed then, it should not take 311 + * long after that for firmware to send the TXS callback if it is going 312 + * to do so.) 313 + */ 314 + #define MT_TX_STATUS_SKB_TIMEOUT (HZ / 4) 314 315 315 316 struct mt76_tx_cb { 316 317 unsigned long jiffies; ··· 353 344 #define MT_DRV_SW_RX_AIRTIME BIT(2) 354 345 #define MT_DRV_RX_DMA_HDR BIT(3) 355 346 #define MT_DRV_HW_MGMT_TXQ BIT(4) 356 - #define MT_DRV_AMSDU_OFFLOAD BIT(5) 357 347 358 348 struct mt76_driver_ops { 359 349 u32 drv_flags; ··· 506 498 507 499 struct sdio_func *func; 508 500 void *intr_data; 501 + u8 hw_ver; 502 + wait_queue_head_t wait; 509 503 510 504 struct { 511 505 int pse_data_quota; 512 506 int ple_data_quota; 513 507 int pse_mcu_quota; 508 + int pse_page_size; 514 509 int deficit; 515 510 } sched; 511 + 512 + int (*parse_irq)(struct mt76_dev *dev, struct mt76s_intr *intr); 516 513 }; 517 514 518 515 struct mt76_mmio { ··· 556 543 s8 signal; 557 544 u8 chains; 558 545 s8 chain_signal[IEEE80211_MAX_CHAINS]; 546 + }; 547 + 548 + struct mt76_freq_range_power { 549 + const struct cfg80211_sar_freq_ranges *range; 550 + s8 power; 559 551 }; 560 552 561 553 struct mt76_testmode_ops { ··· 635 617 struct mt76_hw_cap cap; 636 618 struct mt76_sband sband_2g; 637 619 struct mt76_sband sband_5g; 620 + struct mt76_sband sband_6g; 638 621 639 622 u8 macaddr[ETH_ALEN]; 640 623 ··· 655 636 struct sk_buff **tail; 656 637 u16 seqno; 657 638 } rx_amsdu[__MT_RXQ_MAX]; 639 + 640 + struct mt76_freq_range_power *frp; 658 641 }; 659 642 660 643 struct mt76_dev { ··· 704 683 int token_count; 705 684 706 685 wait_queue_head_t tx_wait; 707 - struct sk_buff_head status_list; 686 + /* spinclock used to protect wcid pktid linked list */ 687 + spinlock_t status_lock; 708 688 709 689 u32 wcid_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; 710 690 u32 wcid_phy_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; ··· 714 692 715 693 struct mt76_wcid global_wcid; 716 694 struct mt76_wcid __rcu *wcid[MT76_N_WCIDS]; 695 + struct list_head wcid_list; 717 696 718 697 u32 rev; 719 698 ··· 776 753 MT_PHY_TYPE_HE_EXT_SU, 777 754 MT_PHY_TYPE_HE_TB, 778 755 MT_PHY_TYPE_HE_MU, 756 + __MT_PHY_TYPE_HE_MAX, 757 + }; 758 + 759 + struct mt76_sta_stats { 760 + u64 tx_mode[__MT_PHY_TYPE_HE_MAX]; 761 + u64 tx_bw[4]; /* 20, 40, 80, 160 */ 762 + u64 tx_nss[4]; /* 1, 2, 3, 4 */ 763 + u64 tx_mcs[16]; /* mcs idx */ 764 + }; 765 + 766 + struct mt76_ethtool_worker_info { 767 + u64 *data; 768 + int idx; 769 + int initial_stat_idx; 770 + int worker_stat_count; 771 + int sta_count; 779 772 }; 780 773 781 774 #define CCK_RATE(_idx, _rate) { \ ··· 808 769 } 809 770 810 771 extern struct ieee80211_rate mt76_rates[12]; 772 + extern const struct cfg80211_sar_capa mt76_sar_capa; 811 773 812 774 #define __mt76_rr(dev, ...) (dev)->bus->rr((dev), __VA_ARGS__) 813 775 #define __mt76_wr(dev, ...) (dev)->bus->wr((dev), __VA_ARGS__) ··· 909 869 int mt76_register_phy(struct mt76_phy *phy, bool vht, 910 870 struct ieee80211_rate *rates, int n_rates); 911 871 912 - struct dentry *mt76_register_debugfs(struct mt76_dev *dev); 872 + struct dentry *mt76_register_debugfs_fops(struct mt76_phy *phy, 873 + const struct file_operations *ops); 874 + static inline struct dentry *mt76_register_debugfs(struct mt76_dev *dev) 875 + { 876 + return mt76_register_debugfs_fops(&dev->phy, NULL); 877 + } 878 + 913 879 int mt76_queues_read(struct seq_file *s, void *data); 914 880 void mt76_seq_puts_array(struct seq_file *file, const char *str, 915 881 s8 *val, int len); ··· 927 881 struct mt76_queue * 928 882 mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc, 929 883 int ring_base); 884 + u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx); 930 885 static inline int mt76_init_tx_queue(struct mt76_phy *phy, int qid, int idx, 931 886 int n_desc, int ring_base) 932 887 { ··· 1124 1077 struct ieee80211_key_conf *key); 1125 1078 1126 1079 void mt76_tx_status_lock(struct mt76_dev *dev, struct sk_buff_head *list) 1127 - __acquires(&dev->status_list.lock); 1080 + __acquires(&dev->status_lock); 1128 1081 void mt76_tx_status_unlock(struct mt76_dev *dev, struct sk_buff_head *list) 1129 - __releases(&dev->status_list.lock); 1082 + __releases(&dev->status_lock); 1130 1083 1131 1084 int mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid, 1132 1085 struct sk_buff *skb); ··· 1143 1096 __mt76_tx_complete_skb(dev, wcid, skb, NULL); 1144 1097 } 1145 1098 1146 - void mt76_tx_status_check(struct mt76_dev *dev, struct mt76_wcid *wcid, 1147 - bool flush); 1099 + void mt76_tx_status_check(struct mt76_dev *dev, bool flush); 1148 1100 int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1149 1101 struct ieee80211_sta *sta, 1150 1102 enum ieee80211_sta_state old_state, ··· 1249 1203 return usb_bulk_msg(udev, pipe, data, len, actual_len, timeout); 1250 1204 } 1251 1205 1206 + void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi, 1207 + struct mt76_sta_stats *stats); 1252 1208 int mt76_skb_adjust_pad(struct sk_buff *skb, int pad); 1253 1209 int mt76u_vendor_request(struct mt76_dev *dev, u8 req, 1254 1210 u8 req_type, u16 val, u16 offset, ··· 1268 1220 1269 1221 int mt76s_init(struct mt76_dev *dev, struct sdio_func *func, 1270 1222 const struct mt76_bus_ops *bus_ops); 1271 - int mt76s_alloc_queues(struct mt76_dev *dev); 1223 + int mt76s_alloc_rx_queue(struct mt76_dev *dev, enum mt76_rxq_id qid); 1224 + int mt76s_alloc_tx(struct mt76_dev *dev); 1272 1225 void mt76s_deinit(struct mt76_dev *dev); 1226 + void mt76s_sdio_irq(struct sdio_func *func); 1227 + void mt76s_txrx_worker(struct mt76_sdio *sdio); 1228 + bool mt76s_txqs_empty(struct mt76_dev *dev); 1229 + int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func, 1230 + int hw_ver); 1231 + u32 mt76s_rr(struct mt76_dev *dev, u32 offset); 1232 + void mt76s_wr(struct mt76_dev *dev, u32 offset, u32 val); 1233 + u32 mt76s_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val); 1234 + u32 mt76s_read_pcr(struct mt76_dev *dev); 1235 + void mt76s_write_copy(struct mt76_dev *dev, u32 offset, 1236 + const void *data, int len); 1237 + void mt76s_read_copy(struct mt76_dev *dev, u32 offset, 1238 + void *data, int len); 1239 + int mt76s_wr_rp(struct mt76_dev *dev, u32 base, 1240 + const struct mt76_reg_pair *data, 1241 + int len); 1242 + int mt76s_rd_rp(struct mt76_dev *dev, u32 base, 1243 + struct mt76_reg_pair *data, int len); 1273 1244 1274 1245 struct sk_buff * 1275 1246 mt76_mcu_msg_alloc(struct mt76_dev *dev, const void *data, ··· 1300 1233 int len, bool wait_resp, struct sk_buff **ret); 1301 1234 int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb, 1302 1235 int cmd, bool wait_resp, struct sk_buff **ret); 1303 - int mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, 1304 - int len); 1236 + int __mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, 1237 + int len, int max_len); 1238 + static inline int 1239 + mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, 1240 + int len) 1241 + { 1242 + int max_len = 4096 - dev->mcu_ops->headroom; 1243 + 1244 + return __mt76_mcu_send_firmware(dev, cmd, data, len, max_len); 1245 + } 1246 + 1305 1247 static inline int 1306 1248 mt76_mcu_send_msg(struct mt76_dev *dev, int cmd, const void *data, int len, 1307 1249 bool wait_resp) ··· 1369 1293 return txwi; 1370 1294 } 1371 1295 1372 - static inline int 1373 - mt76_get_next_pkt_id(struct mt76_wcid *wcid) 1296 + static inline void mt76_packet_id_init(struct mt76_wcid *wcid) 1374 1297 { 1375 - wcid->packet_id = (wcid->packet_id + 1) & MT_PACKET_ID_MASK; 1376 - if (wcid->packet_id == MT_PACKET_ID_NO_ACK || 1377 - wcid->packet_id == MT_PACKET_ID_NO_SKB) 1378 - wcid->packet_id = MT_PACKET_ID_FIRST; 1379 - 1380 - return wcid->packet_id; 1298 + INIT_LIST_HEAD(&wcid->list); 1299 + idr_init(&wcid->pktid); 1381 1300 } 1301 + 1302 + static inline void 1303 + mt76_packet_id_flush(struct mt76_dev *dev, struct mt76_wcid *wcid) 1304 + { 1305 + struct sk_buff_head list; 1306 + 1307 + mt76_tx_status_lock(dev, &list); 1308 + mt76_tx_status_skb_get(dev, wcid, -1, &list); 1309 + mt76_tx_status_unlock(dev, &list); 1310 + 1311 + idr_destroy(&wcid->pktid); 1312 + } 1313 + 1382 1314 #endif
+7 -4
drivers/net/wireless/mediatek/mt76/mt7603/mac.c
··· 1458 1458 mt76_queue_rx_reset(dev, i); 1459 1459 } 1460 1460 1461 - mt76_tx_status_check(&dev->mt76, NULL, true); 1461 + mt76_tx_status_check(&dev->mt76, true); 1462 1462 1463 1463 mt7603_dma_sched_reset(dev); 1464 1464 ··· 1471 1471 mutex_unlock(&dev->mt76.mutex); 1472 1472 1473 1473 mt76_worker_enable(&dev->mt76.tx_worker); 1474 - napi_enable(&dev->mt76.tx_napi); 1475 - napi_schedule(&dev->mt76.tx_napi); 1476 1474 1477 1475 tasklet_enable(&dev->mt76.pre_tbtt_tasklet); 1478 1476 mt7603_beacon_set_timer(dev, -1, beacon_int); 1477 + 1478 + local_bh_disable(); 1479 + napi_enable(&dev->mt76.tx_napi); 1480 + napi_schedule(&dev->mt76.tx_napi); 1479 1481 1480 1482 napi_enable(&dev->mt76.napi[0]); 1481 1483 napi_schedule(&dev->mt76.napi[0]); 1482 1484 1483 1485 napi_enable(&dev->mt76.napi[1]); 1484 1486 napi_schedule(&dev->mt76.napi[1]); 1487 + local_bh_enable(); 1485 1488 1486 1489 ieee80211_wake_queues(dev->mt76.hw); 1487 1490 mt76_txq_schedule_all(&dev->mphy); ··· 1817 1814 bool reset = false; 1818 1815 int i, idx; 1819 1816 1820 - mt76_tx_status_check(&dev->mt76, NULL, false); 1817 + mt76_tx_status_check(&dev->mt76, false); 1821 1818 1822 1819 mutex_lock(&dev->mt76.mutex); 1823 1820
+3
drivers/net/wireless/mediatek/mt76/mt7603/main.c
··· 69 69 INIT_LIST_HEAD(&mvif->sta.poll_list); 70 70 mvif->sta.wcid.idx = idx; 71 71 mvif->sta.wcid.hw_key_idx = -1; 72 + mt76_packet_id_init(&mvif->sta.wcid); 72 73 73 74 eth_broadcast_addr(bc_addr); 74 75 mt7603_wtbl_init(dev, idx, mvif->idx, bc_addr); ··· 108 107 mutex_lock(&dev->mt76.mutex); 109 108 dev->mt76.vif_mask &= ~BIT(mvif->idx); 110 109 mutex_unlock(&dev->mt76.mutex); 110 + 111 + mt76_packet_id_flush(&dev->mt76, &mvif->sta.wcid); 111 112 } 112 113 113 114 void mt7603_init_edcca(struct mt7603_dev *dev)
+1 -1
drivers/net/wireless/mediatek/mt76/mt7603/pci.c
··· 28 28 29 29 pci_set_master(pdev); 30 30 31 - ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 31 + ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); 32 32 if (ret) 33 33 return ret; 34 34
+1 -1
drivers/net/wireless/mediatek/mt76/mt7615/Makefile
··· 17 17 18 18 mt7663-usb-sdio-common-y := usb_sdio.o 19 19 mt7663u-y := usb.o usb_mcu.o 20 - mt7663s-y := sdio.o sdio_mcu.o sdio_txrx.o 20 + mt7663s-y := sdio.o sdio_mcu.o
+28 -1
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c
··· 3 3 #include "mt7615.h" 4 4 5 5 static int 6 + mt7615_reg_set(void *data, u64 val) 7 + { 8 + struct mt7615_dev *dev = data; 9 + 10 + mt7615_mutex_acquire(dev); 11 + mt76_wr(dev, dev->mt76.debugfs_reg, val); 12 + mt7615_mutex_release(dev); 13 + 14 + return 0; 15 + } 16 + 17 + static int 18 + mt7615_reg_get(void *data, u64 *val) 19 + { 20 + struct mt7615_dev *dev = data; 21 + 22 + mt7615_mutex_acquire(dev); 23 + *val = mt76_rr(dev, dev->mt76.debugfs_reg); 24 + mt7615_mutex_release(dev); 25 + 26 + return 0; 27 + } 28 + 29 + DEFINE_DEBUGFS_ATTRIBUTE(fops_regval, mt7615_reg_get, mt7615_reg_set, 30 + "0x%08llx\n"); 31 + 32 + static int 6 33 mt7615_radar_pattern_set(void *data, u64 val) 7 34 { 8 35 struct mt7615_dev *dev = data; ··· 533 506 { 534 507 struct dentry *dir; 535 508 536 - dir = mt76_register_debugfs(&dev->mt76); 509 + dir = mt76_register_debugfs_fops(&dev->mphy, &fops_regval); 537 510 if (!dir) 538 511 return -ENOMEM; 539 512
+4 -2
drivers/net/wireless/mediatek/mt76/mt7615/init.c
··· 49 49 { 50 50 struct wiphy *wiphy = mt76_hw(dev)->wiphy; 51 51 struct device *hwmon; 52 + const char *name; 52 53 53 54 if (!IS_REACHABLE(CONFIG_HWMON)) 54 55 return 0; 55 56 56 - hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, 57 - wiphy_name(wiphy), dev, 57 + name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7615_%s", 58 + wiphy_name(wiphy)); 59 + hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, dev, 58 60 mt7615_hwmon_groups); 59 61 if (IS_ERR(hwmon)) 60 62 return PTR_ERR(hwmon);
+35 -31
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
··· 755 755 if (info->flags & IEEE80211_TX_CTL_NO_ACK) 756 756 txwi[3] |= cpu_to_le32(MT_TXD3_NO_ACK); 757 757 758 - txwi[7] = FIELD_PREP(MT_TXD7_TYPE, fc_type) | 759 - FIELD_PREP(MT_TXD7_SUB_TYPE, fc_stype) | 760 - FIELD_PREP(MT_TXD7_SPE_IDX, 0x18); 761 - if (!is_mmio) 762 - txwi[8] = FIELD_PREP(MT_TXD8_L_TYPE, fc_type) | 763 - FIELD_PREP(MT_TXD8_L_SUB_TYPE, fc_stype); 758 + val = FIELD_PREP(MT_TXD7_TYPE, fc_type) | 759 + FIELD_PREP(MT_TXD7_SUB_TYPE, fc_stype) | 760 + FIELD_PREP(MT_TXD7_SPE_IDX, 0x18); 761 + txwi[7] = cpu_to_le32(val); 762 + if (!is_mmio) { 763 + val = FIELD_PREP(MT_TXD8_L_TYPE, fc_type) | 764 + FIELD_PREP(MT_TXD8_L_SUB_TYPE, fc_stype); 765 + txwi[8] = cpu_to_le32(val); 766 + } 764 767 765 768 return 0; 766 769 } ··· 1497 1494 } 1498 1495 1499 1496 static void 1497 + mt7615_txwi_free(struct mt7615_dev *dev, struct mt76_txwi_cache *txwi) 1498 + { 1499 + struct mt76_dev *mdev = &dev->mt76; 1500 + __le32 *txwi_data; 1501 + u32 val; 1502 + u8 wcid; 1503 + 1504 + mt7615_txp_skb_unmap(mdev, txwi); 1505 + if (!txwi->skb) 1506 + goto out; 1507 + 1508 + txwi_data = (__le32 *)mt76_get_txwi_ptr(mdev, txwi); 1509 + val = le32_to_cpu(txwi_data[1]); 1510 + wcid = FIELD_GET(MT_TXD1_WLAN_IDX, val); 1511 + mt76_tx_complete_skb(mdev, wcid, txwi->skb); 1512 + 1513 + out: 1514 + txwi->skb = NULL; 1515 + mt76_put_txwi(mdev, txwi); 1516 + } 1517 + 1518 + static void 1500 1519 mt7615_mac_tx_free_token(struct mt7615_dev *dev, u16 token) 1501 1520 { 1502 1521 struct mt76_dev *mdev = &dev->mt76; 1503 1522 struct mt76_txwi_cache *txwi; 1504 - __le32 *txwi_data; 1505 - u32 val; 1506 - u8 wcid; 1507 1523 1508 1524 trace_mac_tx_free(dev, token); 1509 1525 txwi = mt76_token_put(mdev, token); 1510 1526 if (!txwi) 1511 1527 return; 1512 1528 1513 - txwi_data = (__le32 *)mt76_get_txwi_ptr(mdev, txwi); 1514 - val = le32_to_cpu(txwi_data[1]); 1515 - wcid = FIELD_GET(MT_TXD1_WLAN_IDX, val); 1516 - 1517 - mt7615_txp_skb_unmap(mdev, txwi); 1518 - if (txwi->skb) { 1519 - mt76_tx_complete_skb(mdev, wcid, txwi->skb); 1520 - txwi->skb = NULL; 1521 - } 1522 - 1523 - mt76_put_txwi(mdev, txwi); 1529 + mt7615_txwi_free(dev, txwi); 1524 1530 } 1525 1531 1526 1532 static void mt7615_mac_tx_free(struct mt7615_dev *dev, struct sk_buff *skb) ··· 2026 2014 2027 2015 mt7615_mutex_release(phy->dev); 2028 2016 2029 - mt76_tx_status_check(mphy->dev, NULL, false); 2017 + mt76_tx_status_check(mphy->dev, false); 2030 2018 2031 2019 timeout = mt7615_get_macwork_timeout(phy->dev); 2032 2020 ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work, timeout); ··· 2038 2026 int id; 2039 2027 2040 2028 spin_lock_bh(&dev->mt76.token_lock); 2041 - idr_for_each_entry(&dev->mt76.token, txwi, id) { 2042 - mt7615_txp_skb_unmap(&dev->mt76, txwi); 2043 - if (txwi->skb) { 2044 - struct ieee80211_hw *hw; 2045 - 2046 - hw = mt76_tx_status_get_hw(&dev->mt76, txwi->skb); 2047 - ieee80211_free_txskb(hw, txwi->skb); 2048 - } 2049 - mt76_put_txwi(&dev->mt76, txwi); 2050 - } 2029 + idr_for_each_entry(&dev->mt76.token, txwi, id) 2030 + mt7615_txwi_free(dev, txwi); 2051 2031 spin_unlock_bh(&dev->mt76.token_lock); 2052 2032 idr_destroy(&dev->mt76.token); 2053 2033 }
+6 -4
drivers/net/wireless/mediatek/mt76/mt7615/main.c
··· 231 231 mvif->sta.wcid.idx = idx; 232 232 mvif->sta.wcid.ext_phy = mvif->mt76.band_idx; 233 233 mvif->sta.wcid.hw_key_idx = -1; 234 + mt76_packet_id_init(&mvif->sta.wcid); 235 + 234 236 mt7615_mac_wtbl_update(dev, idx, 235 237 MT_WTBL_UPDATE_ADM_COUNT_CLEAR); 236 238 ··· 283 281 if (!list_empty(&msta->poll_list)) 284 282 list_del_init(&msta->poll_list); 285 283 spin_unlock_bh(&dev->sta_poll_lock); 284 + 285 + mt76_packet_id_flush(&dev->mt76, &mvif->sta.wcid); 286 286 } 287 287 288 288 static void mt7615_init_dfs_state(struct mt7615_phy *phy) ··· 571 567 mt7615_mcu_add_bss_info(phy, vif, NULL, true); 572 568 mt7615_mcu_sta_add(phy, vif, NULL, true); 573 569 574 - if (vif->p2p) 575 - mt7615_mcu_set_p2p_oppps(hw, vif); 570 + if (mt7615_firmware_offload(dev) && vif->p2p) 571 + mt76_connac_mcu_set_p2p_oppps(hw, vif); 576 572 } 577 573 578 574 if (changed & (BSS_CHANGED_BEACON | ··· 861 857 stats->dot11RTSFailureCount = mib->rts_retries_cnt; 862 858 stats->dot11FCSErrorCount = mib->fcs_err_cnt; 863 859 stats->dot11ACKFailureCount = mib->ack_fail_cnt; 864 - 865 - memset(mib, 0, sizeof(*mib)); 866 860 867 861 mt7615_mutex_release(phy->dev); 868 862
+13 -55
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
··· 808 808 809 809 static int 810 810 mt7615_mcu_bss_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif, 811 - struct ieee80211_sta *sta, bool enable) 811 + struct ieee80211_sta *sta, struct mt7615_phy *phy, 812 + bool enable) 812 813 { 813 814 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 814 815 u32 type = vif->p2p ? NETWORK_P2P : NETWORK_INFRA; ··· 822 821 switch (vif->type) { 823 822 case NL80211_IFTYPE_MESH_POINT: 824 823 case NL80211_IFTYPE_AP: 824 + case NL80211_IFTYPE_MONITOR: 825 825 break; 826 826 case NL80211_IFTYPE_STATION: 827 827 /* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */ ··· 842 840 } 843 841 844 842 bss = (struct bss_info_basic *)tlv; 845 - memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN); 846 - bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int); 847 843 bss->network_type = cpu_to_le32(type); 848 - bss->dtim_period = vif->bss_conf.dtim_period; 849 844 bss->bmc_tx_wlan_idx = wlan_idx; 850 845 bss->wmm_idx = mvif->mt76.wmm_idx; 851 846 bss->active = enable; 847 + 848 + if (vif->type != NL80211_IFTYPE_MONITOR) { 849 + memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN); 850 + bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int); 851 + bss->dtim_period = vif->bss_conf.dtim_period; 852 + } else { 853 + memcpy(bss->bssid, phy->mt76->macaddr, ETH_ALEN); 854 + } 852 855 853 856 return 0; 854 857 } ··· 870 863 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac)); 871 864 872 865 switch (vif->type) { 866 + case NL80211_IFTYPE_MONITOR: 873 867 case NL80211_IFTYPE_MESH_POINT: 874 868 case NL80211_IFTYPE_AP: 875 869 if (vif->p2p) ··· 937 929 if (enable) 938 930 mt7615_mcu_bss_omac_tlv(skb, vif); 939 931 940 - mt7615_mcu_bss_basic_tlv(skb, vif, sta, enable); 932 + mt7615_mcu_bss_basic_tlv(skb, vif, sta, phy, enable); 941 933 942 934 if (enable && mvif->mt76.omac_idx >= EXT_BSSID_START && 943 935 mvif->mt76.omac_idx < REPEATER_BSSID_START) ··· 2769 2761 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_ROC, &req, 2770 2762 sizeof(req), false); 2771 2763 } 2772 - 2773 - int mt7615_mcu_set_p2p_oppps(struct ieee80211_hw *hw, 2774 - struct ieee80211_vif *vif) 2775 - { 2776 - struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 2777 - int ct_window = vif->bss_conf.p2p_noa_attr.oppps_ctwindow; 2778 - struct mt7615_dev *dev = mt7615_hw_dev(hw); 2779 - struct { 2780 - __le32 ct_win; 2781 - u8 bss_idx; 2782 - u8 rsv[3]; 2783 - } __packed req = { 2784 - .ct_win = cpu_to_le32(ct_window), 2785 - .bss_idx = mvif->mt76.idx, 2786 - }; 2787 - 2788 - if (!mt7615_firmware_offload(dev)) 2789 - return -ENOTSUPP; 2790 - 2791 - return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_P2P_OPPPS, &req, 2792 - sizeof(req), false); 2793 - } 2794 - 2795 - u32 mt7615_mcu_reg_rr(struct mt76_dev *dev, u32 offset) 2796 - { 2797 - struct { 2798 - __le32 addr; 2799 - __le32 val; 2800 - } __packed req = { 2801 - .addr = cpu_to_le32(offset), 2802 - }; 2803 - 2804 - return mt76_mcu_send_msg(dev, MCU_CMD_REG_READ, &req, sizeof(req), 2805 - true); 2806 - } 2807 - EXPORT_SYMBOL_GPL(mt7615_mcu_reg_rr); 2808 - 2809 - void mt7615_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val) 2810 - { 2811 - struct { 2812 - __le32 addr; 2813 - __le32 val; 2814 - } __packed req = { 2815 - .addr = cpu_to_le32(offset), 2816 - .val = cpu_to_le32(val), 2817 - }; 2818 - 2819 - mt76_mcu_send_msg(dev, MCU_CMD_REG_WRITE, &req, sizeof(req), false); 2820 - } 2821 - EXPORT_SYMBOL_GPL(mt7615_mcu_reg_wr);
+12 -8
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
··· 107 107 struct mt7615_sta *sta; 108 108 }; 109 109 110 + struct mt7663s_intr { 111 + u32 isr; 112 + struct { 113 + u32 wtqcr[8]; 114 + } tx; 115 + struct { 116 + u16 num[2]; 117 + u16 len[2][16]; 118 + } rx; 119 + u32 rec_mb[2]; 120 + } __packed; 121 + 110 122 struct mt7615_sta { 111 123 struct mt76_wcid wcid; /* must be first */ 112 124 ··· 553 541 int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy); 554 542 int mt7615_dfs_init_radar_detector(struct mt7615_phy *phy); 555 543 556 - int mt7615_mcu_set_p2p_oppps(struct ieee80211_hw *hw, 557 - struct ieee80211_vif *vif); 558 544 int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif, 559 545 struct ieee80211_channel *chan, int duration); 560 546 ··· 565 555 int mt7615_mcu_set_bss_pm(struct mt7615_dev *dev, struct ieee80211_vif *vif, 566 556 bool enable); 567 557 int __mt7663_load_firmware(struct mt7615_dev *dev); 568 - u32 mt7615_mcu_reg_rr(struct mt76_dev *dev, u32 offset); 569 - void mt7615_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val); 570 558 void mt7615_coredump_work(struct work_struct *work); 571 559 572 560 void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en); ··· 581 573 int mt7663u_mcu_init(struct mt7615_dev *dev); 582 574 583 575 /* sdio */ 584 - u32 mt7663s_read_pcr(struct mt7615_dev *dev); 585 576 int mt7663s_mcu_init(struct mt7615_dev *dev); 586 - void mt7663s_txrx_worker(struct mt76_worker *w); 587 - void mt7663s_rx_work(struct work_struct *work); 588 - void mt7663s_sdio_irq(struct sdio_func *func); 589 577 590 578 #endif
+3 -1
drivers/net/wireless/mediatek/mt76/mt7615/pci.c
··· 39 39 if (ret < 0) 40 40 return ret; 41 41 42 - ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 42 + ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); 43 43 if (ret) 44 44 goto error; 45 45 ··· 164 164 dev_err(mdev->dev, "PDMA engine must be reinitialized\n"); 165 165 166 166 mt76_worker_enable(&mdev->tx_worker); 167 + local_bh_disable(); 167 168 mt76_for_each_q_rx(mdev, i) { 168 169 napi_enable(&mdev->napi[i]); 169 170 napi_schedule(&mdev->napi[i]); 170 171 } 171 172 napi_enable(&mdev->tx_napi); 172 173 napi_schedule(&mdev->tx_napi); 174 + local_bh_enable(); 173 175 174 176 if (!test_bit(MT76_STATE_SUSPEND, &dev->mphy.state) && 175 177 mt7615_firmware_offload(dev))
+4 -1
drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c
··· 198 198 mt76_for_each_q_rx(&dev->mt76, i) 199 199 mt76_queue_rx_reset(dev, i); 200 200 201 - mt76_tx_status_check(&dev->mt76, NULL, true); 201 + mt76_tx_status_check(&dev->mt76, true); 202 202 203 203 mt7615_dma_start(dev); 204 204 } ··· 326 326 clear_bit(MT76_RESET, &phy2->mt76->state); 327 327 328 328 mt76_worker_enable(&dev->mt76.tx_worker); 329 + 330 + local_bh_disable(); 329 331 napi_enable(&dev->mt76.tx_napi); 330 332 napi_schedule(&dev->mt76.tx_napi); 331 333 ··· 336 334 337 335 napi_enable(&dev->mt76.napi[1]); 338 336 napi_schedule(&dev->mt76.napi[1]); 337 + local_bh_enable(); 339 338 340 339 ieee80211_wake_queues(mt76_hw(dev)); 341 340 if (ext_phy)
+40 -256
drivers/net/wireless/mediatek/mt76/mt7615/sdio.c
··· 14 14 #include <linux/mmc/sdio_ids.h> 15 15 #include <linux/mmc/sdio_func.h> 16 16 17 + #include "../sdio.h" 17 18 #include "mt7615.h" 18 - #include "sdio.h" 19 19 #include "mac.h" 20 20 #include "mcu.h" 21 21 ··· 24 24 { } /* Terminating entry */ 25 25 }; 26 26 27 - static u32 mt7663s_read_whisr(struct mt76_dev *dev) 27 + static void mt7663s_txrx_worker(struct mt76_worker *w) 28 28 { 29 - return sdio_readl(dev->sdio.func, MCR_WHISR, NULL); 30 - } 29 + struct mt76_sdio *sdio = container_of(w, struct mt76_sdio, 30 + txrx_worker); 31 + struct mt76_dev *mdev = container_of(sdio, struct mt76_dev, sdio); 32 + struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76); 31 33 32 - u32 mt7663s_read_pcr(struct mt7615_dev *dev) 33 - { 34 - struct mt76_sdio *sdio = &dev->mt76.sdio; 35 - 36 - return sdio_readl(sdio->func, MCR_WHLPCR, NULL); 37 - } 38 - 39 - static u32 mt7663s_read_mailbox(struct mt76_dev *dev, u32 offset) 40 - { 41 - struct sdio_func *func = dev->sdio.func; 42 - u32 val = ~0, status; 43 - int err; 44 - 45 - sdio_claim_host(func); 46 - 47 - sdio_writel(func, offset, MCR_H2DSM0R, &err); 48 - if (err < 0) { 49 - dev_err(dev->dev, "failed setting address [err=%d]\n", err); 50 - goto out; 34 + if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) { 35 + queue_work(mdev->wq, &dev->pm.wake_work); 36 + return; 51 37 } 52 - 53 - sdio_writel(func, H2D_SW_INT_READ, MCR_WSICR, &err); 54 - if (err < 0) { 55 - dev_err(dev->dev, "failed setting read mode [err=%d]\n", err); 56 - goto out; 57 - } 58 - 59 - err = readx_poll_timeout(mt7663s_read_whisr, dev, status, 60 - status & H2D_SW_INT_READ, 0, 1000000); 61 - if (err < 0) { 62 - dev_err(dev->dev, "query whisr timeout\n"); 63 - goto out; 64 - } 65 - 66 - sdio_writel(func, H2D_SW_INT_READ, MCR_WHISR, &err); 67 - if (err < 0) { 68 - dev_err(dev->dev, "failed setting read mode [err=%d]\n", err); 69 - goto out; 70 - } 71 - 72 - val = sdio_readl(func, MCR_H2DSM0R, &err); 73 - if (err < 0) { 74 - dev_err(dev->dev, "failed reading h2dsm0r [err=%d]\n", err); 75 - goto out; 76 - } 77 - 78 - if (val != offset) { 79 - dev_err(dev->dev, "register mismatch\n"); 80 - val = ~0; 81 - goto out; 82 - } 83 - 84 - val = sdio_readl(func, MCR_D2HRM1R, &err); 85 - if (err < 0) 86 - dev_err(dev->dev, "failed reading d2hrm1r [err=%d]\n", err); 87 - 88 - out: 89 - sdio_release_host(func); 90 - 91 - return val; 92 - } 93 - 94 - static void mt7663s_write_mailbox(struct mt76_dev *dev, u32 offset, u32 val) 95 - { 96 - struct sdio_func *func = dev->sdio.func; 97 - u32 status; 98 - int err; 99 - 100 - sdio_claim_host(func); 101 - 102 - sdio_writel(func, offset, MCR_H2DSM0R, &err); 103 - if (err < 0) { 104 - dev_err(dev->dev, "failed setting address [err=%d]\n", err); 105 - goto out; 106 - } 107 - 108 - sdio_writel(func, val, MCR_H2DSM1R, &err); 109 - if (err < 0) { 110 - dev_err(dev->dev, 111 - "failed setting write value [err=%d]\n", err); 112 - goto out; 113 - } 114 - 115 - sdio_writel(func, H2D_SW_INT_WRITE, MCR_WSICR, &err); 116 - if (err < 0) { 117 - dev_err(dev->dev, "failed setting write mode [err=%d]\n", err); 118 - goto out; 119 - } 120 - 121 - err = readx_poll_timeout(mt7663s_read_whisr, dev, status, 122 - status & H2D_SW_INT_WRITE, 0, 1000000); 123 - if (err < 0) { 124 - dev_err(dev->dev, "query whisr timeout\n"); 125 - goto out; 126 - } 127 - 128 - sdio_writel(func, H2D_SW_INT_WRITE, MCR_WHISR, &err); 129 - if (err < 0) { 130 - dev_err(dev->dev, "failed setting write mode [err=%d]\n", err); 131 - goto out; 132 - } 133 - 134 - val = sdio_readl(func, MCR_H2DSM0R, &err); 135 - if (err < 0) { 136 - dev_err(dev->dev, "failed reading h2dsm0r [err=%d]\n", err); 137 - goto out; 138 - } 139 - 140 - if (val != offset) 141 - dev_err(dev->dev, "register mismatch\n"); 142 - 143 - out: 144 - sdio_release_host(func); 145 - } 146 - 147 - static u32 mt7663s_rr(struct mt76_dev *dev, u32 offset) 148 - { 149 - if (test_bit(MT76_STATE_MCU_RUNNING, &dev->phy.state)) 150 - return dev->mcu_ops->mcu_rr(dev, offset); 151 - else 152 - return mt7663s_read_mailbox(dev, offset); 153 - } 154 - 155 - static void mt7663s_wr(struct mt76_dev *dev, u32 offset, u32 val) 156 - { 157 - if (test_bit(MT76_STATE_MCU_RUNNING, &dev->phy.state)) 158 - dev->mcu_ops->mcu_wr(dev, offset, val); 159 - else 160 - mt7663s_write_mailbox(dev, offset, val); 161 - } 162 - 163 - static u32 mt7663s_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val) 164 - { 165 - val |= mt7663s_rr(dev, offset) & ~mask; 166 - mt7663s_wr(dev, offset, val); 167 - 168 - return val; 169 - } 170 - 171 - static void mt7663s_write_copy(struct mt76_dev *dev, u32 offset, 172 - const void *data, int len) 173 - { 174 - const u32 *val = data; 175 - int i; 176 - 177 - for (i = 0; i < len / sizeof(u32); i++) { 178 - mt7663s_wr(dev, offset, val[i]); 179 - offset += sizeof(u32); 180 - } 181 - } 182 - 183 - static void mt7663s_read_copy(struct mt76_dev *dev, u32 offset, 184 - void *data, int len) 185 - { 186 - u32 *val = data; 187 - int i; 188 - 189 - for (i = 0; i < len / sizeof(u32); i++) { 190 - val[i] = mt7663s_rr(dev, offset); 191 - offset += sizeof(u32); 192 - } 193 - } 194 - 195 - static int mt7663s_wr_rp(struct mt76_dev *dev, u32 base, 196 - const struct mt76_reg_pair *data, 197 - int len) 198 - { 199 - int i; 200 - 201 - for (i = 0; i < len; i++) { 202 - mt7663s_wr(dev, data->reg, data->value); 203 - data++; 204 - } 205 - 206 - return 0; 207 - } 208 - 209 - static int mt7663s_rd_rp(struct mt76_dev *dev, u32 base, 210 - struct mt76_reg_pair *data, 211 - int len) 212 - { 213 - int i; 214 - 215 - for (i = 0; i < len; i++) { 216 - data->value = mt7663s_rr(dev, data->reg); 217 - data++; 218 - } 219 - 220 - return 0; 38 + mt76s_txrx_worker(sdio); 39 + mt76_connac_pm_unref(&dev->mphy, &dev->pm); 221 40 } 222 41 223 42 static void mt7663s_init_work(struct work_struct *work) ··· 50 231 mt7615_init_work(dev); 51 232 } 52 233 53 - static int mt7663s_hw_init(struct mt7615_dev *dev, struct sdio_func *func) 234 + static int mt7663s_parse_intr(struct mt76_dev *dev, struct mt76s_intr *intr) 54 235 { 55 - u32 status, ctrl; 56 - int ret; 236 + struct mt76_sdio *sdio = &dev->sdio; 237 + struct mt7663s_intr *irq_data = sdio->intr_data; 238 + int i, err; 57 239 58 - sdio_claim_host(func); 240 + err = sdio_readsb(sdio->func, irq_data, MCR_WHISR, sizeof(*irq_data)); 241 + if (err) 242 + return err; 59 243 60 - ret = sdio_enable_func(func); 61 - if (ret < 0) 62 - goto release; 63 - 64 - /* Get ownership from the device */ 65 - sdio_writel(func, WHLPCR_INT_EN_CLR | WHLPCR_FW_OWN_REQ_CLR, 66 - MCR_WHLPCR, &ret); 67 - if (ret < 0) 68 - goto disable_func; 69 - 70 - ret = readx_poll_timeout(mt7663s_read_pcr, dev, status, 71 - status & WHLPCR_IS_DRIVER_OWN, 2000, 1000000); 72 - if (ret < 0) { 73 - dev_err(dev->mt76.dev, "Cannot get ownership from device"); 74 - goto disable_func; 75 - } 76 - 77 - ret = sdio_set_block_size(func, 512); 78 - if (ret < 0) 79 - goto disable_func; 80 - 81 - /* Enable interrupt */ 82 - sdio_writel(func, WHLPCR_INT_EN_SET, MCR_WHLPCR, &ret); 83 - if (ret < 0) 84 - goto disable_func; 85 - 86 - ctrl = WHIER_RX0_DONE_INT_EN | WHIER_TX_DONE_INT_EN; 87 - sdio_writel(func, ctrl, MCR_WHIER, &ret); 88 - if (ret < 0) 89 - goto disable_func; 90 - 91 - /* set WHISR as read clear and Rx aggregation number as 16 */ 92 - ctrl = FIELD_PREP(MAX_HIF_RX_LEN_NUM, 16); 93 - sdio_writel(func, ctrl, MCR_WHCR, &ret); 94 - if (ret < 0) 95 - goto disable_func; 96 - 97 - ret = sdio_claim_irq(func, mt7663s_sdio_irq); 98 - if (ret < 0) 99 - goto disable_func; 100 - 101 - sdio_release_host(func); 244 + intr->isr = irq_data->isr; 245 + intr->rec_mb = irq_data->rec_mb; 246 + intr->tx.wtqcr = irq_data->tx.wtqcr; 247 + intr->rx.num = irq_data->rx.num; 248 + for (i = 0; i < 2 ; i++) 249 + intr->rx.len[i] = irq_data->rx.len[i]; 102 250 103 251 return 0; 104 - 105 - disable_func: 106 - sdio_disable_func(func); 107 - release: 108 - sdio_release_host(func); 109 - 110 - return ret; 111 252 } 112 253 113 254 static int mt7663s_probe(struct sdio_func *func, ··· 86 307 .update_survey = mt7615_update_channel, 87 308 }; 88 309 static const struct mt76_bus_ops mt7663s_ops = { 89 - .rr = mt7663s_rr, 90 - .rmw = mt7663s_rmw, 91 - .wr = mt7663s_wr, 92 - .write_copy = mt7663s_write_copy, 93 - .read_copy = mt7663s_read_copy, 94 - .wr_rp = mt7663s_wr_rp, 95 - .rd_rp = mt7663s_rd_rp, 310 + .rr = mt76s_rr, 311 + .rmw = mt76s_rmw, 312 + .wr = mt76s_wr, 313 + .write_copy = mt76s_write_copy, 314 + .read_copy = mt76s_read_copy, 315 + .wr_rp = mt76s_wr_rp, 316 + .rd_rp = mt76s_rd_rp, 96 317 .type = MT76_BUS_SDIO, 97 318 }; 98 319 struct ieee80211_ops *ops; ··· 120 341 if (ret < 0) 121 342 goto error; 122 343 123 - ret = mt7663s_hw_init(dev, func); 344 + ret = mt76s_hw_init(mdev, func, MT76_CONNAC_SDIO); 124 345 if (ret) 125 346 goto error; 126 347 ··· 128 349 (mt76_rr(dev, MT_HW_REV) & 0xff); 129 350 dev_dbg(mdev->dev, "ASIC revision: %04x\n", mdev->rev); 130 351 352 + mdev->sdio.parse_irq = mt7663s_parse_intr; 131 353 mdev->sdio.intr_data = devm_kmalloc(mdev->dev, 132 - sizeof(struct mt76s_intr), 354 + sizeof(struct mt7663s_intr), 133 355 GFP_KERNEL); 134 356 if (!mdev->sdio.intr_data) { 135 357 ret = -ENOMEM; ··· 147 367 } 148 368 } 149 369 150 - ret = mt76s_alloc_queues(&dev->mt76); 370 + ret = mt76s_alloc_rx_queue(mdev, MT_RXQ_MAIN); 371 + if (ret) 372 + goto error; 373 + 374 + ret = mt76s_alloc_tx(mdev); 151 375 if (ret) 152 376 goto error; 153 377 ··· 216 432 cancel_work_sync(&mdev->mt76.sdio.stat_work); 217 433 clear_bit(MT76_READING_STATS, &mdev->mphy.state); 218 434 219 - mt76_tx_status_check(&mdev->mt76, NULL, true); 435 + mt76_tx_status_check(&mdev->mt76, true); 220 436 221 437 return 0; 222 438 }
+28 -5
drivers/net/wireless/mediatek/mt76/mt7615/sdio.h drivers/net/wireless/mediatek/mt76/sdio.h
··· 21 21 #define MCR_WHCR 0x000C 22 22 #define W_INT_CLR_CTRL BIT(1) 23 23 #define RECV_MAILBOX_RD_CLR_EN BIT(2) 24 + #define WF_SYS_RSTB BIT(4) /* supported in CONNAC2 */ 25 + #define WF_WHOLE_PATH_RSTB BIT(5) /* supported in CONNAC2 */ 26 + #define WF_SDIO_WF_PATH_RSTB BIT(6) /* supported in CONNAC2 */ 24 27 #define MAX_HIF_RX_LEN_NUM GENMASK(13, 8) 28 + #define MAX_HIF_RX_LEN_NUM_CONNAC2 GENMASK(14, 8) /* supported in CONNAC2 */ 29 + #define WF_RST_DONE BIT(15) /* supported in CONNAC2 */ 25 30 #define RX_ENHANCE_MODE BIT(16) 26 31 27 32 #define MCR_WHISR 0x0010 ··· 34 29 #define WHIER_D2H_SW_INT GENMASK(31, 8) 35 30 #define WHIER_FW_OWN_BACK_INT_EN BIT(7) 36 31 #define WHIER_ABNORMAL_INT_EN BIT(6) 32 + #define WHIER_WDT_INT_EN BIT(5) /* supported in CONNAC2 */ 37 33 #define WHIER_RX1_DONE_INT_EN BIT(2) 38 34 #define WHIER_RX0_DONE_INT_EN BIT(1) 39 35 #define WHIER_TX_DONE_INT_EN BIT(0) ··· 106 100 107 101 #define MCR_SWPCDBGR 0x0154 108 102 103 + #define MCR_H2DSM2R 0x0160 /* supported in CONNAC2 */ 104 + #define MCR_H2DSM3R 0x0164 /* supported in CONNAC2 */ 105 + #define MCR_D2HRM3R 0x0174 /* supported in CONNAC2 */ 106 + #define MCR_WTQCR8 0x0190 /* supported in CONNAC2 */ 107 + #define MCR_WTQCR9 0x0194 /* supported in CONNAC2 */ 108 + #define MCR_WTQCR10 0x0198 /* supported in CONNAC2 */ 109 + #define MCR_WTQCR11 0x019C /* supported in CONNAC2 */ 110 + #define MCR_WTQCR12 0x01A0 /* supported in CONNAC2 */ 111 + #define MCR_WTQCR13 0x01A4 /* supported in CONNAC2 */ 112 + #define MCR_WTQCR14 0x01A8 /* supported in CONNAC2 */ 113 + #define MCR_WTQCR15 0x01AC /* supported in CONNAC2 */ 114 + 115 + enum mt76_connac_sdio_ver { 116 + MT76_CONNAC_SDIO, 117 + MT76_CONNAC2_SDIO, 118 + }; 119 + 109 120 struct mt76s_intr { 110 121 u32 isr; 122 + u32 *rec_mb; 111 123 struct { 112 - u32 wtqcr[8]; 124 + u32 *wtqcr; 113 125 } tx; 114 126 struct { 115 - u16 num[2]; 116 - u16 len[2][16]; 127 + u16 *len[2]; 128 + u16 *num; 117 129 } rx; 118 - u32 rec_mb[2]; 119 - } __packed; 130 + }; 120 131 121 132 #endif
+6 -5
drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c
··· 10 10 #include <linux/module.h> 11 11 #include <linux/iopoll.h> 12 12 13 + #include "../sdio.h" 13 14 #include "mt7615.h" 14 15 #include "mac.h" 15 16 #include "mcu.h" 16 17 #include "regs.h" 17 - #include "sdio.h" 18 18 19 19 static int mt7663s_mcu_init_sched(struct mt7615_dev *dev) 20 20 { ··· 27 27 MT_HIF1_MIN_QUOTA); 28 28 sdio->sched.ple_data_quota = mt76_get_field(dev, MT_PLE_PG_HIF0_GROUP, 29 29 MT_HIF0_MIN_QUOTA); 30 + sdio->sched.pse_page_size = MT_PSE_PAGE_SZ; 30 31 txdwcnt = mt76_get_field(dev, MT_PP_TXDWCNT, 31 32 MT_PP_TXDWCNT_TX1_ADD_DW_CNT); 32 33 sdio->sched.deficit = txdwcnt << 2; ··· 64 63 65 64 sdio_writel(func, WHLPCR_FW_OWN_REQ_CLR, MCR_WHLPCR, NULL); 66 65 67 - ret = readx_poll_timeout(mt7663s_read_pcr, dev, status, 66 + ret = readx_poll_timeout(mt76s_read_pcr, &dev->mt76, status, 68 67 status & WHLPCR_IS_DRIVER_OWN, 2000, 1000000); 69 68 if (ret < 0) { 70 69 dev_err(dev->mt76.dev, "Cannot get ownership from device"); ··· 112 111 113 112 sdio_writel(func, WHLPCR_FW_OWN_REQ_SET, MCR_WHLPCR, NULL); 114 113 115 - ret = readx_poll_timeout(mt7663s_read_pcr, dev, status, 114 + ret = readx_poll_timeout(mt76s_read_pcr, &dev->mt76, status, 116 115 !(status & WHLPCR_IS_DRIVER_OWN), 2000, 1000000); 117 116 if (ret < 0) { 118 117 dev_err(dev->mt76.dev, "Cannot set ownership to device"); ··· 138 137 .mcu_skb_send_msg = mt7663s_mcu_send_message, 139 138 .mcu_parse_response = mt7615_mcu_parse_response, 140 139 .mcu_restart = mt7615_mcu_restart, 141 - .mcu_rr = mt7615_mcu_reg_rr, 142 - .mcu_wr = mt7615_mcu_reg_wr, 140 + .mcu_rr = mt76_connac_mcu_reg_rr, 141 + .mcu_wr = mt76_connac_mcu_reg_wr, 143 142 }; 144 143 struct mt7615_mcu_ops *mcu_ops; 145 144 int ret;
+82 -52
drivers/net/wireless/mediatek/mt76/mt7615/sdio_txrx.c drivers/net/wireless/mediatek/mt76/sdio_txrx.c
··· 14 14 #include <linux/mmc/sdio_ids.h> 15 15 #include <linux/mmc/sdio_func.h> 16 16 17 - #include "../trace.h" 18 - #include "mt7615.h" 17 + #include "trace.h" 19 18 #include "sdio.h" 20 - #include "mac.h" 19 + #include "mt76.h" 21 20 22 - static int mt7663s_refill_sched_quota(struct mt76_dev *dev, u32 *data) 21 + static int mt76s_refill_sched_quota(struct mt76_dev *dev, u32 *data) 23 22 { 24 23 u32 ple_ac_data_quota[] = { 25 24 FIELD_GET(TXQ_CNT_L, data[4]), /* VO */ ··· 52 53 return pse_data_quota + ple_data_quota + pse_mcu_quota; 53 54 } 54 55 55 - static struct sk_buff *mt7663s_build_rx_skb(void *data, int data_len, 56 - int buf_len) 56 + static struct sk_buff * 57 + mt76s_build_rx_skb(void *data, int data_len, int buf_len) 57 58 { 58 59 int len = min_t(int, data_len, MT_SKB_HEAD_LEN); 59 60 struct sk_buff *skb; ··· 77 78 return skb; 78 79 } 79 80 80 - static int mt7663s_rx_run_queue(struct mt76_dev *dev, enum mt76_rxq_id qid, 81 - struct mt76s_intr *intr) 81 + static int 82 + mt76s_rx_run_queue(struct mt76_dev *dev, enum mt76_rxq_id qid, 83 + struct mt76s_intr *intr) 82 84 { 83 85 struct mt76_queue *q = &dev->q_rx[qid]; 84 86 struct mt76_sdio *sdio = &dev->sdio; ··· 112 112 for (i = 0; i < intr->rx.num[qid]; i++) { 113 113 int index = (q->head + i) % q->ndesc; 114 114 struct mt76_queue_entry *e = &q->entry[index]; 115 + __le32 *rxd = (__le32 *)buf; 115 116 116 - len = intr->rx.len[qid][i]; 117 - e->skb = mt7663s_build_rx_skb(buf, len, round_up(len + 4, 4)); 117 + /* parse rxd to get the actual packet length */ 118 + len = FIELD_GET(GENMASK(15, 0), le32_to_cpu(rxd[0])); 119 + e->skb = mt76s_build_rx_skb(buf, len, round_up(len + 4, 4)); 118 120 if (!e->skb) 119 121 break; 120 122 ··· 134 132 return i; 135 133 } 136 134 137 - static int mt7663s_rx_handler(struct mt76_dev *dev) 135 + static int mt76s_rx_handler(struct mt76_dev *dev) 138 136 { 139 137 struct mt76_sdio *sdio = &dev->sdio; 140 - struct mt76s_intr *intr = sdio->intr_data; 138 + struct mt76s_intr intr; 141 139 int nframes = 0, ret; 142 140 143 - ret = sdio_readsb(sdio->func, intr, MCR_WHISR, sizeof(*intr)); 144 - if (ret < 0) 141 + ret = sdio->parse_irq(dev, &intr); 142 + if (ret) 145 143 return ret; 146 144 147 - trace_dev_irq(dev, intr->isr, 0); 145 + trace_dev_irq(dev, intr.isr, 0); 148 146 149 - if (intr->isr & WHIER_RX0_DONE_INT_EN) { 150 - ret = mt7663s_rx_run_queue(dev, 0, intr); 147 + if (intr.isr & WHIER_RX0_DONE_INT_EN) { 148 + ret = mt76s_rx_run_queue(dev, 0, &intr); 151 149 if (ret > 0) { 152 150 mt76_worker_schedule(&sdio->net_worker); 153 151 nframes += ret; 154 152 } 155 153 } 156 154 157 - if (intr->isr & WHIER_RX1_DONE_INT_EN) { 158 - ret = mt7663s_rx_run_queue(dev, 1, intr); 155 + if (intr.isr & WHIER_RX1_DONE_INT_EN) { 156 + ret = mt76s_rx_run_queue(dev, 1, &intr); 159 157 if (ret > 0) { 160 158 mt76_worker_schedule(&sdio->net_worker); 161 159 nframes += ret; 162 160 } 163 161 } 164 162 165 - nframes += !!mt7663s_refill_sched_quota(dev, intr->tx.wtqcr); 163 + nframes += !!mt76s_refill_sched_quota(dev, intr.tx.wtqcr); 166 164 167 165 return nframes; 168 166 } 169 167 170 - static int mt7663s_tx_pick_quota(struct mt76_sdio *sdio, bool mcu, int buf_sz, 171 - int *pse_size, int *ple_size) 168 + static int 169 + mt76s_tx_pick_quota(struct mt76_sdio *sdio, bool mcu, int buf_sz, 170 + int *pse_size, int *ple_size) 172 171 { 173 172 int pse_sz; 174 173 175 - pse_sz = DIV_ROUND_UP(buf_sz + sdio->sched.deficit, MT_PSE_PAGE_SZ); 174 + pse_sz = DIV_ROUND_UP(buf_sz + sdio->sched.deficit, 175 + sdio->sched.pse_page_size); 176 + 177 + if (mcu && sdio->hw_ver == MT76_CONNAC2_SDIO) 178 + pse_sz = 1; 176 179 177 180 if (mcu) { 178 181 if (sdio->sched.pse_mcu_quota < *pse_size + pse_sz) ··· 194 187 return 0; 195 188 } 196 189 197 - static void mt7663s_tx_update_quota(struct mt76_sdio *sdio, bool mcu, 198 - int pse_size, int ple_size) 190 + static void 191 + mt76s_tx_update_quota(struct mt76_sdio *sdio, bool mcu, int pse_size, 192 + int ple_size) 199 193 { 200 194 if (mcu) { 201 195 sdio->sched.pse_mcu_quota -= pse_size; ··· 206 198 } 207 199 } 208 200 209 - static int __mt7663s_xmit_queue(struct mt76_dev *dev, u8 *data, int len) 201 + static int __mt76s_xmit_queue(struct mt76_dev *dev, u8 *data, int len) 210 202 { 211 203 struct mt76_sdio *sdio = &dev->sdio; 212 204 int err; ··· 221 213 return err; 222 214 } 223 215 224 - static int mt7663s_tx_run_queue(struct mt76_dev *dev, struct mt76_queue *q) 216 + static int mt76s_tx_run_queue(struct mt76_dev *dev, struct mt76_queue *q) 225 217 { 226 218 int qid, err, nframes = 0, len = 0, pse_sz = 0, ple_sz = 0; 227 219 bool mcu = q == dev->q_mcu[MT_MCUQ_WM]; ··· 235 227 236 228 smp_rmb(); 237 229 230 + if (test_bit(MT76_MCU_RESET, &dev->phy.state)) 231 + goto next; 232 + 238 233 if (!test_bit(MT76_STATE_MCU_RUNNING, &dev->phy.state)) { 239 234 __skb_put_zero(e->skb, 4); 240 - err = __mt7663s_xmit_queue(dev, e->skb->data, 241 - e->skb->len); 235 + err = __mt76s_xmit_queue(dev, e->skb->data, 236 + e->skb->len); 242 237 if (err) 243 238 return err; 244 239 ··· 252 241 if (len + e->skb->len + pad + 4 > MT76S_XMIT_BUF_SZ) 253 242 break; 254 243 255 - if (mt7663s_tx_pick_quota(sdio, mcu, e->buf_sz, &pse_sz, 256 - &ple_sz)) 244 + if (mt76s_tx_pick_quota(sdio, mcu, e->buf_sz, &pse_sz, 245 + &ple_sz)) 257 246 break; 258 247 259 248 memcpy(sdio->xmit_buf[qid] + len, e->skb->data, ··· 279 268 280 269 if (nframes) { 281 270 memset(sdio->xmit_buf[qid] + len, 0, 4); 282 - err = __mt7663s_xmit_queue(dev, sdio->xmit_buf[qid], len + 4); 271 + err = __mt76s_xmit_queue(dev, sdio->xmit_buf[qid], len + 4); 283 272 if (err) 284 273 return err; 285 274 } 286 - mt7663s_tx_update_quota(sdio, mcu, pse_sz, ple_sz); 275 + mt76s_tx_update_quota(sdio, mcu, pse_sz, ple_sz); 287 276 288 277 mt76_worker_schedule(&sdio->status_worker); 289 278 290 279 return nframes; 291 280 } 292 281 293 - void mt7663s_txrx_worker(struct mt76_worker *w) 282 + void mt76s_txrx_worker(struct mt76_sdio *sdio) 294 283 { 295 - struct mt76_sdio *sdio = container_of(w, struct mt76_sdio, 296 - txrx_worker); 297 - struct mt76_dev *mdev = container_of(sdio, struct mt76_dev, sdio); 298 - struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76); 284 + struct mt76_dev *dev = container_of(sdio, struct mt76_dev, sdio); 299 285 int i, nframes, ret; 300 - 301 - if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) { 302 - queue_work(mdev->wq, &dev->pm.wake_work); 303 - return; 304 - } 305 286 306 287 /* disable interrupt */ 307 288 sdio_claim_host(sdio->func); ··· 304 301 305 302 /* tx */ 306 303 for (i = 0; i <= MT_TXQ_PSD; i++) { 307 - ret = mt7663s_tx_run_queue(mdev, mdev->phy.q_tx[i]); 304 + ret = mt76s_tx_run_queue(dev, dev->phy.q_tx[i]); 308 305 if (ret > 0) 309 306 nframes += ret; 310 307 } 311 - ret = mt7663s_tx_run_queue(mdev, mdev->q_mcu[MT_MCUQ_WM]); 308 + ret = mt76s_tx_run_queue(dev, dev->q_mcu[MT_MCUQ_WM]); 312 309 if (ret > 0) 313 310 nframes += ret; 314 311 315 312 /* rx */ 316 - ret = mt7663s_rx_handler(mdev); 313 + ret = mt76s_rx_handler(dev); 317 314 if (ret > 0) 318 315 nframes += ret; 316 + 317 + if (test_bit(MT76_MCU_RESET, &dev->phy.state)) { 318 + if (!mt76s_txqs_empty(dev)) 319 + continue; 320 + else 321 + wake_up(&sdio->wait); 322 + } 319 323 } while (nframes > 0); 320 324 321 325 /* enable interrupt */ 322 326 sdio_writel(sdio->func, WHLPCR_INT_EN_SET, MCR_WHLPCR, NULL); 323 327 sdio_release_host(sdio->func); 324 - 325 - mt76_connac_pm_unref(&dev->mphy, &dev->pm); 326 328 } 329 + EXPORT_SYMBOL_GPL(mt76s_txrx_worker); 327 330 328 - void mt7663s_sdio_irq(struct sdio_func *func) 331 + void mt76s_sdio_irq(struct sdio_func *func) 329 332 { 330 - struct mt7615_dev *dev = sdio_get_drvdata(func); 331 - struct mt76_sdio *sdio = &dev->mt76.sdio; 333 + struct mt76_dev *dev = sdio_get_drvdata(func); 334 + struct mt76_sdio *sdio = &dev->sdio; 332 335 333 - if (!test_bit(MT76_STATE_INITIALIZED, &dev->mt76.phy.state)) 336 + if (!test_bit(MT76_STATE_INITIALIZED, &dev->phy.state) || 337 + test_bit(MT76_MCU_RESET, &dev->phy.state)) 334 338 return; 335 339 336 340 mt76_worker_schedule(&sdio->txrx_worker); 337 341 } 342 + EXPORT_SYMBOL_GPL(mt76s_sdio_irq); 343 + 344 + bool mt76s_txqs_empty(struct mt76_dev *dev) 345 + { 346 + struct mt76_queue *q; 347 + int i; 348 + 349 + for (i = 0; i <= MT_TXQ_PSD + 1; i++) { 350 + if (i <= MT_TXQ_PSD) 351 + q = dev->phy.q_tx[i]; 352 + else 353 + q = dev->q_mcu[MT_MCUQ_WM]; 354 + 355 + if (q->first != q->head) 356 + return false; 357 + } 358 + 359 + return true; 360 + } 361 + EXPORT_SYMBOL_GPL(mt76s_txqs_empty);
+1 -1
drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c
··· 169 169 mt7615_mac_sta_poll(dev); 170 170 mt7615_mutex_release(dev); 171 171 172 - return 0; 172 + return false; 173 173 } 174 174 EXPORT_SYMBOL_GPL(mt7663_usb_sdio_tx_status_data); 175 175
+6 -1
drivers/net/wireless/mediatek/mt76/mt76_connac.h
··· 85 85 86 86 extern const struct wiphy_wowlan_support mt76_connac_wowlan_support; 87 87 88 + static inline bool is_mt7922(struct mt76_dev *dev) 89 + { 90 + return mt76_chip(dev) == 0x7922; 91 + } 92 + 88 93 static inline bool is_mt7921(struct mt76_dev *dev) 89 94 { 90 - return mt76_chip(dev) == 0x7961; 95 + return mt76_chip(dev) == 0x7961 || is_mt7922(dev); 91 96 } 92 97 93 98 static inline bool is_mt7663(struct mt76_dev *dev)
+325 -30
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
··· 74 74 75 75 int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy) 76 76 { 77 - struct mt76_dev *dev = phy->dev; 77 + int len, i, n_max_channels, n_2ch = 0, n_5ch = 0, n_6ch = 0; 78 78 struct mt76_connac_mcu_channel_domain { 79 79 u8 alpha2[4]; /* regulatory_request.alpha2 */ 80 80 u8 bw_2g; /* BW_20_40M 0 ··· 84 84 * BW_20_40_80_8080M 4 85 85 */ 86 86 u8 bw_5g; 87 - __le16 pad; 87 + u8 bw_6g; 88 + u8 pad; 88 89 u8 n_2ch; 89 90 u8 n_5ch; 90 - __le16 pad2; 91 + u8 n_6ch; 92 + u8 pad2; 91 93 } __packed hdr = { 92 94 .bw_2g = 0, 93 - .bw_5g = 3, 95 + .bw_5g = 3, /* BW_20_40_80_160M */ 96 + .bw_6g = 3, 94 97 }; 95 98 struct mt76_connac_mcu_chan { 96 99 __le16 hw_value; 97 100 __le16 pad; 98 101 __le32 flags; 99 102 } __packed channel; 100 - int len, i, n_max_channels, n_2ch = 0, n_5ch = 0; 103 + struct mt76_dev *dev = phy->dev; 101 104 struct ieee80211_channel *chan; 102 105 struct sk_buff *skb; 103 106 104 107 n_max_channels = phy->sband_2g.sband.n_channels + 105 - phy->sband_5g.sband.n_channels; 108 + phy->sband_5g.sband.n_channels + 109 + phy->sband_6g.sband.n_channels; 106 110 len = sizeof(hdr) + n_max_channels * sizeof(channel); 107 111 108 112 skb = mt76_mcu_msg_alloc(dev, NULL, len); ··· 139 135 skb_put_data(skb, &channel, sizeof(channel)); 140 136 n_5ch++; 141 137 } 138 + for (i = 0; i < phy->sband_6g.sband.n_channels; i++) { 139 + chan = &phy->sband_6g.sband.channels[i]; 140 + if (chan->flags & IEEE80211_CHAN_DISABLED) 141 + continue; 142 + 143 + channel.hw_value = cpu_to_le16(chan->hw_value); 144 + channel.flags = cpu_to_le32(chan->flags); 145 + channel.pad = 0; 146 + 147 + skb_put_data(skb, &channel, sizeof(channel)); 148 + n_6ch++; 149 + } 142 150 143 151 BUILD_BUG_ON(sizeof(dev->alpha2) > sizeof(hdr.alpha2)); 144 152 memcpy(hdr.alpha2, dev->alpha2, sizeof(dev->alpha2)); 145 153 hdr.n_2ch = n_2ch; 146 154 hdr.n_5ch = n_5ch; 155 + hdr.n_6ch = n_6ch; 147 156 148 157 memcpy(__skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr)); 149 158 ··· 706 689 if (ht_cap->ht_supported) 707 690 mode |= PHY_TYPE_BIT_HT; 708 691 709 - if (he_cap->has_he) 692 + if (he_cap && he_cap->has_he) 710 693 mode |= PHY_TYPE_BIT_HE; 711 - } else if (band == NL80211_BAND_5GHZ) { 694 + } else if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) { 712 695 mode |= PHY_TYPE_BIT_OFDM; 713 696 714 697 if (ht_cap->ht_supported) ··· 717 700 if (vht_cap->vht_supported) 718 701 mode |= PHY_TYPE_BIT_VHT; 719 702 720 - if (he_cap->has_he) 703 + if (he_cap && he_cap->has_he) 721 704 mode |= PHY_TYPE_BIT_HE; 722 705 } 723 706 ··· 736 719 struct sta_rec_state *state; 737 720 struct sta_rec_phy *phy; 738 721 struct tlv *tlv; 722 + u16 supp_rates; 739 723 740 724 /* starec ht */ 741 725 if (sta->ht_cap.ht_supported) { ··· 766 748 if (!is_mt7921(dev)) 767 749 return; 768 750 769 - if (sta->ht_cap.ht_supported) 751 + if (sta->ht_cap.ht_supported || sta->he_cap.has_he) 770 752 mt76_connac_mcu_sta_amsdu_tlv(skb, sta, vif); 771 753 772 754 /* starec he */ 773 - if (sta->he_cap.has_he) 755 + if (sta->he_cap.has_he) { 774 756 mt76_connac_mcu_sta_he_tlv(skb, sta); 757 + if (band == NL80211_BAND_6GHZ && 758 + sta_state == MT76_STA_INFO_STATE_ASSOC) { 759 + struct sta_rec_he_6g_capa *he_6g_capa; 760 + 761 + tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_6G, 762 + sizeof(*he_6g_capa)); 763 + he_6g_capa = (struct sta_rec_he_6g_capa *)tlv; 764 + he_6g_capa->capa = sta->he_6ghz_capa.capa; 765 + } 766 + } 775 767 776 768 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy)); 777 769 phy = (struct sta_rec_phy *)tlv; ··· 795 767 796 768 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info)); 797 769 ra_info = (struct sta_rec_ra_info *)tlv; 798 - ra_info->legacy = cpu_to_le16((u16)sta->supp_rates[band]); 770 + 771 + supp_rates = sta->supp_rates[band]; 772 + if (band == NL80211_BAND_2GHZ) 773 + supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates >> 4) | 774 + FIELD_PREP(RA_LEGACY_CCK, supp_rates & 0xf); 775 + else 776 + supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates); 777 + 778 + ra_info->legacy = cpu_to_le16(supp_rates); 799 779 800 780 if (sta->ht_cap.ht_supported) 801 781 memcpy(ra_info->rx_mcs_bitmask, sta->ht_cap.mcs.rx_mask, ··· 1181 1145 1182 1146 if (he_cap->has_he) 1183 1147 mode |= PHY_MODE_AX_24G; 1184 - } else if (band == NL80211_BAND_5GHZ) { 1148 + } else if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) { 1185 1149 mode |= PHY_MODE_A; 1186 1150 1187 1151 if (ht_cap->ht_supported) ··· 1190 1154 if (vht_cap->vht_supported) 1191 1155 mode |= PHY_MODE_AC; 1192 1156 1193 - if (he_cap->has_he) 1194 - mode |= PHY_MODE_AX_5G; 1157 + if (he_cap->has_he) { 1158 + if (band == NL80211_BAND_6GHZ) 1159 + mode |= PHY_MODE_AX_6G; 1160 + else 1161 + mode |= PHY_MODE_AX_5G; 1162 + } 1195 1163 } 1196 1164 1197 1165 return mode; ··· 1292 1252 u8 short_st; 1293 1253 u8 ht_op_info; 1294 1254 u8 sco; 1295 - u8 pad[3]; 1255 + u8 band; 1256 + u8 pad[2]; 1296 1257 } __packed rlm; 1297 1258 } __packed rlm_req = { 1298 1259 .hdr = { ··· 1309 1268 .ht_op_info = 4, /* set HT 40M allowed */ 1310 1269 .rx_streams = phy->chainmask, 1311 1270 .short_st = true, 1271 + .band = band, 1312 1272 }, 1313 1273 }; 1314 1274 int err, conn_type; 1315 - u8 idx; 1275 + u8 idx, basic_phy; 1316 1276 1317 1277 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx; 1318 1278 basic_req.basic.hw_bss_idx = idx; 1279 + if (band == NL80211_BAND_6GHZ) 1280 + basic_req.basic.phymode_ext = BIT(0); 1281 + 1282 + basic_phy = mt76_connac_get_phy_mode_v2(phy, vif, band, NULL); 1283 + basic_req.basic.nonht_basic_phy = cpu_to_le16(basic_phy); 1319 1284 1320 1285 switch (vif->type) { 1321 1286 case NL80211_IFTYPE_MESH_POINT: ··· 1492 1445 else 1493 1446 chan = &req->channels[i]; 1494 1447 1495 - chan->band = scan_list[i]->band == NL80211_BAND_2GHZ ? 1 : 2; 1448 + switch (scan_list[i]->band) { 1449 + case NL80211_BAND_2GHZ: 1450 + chan->band = 1; 1451 + break; 1452 + case NL80211_BAND_6GHZ: 1453 + chan->band = 3; 1454 + break; 1455 + default: 1456 + chan->band = 2; 1457 + break; 1458 + } 1496 1459 chan->channel_num = scan_list[i]->hw_value; 1497 1460 } 1498 1461 req->channel_type = sreq->n_channels ? 4 : 0; ··· 1588 1531 get_random_mask_addr(addr, sreq->mac_addr, 1589 1532 sreq->mac_addr_mask); 1590 1533 } 1591 - if (is_mt7921(phy->dev)) 1534 + if (is_mt7921(phy->dev)) { 1592 1535 req->mt7921.bss_idx = mvif->idx; 1536 + req->mt7921.delay = cpu_to_le32(sreq->delay); 1537 + } 1593 1538 1594 1539 req->ssids_num = sreq->n_ssids; 1595 1540 for (i = 0; i < req->ssids_num; i++) { ··· 1613 1554 req->channels_num = min_t(u8, sreq->n_channels, 64); 1614 1555 for (i = 0; i < req->channels_num; i++) { 1615 1556 chan = &req->channels[i]; 1616 - chan->band = scan_list[i]->band == NL80211_BAND_2GHZ ? 1 : 2; 1557 + 1558 + switch (scan_list[i]->band) { 1559 + case NL80211_BAND_2GHZ: 1560 + chan->band = 1; 1561 + break; 1562 + case NL80211_BAND_6GHZ: 1563 + chan->band = 3; 1564 + break; 1565 + default: 1566 + chan->band = 2; 1567 + break; 1568 + } 1617 1569 chan->channel_num = scan_list[i]->hw_value; 1618 1570 } 1619 1571 ··· 1722 1652 } 1723 1653 EXPORT_SYMBOL_GPL(mt76_connac_mcu_coredump_event); 1724 1654 1655 + static void mt76_connac_mcu_parse_tx_resource(struct mt76_dev *dev, 1656 + struct sk_buff *skb) 1657 + { 1658 + struct mt76_sdio *sdio = &dev->sdio; 1659 + struct mt76_connac_tx_resource { 1660 + __le32 version; 1661 + __le32 pse_data_quota; 1662 + __le32 pse_mcu_quota; 1663 + __le32 ple_data_quota; 1664 + __le32 ple_mcu_quota; 1665 + __le16 pse_page_size; 1666 + __le16 ple_page_size; 1667 + u8 pp_padding; 1668 + u8 pad[3]; 1669 + } __packed * tx_res; 1670 + 1671 + tx_res = (struct mt76_connac_tx_resource *)skb->data; 1672 + sdio->sched.pse_data_quota = le32_to_cpu(tx_res->pse_data_quota); 1673 + sdio->sched.pse_mcu_quota = le32_to_cpu(tx_res->pse_mcu_quota); 1674 + sdio->sched.ple_data_quota = le32_to_cpu(tx_res->ple_data_quota); 1675 + sdio->sched.pse_page_size = le16_to_cpu(tx_res->pse_page_size); 1676 + sdio->sched.deficit = tx_res->pp_padding; 1677 + } 1678 + 1679 + static void mt76_connac_mcu_parse_phy_cap(struct mt76_dev *dev, 1680 + struct sk_buff *skb) 1681 + { 1682 + struct mt76_connac_phy_cap { 1683 + u8 ht; 1684 + u8 vht; 1685 + u8 _5g; 1686 + u8 max_bw; 1687 + u8 nss; 1688 + u8 dbdc; 1689 + u8 tx_ldpc; 1690 + u8 rx_ldpc; 1691 + u8 tx_stbc; 1692 + u8 rx_stbc; 1693 + u8 hw_path; 1694 + u8 he; 1695 + } __packed * cap; 1696 + 1697 + enum { 1698 + WF0_24G, 1699 + WF0_5G 1700 + }; 1701 + 1702 + cap = (struct mt76_connac_phy_cap *)skb->data; 1703 + 1704 + dev->phy.antenna_mask = BIT(cap->nss) - 1; 1705 + dev->phy.chainmask = dev->phy.antenna_mask; 1706 + dev->phy.cap.has_2ghz = cap->hw_path & BIT(WF0_24G); 1707 + dev->phy.cap.has_5ghz = cap->hw_path & BIT(WF0_5G); 1708 + } 1709 + 1725 1710 int mt76_connac_mcu_get_nic_capability(struct mt76_phy *phy) 1726 1711 { 1727 1712 struct mt76_connac_cap_hdr { ··· 1818 1693 switch (le32_to_cpu(tlv->type)) { 1819 1694 case MT_NIC_CAP_6G: 1820 1695 phy->cap.has_6ghz = skb->data[0]; 1696 + break; 1697 + case MT_NIC_CAP_MAC_ADDR: 1698 + memcpy(phy->macaddr, (void *)skb->data, ETH_ALEN); 1699 + break; 1700 + case MT_NIC_CAP_PHY: 1701 + mt76_connac_mcu_parse_phy_cap(phy->dev, skb); 1702 + break; 1703 + case MT_NIC_CAP_TX_RESOURCE: 1704 + if (mt76_is_sdio(phy->dev)) 1705 + mt76_connac_mcu_parse_tx_resource(phy->dev, 1706 + skb); 1821 1707 break; 1822 1708 default: 1823 1709 break; ··· 1885 1749 } 1886 1750 } 1887 1751 1752 + static s8 mt76_connac_get_sar_power(struct mt76_phy *phy, 1753 + struct ieee80211_channel *chan, 1754 + s8 target_power) 1755 + { 1756 + const struct cfg80211_sar_capa *capa = phy->hw->wiphy->sar_capa; 1757 + struct mt76_freq_range_power *frp = phy->frp; 1758 + int freq, i; 1759 + 1760 + if (!capa || !frp) 1761 + return target_power; 1762 + 1763 + freq = ieee80211_channel_to_frequency(chan->hw_value, chan->band); 1764 + for (i = 0 ; i < capa->num_freq_ranges; i++) { 1765 + if (frp[i].range && 1766 + freq >= frp[i].range->start_freq && 1767 + freq < frp[i].range->end_freq) { 1768 + target_power = min_t(s8, frp[i].power, target_power); 1769 + break; 1770 + } 1771 + } 1772 + 1773 + return target_power; 1774 + } 1775 + 1776 + static s8 mt76_connac_get_ch_power(struct mt76_phy *phy, 1777 + struct ieee80211_channel *chan, 1778 + s8 target_power) 1779 + { 1780 + struct mt76_dev *dev = phy->dev; 1781 + struct ieee80211_supported_band *sband; 1782 + int i; 1783 + 1784 + switch (chan->band) { 1785 + case NL80211_BAND_2GHZ: 1786 + sband = &phy->sband_2g.sband; 1787 + break; 1788 + case NL80211_BAND_5GHZ: 1789 + sband = &phy->sband_5g.sband; 1790 + break; 1791 + case NL80211_BAND_6GHZ: 1792 + sband = &phy->sband_6g.sband; 1793 + break; 1794 + default: 1795 + return target_power; 1796 + } 1797 + 1798 + for (i = 0; i < sband->n_channels; i++) { 1799 + struct ieee80211_channel *ch = &sband->channels[i]; 1800 + 1801 + if (ch->hw_value == chan->hw_value) { 1802 + if (!(ch->flags & IEEE80211_CHAN_DISABLED)) { 1803 + int power = 2 * ch->max_reg_power; 1804 + 1805 + if (is_mt7663(dev) && (power > 63 || power < -64)) 1806 + power = 63; 1807 + target_power = min_t(s8, power, target_power); 1808 + } 1809 + break; 1810 + } 1811 + } 1812 + 1813 + return target_power; 1814 + } 1815 + 1888 1816 static int 1889 1817 mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy, 1890 1818 enum nl80211_band band) ··· 1968 1768 142, 144, 149, 151, 153, 155, 157, 1969 1769 159, 161, 165 1970 1770 }; 1771 + static const u8 chan_list_6ghz[] = { 1772 + 1, 3, 5, 7, 9, 11, 13, 1773 + 15, 17, 19, 21, 23, 25, 27, 1774 + 29, 33, 35, 37, 39, 41, 43, 1775 + 45, 47, 49, 51, 53, 55, 57, 1776 + 59, 61, 65, 67, 69, 71, 73, 1777 + 75, 77, 79, 81, 83, 85, 87, 1778 + 89, 91, 93, 97, 99, 101, 103, 1779 + 105, 107, 109, 111, 113, 115, 117, 1780 + 119, 121, 123, 125, 129, 131, 133, 1781 + 135, 137, 139, 141, 143, 145, 147, 1782 + 149, 151, 153, 155, 157, 161, 163, 1783 + 165, 167, 169, 171, 173, 175, 177, 1784 + 179, 181, 183, 185, 187, 189, 193, 1785 + 195, 197, 199, 201, 203, 205, 207, 1786 + 209, 211, 213, 215, 217, 219, 221, 1787 + 225, 227, 229, 233 1788 + }; 1971 1789 int i, n_chan, batch_size, idx = 0, tx_power, last_ch; 1972 1790 struct mt76_connac_sku_tlv sku_tlbv; 1973 1791 struct mt76_power_limits limits; ··· 1999 1781 if (band == NL80211_BAND_2GHZ) { 2000 1782 n_chan = ARRAY_SIZE(chan_list_2ghz); 2001 1783 ch_list = chan_list_2ghz; 1784 + } else if (band == NL80211_BAND_6GHZ) { 1785 + n_chan = ARRAY_SIZE(chan_list_6ghz); 1786 + ch_list = chan_list_6ghz; 2002 1787 } else { 2003 1788 n_chan = ARRAY_SIZE(chan_list_5ghz); 2004 1789 ch_list = chan_list_5ghz; ··· 2010 1789 2011 1790 if (!phy->cap.has_5ghz) 2012 1791 last_ch = chan_list_2ghz[n_chan - 1]; 1792 + else if (phy->cap.has_6ghz) 1793 + last_ch = chan_list_6ghz[n_chan - 1]; 2013 1794 else 2014 1795 last_ch = chan_list_5ghz[n_chan - 1]; 2015 1796 2016 1797 for (i = 0; i < batch_size; i++) { 2017 - struct mt76_connac_tx_power_limit_tlv tx_power_tlv = { 2018 - .band = band == NL80211_BAND_2GHZ ? 1 : 2, 2019 - }; 1798 + struct mt76_connac_tx_power_limit_tlv tx_power_tlv = {}; 2020 1799 int j, err, msg_len, num_ch; 2021 1800 struct sk_buff *skb; 2022 1801 ··· 2032 1811 memcpy(tx_power_tlv.alpha2, dev->alpha2, sizeof(dev->alpha2)); 2033 1812 tx_power_tlv.n_chan = num_ch; 2034 1813 1814 + switch (band) { 1815 + case NL80211_BAND_2GHZ: 1816 + tx_power_tlv.band = 1; 1817 + break; 1818 + case NL80211_BAND_6GHZ: 1819 + tx_power_tlv.band = 3; 1820 + break; 1821 + default: 1822 + tx_power_tlv.band = 2; 1823 + break; 1824 + } 1825 + 2035 1826 for (j = 0; j < num_ch; j++, idx++) { 2036 1827 struct ieee80211_channel chan = { 2037 1828 .hw_value = ch_list[idx], 2038 1829 .band = band, 2039 1830 }; 1831 + s8 reg_power, sar_power; 1832 + 1833 + reg_power = mt76_connac_get_ch_power(phy, &chan, 1834 + tx_power); 1835 + sar_power = mt76_connac_get_sar_power(phy, &chan, 1836 + reg_power); 2040 1837 2041 1838 mt76_get_rate_power_limits(phy, &chan, &limits, 2042 - tx_power); 1839 + sar_power); 2043 1840 2044 1841 tx_power_tlv.last_msg = ch_list[idx] == last_ch; 2045 1842 sku_tlbv.channel = ch_list[idx]; ··· 2091 1852 if (phy->cap.has_5ghz) { 2092 1853 err = mt76_connac_mcu_rate_txpower_band(phy, 2093 1854 NL80211_BAND_5GHZ); 1855 + if (err < 0) 1856 + return err; 1857 + } 1858 + if (phy->cap.has_6ghz) { 1859 + err = mt76_connac_mcu_rate_txpower_band(phy, 1860 + NL80211_BAND_6GHZ); 2094 1861 if (err < 0) 2095 1862 return err; 2096 1863 } ··· 2147 1902 } 2148 1903 EXPORT_SYMBOL_GPL(mt76_connac_mcu_update_arp_filter); 2149 1904 1905 + int mt76_connac_mcu_set_p2p_oppps(struct ieee80211_hw *hw, 1906 + struct ieee80211_vif *vif) 1907 + { 1908 + struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv; 1909 + int ct_window = vif->bss_conf.p2p_noa_attr.oppps_ctwindow; 1910 + struct mt76_phy *phy = hw->priv; 1911 + struct { 1912 + __le32 ct_win; 1913 + u8 bss_idx; 1914 + u8 rsv[3]; 1915 + } __packed req = { 1916 + .ct_win = cpu_to_le32(ct_window), 1917 + .bss_idx = mvif->idx, 1918 + }; 1919 + 1920 + return mt76_mcu_send_msg(phy->dev, MCU_CMD_SET_P2P_OPPPS, &req, 1921 + sizeof(req), false); 1922 + } 1923 + EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_p2p_oppps); 1924 + 2150 1925 #ifdef CONFIG_PM 2151 1926 2152 1927 const struct wiphy_wowlan_support mt76_connac_wowlan_support = { ··· 2194 1929 key->cipher != WLAN_CIPHER_SUITE_TKIP) 2195 1930 return; 2196 1931 2197 - if (key->cipher == WLAN_CIPHER_SUITE_TKIP) { 2198 - gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1); 1932 + if (key->cipher == WLAN_CIPHER_SUITE_TKIP) 2199 1933 cipher = BIT(3); 2200 - } else { 2201 - gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2); 1934 + else 2202 1935 cipher = BIT(4); 2203 - } 2204 1936 2205 1937 /* we are assuming here to have a single pairwise key */ 2206 1938 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { 1939 + if (key->cipher == WLAN_CIPHER_SUITE_TKIP) 1940 + gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1); 1941 + else 1942 + gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2); 1943 + 2207 1944 gtk_tlv->pairwise_cipher = cpu_to_le32(cipher); 2208 - gtk_tlv->group_cipher = cpu_to_le32(cipher); 2209 1945 gtk_tlv->keyid = key->keyidx; 1946 + } else { 1947 + gtk_tlv->group_cipher = cpu_to_le32(cipher); 2210 1948 } 2211 1949 } 2212 1950 ··· 2478 2210 } 2479 2211 EXPORT_SYMBOL_GPL(mt76_connac_mcu_set_suspend_iter); 2480 2212 2213 + u32 mt76_connac_mcu_reg_rr(struct mt76_dev *dev, u32 offset) 2214 + { 2215 + struct { 2216 + __le32 addr; 2217 + __le32 val; 2218 + } __packed req = { 2219 + .addr = cpu_to_le32(offset), 2220 + }; 2221 + 2222 + return mt76_mcu_send_msg(dev, MCU_CMD_REG_READ, &req, sizeof(req), 2223 + true); 2224 + } 2225 + EXPORT_SYMBOL_GPL(mt76_connac_mcu_reg_rr); 2226 + 2227 + void mt76_connac_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val) 2228 + { 2229 + struct { 2230 + __le32 addr; 2231 + __le32 val; 2232 + } __packed req = { 2233 + .addr = cpu_to_le32(offset), 2234 + .val = cpu_to_le32(val), 2235 + }; 2236 + 2237 + mt76_mcu_send_msg(dev, MCU_CMD_REG_WRITE, &req, sizeof(req), false); 2238 + } 2239 + EXPORT_SYMBOL_GPL(mt76_connac_mcu_reg_wr); 2481 2240 #endif /* CONFIG_PM */ 2482 2241 2483 2242 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
+30 -7
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
··· 124 124 u8 rsv[1]; 125 125 } __packed; 126 126 127 + #define RA_LEGACY_OFDM GENMASK(13, 6) 128 + #define RA_LEGACY_CCK GENMASK(3, 0) 127 129 #define HT_MCS_MASK_NUM 10 128 130 struct sta_rec_ra_info { 129 131 __le16 tag; ··· 142 140 u8 ampdu; 143 141 u8 rts_policy; 144 142 u8 rcpi; 143 + u8 rsv[2]; 144 + } __packed; 145 + 146 + struct sta_rec_he_6g_capa { 147 + __le16 tag; 148 + __le16 len; 149 + __le16 capa; 145 150 u8 rsv[2]; 146 151 } __packed; 147 152 ··· 310 301 sizeof(struct sta_rec_vht) + \ 311 302 sizeof(struct sta_rec_uapsd) + \ 312 303 sizeof(struct sta_rec_amsdu) + \ 304 + sizeof(struct sta_rec_he_6g_capa) + \ 313 305 sizeof(struct tlv) + \ 314 306 MT76_CONNAC_WTBL_UPDATE_MAX_SIZE) 315 307 ··· 337 327 STA_REC_MUEDCA, 338 328 STA_REC_BFEE, 339 329 STA_REC_PHY = 0x15, 330 + STA_REC_HE_6G = 0x17, 340 331 STA_REC_MAX_NUM 341 332 }; 342 333 ··· 559 548 560 549 /* offload mcu commands */ 561 550 enum { 551 + MCU_CMD_TEST_CTRL = MCU_CE_PREFIX | 0x01, 562 552 MCU_CMD_START_HW_SCAN = MCU_CE_PREFIX | 0x03, 563 553 MCU_CMD_SET_PS_PROFILE = MCU_CE_PREFIX | 0x05, 564 554 MCU_CMD_SET_CHAN_DOMAIN = MCU_CE_PREFIX | 0x0f, ··· 572 560 MCU_CMD_SCHED_SCAN_ENABLE = MCU_CE_PREFIX | 0x61, 573 561 MCU_CMD_SCHED_SCAN_REQ = MCU_CE_PREFIX | 0x62, 574 562 MCU_CMD_GET_NIC_CAPAB = MCU_CE_PREFIX | 0x8a, 563 + MCU_CMD_SET_MU_EDCA_PARMS = MCU_CE_PREFIX | 0xb0, 575 564 MCU_CMD_REG_WRITE = MCU_CE_PREFIX | 0xc0, 576 565 MCU_CMD_REG_READ = MCU_CE_PREFIX | MCU_QUERY_MASK | 0xc0, 577 566 MCU_CMD_CHIP_CONFIG = MCU_CE_PREFIX | 0xca, ··· 669 656 * bit(3): GN 670 657 * bit(4): AN 671 658 * bit(5): AC 659 + * bit(6): AX2 660 + * bit(7): AX5 661 + * bit(8): AX6 672 662 */ 673 663 __le16 sta_idx; 674 - u8 nonht_basic_phy; 675 - u8 pad[3]; 664 + __le16 nonht_basic_phy; 665 + u8 phymode_ext; /* bit(0) AX_6G */ 666 + u8 pad[1]; 676 667 } __packed; 677 668 678 669 struct mt76_connac_bss_qos_tlv { ··· 819 802 } mt7663; 820 803 struct { 821 804 u8 bss_idx; 822 - u8 pad2[19]; 805 + u8 pad1[3]; 806 + __le32 delay; 807 + u8 pad2[12]; 823 808 u8 random_mac[ETH_ALEN]; 824 809 u8 pad3[38]; 825 810 } mt7921; ··· 863 844 * 2: rekey update 864 845 */ 865 846 u8 keyid; 866 - u8 pad[2]; 847 + u8 option; /* 1: rekey data update without enabling offload */ 848 + u8 pad[1]; 867 849 __le32 proto; /* WPA-RSN-WAPI-OPSN */ 868 850 __le32 pairwise_cipher; 869 851 __le32 group_cipher; 870 852 __le32 key_mgmt; /* NONE-PSK-IEEE802.1X */ 871 853 __le32 mgmt_group_cipher; 872 - u8 option; /* 1: rekey data update without enabling offload */ 873 - u8 reserverd[3]; 854 + u8 reserverd[4]; 874 855 } __packed; 875 856 876 857 #define MT76_CONNAC_WOW_MASK_MAX_LEN 16 ··· 980 961 __le16 len; 981 962 /* DW1 - cmd hint */ 982 963 u8 n_chan; /* # channel */ 983 - u8 band; /* 2.4GHz - 5GHz */ 964 + u8 band; /* 2.4GHz - 5GHz - 6GHz */ 984 965 u8 last_msg; 985 966 u8 pad1; 986 967 /* DW3 */ ··· 1112 1093 void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb, 1113 1094 struct mt76_connac_coredump *coredump); 1114 1095 int mt76_connac_mcu_set_rate_txpower(struct mt76_phy *phy); 1096 + int mt76_connac_mcu_set_p2p_oppps(struct ieee80211_hw *hw, 1097 + struct ieee80211_vif *vif); 1098 + u32 mt76_connac_mcu_reg_rr(struct mt76_dev *dev, u32 offset); 1099 + void mt76_connac_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val); 1115 1100 #endif /* __MT76_CONNAC_MCU_H */
+1 -1
drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c
··· 201 201 t->stbc[6] = t->stbc[7] = s6_to_s8(val >> 8); 202 202 203 203 /* vht mcs 8, 9 5GHz */ 204 - val = mt76x02_eeprom_get(dev, 0x132); 204 + val = mt76x02_eeprom_get(dev, 0x12c); 205 205 t->vht[8] = s6_to_s8(val); 206 206 t->vht[9] = s6_to_s8(val >> 8); 207 207
+3 -1
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
··· 176 176 177 177 pci_set_master(pdev); 178 178 179 - ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 179 + ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); 180 180 if (ret) 181 181 return ret; 182 182 ··· 276 276 277 277 mt76_worker_enable(&mdev->tx_worker); 278 278 279 + local_bh_disable(); 279 280 mt76_for_each_q_rx(mdev, i) { 280 281 mt76_queue_rx_reset(dev, i); 281 282 napi_enable(&mdev->napi[i]); ··· 285 284 286 285 napi_enable(&mdev->tx_napi); 287 286 napi_schedule(&mdev->tx_napi); 287 + local_bh_enable(); 288 288 289 289 return mt76x0e_init_hardware(dev, true); 290 290 }
+8 -7
drivers/net/wireless/mediatek/mt76/mt76x02_mac.c
··· 176 176 mt76_wr(dev, MT_WCID_DROP(idx), (val & ~bit) | (bit * drop)); 177 177 } 178 178 179 - static __le16 179 + static u16 180 180 mt76x02_mac_tx_rate_val(struct mt76x02_dev *dev, 181 181 const struct ieee80211_tx_rate *rate, u8 *nss_val) 182 182 { ··· 222 222 rateval |= MT_RXWI_RATE_SGI; 223 223 224 224 *nss_val = nss; 225 - return cpu_to_le16(rateval); 225 + return rateval; 226 226 } 227 227 228 228 void mt76x02_mac_wcid_set_rate(struct mt76x02_dev *dev, struct mt76_wcid *wcid, 229 229 const struct ieee80211_tx_rate *rate) 230 230 { 231 231 s8 max_txpwr_adj = mt76x02_tx_get_max_txpwr_adj(dev, rate); 232 - __le16 rateval; 232 + u16 rateval; 233 233 u32 tx_info; 234 234 s8 nss; 235 235 ··· 342 342 struct ieee80211_key_conf *key = info->control.hw_key; 343 343 u32 wcid_tx_info; 344 344 u16 rate_ht_mask = FIELD_PREP(MT_RXWI_RATE_PHY, BIT(1) | BIT(2)); 345 - u16 txwi_flags = 0; 345 + u16 txwi_flags = 0, rateval; 346 346 u8 nss; 347 347 s8 txpwr_adj, max_txpwr_adj; 348 348 u8 ccmp_pn[8], nstreams = dev->mphy.chainmask & 0xf; ··· 380 380 381 381 if (wcid && (rate->idx < 0 || !rate->count)) { 382 382 wcid_tx_info = wcid->tx_info; 383 - txwi->rate = FIELD_GET(MT_WCID_TX_INFO_RATE, wcid_tx_info); 383 + rateval = FIELD_GET(MT_WCID_TX_INFO_RATE, wcid_tx_info); 384 384 max_txpwr_adj = FIELD_GET(MT_WCID_TX_INFO_TXPWR_ADJ, 385 385 wcid_tx_info); 386 386 nss = FIELD_GET(MT_WCID_TX_INFO_NSS, wcid_tx_info); 387 387 } else { 388 - txwi->rate = mt76x02_mac_tx_rate_val(dev, rate, &nss); 388 + rateval = mt76x02_mac_tx_rate_val(dev, rate, &nss); 389 389 max_txpwr_adj = mt76x02_tx_get_max_txpwr_adj(dev, rate); 390 390 } 391 + txwi->rate = cpu_to_le16(rateval); 391 392 392 393 txpwr_adj = mt76x02_tx_get_txpwr_adj(dev, dev->txpower_conf, 393 394 max_txpwr_adj); ··· 1186 1185 1187 1186 mutex_unlock(&dev->mt76.mutex); 1188 1187 1189 - mt76_tx_status_check(&dev->mt76, NULL, false); 1188 + mt76_tx_status_check(&dev->mt76, false); 1190 1189 1191 1190 ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mphy.mac_work, 1192 1191 MT_MAC_WORK_INTERVAL);
+7 -5
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
··· 53 53 mt76_skb_set_moredata(data.tail[i], false); 54 54 } 55 55 56 - spin_lock_bh(&q->lock); 56 + spin_lock(&q->lock); 57 57 while ((skb = __skb_dequeue(&data.q)) != NULL) { 58 58 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 59 59 struct ieee80211_vif *vif = info->control.vif; ··· 61 61 62 62 mt76_tx_queue_skb(dev, q, skb, &mvif->group_wcid, NULL); 63 63 } 64 - spin_unlock_bh(&q->lock); 64 + spin_unlock(&q->lock); 65 65 } 66 66 67 67 static void mt76x02e_pre_tbtt_enable(struct mt76x02_dev *dev, bool en) ··· 472 472 mt76_queue_rx_reset(dev, i); 473 473 } 474 474 475 - mt76_tx_status_check(&dev->mt76, NULL, true); 475 + mt76_tx_status_check(&dev->mt76, true); 476 476 477 477 mt76x02_mac_start(dev); 478 478 ··· 491 491 clear_bit(MT76_RESET, &dev->mphy.state); 492 492 493 493 mt76_worker_enable(&dev->mt76.tx_worker); 494 + tasklet_enable(&dev->mt76.pre_tbtt_tasklet); 495 + 496 + local_bh_disable(); 494 497 napi_enable(&dev->mt76.tx_napi); 495 498 napi_schedule(&dev->mt76.tx_napi); 496 - 497 - tasklet_enable(&dev->mt76.pre_tbtt_tasklet); 498 499 499 500 mt76_for_each_q_rx(&dev->mt76, i) { 500 501 napi_enable(&dev->mt76.napi[i]); 501 502 napi_schedule(&dev->mt76.napi[i]); 502 503 } 504 + local_bh_enable(); 503 505 504 506 if (restart) { 505 507 set_bit(MT76_RESTART, &dev->mphy.state);
+3
drivers/net/wireless/mediatek/mt76/mt76x02_util.c
··· 287 287 mvif->idx = idx; 288 288 mvif->group_wcid.idx = MT_VIF_WCID(idx); 289 289 mvif->group_wcid.hw_key_idx = -1; 290 + mt76_packet_id_init(&mvif->group_wcid); 291 + 290 292 mtxq = (struct mt76_txq *)vif->txq->drv_priv; 291 293 mtxq->wcid = &mvif->group_wcid; 292 294 } ··· 343 341 struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv; 344 342 345 343 dev->mt76.vif_mask &= ~BIT(mvif->idx); 344 + mt76_packet_id_flush(&dev->mt76, &mvif->group_wcid); 346 345 } 347 346 EXPORT_SYMBOL_GPL(mt76x02_remove_interface); 348 347
+4 -1
drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
··· 47 47 48 48 pci_set_master(pdev); 49 49 50 - ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 50 + ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); 51 51 if (ret) 52 52 return ret; 53 53 ··· 149 149 pci_restore_state(pdev); 150 150 151 151 mt76_worker_enable(&mdev->tx_worker); 152 + 153 + local_bh_disable(); 152 154 mt76_for_each_q_rx(mdev, i) { 153 155 napi_enable(&mdev->napi[i]); 154 156 napi_schedule(&mdev->napi[i]); 155 157 } 156 158 napi_enable(&mdev->tx_napi); 157 159 napi_schedule(&mdev->tx_napi); 160 + local_bh_enable(); 158 161 159 162 return mt76x2_resume_device(dev); 160 163 }
+239 -154
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
··· 7 7 8 8 /** global debugfs **/ 9 9 10 + struct hw_queue_map { 11 + const char *name; 12 + u8 index; 13 + u8 pid; 14 + u8 qid; 15 + }; 16 + 10 17 static int 11 18 mt7915_implicit_txbf_set(void *data, u64 val) 12 19 { ··· 120 113 mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy, 121 114 struct seq_file *file) 122 115 { 123 - struct mt7915_dev *dev = file->private; 116 + struct mt7915_dev *dev = phy->dev; 124 117 bool ext_phy = phy != &dev->phy; 125 118 int bound[15], range[4], i, n; 126 - 127 - if (!phy) 128 - return; 129 119 130 120 /* Tx ampdu stat */ 131 121 for (i = 0; i < ARRAY_SIZE(range); i++) ··· 150 146 static void 151 147 mt7915_txbf_stat_read_phy(struct mt7915_phy *phy, struct seq_file *s) 152 148 { 153 - struct mt7915_dev *dev = s->private; 154 - bool ext_phy = phy != &dev->phy; 155 149 static const char * const bw[] = { 156 150 "BW20", "BW40", "BW80", "BW160" 157 151 }; 158 - int cnt; 159 - 160 - if (!phy) 161 - return; 152 + struct mib_stats *mib = &phy->mib; 162 153 163 154 /* Tx Beamformer monitor */ 164 155 seq_puts(s, "\nTx Beamformer applied PPDU counts: "); 165 156 166 - cnt = mt76_rr(dev, MT_ETBF_TX_APP_CNT(ext_phy)); 167 - seq_printf(s, "iBF: %ld, eBF: %ld\n", 168 - FIELD_GET(MT_ETBF_TX_IBF_CNT, cnt), 169 - FIELD_GET(MT_ETBF_TX_EBF_CNT, cnt)); 157 + seq_printf(s, "iBF: %d, eBF: %d\n", 158 + mib->tx_bf_ibf_ppdu_cnt, 159 + mib->tx_bf_ebf_ppdu_cnt); 170 160 171 161 /* Tx Beamformer Rx feedback monitor */ 172 162 seq_puts(s, "Tx Beamformer Rx feedback statistics: "); 173 163 174 - cnt = mt76_rr(dev, MT_ETBF_RX_FB_CNT(ext_phy)); 175 - seq_printf(s, "All: %ld, HE: %ld, VHT: %ld, HT: %ld, ", 176 - FIELD_GET(MT_ETBF_RX_FB_ALL, cnt), 177 - FIELD_GET(MT_ETBF_RX_FB_HE, cnt), 178 - FIELD_GET(MT_ETBF_RX_FB_VHT, cnt), 179 - FIELD_GET(MT_ETBF_RX_FB_HT, cnt)); 180 - cnt = mt76_rr(dev, MT_ETBF_RX_FB_CONT(ext_phy)); 181 - seq_printf(s, "%s, NC: %ld, NR: %ld\n", 182 - bw[FIELD_GET(MT_ETBF_RX_FB_BW, cnt)], 183 - FIELD_GET(MT_ETBF_RX_FB_NC, cnt), 184 - FIELD_GET(MT_ETBF_RX_FB_NR, cnt)); 164 + seq_printf(s, "All: %d, HE: %d, VHT: %d, HT: %d, ", 165 + mib->tx_bf_rx_fb_all_cnt, 166 + mib->tx_bf_rx_fb_he_cnt, 167 + mib->tx_bf_rx_fb_vht_cnt, 168 + mib->tx_bf_rx_fb_ht_cnt); 169 + 170 + seq_printf(s, "%s, NC: %d, NR: %d\n", 171 + bw[mib->tx_bf_rx_fb_bw], 172 + mib->tx_bf_rx_fb_nc_cnt, 173 + mib->tx_bf_rx_fb_nr_cnt); 185 174 186 175 /* Tx Beamformee Rx NDPA & Tx feedback report */ 187 - cnt = mt76_rr(dev, MT_ETBF_TX_NDP_BFRP(ext_phy)); 188 - seq_printf(s, "Tx Beamformee successful feedback frames: %ld\n", 189 - FIELD_GET(MT_ETBF_TX_FB_CPL, cnt)); 190 - seq_printf(s, "Tx Beamformee feedback triggered counts: %ld\n", 191 - FIELD_GET(MT_ETBF_TX_FB_TRI, cnt)); 176 + seq_printf(s, "Tx Beamformee successful feedback frames: %d\n", 177 + mib->tx_bf_fb_cpl_cnt); 178 + seq_printf(s, "Tx Beamformee feedback triggered counts: %d\n", 179 + mib->tx_bf_fb_trig_cnt); 192 180 193 181 /* Tx SU & MU counters */ 194 - cnt = mt76_rr(dev, MT_MIB_SDR34(ext_phy)); 195 - seq_printf(s, "Tx multi-user Beamforming counts: %ld\n", 196 - FIELD_GET(MT_MIB_MU_BF_TX_CNT, cnt)); 197 - cnt = mt76_rr(dev, MT_MIB_DR8(ext_phy)); 198 - seq_printf(s, "Tx multi-user MPDU counts: %d\n", cnt); 199 - cnt = mt76_rr(dev, MT_MIB_DR9(ext_phy)); 200 - seq_printf(s, "Tx multi-user successful MPDU counts: %d\n", cnt); 201 - cnt = mt76_rr(dev, MT_MIB_DR11(ext_phy)); 202 - seq_printf(s, "Tx single-user successful MPDU counts: %d\n", cnt); 182 + seq_printf(s, "Tx multi-user Beamforming counts: %d\n", 183 + mib->tx_bf_cnt); 184 + seq_printf(s, "Tx multi-user MPDU counts: %d\n", mib->tx_mu_mpdu_cnt); 185 + seq_printf(s, "Tx multi-user successful MPDU counts: %d\n", 186 + mib->tx_mu_acked_mpdu_cnt); 187 + seq_printf(s, "Tx single-user successful MPDU counts: %d\n", 188 + mib->tx_su_acked_mpdu_cnt); 203 189 204 190 seq_puts(s, "\n"); 205 191 } ··· 197 203 static int 198 204 mt7915_tx_stats_show(struct seq_file *file, void *data) 199 205 { 200 - struct mt7915_dev *dev = file->private; 201 - int stat[8], i, n; 206 + struct mt7915_phy *phy = file->private; 207 + struct mt7915_dev *dev = phy->dev; 208 + struct mib_stats *mib = &phy->mib; 209 + int i; 202 210 203 - mt7915_ampdu_stat_read_phy(&dev->phy, file); 204 - mt7915_txbf_stat_read_phy(&dev->phy, file); 211 + mutex_lock(&dev->mt76.mutex); 205 212 206 - mt7915_ampdu_stat_read_phy(mt7915_ext_phy(dev), file); 207 - mt7915_txbf_stat_read_phy(mt7915_ext_phy(dev), file); 213 + mt7915_ampdu_stat_read_phy(phy, file); 214 + mt7915_mac_update_stats(phy); 215 + mt7915_txbf_stat_read_phy(phy, file); 208 216 209 217 /* Tx amsdu info */ 210 218 seq_puts(file, "Tx MSDU statistics:\n"); 211 - for (i = 0, n = 0; i < ARRAY_SIZE(stat); i++) { 212 - stat[i] = mt76_rr(dev, MT_PLE_AMSDU_PACK_MSDU_CNT(i)); 213 - n += stat[i]; 214 - } 215 - 216 - for (i = 0; i < ARRAY_SIZE(stat); i++) { 217 - seq_printf(file, "AMSDU pack count of %d MSDU in TXD: 0x%x ", 218 - i + 1, stat[i]); 219 - if (n != 0) 220 - seq_printf(file, "(%d%%)\n", stat[i] * 100 / n); 219 + for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++) { 220 + seq_printf(file, "AMSDU pack count of %d MSDU in TXD: %8d ", 221 + i + 1, mib->tx_amsdu[i]); 222 + if (mib->tx_amsdu_cnt) 223 + seq_printf(file, "(%3d%%)\n", 224 + mib->tx_amsdu[i] * 100 / mib->tx_amsdu_cnt); 221 225 else 222 226 seq_puts(file, "\n"); 223 227 } 228 + 229 + mutex_unlock(&dev->mt76.mutex); 224 230 225 231 return 0; 226 232 } 227 233 228 234 DEFINE_SHOW_ATTRIBUTE(mt7915_tx_stats); 229 235 230 - static int 231 - mt7915_queues_acq(struct seq_file *s, void *data) 236 + static void 237 + mt7915_hw_queue_read(struct seq_file *s, u32 base, u32 size, 238 + const struct hw_queue_map *map) 232 239 { 233 - struct mt7915_dev *dev = dev_get_drvdata(s->private); 234 - int i; 240 + struct mt7915_phy *phy = s->private; 241 + struct mt7915_dev *dev = phy->dev; 242 + u32 i, val; 235 243 236 - for (i = 0; i < 16; i++) { 237 - int j, acs = i / 4, index = i % 4; 238 - u32 ctrl, val, qlen = 0; 244 + val = mt76_rr(dev, base + MT_FL_Q_EMPTY); 245 + for (i = 0; i < size; i++) { 246 + u32 ctrl, head, tail, queued; 239 247 240 - val = mt76_rr(dev, MT_PLE_AC_QEMPTY(acs, index)); 241 - ctrl = BIT(31) | BIT(15) | (acs << 8); 248 + if (val & BIT(map[i].index)) 249 + continue; 242 250 243 - for (j = 0; j < 32; j++) { 244 - if (val & BIT(j)) 245 - continue; 251 + ctrl = BIT(31) | (map[i].pid << 10) | (map[i].qid << 24); 252 + mt76_wr(dev, base + MT_FL_Q0_CTRL, ctrl); 246 253 247 - mt76_wr(dev, MT_PLE_FL_Q0_CTRL, 248 - ctrl | (j + (index << 5))); 249 - qlen += mt76_get_field(dev, MT_PLE_FL_Q3_CTRL, 250 - GENMASK(11, 0)); 251 - } 252 - seq_printf(s, "AC%d%d: queued=%d\n", acs, index, qlen); 254 + head = mt76_get_field(dev, base + MT_FL_Q2_CTRL, 255 + GENMASK(11, 0)); 256 + tail = mt76_get_field(dev, base + MT_FL_Q2_CTRL, 257 + GENMASK(27, 16)); 258 + queued = mt76_get_field(dev, base + MT_FL_Q3_CTRL, 259 + GENMASK(11, 0)); 260 + 261 + seq_printf(s, "\t%s: ", map[i].name); 262 + seq_printf(s, "queued:0x%03x head:0x%03x tail:0x%03x\n", 263 + queued, head, tail); 253 264 } 265 + } 266 + 267 + static void 268 + mt7915_sta_hw_queue_read(void *data, struct ieee80211_sta *sta) 269 + { 270 + struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 271 + struct mt7915_dev *dev = msta->vif->phy->dev; 272 + struct seq_file *s = data; 273 + u8 ac; 274 + 275 + for (ac = 0; ac < 4; ac++) { 276 + u32 qlen, ctrl, val; 277 + u32 idx = msta->wcid.idx >> 5; 278 + u8 offs = msta->wcid.idx & GENMASK(4, 0); 279 + 280 + ctrl = BIT(31) | BIT(11) | (ac << 24); 281 + val = mt76_rr(dev, MT_PLE_AC_QEMPTY(ac, idx)); 282 + 283 + if (val & BIT(offs)) 284 + continue; 285 + 286 + mt76_wr(dev, MT_PLE_BASE + MT_FL_Q0_CTRL, ctrl | msta->wcid.idx); 287 + qlen = mt76_get_field(dev, MT_PLE_BASE + MT_FL_Q3_CTRL, 288 + GENMASK(11, 0)); 289 + seq_printf(s, "\tSTA %pM wcid %d: AC%d%d queued:%d\n", 290 + sta->addr, msta->wcid.idx, msta->vif->wmm_idx, 291 + ac, qlen); 292 + } 293 + } 294 + 295 + static int 296 + mt7915_hw_queues_show(struct seq_file *file, void *data) 297 + { 298 + struct mt7915_phy *phy = file->private; 299 + struct mt7915_dev *dev = phy->dev; 300 + static const struct hw_queue_map ple_queue_map[] = { 301 + { "CPU_Q0", 0, 1, MT_CTX0 }, 302 + { "CPU_Q1", 1, 1, MT_CTX0 + 1 }, 303 + { "CPU_Q2", 2, 1, MT_CTX0 + 2 }, 304 + { "CPU_Q3", 3, 1, MT_CTX0 + 3 }, 305 + { "ALTX_Q0", 8, 2, MT_LMAC_ALTX0 }, 306 + { "BMC_Q0", 9, 2, MT_LMAC_BMC0 }, 307 + { "BCN_Q0", 10, 2, MT_LMAC_BCN0 }, 308 + { "PSMP_Q0", 11, 2, MT_LMAC_PSMP0 }, 309 + { "ALTX_Q1", 12, 2, MT_LMAC_ALTX0 + 4 }, 310 + { "BMC_Q1", 13, 2, MT_LMAC_BMC0 + 4 }, 311 + { "BCN_Q1", 14, 2, MT_LMAC_BCN0 + 4 }, 312 + { "PSMP_Q1", 15, 2, MT_LMAC_PSMP0 + 4 }, 313 + }; 314 + static const struct hw_queue_map pse_queue_map[] = { 315 + { "CPU Q0", 0, 1, MT_CTX0 }, 316 + { "CPU Q1", 1, 1, MT_CTX0 + 1 }, 317 + { "CPU Q2", 2, 1, MT_CTX0 + 2 }, 318 + { "CPU Q3", 3, 1, MT_CTX0 + 3 }, 319 + { "HIF_Q0", 8, 0, MT_HIF0 }, 320 + { "HIF_Q1", 9, 0, MT_HIF0 + 1 }, 321 + { "HIF_Q2", 10, 0, MT_HIF0 + 2 }, 322 + { "HIF_Q3", 11, 0, MT_HIF0 + 3 }, 323 + { "HIF_Q4", 12, 0, MT_HIF0 + 4 }, 324 + { "HIF_Q5", 13, 0, MT_HIF0 + 5 }, 325 + { "LMAC_Q", 16, 2, 0 }, 326 + { "MDP_TXQ", 17, 2, 1 }, 327 + { "MDP_RXQ", 18, 2, 2 }, 328 + { "SEC_TXQ", 19, 2, 3 }, 329 + { "SEC_RXQ", 20, 2, 4 }, 330 + }; 331 + u32 val, head, tail; 332 + 333 + /* ple queue */ 334 + val = mt76_rr(dev, MT_PLE_FREEPG_CNT); 335 + head = mt76_get_field(dev, MT_PLE_FREEPG_HEAD_TAIL, GENMASK(11, 0)); 336 + tail = mt76_get_field(dev, MT_PLE_FREEPG_HEAD_TAIL, GENMASK(27, 16)); 337 + seq_puts(file, "PLE page info:\n"); 338 + seq_printf(file, 339 + "\tTotal free page: 0x%08x head: 0x%03x tail: 0x%03x\n", 340 + val, head, tail); 341 + 342 + val = mt76_rr(dev, MT_PLE_PG_HIF_GROUP); 343 + head = mt76_get_field(dev, MT_PLE_HIF_PG_INFO, GENMASK(11, 0)); 344 + tail = mt76_get_field(dev, MT_PLE_HIF_PG_INFO, GENMASK(27, 16)); 345 + seq_printf(file, "\tHIF free page: 0x%03x res: 0x%03x used: 0x%03x\n", 346 + val, head, tail); 347 + 348 + seq_puts(file, "PLE non-empty queue info:\n"); 349 + mt7915_hw_queue_read(file, MT_PLE_BASE, ARRAY_SIZE(ple_queue_map), 350 + &ple_queue_map[0]); 351 + 352 + /* iterate per-sta ple queue */ 353 + ieee80211_iterate_stations_atomic(phy->mt76->hw, 354 + mt7915_sta_hw_queue_read, file); 355 + /* pse queue */ 356 + seq_puts(file, "PSE non-empty queue info:\n"); 357 + mt7915_hw_queue_read(file, MT_PSE_BASE, ARRAY_SIZE(pse_queue_map), 358 + &pse_queue_map[0]); 254 359 255 360 return 0; 256 361 } 257 362 363 + DEFINE_SHOW_ATTRIBUTE(mt7915_hw_queues); 364 + 258 365 static int 259 - mt7915_queues_read(struct seq_file *s, void *data) 366 + mt7915_xmit_queues_show(struct seq_file *file, void *data) 260 367 { 261 - struct mt7915_dev *dev = dev_get_drvdata(s->private); 262 - struct mt76_phy *mphy_ext = dev->mt76.phy2; 263 - struct mt76_queue *ext_q = mphy_ext ? mphy_ext->q_tx[MT_TXQ_BE] : NULL; 368 + struct mt7915_phy *phy = file->private; 369 + struct mt7915_dev *dev = phy->dev; 264 370 struct { 265 371 struct mt76_queue *q; 266 372 char *queue; 267 373 } queue_map[] = { 268 - { dev->mphy.q_tx[MT_TXQ_BE], "WFDMA0" }, 269 - { ext_q, "WFDMA1" }, 270 - { dev->mphy.q_tx[MT_TXQ_BE], "WFDMA0" }, 271 - { dev->mt76.q_mcu[MT_MCUQ_WM], "MCUWM" }, 272 - { dev->mt76.q_mcu[MT_MCUQ_WA], "MCUWA" }, 273 - { dev->mt76.q_mcu[MT_MCUQ_FWDL], "MCUFWQ" }, 374 + { phy->mt76->q_tx[MT_TXQ_BE], " MAIN" }, 375 + { dev->mt76.q_mcu[MT_MCUQ_WM], " MCUWM" }, 376 + { dev->mt76.q_mcu[MT_MCUQ_WA], " MCUWA" }, 377 + { dev->mt76.q_mcu[MT_MCUQ_FWDL], "MCUFWDL" }, 274 378 }; 275 379 int i; 276 380 381 + seq_puts(file, " queue | hw-queued | head | tail |\n"); 277 382 for (i = 0; i < ARRAY_SIZE(queue_map); i++) { 278 383 struct mt76_queue *q = queue_map[i].q; 279 384 280 385 if (!q) 281 386 continue; 282 387 283 - seq_printf(s, 284 - "%s: queued=%d head=%d tail=%d\n", 388 + seq_printf(file, " %s | %9d | %9d | %9d |\n", 285 389 queue_map[i].queue, q->queued, q->head, 286 390 q->tail); 287 391 } ··· 387 295 return 0; 388 296 } 389 297 390 - static void 391 - mt7915_puts_rate_txpower(struct seq_file *s, struct mt7915_phy *phy) 298 + DEFINE_SHOW_ATTRIBUTE(mt7915_xmit_queues); 299 + 300 + static int 301 + mt7915_rate_txpower_show(struct seq_file *file, void *data) 392 302 { 393 303 static const char * const sku_group_name[] = { 394 304 "CCK", "OFDM", "HT20", "HT40", ··· 398 304 "RU26", "RU52", "RU106", "RU242/SU20", 399 305 "RU484/SU40", "RU996/SU80", "RU2x996/SU160" 400 306 }; 307 + struct mt7915_phy *phy = file->private; 401 308 s8 txpower[MT7915_SKU_RATE_NUM], *buf; 402 309 int i; 403 310 404 - if (!phy) 405 - return; 406 - 407 - seq_printf(s, "\nBand %d\n", phy != &phy->dev->phy); 408 - 311 + seq_printf(file, "\nBand %d\n", phy != &phy->dev->phy); 409 312 mt7915_mcu_get_txpower_sku(phy, txpower, sizeof(txpower)); 410 313 for (i = 0, buf = txpower; i < ARRAY_SIZE(mt7915_sku_group_len); i++) { 411 314 u8 mcs_num = mt7915_sku_group_len[i]; ··· 410 319 if (i >= SKU_VHT_BW20 && i <= SKU_VHT_BW160) 411 320 mcs_num = 10; 412 321 413 - mt76_seq_puts_array(s, sku_group_name[i], buf, mcs_num); 322 + mt76_seq_puts_array(file, sku_group_name[i], buf, mcs_num); 414 323 buf += mt7915_sku_group_len[i]; 415 324 } 416 - } 417 - 418 - static int 419 - mt7915_read_rate_txpower(struct seq_file *s, void *data) 420 - { 421 - struct mt7915_dev *dev = dev_get_drvdata(s->private); 422 - 423 - mt7915_puts_rate_txpower(s, &dev->phy); 424 - mt7915_puts_rate_txpower(s, mt7915_ext_phy(dev)); 425 325 426 326 return 0; 427 327 } 428 328 429 - int mt7915_init_debugfs(struct mt7915_dev *dev) 329 + DEFINE_SHOW_ATTRIBUTE(mt7915_rate_txpower); 330 + 331 + static int 332 + mt7915_twt_stats(struct seq_file *s, void *data) 430 333 { 334 + struct mt7915_dev *dev = dev_get_drvdata(s->private); 335 + struct mt7915_twt_flow *iter; 336 + 337 + rcu_read_lock(); 338 + 339 + seq_puts(s, " wcid | id | flags | exp | mantissa"); 340 + seq_puts(s, " | duration | tsf |\n"); 341 + list_for_each_entry_rcu(iter, &dev->twt_list, list) 342 + seq_printf(s, 343 + "%9d | %8d | %5c%c%c%c | %8d | %8d | %8d | %14lld |\n", 344 + iter->wcid, iter->id, 345 + iter->sched ? 's' : 'u', 346 + iter->protection ? 'p' : '-', 347 + iter->trigger ? 't' : '-', 348 + iter->flowtype ? '-' : 'a', 349 + iter->exp, iter->mantissa, 350 + iter->duration, iter->tsf); 351 + 352 + rcu_read_unlock(); 353 + 354 + return 0; 355 + } 356 + 357 + int mt7915_init_debugfs(struct mt7915_phy *phy) 358 + { 359 + struct mt7915_dev *dev = phy->dev; 360 + bool ext_phy = phy != &dev->phy; 431 361 struct dentry *dir; 432 362 433 - dir = mt76_register_debugfs(&dev->mt76); 363 + dir = mt76_register_debugfs_fops(phy->mt76, NULL); 434 364 if (!dir) 435 365 return -ENOMEM; 436 366 437 - debugfs_create_devm_seqfile(dev->mt76.dev, "queues", dir, 438 - mt7915_queues_read); 439 - debugfs_create_devm_seqfile(dev->mt76.dev, "acq", dir, 440 - mt7915_queues_acq); 441 - debugfs_create_file("tx_stats", 0400, dir, dev, &mt7915_tx_stats_fops); 367 + debugfs_create_file("hw-queues", 0400, dir, phy, 368 + &mt7915_hw_queues_fops); 369 + debugfs_create_file("xmit-queues", 0400, dir, phy, 370 + &mt7915_xmit_queues_fops); 371 + debugfs_create_file("tx_stats", 0400, dir, phy, &mt7915_tx_stats_fops); 442 372 debugfs_create_file("fw_debug", 0600, dir, dev, &fops_fw_debug); 443 373 debugfs_create_file("implicit_txbf", 0600, dir, dev, 444 374 &fops_implicit_txbf); 445 - debugfs_create_u32("dfs_hw_pattern", 0400, dir, &dev->hw_pattern); 446 - /* test knobs */ 447 - debugfs_create_file("radar_trigger", 0200, dir, dev, 448 - &fops_radar_trigger); 375 + debugfs_create_file("txpower_sku", 0400, dir, phy, 376 + &mt7915_rate_txpower_fops); 377 + debugfs_create_devm_seqfile(dev->mt76.dev, "twt_stats", dir, 378 + mt7915_twt_stats); 449 379 debugfs_create_file("ser_trigger", 0200, dir, dev, &fops_ser_trigger); 450 - debugfs_create_devm_seqfile(dev->mt76.dev, "txpower_sku", dir, 451 - mt7915_read_rate_txpower); 380 + if (!dev->dbdc_support || ext_phy) { 381 + debugfs_create_u32("dfs_hw_pattern", 0400, dir, 382 + &dev->hw_pattern); 383 + debugfs_create_file("radar_trigger", 0200, dir, dev, 384 + &fops_radar_trigger); 385 + } 452 386 453 387 return 0; 454 388 } ··· 481 365 #ifdef CONFIG_MAC80211_DEBUGFS 482 366 /** per-station debugfs **/ 483 367 484 - /* usage: <tx mode> <ldpc> <stbc> <bw> <gi> <nss> <mcs> */ 485 368 static int mt7915_sta_fixed_rate_set(void *data, u64 rate) 486 369 { 487 370 struct ieee80211_sta *sta = data; 488 371 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 489 372 373 + /* usage: <he ltf> <tx mode> <ldpc> <stbc> <bw> <gi> <nss> <mcs> 374 + * <tx mode>: see enum mt76_phy_type 375 + */ 490 376 return mt7915_mcu_set_fixed_rate(msta->vif->phy->dev, sta, rate); 491 377 } 492 378 ··· 496 378 mt7915_sta_fixed_rate_set, "%llx\n"); 497 379 498 380 static int 499 - mt7915_sta_stats_show(struct seq_file *s, void *data) 381 + mt7915_queues_show(struct seq_file *s, void *data) 500 382 { 501 383 struct ieee80211_sta *sta = s->private; 502 - struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 503 - struct mt7915_sta_stats *stats = &msta->stats; 504 - struct rate_info *rate = &stats->prob_rate; 505 - static const char * const bw[] = { 506 - "BW20", "BW5", "BW10", "BW40", 507 - "BW80", "BW160", "BW_HE_RU" 508 - }; 509 384 510 - if (!rate->legacy && !rate->flags) 511 - return 0; 512 - 513 - seq_puts(s, "Probing rate - "); 514 - if (rate->flags & RATE_INFO_FLAGS_MCS) 515 - seq_puts(s, "HT "); 516 - else if (rate->flags & RATE_INFO_FLAGS_VHT_MCS) 517 - seq_puts(s, "VHT "); 518 - else if (rate->flags & RATE_INFO_FLAGS_HE_MCS) 519 - seq_puts(s, "HE "); 520 - else 521 - seq_printf(s, "Bitrate %d\n", rate->legacy); 522 - 523 - if (rate->flags) { 524 - seq_printf(s, "%s NSS%d MCS%d ", 525 - bw[rate->bw], rate->nss, rate->mcs); 526 - 527 - if (rate->flags & RATE_INFO_FLAGS_SHORT_GI) 528 - seq_puts(s, "SGI "); 529 - else if (rate->he_gi) 530 - seq_puts(s, "HE GI "); 531 - 532 - if (rate->he_dcm) 533 - seq_puts(s, "DCM "); 534 - } 535 - 536 - seq_printf(s, "\nPPDU PER: %ld.%1ld%%\n", 537 - stats->per / 10, stats->per % 10); 385 + mt7915_sta_hw_queue_read(s, sta); 538 386 539 387 return 0; 540 388 } 541 389 542 - DEFINE_SHOW_ATTRIBUTE(mt7915_sta_stats); 390 + DEFINE_SHOW_ATTRIBUTE(mt7915_queues); 543 391 544 392 void mt7915_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 545 393 struct ieee80211_sta *sta, struct dentry *dir) 546 394 { 547 395 debugfs_create_file("fixed_rate", 0600, dir, sta, &fops_fixed_rate); 548 - debugfs_create_file("stats", 0400, dir, sta, &mt7915_sta_stats_fops); 396 + debugfs_create_file("hw-queues", 0400, dir, sta, &mt7915_queues_fops); 549 397 } 398 + 550 399 #endif
+148 -22
drivers/net/wireless/mediatek/mt76/mt7915/init.c
··· 42 42 } 43 43 }; 44 44 45 - static ssize_t mt7915_thermal_show_temp(struct device *dev, 45 + static ssize_t mt7915_thermal_temp_show(struct device *dev, 46 46 struct device_attribute *attr, 47 47 char *buf) 48 48 { 49 49 struct mt7915_phy *phy = dev_get_drvdata(dev); 50 + int i = to_sensor_dev_attr(attr)->index; 50 51 int temperature; 52 + 53 + if (i) 54 + return sprintf(buf, "%u\n", phy->throttle_temp[i - 1] * 1000); 51 55 52 56 temperature = mt7915_mcu_get_temperature(phy); 53 57 if (temperature < 0) ··· 61 57 return sprintf(buf, "%u\n", temperature * 1000); 62 58 } 63 59 64 - static SENSOR_DEVICE_ATTR(temp1_input, 0444, mt7915_thermal_show_temp, 65 - NULL, 0); 60 + static ssize_t mt7915_thermal_temp_store(struct device *dev, 61 + struct device_attribute *attr, 62 + const char *buf, size_t count) 63 + { 64 + struct mt7915_phy *phy = dev_get_drvdata(dev); 65 + int ret, i = to_sensor_dev_attr(attr)->index; 66 + long val; 67 + 68 + ret = kstrtol(buf, 10, &val); 69 + if (ret < 0) 70 + return ret; 71 + 72 + mutex_lock(&phy->dev->mt76.mutex); 73 + val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 60, 130); 74 + phy->throttle_temp[i - 1] = val; 75 + mutex_unlock(&phy->dev->mt76.mutex); 76 + 77 + return count; 78 + } 79 + 80 + static SENSOR_DEVICE_ATTR_RO(temp1_input, mt7915_thermal_temp, 0); 81 + static SENSOR_DEVICE_ATTR_RW(temp1_crit, mt7915_thermal_temp, 1); 82 + static SENSOR_DEVICE_ATTR_RW(temp1_max, mt7915_thermal_temp, 2); 66 83 67 84 static struct attribute *mt7915_hwmon_attrs[] = { 68 85 &sensor_dev_attr_temp1_input.dev_attr.attr, 86 + &sensor_dev_attr_temp1_crit.dev_attr.attr, 87 + &sensor_dev_attr_temp1_max.dev_attr.attr, 69 88 NULL, 70 89 }; 71 90 ATTRIBUTE_GROUPS(mt7915_hwmon); ··· 122 95 123 96 if (state > MT7915_THERMAL_THROTTLE_MAX) 124 97 return -EINVAL; 98 + 99 + if (phy->throttle_temp[0] > phy->throttle_temp[1]) 100 + return 0; 125 101 126 102 if (state == phy->throttle_state) 127 103 return 0; ··· 160 130 struct wiphy *wiphy = phy->mt76->hw->wiphy; 161 131 struct thermal_cooling_device *cdev; 162 132 struct device *hwmon; 133 + const char *name; 163 134 164 - cdev = thermal_cooling_device_register(wiphy_name(wiphy), phy, 165 - &mt7915_thermal_ops); 135 + name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7915_%s", 136 + wiphy_name(wiphy)); 137 + 138 + cdev = thermal_cooling_device_register(name, phy, &mt7915_thermal_ops); 166 139 if (!IS_ERR(cdev)) { 167 140 if (sysfs_create_link(&wiphy->dev.kobj, &cdev->device.kobj, 168 141 "cooling_device") < 0) ··· 177 144 if (!IS_REACHABLE(CONFIG_HWMON)) 178 145 return 0; 179 146 180 - hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, 181 - wiphy_name(wiphy), phy, 147 + hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, phy, 182 148 mt7915_hwmon_groups); 183 149 if (IS_ERR(hwmon)) 184 150 return PTR_ERR(hwmon); 185 151 152 + /* initialize critical/maximum high temperature */ 153 + phy->throttle_temp[0] = 110; 154 + phy->throttle_temp[1] = 120; 155 + 186 156 return 0; 157 + } 158 + 159 + static void mt7915_led_set_config(struct led_classdev *led_cdev, 160 + u8 delay_on, u8 delay_off) 161 + { 162 + struct mt7915_dev *dev; 163 + struct mt76_dev *mt76; 164 + u32 val; 165 + 166 + mt76 = container_of(led_cdev, struct mt76_dev, led_cdev); 167 + dev = container_of(mt76, struct mt7915_dev, mt76); 168 + 169 + /* select TX blink mode, 2: only data frames */ 170 + mt76_rmw_field(dev, MT_TMAC_TCR0(0), MT_TMAC_TCR0_TX_BLINK, 2); 171 + 172 + /* enable LED */ 173 + mt76_wr(dev, MT_LED_EN(0), 1); 174 + 175 + /* set LED Tx blink on/off time */ 176 + val = FIELD_PREP(MT_LED_TX_BLINK_ON_MASK, delay_on) | 177 + FIELD_PREP(MT_LED_TX_BLINK_OFF_MASK, delay_off); 178 + mt76_wr(dev, MT_LED_TX_BLINK(0), val); 179 + 180 + /* control LED */ 181 + val = MT_LED_CTRL_BLINK_MODE | MT_LED_CTRL_KICK; 182 + if (dev->mt76.led_al) 183 + val |= MT_LED_CTRL_POLARITY; 184 + 185 + mt76_wr(dev, MT_LED_CTRL(0), val); 186 + mt76_clear(dev, MT_LED_CTRL(0), MT_LED_CTRL_KICK); 187 + } 188 + 189 + static int mt7915_led_set_blink(struct led_classdev *led_cdev, 190 + unsigned long *delay_on, 191 + unsigned long *delay_off) 192 + { 193 + u16 delta_on = 0, delta_off = 0; 194 + 195 + #define HW_TICK 10 196 + #define TO_HW_TICK(_t) (((_t) > HW_TICK) ? ((_t) / HW_TICK) : HW_TICK) 197 + 198 + if (*delay_on) 199 + delta_on = TO_HW_TICK(*delay_on); 200 + if (*delay_off) 201 + delta_off = TO_HW_TICK(*delay_off); 202 + 203 + mt7915_led_set_config(led_cdev, delta_on, delta_off); 204 + 205 + return 0; 206 + } 207 + 208 + static void mt7915_led_set_brightness(struct led_classdev *led_cdev, 209 + enum led_brightness brightness) 210 + { 211 + if (!brightness) 212 + mt7915_led_set_config(led_cdev, 0, 0xff); 213 + else 214 + mt7915_led_set_config(led_cdev, 0xff, 0); 187 215 } 188 216 189 217 static void ··· 326 232 wiphy->reg_notifier = mt7915_regd_notifier; 327 233 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; 328 234 235 + wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BSS_COLOR); 329 236 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_VHT_IBSS); 237 + wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_LEGACY); 238 + wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HT); 239 + wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_VHT); 240 + wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HE); 330 241 331 242 ieee80211_hw_set(hw, HAS_RATE_CONTROL); 332 243 ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD); ··· 386 287 FIELD_PREP(MT_MDP_RCFR1_RX_DROPPED_MCAST, MT_MDP_TO_HIF); 387 288 mt76_rmw(dev, MT_MDP_BNRCFR1(band), mask, set); 388 289 389 - mt76_set(dev, MT_WF_RMAC_MIB_AIRTIME0(band), MT_WF_RMAC_MIB_RXTIME_EN); 390 - 391 - mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_MAX_RX_LEN, 1536); 290 + mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_MAX_RX_LEN, 0x680); 392 291 /* disable rx rate report by default due to hw issues */ 393 292 mt76_clear(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN); 394 293 } ··· 395 298 { 396 299 int i; 397 300 398 - mt76_rmw_field(dev, MT_MDP_DCR1, MT_MDP_DCR1_MAX_RX_LEN, 1536); 301 + mt76_rmw_field(dev, MT_MDP_DCR1, MT_MDP_DCR1_MAX_RX_LEN, 0x400); 399 302 /* enable hardware de-agg */ 400 303 mt76_set(dev, MT_MDP_DCR0, MT_MDP_DCR0_DAMSDU_EN); 401 304 ··· 404 307 MT_WTBL_UPDATE_ADM_COUNT_CLEAR); 405 308 for (i = 0; i < 2; i++) 406 309 mt7915_mac_init_band(dev, i); 310 + 311 + if (IS_ENABLED(CONFIG_MT76_LEDS)) { 312 + i = dev->mt76.led_pin ? MT_LED_GPIO_MUX3 : MT_LED_GPIO_MUX2; 313 + mt76_rmw_field(dev, i, MT_LED_GPIO_SEL_MASK, 4); 314 + } 407 315 } 408 316 409 317 static int mt7915_txbf_init(struct mt7915_dev *dev) ··· 452 350 mphy->chainmask = dev->chainmask & ~dev->mphy.chainmask; 453 351 mphy->antenna_mask = BIT(hweight8(mphy->chainmask)) - 1; 454 352 455 - INIT_LIST_HEAD(&phy->stats_list); 456 353 INIT_DELAYED_WORK(&mphy->mac_work, mt7915_mac_work); 457 354 458 355 mt7915_eeprom_parse_band_config(phy); ··· 472 371 goto error; 473 372 474 373 ret = mt7915_thermal_init(phy); 374 + if (ret) 375 + goto error; 376 + 377 + ret = mt7915_init_debugfs(phy); 475 378 if (ret) 476 379 goto error; 477 380 ··· 585 480 } 586 481 587 482 /* Beacon and mgmt frames should occupy wcid 0 */ 588 - idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA - 1); 483 + idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA); 589 484 if (idx) 590 485 return -ENOSPC; 591 486 ··· 630 525 int vif, int nss) 631 526 { 632 527 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; 633 - struct ieee80211_he_mcs_nss_supp *mcs = &he_cap->he_mcs_nss_supp; 634 528 u8 c; 635 529 636 530 #ifdef CONFIG_MAC80211_MESH ··· 681 577 elem->phy_cap_info[3] |= IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; 682 578 elem->phy_cap_info[4] |= IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; 683 579 684 - /* num_snd_dim */ 685 - c = (nss - 1) | (max_t(int, le16_to_cpu(mcs->tx_mcs_160), 1) << 3); 580 + /* num_snd_dim 581 + * for mt7915, max supported nss is 2 for bw > 80MHz 582 + */ 583 + c = (nss - 1) | 584 + IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2; 686 585 elem->phy_cap_info[5] |= c; 687 586 688 587 c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | ··· 720 613 { 721 614 int i, idx = 0, nss = hweight8(phy->mt76->chainmask); 722 615 u16 mcs_map = 0; 616 + u16 mcs_map_160 = 0; 723 617 724 618 for (i = 0; i < 8; i++) { 725 619 if (i < nss) 726 620 mcs_map |= (IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2)); 727 621 else 728 622 mcs_map |= (IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2)); 623 + 624 + /* Can do 1/2 of NSS streams in 160Mhz mode. */ 625 + if (i < nss / 2) 626 + mcs_map_160 |= (IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2)); 627 + else 628 + mcs_map_160 |= (IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2)); 729 629 } 730 630 731 631 for (i = 0; i < NUM_NL80211_IFTYPES; i++) { ··· 781 667 782 668 switch (i) { 783 669 case NL80211_IFTYPE_AP: 670 + he_cap_elem->mac_cap_info[0] |= 671 + IEEE80211_HE_MAC_CAP0_TWT_RES; 784 672 he_cap_elem->mac_cap_info[2] |= 785 673 IEEE80211_HE_MAC_CAP2_BSR; 786 674 he_cap_elem->mac_cap_info[4] |= ··· 793 677 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK | 794 678 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK; 795 679 he_cap_elem->phy_cap_info[6] |= 680 + IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE | 796 681 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT; 682 + he_cap_elem->phy_cap_info[9] |= 683 + IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU | 684 + IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU; 797 685 break; 798 686 case NL80211_IFTYPE_STATION: 799 687 he_cap_elem->mac_cap_info[1] |= ··· 840 720 841 721 he_mcs->rx_mcs_80 = cpu_to_le16(mcs_map); 842 722 he_mcs->tx_mcs_80 = cpu_to_le16(mcs_map); 843 - he_mcs->rx_mcs_160 = cpu_to_le16(mcs_map); 844 - he_mcs->tx_mcs_160 = cpu_to_le16(mcs_map); 845 - he_mcs->rx_mcs_80p80 = cpu_to_le16(mcs_map); 846 - he_mcs->tx_mcs_80p80 = cpu_to_le16(mcs_map); 723 + he_mcs->rx_mcs_160 = cpu_to_le16(mcs_map_160); 724 + he_mcs->tx_mcs_160 = cpu_to_le16(mcs_map_160); 725 + he_mcs->rx_mcs_80p80 = cpu_to_le16(mcs_map_160); 726 + he_mcs->tx_mcs_80p80 = cpu_to_le16(mcs_map_160); 847 727 848 728 mt7915_set_stream_he_txbf_caps(he_cap, i, nss); 849 729 ··· 907 787 dev->phy.dev = dev; 908 788 dev->phy.mt76 = &dev->mt76.phy; 909 789 dev->mt76.phy.priv = &dev->phy; 910 - INIT_LIST_HEAD(&dev->phy.stats_list); 911 790 INIT_WORK(&dev->rc_work, mt7915_mac_sta_rc_work); 912 791 INIT_DELAYED_WORK(&dev->mphy.mac_work, mt7915_mac_work); 913 792 INIT_LIST_HEAD(&dev->sta_rc_list); 914 793 INIT_LIST_HEAD(&dev->sta_poll_list); 794 + INIT_LIST_HEAD(&dev->twt_list); 915 795 spin_lock_init(&dev->sta_poll_lock); 916 796 917 797 init_waitqueue_head(&dev->reset_wait); ··· 936 816 dev->mt76.test_ops = &mt7915_testmode_ops; 937 817 #endif 938 818 819 + /* init led callbacks */ 820 + if (IS_ENABLED(CONFIG_MT76_LEDS)) { 821 + dev->mt76.led_cdev.brightness_set = mt7915_led_set_brightness; 822 + dev->mt76.led_cdev.blink_set = mt7915_led_set_blink; 823 + } 824 + 939 825 ret = mt76_register_device(&dev->mt76, true, mt76_rates, 940 826 ARRAY_SIZE(mt76_rates)); 941 827 if (ret) ··· 957 831 if (ret) 958 832 return ret; 959 833 960 - return mt7915_init_debugfs(dev); 834 + return mt7915_init_debugfs(&dev->phy); 961 835 } 962 836 963 837 void mt7915_unregister_device(struct mt7915_dev *dev)
+556 -90
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
··· 6 6 #include "mt7915.h" 7 7 #include "../dma.h" 8 8 #include "mac.h" 9 + #include "mcu.h" 9 10 10 11 #define to_rssi(field, rxv) ((FIELD_GET(field, rxv) - 220) / 2) 11 12 ··· 89 88 0, 5000); 90 89 } 91 90 92 - static u32 mt7915_mac_wtbl_lmac_addr(struct mt7915_dev *dev, u16 wcid) 91 + static u32 mt7915_mac_wtbl_lmac_addr(struct mt7915_dev *dev, u16 wcid, u8 dw) 93 92 { 94 93 mt76_wr(dev, MT_WTBLON_TOP_WDUCR, 95 94 FIELD_PREP(MT_WTBLON_TOP_WDUCR_GROUP, (wcid >> 7))); 96 95 97 - return MT_WTBL_LMAC_OFFS(wcid, 0); 96 + return MT_WTBL_LMAC_OFFS(wcid, dw); 98 97 } 99 98 100 - /* TODO: use txfree airtime info to avoid runtime accessing in the long run */ 101 99 static void mt7915_mac_sta_poll(struct mt7915_dev *dev) 102 100 { 103 101 static const u8 ac_to_tid[] = { ··· 107 107 }; 108 108 struct ieee80211_sta *sta; 109 109 struct mt7915_sta *msta; 110 + struct rate_info *rate; 110 111 u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS]; 111 112 LIST_HEAD(sta_poll_list); 112 113 int i; ··· 120 119 121 120 while (true) { 122 121 bool clear = false; 123 - u32 addr; 122 + u32 addr, val; 124 123 u16 idx; 124 + u8 bw; 125 125 126 126 spin_lock_bh(&dev->sta_poll_lock); 127 127 if (list_empty(&sta_poll_list)) { ··· 135 133 spin_unlock_bh(&dev->sta_poll_lock); 136 134 137 135 idx = msta->wcid.idx; 138 - addr = mt7915_mac_wtbl_lmac_addr(dev, idx) + 20 * 4; 136 + addr = mt7915_mac_wtbl_lmac_addr(dev, idx, 20); 139 137 140 138 for (i = 0; i < IEEE80211_NUM_ACS; i++) { 141 139 u32 tx_last = msta->airtime_ac[i]; ··· 175 173 176 174 ieee80211_sta_register_airtime(sta, tid, tx_cur, 177 175 rx_cur); 176 + } 177 + 178 + /* 179 + * We don't support reading GI info from txs packets. 180 + * For accurate tx status reporting and AQL improvement, 181 + * we need to make sure that flags match so polling GI 182 + * from per-sta counters directly. 183 + */ 184 + rate = &msta->wcid.rate; 185 + addr = mt7915_mac_wtbl_lmac_addr(dev, idx, 7); 186 + val = mt76_rr(dev, addr); 187 + 188 + switch (rate->bw) { 189 + case RATE_INFO_BW_160: 190 + bw = IEEE80211_STA_RX_BW_160; 191 + break; 192 + case RATE_INFO_BW_80: 193 + bw = IEEE80211_STA_RX_BW_80; 194 + break; 195 + case RATE_INFO_BW_40: 196 + bw = IEEE80211_STA_RX_BW_40; 197 + break; 198 + default: 199 + bw = IEEE80211_STA_RX_BW_20; 200 + break; 201 + } 202 + 203 + if (rate->flags & RATE_INFO_FLAGS_HE_MCS) { 204 + u8 offs = 24 + 2 * bw; 205 + 206 + rate->he_gi = (val & (0x3 << offs)) >> offs; 207 + } else if (rate->flags & 208 + (RATE_INFO_FLAGS_VHT_MCS | RATE_INFO_FLAGS_MCS)) { 209 + if (val & BIT(12 + bw)) 210 + rate->flags |= RATE_INFO_FLAGS_SHORT_GI; 211 + else 212 + rate->flags &= ~RATE_INFO_FLAGS_SHORT_GI; 178 213 } 179 214 } 180 215 ··· 268 229 } 269 230 270 231 static void 232 + mt7915_mac_decode_he_mu_radiotap(struct sk_buff *skb, 233 + struct mt76_rx_status *status, 234 + __le32 *rxv) 235 + { 236 + static const struct ieee80211_radiotap_he_mu mu_known = { 237 + .flags1 = HE_BITS(MU_FLAGS1_SIG_B_MCS_KNOWN) | 238 + HE_BITS(MU_FLAGS1_SIG_B_DCM_KNOWN) | 239 + HE_BITS(MU_FLAGS1_CH1_RU_KNOWN) | 240 + HE_BITS(MU_FLAGS1_SIG_B_SYMS_USERS_KNOWN), 241 + .flags2 = HE_BITS(MU_FLAGS2_BW_FROM_SIG_A_BW_KNOWN), 242 + }; 243 + struct ieee80211_radiotap_he_mu *he_mu = NULL; 244 + 245 + he_mu = skb_push(skb, sizeof(mu_known)); 246 + memcpy(he_mu, &mu_known, sizeof(mu_known)); 247 + 248 + #define MU_PREP(f, v) le16_encode_bits(v, IEEE80211_RADIOTAP_HE_MU_##f) 249 + 250 + he_mu->flags1 |= MU_PREP(FLAGS1_SIG_B_MCS, status->rate_idx); 251 + if (status->he_dcm) 252 + he_mu->flags1 |= MU_PREP(FLAGS1_SIG_B_DCM, status->he_dcm); 253 + 254 + he_mu->flags2 |= MU_PREP(FLAGS2_BW_FROM_SIG_A_BW, status->bw) | 255 + MU_PREP(FLAGS2_SIG_B_SYMS_USERS, 256 + le32_get_bits(rxv[2], MT_CRXV_HE_NUM_USER)); 257 + 258 + he_mu->ru_ch1[0] = le32_get_bits(rxv[3], MT_CRXV_HE_RU0); 259 + 260 + if (status->bw >= RATE_INFO_BW_40) { 261 + he_mu->flags1 |= HE_BITS(MU_FLAGS1_CH2_RU_KNOWN); 262 + he_mu->ru_ch2[0] = le32_get_bits(rxv[3], MT_CRXV_HE_RU1); 263 + } 264 + 265 + if (status->bw >= RATE_INFO_BW_80) { 266 + he_mu->ru_ch1[1] = le32_get_bits(rxv[3], MT_CRXV_HE_RU2); 267 + he_mu->ru_ch2[1] = le32_get_bits(rxv[3], MT_CRXV_HE_RU3); 268 + } 269 + } 270 + 271 + static void 271 272 mt7915_mac_decode_he_radiotap(struct sk_buff *skb, 272 273 struct mt76_rx_status *status, 273 274 __le32 *rxv, u32 phy) 274 275 { 275 - /* TODO: struct ieee80211_radiotap_he_mu */ 276 276 static const struct ieee80211_radiotap_he known = { 277 277 .data1 = HE_BITS(DATA1_DATA_MCS_KNOWN) | 278 278 HE_BITS(DATA1_DATA_DCM_KNOWN) | ··· 319 241 HE_BITS(DATA1_CODING_KNOWN) | 320 242 HE_BITS(DATA1_LDPC_XSYMSEG_KNOWN) | 321 243 HE_BITS(DATA1_DOPPLER_KNOWN) | 244 + HE_BITS(DATA1_SPTL_REUSE_KNOWN) | 322 245 HE_BITS(DATA1_BSS_COLOR_KNOWN), 323 246 .data2 = HE_BITS(DATA2_GI_KNOWN) | 324 247 HE_BITS(DATA2_TXBF_KNOWN) | ··· 334 255 335 256 he->data3 = HE_PREP(DATA3_BSS_COLOR, BSS_COLOR, rxv[14]) | 336 257 HE_PREP(DATA3_LDPC_XSYMSEG, LDPC_EXT_SYM, rxv[2]); 258 + he->data4 = HE_PREP(DATA4_SU_MU_SPTL_REUSE, SR_MASK, rxv[11]); 337 259 he->data5 = HE_PREP(DATA5_PE_DISAMBIG, PE_DISAMBIG, rxv[2]) | 338 260 le16_encode_bits(ltf_size, 339 261 IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE); 262 + if (le32_to_cpu(rxv[0]) & MT_PRXV_TXBF) 263 + he->data5 |= HE_BITS(DATA5_TXBF); 340 264 he->data6 = HE_PREP(DATA6_TXOP, TXOP_DUR, rxv[14]) | 341 265 HE_PREP(DATA6_DOPPLER, DOPPLER, rxv[14]); 342 266 ··· 347 265 case MT_PHY_TYPE_HE_SU: 348 266 he->data1 |= HE_BITS(DATA1_FORMAT_SU) | 349 267 HE_BITS(DATA1_UL_DL_KNOWN) | 350 - HE_BITS(DATA1_BEAM_CHANGE_KNOWN) | 351 - HE_BITS(DATA1_SPTL_REUSE_KNOWN); 268 + HE_BITS(DATA1_BEAM_CHANGE_KNOWN); 352 269 353 270 he->data3 |= HE_PREP(DATA3_BEAM_CHANGE, BEAM_CHNG, rxv[14]) | 354 271 HE_PREP(DATA3_UL_DL, UPLINK, rxv[2]); 355 - he->data4 |= HE_PREP(DATA4_SU_MU_SPTL_REUSE, SR_MASK, rxv[11]); 356 272 break; 357 273 case MT_PHY_TYPE_HE_EXT_SU: 358 274 he->data1 |= HE_BITS(DATA1_FORMAT_EXT_SU) | ··· 360 280 break; 361 281 case MT_PHY_TYPE_HE_MU: 362 282 he->data1 |= HE_BITS(DATA1_FORMAT_MU) | 363 - HE_BITS(DATA1_UL_DL_KNOWN) | 364 - HE_BITS(DATA1_SPTL_REUSE_KNOWN); 283 + HE_BITS(DATA1_UL_DL_KNOWN); 365 284 366 285 he->data3 |= HE_PREP(DATA3_UL_DL, UPLINK, rxv[2]); 367 - he->data4 |= HE_PREP(DATA4_SU_MU_SPTL_REUSE, SR_MASK, rxv[11]); 286 + he->data4 |= HE_PREP(DATA4_MU_STA_ID, MU_AID, rxv[7]); 368 287 369 288 mt7915_mac_decode_he_radiotap_ru(status, he, rxv); 370 289 break; 371 290 case MT_PHY_TYPE_HE_TB: 372 291 he->data1 |= HE_BITS(DATA1_FORMAT_TRIG) | 373 - HE_BITS(DATA1_SPTL_REUSE_KNOWN) | 374 292 HE_BITS(DATA1_SPTL_REUSE2_KNOWN) | 375 293 HE_BITS(DATA1_SPTL_REUSE3_KNOWN) | 376 294 HE_BITS(DATA1_SPTL_REUSE4_KNOWN); 377 295 378 - he->data4 |= HE_PREP(DATA4_TB_SPTL_REUSE1, SR_MASK, rxv[11]) | 379 - HE_PREP(DATA4_TB_SPTL_REUSE2, SR1_MASK, rxv[11]) | 296 + he->data4 |= HE_PREP(DATA4_TB_SPTL_REUSE2, SR1_MASK, rxv[11]) | 380 297 HE_PREP(DATA4_TB_SPTL_REUSE3, SR2_MASK, rxv[11]) | 381 298 HE_PREP(DATA4_TB_SPTL_REUSE4, SR3_MASK, rxv[11]); 382 299 ··· 687 610 status->flag |= RX_FLAG_8023; 688 611 } 689 612 690 - if (rxv && status->flag & RX_FLAG_RADIOTAP_HE) 613 + if (rxv && status->flag & RX_FLAG_RADIOTAP_HE) { 691 614 mt7915_mac_decode_he_radiotap(skb, status, rxv, mode); 615 + if (status->flag & RX_FLAG_RADIOTAP_HE_MU) 616 + mt7915_mac_decode_he_mu_radiotap(skb, status, rxv); 617 + } 692 618 693 619 if (!status->wcid || !ieee80211_is_data_qos(fc)) 694 620 return 0; ··· 905 825 906 826 static void 907 827 mt7915_mac_write_txwi_80211(struct mt7915_dev *dev, __le32 *txwi, 908 - struct sk_buff *skb, struct ieee80211_key_conf *key) 828 + struct sk_buff *skb, struct ieee80211_key_conf *key, 829 + bool *mcast) 909 830 { 910 831 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 911 832 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data; 912 833 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 913 - bool multicast = is_multicast_ether_addr(hdr->addr1); 914 834 u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; 915 835 __le16 fc = hdr->frame_control; 916 836 u8 fc_type, fc_stype; 917 837 u32 val; 838 + 839 + *mcast = is_multicast_ether_addr(hdr->addr1); 918 840 919 841 if (ieee80211_is_action(fc) && 920 842 mgmt->u.action.category == WLAN_CATEGORY_BACK && ··· 943 861 944 862 val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) | 945 863 FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype) | 946 - FIELD_PREP(MT_TXD2_MULTICAST, multicast); 864 + FIELD_PREP(MT_TXD2_MULTICAST, *mcast); 947 865 948 - if (key && multicast && ieee80211_is_robust_mgmt_frame(skb) && 866 + if (key && *mcast && ieee80211_is_robust_mgmt_frame(skb) && 949 867 key->cipher == WLAN_CIPHER_SUITE_AES_CMAC) { 950 868 val |= MT_TXD2_BIP; 951 869 txwi[3] &= ~cpu_to_le32(MT_TXD3_PROTECT_FRAME); 952 870 } 953 871 954 - if (!ieee80211_is_data(fc) || multicast) 872 + if (!ieee80211_is_data(fc) || *mcast || 873 + info->flags & IEEE80211_TX_CTL_USE_MINRATE) 955 874 val |= MT_TXD2_FIX_RATE; 956 875 957 876 txwi[2] |= cpu_to_le32(val); ··· 982 899 txwi[7] |= cpu_to_le32(val); 983 900 } 984 901 902 + static u16 903 + mt7915_mac_tx_rate_val(struct mt76_phy *mphy, struct ieee80211_vif *vif, 904 + bool beacon, bool mcast) 905 + { 906 + u8 mode = 0, band = mphy->chandef.chan->band; 907 + int rateidx = 0, mcast_rate; 908 + 909 + if (beacon) { 910 + struct cfg80211_bitrate_mask *mask; 911 + 912 + mask = &vif->bss_conf.beacon_tx_rate; 913 + if (hweight16(mask->control[band].he_mcs[0]) == 1) { 914 + rateidx = ffs(mask->control[band].he_mcs[0]) - 1; 915 + mode = MT_PHY_TYPE_HE_SU; 916 + goto out; 917 + } else if (hweight16(mask->control[band].vht_mcs[0]) == 1) { 918 + rateidx = ffs(mask->control[band].vht_mcs[0]) - 1; 919 + mode = MT_PHY_TYPE_VHT; 920 + goto out; 921 + } else if (hweight8(mask->control[band].ht_mcs[0]) == 1) { 922 + rateidx = ffs(mask->control[band].ht_mcs[0]) - 1; 923 + mode = MT_PHY_TYPE_HT; 924 + goto out; 925 + } else if (hweight32(mask->control[band].legacy) == 1) { 926 + rateidx = ffs(mask->control[band].legacy) - 1; 927 + goto legacy; 928 + } 929 + } 930 + 931 + mcast_rate = vif->bss_conf.mcast_rate[band]; 932 + if (mcast && mcast_rate > 0) 933 + rateidx = mcast_rate - 1; 934 + else 935 + rateidx = ffs(vif->bss_conf.basic_rates) - 1; 936 + 937 + legacy: 938 + rateidx = mt76_calculate_default_rate(mphy, rateidx); 939 + mode = rateidx >> 8; 940 + rateidx &= GENMASK(7, 0); 941 + 942 + out: 943 + return FIELD_PREP(MT_TX_RATE_IDX, rateidx) | 944 + FIELD_PREP(MT_TX_RATE_MODE, mode); 945 + } 946 + 985 947 void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi, 986 948 struct sk_buff *skb, struct mt76_wcid *wcid, int pid, 987 949 struct ieee80211_key_conf *key, bool beacon) ··· 1037 909 bool ext_phy = info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY; 1038 910 u8 p_fmt, q_idx, omac_idx = 0, wmm_idx = 0; 1039 911 bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP; 912 + bool mcast = false; 1040 913 u16 tx_count = 15; 1041 914 u32 val; 1042 915 ··· 1068 939 FIELD_PREP(MT_TXD0_Q_IDX, q_idx); 1069 940 txwi[0] = cpu_to_le32(val); 1070 941 1071 - val = MT_TXD1_LONG_FORMAT | 942 + val = MT_TXD1_LONG_FORMAT | MT_TXD1_VTA | 1072 943 FIELD_PREP(MT_TXD1_WLAN_IDX, wcid->idx) | 1073 944 FIELD_PREP(MT_TXD1_OWN_MAC, omac_idx); 1074 945 ··· 1100 971 if (is_8023) 1101 972 mt7915_mac_write_txwi_8023(dev, txwi, skb, wcid); 1102 973 else 1103 - mt7915_mac_write_txwi_80211(dev, txwi, skb, key); 974 + mt7915_mac_write_txwi_80211(dev, txwi, skb, key, &mcast); 1104 975 1105 976 if (txwi[2] & cpu_to_le32(MT_TXD2_FIX_RATE)) { 1106 - u16 rate; 977 + u16 rate = mt7915_mac_tx_rate_val(mphy, vif, beacon, mcast); 1107 978 1108 979 /* hardware won't add HTC for mgmt/ctrl frame */ 1109 980 txwi[2] |= cpu_to_le32(MT_TXD2_HTC_VLD); 1110 - 1111 - if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) 1112 - rate = MT7915_5G_RATE_DEFAULT; 1113 - else 1114 - rate = MT7915_2G_RATE_DEFAULT; 1115 981 1116 982 val = MT_TXD6_FIXED_BW | 1117 983 FIELD_PREP(MT_TXD6_TX_RATE, rate); ··· 1139 1015 1140 1016 if (!wcid) 1141 1017 wcid = &dev->mt76.global_wcid; 1018 + 1019 + if (sta) { 1020 + struct mt7915_sta *msta; 1021 + 1022 + msta = (struct mt7915_sta *)sta->drv_priv; 1023 + 1024 + if (time_after(jiffies, msta->jiffies + HZ / 4)) { 1025 + info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; 1026 + msta->jiffies = jiffies; 1027 + } 1028 + } 1142 1029 1143 1030 pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb); 1144 1031 ··· 1297 1162 count = FIELD_GET(MT_TX_FREE_MSDU_CNT, le16_to_cpu(free->ctrl)); 1298 1163 for (i = 0; i < count; i++) { 1299 1164 u32 msdu, info = le32_to_cpu(free->info[i]); 1300 - u8 stat; 1301 1165 1302 1166 /* 1303 1167 * 1'b1: new wcid pair. ··· 1304 1170 */ 1305 1171 if (info & MT_TX_FREE_PAIR) { 1306 1172 struct mt7915_sta *msta; 1307 - struct mt7915_phy *phy; 1308 1173 struct mt76_wcid *wcid; 1309 1174 u16 idx; 1310 1175 ··· 1315 1182 continue; 1316 1183 1317 1184 msta = container_of(wcid, struct mt7915_sta, wcid); 1318 - phy = msta->vif->phy; 1319 1185 spin_lock_bh(&dev->sta_poll_lock); 1320 - if (list_empty(&msta->stats_list)) 1321 - list_add_tail(&msta->stats_list, &phy->stats_list); 1322 1186 if (list_empty(&msta->poll_list)) 1323 1187 list_add_tail(&msta->poll_list, &dev->sta_poll_list); 1324 1188 spin_unlock_bh(&dev->sta_poll_lock); ··· 1323 1193 } 1324 1194 1325 1195 msdu = FIELD_GET(MT_TX_FREE_MSDU_ID, info); 1326 - stat = FIELD_GET(MT_TX_FREE_STATUS, info); 1327 - 1328 1196 txwi = mt76_token_release(mdev, msdu, &wake); 1329 1197 if (!txwi) 1330 1198 continue; ··· 1347 1219 1348 1220 static bool 1349 1221 mt7915_mac_add_txs_skb(struct mt7915_dev *dev, struct mt76_wcid *wcid, int pid, 1350 - __le32 *txs_data) 1222 + __le32 *txs_data, struct mt76_sta_stats *stats) 1351 1223 { 1224 + struct ieee80211_supported_band *sband; 1352 1225 struct mt76_dev *mdev = &dev->mt76; 1226 + struct mt76_phy *mphy; 1353 1227 struct ieee80211_tx_info *info; 1354 1228 struct sk_buff_head list; 1229 + struct rate_info rate = {}; 1355 1230 struct sk_buff *skb; 1231 + bool cck = false; 1232 + u32 txrate, txs, mode; 1356 1233 1357 1234 mt76_tx_status_lock(mdev, &list); 1358 1235 skb = mt76_tx_status_skb_get(mdev, wcid, pid, &list); 1359 1236 if (!skb) 1360 - goto out; 1237 + goto out_no_skb; 1238 + 1239 + txs = le32_to_cpu(txs_data[0]); 1361 1240 1362 1241 info = IEEE80211_SKB_CB(skb); 1363 - if (!(txs_data[0] & le32_to_cpu(MT_TXS0_ACK_ERROR_MASK))) 1242 + if (!(txs & MT_TXS0_ACK_ERROR_MASK)) 1364 1243 info->flags |= IEEE80211_TX_STAT_ACK; 1365 1244 1366 1245 info->status.ampdu_len = 1; ··· 1375 1240 IEEE80211_TX_STAT_ACK); 1376 1241 1377 1242 info->status.rates[0].idx = -1; 1378 - mt76_tx_status_skb_done(mdev, skb, &list); 1243 + 1244 + txrate = FIELD_GET(MT_TXS0_TX_RATE, txs); 1245 + 1246 + rate.mcs = FIELD_GET(MT_TX_RATE_IDX, txrate); 1247 + rate.nss = FIELD_GET(MT_TX_RATE_NSS, txrate) + 1; 1248 + 1249 + if (rate.nss - 1 < ARRAY_SIZE(stats->tx_nss)) 1250 + stats->tx_nss[rate.nss - 1]++; 1251 + if (rate.mcs < ARRAY_SIZE(stats->tx_mcs)) 1252 + stats->tx_mcs[rate.mcs]++; 1253 + 1254 + mode = FIELD_GET(MT_TX_RATE_MODE, txrate); 1255 + switch (mode) { 1256 + case MT_PHY_TYPE_CCK: 1257 + cck = true; 1258 + fallthrough; 1259 + case MT_PHY_TYPE_OFDM: 1260 + mphy = &dev->mphy; 1261 + if (wcid->ext_phy && dev->mt76.phy2) 1262 + mphy = dev->mt76.phy2; 1263 + 1264 + if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) 1265 + sband = &mphy->sband_5g.sband; 1266 + else 1267 + sband = &mphy->sband_2g.sband; 1268 + 1269 + rate.mcs = mt76_get_rate(mphy->dev, sband, rate.mcs, cck); 1270 + rate.legacy = sband->bitrates[rate.mcs].bitrate; 1271 + break; 1272 + case MT_PHY_TYPE_HT: 1273 + case MT_PHY_TYPE_HT_GF: 1274 + rate.mcs += (rate.nss - 1) * 8; 1275 + if (rate.mcs > 31) 1276 + goto out; 1277 + 1278 + rate.flags = RATE_INFO_FLAGS_MCS; 1279 + if (wcid->rate.flags & RATE_INFO_FLAGS_SHORT_GI) 1280 + rate.flags |= RATE_INFO_FLAGS_SHORT_GI; 1281 + break; 1282 + case MT_PHY_TYPE_VHT: 1283 + if (rate.mcs > 9) 1284 + goto out; 1285 + 1286 + rate.flags = RATE_INFO_FLAGS_VHT_MCS; 1287 + break; 1288 + case MT_PHY_TYPE_HE_SU: 1289 + case MT_PHY_TYPE_HE_EXT_SU: 1290 + case MT_PHY_TYPE_HE_TB: 1291 + case MT_PHY_TYPE_HE_MU: 1292 + if (rate.mcs > 11) 1293 + goto out; 1294 + 1295 + rate.he_gi = wcid->rate.he_gi; 1296 + rate.he_dcm = FIELD_GET(MT_TX_RATE_DCM, txrate); 1297 + rate.flags = RATE_INFO_FLAGS_HE_MCS; 1298 + break; 1299 + default: 1300 + goto out; 1301 + } 1302 + 1303 + stats->tx_mode[mode]++; 1304 + 1305 + switch (FIELD_GET(MT_TXS0_BW, txs)) { 1306 + case IEEE80211_STA_RX_BW_160: 1307 + rate.bw = RATE_INFO_BW_160; 1308 + stats->tx_bw[3]++; 1309 + break; 1310 + case IEEE80211_STA_RX_BW_80: 1311 + rate.bw = RATE_INFO_BW_80; 1312 + stats->tx_bw[2]++; 1313 + break; 1314 + case IEEE80211_STA_RX_BW_40: 1315 + rate.bw = RATE_INFO_BW_40; 1316 + stats->tx_bw[1]++; 1317 + break; 1318 + default: 1319 + rate.bw = RATE_INFO_BW_20; 1320 + stats->tx_bw[0]++; 1321 + break; 1322 + } 1323 + wcid->rate = rate; 1379 1324 1380 1325 out: 1326 + mt76_tx_status_skb_done(mdev, skb, &list); 1327 + 1328 + out_no_skb: 1381 1329 mt76_tx_status_unlock(mdev, &list); 1382 1330 1383 1331 return !!skb; ··· 1497 1279 if (!wcid) 1498 1280 goto out; 1499 1281 1500 - mt7915_mac_add_txs_skb(dev, wcid, pid, txs_data); 1282 + msta = container_of(wcid, struct mt7915_sta, wcid); 1283 + 1284 + mt7915_mac_add_txs_skb(dev, wcid, pid, txs_data, &msta->stats); 1501 1285 1502 1286 if (!wcid->sta) 1503 1287 goto out; 1504 1288 1505 - msta = container_of(wcid, struct mt7915_sta, wcid); 1506 1289 spin_lock_bh(&dev->sta_poll_lock); 1507 1290 if (list_empty(&msta->poll_list)) 1508 1291 list_add_tail(&msta->poll_list, &dev->sta_poll_list); ··· 1552 1333 1553 1334 void mt7915_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e) 1554 1335 { 1555 - struct mt7915_dev *dev; 1556 - 1557 1336 if (!e->txwi) { 1558 1337 dev_kfree_skb_any(e->skb); 1559 1338 return; 1560 1339 } 1561 - 1562 - dev = container_of(mdev, struct mt7915_dev, mt76); 1563 1340 1564 1341 /* error path */ 1565 1342 if (e->skb == DMA_DUMMY_DATA) { ··· 1618 1403 FIELD_PREP(MT_TIMEOUT_VAL_CCA, 48); 1619 1404 u32 ofdm = FIELD_PREP(MT_TIMEOUT_VAL_PLCP, 60) | 1620 1405 FIELD_PREP(MT_TIMEOUT_VAL_CCA, 28); 1621 - int sifs, offset; 1406 + int offset; 1622 1407 bool is_5ghz = phy->mt76->chandef.chan->band == NL80211_BAND_5GHZ; 1623 1408 1624 1409 if (!test_bit(MT76_STATE_RUNNING, &phy->mt76->state)) 1625 1410 return; 1626 - 1627 - if (is_5ghz) 1628 - sifs = 16; 1629 - else 1630 - sifs = 10; 1631 1411 1632 1412 if (ext_phy) { 1633 1413 coverage_class = max_t(s16, dev->phy.coverage_class, ··· 1645 1435 mt76_wr(dev, MT_TMAC_CDTR(ext_phy), cck + reg_offset); 1646 1436 mt76_wr(dev, MT_TMAC_ODTR(ext_phy), ofdm + reg_offset); 1647 1437 mt76_wr(dev, MT_TMAC_ICR0(ext_phy), 1648 - FIELD_PREP(MT_IFS_EIFS, 360) | 1438 + FIELD_PREP(MT_IFS_EIFS_OFDM, is_5ghz ? 84 : 78) | 1649 1439 FIELD_PREP(MT_IFS_RIFS, 2) | 1650 - FIELD_PREP(MT_IFS_SIFS, sifs) | 1440 + FIELD_PREP(MT_IFS_SIFS, 10) | 1651 1441 FIELD_PREP(MT_IFS_SLOT, phy->slottime)); 1442 + 1443 + mt76_wr(dev, MT_TMAC_ICR1(ext_phy), 1444 + FIELD_PREP(MT_IFS_EIFS_CCK, 314)); 1652 1445 1653 1446 if (phy->slottime < 20 || is_5ghz) 1654 1447 val = MT7915_CFEND_RATE_DEFAULT; ··· 1793 1580 mt76_for_each_q_rx(&dev->mt76, i) 1794 1581 mt76_queue_rx_reset(dev, i); 1795 1582 1796 - mt76_tx_status_check(&dev->mt76, NULL, true); 1583 + mt76_tx_status_check(&dev->mt76, true); 1797 1584 1798 1585 /* re-init prefetch settings after reset */ 1799 1586 mt7915_dma_prefetch(dev); ··· 1881 1668 if (phy2) 1882 1669 clear_bit(MT76_RESET, &phy2->mt76->state); 1883 1670 1671 + local_bh_disable(); 1884 1672 napi_enable(&dev->mt76.napi[0]); 1885 1673 napi_schedule(&dev->mt76.napi[0]); 1886 1674 ··· 1890 1676 1891 1677 napi_enable(&dev->mt76.napi[2]); 1892 1678 napi_schedule(&dev->mt76.napi[2]); 1679 + local_bh_enable(); 1680 + 1893 1681 tasklet_schedule(&dev->irq_tasklet); 1894 1682 1895 1683 mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_RESET_DONE); ··· 1918 1702 MT7915_WATCHDOG_TIME); 1919 1703 } 1920 1704 1921 - static void 1922 - mt7915_mac_update_stats(struct mt7915_phy *phy) 1705 + void mt7915_mac_update_stats(struct mt7915_phy *phy) 1923 1706 { 1924 1707 struct mt7915_dev *dev = phy->dev; 1925 1708 struct mib_stats *mib = &phy->mib; 1926 1709 bool ext_phy = phy != &dev->phy; 1927 - int i, aggr0, aggr1; 1710 + int i, aggr0, aggr1, cnt; 1928 1711 1929 1712 mib->fcs_err_cnt += mt76_get_field(dev, MT_MIB_SDR3(ext_phy), 1930 1713 MT_MIB_SDR3_FCS_ERR_MASK); 1714 + 1715 + cnt = mt76_rr(dev, MT_MIB_SDR4(ext_phy)); 1716 + mib->rx_fifo_full_cnt += FIELD_GET(MT_MIB_SDR4_RX_FIFO_FULL_MASK, cnt); 1717 + 1718 + cnt = mt76_rr(dev, MT_MIB_SDR5(ext_phy)); 1719 + mib->rx_mpdu_cnt += cnt; 1720 + 1721 + cnt = mt76_rr(dev, MT_MIB_SDR6(ext_phy)); 1722 + mib->channel_idle_cnt += FIELD_GET(MT_MIB_SDR6_CHANNEL_IDL_CNT_MASK, cnt); 1723 + 1724 + cnt = mt76_rr(dev, MT_MIB_SDR7(ext_phy)); 1725 + mib->rx_vector_mismatch_cnt += FIELD_GET(MT_MIB_SDR7_RX_VECTOR_MISMATCH_CNT_MASK, cnt); 1726 + 1727 + cnt = mt76_rr(dev, MT_MIB_SDR8(ext_phy)); 1728 + mib->rx_delimiter_fail_cnt += FIELD_GET(MT_MIB_SDR8_RX_DELIMITER_FAIL_CNT_MASK, cnt); 1729 + 1730 + cnt = mt76_rr(dev, MT_MIB_SDR11(ext_phy)); 1731 + mib->rx_len_mismatch_cnt += FIELD_GET(MT_MIB_SDR11_RX_LEN_MISMATCH_CNT_MASK, cnt); 1732 + 1733 + cnt = mt76_rr(dev, MT_MIB_SDR12(ext_phy)); 1734 + mib->tx_ampdu_cnt += cnt; 1735 + 1736 + cnt = mt76_rr(dev, MT_MIB_SDR13(ext_phy)); 1737 + mib->tx_stop_q_empty_cnt += FIELD_GET(MT_MIB_SDR13_TX_STOP_Q_EMPTY_CNT_MASK, cnt); 1738 + 1739 + cnt = mt76_rr(dev, MT_MIB_SDR14(ext_phy)); 1740 + mib->tx_mpdu_attempts_cnt += FIELD_GET(MT_MIB_SDR14_TX_MPDU_ATTEMPTS_CNT_MASK, cnt); 1741 + 1742 + cnt = mt76_rr(dev, MT_MIB_SDR15(ext_phy)); 1743 + mib->tx_mpdu_success_cnt += FIELD_GET(MT_MIB_SDR15_TX_MPDU_SUCCESS_CNT_MASK, cnt); 1744 + 1745 + cnt = mt76_rr(dev, MT_MIB_SDR22(ext_phy)); 1746 + mib->rx_ampdu_cnt += cnt; 1747 + 1748 + cnt = mt76_rr(dev, MT_MIB_SDR23(ext_phy)); 1749 + mib->rx_ampdu_bytes_cnt += cnt; 1750 + 1751 + cnt = mt76_rr(dev, MT_MIB_SDR24(ext_phy)); 1752 + mib->rx_ampdu_valid_subframe_cnt += FIELD_GET(MT_MIB_SDR24_RX_AMPDU_SF_CNT_MASK, cnt); 1753 + 1754 + cnt = mt76_rr(dev, MT_MIB_SDR25(ext_phy)); 1755 + mib->rx_ampdu_valid_subframe_bytes_cnt += cnt; 1756 + 1757 + cnt = mt76_rr(dev, MT_MIB_SDR27(ext_phy)); 1758 + mib->tx_rwp_fail_cnt += FIELD_GET(MT_MIB_SDR27_TX_RWP_FAIL_CNT_MASK, cnt); 1759 + 1760 + cnt = mt76_rr(dev, MT_MIB_SDR28(ext_phy)); 1761 + mib->tx_rwp_need_cnt += FIELD_GET(MT_MIB_SDR28_TX_RWP_NEED_CNT_MASK, cnt); 1762 + 1763 + cnt = mt76_rr(dev, MT_MIB_SDR29(ext_phy)); 1764 + mib->rx_pfdrop_cnt += FIELD_GET(MT_MIB_SDR29_RX_PFDROP_CNT_MASK, cnt); 1765 + 1766 + cnt = mt76_rr(dev, MT_MIB_SDR30(ext_phy)); 1767 + mib->rx_vec_queue_overflow_drop_cnt += 1768 + FIELD_GET(MT_MIB_SDR30_RX_VEC_QUEUE_OVERFLOW_DROP_CNT_MASK, cnt); 1769 + 1770 + cnt = mt76_rr(dev, MT_MIB_SDR31(ext_phy)); 1771 + mib->rx_ba_cnt += cnt; 1772 + 1773 + cnt = mt76_rr(dev, MT_MIB_SDR32(ext_phy)); 1774 + mib->tx_pkt_ebf_cnt += FIELD_GET(MT_MIB_SDR32_TX_PKT_EBF_CNT_MASK, cnt); 1775 + 1776 + cnt = mt76_rr(dev, MT_MIB_SDR33(ext_phy)); 1777 + mib->tx_pkt_ibf_cnt += FIELD_GET(MT_MIB_SDR33_TX_PKT_IBF_CNT_MASK, cnt); 1778 + 1779 + cnt = mt76_rr(dev, MT_MIB_SDR34(ext_phy)); 1780 + mib->tx_bf_cnt += FIELD_GET(MT_MIB_MU_BF_TX_CNT, cnt); 1781 + 1782 + cnt = mt76_rr(dev, MT_MIB_DR8(ext_phy)); 1783 + mib->tx_mu_mpdu_cnt += cnt; 1784 + 1785 + cnt = mt76_rr(dev, MT_MIB_DR9(ext_phy)); 1786 + mib->tx_mu_acked_mpdu_cnt += cnt; 1787 + 1788 + cnt = mt76_rr(dev, MT_MIB_DR11(ext_phy)); 1789 + mib->tx_su_acked_mpdu_cnt += cnt; 1790 + 1791 + cnt = mt76_rr(dev, MT_ETBF_TX_APP_CNT(ext_phy)); 1792 + mib->tx_bf_ibf_ppdu_cnt += FIELD_GET(MT_ETBF_TX_IBF_CNT, cnt); 1793 + mib->tx_bf_ebf_ppdu_cnt += FIELD_GET(MT_ETBF_TX_EBF_CNT, cnt); 1794 + 1795 + cnt = mt76_rr(dev, MT_ETBF_RX_FB_CNT(ext_phy)); 1796 + mib->tx_bf_rx_fb_all_cnt += FIELD_GET(MT_ETBF_RX_FB_ALL, cnt); 1797 + mib->tx_bf_rx_fb_he_cnt += FIELD_GET(MT_ETBF_RX_FB_HE, cnt); 1798 + mib->tx_bf_rx_fb_vht_cnt += FIELD_GET(MT_ETBF_RX_FB_VHT, cnt); 1799 + mib->tx_bf_rx_fb_ht_cnt += FIELD_GET(MT_ETBF_RX_FB_HT, cnt); 1800 + 1801 + cnt = mt76_rr(dev, MT_ETBF_RX_FB_CONT(ext_phy)); 1802 + mib->tx_bf_rx_fb_bw = FIELD_GET(MT_ETBF_RX_FB_BW, cnt); 1803 + mib->tx_bf_rx_fb_nc_cnt += FIELD_GET(MT_ETBF_RX_FB_NC, cnt); 1804 + mib->tx_bf_rx_fb_nr_cnt += FIELD_GET(MT_ETBF_RX_FB_NR, cnt); 1805 + 1806 + cnt = mt76_rr(dev, MT_ETBF_TX_NDP_BFRP(ext_phy)); 1807 + mib->tx_bf_fb_cpl_cnt += FIELD_GET(MT_ETBF_TX_FB_CPL, cnt); 1808 + mib->tx_bf_fb_trig_cnt += FIELD_GET(MT_ETBF_TX_FB_TRI, cnt); 1809 + 1810 + for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++) { 1811 + cnt = mt76_rr(dev, MT_PLE_AMSDU_PACK_MSDU_CNT(i)); 1812 + mib->tx_amsdu[i] += cnt; 1813 + mib->tx_amsdu_cnt += cnt; 1814 + } 1931 1815 1932 1816 aggr0 = ext_phy ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0; 1933 1817 for (i = 0, aggr1 = aggr0 + 4; i < 4; i++) { ··· 2053 1737 } 2054 1738 } 2055 1739 2056 - static void 2057 - mt7915_mac_sta_stats_work(struct mt7915_phy *phy) 2058 - { 2059 - struct mt7915_dev *dev = phy->dev; 2060 - struct mt7915_sta *msta; 2061 - LIST_HEAD(list); 2062 - 2063 - spin_lock_bh(&dev->sta_poll_lock); 2064 - list_splice_init(&phy->stats_list, &list); 2065 - 2066 - while (!list_empty(&list)) { 2067 - msta = list_first_entry(&list, struct mt7915_sta, stats_list); 2068 - list_del_init(&msta->stats_list); 2069 - spin_unlock_bh(&dev->sta_poll_lock); 2070 - 2071 - /* use MT_TX_FREE_RATE to report Tx rate for further devices */ 2072 - mt7915_mcu_get_tx_rate(dev, RATE_CTRL_RU_INFO, msta->wcid.idx); 2073 - 2074 - spin_lock_bh(&dev->sta_poll_lock); 2075 - } 2076 - 2077 - spin_unlock_bh(&dev->sta_poll_lock); 2078 - } 2079 - 2080 1740 void mt7915_mac_sta_rc_work(struct work_struct *work) 2081 1741 { 2082 1742 struct mt7915_dev *dev = container_of(work, struct mt7915_dev, rc_work); ··· 2068 1776 while (!list_empty(&list)) { 2069 1777 msta = list_first_entry(&list, struct mt7915_sta, rc_list); 2070 1778 list_del_init(&msta->rc_list); 2071 - changed = msta->stats.changed; 2072 - msta->stats.changed = 0; 1779 + changed = msta->changed; 1780 + msta->changed = 0; 2073 1781 spin_unlock_bh(&dev->sta_poll_lock); 2074 1782 2075 1783 sta = container_of((void *)msta, struct ieee80211_sta, drv_priv); ··· 2109 1817 mt7915_mac_update_stats(phy); 2110 1818 } 2111 1819 2112 - if (++phy->sta_work_count == 10) { 2113 - phy->sta_work_count = 0; 2114 - mt7915_mac_sta_stats_work(phy); 2115 - } 2116 - 2117 1820 mutex_unlock(&mphy->dev->mutex); 2118 1821 2119 - mt76_tx_status_check(mphy->dev, NULL, false); 1822 + mt76_tx_status_check(mphy->dev, false); 2120 1823 2121 1824 ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work, 2122 1825 MT7915_WATCHDOG_TIME); ··· 2247 1960 2248 1961 mt7915_dfs_stop_radar_detector(phy); 2249 1962 return 0; 1963 + } 1964 + 1965 + static int 1966 + mt7915_mac_twt_duration_align(int duration) 1967 + { 1968 + return duration << 8; 1969 + } 1970 + 1971 + static u64 1972 + mt7915_mac_twt_sched_list_add(struct mt7915_dev *dev, 1973 + struct mt7915_twt_flow *flow) 1974 + { 1975 + struct mt7915_twt_flow *iter, *iter_next; 1976 + u32 duration = flow->duration << 8; 1977 + u64 start_tsf; 1978 + 1979 + iter = list_first_entry_or_null(&dev->twt_list, 1980 + struct mt7915_twt_flow, list); 1981 + if (!iter || !iter->sched || iter->start_tsf > duration) { 1982 + /* add flow as first entry in the list */ 1983 + list_add(&flow->list, &dev->twt_list); 1984 + return 0; 1985 + } 1986 + 1987 + list_for_each_entry_safe(iter, iter_next, &dev->twt_list, list) { 1988 + start_tsf = iter->start_tsf + 1989 + mt7915_mac_twt_duration_align(iter->duration); 1990 + if (list_is_last(&iter->list, &dev->twt_list)) 1991 + break; 1992 + 1993 + if (!iter_next->sched || 1994 + iter_next->start_tsf > start_tsf + duration) { 1995 + list_add(&flow->list, &iter->list); 1996 + goto out; 1997 + } 1998 + } 1999 + 2000 + /* add flow as last entry in the list */ 2001 + list_add_tail(&flow->list, &dev->twt_list); 2002 + out: 2003 + return start_tsf; 2004 + } 2005 + 2006 + static int mt7915_mac_check_twt_req(struct ieee80211_twt_setup *twt) 2007 + { 2008 + struct ieee80211_twt_params *twt_agrt; 2009 + u64 interval, duration; 2010 + u16 mantissa; 2011 + u8 exp; 2012 + 2013 + /* only individual agreement supported */ 2014 + if (twt->control & IEEE80211_TWT_CONTROL_NEG_TYPE_BROADCAST) 2015 + return -EOPNOTSUPP; 2016 + 2017 + /* only 256us unit supported */ 2018 + if (twt->control & IEEE80211_TWT_CONTROL_WAKE_DUR_UNIT) 2019 + return -EOPNOTSUPP; 2020 + 2021 + twt_agrt = (struct ieee80211_twt_params *)twt->params; 2022 + 2023 + /* explicit agreement not supported */ 2024 + if (!(twt_agrt->req_type & cpu_to_le16(IEEE80211_TWT_REQTYPE_IMPLICIT))) 2025 + return -EOPNOTSUPP; 2026 + 2027 + exp = FIELD_GET(IEEE80211_TWT_REQTYPE_WAKE_INT_EXP, 2028 + le16_to_cpu(twt_agrt->req_type)); 2029 + mantissa = le16_to_cpu(twt_agrt->mantissa); 2030 + duration = twt_agrt->min_twt_dur << 8; 2031 + 2032 + interval = (u64)mantissa << exp; 2033 + if (interval < duration) 2034 + return -EOPNOTSUPP; 2035 + 2036 + return 0; 2037 + } 2038 + 2039 + void mt7915_mac_add_twt_setup(struct ieee80211_hw *hw, 2040 + struct ieee80211_sta *sta, 2041 + struct ieee80211_twt_setup *twt) 2042 + { 2043 + enum ieee80211_twt_setup_cmd setup_cmd = TWT_SETUP_CMD_REJECT; 2044 + struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 2045 + struct ieee80211_twt_params *twt_agrt = (void *)twt->params; 2046 + u16 req_type = le16_to_cpu(twt_agrt->req_type); 2047 + enum ieee80211_twt_setup_cmd sta_setup_cmd; 2048 + struct mt7915_dev *dev = mt7915_hw_dev(hw); 2049 + struct mt7915_twt_flow *flow; 2050 + int flowid, table_id; 2051 + u8 exp; 2052 + 2053 + if (mt7915_mac_check_twt_req(twt)) 2054 + goto out; 2055 + 2056 + mutex_lock(&dev->mt76.mutex); 2057 + 2058 + if (dev->twt.n_agrt == MT7915_MAX_TWT_AGRT) 2059 + goto unlock; 2060 + 2061 + if (hweight8(msta->twt.flowid_mask) == ARRAY_SIZE(msta->twt.flow)) 2062 + goto unlock; 2063 + 2064 + flowid = ffs(~msta->twt.flowid_mask) - 1; 2065 + le16p_replace_bits(&twt_agrt->req_type, flowid, 2066 + IEEE80211_TWT_REQTYPE_FLOWID); 2067 + 2068 + table_id = ffs(~dev->twt.table_mask) - 1; 2069 + exp = FIELD_GET(IEEE80211_TWT_REQTYPE_WAKE_INT_EXP, req_type); 2070 + sta_setup_cmd = FIELD_GET(IEEE80211_TWT_REQTYPE_SETUP_CMD, req_type); 2071 + 2072 + flow = &msta->twt.flow[flowid]; 2073 + memset(flow, 0, sizeof(*flow)); 2074 + INIT_LIST_HEAD(&flow->list); 2075 + flow->wcid = msta->wcid.idx; 2076 + flow->table_id = table_id; 2077 + flow->id = flowid; 2078 + flow->duration = twt_agrt->min_twt_dur; 2079 + flow->mantissa = twt_agrt->mantissa; 2080 + flow->exp = exp; 2081 + flow->protection = !!(req_type & IEEE80211_TWT_REQTYPE_PROTECTION); 2082 + flow->flowtype = !!(req_type & IEEE80211_TWT_REQTYPE_FLOWTYPE); 2083 + flow->trigger = !!(req_type & IEEE80211_TWT_REQTYPE_TRIGGER); 2084 + 2085 + if (sta_setup_cmd == TWT_SETUP_CMD_REQUEST || 2086 + sta_setup_cmd == TWT_SETUP_CMD_SUGGEST) { 2087 + u64 interval = (u64)le16_to_cpu(twt_agrt->mantissa) << exp; 2088 + u64 flow_tsf, curr_tsf; 2089 + u32 rem; 2090 + 2091 + flow->sched = true; 2092 + flow->start_tsf = mt7915_mac_twt_sched_list_add(dev, flow); 2093 + curr_tsf = __mt7915_get_tsf(hw, msta->vif); 2094 + div_u64_rem(curr_tsf - flow->start_tsf, interval, &rem); 2095 + flow_tsf = curr_tsf + interval - rem; 2096 + twt_agrt->twt = cpu_to_le64(flow_tsf); 2097 + } else { 2098 + list_add_tail(&flow->list, &dev->twt_list); 2099 + } 2100 + flow->tsf = le64_to_cpu(twt_agrt->twt); 2101 + 2102 + if (mt7915_mcu_twt_agrt_update(dev, msta->vif, flow, MCU_TWT_AGRT_ADD)) 2103 + goto unlock; 2104 + 2105 + setup_cmd = TWT_SETUP_CMD_ACCEPT; 2106 + dev->twt.table_mask |= BIT(table_id); 2107 + msta->twt.flowid_mask |= BIT(flowid); 2108 + dev->twt.n_agrt++; 2109 + 2110 + unlock: 2111 + mutex_unlock(&dev->mt76.mutex); 2112 + out: 2113 + le16p_replace_bits(&twt_agrt->req_type, setup_cmd, 2114 + IEEE80211_TWT_REQTYPE_SETUP_CMD); 2115 + twt->control = (twt->control & IEEE80211_TWT_CONTROL_WAKE_DUR_UNIT) | 2116 + (twt->control & IEEE80211_TWT_CONTROL_RX_DISABLED); 2117 + } 2118 + 2119 + void mt7915_mac_twt_teardown_flow(struct mt7915_dev *dev, 2120 + struct mt7915_sta *msta, 2121 + u8 flowid) 2122 + { 2123 + struct mt7915_twt_flow *flow; 2124 + 2125 + lockdep_assert_held(&dev->mt76.mutex); 2126 + 2127 + if (flowid >= ARRAY_SIZE(msta->twt.flow)) 2128 + return; 2129 + 2130 + if (!(msta->twt.flowid_mask & BIT(flowid))) 2131 + return; 2132 + 2133 + flow = &msta->twt.flow[flowid]; 2134 + if (mt7915_mcu_twt_agrt_update(dev, msta->vif, flow, 2135 + MCU_TWT_AGRT_DELETE)) 2136 + return; 2137 + 2138 + list_del_init(&flow->list); 2139 + msta->twt.flowid_mask &= ~BIT(flowid); 2140 + dev->twt.table_mask &= ~BIT(flow->table_id); 2141 + dev->twt.n_agrt--; 2250 2142 }
+10 -1
drivers/net/wireless/mediatek/mt76/mt7915/mac.h
··· 117 117 #define MT_PRXV_TX_DCM BIT(4) 118 118 #define MT_PRXV_TX_ER_SU_106T BIT(5) 119 119 #define MT_PRXV_NSTS GENMASK(9, 7) 120 + #define MT_PRXV_TXBF BIT(10) 120 121 #define MT_PRXV_HT_AD_CODE BIT(11) 121 122 #define MT_PRXV_HE_RU_ALLOC_L GENMASK(31, 28) 122 123 #define MT_PRXV_HE_RU_ALLOC_H GENMASK(3, 0) ··· 134 133 #define MT_CRXV_HE_LTF_SIZE GENMASK(18, 17) 135 134 #define MT_CRXV_HE_LDPC_EXT_SYM BIT(20) 136 135 #define MT_CRXV_HE_PE_DISAMBIG BIT(23) 136 + #define MT_CRXV_HE_NUM_USER GENMASK(30, 24) 137 137 #define MT_CRXV_HE_UPLINK BIT(31) 138 + #define MT_CRXV_HE_RU0 GENMASK(7, 0) 139 + #define MT_CRXV_HE_RU1 GENMASK(15, 8) 140 + #define MT_CRXV_HE_RU2 GENMASK(23, 16) 141 + #define MT_CRXV_HE_RU3 GENMASK(31, 24) 142 + 143 + #define MT_CRXV_HE_MU_AID GENMASK(30, 20) 138 144 139 145 #define MT_CRXV_HE_SR_MASK GENMASK(11, 8) 140 146 #define MT_CRXV_HE_SR1_MASK GENMASK(16, 12) ··· 280 272 #define MT_TX_RATE_MODE GENMASK(9, 6) 281 273 #define MT_TX_RATE_SU_EXT_TONE BIT(5) 282 274 #define MT_TX_RATE_DCM BIT(4) 283 - #define MT_TX_RATE_IDX GENMASK(3, 0) 275 + /* VHT/HE only use bits 0-3 */ 276 + #define MT_TX_RATE_IDX GENMASK(5, 0) 284 277 285 278 #define MT_TXP_MAX_BUF_NUM 6 286 279
+306 -28
drivers/net/wireless/mediatek/mt76/mt7915/main.c
··· 215 215 mvif->phy = phy; 216 216 mvif->band_idx = ext_phy; 217 217 218 - if (ext_phy) 218 + if (dev->mt76.phy2) 219 219 mvif->wmm_idx = ext_phy * (MT7915_MAX_WMM_SETS / 2) + 220 220 mvif->idx % (MT7915_MAX_WMM_SETS / 2); 221 221 else ··· 231 231 idx = MT7915_WTBL_RESERVED - mvif->idx; 232 232 233 233 INIT_LIST_HEAD(&mvif->sta.rc_list); 234 - INIT_LIST_HEAD(&mvif->sta.stats_list); 235 234 INIT_LIST_HEAD(&mvif->sta.poll_list); 236 235 mvif->sta.wcid.idx = idx; 237 236 mvif->sta.wcid.ext_phy = mvif->band_idx; 238 237 mvif->sta.wcid.hw_key_idx = -1; 239 238 mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET; 239 + mt76_packet_id_init(&mvif->sta.wcid); 240 + 240 241 mt7915_mac_wtbl_update(dev, idx, 241 242 MT_WTBL_UPDATE_ADM_COUNT_CLEAR); 242 243 ··· 253 252 vif->offload_flags |= IEEE80211_OFFLOAD_ENCAP_4ADDR; 254 253 255 254 mt7915_init_bitrate_mask(vif); 255 + memset(&mvif->cap, -1, sizeof(mvif->cap)); 256 256 257 257 out: 258 258 mutex_unlock(&dev->mt76.mutex); ··· 293 291 if (!list_empty(&msta->poll_list)) 294 292 list_del_init(&msta->poll_list); 295 293 spin_unlock_bh(&dev->sta_poll_lock); 294 + 295 + mt76_packet_id_flush(&dev->mt76, &msta->wcid); 296 296 } 297 297 298 298 static void mt7915_init_dfs_state(struct mt7915_phy *phy) ··· 542 538 mutex_unlock(&dev->mt76.mutex); 543 539 } 544 540 541 + static void 542 + mt7915_update_bss_color(struct ieee80211_hw *hw, 543 + struct ieee80211_vif *vif, 544 + struct cfg80211_he_bss_color *bss_color) 545 + { 546 + struct mt7915_dev *dev = mt7915_hw_dev(hw); 547 + 548 + switch (vif->type) { 549 + case NL80211_IFTYPE_AP: { 550 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 551 + 552 + if (mvif->omac_idx > HW_BSSID_MAX) 553 + return; 554 + fallthrough; 555 + } 556 + case NL80211_IFTYPE_STATION: 557 + mt7915_mcu_update_bss_color(dev, vif, bss_color); 558 + break; 559 + default: 560 + break; 561 + } 562 + } 563 + 545 564 static void mt7915_bss_info_changed(struct ieee80211_hw *hw, 546 565 struct ieee80211_vif *vif, 547 566 struct ieee80211_bss_conf *info, ··· 613 586 if (changed & BSS_CHANGED_HE_OBSS_PD) 614 587 mt7915_mcu_add_obss_spr(dev, vif, info->he_obss_pd.enable); 615 588 589 + if (changed & BSS_CHANGED_HE_BSS_COLOR) 590 + mt7915_update_bss_color(hw, vif, &info->he_bss_color); 591 + 616 592 if (changed & (BSS_CHANGED_BEACON | 617 593 BSS_CHANGED_BEACON_ENABLED)) 618 594 mt7915_mcu_add_beacon(hw, vif, info->enable_beacon); ··· 643 613 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 644 614 int ret, idx; 645 615 646 - idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA - 1); 616 + idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA); 647 617 if (idx < 0) 648 618 return -ENOSPC; 649 619 650 620 INIT_LIST_HEAD(&msta->rc_list); 651 - INIT_LIST_HEAD(&msta->stats_list); 652 621 INIT_LIST_HEAD(&msta->poll_list); 653 622 msta->vif = mvif; 654 623 msta->wcid.sta = 1; 655 624 msta->wcid.idx = idx; 656 625 msta->wcid.ext_phy = mvif->band_idx; 657 626 msta->wcid.tx_info |= MT_WCID_TX_INFO_SET; 658 - msta->stats.jiffies = jiffies; 627 + msta->jiffies = jiffies; 659 628 660 629 mt7915_mac_wtbl_update(dev, idx, 661 630 MT_WTBL_UPDATE_ADM_COUNT_CLEAR); ··· 663 634 if (ret) 664 635 return ret; 665 636 666 - return mt7915_mcu_add_sta_adv(dev, vif, sta, true); 637 + return mt7915_mcu_add_rate_ctrl(dev, vif, sta); 667 638 } 668 639 669 640 void mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, ··· 671 642 { 672 643 struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76); 673 644 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 645 + int i; 674 646 675 - mt7915_mcu_add_sta_adv(dev, vif, sta, false); 676 647 mt7915_mcu_add_sta(dev, vif, sta, false); 677 648 678 649 mt7915_mac_wtbl_update(dev, msta->wcid.idx, 679 650 MT_WTBL_UPDATE_ADM_COUNT_CLEAR); 680 651 652 + for (i = 0; i < ARRAY_SIZE(msta->twt.flow); i++) 653 + mt7915_mac_twt_teardown_flow(dev, msta, i); 654 + 681 655 spin_lock_bh(&dev->sta_poll_lock); 682 656 if (!list_empty(&msta->poll_list)) 683 657 list_del_init(&msta->poll_list); 684 - if (!list_empty(&msta->stats_list)) 685 - list_del_init(&msta->stats_list); 686 658 if (!list_empty(&msta->rc_list)) 687 659 list_del_init(&msta->rc_list); 688 660 spin_unlock_bh(&dev->sta_poll_lock); ··· 811 781 struct mib_stats *mib = &phy->mib; 812 782 813 783 mutex_lock(&dev->mt76.mutex); 784 + 814 785 stats->dot11RTSSuccessCount = mib->rts_cnt; 815 786 stats->dot11RTSFailureCount = mib->rts_retries_cnt; 816 787 stats->dot11FCSErrorCount = mib->fcs_err_cnt; 817 788 stats->dot11ACKFailureCount = mib->ack_fail_cnt; 818 - 819 - memset(mib, 0, sizeof(*mib)); 820 789 821 790 mutex_unlock(&dev->mt76.mutex); 822 791 823 792 return 0; 824 793 } 825 794 826 - static u64 827 - mt7915_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) 795 + u64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif) 828 796 { 829 - struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 830 797 struct mt7915_dev *dev = mt7915_hw_dev(hw); 831 798 struct mt7915_phy *phy = mt7915_hw_phy(hw); 832 799 bool band = phy != &dev->phy; ··· 833 806 } tsf; 834 807 u16 n; 835 808 836 - mutex_lock(&dev->mt76.mutex); 809 + lockdep_assert_held(&dev->mt76.mutex); 837 810 838 811 n = mvif->omac_idx > HW_BSSID_MAX ? HW_BSSID_0 : mvif->omac_idx; 839 812 /* TSF software read */ ··· 842 815 tsf.t32[0] = mt76_rr(dev, MT_LPON_UTTR0(band)); 843 816 tsf.t32[1] = mt76_rr(dev, MT_LPON_UTTR1(band)); 844 817 818 + return tsf.t64; 819 + } 820 + 821 + static u64 822 + mt7915_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) 823 + { 824 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 825 + struct mt7915_dev *dev = mt7915_hw_dev(hw); 826 + u64 ret; 827 + 828 + mutex_lock(&dev->mt76.mutex); 829 + ret = __mt7915_get_tsf(hw, mvif); 845 830 mutex_unlock(&dev->mt76.mutex); 846 831 847 - return tsf.t64; 832 + return ret; 848 833 } 849 834 850 835 static void ··· 965 926 { 966 927 struct mt7915_phy *phy = mt7915_hw_phy(hw); 967 928 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 968 - struct mt7915_sta_stats *stats = &msta->stats; 929 + struct rate_info *txrate = &msta->wcid.rate; 969 930 struct rate_info rxrate = {}; 970 931 971 932 if (!mt7915_mcu_get_rx_rate(phy, vif, sta, &rxrate)) { ··· 973 934 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); 974 935 } 975 936 976 - if (!stats->tx_rate.legacy && !stats->tx_rate.flags) 937 + if (!txrate->legacy && !txrate->flags) 977 938 return; 978 939 979 - if (stats->tx_rate.legacy) { 980 - sinfo->txrate.legacy = stats->tx_rate.legacy; 940 + if (txrate->legacy) { 941 + sinfo->txrate.legacy = txrate->legacy; 981 942 } else { 982 - sinfo->txrate.mcs = stats->tx_rate.mcs; 983 - sinfo->txrate.nss = stats->tx_rate.nss; 984 - sinfo->txrate.bw = stats->tx_rate.bw; 985 - sinfo->txrate.he_gi = stats->tx_rate.he_gi; 986 - sinfo->txrate.he_dcm = stats->tx_rate.he_dcm; 987 - sinfo->txrate.he_ru_alloc = stats->tx_rate.he_ru_alloc; 943 + sinfo->txrate.mcs = txrate->mcs; 944 + sinfo->txrate.nss = txrate->nss; 945 + sinfo->txrate.bw = txrate->bw; 946 + sinfo->txrate.he_gi = txrate->he_gi; 947 + sinfo->txrate.he_dcm = txrate->he_dcm; 948 + sinfo->txrate.he_ru_alloc = txrate->he_ru_alloc; 988 949 } 989 - sinfo->txrate.flags = stats->tx_rate.flags; 950 + sinfo->txrate.flags = txrate->flags; 990 951 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 991 952 } 992 953 ··· 998 959 u32 *changed = data; 999 960 1000 961 spin_lock_bh(&dev->sta_poll_lock); 1001 - msta->stats.changed |= *changed; 962 + msta->changed |= *changed; 1002 963 if (list_empty(&msta->rc_list)) 1003 964 list_add_tail(&msta->rc_list, &dev->sta_rc_list); 1004 965 spin_unlock_bh(&dev->sta_poll_lock); ··· 1071 1032 mt7915_mcu_sta_update_hdr_trans(dev, vif, sta); 1072 1033 } 1073 1034 1035 + static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = { 1036 + "tx_ampdu_cnt", 1037 + "tx_stop_q_empty_cnt", 1038 + "tx_mpdu_attempts", 1039 + "tx_mpdu_success", 1040 + "tx_rwp_fail_cnt", 1041 + "tx_rwp_need_cnt", 1042 + "tx_pkt_ebf_cnt", 1043 + "tx_pkt_ibf_cnt", 1044 + "tx_ampdu_len:0-1", 1045 + "tx_ampdu_len:2-10", 1046 + "tx_ampdu_len:11-19", 1047 + "tx_ampdu_len:20-28", 1048 + "tx_ampdu_len:29-37", 1049 + "tx_ampdu_len:38-46", 1050 + "tx_ampdu_len:47-55", 1051 + "tx_ampdu_len:56-79", 1052 + "tx_ampdu_len:80-103", 1053 + "tx_ampdu_len:104-127", 1054 + "tx_ampdu_len:128-151", 1055 + "tx_ampdu_len:152-175", 1056 + "tx_ampdu_len:176-199", 1057 + "tx_ampdu_len:200-223", 1058 + "tx_ampdu_len:224-247", 1059 + "ba_miss_count", 1060 + "tx_beamformer_ppdu_iBF", 1061 + "tx_beamformer_ppdu_eBF", 1062 + "tx_beamformer_rx_feedback_all", 1063 + "tx_beamformer_rx_feedback_he", 1064 + "tx_beamformer_rx_feedback_vht", 1065 + "tx_beamformer_rx_feedback_ht", 1066 + "tx_beamformer_rx_feedback_bw", /* zero based idx: 20, 40, 80, 160 */ 1067 + "tx_beamformer_rx_feedback_nc", 1068 + "tx_beamformer_rx_feedback_nr", 1069 + "tx_beamformee_ok_feedback_pkts", 1070 + "tx_beamformee_feedback_trig", 1071 + "tx_mu_beamforming", 1072 + "tx_mu_mpdu", 1073 + "tx_mu_successful_mpdu", 1074 + "tx_su_successful_mpdu", 1075 + "tx_msdu_pack_1", 1076 + "tx_msdu_pack_2", 1077 + "tx_msdu_pack_3", 1078 + "tx_msdu_pack_4", 1079 + "tx_msdu_pack_5", 1080 + "tx_msdu_pack_6", 1081 + "tx_msdu_pack_7", 1082 + "tx_msdu_pack_8", 1083 + 1084 + /* rx counters */ 1085 + "rx_fifo_full_cnt", 1086 + "rx_mpdu_cnt", 1087 + "channel_idle_cnt", 1088 + "rx_vector_mismatch_cnt", 1089 + "rx_delimiter_fail_cnt", 1090 + "rx_len_mismatch_cnt", 1091 + "rx_ampdu_cnt", 1092 + "rx_ampdu_bytes_cnt", 1093 + "rx_ampdu_valid_subframe_cnt", 1094 + "rx_ampdu_valid_subframe_b_cnt", 1095 + "rx_pfdrop_cnt", 1096 + "rx_vec_queue_overflow_drop_cnt", 1097 + "rx_ba_cnt", 1098 + 1099 + /* per vif counters */ 1100 + "v_tx_mode_cck", 1101 + "v_tx_mode_ofdm", 1102 + "v_tx_mode_ht", 1103 + "v_tx_mode_ht_gf", 1104 + "v_tx_mode_vht", 1105 + "v_tx_mode_he_su", 1106 + "v_tx_mode_he_ext_su", 1107 + "v_tx_mode_he_tb", 1108 + "v_tx_mode_he_mu", 1109 + "v_tx_bw_20", 1110 + "v_tx_bw_40", 1111 + "v_tx_bw_80", 1112 + "v_tx_bw_160", 1113 + "v_tx_mcs_0", 1114 + "v_tx_mcs_1", 1115 + "v_tx_mcs_2", 1116 + "v_tx_mcs_3", 1117 + "v_tx_mcs_4", 1118 + "v_tx_mcs_5", 1119 + "v_tx_mcs_6", 1120 + "v_tx_mcs_7", 1121 + "v_tx_mcs_8", 1122 + "v_tx_mcs_9", 1123 + "v_tx_mcs_10", 1124 + "v_tx_mcs_11", 1125 + }; 1126 + 1127 + #define MT7915_SSTATS_LEN ARRAY_SIZE(mt7915_gstrings_stats) 1128 + 1129 + /* Ethtool related API */ 1130 + static 1131 + void mt7915_get_et_strings(struct ieee80211_hw *hw, 1132 + struct ieee80211_vif *vif, 1133 + u32 sset, u8 *data) 1134 + { 1135 + if (sset == ETH_SS_STATS) 1136 + memcpy(data, *mt7915_gstrings_stats, 1137 + sizeof(mt7915_gstrings_stats)); 1138 + } 1139 + 1140 + static 1141 + int mt7915_get_et_sset_count(struct ieee80211_hw *hw, 1142 + struct ieee80211_vif *vif, int sset) 1143 + { 1144 + if (sset == ETH_SS_STATS) 1145 + return MT7915_SSTATS_LEN; 1146 + 1147 + return 0; 1148 + } 1149 + 1150 + static void mt7915_ethtool_worker(void *wi_data, struct ieee80211_sta *sta) 1151 + { 1152 + struct mt76_ethtool_worker_info *wi = wi_data; 1153 + struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 1154 + 1155 + if (msta->vif->idx != wi->idx) 1156 + return; 1157 + 1158 + mt76_ethtool_worker(wi, &msta->stats); 1159 + } 1160 + 1161 + static 1162 + void mt7915_get_et_stats(struct ieee80211_hw *hw, 1163 + struct ieee80211_vif *vif, 1164 + struct ethtool_stats *stats, u64 *data) 1165 + { 1166 + struct mt7915_dev *dev = mt7915_hw_dev(hw); 1167 + struct mt7915_phy *phy = mt7915_hw_phy(hw); 1168 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 1169 + struct mt76_ethtool_worker_info wi = { 1170 + .data = data, 1171 + .idx = mvif->idx, 1172 + }; 1173 + struct mib_stats *mib = &phy->mib; 1174 + /* See mt7915_ampdu_stat_read_phy, etc */ 1175 + bool ext_phy = phy != &dev->phy; 1176 + int i, n, ei = 0; 1177 + 1178 + mutex_lock(&dev->mt76.mutex); 1179 + 1180 + mt7915_mac_update_stats(phy); 1181 + 1182 + data[ei++] = mib->tx_ampdu_cnt; 1183 + data[ei++] = mib->tx_stop_q_empty_cnt; 1184 + data[ei++] = mib->tx_mpdu_attempts_cnt; 1185 + data[ei++] = mib->tx_mpdu_success_cnt; 1186 + data[ei++] = mib->tx_rwp_fail_cnt; 1187 + data[ei++] = mib->tx_rwp_need_cnt; 1188 + data[ei++] = mib->tx_pkt_ebf_cnt; 1189 + data[ei++] = mib->tx_pkt_ibf_cnt; 1190 + 1191 + /* Tx ampdu stat */ 1192 + n = ext_phy ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0; 1193 + for (i = 0; i < 15 /*ARRAY_SIZE(bound)*/; i++) 1194 + data[ei++] = dev->mt76.aggr_stats[i + n]; 1195 + 1196 + data[ei++] = phy->mib.ba_miss_cnt; 1197 + 1198 + /* Tx Beamformer monitor */ 1199 + data[ei++] = mib->tx_bf_ibf_ppdu_cnt; 1200 + data[ei++] = mib->tx_bf_ebf_ppdu_cnt; 1201 + 1202 + /* Tx Beamformer Rx feedback monitor */ 1203 + data[ei++] = mib->tx_bf_rx_fb_all_cnt; 1204 + data[ei++] = mib->tx_bf_rx_fb_he_cnt; 1205 + data[ei++] = mib->tx_bf_rx_fb_vht_cnt; 1206 + data[ei++] = mib->tx_bf_rx_fb_ht_cnt; 1207 + 1208 + data[ei++] = mib->tx_bf_rx_fb_bw; 1209 + data[ei++] = mib->tx_bf_rx_fb_nc_cnt; 1210 + data[ei++] = mib->tx_bf_rx_fb_nr_cnt; 1211 + 1212 + /* Tx Beamformee Rx NDPA & Tx feedback report */ 1213 + data[ei++] = mib->tx_bf_fb_cpl_cnt; 1214 + data[ei++] = mib->tx_bf_fb_trig_cnt; 1215 + 1216 + /* Tx SU & MU counters */ 1217 + data[ei++] = mib->tx_bf_cnt; 1218 + data[ei++] = mib->tx_mu_mpdu_cnt; 1219 + data[ei++] = mib->tx_mu_acked_mpdu_cnt; 1220 + data[ei++] = mib->tx_su_acked_mpdu_cnt; 1221 + 1222 + /* Tx amsdu info (pack-count histogram) */ 1223 + for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++) 1224 + data[ei++] = mib->tx_amsdu[i]; 1225 + 1226 + /* rx counters */ 1227 + data[ei++] = mib->rx_fifo_full_cnt; 1228 + data[ei++] = mib->rx_mpdu_cnt; 1229 + data[ei++] = mib->channel_idle_cnt; 1230 + data[ei++] = mib->rx_vector_mismatch_cnt; 1231 + data[ei++] = mib->rx_delimiter_fail_cnt; 1232 + data[ei++] = mib->rx_len_mismatch_cnt; 1233 + data[ei++] = mib->rx_ampdu_cnt; 1234 + data[ei++] = mib->rx_ampdu_bytes_cnt; 1235 + data[ei++] = mib->rx_ampdu_valid_subframe_cnt; 1236 + data[ei++] = mib->rx_ampdu_valid_subframe_bytes_cnt; 1237 + data[ei++] = mib->rx_pfdrop_cnt; 1238 + data[ei++] = mib->rx_vec_queue_overflow_drop_cnt; 1239 + data[ei++] = mib->rx_ba_cnt; 1240 + 1241 + /* Add values for all stations owned by this vif */ 1242 + wi.initial_stat_idx = ei; 1243 + ieee80211_iterate_stations_atomic(hw, mt7915_ethtool_worker, &wi); 1244 + 1245 + mutex_unlock(&dev->mt76.mutex); 1246 + 1247 + if (wi.sta_count == 0) 1248 + return; 1249 + 1250 + ei += wi.worker_stat_count; 1251 + if (ei != MT7915_SSTATS_LEN) 1252 + dev_err(dev->mt76.dev, "ei: %d MT7915_SSTATS_LEN: %d", 1253 + ei, (int)MT7915_SSTATS_LEN); 1254 + } 1255 + 1256 + static void 1257 + mt7915_twt_teardown_request(struct ieee80211_hw *hw, 1258 + struct ieee80211_sta *sta, 1259 + u8 flowid) 1260 + { 1261 + struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 1262 + struct mt7915_dev *dev = mt7915_hw_dev(hw); 1263 + 1264 + mutex_lock(&dev->mt76.mutex); 1265 + mt7915_mac_twt_teardown_flow(dev, msta, flowid); 1266 + mutex_unlock(&dev->mt76.mutex); 1267 + } 1268 + 1074 1269 const struct ieee80211_ops mt7915_ops = { 1075 1270 .tx = mt7915_tx, 1076 1271 .start = mt7915_start, ··· 1329 1056 .get_txpower = mt76_get_txpower, 1330 1057 .channel_switch_beacon = mt7915_channel_switch_beacon, 1331 1058 .get_stats = mt7915_get_stats, 1059 + .get_et_sset_count = mt7915_get_et_sset_count, 1060 + .get_et_stats = mt7915_get_et_stats, 1061 + .get_et_strings = mt7915_get_et_strings, 1332 1062 .get_tsf = mt7915_get_tsf, 1333 1063 .set_tsf = mt7915_set_tsf, 1334 1064 .offset_tsf = mt7915_offset_tsf, ··· 1343 1067 .sta_statistics = mt7915_sta_statistics, 1344 1068 .sta_set_4addr = mt7915_sta_set_4addr, 1345 1069 .sta_set_decap_offload = mt7915_sta_set_decap_offload, 1070 + .add_twt_setup = mt7915_mac_add_twt_setup, 1071 + .twt_teardown_request = mt7915_twt_teardown_request, 1346 1072 CFG80211_TESTMODE_CMD(mt76_testmode_cmd) 1347 1073 CFG80211_TESTMODE_DUMP(mt76_testmode_dump) 1348 1074 #ifdef CONFIG_MAC80211_DEBUGFS
+542 -508
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
··· 416 416 return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[qid], skb, 0); 417 417 } 418 418 419 - static void 419 + static int 420 420 mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3) 421 421 { 422 422 struct { ··· 429 429 }, 430 430 }; 431 431 432 - mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true); 432 + return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true); 433 433 } 434 434 435 435 static void ··· 488 488 dev->hw_pattern++; 489 489 } 490 490 491 - static int 492 - mt7915_mcu_tx_rate_parse(struct mt76_phy *mphy, struct mt7915_mcu_ra_info *ra, 493 - struct rate_info *rate, u16 r) 494 - { 495 - struct ieee80211_supported_band *sband; 496 - u16 ru_idx = le16_to_cpu(ra->ru_idx); 497 - bool cck = false; 498 - 499 - rate->mcs = FIELD_GET(MT_RA_RATE_MCS, r); 500 - rate->nss = FIELD_GET(MT_RA_RATE_NSS, r) + 1; 501 - 502 - switch (FIELD_GET(MT_RA_RATE_TX_MODE, r)) { 503 - case MT_PHY_TYPE_CCK: 504 - cck = true; 505 - fallthrough; 506 - case MT_PHY_TYPE_OFDM: 507 - if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) 508 - sband = &mphy->sband_5g.sband; 509 - else 510 - sband = &mphy->sband_2g.sband; 511 - 512 - rate->mcs = mt76_get_rate(mphy->dev, sband, rate->mcs, cck); 513 - rate->legacy = sband->bitrates[rate->mcs].bitrate; 514 - break; 515 - case MT_PHY_TYPE_HT: 516 - case MT_PHY_TYPE_HT_GF: 517 - rate->mcs += (rate->nss - 1) * 8; 518 - if (rate->mcs > 31) 519 - return -EINVAL; 520 - 521 - rate->flags = RATE_INFO_FLAGS_MCS; 522 - if (ra->gi) 523 - rate->flags |= RATE_INFO_FLAGS_SHORT_GI; 524 - break; 525 - case MT_PHY_TYPE_VHT: 526 - if (rate->mcs > 9) 527 - return -EINVAL; 528 - 529 - rate->flags = RATE_INFO_FLAGS_VHT_MCS; 530 - if (ra->gi) 531 - rate->flags |= RATE_INFO_FLAGS_SHORT_GI; 532 - break; 533 - case MT_PHY_TYPE_HE_SU: 534 - case MT_PHY_TYPE_HE_EXT_SU: 535 - case MT_PHY_TYPE_HE_TB: 536 - case MT_PHY_TYPE_HE_MU: 537 - if (ra->gi > NL80211_RATE_INFO_HE_GI_3_2 || rate->mcs > 11) 538 - return -EINVAL; 539 - 540 - rate->he_gi = ra->gi; 541 - rate->he_dcm = FIELD_GET(MT_RA_RATE_DCM_EN, r); 542 - rate->flags = RATE_INFO_FLAGS_HE_MCS; 543 - break; 544 - default: 545 - return -EINVAL; 546 - } 547 - 548 - if (ru_idx) { 549 - switch (ru_idx) { 550 - case 1 ... 2: 551 - rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_996; 552 - break; 553 - case 3 ... 6: 554 - rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_484; 555 - break; 556 - case 7 ... 14: 557 - rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_242; 558 - break; 559 - default: 560 - rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_106; 561 - break; 562 - } 563 - rate->bw = RATE_INFO_BW_HE_RU; 564 - } else { 565 - u8 bw = mt7915_mcu_chan_bw(&mphy->chandef) - 566 - FIELD_GET(MT_RA_RATE_BW, r); 567 - 568 - switch (bw) { 569 - case IEEE80211_STA_RX_BW_160: 570 - rate->bw = RATE_INFO_BW_160; 571 - break; 572 - case IEEE80211_STA_RX_BW_80: 573 - rate->bw = RATE_INFO_BW_80; 574 - break; 575 - case IEEE80211_STA_RX_BW_40: 576 - rate->bw = RATE_INFO_BW_40; 577 - break; 578 - default: 579 - rate->bw = RATE_INFO_BW_20; 580 - break; 581 - } 582 - } 583 - 584 - return 0; 585 - } 586 - 587 - static void 588 - mt7915_mcu_tx_rate_report(struct mt7915_dev *dev, struct sk_buff *skb) 589 - { 590 - struct mt7915_mcu_ra_info *ra = (struct mt7915_mcu_ra_info *)skb->data; 591 - struct rate_info rate = {}, prob_rate = {}; 592 - u16 probe = le16_to_cpu(ra->prob_up_rate); 593 - u16 attempts = le16_to_cpu(ra->attempts); 594 - u16 curr = le16_to_cpu(ra->curr_rate); 595 - u16 wcidx = le16_to_cpu(ra->wlan_idx); 596 - struct ieee80211_tx_status status = {}; 597 - struct mt76_phy *mphy = &dev->mphy; 598 - struct mt7915_sta_stats *stats; 599 - struct mt7915_sta *msta; 600 - struct mt76_wcid *wcid; 601 - 602 - if (wcidx >= MT76_N_WCIDS) 603 - return; 604 - 605 - wcid = rcu_dereference(dev->mt76.wcid[wcidx]); 606 - if (!wcid) 607 - return; 608 - 609 - msta = container_of(wcid, struct mt7915_sta, wcid); 610 - stats = &msta->stats; 611 - 612 - if (msta->wcid.ext_phy && dev->mt76.phy2) 613 - mphy = dev->mt76.phy2; 614 - 615 - /* current rate */ 616 - if (!mt7915_mcu_tx_rate_parse(mphy, ra, &rate, curr)) 617 - stats->tx_rate = rate; 618 - 619 - /* probing rate */ 620 - if (!mt7915_mcu_tx_rate_parse(mphy, ra, &prob_rate, probe)) 621 - stats->prob_rate = prob_rate; 622 - 623 - if (attempts) { 624 - u16 success = le16_to_cpu(ra->success); 625 - 626 - stats->per = 1000 * (attempts - success) / attempts; 627 - } 628 - 629 - status.sta = wcid_to_sta(wcid); 630 - if (!status.sta) 631 - return; 632 - 633 - status.rate = &stats->tx_rate; 634 - ieee80211_tx_status_ext(mphy->hw, &status); 635 - } 636 - 637 491 static void 638 492 mt7915_mcu_rx_log_message(struct mt7915_dev *dev, struct sk_buff *skb) 639 493 { ··· 512 658 } 513 659 514 660 static void 661 + mt7915_mcu_cca_finish(void *priv, u8 *mac, struct ieee80211_vif *vif) 662 + { 663 + if (!vif->color_change_active) 664 + return; 665 + 666 + ieee80211_color_change_finish(vif); 667 + } 668 + 669 + static void 515 670 mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb) 516 671 { 517 672 struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data; ··· 535 672 case MCU_EXT_EVENT_CSA_NOTIFY: 536 673 mt7915_mcu_rx_csa_notify(dev, skb); 537 674 break; 538 - case MCU_EXT_EVENT_RATE_REPORT: 539 - mt7915_mcu_tx_rate_report(dev, skb); 540 - break; 541 675 case MCU_EXT_EVENT_FW_LOG_2_HOST: 542 676 mt7915_mcu_rx_log_message(dev, skb); 677 + break; 678 + case MCU_EXT_EVENT_BCC_NOTIFY: 679 + ieee80211_iterate_active_interfaces_atomic(dev->mt76.hw, 680 + IEEE80211_IFACE_ITER_RESUME_ALL, 681 + mt7915_mcu_cca_finish, dev); 543 682 break; 544 683 default: 545 684 break; ··· 571 706 rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST || 572 707 rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP || 573 708 rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC || 574 - rxd->ext_eid == MCU_EXT_EVENT_RATE_REPORT || 709 + rxd->ext_eid == MCU_EXT_EVENT_BCC_NOTIFY || 575 710 !rxd->seq) 576 711 mt7915_mcu_rx_unsolicited_event(dev, skb); 577 712 else ··· 586 721 .bss_idx = mvif->idx, 587 722 .wlan_idx_lo = msta ? to_wcid_lo(msta->wcid.idx) : 0, 588 723 .wlan_idx_hi = msta ? to_wcid_hi(msta->wcid.idx) : 0, 589 - .muar_idx = msta ? mvif->omac_idx : 0, 724 + .muar_idx = msta && msta->wcid.sta ? mvif->omac_idx : 0xe, 590 725 .is_tlv_append = 1, 591 726 }; 592 727 struct sk_buff *skb; ··· 622 757 } 623 758 624 759 if (sta_hdr) 625 - sta_hdr->len = cpu_to_le16(sizeof(hdr)); 760 + le16_add_cpu(&sta_hdr->len, sizeof(hdr)); 626 761 627 762 return skb_put_data(nskb, &hdr, sizeof(hdr)); 628 763 } ··· 788 923 struct mt7915_he_obss_narrow_bw_ru_data *data = _data; 789 924 const struct element *elem; 790 925 926 + rcu_read_lock(); 791 927 elem = ieee80211_bss_get_elem(bss, WLAN_EID_EXT_CAPABILITY); 792 928 793 - if (!elem || elem->datalen < 10 || 929 + if (!elem || elem->datalen <= 10 || 794 930 !(elem->data[10] & 795 931 WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT)) 796 932 data->tolerated = false; 933 + 934 + rcu_read_unlock(); 797 935 } 798 936 799 937 static bool mt7915_check_he_obss_narrow_bw_ru(struct ieee80211_hw *hw, ··· 1069 1201 u8 cipher; 1070 1202 1071 1203 cipher = mt7915_mcu_get_cipher(key->cipher); 1072 - if (cipher == MT_CIPHER_NONE) 1204 + if (cipher == MCU_CIPHER_NONE) 1073 1205 return -EOPNOTSUPP; 1074 1206 1075 1207 sec_key = &sec->key[0]; ··· 1185 1317 ba->rst_ba_sb = 1; 1186 1318 } 1187 1319 1188 - if (enable && tx) 1320 + if (enable) 1189 1321 ba->ba_winsize = cpu_to_le16(params->buf_size); 1190 1322 } 1191 1323 ··· 1337 1469 } 1338 1470 1339 1471 static void 1340 - mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta) 1472 + mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta, 1473 + struct ieee80211_vif *vif) 1341 1474 { 1342 1475 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 1343 - struct ieee80211_sta_he_cap *he_cap = &sta->he_cap; 1344 - struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; 1476 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 1477 + struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem; 1345 1478 enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band; 1346 1479 const u16 *mcs_mask = msta->vif->bitrate_mask.control[band].he_mcs; 1347 1480 struct sta_rec_he *he; 1348 1481 struct tlv *tlv; 1349 1482 u32 cap = 0; 1483 + 1484 + if (!sta->he_cap.has_he) 1485 + return; 1350 1486 1351 1487 tlv = mt7915_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he)); 1352 1488 ··· 1376 1504 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G)) 1377 1505 cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT; 1378 1506 1379 - if (elem->phy_cap_info[1] & 1380 - IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD) 1507 + if (mvif->cap.ldpc && (elem->phy_cap_info[1] & 1508 + IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)) 1381 1509 cap |= STA_REC_HE_CAP_LDPC; 1382 1510 1383 1511 if (elem->phy_cap_info[1] & ··· 1395 1523 if (elem->phy_cap_info[2] & 1396 1524 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ) 1397 1525 cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC; 1526 + 1527 + if (elem->phy_cap_info[6] & 1528 + IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB) 1529 + cap |= STA_REC_HE_CAP_TRIG_CQI_FK; 1398 1530 1399 1531 if (elem->phy_cap_info[6] & 1400 1532 IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE) ··· 1423 1547 if (elem->phy_cap_info[8] & 1424 1548 IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI) 1425 1549 cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI; 1426 - 1427 - if (elem->phy_cap_info[9] & 1428 - IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK) 1429 - cap |= STA_REC_HE_CAP_TRIG_CQI_FK; 1430 1550 1431 1551 if (elem->phy_cap_info[9] & 1432 1552 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU) ··· 1512 1640 } 1513 1641 1514 1642 static void 1515 - mt7915_mcu_sta_muru_tlv(struct sk_buff *skb, struct ieee80211_sta *sta) 1643 + mt7915_mcu_sta_muru_tlv(struct sk_buff *skb, struct ieee80211_sta *sta, 1644 + struct ieee80211_vif *vif) 1516 1645 { 1517 - struct ieee80211_sta_he_cap *he_cap = &sta->he_cap; 1518 - struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; 1646 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 1647 + struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem; 1519 1648 struct sta_rec_muru *muru; 1520 1649 struct tlv *tlv; 1650 + 1651 + if (vif->type != NL80211_IFTYPE_STATION && 1652 + vif->type != NL80211_IFTYPE_AP) 1653 + return; 1654 + 1655 + if (!sta->vht_cap.vht_supported) 1656 + return; 1521 1657 1522 1658 tlv = mt7915_mcu_add_tlv(skb, STA_REC_MURU, sizeof(*muru)); 1523 1659 1524 1660 muru = (struct sta_rec_muru *)tlv; 1525 - muru->cfg.ofdma_dl_en = true; 1526 - muru->cfg.mimo_dl_en = true; 1527 1661 1662 + muru->cfg.mimo_dl_en = mvif->cap.he_mu_ebfer || 1663 + mvif->cap.vht_mu_ebfer || 1664 + mvif->cap.vht_mu_ebfee; 1665 + 1666 + muru->mimo_dl.vht_mu_bfee = 1667 + !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE); 1668 + 1669 + if (!sta->he_cap.has_he) 1670 + return; 1671 + 1672 + muru->mimo_dl.partial_bw_dl_mimo = 1673 + HE_PHY(CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO, elem->phy_cap_info[6]); 1674 + 1675 + muru->cfg.mimo_ul_en = true; 1676 + muru->mimo_ul.full_ul_mimo = 1677 + HE_PHY(CAP2_UL_MU_FULL_MU_MIMO, elem->phy_cap_info[2]); 1678 + muru->mimo_ul.partial_ul_mimo = 1679 + HE_PHY(CAP2_UL_MU_PARTIAL_MU_MIMO, elem->phy_cap_info[2]); 1680 + 1681 + muru->cfg.ofdma_dl_en = true; 1528 1682 muru->ofdma_dl.punc_pream_rx = 1529 1683 HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]); 1530 1684 muru->ofdma_dl.he_20m_in_40m_2g = ··· 1559 1661 HE_PHY(CAP8_20MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]); 1560 1662 muru->ofdma_dl.he_80m_in_160m = 1561 1663 HE_PHY(CAP8_80MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]); 1562 - muru->ofdma_dl.lt16_sigb = 0; 1563 - muru->ofdma_dl.rx_su_comp_sigb = 0; 1564 - muru->ofdma_dl.rx_su_non_comp_sigb = 0; 1565 1664 1566 1665 muru->ofdma_ul.t_frame_dur = 1567 1666 HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]); ··· 1566 1671 HE_MAC(CAP2_MU_CASCADING, elem->mac_cap_info[2]); 1567 1672 muru->ofdma_ul.uo_ra = 1568 1673 HE_MAC(CAP3_OFDMA_RA, elem->mac_cap_info[3]); 1569 - muru->ofdma_ul.he_2x996_tone = 0; 1570 - muru->ofdma_ul.rx_t_frame_11ac = 0; 1674 + } 1571 1675 1572 - muru->mimo_dl.vht_mu_bfee = 1573 - !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE); 1574 - muru->mimo_dl.partial_bw_dl_mimo = 1575 - HE_PHY(CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO, elem->phy_cap_info[6]); 1676 + static void 1677 + mt7915_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta) 1678 + { 1679 + struct sta_rec_ht *ht; 1680 + struct tlv *tlv; 1576 1681 1577 - muru->mimo_ul.full_ul_mimo = 1578 - HE_PHY(CAP2_UL_MU_FULL_MU_MIMO, elem->phy_cap_info[2]); 1579 - muru->mimo_ul.partial_ul_mimo = 1580 - HE_PHY(CAP2_UL_MU_PARTIAL_MU_MIMO, elem->phy_cap_info[2]); 1682 + tlv = mt7915_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht)); 1683 + 1684 + ht = (struct sta_rec_ht *)tlv; 1685 + ht->ht_cap = cpu_to_le16(sta->ht_cap.cap); 1581 1686 } 1582 1687 1583 1688 static void ··· 1585 1690 { 1586 1691 struct sta_rec_vht *vht; 1587 1692 struct tlv *tlv; 1693 + 1694 + if (!sta->vht_cap.vht_supported) 1695 + return; 1588 1696 1589 1697 tlv = mt7915_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht)); 1590 1698 ··· 1598 1700 } 1599 1701 1600 1702 static void 1601 - mt7915_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_sta *sta) 1703 + mt7915_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_vif *vif, 1704 + struct ieee80211_sta *sta) 1602 1705 { 1603 1706 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 1604 1707 struct sta_rec_amsdu *amsdu; 1605 1708 struct tlv *tlv; 1709 + 1710 + if (vif->type != NL80211_IFTYPE_STATION && 1711 + vif->type != NL80211_IFTYPE_AP) 1712 + return; 1606 1713 1607 1714 if (!sta->max_amsdu_len) 1608 1715 return; ··· 1621 1718 msta->wcid.amsdu = true; 1622 1719 } 1623 1720 1624 - static bool 1625 - mt7915_hw_amsdu_supported(struct ieee80211_vif *vif) 1626 - { 1627 - switch (vif->type) { 1628 - case NL80211_IFTYPE_AP: 1629 - case NL80211_IFTYPE_STATION: 1630 - return true; 1631 - default: 1632 - return false; 1633 - } 1634 - } 1635 - 1636 - static void 1637 - mt7915_mcu_sta_tlv(struct mt7915_dev *dev, struct sk_buff *skb, 1638 - struct ieee80211_sta *sta, struct ieee80211_vif *vif) 1639 - { 1640 - struct tlv *tlv; 1641 - 1642 - /* starec ht */ 1643 - if (sta->ht_cap.ht_supported) { 1644 - struct sta_rec_ht *ht; 1645 - 1646 - tlv = mt7915_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht)); 1647 - ht = (struct sta_rec_ht *)tlv; 1648 - ht->ht_cap = cpu_to_le16(sta->ht_cap.cap); 1649 - 1650 - if (mt7915_hw_amsdu_supported(vif)) 1651 - mt7915_mcu_sta_amsdu_tlv(skb, sta); 1652 - } 1653 - 1654 - /* starec he */ 1655 - if (sta->he_cap.has_he) 1656 - mt7915_mcu_sta_he_tlv(skb, sta); 1657 - 1658 - /* starec uapsd */ 1659 - mt7915_mcu_sta_uapsd_tlv(skb, sta, vif); 1660 - } 1661 - 1662 1721 static void 1663 1722 mt7915_mcu_wtbl_smps_tlv(struct sk_buff *skb, struct ieee80211_sta *sta, 1664 1723 void *sta_wtbl, void *wtbl_tlv) ··· 1631 1766 tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps), 1632 1767 wtbl_tlv, sta_wtbl); 1633 1768 smps = (struct wtbl_smps *)tlv; 1634 - 1635 - if (sta->smps_mode == IEEE80211_SMPS_DYNAMIC) 1636 - smps->smps = true; 1769 + smps->smps = (sta->smps_mode == IEEE80211_SMPS_DYNAMIC); 1637 1770 } 1638 1771 1639 1772 static void 1640 - mt7915_mcu_wtbl_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta, 1641 - void *sta_wtbl, void *wtbl_tlv) 1773 + mt7915_mcu_wtbl_ht_tlv(struct sk_buff *skb, struct ieee80211_vif *vif, 1774 + struct ieee80211_sta *sta, void *sta_wtbl, 1775 + void *wtbl_tlv) 1642 1776 { 1777 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 1643 1778 struct wtbl_ht *ht = NULL; 1644 1779 struct tlv *tlv; 1645 1780 ··· 1648 1783 tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht), 1649 1784 wtbl_tlv, sta_wtbl); 1650 1785 ht = (struct wtbl_ht *)tlv; 1651 - ht->ldpc = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING); 1786 + ht->ldpc = mvif->cap.ldpc && 1787 + (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING); 1652 1788 ht->af = sta->ht_cap.ampdu_factor; 1653 1789 ht->mm = sta->ht_cap.ampdu_density; 1654 1790 ht->ht = true; ··· 1663 1797 tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_VHT, sizeof(*vht), 1664 1798 wtbl_tlv, sta_wtbl); 1665 1799 vht = (struct wtbl_vht *)tlv; 1666 - vht->ldpc = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC); 1800 + vht->ldpc = mvif->cap.ldpc && 1801 + (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC); 1667 1802 vht->vht = true; 1668 1803 1669 1804 af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK, ··· 1703 1836 htr->to_ds = true; 1704 1837 htr->from_ds = true; 1705 1838 } 1839 + } 1840 + 1841 + static int 1842 + mt7915_mcu_sta_wtbl_tlv(struct mt7915_dev *dev, struct sk_buff *skb, 1843 + struct ieee80211_vif *vif, struct ieee80211_sta *sta) 1844 + { 1845 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 1846 + struct mt7915_sta *msta; 1847 + struct wtbl_req_hdr *wtbl_hdr; 1848 + struct tlv *tlv; 1849 + 1850 + msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta; 1851 + 1852 + tlv = mt7915_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv)); 1853 + wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_RESET_AND_SET, 1854 + tlv, &skb); 1855 + if (IS_ERR(wtbl_hdr)) 1856 + return PTR_ERR(wtbl_hdr); 1857 + 1858 + mt7915_mcu_wtbl_generic_tlv(skb, vif, sta, tlv, wtbl_hdr); 1859 + mt7915_mcu_wtbl_hdr_trans_tlv(skb, vif, sta, tlv, wtbl_hdr); 1860 + 1861 + if (sta) 1862 + mt7915_mcu_wtbl_ht_tlv(skb, vif, sta, tlv, wtbl_hdr); 1863 + 1864 + return 0; 1706 1865 } 1707 1866 1708 1867 int mt7915_mcu_sta_update_hdr_trans(struct mt7915_dev *dev, ··· 1780 1887 MCU_EXT_CMD(STA_REC_UPDATE), true); 1781 1888 } 1782 1889 1890 + static inline bool 1891 + mt7915_is_ebf_supported(struct mt7915_phy *phy, struct ieee80211_vif *vif, 1892 + struct ieee80211_sta *sta, bool bfee) 1893 + { 1894 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 1895 + int tx_ant = hweight8(phy->mt76->chainmask) - 1; 1896 + 1897 + if (vif->type != NL80211_IFTYPE_STATION && 1898 + vif->type != NL80211_IFTYPE_AP) 1899 + return false; 1900 + 1901 + if (!bfee && tx_ant < 2) 1902 + return false; 1903 + 1904 + if (sta->he_cap.has_he) { 1905 + struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem; 1906 + 1907 + if (bfee) 1908 + return mvif->cap.he_su_ebfee && 1909 + HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]); 1910 + else 1911 + return mvif->cap.he_su_ebfer && 1912 + HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]); 1913 + } 1914 + 1915 + if (sta->vht_cap.vht_supported) { 1916 + u32 cap = sta->vht_cap.cap; 1917 + 1918 + if (bfee) 1919 + return mvif->cap.vht_su_ebfee && 1920 + (cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); 1921 + else 1922 + return mvif->cap.vht_su_ebfer && 1923 + (cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE); 1924 + } 1925 + 1926 + return false; 1927 + } 1928 + 1783 1929 static void 1784 1930 mt7915_mcu_sta_sounding_rate(struct sta_rec_bf *bf) 1785 1931 { 1786 - bf->bf_cap = MT_EBF; 1787 1932 bf->sounding_phy = MT_PHY_TYPE_OFDM; 1788 1933 bf->ndp_rate = 0; /* mcs0 */ 1789 1934 bf->ndpa_rate = MT7915_CFEND_RATE_DEFAULT; /* ofdm 24m */ ··· 1836 1905 u8 n = 0; 1837 1906 1838 1907 bf->tx_mode = MT_PHY_TYPE_HT; 1839 - bf->bf_cap = MT_IBF; 1840 1908 1841 - if (mcs->tx_params & IEEE80211_HT_MCS_TX_RX_DIFF && 1909 + if ((mcs->tx_params & IEEE80211_HT_MCS_TX_RX_DIFF) && 1842 1910 (mcs->tx_params & IEEE80211_HT_MCS_TX_DEFINED)) 1843 1911 n = FIELD_GET(IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK, 1844 1912 mcs->tx_params); ··· 1848 1918 else if (mcs->rx_mask[1]) 1849 1919 n = 1; 1850 1920 1851 - bf->nr = hweight8(phy->mt76->chainmask) - 1; 1852 - bf->nc = min_t(u8, bf->nr, n); 1921 + bf->nrow = hweight8(phy->mt76->chainmask) - 1; 1922 + bf->ncol = min_t(u8, bf->nrow, n); 1853 1923 bf->ibf_ncol = n; 1854 1924 } 1855 1925 ··· 1866 1936 bf->tx_mode = MT_PHY_TYPE_VHT; 1867 1937 1868 1938 if (explicit) { 1869 - u8 bfee_nr, bfer_nr; 1939 + u8 sts, snd_dim; 1870 1940 1871 1941 mt7915_mcu_sta_sounding_rate(bf); 1872 - bfee_nr = FIELD_GET(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK, 1873 - pc->cap); 1874 - bfer_nr = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK, 1942 + 1943 + sts = FIELD_GET(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK, 1944 + pc->cap); 1945 + snd_dim = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK, 1875 1946 vc->cap); 1876 - bf->nr = min_t(u8, min_t(u8, bfer_nr, bfee_nr), tx_ant); 1877 - bf->nc = min_t(u8, nss_mcs, bf->nr); 1878 - bf->ibf_ncol = bf->nc; 1947 + bf->nrow = min_t(u8, min_t(u8, snd_dim, sts), tx_ant); 1948 + bf->ncol = min_t(u8, nss_mcs, bf->nrow); 1949 + bf->ibf_ncol = bf->ncol; 1879 1950 1880 1951 if (sta->bandwidth == IEEE80211_STA_RX_BW_160) 1881 - bf->nr = 1; 1952 + bf->nrow = 1; 1882 1953 } else { 1883 - bf->bf_cap = MT_IBF; 1884 - bf->nr = tx_ant; 1885 - bf->nc = min_t(u8, nss_mcs, bf->nr); 1954 + bf->nrow = tx_ant; 1955 + bf->ncol = min_t(u8, nss_mcs, bf->nrow); 1886 1956 bf->ibf_ncol = nss_mcs; 1887 1957 1888 1958 if (sta->bandwidth == IEEE80211_STA_RX_BW_160) ··· 1900 1970 const struct ieee80211_he_cap_elem *ve = &vc->he_cap_elem; 1901 1971 u16 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80); 1902 1972 u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map); 1903 - u8 bfee_nr, bfer_nr; 1973 + u8 snd_dim, sts; 1904 1974 1905 1975 bf->tx_mode = MT_PHY_TYPE_HE_SU; 1976 + 1906 1977 mt7915_mcu_sta_sounding_rate(bf); 1978 + 1907 1979 bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMING_FB, 1908 1980 pe->phy_cap_info[6]); 1909 1981 bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB, 1910 1982 pe->phy_cap_info[6]); 1911 - bfer_nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK, 1983 + snd_dim = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK, 1912 1984 ve->phy_cap_info[5]); 1913 - bfee_nr = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK, 1914 - pe->phy_cap_info[4]); 1915 - bf->nr = min_t(u8, bfer_nr, bfee_nr); 1916 - bf->nc = min_t(u8, nss_mcs, bf->nr); 1917 - bf->ibf_ncol = bf->nc; 1985 + sts = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK, 1986 + pe->phy_cap_info[4]); 1987 + bf->nrow = min_t(u8, snd_dim, sts); 1988 + bf->ncol = min_t(u8, nss_mcs, bf->nrow); 1989 + bf->ibf_ncol = bf->ncol; 1918 1990 1919 1991 if (sta->bandwidth != IEEE80211_STA_RX_BW_160) 1920 1992 return; ··· 1927 1995 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_160); 1928 1996 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map); 1929 1997 1930 - bf->nc_bw160 = nss_mcs; 1998 + bf->ncol_bw160 = nss_mcs; 1931 1999 } 1932 2000 1933 2001 if (pe->phy_cap_info[0] & ··· 1935 2003 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80p80); 1936 2004 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map); 1937 2005 1938 - if (bf->nc_bw160) 1939 - bf->nc_bw160 = min_t(u8, bf->nc_bw160, nss_mcs); 2006 + if (bf->ncol_bw160) 2007 + bf->ncol_bw160 = min_t(u8, bf->ncol_bw160, nss_mcs); 1940 2008 else 1941 - bf->nc_bw160 = nss_mcs; 2009 + bf->ncol_bw160 = nss_mcs; 1942 2010 } 1943 2011 1944 - bfer_nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK, 2012 + snd_dim = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK, 1945 2013 ve->phy_cap_info[5]); 1946 - bfee_nr = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK, 1947 - pe->phy_cap_info[4]); 2014 + sts = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK, 2015 + pe->phy_cap_info[4]); 1948 2016 1949 - bf->nr_bw160 = min_t(int, bfer_nr, bfee_nr); 2017 + bf->nrow_bw160 = min_t(int, snd_dim, sts); 1950 2018 } 1951 2019 1952 2020 static void 1953 - mt7915_mcu_sta_bfer_tlv(struct sk_buff *skb, struct ieee80211_sta *sta, 1954 - struct ieee80211_vif *vif, struct mt7915_phy *phy, 1955 - bool enable, bool explicit) 2021 + mt7915_mcu_sta_bfer_tlv(struct mt7915_dev *dev, struct sk_buff *skb, 2022 + struct ieee80211_vif *vif, struct ieee80211_sta *sta) 1956 2023 { 2024 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 2025 + struct mt7915_phy *phy = 2026 + mvif->band_idx ? mt7915_ext_phy(dev) : &dev->phy; 1957 2027 int tx_ant = hweight8(phy->mt76->chainmask) - 1; 1958 2028 struct sta_rec_bf *bf; 1959 2029 struct tlv *tlv; ··· 1965 2031 {2, 4, 4, 0}, /* 3x1, 3x2, 3x3, 3x4 */ 1966 2032 {3, 5, 6, 0} /* 4x1, 4x2, 4x3, 4x4 */ 1967 2033 }; 2034 + bool ebf; 1968 2035 1969 - #define MT_BFER_FREE cpu_to_le16(GENMASK(15, 0)) 2036 + ebf = mt7915_is_ebf_supported(phy, vif, sta, false); 2037 + if (!ebf && !dev->ibf) 2038 + return; 1970 2039 1971 2040 tlv = mt7915_mcu_add_tlv(skb, STA_REC_BF, sizeof(*bf)); 1972 2041 bf = (struct sta_rec_bf *)tlv; 1973 - 1974 - if (!enable) { 1975 - bf->pfmu = MT_BFER_FREE; 1976 - return; 1977 - } 1978 2042 1979 2043 /* he: eBF only, in accordance with spec 1980 2044 * vht: support eBF and iBF 1981 2045 * ht: iBF only, since mac80211 lacks of eBF support 1982 2046 */ 1983 - if (sta->he_cap.has_he && explicit) 2047 + if (sta->he_cap.has_he && ebf) 1984 2048 mt7915_mcu_sta_bfer_he(sta, vif, phy, bf); 1985 2049 else if (sta->vht_cap.vht_supported) 1986 - mt7915_mcu_sta_bfer_vht(sta, phy, bf, explicit); 2050 + mt7915_mcu_sta_bfer_vht(sta, phy, bf, ebf); 1987 2051 else if (sta->ht_cap.ht_supported) 1988 2052 mt7915_mcu_sta_bfer_ht(sta, phy, bf); 1989 2053 else 1990 2054 return; 1991 2055 2056 + bf->bf_cap = ebf ? ebf : dev->ibf << 1; 1992 2057 bf->bw = sta->bandwidth; 1993 2058 bf->ibf_dbw = sta->bandwidth; 1994 2059 bf->ibf_nrow = tx_ant; 1995 2060 1996 - if (!explicit && sta->bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->nc) 2061 + if (!ebf && sta->bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->ncol) 1997 2062 bf->ibf_timeout = 0x48; 1998 2063 else 1999 2064 bf->ibf_timeout = 0x18; 2000 2065 2001 - if (explicit && bf->nr != tx_ant) 2002 - bf->mem_20m = matrix[tx_ant][bf->nc]; 2066 + if (ebf && bf->nrow != tx_ant) 2067 + bf->mem_20m = matrix[tx_ant][bf->ncol]; 2003 2068 else 2004 - bf->mem_20m = matrix[bf->nr][bf->nc]; 2069 + bf->mem_20m = matrix[bf->nrow][bf->ncol]; 2005 2070 2006 2071 switch (sta->bandwidth) { 2007 2072 case IEEE80211_STA_RX_BW_160: ··· 2017 2084 } 2018 2085 2019 2086 static void 2020 - mt7915_mcu_sta_bfee_tlv(struct sk_buff *skb, struct ieee80211_sta *sta, 2021 - struct mt7915_phy *phy) 2087 + mt7915_mcu_sta_bfee_tlv(struct mt7915_dev *dev, struct sk_buff *skb, 2088 + struct ieee80211_vif *vif, struct ieee80211_sta *sta) 2022 2089 { 2090 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 2091 + struct mt7915_phy *phy = 2092 + mvif->band_idx ? mt7915_ext_phy(dev) : &dev->phy; 2023 2093 int tx_ant = hweight8(phy->mt76->chainmask) - 1; 2024 2094 struct sta_rec_bfee *bfee; 2025 2095 struct tlv *tlv; 2026 - u8 nr = 0; 2096 + u8 nrow = 0; 2097 + 2098 + if (!mt7915_is_ebf_supported(phy, vif, sta, true)) 2099 + return; 2027 2100 2028 2101 tlv = mt7915_mcu_add_tlv(skb, STA_REC_BFEE, sizeof(*bfee)); 2029 2102 bfee = (struct sta_rec_bfee *)tlv; ··· 2037 2098 if (sta->he_cap.has_he) { 2038 2099 struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem; 2039 2100 2040 - nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK, 2041 - pe->phy_cap_info[5]); 2101 + nrow = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK, 2102 + pe->phy_cap_info[5]); 2042 2103 } else if (sta->vht_cap.vht_supported) { 2043 2104 struct ieee80211_sta_vht_cap *pc = &sta->vht_cap; 2044 2105 2045 - nr = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK, 2046 - pc->cap); 2106 + nrow = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK, 2107 + pc->cap); 2047 2108 } 2048 2109 2049 2110 /* reply with identity matrix to avoid 2x2 BF negative gain */ 2050 - bfee->fb_identity_matrix = !!(nr == 1 && tx_ant == 2); 2051 - } 2052 - 2053 - static int 2054 - mt7915_mcu_add_txbf(struct mt7915_dev *dev, struct ieee80211_vif *vif, 2055 - struct ieee80211_sta *sta, bool enable) 2056 - { 2057 - struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 2058 - struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 2059 - struct mt7915_phy *phy; 2060 - struct sk_buff *skb; 2061 - int r, len; 2062 - bool ebfee = 0, ebf = 0; 2063 - 2064 - if (vif->type != NL80211_IFTYPE_STATION && 2065 - vif->type != NL80211_IFTYPE_AP) 2066 - return 0; 2067 - 2068 - phy = mvif->band_idx ? mt7915_ext_phy(dev) : &dev->phy; 2069 - 2070 - if (sta->he_cap.has_he) { 2071 - struct ieee80211_he_cap_elem *pe; 2072 - const struct ieee80211_he_cap_elem *ve; 2073 - const struct ieee80211_sta_he_cap *vc; 2074 - 2075 - pe = &sta->he_cap.he_cap_elem; 2076 - vc = mt7915_get_he_phy_cap(phy, vif); 2077 - ve = &vc->he_cap_elem; 2078 - 2079 - ebfee = !!(HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]) && 2080 - HE_PHY(CAP4_SU_BEAMFORMEE, ve->phy_cap_info[4])); 2081 - ebf = !!(HE_PHY(CAP3_SU_BEAMFORMER, ve->phy_cap_info[3]) && 2082 - HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4])); 2083 - } else if (sta->vht_cap.vht_supported) { 2084 - struct ieee80211_sta_vht_cap *pc; 2085 - struct ieee80211_sta_vht_cap *vc; 2086 - 2087 - pc = &sta->vht_cap; 2088 - vc = &phy->mt76->sband_5g.sband.vht_cap; 2089 - 2090 - ebfee = !!((pc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) && 2091 - (vc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)); 2092 - ebf = !!((vc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) && 2093 - (pc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)); 2094 - } 2095 - 2096 - /* must keep each tag independent */ 2097 - 2098 - /* starec bf */ 2099 - if (ebf || dev->ibf) { 2100 - len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_bf); 2101 - 2102 - skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len); 2103 - if (IS_ERR(skb)) 2104 - return PTR_ERR(skb); 2105 - 2106 - mt7915_mcu_sta_bfer_tlv(skb, sta, vif, phy, enable, ebf); 2107 - 2108 - r = mt76_mcu_skb_send_msg(&dev->mt76, skb, 2109 - MCU_EXT_CMD(STA_REC_UPDATE), true); 2110 - if (r) 2111 - return r; 2112 - } 2113 - 2114 - /* starec bfee */ 2115 - if (ebfee) { 2116 - len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_bfee); 2117 - 2118 - skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len); 2119 - if (IS_ERR(skb)) 2120 - return PTR_ERR(skb); 2121 - 2122 - mt7915_mcu_sta_bfee_tlv(skb, sta, phy); 2123 - 2124 - r = mt76_mcu_skb_send_msg(&dev->mt76, skb, 2125 - MCU_EXT_CMD(STA_REC_UPDATE), true); 2126 - if (r) 2127 - return r; 2128 - } 2129 - 2130 - return 0; 2111 + bfee->fb_identity_matrix = (nrow == 1 && tx_ant == 2); 2131 2112 } 2132 2113 2133 2114 static void ··· 2107 2248 cap |= STA_CAP_TX_STBC; 2108 2249 if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC) 2109 2250 cap |= STA_CAP_RX_STBC; 2110 - if (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING) 2251 + if (mvif->cap.ldpc && 2252 + (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)) 2111 2253 cap |= STA_CAP_LDPC; 2112 2254 2113 2255 mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs, mcs_mask); ··· 2133 2273 cap |= STA_CAP_VHT_TX_STBC; 2134 2274 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1) 2135 2275 cap |= STA_CAP_VHT_RX_STBC; 2136 - if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC) 2276 + if (mvif->cap.ldpc && 2277 + (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)) 2137 2278 cap |= STA_CAP_VHT_LDPC; 2138 2279 2139 2280 mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs, mcs_mask); ··· 2183 2322 if (IS_ERR(skb)) 2184 2323 return PTR_ERR(skb); 2185 2324 2186 - mt7915_mcu_sta_he_tlv(skb, sta); 2325 + mt7915_mcu_sta_he_tlv(skb, sta, vif); 2187 2326 2188 2327 return mt76_mcu_skb_send_msg(&dev->mt76, skb, 2189 2328 MCU_EXT_CMD(STA_REC_UPDATE), true); ··· 2195 2334 { 2196 2335 #define MT_STA_BSS_GROUP 1 2197 2336 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 2198 - struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 2337 + struct mt7915_sta *msta; 2199 2338 struct { 2200 2339 __le32 action; 2201 2340 u8 wlan_idx_lo; ··· 2206 2345 u8 rsv1[8]; 2207 2346 } __packed req = { 2208 2347 .action = cpu_to_le32(MT_STA_BSS_GROUP), 2209 - .wlan_idx_lo = to_wcid_lo(msta->wcid.idx), 2210 - .wlan_idx_hi = to_wcid_hi(msta->wcid.idx), 2211 2348 .val = cpu_to_le32(mvif->idx % 16), 2212 2349 }; 2213 2350 2351 + msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta; 2352 + req.wlan_idx_lo = to_wcid_lo(msta->wcid.idx); 2353 + req.wlan_idx_hi = to_wcid_hi(msta->wcid.idx); 2354 + 2214 2355 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_DRR_CTRL), &req, 2215 2356 sizeof(req), true); 2216 - } 2217 - 2218 - static int 2219 - mt7915_mcu_add_mu(struct mt7915_dev *dev, struct ieee80211_vif *vif, 2220 - struct ieee80211_sta *sta) 2221 - { 2222 - struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 2223 - struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; 2224 - struct sk_buff *skb; 2225 - int ret; 2226 - 2227 - if (!sta->vht_cap.vht_supported && !sta->he_cap.has_he) 2228 - return 0; 2229 - 2230 - ret = mt7915_mcu_add_group(dev, vif, sta); 2231 - if (ret) 2232 - return ret; 2233 - 2234 - skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, 2235 - MT7915_STA_UPDATE_MAX_SIZE); 2236 - if (IS_ERR(skb)) 2237 - return PTR_ERR(skb); 2238 - 2239 - /* wait until TxBF and MU ready to update stare vht */ 2240 - 2241 - /* starec muru */ 2242 - mt7915_mcu_sta_muru_tlv(skb, sta); 2243 - /* starec vht */ 2244 - mt7915_mcu_sta_vht_tlv(skb, sta); 2245 - 2246 - return mt76_mcu_skb_send_msg(&dev->mt76, skb, 2247 - MCU_EXT_CMD(STA_REC_UPDATE), true); 2248 - } 2249 - 2250 - int mt7915_mcu_add_sta_adv(struct mt7915_dev *dev, struct ieee80211_vif *vif, 2251 - struct ieee80211_sta *sta, bool enable) 2252 - { 2253 - int ret; 2254 - 2255 - if (!sta) 2256 - return 0; 2257 - 2258 - /* must keep the order */ 2259 - ret = mt7915_mcu_add_txbf(dev, vif, sta, enable); 2260 - if (ret || !enable) 2261 - return ret; 2262 - 2263 - ret = mt7915_mcu_add_mu(dev, vif, sta); 2264 - if (ret) 2265 - return ret; 2266 - 2267 - return mt7915_mcu_add_rate_ctrl(dev, vif, sta); 2268 2357 } 2269 2358 2270 2359 int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif, 2271 2360 struct ieee80211_sta *sta, bool enable) 2272 2361 { 2273 2362 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 2274 - struct wtbl_req_hdr *wtbl_hdr; 2275 2363 struct mt7915_sta *msta; 2276 - struct tlv *sta_wtbl; 2277 2364 struct sk_buff *skb; 2365 + int ret; 2278 2366 2279 2367 msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta; 2280 2368 ··· 2232 2422 if (IS_ERR(skb)) 2233 2423 return PTR_ERR(skb); 2234 2424 2425 + /* starec basic */ 2235 2426 mt7915_mcu_sta_basic_tlv(skb, vif, sta, enable); 2236 - if (enable && sta) 2237 - mt7915_mcu_sta_tlv(dev, skb, sta, vif); 2427 + if (!enable) 2428 + goto out; 2238 2429 2239 - sta_wtbl = mt7915_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv)); 2240 - 2241 - wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_RESET_AND_SET, 2242 - sta_wtbl, &skb); 2243 - if (IS_ERR(wtbl_hdr)) 2244 - return PTR_ERR(wtbl_hdr); 2245 - 2246 - if (enable) { 2247 - mt7915_mcu_wtbl_generic_tlv(skb, vif, sta, sta_wtbl, wtbl_hdr); 2248 - mt7915_mcu_wtbl_hdr_trans_tlv(skb, vif, sta, sta_wtbl, wtbl_hdr); 2249 - if (sta) 2250 - mt7915_mcu_wtbl_ht_tlv(skb, sta, sta_wtbl, wtbl_hdr); 2430 + /* tag order is in accordance with firmware dependency. */ 2431 + if (sta && sta->ht_cap.ht_supported) { 2432 + /* starec bfer */ 2433 + mt7915_mcu_sta_bfer_tlv(dev, skb, vif, sta); 2434 + /* starec ht */ 2435 + mt7915_mcu_sta_ht_tlv(skb, sta); 2436 + /* starec vht */ 2437 + mt7915_mcu_sta_vht_tlv(skb, sta); 2438 + /* starec uapsd */ 2439 + mt7915_mcu_sta_uapsd_tlv(skb, sta, vif); 2251 2440 } 2252 2441 2442 + ret = mt7915_mcu_sta_wtbl_tlv(dev, skb, vif, sta); 2443 + if (ret) 2444 + return ret; 2445 + 2446 + if (sta && sta->ht_cap.ht_supported) { 2447 + /* starec amsdu */ 2448 + mt7915_mcu_sta_amsdu_tlv(skb, vif, sta); 2449 + /* starec he */ 2450 + mt7915_mcu_sta_he_tlv(skb, sta, vif); 2451 + /* starec muru */ 2452 + mt7915_mcu_sta_muru_tlv(skb, sta, vif); 2453 + /* starec bfee */ 2454 + mt7915_mcu_sta_bfee_tlv(dev, skb, vif, sta); 2455 + } 2456 + 2457 + ret = mt7915_mcu_add_group(dev, vif, sta); 2458 + if (ret) 2459 + return ret; 2460 + out: 2253 2461 return mt76_mcu_skb_send_msg(&dev->mt76, skb, 2254 2462 MCU_EXT_CMD(STA_REC_UPDATE), true); 2255 2463 } ··· 2292 2464 if (!rate) { 2293 2465 ra->field = cpu_to_le32(RATE_PARAM_AUTO); 2294 2466 goto out; 2295 - } else { 2296 - ra->field = cpu_to_le32(RATE_PARAM_FIXED); 2297 2467 } 2298 2468 2469 + ra->field = cpu_to_le32(RATE_PARAM_FIXED); 2299 2470 ra->phy.type = FIELD_GET(RATE_CFG_PHY_TYPE, rate); 2300 2471 ra->phy.bw = FIELD_GET(RATE_CFG_BW, rate); 2301 2472 ra->phy.nss = FIELD_GET(RATE_CFG_NSS, rate); ··· 2307 2480 ra->phy.ldpc = FIELD_GET(RATE_CFG_LDPC, rate) * 7; 2308 2481 2309 2482 /* HT/VHT - SGI: 1, LGI: 0; HE - SGI: 0, MGI: 1, LGI: 2 */ 2310 - if (ra->phy.type > MT_PHY_TYPE_VHT) 2311 - ra->phy.sgi = ra->phy.mcs * 85; 2312 - else 2313 - ra->phy.sgi = ra->phy.mcs * 15; 2483 + if (ra->phy.type > MT_PHY_TYPE_VHT) { 2484 + ra->phy.he_ltf = FIELD_GET(RATE_CFG_HE_LTF, rate) * 85; 2485 + ra->phy.sgi = FIELD_GET(RATE_CFG_GI, rate) * 85; 2486 + } else { 2487 + ra->phy.sgi = FIELD_GET(RATE_CFG_GI, rate) * 15; 2488 + } 2314 2489 2315 2490 out: 2316 2491 return mt76_mcu_skb_send_msg(&dev->mt76, skb, ··· 2363 2534 } 2364 2535 2365 2536 static void 2366 - mt7915_mcu_beacon_csa(struct sk_buff *rskb, struct sk_buff *skb, 2367 - struct bss_info_bcn *bcn, 2368 - struct ieee80211_mutable_offsets *offs) 2537 + mt7915_mcu_beacon_cntdwn(struct ieee80211_vif *vif, struct sk_buff *rskb, 2538 + struct sk_buff *skb, struct bss_info_bcn *bcn, 2539 + struct ieee80211_mutable_offsets *offs) 2369 2540 { 2370 - if (offs->cntdwn_counter_offs[0]) { 2371 - struct tlv *tlv; 2372 - struct bss_info_bcn_csa *csa; 2541 + struct bss_info_bcn_cntdwn *info; 2542 + struct tlv *tlv; 2543 + int sub_tag; 2373 2544 2374 - tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_CSA, 2375 - sizeof(*csa), &bcn->sub_ntlv, 2376 - &bcn->len); 2377 - csa = (struct bss_info_bcn_csa *)tlv; 2378 - csa->cnt = skb->data[offs->cntdwn_counter_offs[0]]; 2379 - } 2545 + if (!offs->cntdwn_counter_offs[0]) 2546 + return; 2547 + 2548 + sub_tag = vif->csa_active ? BSS_INFO_BCN_CSA : BSS_INFO_BCN_BCC; 2549 + tlv = mt7915_mcu_add_nested_subtlv(rskb, sub_tag, sizeof(*info), 2550 + &bcn->sub_ntlv, &bcn->len); 2551 + info = (struct bss_info_bcn_cntdwn *)tlv; 2552 + info->cnt = skb->data[offs->cntdwn_counter_offs[0]]; 2380 2553 } 2381 2554 2382 2555 static void 2383 - mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct sk_buff *rskb, 2384 - struct sk_buff *skb, struct bss_info_bcn *bcn, 2556 + mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct ieee80211_vif *vif, 2557 + struct sk_buff *rskb, struct sk_buff *skb, 2558 + struct bss_info_bcn *bcn, 2385 2559 struct ieee80211_mutable_offsets *offs) 2386 2560 { 2387 2561 struct mt76_wcid *wcid = &dev->mt76.global_wcid; ··· 2400 2568 cont->pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len); 2401 2569 cont->tim_ofs = cpu_to_le16(offs->tim_offset); 2402 2570 2403 - if (offs->cntdwn_counter_offs[0]) 2404 - cont->csa_ofs = cpu_to_le16(offs->cntdwn_counter_offs[0] - 4); 2571 + if (offs->cntdwn_counter_offs[0]) { 2572 + u16 offset = offs->cntdwn_counter_offs[0]; 2573 + 2574 + if (vif->csa_active) 2575 + cont->csa_ofs = cpu_to_le16(offset - 4); 2576 + if (vif->color_change_active) 2577 + cont->bcc_ofs = cpu_to_le16(offset - 3); 2578 + } 2405 2579 2406 2580 buf = (u8 *)tlv + sizeof(*cont); 2407 2581 mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, 0, NULL, 2408 2582 true); 2409 2583 memcpy(buf + MT_TXD_SIZE, skb->data, skb->len); 2584 + } 2585 + 2586 + static void 2587 + mt7915_mcu_beacon_check_caps(struct mt7915_phy *phy, struct ieee80211_vif *vif, 2588 + struct sk_buff *skb) 2589 + { 2590 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 2591 + struct mt7915_vif_cap *vc = &mvif->cap; 2592 + const struct ieee80211_he_cap_elem *he; 2593 + const struct ieee80211_vht_cap *vht; 2594 + const struct ieee80211_ht_cap *ht; 2595 + struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data; 2596 + const u8 *ie; 2597 + u32 len, bc; 2598 + 2599 + /* Check missing configuration options to allow AP mode in mac80211 2600 + * to remain in sync with hostapd settings, and get a subset of 2601 + * beacon and hardware capabilities. 2602 + */ 2603 + if (WARN_ON_ONCE(skb->len <= (mgmt->u.beacon.variable - skb->data))) 2604 + return; 2605 + 2606 + memset(vc, 0, sizeof(*vc)); 2607 + 2608 + len = skb->len - (mgmt->u.beacon.variable - skb->data); 2609 + 2610 + ie = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, mgmt->u.beacon.variable, 2611 + len); 2612 + if (ie && ie[1] >= sizeof(*ht)) { 2613 + ht = (void *)(ie + 2); 2614 + bc = le32_to_cpu(ht->cap_info); 2615 + 2616 + vc->ldpc |= !!(bc & IEEE80211_HT_CAP_LDPC_CODING); 2617 + } 2618 + 2619 + ie = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, mgmt->u.beacon.variable, 2620 + len); 2621 + if (ie && ie[1] >= sizeof(*vht)) { 2622 + u32 pc = phy->mt76->sband_5g.sband.vht_cap.cap; 2623 + 2624 + vht = (void *)(ie + 2); 2625 + bc = le32_to_cpu(vht->vht_cap_info); 2626 + 2627 + vc->ldpc |= !!(bc & IEEE80211_VHT_CAP_RXLDPC); 2628 + vc->vht_su_ebfer = 2629 + (bc & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) && 2630 + (pc & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); 2631 + vc->vht_su_ebfee = 2632 + (bc & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) && 2633 + (pc & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE); 2634 + vc->vht_mu_ebfer = 2635 + (bc & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) && 2636 + (pc & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE); 2637 + vc->vht_mu_ebfee = 2638 + (bc & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) && 2639 + (pc & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE); 2640 + } 2641 + 2642 + ie = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY, 2643 + mgmt->u.beacon.variable, len); 2644 + if (ie && ie[1] >= sizeof(*he) + 1) { 2645 + const struct ieee80211_sta_he_cap *pc = 2646 + mt7915_get_he_phy_cap(phy, vif); 2647 + const struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem; 2648 + 2649 + he = (void *)(ie + 3); 2650 + 2651 + vc->he_su_ebfer = 2652 + HE_PHY(CAP3_SU_BEAMFORMER, he->phy_cap_info[3]) && 2653 + HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]); 2654 + vc->he_su_ebfee = 2655 + HE_PHY(CAP4_SU_BEAMFORMEE, he->phy_cap_info[4]) && 2656 + HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]); 2657 + vc->he_mu_ebfer = 2658 + HE_PHY(CAP4_MU_BEAMFORMER, he->phy_cap_info[4]) && 2659 + HE_PHY(CAP4_MU_BEAMFORMER, pe->phy_cap_info[4]); 2660 + } 2410 2661 } 2411 2662 2412 2663 int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, ··· 2532 2617 info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY; 2533 2618 } 2534 2619 2535 - /* TODO: subtag - bss color count & 11v MBSSID */ 2536 - mt7915_mcu_beacon_csa(rskb, skb, bcn, &offs); 2537 - mt7915_mcu_beacon_cont(dev, rskb, skb, bcn, &offs); 2620 + mt7915_mcu_beacon_check_caps(phy, vif, skb); 2621 + 2622 + /* TODO: subtag - 11v MBSSID */ 2623 + mt7915_mcu_beacon_cntdwn(vif, rskb, skb, bcn, &offs); 2624 + mt7915_mcu_beacon_cont(dev, vif, rskb, skb, bcn, &offs); 2538 2625 dev_kfree_skb(skb); 2539 2626 2540 2627 out: ··· 2687 2770 goto out; 2688 2771 } 2689 2772 2690 - ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER), 2691 - dl, len); 2773 + ret = __mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER), 2774 + dl, len, 4096); 2692 2775 if (ret) { 2693 2776 dev_err(dev->mt76.dev, "Failed to send patch\n"); 2694 2777 goto out; ··· 2707 2790 default: 2708 2791 ret = -EAGAIN; 2709 2792 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n"); 2710 - goto out; 2793 + break; 2711 2794 } 2712 2795 release_firmware(fw); 2713 2796 ··· 2756 2839 return err; 2757 2840 } 2758 2841 2759 - err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER), 2760 - data + offset, len); 2842 + err = __mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER), 2843 + data + offset, len, 4096); 2761 2844 if (err) { 2762 2845 dev_err(dev->mt76.dev, "Failed to send firmware.\n"); 2763 2846 return err; ··· 2907 2990 sizeof(req), false); 2908 2991 } 2909 2992 2993 + int mt7915_mcu_set_muru_ctrl(struct mt7915_dev *dev, u32 cmd, u32 val) 2994 + { 2995 + struct { 2996 + __le32 cmd; 2997 + u8 val[4]; 2998 + } __packed req = { 2999 + .cmd = cpu_to_le32(cmd), 3000 + }; 3001 + 3002 + put_unaligned_le32(val, req.val); 3003 + 3004 + return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MURU_CTRL), &req, 3005 + sizeof(req), false); 3006 + } 3007 + 3008 + static int 3009 + mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev) 3010 + { 3011 + #define RX_AIRTIME_FEATURE_CTRL 1 3012 + #define RX_AIRTIME_BITWISE_CTRL 2 3013 + #define RX_AIRTIME_CLEAR_EN 1 3014 + struct { 3015 + __le16 field; 3016 + __le16 sub_field; 3017 + __le32 set_status; 3018 + __le32 get_status; 3019 + u8 _rsv[12]; 3020 + 3021 + bool airtime_en; 3022 + bool mibtime_en; 3023 + bool earlyend_en; 3024 + u8 _rsv1[9]; 3025 + 3026 + bool airtime_clear; 3027 + bool mibtime_clear; 3028 + u8 _rsv2[98]; 3029 + } __packed req = { 3030 + .field = cpu_to_le16(RX_AIRTIME_BITWISE_CTRL), 3031 + .sub_field = cpu_to_le16(RX_AIRTIME_CLEAR_EN), 3032 + .airtime_clear = true, 3033 + }; 3034 + int ret; 3035 + 3036 + ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_AIRTIME_CTRL), &req, 3037 + sizeof(req), true); 3038 + if (ret) 3039 + return ret; 3040 + 3041 + req.field = cpu_to_le16(RX_AIRTIME_FEATURE_CTRL); 3042 + req.sub_field = cpu_to_le16(RX_AIRTIME_CLEAR_EN); 3043 + req.airtime_en = true; 3044 + 3045 + return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_AIRTIME_CTRL), &req, 3046 + sizeof(req), true); 3047 + } 3048 + 2910 3049 int mt7915_mcu_init(struct mt7915_dev *dev) 2911 3050 { 2912 3051 static const struct mt76_mcu_ops mt7915_mcu_ops = { ··· 2984 3011 return ret; 2985 3012 2986 3013 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state); 2987 - mt7915_mcu_fw_log_2_host(dev, 0); 2988 - mt7915_mcu_set_mwds(dev, 1); 2989 - mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), MCU_WA_PARAM_RED, 0, 0); 3014 + ret = mt7915_mcu_fw_log_2_host(dev, 0); 3015 + if (ret) 3016 + return ret; 2990 3017 2991 - return 0; 3018 + ret = mt7915_mcu_set_mwds(dev, 1); 3019 + if (ret) 3020 + return ret; 3021 + 3022 + ret = mt7915_mcu_set_muru_ctrl(dev, MURU_SET_PLATFORM_TYPE, 3023 + MURU_PLATFORM_TYPE_PERF_LEVEL_2); 3024 + if (ret) 3025 + return ret; 3026 + 3027 + ret = mt7915_mcu_init_rx_airtime(dev); 3028 + if (ret) 3029 + return ret; 3030 + 3031 + return mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), 3032 + MCU_WA_PARAM_RED, 0, 0); 2992 3033 } 2993 3034 2994 3035 void mt7915_mcu_exit(struct mt7915_dev *dev) ··· 3378 3391 3379 3392 static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev) 3380 3393 { 3381 - #define TOTAL_PAGE_MASK GENMASK(7, 5) 3394 + #define MAX_PAGE_IDX_MASK GENMASK(7, 5) 3382 3395 #define PAGE_IDX_MASK GENMASK(4, 2) 3383 3396 #define PER_PAGE_SIZE 0x400 3384 3397 struct mt7915_mcu_eeprom req = { .buffer_mode = EE_MODE_BUFFER }; 3385 - u8 total = MT7915_EEPROM_SIZE / PER_PAGE_SIZE; 3398 + u8 total = DIV_ROUND_UP(MT7915_EEPROM_SIZE, PER_PAGE_SIZE); 3386 3399 u8 *eep = (u8 *)dev->mt76.eeprom.data; 3387 3400 int eep_len; 3388 3401 int i; 3389 3402 3390 - for (i = 0; i <= total; i++, eep += eep_len) { 3403 + for (i = 0; i < total; i++, eep += eep_len) { 3391 3404 struct sk_buff *skb; 3392 3405 int ret; 3393 3406 3394 - if (i == total) 3407 + if (i == total - 1 && !!(MT7915_EEPROM_SIZE % PER_PAGE_SIZE)) 3395 3408 eep_len = MT7915_EEPROM_SIZE % PER_PAGE_SIZE; 3396 3409 else 3397 3410 eep_len = PER_PAGE_SIZE; ··· 3401 3414 if (!skb) 3402 3415 return -ENOMEM; 3403 3416 3404 - req.format = FIELD_PREP(TOTAL_PAGE_MASK, total) | 3417 + req.format = FIELD_PREP(MAX_PAGE_IDX_MASK, total - 1) | 3405 3418 FIELD_PREP(PAGE_IDX_MASK, i) | EE_FORMAT_WHOLE; 3406 3419 req.len = cpu_to_le16(eep_len); 3407 3420 ··· 3468 3481 u8 idx; 3469 3482 u8 rsv[4]; 3470 3483 __le32 len; 3471 - } req; 3484 + } req = {}; 3472 3485 struct sk_buff *skb; 3473 3486 3474 3487 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req) + len); ··· 3678 3691 }; 3679 3692 int level; 3680 3693 3681 - #define TRIGGER_TEMPERATURE 122 3682 - #define RESTORE_TEMPERATURE 116 3683 - #define SUSTAIN_PERIOD 10 3684 - 3685 3694 if (!state) { 3686 3695 req.ctrl.ctrl_id = THERMAL_PROTECT_DISABLE; 3687 3696 goto out; ··· 3690 3707 req.ctrl.ctrl_id = THERMAL_PROTECT_DUTY_CONFIG; 3691 3708 req.ctrl.duty.duty_level = level; 3692 3709 req.ctrl.duty.duty_cycle = state; 3693 - state = state * 4 / 5; 3710 + state /= 2; 3694 3711 3695 3712 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT), 3696 3713 &req, sizeof(req.ctrl), false); ··· 3698 3715 return ret; 3699 3716 } 3700 3717 3701 - /* currently use fixed values for throttling, and would be better 3702 - * to implement thermal zone for dynamic trip in the long run. 3703 - */ 3704 - 3705 3718 /* set high-temperature trigger threshold */ 3706 3719 req.ctrl.ctrl_id = THERMAL_PROTECT_ENABLE; 3707 - req.trigger_temp = cpu_to_le32(TRIGGER_TEMPERATURE); 3708 - req.restore_temp = cpu_to_le32(RESTORE_TEMPERATURE); 3709 - req.sustain_time = cpu_to_le16(SUSTAIN_PERIOD); 3720 + /* add a safety margin ~10 */ 3721 + req.restore_temp = cpu_to_le32(phy->throttle_temp[0] - 10); 3722 + req.trigger_temp = cpu_to_le32(phy->throttle_temp[1]); 3723 + req.sustain_time = cpu_to_le16(10); 3710 3724 3711 3725 out: 3712 3726 req.ctrl.type.protect_type = 1; ··· 3711 3731 3712 3732 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT), 3713 3733 &req, sizeof(req), false); 3714 - } 3715 - 3716 - int mt7915_mcu_get_tx_rate(struct mt7915_dev *dev, u32 cmd, u16 wlan_idx) 3717 - { 3718 - struct { 3719 - __le32 cmd; 3720 - __le16 wlan_idx; 3721 - __le16 ru_idx; 3722 - __le16 direction; 3723 - __le16 dump_group; 3724 - } req = { 3725 - .cmd = cpu_to_le32(cmd), 3726 - .wlan_idx = cpu_to_le16(wlan_idx), 3727 - .dump_group = cpu_to_le16(1), 3728 - }; 3729 - 3730 - return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RATE_CTRL), &req, 3731 - sizeof(req), false); 3732 3734 } 3733 3735 3734 3736 int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy) ··· 4030 4068 dev_kfree_skb(skb); 4031 4069 4032 4070 return ret; 4071 + } 4072 + 4073 + int mt7915_mcu_update_bss_color(struct mt7915_dev *dev, struct ieee80211_vif *vif, 4074 + struct cfg80211_he_bss_color *he_bss_color) 4075 + { 4076 + int len = sizeof(struct sta_req_hdr) + sizeof(struct bss_info_color); 4077 + struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; 4078 + struct bss_info_color *bss_color; 4079 + struct sk_buff *skb; 4080 + struct tlv *tlv; 4081 + 4082 + skb = mt7915_mcu_alloc_sta_req(dev, mvif, NULL, len); 4083 + if (IS_ERR(skb)) 4084 + return PTR_ERR(skb); 4085 + 4086 + tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_BSS_COLOR, sizeof(*bss_color)); 4087 + bss_color = (struct bss_info_color *)tlv; 4088 + bss_color->disable = !he_bss_color->enabled; 4089 + bss_color->color = he_bss_color->color; 4090 + 4091 + return mt76_mcu_skb_send_msg(&dev->mt76, skb, 4092 + MCU_EXT_CMD(BSS_INFO_UPDATE), true); 4093 + } 4094 + 4095 + #define TWT_AGRT_TRIGGER BIT(0) 4096 + #define TWT_AGRT_ANNOUNCE BIT(1) 4097 + #define TWT_AGRT_PROTECT BIT(2) 4098 + 4099 + int mt7915_mcu_twt_agrt_update(struct mt7915_dev *dev, 4100 + struct mt7915_vif *mvif, 4101 + struct mt7915_twt_flow *flow, 4102 + int cmd) 4103 + { 4104 + struct { 4105 + u8 tbl_idx; 4106 + u8 cmd; 4107 + u8 own_mac_idx; 4108 + u8 flowid; /* 0xff for group id */ 4109 + __le16 peer_id; /* specify the peer_id (msb=0) 4110 + * or group_id (msb=1) 4111 + */ 4112 + u8 duration; /* 256 us */ 4113 + u8 bss_idx; 4114 + __le64 start_tsf; 4115 + __le16 mantissa; 4116 + u8 exponent; 4117 + u8 is_ap; 4118 + u8 agrt_params; 4119 + u8 rsv[23]; 4120 + } __packed req = { 4121 + .tbl_idx = flow->table_id, 4122 + .cmd = cmd, 4123 + .own_mac_idx = mvif->omac_idx, 4124 + .flowid = flow->id, 4125 + .peer_id = cpu_to_le16(flow->wcid), 4126 + .duration = flow->duration, 4127 + .bss_idx = mvif->idx, 4128 + .start_tsf = cpu_to_le64(flow->tsf), 4129 + .mantissa = flow->mantissa, 4130 + .exponent = flow->exp, 4131 + .is_ap = true, 4132 + }; 4133 + 4134 + if (flow->protection) 4135 + req.agrt_params |= TWT_AGRT_PROTECT; 4136 + if (!flow->flowtype) 4137 + req.agrt_params |= TWT_AGRT_ANNOUNCE; 4138 + if (flow->trigger) 4139 + req.agrt_params |= TWT_AGRT_TRIGGER; 4140 + 4141 + return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TWT_AGRT_UPDATE), 4142 + &req, sizeof(req), true); 4033 4143 }
+42 -63
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
··· 43 43 MCU_EXT_EVENT_ASSERT_DUMP = 0x23, 44 44 MCU_EXT_EVENT_RDD_REPORT = 0x3a, 45 45 MCU_EXT_EVENT_CSA_NOTIFY = 0x4f, 46 - MCU_EXT_EVENT_RATE_REPORT = 0x87, 46 + MCU_EXT_EVENT_BCC_NOTIFY = 0x75, 47 47 }; 48 48 49 49 enum { ··· 164 164 u8 data[16]; 165 165 } __packed; 166 166 167 - struct mt7915_mcu_ra_info { 168 - struct mt7915_mcu_rxd rxd; 169 - 170 - __le32 event_id; 171 - __le16 wlan_idx; 172 - __le16 ru_idx; 173 - __le16 direction; 174 - __le16 dump_group; 175 - 176 - __le32 suggest_rate; 177 - __le32 min_rate; /* for dynamic sounding */ 178 - __le32 max_rate; /* for dynamic sounding */ 179 - __le32 init_rate_down_rate; 180 - 181 - __le16 curr_rate; 182 - __le16 init_rate_down_total; 183 - __le16 init_rate_down_succ; 184 - __le16 success; 185 - __le16 attempts; 186 - 187 - __le16 prev_rate; 188 - __le16 prob_up_rate; 189 - u8 no_rate_up_cnt; 190 - u8 ppdu_cnt; 191 - u8 gi; 192 - 193 - u8 try_up_fail; 194 - u8 try_up_total; 195 - u8 suggest_wf; 196 - u8 try_up_check; 197 - u8 prob_up_period; 198 - u8 prob_down_pending; 199 - } __packed; 200 - 201 - 202 167 struct mt7915_mcu_phy_rx_info { 203 168 u8 category; 204 169 u8 rate; ··· 174 209 u8 stbc; 175 210 u8 bw; 176 211 }; 177 - 178 - #define MT_RA_RATE_NSS GENMASK(8, 6) 179 - #define MT_RA_RATE_MCS GENMASK(3, 0) 180 - #define MT_RA_RATE_TX_MODE GENMASK(12, 9) 181 - #define MT_RA_RATE_DCM_EN BIT(4) 182 - #define MT_RA_RATE_BW GENMASK(14, 13) 183 212 184 213 struct mt7915_mcu_mib { 185 214 __le32 band; ··· 271 312 MCU_EXT_CMD_MAC_INIT_CTRL = 0x46, 272 313 MCU_EXT_CMD_RX_HDR_TRANS = 0x47, 273 314 MCU_EXT_CMD_MUAR_UPDATE = 0x48, 315 + MCU_EXT_CMD_RX_AIRTIME_CTRL = 0x4a, 274 316 MCU_EXT_CMD_SET_RX_PATH = 0x4e, 275 317 MCU_EXT_CMD_TX_POWER_FEATURE_CTRL = 0x58, 276 318 MCU_EXT_CMD_GET_MIB_INFO = 0x5a, 277 319 MCU_EXT_CMD_MWDS_SUPPORT = 0x80, 278 320 MCU_EXT_CMD_SET_SER_TRIGGER = 0x81, 279 321 MCU_EXT_CMD_SCS_CTRL = 0x82, 280 - MCU_EXT_CMD_RATE_CTRL = 0x87, 322 + MCU_EXT_CMD_TWT_AGRT_UPDATE = 0x94, 281 323 MCU_EXT_CMD_FW_DBG_CTRL = 0x95, 282 324 MCU_EXT_CMD_SET_RDD_TH = 0x9d, 325 + MCU_EXT_CMD_MURU_CTRL = 0x9f, 283 326 MCU_EXT_CMD_SET_SPR = 0xa8, 284 327 MCU_EXT_CMD_GROUP_PRE_CAL_INFO = 0xab, 285 328 MCU_EXT_CMD_DPD_PRE_CAL_INFO = 0xac, 286 329 MCU_EXT_CMD_PHY_STAT_INFO = 0xad, 330 + }; 331 + 332 + enum { 333 + MCU_TWT_AGRT_ADD, 334 + MCU_TWT_AGRT_MODIFY, 335 + MCU_TWT_AGRT_DELETE, 336 + MCU_TWT_AGRT_TEARDOWN, 337 + MCU_TWT_AGRT_GET_TSF, 287 338 }; 288 339 289 340 enum { ··· 514 545 u8 rsv; 515 546 } __packed; 516 547 548 + struct bss_info_color { 549 + __le16 tag; 550 + __le16 len; 551 + u8 disable; 552 + u8 color; 553 + u8 rsv[2]; 554 + } __packed; 555 + 517 556 struct bss_info_he { 518 557 __le16 tag; 519 558 __le16 len; ··· 540 563 __le16 sub_ntlv; 541 564 } __packed __aligned(4); 542 565 543 - struct bss_info_bcn_csa { 544 - __le16 tag; 545 - __le16 len; 546 - u8 cnt; 547 - u8 rsv[3]; 548 - } __packed __aligned(4); 549 - 550 - struct bss_info_bcn_bcc { 566 + struct bss_info_bcn_cntdwn { 551 567 __le16 tag; 552 568 __le16 len; 553 569 u8 cnt; ··· 686 716 __le16 sn; 687 717 u8 ba_en; 688 718 u8 ba_winsize_idx; 719 + /* originator & recipient */ 689 720 __le16 ba_winsize; 690 721 /* recipient only */ 691 722 u8 peer_addr[ETH_ALEN]; ··· 960 989 #define RATE_CFG_STBC GENMASK(19, 16) 961 990 #define RATE_CFG_LDPC GENMASK(23, 20) 962 991 #define RATE_CFG_PHY_TYPE GENMASK(27, 24) 992 + #define RATE_CFG_HE_LTF GENMASK(31, 28) 963 993 964 994 struct sta_rec_bf { 965 995 __le16 tag; ··· 974 1002 u8 ndp_rate; 975 1003 u8 rept_poll_rate; 976 1004 u8 tx_mode; /* 0: legacy, 1: OFDM, 2: HT, 4: VHT ... */ 977 - u8 nc; 978 - u8 nr; 1005 + u8 ncol; 1006 + u8 nrow; 979 1007 u8 bw; /* 0: 20M, 1: 40M, 2: 80M, 3: 160M */ 980 1008 981 1009 u8 mem_total; ··· 995 1023 u8 ibf_dbw; 996 1024 u8 ibf_ncol; 997 1025 u8 ibf_nrow; 998 - u8 nr_bw160; 999 - u8 nc_bw160; 1026 + u8 nrow_bw160; 1027 + u8 ncol_bw160; 1000 1028 u8 ru_start_idx; 1001 1029 u8 ru_end_idx; 1002 1030 ··· 1008 1036 bool codebook75_mu; 1009 1037 1010 1038 u8 he_ltf; 1011 - u8 rsv[2]; 1039 + u8 rsv[3]; 1012 1040 } __packed; 1013 1041 1014 1042 struct sta_rec_bfee { ··· 1088 1116 }; 1089 1117 1090 1118 enum { 1091 - MT_EBF = BIT(0), /* explicit beamforming */ 1092 - MT_IBF = BIT(1) /* implicit beamforming */ 1093 - }; 1094 - 1095 - enum { 1096 1119 MT_BF_SOUNDING_ON = 1, 1097 1120 MT_BF_TYPE_UPDATE = 20, 1098 1121 MT_BF_MODULE_UPDATE = 25 1122 + }; 1123 + 1124 + enum { 1125 + MURU_SET_ARB_OP_MODE = 14, 1126 + MURU_SET_PLATFORM_TYPE = 25, 1127 + }; 1128 + 1129 + enum { 1130 + MURU_PLATFORM_TYPE_PERF_LEVEL_1 = 1, 1131 + MURU_PLATFORM_TYPE_PERF_LEVEL_2, 1099 1132 }; 1100 1133 1101 1134 #define MT7915_WTBL_UPDATE_MAX_SIZE (sizeof(struct wtbl_req_hdr) + \ ··· 1114 1137 1115 1138 #define MT7915_STA_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \ 1116 1139 sizeof(struct sta_rec_basic) + \ 1140 + sizeof(struct sta_rec_bf) + \ 1117 1141 sizeof(struct sta_rec_ht) + \ 1118 1142 sizeof(struct sta_rec_he) + \ 1119 1143 sizeof(struct sta_rec_ba) + \ 1120 1144 sizeof(struct sta_rec_vht) + \ 1121 1145 sizeof(struct sta_rec_uapsd) + \ 1122 1146 sizeof(struct sta_rec_amsdu) + \ 1147 + sizeof(struct sta_rec_muru) + \ 1148 + sizeof(struct sta_rec_bfee) + \ 1123 1149 sizeof(struct tlv) + \ 1124 1150 MT7915_WTBL_UPDATE_MAX_SIZE) 1125 1151 ··· 1137 1157 sizeof(struct bss_info_ext_bss)) 1138 1158 1139 1159 #define MT7915_BEACON_UPDATE_SIZE (sizeof(struct sta_req_hdr) + \ 1140 - sizeof(struct bss_info_bcn_csa) + \ 1141 - sizeof(struct bss_info_bcn_bcc) + \ 1160 + sizeof(struct bss_info_bcn_cntdwn) + \ 1142 1161 sizeof(struct bss_info_bcn_mbss) + \ 1143 1162 sizeof(struct bss_info_bcn_cont)) 1144 1163
+1 -2
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
··· 92 92 } 93 93 94 94 if ((addr >= 0x18000000 && addr < 0x18c00000) || 95 - (addr >= 0x70000000 && addr < 0x78000000) || 96 - (addr >= 0x7c000000 && addr < 0x7c400000)) 95 + (addr >= 0x70000000 && addr < 0x78000000)) 97 96 return mt7915_reg_map_l1(dev, addr); 98 97 99 98 return mt7915_reg_map_l2(dev, addr);
+114 -30
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
··· 36 36 37 37 #define MT7915_CFEND_RATE_DEFAULT 0x49 /* OFDM 24M */ 38 38 #define MT7915_CFEND_RATE_11B 0x03 /* 11B LP, 11M */ 39 - #define MT7915_5G_RATE_DEFAULT 0x4b /* OFDM 6M */ 40 - #define MT7915_2G_RATE_DEFAULT 0x0 /* CCK 1M */ 41 39 42 40 #define MT7915_THERMAL_THROTTLE_MAX 100 43 41 44 42 #define MT7915_SKU_RATE_NUM 161 43 + 44 + #define MT7915_MAX_TWT_AGRT 16 45 + #define MT7915_MAX_STA_TWT_AGRT 8 45 46 46 47 struct mt7915_vif; 47 48 struct mt7915_sta; ··· 65 64 MT7915_RXQ_MCU_WA_EXT, 66 65 }; 67 66 68 - struct mt7915_sta_stats { 69 - struct rate_info prob_rate; 70 - struct rate_info tx_rate; 71 - 72 - unsigned long per; 73 - unsigned long changed; 74 - unsigned long jiffies; 75 - }; 76 - 77 67 struct mt7915_sta_key_conf { 78 68 s8 keyidx; 79 69 u8 key[16]; 70 + }; 71 + 72 + struct mt7915_twt_flow { 73 + struct list_head list; 74 + u64 start_tsf; 75 + u64 tsf; 76 + u32 duration; 77 + u16 wcid; 78 + __le16 mantissa; 79 + u8 exp; 80 + u8 table_id; 81 + u8 id; 82 + u8 protection:1; 83 + u8 flowtype:1; 84 + u8 trigger:1; 85 + u8 sched:1; 80 86 }; 81 87 82 88 struct mt7915_sta { ··· 91 83 92 84 struct mt7915_vif *vif; 93 85 94 - struct list_head stats_list; 95 86 struct list_head poll_list; 96 87 struct list_head rc_list; 97 88 u32 airtime_ac[8]; 98 89 99 - struct mt7915_sta_stats stats; 100 - 90 + unsigned long changed; 91 + unsigned long jiffies; 101 92 unsigned long ampdu_state; 102 93 94 + struct mt76_sta_stats stats; 95 + 103 96 struct mt7915_sta_key_conf bip; 97 + 98 + struct { 99 + u8 flowid_mask; 100 + struct mt7915_twt_flow flow[MT7915_MAX_STA_TWT_AGRT]; 101 + } twt; 102 + }; 103 + 104 + struct mt7915_vif_cap { 105 + bool ldpc:1; 106 + bool vht_su_ebfer:1; 107 + bool vht_su_ebfee:1; 108 + bool vht_mu_ebfer:1; 109 + bool vht_mu_ebfee:1; 110 + bool he_su_ebfer:1; 111 + bool he_su_ebfee:1; 112 + bool he_mu_ebfer:1; 104 113 }; 105 114 106 115 struct mt7915_vif { ··· 126 101 u8 band_idx; 127 102 u8 wmm_idx; 128 103 104 + struct mt7915_vif_cap cap; 129 105 struct mt7915_sta sta; 130 106 struct mt7915_phy *phy; 131 107 ··· 134 108 struct cfg80211_bitrate_mask bitrate_mask; 135 109 }; 136 110 111 + /* per-phy stats. */ 137 112 struct mib_stats { 138 113 u32 ack_fail_cnt; 139 114 u32 fcs_err_cnt; 140 115 u32 rts_cnt; 141 116 u32 rts_retries_cnt; 142 117 u32 ba_miss_cnt; 118 + u32 tx_bf_cnt; 119 + u32 tx_mu_mpdu_cnt; 120 + u32 tx_mu_acked_mpdu_cnt; 121 + u32 tx_su_acked_mpdu_cnt; 122 + u32 tx_bf_ibf_ppdu_cnt; 123 + u32 tx_bf_ebf_ppdu_cnt; 124 + 125 + u32 tx_bf_rx_fb_all_cnt; 126 + u32 tx_bf_rx_fb_he_cnt; 127 + u32 tx_bf_rx_fb_vht_cnt; 128 + u32 tx_bf_rx_fb_ht_cnt; 129 + 130 + u32 tx_bf_rx_fb_bw; /* value of last sample, not cumulative */ 131 + u32 tx_bf_rx_fb_nc_cnt; 132 + u32 tx_bf_rx_fb_nr_cnt; 133 + u32 tx_bf_fb_cpl_cnt; 134 + u32 tx_bf_fb_trig_cnt; 135 + 136 + u32 tx_ampdu_cnt; 137 + u32 tx_stop_q_empty_cnt; 138 + u32 tx_mpdu_attempts_cnt; 139 + u32 tx_mpdu_success_cnt; 140 + u32 tx_pkt_ebf_cnt; 141 + u32 tx_pkt_ibf_cnt; 142 + 143 + u32 tx_rwp_fail_cnt; 144 + u32 tx_rwp_need_cnt; 145 + 146 + /* rx stats */ 147 + u32 rx_fifo_full_cnt; 148 + u32 channel_idle_cnt; 149 + u32 rx_vector_mismatch_cnt; 150 + u32 rx_delimiter_fail_cnt; 151 + u32 rx_len_mismatch_cnt; 152 + u32 rx_mpdu_cnt; 153 + u32 rx_ampdu_cnt; 154 + u32 rx_ampdu_bytes_cnt; 155 + u32 rx_ampdu_valid_subframe_cnt; 156 + u32 rx_ampdu_valid_subframe_bytes_cnt; 157 + u32 rx_pfdrop_cnt; 158 + u32 rx_vec_queue_overflow_drop_cnt; 159 + u32 rx_ba_cnt; 160 + 161 + u32 tx_amsdu[8]; 162 + u32 tx_amsdu_cnt; 143 163 }; 144 164 145 165 struct mt7915_hif { ··· 206 134 207 135 struct thermal_cooling_device *cdev; 208 136 u8 throttle_state; 137 + u32 throttle_temp[2]; /* 0: critical high, 1: maximum */ 209 138 210 139 u32 rxfilter; 211 140 u64 omac_mask; ··· 224 151 225 152 struct mib_stats mib; 226 153 struct mt76_channel_state state_ts; 227 - struct list_head stats_list; 228 - 229 - u8 sta_work_count; 230 154 231 155 #ifdef CONFIG_NL80211_TESTMODE 232 156 struct { ··· 263 193 264 194 struct list_head sta_rc_list; 265 195 struct list_head sta_poll_list; 196 + struct list_head twt_list; 266 197 spinlock_t sta_poll_lock; 267 198 268 199 u32 hw_pattern; ··· 274 203 bool ibf; 275 204 276 205 void *cal; 206 + 207 + struct { 208 + u8 table_mask; 209 + u8 n_agrt; 210 + } twt; 277 211 }; 278 212 279 213 enum { ··· 296 220 }; 297 221 298 222 enum { 299 - MT_LMAC_AC00, 223 + MT_CTX0, 224 + MT_HIF0 = 0x0, 225 + 226 + MT_LMAC_AC00 = 0x0, 300 227 MT_LMAC_AC01, 301 228 MT_LMAC_AC02, 302 229 MT_LMAC_AC03, 303 230 MT_LMAC_ALTX0 = 0x10, 304 231 MT_LMAC_BMC0, 305 232 MT_LMAC_BCN0, 233 + MT_LMAC_PSMP0, 306 234 }; 307 235 308 236 enum { ··· 328 248 RDD_READ_PULSE, 329 249 RDD_RESUME_BF, 330 250 RDD_IRQ_OFF, 331 - }; 332 - 333 - enum { 334 - RATE_CTRL_RU_INFO, 335 - RATE_CTRL_FIXED_RATE_INFO, 336 - RATE_CTRL_DUMP_INFO, 337 - RATE_CTRL_MU_INFO, 338 251 }; 339 252 340 253 static inline struct mt7915_phy * ··· 367 294 extern const struct mt76_testmode_ops mt7915_testmode_ops; 368 295 369 296 u32 mt7915_reg_map(struct mt7915_dev *dev, u32 addr); 370 - 297 + u64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif); 371 298 int mt7915_register_device(struct mt7915_dev *dev); 372 299 void mt7915_unregister_device(struct mt7915_dev *dev); 373 300 int mt7915_eeprom_init(struct mt7915_dev *dev); ··· 380 307 void mt7915_dma_prefetch(struct mt7915_dev *dev); 381 308 void mt7915_dma_cleanup(struct mt7915_dev *dev); 382 309 int mt7915_mcu_init(struct mt7915_dev *dev); 310 + int mt7915_mcu_twt_agrt_update(struct mt7915_dev *dev, 311 + struct mt7915_vif *mvif, 312 + struct mt7915_twt_flow *flow, 313 + int cmd); 383 314 int mt7915_mcu_add_dev_info(struct mt7915_phy *phy, 384 315 struct ieee80211_vif *vif, bool enable); 385 316 int mt7915_mcu_add_bss_info(struct mt7915_phy *phy, 386 317 struct ieee80211_vif *vif, int enable); 387 318 int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif, 388 319 struct ieee80211_sta *sta, bool enable); 389 - int mt7915_mcu_add_sta_adv(struct mt7915_dev *dev, struct ieee80211_vif *vif, 390 - struct ieee80211_sta *sta, bool enable); 391 320 int mt7915_mcu_sta_update_hdr_trans(struct mt7915_dev *dev, 392 321 struct ieee80211_vif *vif, 393 322 struct ieee80211_sta *sta); ··· 402 327 int mt7915_mcu_add_key(struct mt7915_dev *dev, struct ieee80211_vif *vif, 403 328 struct mt7915_sta *msta, struct ieee80211_key_conf *key, 404 329 enum set_key_cmd cmd); 330 + int mt7915_mcu_update_bss_color(struct mt7915_dev *dev, struct ieee80211_vif *vif, 331 + struct cfg80211_he_bss_color *he_bss_color); 405 332 int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 406 333 int enable); 407 334 int mt7915_mcu_add_obss_spr(struct mt7915_dev *dev, struct ieee80211_vif *vif, ··· 439 362 const struct mt7915_dfs_pulse *pulse); 440 363 int mt7915_mcu_set_radar_th(struct mt7915_dev *dev, int index, 441 364 const struct mt7915_dfs_pattern *pattern); 365 + int mt7915_mcu_set_muru_ctrl(struct mt7915_dev *dev, u32 cmd, u32 val); 442 366 int mt7915_mcu_apply_group_cal(struct mt7915_dev *dev); 443 367 int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy); 444 368 int mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch); 445 369 int mt7915_mcu_get_temperature(struct mt7915_phy *phy); 446 370 int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state); 447 - int mt7915_mcu_get_tx_rate(struct mt7915_dev *dev, u32 cmd, u16 wlan_idx); 448 371 int mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif, 449 372 struct ieee80211_sta *sta, struct rate_info *rate); 450 373 int mt7915_mcu_rdd_cmd(struct mt7915_dev *dev, enum mt7915_rdd_cmd cmd, ··· 495 418 void mt7915_mac_work(struct work_struct *work); 496 419 void mt7915_mac_reset_work(struct work_struct *work); 497 420 void mt7915_mac_sta_rc_work(struct work_struct *work); 421 + void mt7915_mac_update_stats(struct mt7915_phy *phy); 498 422 int mt7915_mmio_init(struct mt76_dev *mdev, void __iomem *mem_base, int irq); 423 + void mt7915_mac_twt_teardown_flow(struct mt7915_dev *dev, 424 + struct mt7915_sta *msta, 425 + u8 flowid); 426 + void mt7915_mac_add_twt_setup(struct ieee80211_hw *hw, 427 + struct ieee80211_sta *sta, 428 + struct ieee80211_twt_setup *twt); 499 429 int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 500 430 enum mt76_txq_id qid, struct mt76_wcid *wcid, 501 431 struct ieee80211_sta *sta, ··· 519 435 void mt7915_set_stream_he_caps(struct mt7915_phy *phy); 520 436 void mt7915_set_stream_vht_txbf_caps(struct mt7915_phy *phy); 521 437 void mt7915_update_channel(struct mt76_phy *mphy); 522 - int mt7915_init_debugfs(struct mt7915_dev *dev); 438 + int mt7915_init_debugfs(struct mt7915_phy *phy); 523 439 #ifdef CONFIG_MAC80211_DEBUGFS 524 440 void mt7915_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 525 441 struct ieee80211_sta *sta, struct dentry *dir);
+2 -3
drivers/net/wireless/mediatek/mt76/mt7915/pci.c
··· 222 222 static const struct mt76_driver_ops drv_ops = { 223 223 /* txwi_size = txd size + txp size */ 224 224 .txwi_size = MT_TXD_SIZE + sizeof(struct mt7915_txp), 225 - .drv_flags = MT_DRV_TXWI_NO_FREE | MT_DRV_HW_MGMT_TXQ | 226 - MT_DRV_AMSDU_OFFLOAD, 225 + .drv_flags = MT_DRV_TXWI_NO_FREE | MT_DRV_HW_MGMT_TXQ, 227 226 .survey_flags = SURVEY_INFO_TIME_TX | 228 227 SURVEY_INFO_TIME_RX | 229 228 SURVEY_INFO_TIME_BSS_RX, ··· 250 251 251 252 pci_set_master(pdev); 252 253 253 - ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 254 + ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); 254 255 if (ret) 255 256 return ret; 256 257
+140 -7
drivers/net/wireless/mediatek/mt76/mt7915/regs.h
··· 22 22 #define MT_PLE_BASE 0x8000 23 23 #define MT_PLE(ofs) (MT_PLE_BASE + (ofs)) 24 24 25 - #define MT_PLE_FL_Q0_CTRL MT_PLE(0x1b0) 26 - #define MT_PLE_FL_Q1_CTRL MT_PLE(0x1b4) 27 - #define MT_PLE_FL_Q2_CTRL MT_PLE(0x1b8) 28 - #define MT_PLE_FL_Q3_CTRL MT_PLE(0x1bc) 25 + #define MT_FL_Q_EMPTY 0x0b0 26 + #define MT_FL_Q0_CTRL 0x1b0 27 + #define MT_FL_Q2_CTRL 0x1b8 28 + #define MT_FL_Q3_CTRL 0x1bc 29 29 30 - #define MT_PLE_AC_QEMPTY(ac, n) MT_PLE(0x300 + 0x10 * (ac) + \ 30 + #define MT_PLE_FREEPG_CNT MT_PLE(0x100) 31 + #define MT_PLE_FREEPG_HEAD_TAIL MT_PLE(0x104) 32 + #define MT_PLE_PG_HIF_GROUP MT_PLE(0x110) 33 + #define MT_PLE_HIF_PG_INFO MT_PLE(0x114) 34 + #define MT_PLE_AC_QEMPTY(ac, n) MT_PLE(0x500 + 0x40 * (ac) + \ 31 35 ((n) << 2)) 32 36 #define MT_PLE_AMSDU_PACK_MSDU_CNT(n) MT_PLE(0x10e0 + ((n) << 2)) 37 + 38 + #define MT_PSE_BASE 0xc000 39 + #define MT_PSE(ofs) (MT_PSE_BASE + (ofs)) 33 40 34 41 #define MT_MDP_BASE 0xf000 35 42 #define MT_MDP(ofs) (MT_MDP_BASE + (ofs)) ··· 64 57 #define MT_WF_TMAC(_band, ofs) (MT_WF_TMAC_BASE(_band) + (ofs)) 65 58 66 59 #define MT_TMAC_TCR0(_band) MT_WF_TMAC(_band, 0) 60 + #define MT_TMAC_TCR0_TX_BLINK GENMASK(7, 6) 67 61 #define MT_TMAC_TCR0_TBTT_STOP_CTRL BIT(25) 68 62 69 63 #define MT_TMAC_CDTR(_band) MT_WF_TMAC(_band, 0x090) ··· 80 72 #define MT_TMAC_TRCR0_I2T_CHK GENMASK(24, 16) 81 73 82 74 #define MT_TMAC_ICR0(_band) MT_WF_TMAC(_band, 0x0a4) 83 - #define MT_IFS_EIFS GENMASK(8, 0) 75 + #define MT_IFS_EIFS_OFDM GENMASK(8, 0) 84 76 #define MT_IFS_RIFS GENMASK(14, 10) 85 77 #define MT_IFS_SIFS GENMASK(22, 16) 86 78 #define MT_IFS_SLOT GENMASK(30, 24) 79 + 80 + #define MT_TMAC_ICR1(_band) MT_WF_TMAC(_band, 0x0b4) 81 + #define MT_IFS_EIFS_CCK GENMASK(8, 0) 87 82 88 83 #define MT_TMAC_CTCR0(_band) MT_WF_TMAC(_band, 0x0f4) 89 84 #define MT_TMAC_CTCR0_INS_DDLMT_REFTIME GENMASK(5, 0) ··· 139 128 #define MT_LPON_TCR_SW_READ GENMASK(1, 0) 140 129 141 130 /* MIB: band 0(0x24800), band 1(0xa4800) */ 131 + /* These counters are (mostly?) clear-on-read. So, some should not 132 + * be read at all in case firmware is already reading them. These 133 + * are commented with 'DNR' below. The DNR stats will be read by querying 134 + * the firmware API for the appropriate message. For counters the driver 135 + * does read, the driver should accumulate the counters. 136 + */ 142 137 #define MT_WF_MIB_BASE(_band) ((_band) ? 0xa4800 : 0x24800) 143 138 #define MT_WF_MIB(_band, ofs) (MT_WF_MIB_BASE(_band) + (ofs)) 139 + 140 + #define MT_MIB_SDR0(_band) MT_WF_MIB(_band, 0x010) 141 + #define MT_MIB_SDR0_BERACON_TX_CNT_MASK GENMASK(15, 0) 144 142 145 143 #define MT_MIB_SDR3(_band) MT_WF_MIB(_band, 0x014) 146 144 #define MT_MIB_SDR3_FCS_ERR_MASK GENMASK(15, 0) 147 145 146 + #define MT_MIB_SDR4(_band) MT_WF_MIB(_band, 0x018) 147 + #define MT_MIB_SDR4_RX_FIFO_FULL_MASK GENMASK(15, 0) 148 + 149 + /* rx mpdu counter, full 32 bits */ 150 + #define MT_MIB_SDR5(_band) MT_WF_MIB(_band, 0x01c) 151 + 152 + #define MT_MIB_SDR6(_band) MT_WF_MIB(_band, 0x020) 153 + #define MT_MIB_SDR6_CHANNEL_IDL_CNT_MASK GENMASK(15, 0) 154 + 155 + #define MT_MIB_SDR7(_band) MT_WF_MIB(_band, 0x024) 156 + #define MT_MIB_SDR7_RX_VECTOR_MISMATCH_CNT_MASK GENMASK(15, 0) 157 + 158 + #define MT_MIB_SDR8(_band) MT_WF_MIB(_band, 0x028) 159 + #define MT_MIB_SDR8_RX_DELIMITER_FAIL_CNT_MASK GENMASK(15, 0) 160 + 161 + /* aka CCA_NAV_TX_TIME */ 162 + #define MT_MIB_SDR9_DNR(_band) MT_WF_MIB(_band, 0x02c) 163 + #define MT_MIB_SDR9_CCA_BUSY_TIME_MASK GENMASK(23, 0) 164 + 165 + #define MT_MIB_SDR10_DNR(_band) MT_WF_MIB(_band, 0x030) 166 + #define MT_MIB_SDR10_MRDY_COUNT_MASK GENMASK(25, 0) 167 + 168 + #define MT_MIB_SDR11(_band) MT_WF_MIB(_band, 0x034) 169 + #define MT_MIB_SDR11_RX_LEN_MISMATCH_CNT_MASK GENMASK(15, 0) 170 + 171 + /* tx ampdu cnt, full 32 bits */ 172 + #define MT_MIB_SDR12(_band) MT_WF_MIB(_band, 0x038) 173 + 174 + #define MT_MIB_SDR13(_band) MT_WF_MIB(_band, 0x03c) 175 + #define MT_MIB_SDR13_TX_STOP_Q_EMPTY_CNT_MASK GENMASK(15, 0) 176 + 177 + /* counts all mpdus in ampdu, regardless of success */ 178 + #define MT_MIB_SDR14(_band) MT_WF_MIB(_band, 0x040) 179 + #define MT_MIB_SDR14_TX_MPDU_ATTEMPTS_CNT_MASK GENMASK(23, 0) 180 + 181 + /* counts all successfully tx'd mpdus in ampdu */ 182 + #define MT_MIB_SDR15(_band) MT_WF_MIB(_band, 0x044) 183 + #define MT_MIB_SDR15_TX_MPDU_SUCCESS_CNT_MASK GENMASK(23, 0) 184 + 185 + /* in units of 'us' */ 186 + #define MT_MIB_SDR16_DNR(_band) MT_WF_MIB(_band, 0x048) 187 + #define MT_MIB_SDR16_PRIMARY_CCA_BUSY_TIME_MASK GENMASK(23, 0) 188 + 189 + #define MT_MIB_SDR17_DNR(_band) MT_WF_MIB(_band, 0x04c) 190 + #define MT_MIB_SDR17_SECONDARY_CCA_BUSY_TIME_MASK GENMASK(23, 0) 191 + 192 + #define MT_MIB_SDR18(_band) MT_WF_MIB(_band, 0x050) 193 + #define MT_MIB_SDR18_PRIMARY_ENERGY_DETECT_TIME_MASK GENMASK(23, 0) 194 + 195 + /* units are us */ 196 + #define MT_MIB_SDR19_DNR(_band) MT_WF_MIB(_band, 0x054) 197 + #define MT_MIB_SDR19_CCK_MDRDY_TIME_MASK GENMASK(23, 0) 198 + 199 + #define MT_MIB_SDR20_DNR(_band) MT_WF_MIB(_band, 0x058) 200 + #define MT_MIB_SDR20_OFDM_VHT_MDRDY_TIME_MASK GENMASK(23, 0) 201 + 202 + #define MT_MIB_SDR21_DNR(_band) MT_WF_MIB(_band, 0x05c) 203 + #define MT_MIB_SDR20_GREEN_MDRDY_TIME_MASK GENMASK(23, 0) 204 + 205 + /* rx ampdu count, 32-bit */ 206 + #define MT_MIB_SDR22(_band) MT_WF_MIB(_band, 0x060) 207 + 208 + /* rx ampdu bytes count, 32-bit */ 209 + #define MT_MIB_SDR23(_band) MT_WF_MIB(_band, 0x064) 210 + 211 + /* rx ampdu valid subframe count */ 212 + #define MT_MIB_SDR24(_band) MT_WF_MIB(_band, 0x068) 213 + #define MT_MIB_SDR24_RX_AMPDU_SF_CNT_MASK GENMASK(23, 0) 214 + 215 + /* rx ampdu valid subframe bytes count, 32bits */ 216 + #define MT_MIB_SDR25(_band) MT_WF_MIB(_band, 0x06c) 217 + 218 + /* remaining windows protected stats */ 219 + #define MT_MIB_SDR27(_band) MT_WF_MIB(_band, 0x074) 220 + #define MT_MIB_SDR27_TX_RWP_FAIL_CNT_MASK GENMASK(15, 0) 221 + 222 + #define MT_MIB_SDR28(_band) MT_WF_MIB(_band, 0x078) 223 + #define MT_MIB_SDR28_TX_RWP_NEED_CNT_MASK GENMASK(15, 0) 224 + 225 + #define MT_MIB_SDR29(_band) MT_WF_MIB(_band, 0x07c) 226 + #define MT_MIB_SDR29_RX_PFDROP_CNT_MASK GENMASK(7, 0) 227 + 228 + #define MT_MIB_SDR30(_band) MT_WF_MIB(_band, 0x080) 229 + #define MT_MIB_SDR30_RX_VEC_QUEUE_OVERFLOW_DROP_CNT_MASK GENMASK(15, 0) 230 + 231 + /* rx blockack count, 32 bits */ 232 + #define MT_MIB_SDR31(_band) MT_WF_MIB(_band, 0x084) 233 + 234 + #define MT_MIB_SDR32(_band) MT_WF_MIB(_band, 0x088) 235 + #define MT_MIB_SDR32_TX_PKT_EBF_CNT_MASK GENMASK(15, 0) 236 + 237 + #define MT_MIB_SDR33(_band) MT_WF_MIB(_band, 0x08c) 238 + #define MT_MIB_SDR33_TX_PKT_IBF_CNT_MASK GENMASK(15, 0) 239 + 148 240 #define MT_MIB_SDR34(_band) MT_WF_MIB(_band, 0x090) 149 241 #define MT_MIB_MU_BF_TX_CNT GENMASK(15, 0) 242 + 243 + /* 36, 37 both DNR */ 150 244 151 245 #define MT_MIB_DR8(_band) MT_WF_MIB(_band, 0x0c0) 152 246 #define MT_MIB_DR9(_band) MT_WF_MIB(_band, 0x0c4) ··· 364 248 365 249 #define MT_WF_RMAC_MIB_AIRTIME0(_band) MT_WF_RMAC(_band, 0x0380) 366 250 #define MT_WF_RMAC_MIB_RXTIME_CLR BIT(31) 367 - #define MT_WF_RMAC_MIB_RXTIME_EN BIT(30) 368 251 369 252 /* WFDMA0 */ 370 253 #define MT_WFDMA0_BASE 0xd4000 ··· 535 420 #define MT_SWDEF_ICAP_MODE 1 536 421 #define MT_SWDEF_SPECTRUM_MODE 2 537 422 423 + #define MT_LED_TOP_BASE 0x18013000 424 + #define MT_LED_PHYS(_n) (MT_LED_TOP_BASE + (_n)) 425 + 426 + #define MT_LED_CTRL(_n) MT_LED_PHYS(0x00 + ((_n) * 4)) 427 + #define MT_LED_CTRL_KICK BIT(7) 428 + #define MT_LED_CTRL_BLINK_MODE BIT(2) 429 + #define MT_LED_CTRL_POLARITY BIT(1) 430 + 431 + #define MT_LED_TX_BLINK(_n) MT_LED_PHYS(0x10 + ((_n) * 4)) 432 + #define MT_LED_TX_BLINK_ON_MASK GENMASK(7, 0) 433 + #define MT_LED_TX_BLINK_OFF_MASK GENMASK(15, 8) 434 + 435 + #define MT_LED_EN(_n) MT_LED_PHYS(0x40 + ((_n) * 4)) 436 + 538 437 #define MT_TOP_BASE 0x18060000 539 438 #define MT_TOP(ofs) (MT_TOP_BASE + (ofs)) 540 439 ··· 558 429 559 430 #define MT_TOP_MISC MT_TOP(0xf0) 560 431 #define MT_TOP_MISC_FW_STATE GENMASK(2, 0) 432 + 433 + #define MT_LED_GPIO_MUX2 0x70005058 /* GPIO 18 */ 434 + #define MT_LED_GPIO_MUX3 0x7000505C /* GPIO 26 */ 435 + #define MT_LED_GPIO_SEL_MASK GENMASK(11, 8) 561 436 562 437 #define MT_HW_BOUND 0x70010020 563 438 #define MT_HW_CHIPID 0x70010200
+23
drivers/net/wireless/mediatek/mt76/mt7915/testmode.c
··· 166 166 } 167 167 168 168 static int 169 + mt7915_tm_set_tam_arb(struct mt7915_phy *phy, bool enable, bool mu) 170 + { 171 + struct mt7915_dev *dev = phy->dev; 172 + u32 op_mode; 173 + 174 + if (!enable) 175 + op_mode = TAM_ARB_OP_MODE_NORMAL; 176 + else if (mu) 177 + op_mode = TAM_ARB_OP_MODE_TEST; 178 + else 179 + op_mode = TAM_ARB_OP_MODE_FORCE_SU; 180 + 181 + return mt7915_mcu_set_muru_ctrl(dev, MURU_SET_ARB_OP_MODE, op_mode); 182 + } 183 + 184 + static int 169 185 mt7915_tm_set_wmm_qid(struct mt7915_dev *dev, u8 qid, u8 aifs, u8 cw_min, 170 186 u16 cw_max, u16 txop) 171 187 { ··· 413 397 mt7915_tm_set_trx(phy, TM_MAC_TXRX, !en); 414 398 415 399 mt7915_mcu_add_bss_info(phy, phy->monitor_vif, en); 400 + mt7915_mcu_add_sta(dev, phy->monitor_vif, NULL, en); 401 + 402 + if (!en) 403 + mt7915_tm_set_tam_arb(phy, en, 0); 416 404 } 417 405 418 406 static void ··· 457 437 phy->test.spe_idx = spe_idx_map[tx_ant]; 458 438 } 459 439 } 440 + 441 + mt7915_tm_set_tam_arb(phy, en, 442 + td->tx_rate_mode == MT76_TM_TX_MODE_HE_MU); 460 443 461 444 /* if all three params are set, duty_cycle will be ignored */ 462 445 if (duty_cycle && tx_time && !ipg) {
+6
drivers/net/wireless/mediatek/mt76/mt7915/testmode.h
··· 96 96 RF_OPER_WIFI_SPECTRUM, 97 97 }; 98 98 99 + enum { 100 + TAM_ARB_OP_MODE_NORMAL = 1, 101 + TAM_ARB_OP_MODE_TEST, 102 + TAM_ARB_OP_MODE_FORCE_SU = 5, 103 + }; 104 + 99 105 #endif
+16 -2
drivers/net/wireless/mediatek/mt76/mt7921/Kconfig
··· 1 1 # SPDX-License-Identifier: ISC 2 - config MT7921E 3 - tristate "MediaTek MT7921E (PCIe) support" 2 + config MT7921_COMMON 3 + tristate 4 4 select MT76_CONNAC_LIB 5 5 select WANT_DEV_COREDUMP 6 + 7 + config MT7921E 8 + tristate "MediaTek MT7921E (PCIe) support" 9 + select MT7921_COMMON 6 10 depends on MAC80211 7 11 depends on PCI 8 12 help 9 13 This adds support for MT7921E 802.11ax 2x2:2SS wireless devices. 14 + 15 + To compile this driver as a module, choose M here. 16 + 17 + config MT7921S 18 + tristate "MediaTek MT7921S (SDIO) support" 19 + select MT76_SDIO 20 + select MT7921_COMMON 21 + depends on MAC80211 22 + help 23 + This adds support for MT7921S 802.11ax 2x2:2SS wireless devices. 10 24 11 25 To compile this driver as a module, choose M here.
+6 -1
drivers/net/wireless/mediatek/mt76/mt7921/Makefile
··· 1 1 # SPDX-License-Identifier: ISC 2 2 3 + obj-$(CONFIG_MT7921_COMMON) += mt7921-common.o 3 4 obj-$(CONFIG_MT7921E) += mt7921e.o 5 + obj-$(CONFIG_MT7921S) += mt7921s.o 4 6 5 7 CFLAGS_trace.o := -I$(src) 6 8 7 - mt7921e-y := pci.o mac.o mcu.o dma.o eeprom.o main.o init.o debugfs.o trace.o 9 + mt7921-common-y := mac.o mcu.o main.o init.o debugfs.o trace.o 10 + mt7921-common-$(CONFIG_NL80211_TESTMODE) += testmode.o 11 + mt7921e-y := pci.o pci_mac.o pci_mcu.o dma.o 12 + mt7921s-y := sdio.o sdio_mac.o sdio_mcu.o
+78 -21
drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c
··· 5 5 #include "eeprom.h" 6 6 7 7 static int 8 + mt7921_reg_set(void *data, u64 val) 9 + { 10 + struct mt7921_dev *dev = data; 11 + 12 + mt7921_mutex_acquire(dev); 13 + mt76_wr(dev, dev->mt76.debugfs_reg, val); 14 + mt7921_mutex_release(dev); 15 + 16 + return 0; 17 + } 18 + 19 + static int 20 + mt7921_reg_get(void *data, u64 *val) 21 + { 22 + struct mt7921_dev *dev = data; 23 + 24 + mt7921_mutex_acquire(dev); 25 + *val = mt76_rr(dev, dev->mt76.debugfs_reg); 26 + mt7921_mutex_release(dev); 27 + 28 + return 0; 29 + } 30 + 31 + DEFINE_DEBUGFS_ATTRIBUTE(fops_regval, mt7921_reg_get, mt7921_reg_set, 32 + "0x%08llx\n"); 33 + static int 8 34 mt7921_fw_debug_set(void *data, u64 val) 9 35 { 10 36 struct mt7921_dev *dev = data; ··· 68 42 if (!phy) 69 43 return; 70 44 45 + mt7921_mac_update_mib_stats(phy); 46 + 71 47 /* Tx ampdu stat */ 72 48 for (i = 0; i < ARRAY_SIZE(range); i++) 73 49 range[i] = mt76_rr(dev, MT_MIB_ARNG(0, i)); ··· 95 67 mt7921_tx_stats_show(struct seq_file *file, void *data) 96 68 { 97 69 struct mt7921_dev *dev = file->private; 98 - int stat[8], i, n; 70 + struct mt7921_phy *phy = &dev->phy; 71 + struct mib_stats *mib = &phy->mib; 72 + int i; 99 73 100 - mt7921_ampdu_stat_read_phy(&dev->phy, file); 74 + mt7921_mutex_acquire(dev); 101 75 102 - /* Tx amsdu info */ 76 + mt7921_ampdu_stat_read_phy(phy, file); 77 + 103 78 seq_puts(file, "Tx MSDU stat:\n"); 104 - for (i = 0, n = 0; i < ARRAY_SIZE(stat); i++) { 105 - stat[i] = mt76_rr(dev, MT_PLE_AMSDU_PACK_MSDU_CNT(i)); 106 - n += stat[i]; 107 - } 108 - 109 - for (i = 0; i < ARRAY_SIZE(stat); i++) { 110 - seq_printf(file, "AMSDU pack count of %d MSDU in TXD: 0x%x ", 111 - i + 1, stat[i]); 112 - if (n != 0) 113 - seq_printf(file, "(%d%%)\n", stat[i] * 100 / n); 79 + for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++) { 80 + seq_printf(file, "AMSDU pack count of %d MSDU in TXD: %8d ", 81 + i + 1, mib->tx_amsdu[i]); 82 + if (mib->tx_amsdu_cnt) 83 + seq_printf(file, "(%3d%%)\n", 84 + mib->tx_amsdu[i] * 100 / mib->tx_amsdu_cnt); 114 85 else 115 86 seq_puts(file, "\n"); 116 87 } 88 + 89 + mt7921_mutex_release(dev); 117 90 118 91 return 0; 119 92 } ··· 126 97 { 127 98 struct mt7921_dev *dev = dev_get_drvdata(s->private); 128 99 int i; 100 + 101 + mt7921_mutex_acquire(dev); 129 102 130 103 for (i = 0; i < 16; i++) { 131 104 int j, acs = i / 4, index = i % 4; ··· 147 116 } 148 117 seq_printf(s, "AC%d%d: queued=%d\n", acs, index, qlen); 149 118 } 119 + 120 + mt7921_mutex_release(dev); 150 121 151 122 return 0; 152 123 } ··· 262 229 return 0; 263 230 } 264 231 232 + static void 233 + mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif) 234 + { 235 + struct mt7921_dev *dev = priv; 236 + 237 + mt7921_mcu_set_beacon_filter(dev, vif, dev->pm.enable); 238 + } 239 + 265 240 static int 266 241 mt7921_pm_set(void *data, u64 val) 267 242 { 268 243 struct mt7921_dev *dev = data; 269 244 struct mt76_connac_pm *pm = &dev->pm; 270 - struct mt76_phy *mphy = dev->phy.mt76; 271 - 272 - if (val == pm->enable) 273 - return 0; 274 245 275 246 mt7921_mutex_acquire(dev); 247 + 248 + if (val == pm->enable) 249 + goto out; 276 250 277 251 if (!pm->enable) { 278 252 pm->stats.last_wake_event = jiffies; ··· 287 247 } 288 248 pm->enable = val; 289 249 290 - ieee80211_iterate_active_interfaces(mphy->hw, 250 + ieee80211_iterate_active_interfaces(mt76_hw(dev), 291 251 IEEE80211_IFACE_ITER_RESUME_ALL, 292 - mt7921_pm_interface_iter, mphy->priv); 252 + mt7921_pm_interface_iter, dev); 293 253 294 254 mt76_connac_mcu_set_deep_sleep(&dev->mt76, pm->ds_enable); 295 255 256 + out: 296 257 mt7921_mutex_release(dev); 297 258 298 259 return 0; ··· 410 369 411 370 DEFINE_DEBUGFS_ATTRIBUTE(fops_reset, NULL, mt7921_chip_reset, "%lld\n"); 412 371 372 + static int 373 + mt7921s_sched_quota_read(struct seq_file *s, void *data) 374 + { 375 + struct mt7921_dev *dev = dev_get_drvdata(s->private); 376 + struct mt76_sdio *sdio = &dev->mt76.sdio; 377 + 378 + seq_printf(s, "pse_data_quota\t%d\n", sdio->sched.pse_data_quota); 379 + seq_printf(s, "ple_data_quota\t%d\n", sdio->sched.ple_data_quota); 380 + seq_printf(s, "pse_mcu_quota\t%d\n", sdio->sched.pse_mcu_quota); 381 + seq_printf(s, "sched_deficit\t%d\n", sdio->sched.deficit); 382 + 383 + return 0; 384 + } 385 + 413 386 int mt7921_init_debugfs(struct mt7921_dev *dev) 414 387 { 415 388 struct dentry *dir; 416 389 417 - dir = mt76_register_debugfs(&dev->mt76); 390 + dir = mt76_register_debugfs_fops(&dev->mphy, &fops_regval); 418 391 if (!dir) 419 392 return -ENOMEM; 420 393 ··· 447 392 debugfs_create_devm_seqfile(dev->mt76.dev, "runtime_pm_stats", dir, 448 393 mt7921_pm_stats); 449 394 debugfs_create_file("deep-sleep", 0600, dir, dev, &fops_ds); 450 - 395 + if (mt76_is_sdio(&dev->mt76)) 396 + debugfs_create_devm_seqfile(dev->mt76.dev, "sched-quota", dir, 397 + mt7921s_sched_quota_read); 451 398 return 0; 452 399 }
+19 -55
drivers/net/wireless/mediatek/mt76/mt7921/dma.c
··· 19 19 return 0; 20 20 } 21 21 22 - void mt7921_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, 23 - struct sk_buff *skb) 24 - { 25 - struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 26 - __le32 *rxd = (__le32 *)skb->data; 27 - enum rx_pkt_type type; 28 - u16 flag; 29 - 30 - type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 31 - flag = FIELD_GET(MT_RXD0_PKT_FLAG, le32_to_cpu(rxd[0])); 32 - 33 - if (type == PKT_TYPE_RX_EVENT && flag == 0x1) 34 - type = PKT_TYPE_NORMAL_MCU; 35 - 36 - switch (type) { 37 - case PKT_TYPE_TXRX_NOTIFY: 38 - mt7921_mac_tx_free(dev, skb); 39 - break; 40 - case PKT_TYPE_RX_EVENT: 41 - mt7921_mcu_rx_event(dev, skb); 42 - break; 43 - case PKT_TYPE_NORMAL_MCU: 44 - case PKT_TYPE_NORMAL: 45 - if (!mt7921_mac_fill_rx(dev, skb)) { 46 - mt76_rx(&dev->mt76, q, skb); 47 - return; 48 - } 49 - fallthrough; 50 - default: 51 - dev_kfree_skb(skb); 52 - break; 53 - } 54 - } 55 - 56 - void mt7921_tx_cleanup(struct mt7921_dev *dev) 57 - { 58 - mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false); 59 - mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WA], false); 60 - } 61 - 62 22 static int mt7921_poll_tx(struct napi_struct *napi, int budget) 63 23 { 64 24 struct mt7921_dev *dev; ··· 31 71 return 0; 32 72 } 33 73 34 - mt7921_tx_cleanup(dev); 74 + mt7921_mcu_tx_cleanup(dev); 35 75 if (napi_complete(napi)) 36 76 mt7921_irq_enable(dev, MT_INT_TX_DONE_ALL); 37 77 mt76_connac_pm_unref(&dev->mphy, &dev->pm); ··· 85 125 u32 mapped; 86 126 u32 size; 87 127 } fixed_map[] = { 88 - { 0x00400000, 0x80000, 0x10000}, /* WF_MCU_SYSRAM */ 89 - { 0x00410000, 0x90000, 0x10000}, /* WF_MCU_SYSRAM (configure register) */ 90 - { 0x40000000, 0x70000, 0x10000}, /* WF_UMAC_SYSRAM */ 128 + { 0x820d0000, 0x30000, 0x10000 }, /* WF_LMAC_TOP (WF_WTBLON) */ 129 + { 0x820ed000, 0x24800, 0x0800 }, /* WF_LMAC_TOP BN0 (WF_MIB) */ 130 + { 0x820e4000, 0x21000, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_TMAC) */ 131 + { 0x820e7000, 0x21e00, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_DMA) */ 132 + { 0x820eb000, 0x24200, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_LPON) */ 133 + { 0x820e2000, 0x20800, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_AGG) */ 134 + { 0x820e3000, 0x20c00, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_ARB) */ 135 + { 0x820e5000, 0x21400, 0x0800 }, /* WF_LMAC_TOP BN0 (WF_RMAC) */ 136 + { 0x00400000, 0x80000, 0x10000 }, /* WF_MCU_SYSRAM */ 137 + { 0x00410000, 0x90000, 0x10000 }, /* WF_MCU_SYSRAM (configure register) */ 138 + { 0x40000000, 0x70000, 0x10000 }, /* WF_UMAC_SYSRAM */ 91 139 { 0x54000000, 0x02000, 0x1000 }, /* WFDMA PCIE0 MCU DMA0 */ 92 140 { 0x55000000, 0x03000, 0x1000 }, /* WFDMA PCIE0 MCU DMA1 */ 93 141 { 0x58000000, 0x06000, 0x1000 }, /* WFDMA PCIE1 MCU DMA0 (MEM_DMA) */ 94 142 { 0x59000000, 0x07000, 0x1000 }, /* WFDMA PCIE1 MCU DMA1 */ 95 143 { 0x7c000000, 0xf0000, 0x10000 }, /* CONN_INFRA */ 96 144 { 0x7c020000, 0xd0000, 0x10000 }, /* CONN_INFRA, WFDMA */ 97 - { 0x7c060000, 0xe0000, 0x10000}, /* CONN_INFRA, conn_host_csr_top */ 145 + { 0x7c060000, 0xe0000, 0x10000 }, /* CONN_INFRA, conn_host_csr_top */ 98 146 { 0x80020000, 0xb0000, 0x10000 }, /* WF_TOP_MISC_OFF */ 99 147 { 0x81020000, 0xc0000, 0x10000 }, /* WF_TOP_MISC_ON */ 100 148 { 0x820c0000, 0x08000, 0x4000 }, /* WF_UMAC_TOP (PLE) */ 101 149 { 0x820c8000, 0x0c000, 0x2000 }, /* WF_UMAC_TOP (PSE) */ 102 - { 0x820cc000, 0x0e000, 0x2000 }, /* WF_UMAC_TOP (PP) */ 150 + { 0x820cc000, 0x0e000, 0x1000 }, /* WF_UMAC_TOP (PP) */ 151 + { 0x820cd000, 0x0f000, 0x1000 }, /* WF_MDP_TOP */ 103 152 { 0x820ce000, 0x21c00, 0x0200 }, /* WF_LMAC_TOP (WF_SEC) */ 104 153 { 0x820cf000, 0x22000, 0x1000 }, /* WF_LMAC_TOP (WF_PF) */ 105 - { 0x820d0000, 0x30000, 0x10000 }, /* WF_LMAC_TOP (WF_WTBLON) */ 106 154 { 0x820e0000, 0x20000, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_CFG) */ 107 155 { 0x820e1000, 0x20400, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_TRB) */ 108 - { 0x820e2000, 0x20800, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_AGG) */ 109 - { 0x820e3000, 0x20c00, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_ARB) */ 110 - { 0x820e4000, 0x21000, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_TMAC) */ 111 - { 0x820e5000, 0x21400, 0x0800 }, /* WF_LMAC_TOP BN0 (WF_RMAC) */ 112 - { 0x820e7000, 0x21e00, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_DMA) */ 113 156 { 0x820e9000, 0x23400, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_WTBLOFF) */ 114 157 { 0x820ea000, 0x24000, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_ETBF) */ 115 - { 0x820eb000, 0x24200, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_LPON) */ 116 158 { 0x820ec000, 0x24600, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_INT) */ 117 - { 0x820ed000, 0x24800, 0x0800 }, /* WF_LMAC_TOP BN0 (WF_MIB) */ 118 159 { 0x820f0000, 0xa0000, 0x0400 }, /* WF_LMAC_TOP BN1 (WF_CFG) */ 119 160 { 0x820f1000, 0xa0600, 0x0200 }, /* WF_LMAC_TOP BN1 (WF_TRB) */ 120 161 { 0x820f2000, 0xa0800, 0x0400 }, /* WF_LMAC_TOP BN1 (WF_AGG) */ ··· 267 306 mt76_for_each_q_rx(&dev->mt76, i) 268 307 mt76_queue_reset(dev, &dev->mt76.q_rx[i]); 269 308 270 - mt76_tx_status_check(&dev->mt76, NULL, true); 309 + mt76_tx_status_check(&dev->mt76, true); 271 310 272 311 return mt7921_dma_enable(dev); 273 312 } ··· 344 383 struct mt76_bus_ops *bus_ops; 345 384 int ret; 346 385 386 + dev->phy.dev = dev; 387 + dev->phy.mt76 = &dev->mt76.phy; 388 + dev->mt76.phy.priv = &dev->phy; 347 389 dev->bus_ops = dev->mt76.bus; 348 390 bus_ops = devm_kmemdup(dev->mt76.dev, dev->bus_ops, sizeof(*bus_ops), 349 391 GFP_KERNEL);
-100
drivers/net/wireless/mediatek/mt76/mt7921/eeprom.c
··· 1 - // SPDX-License-Identifier: ISC 2 - /* Copyright (C) 2020 MediaTek Inc. */ 3 - 4 - #include "mt7921.h" 5 - #include "eeprom.h" 6 - 7 - static u32 mt7921_eeprom_read(struct mt7921_dev *dev, u32 offset) 8 - { 9 - u8 *data = dev->mt76.eeprom.data; 10 - 11 - if (data[offset] == 0xff) 12 - mt7921_mcu_get_eeprom(dev, offset); 13 - 14 - return data[offset]; 15 - } 16 - 17 - static int mt7921_eeprom_load(struct mt7921_dev *dev) 18 - { 19 - int ret; 20 - 21 - ret = mt76_eeprom_init(&dev->mt76, MT7921_EEPROM_SIZE); 22 - if (ret < 0) 23 - return ret; 24 - 25 - memset(dev->mt76.eeprom.data, -1, MT7921_EEPROM_SIZE); 26 - 27 - return 0; 28 - } 29 - 30 - static int mt7921_check_eeprom(struct mt7921_dev *dev) 31 - { 32 - u8 *eeprom = dev->mt76.eeprom.data; 33 - u16 val; 34 - 35 - mt7921_eeprom_read(dev, MT_EE_CHIP_ID); 36 - val = get_unaligned_le16(eeprom); 37 - 38 - switch (val) { 39 - case 0x7961: 40 - return 0; 41 - default: 42 - return -EINVAL; 43 - } 44 - } 45 - 46 - void mt7921_eeprom_parse_band_config(struct mt7921_phy *phy) 47 - { 48 - struct mt7921_dev *dev = phy->dev; 49 - u32 val; 50 - 51 - val = mt7921_eeprom_read(dev, MT_EE_WIFI_CONF); 52 - val = FIELD_GET(MT_EE_WIFI_CONF_BAND_SEL, val); 53 - 54 - switch (val) { 55 - case MT_EE_5GHZ: 56 - phy->mt76->cap.has_5ghz = true; 57 - break; 58 - case MT_EE_2GHZ: 59 - phy->mt76->cap.has_2ghz = true; 60 - break; 61 - default: 62 - phy->mt76->cap.has_2ghz = true; 63 - phy->mt76->cap.has_5ghz = true; 64 - break; 65 - } 66 - } 67 - 68 - static void mt7921_eeprom_parse_hw_cap(struct mt7921_dev *dev) 69 - { 70 - u8 tx_mask; 71 - 72 - mt7921_eeprom_parse_band_config(&dev->phy); 73 - 74 - /* TODO: read NSS with MCU_CMD_NIC_CAPV2 */ 75 - tx_mask = 2; 76 - dev->chainmask = BIT(tx_mask) - 1; 77 - dev->mphy.antenna_mask = dev->chainmask; 78 - dev->mphy.chainmask = dev->mphy.antenna_mask; 79 - } 80 - 81 - int mt7921_eeprom_init(struct mt7921_dev *dev) 82 - { 83 - int ret; 84 - 85 - ret = mt7921_eeprom_load(dev); 86 - if (ret < 0) 87 - return ret; 88 - 89 - ret = mt7921_check_eeprom(dev); 90 - if (ret) 91 - return ret; 92 - 93 - mt7921_eeprom_parse_hw_cap(dev); 94 - memcpy(dev->mphy.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR, 95 - ETH_ALEN); 96 - 97 - mt76_eeprom_override(&dev->mphy); 98 - 99 - return 0; 100 - }
+63 -30
drivers/net/wireless/mediatek/mt76/mt7921/init.c
··· 41 41 mt7921_mutex_release(dev); 42 42 } 43 43 44 - static void 44 + static int 45 45 mt7921_init_wiphy(struct ieee80211_hw *hw) 46 46 { 47 47 struct mt7921_phy *phy = mt7921_hw_phy(hw); ··· 75 75 wiphy->max_sched_scan_reqs = 1; 76 76 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; 77 77 wiphy->reg_notifier = mt7921_regd_notifier; 78 + wiphy->sar_capa = &mt76_sar_capa; 79 + 80 + phy->mt76->frp = devm_kcalloc(dev->mt76.dev, 81 + wiphy->sar_capa->num_freq_ranges, 82 + sizeof(struct mt76_freq_range_power), 83 + GFP_KERNEL); 84 + if (!phy->mt76->frp) 85 + return -ENOMEM; 78 86 79 87 wiphy->features |= NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR | 80 88 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR; ··· 100 92 ieee80211_hw_set(hw, CONNECTION_MONITOR); 101 93 102 94 hw->max_tx_fragments = 4; 95 + 96 + return 0; 103 97 } 104 98 105 99 static void ··· 115 105 116 106 mt76_set(dev, MT_WF_RMAC_MIB_TIME0(band), MT_WF_RMAC_MIB_RXTIME_EN); 117 107 mt76_set(dev, MT_WF_RMAC_MIB_AIRTIME0(band), MT_WF_RMAC_MIB_RXTIME_EN); 108 + 109 + /* enable MIB tx-rx time reporting */ 110 + mt76_set(dev, MT_MIB_SCR1(band), MT_MIB_TXDUR_EN); 111 + mt76_set(dev, MT_MIB_SCR1(band), MT_MIB_RXDUR_EN); 118 112 119 113 mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_MAX_RX_LEN, 1536); 120 114 /* disable rx rate report by default due to hw issues */ ··· 141 127 for (i = 0; i < 2; i++) 142 128 mt7921_mac_init_band(dev, i); 143 129 130 + dev->mt76.rxfilter = mt76_rr(dev, MT_WF_RFCR(0)); 131 + 144 132 return mt76_connac_mcu_set_rts_thresh(&dev->mt76, 0x92b, 0); 145 133 } 134 + EXPORT_SYMBOL_GPL(mt7921_mac_init); 146 135 147 - static int mt7921_init_hardware(struct mt7921_dev *dev) 136 + static int __mt7921_init_hardware(struct mt7921_dev *dev) 148 137 { 149 - int ret, idx; 150 - 151 - ret = mt7921_dma_init(dev); 152 - if (ret) 153 - return ret; 154 - 155 - set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state); 138 + int ret; 156 139 157 140 /* force firmware operation mode into normal state, 158 141 * which should be set before firmware download stage. 159 142 */ 160 143 mt76_wr(dev, MT_SWDEF_MODE, MT_SWDEF_NORMAL_MODE); 161 - 162 144 ret = mt7921_mcu_init(dev); 163 145 if (ret) 164 - return ret; 146 + goto out; 165 147 166 - ret = mt7921_eeprom_init(dev); 167 - if (ret < 0) 168 - return ret; 148 + mt76_eeprom_override(&dev->mphy); 169 149 170 150 ret = mt7921_mcu_set_eeprom(dev); 171 151 if (ret) 152 + goto out; 153 + 154 + ret = mt7921_mac_init(dev); 155 + out: 156 + return ret; 157 + } 158 + 159 + static int mt7921_init_hardware(struct mt7921_dev *dev) 160 + { 161 + int ret, idx, i; 162 + 163 + set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state); 164 + 165 + for (i = 0; i < MT7921_MCU_INIT_RETRY_COUNT; i++) { 166 + ret = __mt7921_init_hardware(dev); 167 + if (!ret) 168 + break; 169 + 170 + mt7921_init_reset(dev); 171 + } 172 + 173 + if (i == MT7921_MCU_INIT_RETRY_COUNT) { 174 + dev_err(dev->mt76.dev, "hardware init failed\n"); 172 175 return ret; 176 + } 173 177 174 178 /* Beacon and mgmt frames should occupy wcid 0 */ 175 179 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7921_WTBL_STA - 1); ··· 199 167 dev->mt76.global_wcid.tx_info |= MT_WCID_TX_INFO_SET; 200 168 rcu_assign_pointer(dev->mt76.wcid[idx], &dev->mt76.global_wcid); 201 169 202 - return mt7921_mac_init(dev); 170 + return 0; 203 171 } 204 172 205 173 int mt7921_register_device(struct mt7921_dev *dev) ··· 217 185 spin_lock_init(&dev->pm.wake.lock); 218 186 mutex_init(&dev->pm.mutex); 219 187 init_waitqueue_head(&dev->pm.wait); 188 + if (mt76_is_sdio(&dev->mt76)) 189 + init_waitqueue_head(&dev->mt76.sdio.wait); 220 190 spin_lock_init(&dev->pm.txq_lock); 221 - INIT_LIST_HEAD(&dev->phy.stats_list); 222 191 INIT_DELAYED_WORK(&dev->mphy.mac_work, mt7921_mac_work); 223 192 INIT_DELAYED_WORK(&dev->phy.scan_work, mt7921_scan_work); 224 193 INIT_DELAYED_WORK(&dev->coredump.work, mt7921_coredump_work); ··· 233 200 dev->pm.idle_timeout = MT7921_PM_TIMEOUT; 234 201 dev->pm.stats.last_wake_event = jiffies; 235 202 dev->pm.stats.last_doze_event = jiffies; 236 - dev->pm.enable = true; 237 - dev->pm.ds_enable = true; 203 + 204 + /* TODO: mt7921s run sleep mode on default */ 205 + if (mt76_is_mmio(&dev->mt76)) { 206 + dev->pm.enable = true; 207 + dev->pm.ds_enable = true; 208 + } 209 + 210 + if (mt76_is_sdio(&dev->mt76)) 211 + hw->extra_tx_headroom += MT_SDIO_TXD_SIZE + MT_SDIO_HDR_SIZE; 238 212 239 213 ret = mt7921_init_hardware(dev); 240 214 if (ret) 241 215 return ret; 242 216 243 - mt7921_init_wiphy(hw); 217 + ret = mt7921_init_wiphy(hw); 218 + if (ret) 219 + return ret; 220 + 244 221 dev->mphy.sband_2g.sband.ht_cap.cap |= 245 222 IEEE80211_HT_CAP_LDPC_CODING | 246 223 IEEE80211_HT_CAP_MAX_AMSDU; ··· 287 244 288 245 return 0; 289 246 } 290 - 291 - void mt7921_unregister_device(struct mt7921_dev *dev) 292 - { 293 - mt76_unregister_device(&dev->mt76); 294 - mt7921_tx_token_put(dev); 295 - mt7921_dma_cleanup(dev); 296 - mt7921_mcu_exit(dev); 297 - 298 - tasklet_disable(&dev->irq_tasklet); 299 - mt76_free_device(&dev->mt76); 300 - } 247 + EXPORT_SYMBOL_GPL(mt7921_register_device);
+378 -434
drivers/net/wireless/mediatek/mt76/mt7921/mac.c
··· 39 39 void mt7921_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps) 40 40 { 41 41 } 42 + EXPORT_SYMBOL_GPL(mt7921_sta_ps); 42 43 43 44 bool mt7921_mac_wtbl_update(struct mt7921_dev *dev, int idx, u32 mask) 44 45 { ··· 50 49 0, 5000); 51 50 } 52 51 53 - static void mt7921_mac_sta_poll(struct mt7921_dev *dev) 52 + void mt7921_mac_sta_poll(struct mt7921_dev *dev) 54 53 { 55 54 static const u8 ac_to_tid[] = { 56 55 [IEEE80211_AC_BE] = 0, ··· 62 61 struct mt7921_sta *msta; 63 62 u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS]; 64 63 LIST_HEAD(sta_poll_list); 64 + struct rate_info *rate; 65 65 int i; 66 66 67 67 spin_lock_bh(&dev->sta_poll_lock); 68 68 list_splice_init(&dev->sta_poll_list, &sta_poll_list); 69 69 spin_unlock_bh(&dev->sta_poll_lock); 70 70 71 - rcu_read_lock(); 72 - 73 71 while (true) { 74 72 bool clear = false; 75 - u32 addr; 73 + u32 addr, val; 76 74 u16 idx; 75 + u8 bw; 77 76 78 77 spin_lock_bh(&dev->sta_poll_lock); 79 78 if (list_empty(&sta_poll_list)) { ··· 86 85 spin_unlock_bh(&dev->sta_poll_lock); 87 86 88 87 idx = msta->wcid.idx; 89 - addr = MT_WTBL_LMAC_OFFS(idx, 0) + 20 * 4; 88 + addr = mt7921_mac_wtbl_lmac_addr(idx, MT_WTBL_AC0_CTT_OFFSET); 90 89 91 90 for (i = 0; i < IEEE80211_NUM_ACS; i++) { 92 91 u32 tx_last = msta->airtime_ac[i]; ··· 127 126 ieee80211_sta_register_airtime(sta, tid, tx_cur, 128 127 rx_cur); 129 128 } 130 - } 131 129 132 - rcu_read_unlock(); 130 + /* We don't support reading GI info from txs packets. 131 + * For accurate tx status reporting and AQL improvement, 132 + * we need to make sure that flags match so polling GI 133 + * from per-sta counters directly. 134 + */ 135 + rate = &msta->wcid.rate; 136 + addr = mt7921_mac_wtbl_lmac_addr(idx, 137 + MT_WTBL_TXRX_CAP_RATE_OFFSET); 138 + val = mt76_rr(dev, addr); 139 + 140 + switch (rate->bw) { 141 + case RATE_INFO_BW_160: 142 + bw = IEEE80211_STA_RX_BW_160; 143 + break; 144 + case RATE_INFO_BW_80: 145 + bw = IEEE80211_STA_RX_BW_80; 146 + break; 147 + case RATE_INFO_BW_40: 148 + bw = IEEE80211_STA_RX_BW_40; 149 + break; 150 + default: 151 + bw = IEEE80211_STA_RX_BW_20; 152 + break; 153 + } 154 + 155 + if (rate->flags & RATE_INFO_FLAGS_HE_MCS) { 156 + u8 offs = MT_WTBL_TXRX_RATE_G2_HE + 2 * bw; 157 + 158 + rate->he_gi = (val & (0x3 << offs)) >> offs; 159 + } else if (rate->flags & 160 + (RATE_INFO_FLAGS_VHT_MCS | RATE_INFO_FLAGS_MCS)) { 161 + if (val & BIT(MT_WTBL_TXRX_RATE_G2 + bw)) 162 + rate->flags |= RATE_INFO_FLAGS_SHORT_GI; 163 + else 164 + rate->flags &= ~RATE_INFO_FLAGS_SHORT_GI; 165 + } 166 + } 133 167 } 168 + EXPORT_SYMBOL_GPL(mt7921_mac_sta_poll); 134 169 135 170 static void 136 171 mt7921_mac_decode_he_radiotap_ru(struct mt76_rx_status *status, ··· 218 181 } 219 182 220 183 static void 184 + mt7921_mac_decode_he_mu_radiotap(struct sk_buff *skb, 185 + struct mt76_rx_status *status, 186 + __le32 *rxv) 187 + { 188 + static const struct ieee80211_radiotap_he_mu mu_known = { 189 + .flags1 = HE_BITS(MU_FLAGS1_SIG_B_MCS_KNOWN) | 190 + HE_BITS(MU_FLAGS1_SIG_B_DCM_KNOWN) | 191 + HE_BITS(MU_FLAGS1_CH1_RU_KNOWN) | 192 + HE_BITS(MU_FLAGS1_SIG_B_SYMS_USERS_KNOWN) | 193 + HE_BITS(MU_FLAGS1_SIG_B_COMP_KNOWN), 194 + .flags2 = HE_BITS(MU_FLAGS2_BW_FROM_SIG_A_BW_KNOWN) | 195 + HE_BITS(MU_FLAGS2_PUNC_FROM_SIG_A_BW_KNOWN), 196 + }; 197 + struct ieee80211_radiotap_he_mu *he_mu; 198 + 199 + he_mu = skb_push(skb, sizeof(mu_known)); 200 + memcpy(he_mu, &mu_known, sizeof(mu_known)); 201 + 202 + #define MU_PREP(f, v) le16_encode_bits(v, IEEE80211_RADIOTAP_HE_MU_##f) 203 + 204 + he_mu->flags1 |= MU_PREP(FLAGS1_SIG_B_MCS, status->rate_idx); 205 + if (status->he_dcm) 206 + he_mu->flags1 |= MU_PREP(FLAGS1_SIG_B_DCM, status->he_dcm); 207 + 208 + he_mu->flags2 |= MU_PREP(FLAGS2_BW_FROM_SIG_A_BW, status->bw) | 209 + MU_PREP(FLAGS2_SIG_B_SYMS_USERS, 210 + le32_get_bits(rxv[2], MT_CRXV_HE_NUM_USER)); 211 + 212 + he_mu->ru_ch1[0] = FIELD_GET(MT_CRXV_HE_RU0, le32_to_cpu(rxv[3])); 213 + 214 + if (status->bw >= RATE_INFO_BW_40) { 215 + he_mu->flags1 |= HE_BITS(MU_FLAGS1_CH2_RU_KNOWN); 216 + he_mu->ru_ch2[0] = 217 + FIELD_GET(MT_CRXV_HE_RU1, le32_to_cpu(rxv[3])); 218 + } 219 + 220 + if (status->bw >= RATE_INFO_BW_80) { 221 + he_mu->ru_ch1[1] = 222 + FIELD_GET(MT_CRXV_HE_RU2, le32_to_cpu(rxv[3])); 223 + he_mu->ru_ch2[1] = 224 + FIELD_GET(MT_CRXV_HE_RU3, le32_to_cpu(rxv[3])); 225 + } 226 + } 227 + 228 + static void 221 229 mt7921_mac_decode_he_radiotap(struct sk_buff *skb, 222 230 struct mt76_rx_status *status, 223 231 __le32 *rxv, u32 phy) 224 232 { 225 - /* TODO: struct ieee80211_radiotap_he_mu */ 226 233 static const struct ieee80211_radiotap_he known = { 227 234 .data1 = HE_BITS(DATA1_DATA_MCS_KNOWN) | 228 235 HE_BITS(DATA1_DATA_DCM_KNOWN) | ··· 274 193 HE_BITS(DATA1_CODING_KNOWN) | 275 194 HE_BITS(DATA1_LDPC_XSYMSEG_KNOWN) | 276 195 HE_BITS(DATA1_DOPPLER_KNOWN) | 196 + HE_BITS(DATA1_SPTL_REUSE_KNOWN) | 277 197 HE_BITS(DATA1_BSS_COLOR_KNOWN), 278 198 .data2 = HE_BITS(DATA2_GI_KNOWN) | 279 199 HE_BITS(DATA2_TXBF_KNOWN) | ··· 289 207 290 208 he->data3 = HE_PREP(DATA3_BSS_COLOR, BSS_COLOR, rxv[14]) | 291 209 HE_PREP(DATA3_LDPC_XSYMSEG, LDPC_EXT_SYM, rxv[2]); 210 + he->data4 = HE_PREP(DATA4_SU_MU_SPTL_REUSE, SR_MASK, rxv[11]); 292 211 he->data5 = HE_PREP(DATA5_PE_DISAMBIG, PE_DISAMBIG, rxv[2]) | 293 212 le16_encode_bits(ltf_size, 294 213 IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE); 214 + if (le32_to_cpu(rxv[0]) & MT_PRXV_TXBF) 215 + he->data5 |= HE_BITS(DATA5_TXBF); 295 216 he->data6 = HE_PREP(DATA6_TXOP, TXOP_DUR, rxv[14]) | 296 217 HE_PREP(DATA6_DOPPLER, DOPPLER, rxv[14]); 297 218 ··· 302 217 case MT_PHY_TYPE_HE_SU: 303 218 he->data1 |= HE_BITS(DATA1_FORMAT_SU) | 304 219 HE_BITS(DATA1_UL_DL_KNOWN) | 305 - HE_BITS(DATA1_BEAM_CHANGE_KNOWN) | 306 - HE_BITS(DATA1_SPTL_REUSE_KNOWN); 220 + HE_BITS(DATA1_BEAM_CHANGE_KNOWN); 307 221 308 222 he->data3 |= HE_PREP(DATA3_BEAM_CHANGE, BEAM_CHNG, rxv[14]) | 309 223 HE_PREP(DATA3_UL_DL, UPLINK, rxv[2]); ··· 316 232 break; 317 233 case MT_PHY_TYPE_HE_MU: 318 234 he->data1 |= HE_BITS(DATA1_FORMAT_MU) | 319 - HE_BITS(DATA1_UL_DL_KNOWN) | 320 - HE_BITS(DATA1_SPTL_REUSE_KNOWN); 235 + HE_BITS(DATA1_UL_DL_KNOWN); 321 236 322 237 he->data3 |= HE_PREP(DATA3_UL_DL, UPLINK, rxv[2]); 323 - he->data4 |= HE_PREP(DATA4_SU_MU_SPTL_REUSE, SR_MASK, rxv[11]); 238 + he->data4 |= HE_PREP(DATA4_MU_STA_ID, MU_AID, rxv[7]); 324 239 325 240 mt7921_mac_decode_he_radiotap_ru(status, he, rxv); 326 241 break; 327 242 case MT_PHY_TYPE_HE_TB: 328 243 he->data1 |= HE_BITS(DATA1_FORMAT_TRIG) | 329 - HE_BITS(DATA1_SPTL_REUSE_KNOWN) | 330 244 HE_BITS(DATA1_SPTL_REUSE2_KNOWN) | 331 245 HE_BITS(DATA1_SPTL_REUSE3_KNOWN) | 332 246 HE_BITS(DATA1_SPTL_REUSE4_KNOWN); ··· 353 271 return; 354 272 } 355 273 356 - status->band = chfreq <= 14 ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ; 274 + if (chfreq > 180) { 275 + status->band = NL80211_BAND_6GHZ; 276 + chfreq = (chfreq - 181) * 4 + 1; 277 + } else if (chfreq > 14) { 278 + status->band = NL80211_BAND_5GHZ; 279 + } else { 280 + status->band = NL80211_BAND_2GHZ; 281 + } 357 282 status->freq = ieee80211_channel_to_frequency(chfreq, status->band); 358 283 } 359 284 ··· 395 306 mt7921_mac_rssi_iter, skb); 396 307 } 397 308 398 - int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb) 309 + static int 310 + mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb) 399 311 { 400 312 u32 csum_mask = MT_RXD0_NORMAL_IP_SUM | MT_RXD0_NORMAL_UDP_TCP_SUM; 401 313 struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; ··· 446 356 447 357 mt7921_get_status_freq_info(dev, mphy, status, chfreq); 448 358 449 - if (status->band == NL80211_BAND_5GHZ) 359 + switch (status->band) { 360 + case NL80211_BAND_5GHZ: 450 361 sband = &mphy->sband_5g.sband; 451 - else 362 + break; 363 + case NL80211_BAND_6GHZ: 364 + sband = &mphy->sband_6g.sband; 365 + break; 366 + default: 452 367 sband = &mphy->sband_2g.sband; 368 + break; 369 + } 453 370 454 371 if (!sband->channels) 455 372 return -EINVAL; ··· 703 606 704 607 mt7921_mac_assoc_rssi(dev, skb); 705 608 706 - if (rxv && status->flag & RX_FLAG_RADIOTAP_HE) 609 + if (rxv && status->flag & RX_FLAG_RADIOTAP_HE) { 707 610 mt7921_mac_decode_he_radiotap(skb, status, rxv, mode); 611 + 612 + if (status->flag & RX_FLAG_RADIOTAP_HE_MU) 613 + mt7921_mac_decode_he_mu_radiotap(skb, status, rxv); 614 + } 708 615 709 616 if (!status->wcid || !ieee80211_is_data_qos(fc)) 710 617 return 0; ··· 803 702 txwi[3] &= ~cpu_to_le32(MT_TXD3_PROTECT_FRAME); 804 703 } 805 704 806 - if (!ieee80211_is_data(fc) || multicast) 705 + if (!ieee80211_is_data(fc) || multicast || 706 + info->flags & IEEE80211_TX_CTL_USE_MINRATE) 807 707 val |= MT_TXD2_FIX_RATE; 808 708 809 709 txwi[2] |= cpu_to_le32(val); ··· 834 732 txwi[7] |= cpu_to_le32(val); 835 733 } 836 734 837 - static void mt7921_update_txs(struct mt76_wcid *wcid, __le32 *txwi) 838 - { 839 - struct mt7921_sta *msta = container_of(wcid, struct mt7921_sta, wcid); 840 - u32 pid, frame_type = FIELD_GET(MT_TXD2_FRAME_TYPE, txwi[2]); 841 - 842 - if (!(frame_type & (IEEE80211_FTYPE_DATA >> 2))) 843 - return; 844 - 845 - if (time_is_after_eq_jiffies(msta->next_txs_ts)) 846 - return; 847 - 848 - msta->next_txs_ts = jiffies + msecs_to_jiffies(250); 849 - pid = mt76_get_next_pkt_id(wcid); 850 - txwi[5] |= cpu_to_le32(MT_TXD5_TX_STATUS_MCU | 851 - FIELD_PREP(MT_TXD5_PID, pid)); 852 - } 853 - 854 735 void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi, 855 736 struct sk_buff *skb, struct mt76_wcid *wcid, 856 - struct ieee80211_key_conf *key, bool beacon) 737 + struct ieee80211_key_conf *key, int pid, 738 + bool beacon) 857 739 { 858 740 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 859 741 struct ieee80211_vif *vif = info->control.vif; 860 742 struct mt76_phy *mphy = &dev->mphy; 861 743 u8 p_fmt, q_idx, omac_idx = 0, wmm_idx = 0; 744 + bool is_mmio = mt76_is_mmio(&dev->mt76); 745 + u32 sz_txd = is_mmio ? MT_TXD_SIZE : MT_SDIO_TXD_SIZE; 862 746 bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP; 863 747 u16 tx_count = 15; 864 748 u32 val; ··· 860 772 p_fmt = MT_TX_TYPE_FW; 861 773 q_idx = MT_LMAC_BCN0; 862 774 } else if (skb_get_queue_mapping(skb) >= MT_TXQ_PSD) { 863 - p_fmt = MT_TX_TYPE_CT; 775 + p_fmt = is_mmio ? MT_TX_TYPE_CT : MT_TX_TYPE_SF; 864 776 q_idx = MT_LMAC_ALTX0; 865 777 } else { 866 - p_fmt = MT_TX_TYPE_CT; 778 + p_fmt = is_mmio ? MT_TX_TYPE_CT : MT_TX_TYPE_SF; 867 779 q_idx = wmm_idx * MT7921_MAX_WMM_SETS + 868 780 mt7921_lmac_mapping(dev, skb_get_queue_mapping(skb)); 869 781 } 870 782 871 - val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len + MT_TXD_SIZE) | 783 + val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len + sz_txd) | 872 784 FIELD_PREP(MT_TXD0_PKT_FMT, p_fmt) | 873 785 FIELD_PREP(MT_TXD0_Q_IDX, q_idx); 874 786 txwi[0] = cpu_to_le32(val); ··· 888 800 889 801 txwi[3] = cpu_to_le32(val); 890 802 txwi[4] = 0; 891 - txwi[5] = 0; 803 + 804 + val = FIELD_PREP(MT_TXD5_PID, pid); 805 + if (pid >= MT_PACKET_ID_FIRST) 806 + val |= MT_TXD5_TX_STATUS_HOST; 807 + txwi[5] = cpu_to_le32(val); 808 + 892 809 txwi[6] = 0; 893 810 txwi[7] = wcid->amsdu ? cpu_to_le32(MT_TXD7_HW_AMSDU) : 0; 894 811 ··· 903 810 mt7921_mac_write_txwi_80211(dev, txwi, skb, key); 904 811 905 812 if (txwi[2] & cpu_to_le32(MT_TXD2_FIX_RATE)) { 906 - u16 rate; 813 + int rateidx = ffs(vif->bss_conf.basic_rates) - 1; 814 + u16 rate, mode; 907 815 908 816 /* hardware won't add HTC for mgmt/ctrl frame */ 909 817 txwi[2] |= cpu_to_le32(MT_TXD2_HTC_VLD); 910 818 911 - if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) 912 - rate = MT7921_5G_RATE_DEFAULT; 913 - else 914 - rate = MT7921_2G_RATE_DEFAULT; 819 + rate = mt76_calculate_default_rate(mphy, rateidx); 820 + mode = rate >> 8; 821 + rate &= GENMASK(7, 0); 822 + rate |= FIELD_PREP(MT_TX_RATE_MODE, mode); 915 823 916 824 val = MT_TXD6_FIXED_BW | 917 825 FIELD_PREP(MT_TXD6_TX_RATE, rate); 918 826 txwi[6] |= cpu_to_le32(val); 919 827 txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE); 920 828 } 921 - 922 - mt7921_update_txs(wcid, txwi); 923 829 } 830 + EXPORT_SYMBOL_GPL(mt7921_mac_write_txwi); 924 831 925 - static void 926 - mt7921_write_hw_txp(struct mt7921_dev *dev, struct mt76_tx_info *tx_info, 927 - void *txp_ptr, u32 id) 928 - { 929 - struct mt7921_hw_txp *txp = txp_ptr; 930 - struct mt7921_txp_ptr *ptr = &txp->ptr[0]; 931 - int i, nbuf = tx_info->nbuf - 1; 932 - 933 - tx_info->buf[0].len = MT_TXD_SIZE + sizeof(*txp); 934 - tx_info->nbuf = 1; 935 - 936 - txp->msdu_id[0] = cpu_to_le16(id | MT_MSDU_ID_VALID); 937 - 938 - for (i = 0; i < nbuf; i++) { 939 - u16 len = tx_info->buf[i + 1].len & MT_TXD_LEN_MASK; 940 - u32 addr = tx_info->buf[i + 1].addr; 941 - 942 - if (i == nbuf - 1) 943 - len |= MT_TXD_LEN_LAST; 944 - 945 - if (i & 1) { 946 - ptr->buf1 = cpu_to_le32(addr); 947 - ptr->len1 = cpu_to_le16(len); 948 - ptr++; 949 - } else { 950 - ptr->buf0 = cpu_to_le32(addr); 951 - ptr->len0 = cpu_to_le16(len); 952 - } 953 - } 954 - } 955 - 956 - int mt7921_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 957 - enum mt76_txq_id qid, struct mt76_wcid *wcid, 958 - struct ieee80211_sta *sta, 959 - struct mt76_tx_info *tx_info) 960 - { 961 - struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 962 - struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb); 963 - struct ieee80211_key_conf *key = info->control.hw_key; 964 - struct mt76_tx_cb *cb = mt76_tx_skb_cb(tx_info->skb); 965 - struct mt76_txwi_cache *t; 966 - struct mt7921_txp_common *txp; 967 - int id; 968 - u8 *txwi = (u8 *)txwi_ptr; 969 - 970 - if (unlikely(tx_info->skb->len <= ETH_HLEN)) 971 - return -EINVAL; 972 - 973 - if (!wcid) 974 - wcid = &dev->mt76.global_wcid; 975 - 976 - cb->wcid = wcid->idx; 977 - 978 - t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size); 979 - t->skb = tx_info->skb; 980 - 981 - id = mt76_token_consume(mdev, &t); 982 - if (id < 0) 983 - return id; 984 - 985 - mt7921_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key, 986 - false); 987 - 988 - txp = (struct mt7921_txp_common *)(txwi + MT_TXD_SIZE); 989 - memset(txp, 0, sizeof(struct mt7921_txp_common)); 990 - mt7921_write_hw_txp(dev, tx_info, txp, id); 991 - 992 - tx_info->skb = DMA_DUMMY_DATA; 993 - 994 - return 0; 995 - } 996 - 997 - static void 998 - mt7921_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi) 832 + void mt7921_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi) 999 833 { 1000 834 struct mt7921_sta *msta; 1001 835 u16 fc, tid; 1002 836 u32 val; 1003 837 1004 - if (!sta || !sta->ht_cap.ht_supported) 838 + if (!sta || !(sta->ht_cap.ht_supported || sta->he_cap.has_he)) 1005 839 return; 1006 840 1007 841 tid = FIELD_GET(MT_TXD1_TID, le32_to_cpu(txwi[1])); ··· 945 925 if (!test_and_set_bit(tid, &msta->ampdu_state)) 946 926 ieee80211_start_tx_ba_session(sta, tid, 0); 947 927 } 928 + EXPORT_SYMBOL_GPL(mt7921_tx_check_aggr); 948 929 949 - static void 950 - mt7921_tx_complete_status(struct mt76_dev *mdev, struct sk_buff *skb, 951 - struct ieee80211_sta *sta, u8 stat, 952 - struct list_head *free_list) 930 + static bool 931 + mt7921_mac_add_txs_skb(struct mt7921_dev *dev, struct mt76_wcid *wcid, int pid, 932 + __le32 *txs_data) 953 933 { 954 - struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 955 - struct ieee80211_tx_status status = { 956 - .sta = sta, 957 - .info = info, 958 - .skb = skb, 959 - .free_list = free_list, 960 - }; 961 - struct ieee80211_hw *hw; 934 + struct mt7921_sta *msta = container_of(wcid, struct mt7921_sta, wcid); 935 + struct mt76_sta_stats *stats = &msta->stats; 936 + struct ieee80211_supported_band *sband; 937 + struct mt76_dev *mdev = &dev->mt76; 938 + struct ieee80211_tx_info *info; 939 + struct rate_info rate = {}; 940 + struct sk_buff_head list; 941 + u32 txrate, txs, mode; 942 + struct sk_buff *skb; 943 + bool cck = false; 962 944 963 - if (sta) { 964 - struct mt7921_sta *msta; 945 + mt76_tx_status_lock(mdev, &list); 946 + skb = mt76_tx_status_skb_get(mdev, wcid, pid, &list); 947 + if (!skb) 948 + goto out; 965 949 966 - msta = (struct mt7921_sta *)sta->drv_priv; 967 - status.rate = &msta->stats.tx_rate; 968 - } 969 - 970 - hw = mt76_tx_status_get_hw(mdev, skb); 971 - 972 - if (info->flags & IEEE80211_TX_CTL_AMPDU) 973 - info->flags |= IEEE80211_TX_STAT_AMPDU; 974 - 975 - if (stat) 976 - ieee80211_tx_info_clear_status(info); 977 - 978 - if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) 950 + info = IEEE80211_SKB_CB(skb); 951 + txs = le32_to_cpu(txs_data[0]); 952 + if (!(txs & MT_TXS0_ACK_ERROR_MASK)) 979 953 info->flags |= IEEE80211_TX_STAT_ACK; 980 954 981 - info->status.tx_time = 0; 982 - ieee80211_tx_status_ext(hw, &status); 955 + info->status.ampdu_len = 1; 956 + info->status.ampdu_ack_len = !!(info->flags & 957 + IEEE80211_TX_STAT_ACK); 958 + 959 + info->status.rates[0].idx = -1; 960 + 961 + if (!wcid->sta) 962 + goto out; 963 + 964 + txrate = FIELD_GET(MT_TXS0_TX_RATE, txs); 965 + 966 + rate.mcs = FIELD_GET(MT_TX_RATE_IDX, txrate); 967 + rate.nss = FIELD_GET(MT_TX_RATE_NSS, txrate) + 1; 968 + 969 + if (rate.nss - 1 < ARRAY_SIZE(stats->tx_nss)) 970 + stats->tx_nss[rate.nss - 1]++; 971 + if (rate.mcs < ARRAY_SIZE(stats->tx_mcs)) 972 + stats->tx_mcs[rate.mcs]++; 973 + 974 + mode = FIELD_GET(MT_TX_RATE_MODE, txrate); 975 + switch (mode) { 976 + case MT_PHY_TYPE_CCK: 977 + cck = true; 978 + fallthrough; 979 + case MT_PHY_TYPE_OFDM: 980 + if (dev->mphy.chandef.chan->band == NL80211_BAND_5GHZ) 981 + sband = &dev->mphy.sband_5g.sband; 982 + else 983 + sband = &dev->mphy.sband_2g.sband; 984 + 985 + rate.mcs = mt76_get_rate(dev->mphy.dev, sband, rate.mcs, cck); 986 + rate.legacy = sband->bitrates[rate.mcs].bitrate; 987 + break; 988 + case MT_PHY_TYPE_HT: 989 + case MT_PHY_TYPE_HT_GF: 990 + rate.mcs += (rate.nss - 1) * 8; 991 + if (rate.mcs > 31) 992 + goto out; 993 + 994 + rate.flags = RATE_INFO_FLAGS_MCS; 995 + if (wcid->rate.flags & RATE_INFO_FLAGS_SHORT_GI) 996 + rate.flags |= RATE_INFO_FLAGS_SHORT_GI; 997 + break; 998 + case MT_PHY_TYPE_VHT: 999 + if (rate.mcs > 9) 1000 + goto out; 1001 + 1002 + rate.flags = RATE_INFO_FLAGS_VHT_MCS; 1003 + break; 1004 + case MT_PHY_TYPE_HE_SU: 1005 + case MT_PHY_TYPE_HE_EXT_SU: 1006 + case MT_PHY_TYPE_HE_TB: 1007 + case MT_PHY_TYPE_HE_MU: 1008 + if (rate.mcs > 11) 1009 + goto out; 1010 + 1011 + rate.he_gi = wcid->rate.he_gi; 1012 + rate.he_dcm = FIELD_GET(MT_TX_RATE_DCM, txrate); 1013 + rate.flags = RATE_INFO_FLAGS_HE_MCS; 1014 + break; 1015 + default: 1016 + goto out; 1017 + } 1018 + stats->tx_mode[mode]++; 1019 + 1020 + switch (FIELD_GET(MT_TXS0_BW, txs)) { 1021 + case IEEE80211_STA_RX_BW_160: 1022 + rate.bw = RATE_INFO_BW_160; 1023 + stats->tx_bw[3]++; 1024 + break; 1025 + case IEEE80211_STA_RX_BW_80: 1026 + rate.bw = RATE_INFO_BW_80; 1027 + stats->tx_bw[2]++; 1028 + break; 1029 + case IEEE80211_STA_RX_BW_40: 1030 + rate.bw = RATE_INFO_BW_40; 1031 + stats->tx_bw[1]++; 1032 + break; 1033 + default: 1034 + rate.bw = RATE_INFO_BW_20; 1035 + stats->tx_bw[0]++; 1036 + break; 1037 + } 1038 + wcid->rate = rate; 1039 + 1040 + out: 1041 + if (skb) 1042 + mt76_tx_status_skb_done(mdev, skb, &list); 1043 + mt76_tx_status_unlock(mdev, &list); 1044 + 1045 + return !!skb; 983 1046 } 984 1047 985 - void mt7921_txp_skb_unmap(struct mt76_dev *dev, 986 - struct mt76_txwi_cache *t) 1048 + static void mt7921_mac_add_txs(struct mt7921_dev *dev, void *data) 987 1049 { 988 - struct mt7921_txp_common *txp; 989 - int i; 1050 + struct mt7921_sta *msta = NULL; 1051 + struct mt76_wcid *wcid; 1052 + __le32 *txs_data = data; 1053 + u16 wcidx; 1054 + u32 txs; 1055 + u8 pid; 990 1056 991 - txp = mt7921_txwi_to_txp(dev, t); 992 - 993 - for (i = 0; i < ARRAY_SIZE(txp->hw.ptr); i++) { 994 - struct mt7921_txp_ptr *ptr = &txp->hw.ptr[i]; 995 - bool last; 996 - u16 len; 997 - 998 - len = le16_to_cpu(ptr->len0); 999 - last = len & MT_TXD_LEN_LAST; 1000 - len &= MT_TXD_LEN_MASK; 1001 - dma_unmap_single(dev->dev, le32_to_cpu(ptr->buf0), len, 1002 - DMA_TO_DEVICE); 1003 - if (last) 1004 - break; 1005 - 1006 - len = le16_to_cpu(ptr->len1); 1007 - last = len & MT_TXD_LEN_LAST; 1008 - len &= MT_TXD_LEN_MASK; 1009 - dma_unmap_single(dev->dev, le32_to_cpu(ptr->buf1), len, 1010 - DMA_TO_DEVICE); 1011 - if (last) 1012 - break; 1013 - } 1014 - } 1015 - 1016 - void mt7921_mac_tx_free(struct mt7921_dev *dev, struct sk_buff *skb) 1017 - { 1018 - struct mt7921_tx_free *free = (struct mt7921_tx_free *)skb->data; 1019 - struct mt76_dev *mdev = &dev->mt76; 1020 - struct mt76_txwi_cache *txwi; 1021 - struct ieee80211_sta *sta = NULL; 1022 - LIST_HEAD(free_list); 1023 - struct sk_buff *tmp; 1024 - bool wake = false; 1025 - u8 i, count; 1026 - 1027 - /* clean DMA queues and unmap buffers first */ 1028 - mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_PSD], false); 1029 - mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_BE], false); 1030 - 1031 - /* TODO: MT_TX_FREE_LATENCY is msdu time from the TXD is queued into PLE, 1032 - * to the time ack is received or dropped by hw (air + hw queue time). 1033 - * Should avoid accessing WTBL to get Tx airtime, and use it instead. 1034 - */ 1035 - count = FIELD_GET(MT_TX_FREE_MSDU_CNT, le16_to_cpu(free->ctrl)); 1036 - for (i = 0; i < count; i++) { 1037 - u32 msdu, info = le32_to_cpu(free->info[i]); 1038 - u8 stat; 1039 - 1040 - /* 1'b1: new wcid pair. 1041 - * 1'b0: msdu_id with the same 'wcid pair' as above. 1042 - */ 1043 - if (info & MT_TX_FREE_PAIR) { 1044 - struct mt7921_sta *msta; 1045 - struct mt7921_phy *phy; 1046 - struct mt76_wcid *wcid; 1047 - u16 idx; 1048 - 1049 - count++; 1050 - idx = FIELD_GET(MT_TX_FREE_WLAN_ID, info); 1051 - wcid = rcu_dereference(dev->mt76.wcid[idx]); 1052 - sta = wcid_to_sta(wcid); 1053 - if (!sta) 1054 - continue; 1055 - 1056 - msta = container_of(wcid, struct mt7921_sta, wcid); 1057 - phy = msta->vif->phy; 1058 - spin_lock_bh(&dev->sta_poll_lock); 1059 - if (list_empty(&msta->stats_list)) 1060 - list_add_tail(&msta->stats_list, &phy->stats_list); 1061 - if (list_empty(&msta->poll_list)) 1062 - list_add_tail(&msta->poll_list, &dev->sta_poll_list); 1063 - spin_unlock_bh(&dev->sta_poll_lock); 1064 - continue; 1065 - } 1066 - 1067 - msdu = FIELD_GET(MT_TX_FREE_MSDU_ID, info); 1068 - stat = FIELD_GET(MT_TX_FREE_STATUS, info); 1069 - 1070 - txwi = mt76_token_release(mdev, msdu, &wake); 1071 - if (!txwi) 1072 - continue; 1073 - 1074 - mt7921_txp_skb_unmap(mdev, txwi); 1075 - if (txwi->skb) { 1076 - struct ieee80211_tx_info *info = IEEE80211_SKB_CB(txwi->skb); 1077 - void *txwi_ptr = mt76_get_txwi_ptr(mdev, txwi); 1078 - 1079 - if (likely(txwi->skb->protocol != cpu_to_be16(ETH_P_PAE))) 1080 - mt7921_tx_check_aggr(sta, txwi_ptr); 1081 - 1082 - if (sta && !info->tx_time_est) { 1083 - struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv; 1084 - int pending; 1085 - 1086 - pending = atomic_dec_return(&wcid->non_aql_packets); 1087 - if (pending < 0) 1088 - atomic_cmpxchg(&wcid->non_aql_packets, pending, 0); 1089 - } 1090 - 1091 - mt7921_tx_complete_status(mdev, txwi->skb, sta, stat, &free_list); 1092 - txwi->skb = NULL; 1093 - } 1094 - 1095 - mt76_put_txwi(mdev, txwi); 1096 - } 1097 - 1098 - if (wake) 1099 - mt76_set_tx_blocked(&dev->mt76, false); 1100 - 1101 - napi_consume_skb(skb, 1); 1102 - 1103 - list_for_each_entry_safe(skb, tmp, &free_list, list) { 1104 - skb_list_del_init(skb); 1105 - napi_consume_skb(skb, 1); 1106 - } 1107 - 1108 - mt7921_mac_sta_poll(dev); 1109 - mt76_worker_schedule(&dev->mt76.tx_worker); 1110 - } 1111 - 1112 - void mt7921_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e) 1113 - { 1114 - struct mt7921_dev *dev; 1115 - 1116 - if (!e->txwi) { 1117 - dev_kfree_skb_any(e->skb); 1057 + txs = le32_to_cpu(txs_data[0]); 1058 + if (FIELD_GET(MT_TXS0_TXS_FORMAT, txs) > 1) 1118 1059 return; 1119 - } 1120 1060 1121 - dev = container_of(mdev, struct mt7921_dev, mt76); 1061 + txs = le32_to_cpu(txs_data[2]); 1062 + wcidx = FIELD_GET(MT_TXS2_WCID, txs); 1122 1063 1123 - /* error path */ 1124 - if (e->skb == DMA_DUMMY_DATA) { 1125 - struct mt76_txwi_cache *t; 1126 - struct mt7921_txp_common *txp; 1127 - u16 token; 1064 + txs = le32_to_cpu(txs_data[3]); 1065 + pid = FIELD_GET(MT_TXS3_PID, txs); 1128 1066 1129 - txp = mt7921_txwi_to_txp(mdev, e->txwi); 1130 - token = le16_to_cpu(txp->hw.msdu_id[0]) & ~MT_MSDU_ID_VALID; 1131 - t = mt76_token_put(mdev, token); 1132 - e->skb = t ? t->skb : NULL; 1133 - } 1067 + if (pid < MT_PACKET_ID_FIRST) 1068 + return; 1134 1069 1135 - if (e->skb) { 1136 - struct mt76_tx_cb *cb = mt76_tx_skb_cb(e->skb); 1137 - struct mt76_wcid *wcid; 1070 + if (wcidx >= MT7921_WTBL_SIZE) 1071 + return; 1138 1072 1139 - wcid = rcu_dereference(dev->mt76.wcid[cb->wcid]); 1073 + rcu_read_lock(); 1140 1074 1141 - mt7921_tx_complete_status(mdev, e->skb, wcid_to_sta(wcid), 0, 1142 - NULL); 1075 + wcid = rcu_dereference(dev->mt76.wcid[wcidx]); 1076 + if (!wcid) 1077 + goto out; 1078 + 1079 + mt7921_mac_add_txs_skb(dev, wcid, pid, txs_data); 1080 + 1081 + if (!wcid->sta) 1082 + goto out; 1083 + 1084 + msta = container_of(wcid, struct mt7921_sta, wcid); 1085 + spin_lock_bh(&dev->sta_poll_lock); 1086 + if (list_empty(&msta->poll_list)) 1087 + list_add_tail(&msta->poll_list, &dev->sta_poll_list); 1088 + spin_unlock_bh(&dev->sta_poll_lock); 1089 + 1090 + out: 1091 + rcu_read_unlock(); 1092 + } 1093 + 1094 + void mt7921_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, 1095 + struct sk_buff *skb) 1096 + { 1097 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 1098 + __le32 *rxd = (__le32 *)skb->data; 1099 + __le32 *end = (__le32 *)&skb->data[skb->len]; 1100 + enum rx_pkt_type type; 1101 + u16 flag; 1102 + 1103 + type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 1104 + flag = FIELD_GET(MT_RXD0_PKT_FLAG, le32_to_cpu(rxd[0])); 1105 + 1106 + if (type == PKT_TYPE_RX_EVENT && flag == 0x1) 1107 + type = PKT_TYPE_NORMAL_MCU; 1108 + 1109 + switch (type) { 1110 + case PKT_TYPE_RX_EVENT: 1111 + mt7921_mcu_rx_event(dev, skb); 1112 + break; 1113 + case PKT_TYPE_TXS: 1114 + for (rxd += 2; rxd + 8 <= end; rxd += 8) 1115 + mt7921_mac_add_txs(dev, rxd); 1116 + dev_kfree_skb(skb); 1117 + break; 1118 + case PKT_TYPE_NORMAL_MCU: 1119 + case PKT_TYPE_NORMAL: 1120 + if (!mt7921_mac_fill_rx(dev, skb)) { 1121 + mt76_rx(&dev->mt76, q, skb); 1122 + return; 1123 + } 1124 + fallthrough; 1125 + default: 1126 + dev_kfree_skb(skb); 1127 + break; 1143 1128 } 1144 1129 } 1130 + EXPORT_SYMBOL_GPL(mt7921_queue_rx_skb); 1145 1131 1146 1132 void mt7921_mac_reset_counters(struct mt7921_phy *phy) 1147 1133 { ··· 1180 1154 FIELD_PREP(MT_TIMEOUT_VAL_CCA, 48); 1181 1155 u32 ofdm = FIELD_PREP(MT_TIMEOUT_VAL_PLCP, 60) | 1182 1156 FIELD_PREP(MT_TIMEOUT_VAL_CCA, 28); 1183 - int sifs, offset; 1184 - bool is_5ghz = phy->mt76->chandef.chan->band == NL80211_BAND_5GHZ; 1157 + bool is_2ghz = phy->mt76->chandef.chan->band == NL80211_BAND_2GHZ; 1158 + int sifs = is_2ghz ? 10 : 16, offset; 1185 1159 1186 1160 if (!test_bit(MT76_STATE_RUNNING, &phy->mt76->state)) 1187 1161 return; 1188 - 1189 - if (is_5ghz) 1190 - sifs = 16; 1191 - else 1192 - sifs = 10; 1193 1162 1194 1163 mt76_set(dev, MT_ARB_SCR(0), 1195 1164 MT_ARB_SCR_TX_DISABLE | MT_ARB_SCR_RX_DISABLE); ··· 1202 1181 FIELD_PREP(MT_IFS_SIFS, sifs) | 1203 1182 FIELD_PREP(MT_IFS_SLOT, phy->slottime)); 1204 1183 1205 - if (phy->slottime < 20 || is_5ghz) 1184 + if (phy->slottime < 20 || !is_2ghz) 1206 1185 val = MT7921_CFEND_RATE_DEFAULT; 1207 1186 else 1208 1187 val = MT7921_CFEND_RATE_11B; ··· 1263 1242 1264 1243 mt76_connac_power_save_sched(mphy, &dev->pm); 1265 1244 } 1266 - 1267 - void mt7921_tx_token_put(struct mt7921_dev *dev) 1268 - { 1269 - struct mt76_txwi_cache *txwi; 1270 - int id; 1271 - 1272 - spin_lock_bh(&dev->mt76.token_lock); 1273 - idr_for_each_entry(&dev->mt76.token, txwi, id) { 1274 - mt7921_txp_skb_unmap(&dev->mt76, txwi); 1275 - if (txwi->skb) { 1276 - struct ieee80211_hw *hw; 1277 - 1278 - hw = mt76_tx_status_get_hw(&dev->mt76, txwi->skb); 1279 - ieee80211_free_txskb(hw, txwi->skb); 1280 - } 1281 - mt76_put_txwi(&dev->mt76, txwi); 1282 - dev->mt76.token_count--; 1283 - } 1284 - spin_unlock_bh(&dev->mt76.token_lock); 1285 - idr_destroy(&dev->mt76.token); 1286 - } 1245 + EXPORT_SYMBOL_GPL(mt7921_update_channel); 1287 1246 1288 1247 static void 1289 1248 mt7921_vif_connect_iter(void *priv, u8 *mac, ··· 1277 1276 1278 1277 mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.wcid, true); 1279 1278 mt7921_mcu_set_tx(dev, vif); 1280 - } 1281 - 1282 - static int 1283 - mt7921_mac_reset(struct mt7921_dev *dev) 1284 - { 1285 - int i, err; 1286 - 1287 - mt76_connac_free_pending_tx_skbs(&dev->pm, NULL); 1288 - 1289 - mt76_wr(dev, MT_WFDMA0_HOST_INT_ENA, 0); 1290 - mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0); 1291 - 1292 - set_bit(MT76_RESET, &dev->mphy.state); 1293 - set_bit(MT76_MCU_RESET, &dev->mphy.state); 1294 - wake_up(&dev->mt76.mcu.wait); 1295 - skb_queue_purge(&dev->mt76.mcu.res_q); 1296 - 1297 - mt76_txq_schedule_all(&dev->mphy); 1298 - 1299 - mt76_worker_disable(&dev->mt76.tx_worker); 1300 - napi_disable(&dev->mt76.napi[MT_RXQ_MAIN]); 1301 - napi_disable(&dev->mt76.napi[MT_RXQ_MCU]); 1302 - napi_disable(&dev->mt76.napi[MT_RXQ_MCU_WA]); 1303 - napi_disable(&dev->mt76.tx_napi); 1304 - 1305 - mt7921_tx_token_put(dev); 1306 - idr_init(&dev->mt76.token); 1307 - 1308 - mt7921_wpdma_reset(dev, true); 1309 - 1310 - mt76_for_each_q_rx(&dev->mt76, i) { 1311 - napi_enable(&dev->mt76.napi[i]); 1312 - napi_schedule(&dev->mt76.napi[i]); 1313 - } 1314 - 1315 - clear_bit(MT76_MCU_RESET, &dev->mphy.state); 1316 - 1317 - mt76_wr(dev, MT_WFDMA0_HOST_INT_ENA, 1318 - MT_INT_RX_DONE_ALL | MT_INT_TX_DONE_ALL | 1319 - MT_INT_MCU_CMD); 1320 - mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0xff); 1321 - 1322 - err = mt7921_run_firmware(dev); 1323 - if (err) 1324 - goto out; 1325 - 1326 - err = mt7921_mcu_set_eeprom(dev); 1327 - if (err) 1328 - goto out; 1329 - 1330 - err = mt7921_mac_init(dev); 1331 - if (err) 1332 - goto out; 1333 - 1334 - err = __mt7921_start(&dev->phy); 1335 - out: 1336 - clear_bit(MT76_RESET, &dev->mphy.state); 1337 - 1338 - napi_enable(&dev->mt76.tx_napi); 1339 - napi_schedule(&dev->mt76.tx_napi); 1340 - mt76_worker_enable(&dev->mt76.tx_worker); 1341 - 1342 - return err; 1343 1279 } 1344 1280 1345 1281 /* system error recovery */ ··· 1297 1359 cancel_work_sync(&pm->wake_work); 1298 1360 1299 1361 mutex_lock(&dev->mt76.mutex); 1300 - for (i = 0; i < 10; i++) { 1301 - __mt7921_mcu_drv_pmctrl(dev); 1302 - 1303 - if (!mt7921_mac_reset(dev)) 1362 + for (i = 0; i < 10; i++) 1363 + if (!mt7921_dev_reset(dev)) 1304 1364 break; 1305 - } 1306 1365 mutex_unlock(&dev->mt76.mutex); 1307 1366 1308 1367 if (i == 10) ··· 1334 1399 queue_work(dev->mt76.wq, &dev->reset_work); 1335 1400 } 1336 1401 1337 - static void 1338 - mt7921_mac_update_mib_stats(struct mt7921_phy *phy) 1402 + void mt7921_mac_update_mib_stats(struct mt7921_phy *phy) 1339 1403 { 1340 1404 struct mt7921_dev *dev = phy->dev; 1341 1405 struct mib_stats *mib = &phy->mib; 1342 1406 int i, aggr0 = 0, aggr1; 1407 + u32 val; 1343 1408 1344 1409 mib->fcs_err_cnt += mt76_get_field(dev, MT_MIB_SDR3(0), 1345 1410 MT_MIB_SDR3_FCS_ERR_MASK); ··· 1352 1417 mib->rts_retries_cnt += mt76_get_field(dev, MT_MIB_MB_BSDR1(0), 1353 1418 MT_MIB_RTS_FAIL_COUNT_MASK); 1354 1419 1420 + mib->tx_ampdu_cnt += mt76_rr(dev, MT_MIB_SDR12(0)); 1421 + mib->tx_mpdu_attempts_cnt += mt76_rr(dev, MT_MIB_SDR14(0)); 1422 + mib->tx_mpdu_success_cnt += mt76_rr(dev, MT_MIB_SDR15(0)); 1423 + 1424 + val = mt76_rr(dev, MT_MIB_SDR32(0)); 1425 + mib->tx_pkt_ebf_cnt += FIELD_GET(MT_MIB_SDR9_EBF_CNT_MASK, val); 1426 + mib->tx_pkt_ibf_cnt += FIELD_GET(MT_MIB_SDR9_IBF_CNT_MASK, val); 1427 + 1428 + val = mt76_rr(dev, MT_ETBF_TX_APP_CNT(0)); 1429 + mib->tx_bf_ibf_ppdu_cnt += FIELD_GET(MT_ETBF_TX_IBF_CNT, val); 1430 + mib->tx_bf_ebf_ppdu_cnt += FIELD_GET(MT_ETBF_TX_EBF_CNT, val); 1431 + 1432 + val = mt76_rr(dev, MT_ETBF_RX_FB_CNT(0)); 1433 + mib->tx_bf_rx_fb_all_cnt += FIELD_GET(MT_ETBF_RX_FB_ALL, val); 1434 + mib->tx_bf_rx_fb_he_cnt += FIELD_GET(MT_ETBF_RX_FB_HE, val); 1435 + mib->tx_bf_rx_fb_vht_cnt += FIELD_GET(MT_ETBF_RX_FB_VHT, val); 1436 + mib->tx_bf_rx_fb_ht_cnt += FIELD_GET(MT_ETBF_RX_FB_HT, val); 1437 + 1438 + mib->rx_mpdu_cnt += mt76_rr(dev, MT_MIB_SDR5(0)); 1439 + mib->rx_ampdu_cnt += mt76_rr(dev, MT_MIB_SDR22(0)); 1440 + mib->rx_ampdu_bytes_cnt += mt76_rr(dev, MT_MIB_SDR23(0)); 1441 + mib->rx_ba_cnt += mt76_rr(dev, MT_MIB_SDR31(0)); 1442 + 1443 + for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++) { 1444 + val = mt76_rr(dev, MT_PLE_AMSDU_PACK_MSDU_CNT(i)); 1445 + mib->tx_amsdu[i] += val; 1446 + mib->tx_amsdu_cnt += val; 1447 + } 1448 + 1355 1449 for (i = 0, aggr1 = aggr0 + 4; i < 4; i++) { 1356 - u32 val, val2; 1450 + u32 val2; 1357 1451 1358 1452 val = mt76_rr(dev, MT_TX_AGG_CNT(0, i)); 1359 1453 val2 = mt76_rr(dev, MT_TX_AGG_CNT2(0, i)); ··· 1413 1449 } 1414 1450 1415 1451 mt7921_mutex_release(phy->dev); 1452 + 1453 + mt76_tx_status_check(mphy->dev, false); 1416 1454 ieee80211_queue_delayed_work(phy->mt76->hw, &mphy->mac_work, 1417 1455 MT7921_WATCHDOG_TIME); 1418 1456 } ··· 1429 1463 mphy = dev->phy.mt76; 1430 1464 1431 1465 if (!mt7921_mcu_drv_pmctrl(dev)) { 1466 + struct mt76_dev *mdev = &dev->mt76; 1432 1467 int i; 1433 1468 1434 - mt76_for_each_q_rx(&dev->mt76, i) 1435 - napi_schedule(&dev->mt76.napi[i]); 1436 - mt76_connac_pm_dequeue_skbs(mphy, &dev->pm); 1437 - mt7921_tx_cleanup(dev); 1469 + if (mt76_is_sdio(mdev)) { 1470 + mt76_connac_pm_dequeue_skbs(mphy, &dev->pm); 1471 + mt76_worker_schedule(&mdev->sdio.txrx_worker); 1472 + } else { 1473 + mt76_for_each_q_rx(mdev, i) 1474 + napi_schedule(&mdev->napi[i]); 1475 + mt76_connac_pm_dequeue_skbs(mphy, &dev->pm); 1476 + mt7921_mcu_tx_cleanup(dev); 1477 + } 1438 1478 if (test_bit(MT76_STATE_RUNNING, &mphy->state)) 1439 1479 ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work, 1440 1480 MT7921_WATCHDOG_TIME); ··· 1476 1504 } 1477 1505 out: 1478 1506 queue_delayed_work(dev->mt76.wq, &dev->pm.ps_work, delta); 1479 - } 1480 - 1481 - int mt7921_mac_set_beacon_filter(struct mt7921_phy *phy, 1482 - struct ieee80211_vif *vif, 1483 - bool enable) 1484 - { 1485 - struct mt7921_dev *dev = phy->dev; 1486 - bool ext_phy = phy != &dev->phy; 1487 - int err; 1488 - 1489 - if (!dev->pm.enable) 1490 - return -EOPNOTSUPP; 1491 - 1492 - err = mt7921_mcu_set_bss_pm(dev, vif, enable); 1493 - if (err) 1494 - return err; 1495 - 1496 - if (enable) { 1497 - vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER; 1498 - mt76_set(dev, MT_WF_RFCR(ext_phy), 1499 - MT_WF_RFCR_DROP_OTHER_BEACON); 1500 - } else { 1501 - vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER; 1502 - mt76_clear(dev, MT_WF_RFCR(ext_phy), 1503 - MT_WF_RFCR_DROP_OTHER_BEACON); 1504 - } 1505 - 1506 - return 0; 1507 1507 } 1508 1508 1509 1509 void mt7921_coredump_work(struct work_struct *work)
+32
drivers/net/wireless/mediatek/mt76/mt7921/mac.h
··· 116 116 #define MT_PRXV_TX_DCM BIT(4) 117 117 #define MT_PRXV_TX_ER_SU_106T BIT(5) 118 118 #define MT_PRXV_NSTS GENMASK(9, 7) 119 + #define MT_PRXV_TXBF BIT(10) 119 120 #define MT_PRXV_HT_AD_CODE BIT(11) 120 121 #define MT_PRXV_FRAME_MODE GENMASK(14, 12) 121 122 #define MT_PRXV_SGI GENMASK(16, 15) ··· 139 138 #define MT_CRXV_HE_LTF_SIZE GENMASK(18, 17) 140 139 #define MT_CRXV_HE_LDPC_EXT_SYM BIT(20) 141 140 #define MT_CRXV_HE_PE_DISAMBIG BIT(23) 141 + #define MT_CRXV_HE_NUM_USER GENMASK(30, 24) 142 142 #define MT_CRXV_HE_UPLINK BIT(31) 143 + 144 + #define MT_CRXV_HE_RU0 GENMASK(7, 0) 145 + #define MT_CRXV_HE_RU1 GENMASK(15, 8) 146 + #define MT_CRXV_HE_RU2 GENMASK(23, 16) 147 + #define MT_CRXV_HE_RU3 GENMASK(31, 24) 148 + #define MT_CRXV_HE_MU_AID GENMASK(30, 20) 143 149 144 150 #define MT_CRXV_HE_SR_MASK GENMASK(11, 8) 145 151 #define MT_CRXV_HE_SR1_MASK GENMASK(16, 12) ··· 198 190 #define MT_CT_INFO_FROM_HOST BIT(7) 199 191 200 192 #define MT_TXD_SIZE (8 * 4) 193 + 194 + #define MT_SDIO_TXD_SIZE (MT_TXD_SIZE + 8 * 4) 195 + #define MT_SDIO_TAIL_SIZE 8 196 + #define MT_SDIO_HDR_SIZE 4 201 197 202 198 #define MT_TXD0_Q_IDX GENMASK(31, 25) 203 199 #define MT_TXD0_PKT_FMT GENMASK(24, 23) ··· 321 309 /* will support this field in further revision */ 322 310 #define MT_TX_FREE_RATE GENMASK(13, 0) 323 311 312 + #define MT_TXS0_BW GENMASK(30, 29) 313 + #define MT_TXS0_TXS_FORMAT GENMASK(24, 23) 314 + #define MT_TXS0_ACK_ERROR_MASK GENMASK(18, 16) 315 + #define MT_TXS0_TX_RATE GENMASK(13, 0) 316 + 317 + #define MT_TXS2_WCID GENMASK(25, 16) 318 + 319 + #define MT_TXS3_PID GENMASK(31, 24) 320 + 324 321 static inline struct mt7921_txp_common * 325 322 mt7921_txwi_to_txp(struct mt76_dev *dev, struct mt76_txwi_cache *t) 326 323 { ··· 370 349 struct mt7921_hw_txp hw; 371 350 }; 372 351 }; 352 + 353 + #define MT_WTBL_TXRX_CAP_RATE_OFFSET 7 354 + #define MT_WTBL_TXRX_RATE_G2_HE 24 355 + #define MT_WTBL_TXRX_RATE_G2 12 356 + 357 + #define MT_WTBL_AC0_CTT_OFFSET 20 358 + 359 + static inline u32 mt7921_mac_wtbl_lmac_addr(int idx, u8 offset) 360 + { 361 + return MT_WTBL_LMAC_OFFS(idx, 0) + offset * 4; 362 + } 373 363 374 364 #endif
+270 -58
drivers/net/wireless/mediatek/mt76/mt7921/main.c
··· 72 72 if (band == NL80211_BAND_2GHZ) 73 73 he_cap_elem->phy_cap_info[0] = 74 74 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G; 75 - else if (band == NL80211_BAND_5GHZ) 75 + else 76 76 he_cap_elem->phy_cap_info[0] = 77 77 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G; 78 78 ··· 93 93 if (band == NL80211_BAND_2GHZ) 94 94 he_cap_elem->phy_cap_info[0] |= 95 95 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G; 96 - else if (band == NL80211_BAND_5GHZ) 96 + else 97 97 he_cap_elem->phy_cap_info[0] |= 98 98 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G; 99 99 ··· 142 142 he_cap_elem->phy_cap_info[9] |= 143 143 IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_16US; 144 144 } 145 + 146 + if (band == NL80211_BAND_6GHZ) { 147 + struct ieee80211_supported_band *sband = 148 + &phy->mt76->sband_5g.sband; 149 + struct ieee80211_sta_vht_cap *vht_cap = &sband->vht_cap; 150 + struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap; 151 + u32 exp; 152 + u16 cap; 153 + 154 + cap = u16_encode_bits(ht_cap->ampdu_density, 155 + IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START); 156 + exp = u32_get_bits(vht_cap->cap, 157 + IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); 158 + cap |= u16_encode_bits(exp, 159 + IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 160 + exp = u32_get_bits(vht_cap->cap, 161 + IEEE80211_VHT_CAP_MAX_MPDU_MASK); 162 + cap |= u16_encode_bits(exp, 163 + IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN); 164 + if (vht_cap->cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN) 165 + cap |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS; 166 + if (vht_cap->cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN) 167 + cap |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; 168 + 169 + data->he_6ghz_capa.capa = cpu_to_le16(cap); 170 + } 145 171 idx++; 146 172 } 147 173 ··· 196 170 band = &phy->mt76->sband_5g.sband; 197 171 band->iftype_data = data; 198 172 band->n_iftype_data = n; 173 + 174 + if (phy->mt76->cap.has_6ghz) { 175 + data = phy->iftype[NL80211_BAND_6GHZ]; 176 + n = mt7921_init_he_caps(phy, NL80211_BAND_6GHZ, data); 177 + 178 + band = &phy->mt76->sband_6g.sband; 179 + band->iftype_data = data; 180 + band->n_iftype_data = n; 181 + } 199 182 } 200 183 } 201 184 ··· 237 202 238 203 return 0; 239 204 } 205 + EXPORT_SYMBOL_GPL(__mt7921_start); 240 206 241 207 static int mt7921_start(struct ieee80211_hw *hw) 242 208 { ··· 279 243 280 244 mt7921_mutex_acquire(dev); 281 245 282 - if (vif->type == NL80211_IFTYPE_MONITOR && 283 - is_zero_ether_addr(vif->addr)) 284 - phy->monitor_vif = vif; 285 - 286 246 mvif->mt76.idx = ffs(~dev->mt76.vif_mask) - 1; 287 247 if (mvif->mt76.idx >= MT7921_MAX_INTERFACES) { 288 248 ret = -ENOSPC; ··· 300 268 301 269 idx = MT7921_WTBL_RESERVED - mvif->mt76.idx; 302 270 303 - INIT_LIST_HEAD(&mvif->sta.stats_list); 304 271 INIT_LIST_HEAD(&mvif->sta.poll_list); 305 272 mvif->sta.wcid.idx = idx; 306 273 mvif->sta.wcid.ext_phy = mvif->mt76.band_idx; 307 274 mvif->sta.wcid.hw_key_idx = -1; 308 275 mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET; 276 + mt76_packet_id_init(&mvif->sta.wcid); 277 + 309 278 mt7921_mac_wtbl_update(dev, idx, 310 279 MT_WTBL_UPDATE_ADM_COUNT_CLEAR); 311 280 ··· 339 306 struct mt7921_phy *phy = mt7921_hw_phy(hw); 340 307 int idx = msta->wcid.idx; 341 308 342 - if (vif == phy->monitor_vif) 343 - phy->monitor_vif = NULL; 344 - 345 309 mt7921_mutex_acquire(dev); 346 310 mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->wcid); 347 311 mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.wcid, false); ··· 353 323 if (!list_empty(&msta->poll_list)) 354 324 list_del_init(&msta->poll_list); 355 325 spin_unlock_bh(&dev->sta_poll_lock); 326 + 327 + mt76_packet_id_flush(&dev->mt76, &msta->wcid); 356 328 } 357 329 358 330 static int mt7921_set_channel(struct mt7921_phy *phy) ··· 565 533 mt7921_mutex_release(dev); 566 534 } 567 535 568 - static int 569 - mt7921_bss_bcnft_apply(struct mt7921_dev *dev, struct ieee80211_vif *vif, 570 - bool assoc) 571 - { 572 - int ret; 573 - 574 - if (!dev->pm.enable) 575 - return 0; 576 - 577 - if (assoc) { 578 - ret = mt7921_mcu_uni_bss_bcnft(dev, vif, true); 579 - if (ret) 580 - return ret; 581 - 582 - vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER; 583 - mt76_set(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON); 584 - 585 - return 0; 586 - } 587 - 588 - ret = mt7921_mcu_set_bss_pm(dev, vif, false); 589 - if (ret) 590 - return ret; 591 - 592 - vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER; 593 - mt76_clear(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON); 594 - 595 - return 0; 596 - } 597 - 598 536 static void mt7921_bss_info_changed(struct ieee80211_hw *hw, 599 537 struct ieee80211_vif *vif, 600 538 struct ieee80211_bss_conf *info, ··· 594 592 if (changed & BSS_CHANGED_ASSOC) { 595 593 mt7921_mcu_sta_update(dev, NULL, vif, true, 596 594 MT76_STA_INFO_STATE_ASSOC); 597 - mt7921_bss_bcnft_apply(dev, vif, info->assoc); 595 + if (dev->pm.enable) 596 + mt7921_mcu_set_beacon_filter(dev, vif, info->assoc); 598 597 } 599 598 600 599 if (changed & BSS_CHANGED_ARP_FILTER) { ··· 620 617 if (idx < 0) 621 618 return -ENOSPC; 622 619 623 - INIT_LIST_HEAD(&msta->stats_list); 624 620 INIT_LIST_HEAD(&msta->poll_list); 625 621 msta->vif = mvif; 626 622 msta->wcid.sta = 1; 627 623 msta->wcid.idx = idx; 628 624 msta->wcid.ext_phy = mvif->mt76.band_idx; 629 625 msta->wcid.tx_info |= MT_WCID_TX_INFO_SET; 630 - msta->stats.jiffies = jiffies; 626 + msta->last_txs = jiffies; 631 627 632 628 ret = mt76_connac_pm_wake(&dev->mphy, &dev->pm); 633 629 if (ret) ··· 647 645 648 646 return 0; 649 647 } 648 + EXPORT_SYMBOL_GPL(mt7921_mac_sta_add); 650 649 651 650 void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif, 652 651 struct ieee80211_sta *sta) ··· 669 666 670 667 mt7921_mutex_release(dev); 671 668 } 669 + EXPORT_SYMBOL_GPL(mt7921_mac_sta_assoc); 672 670 673 671 void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, 674 672 struct ieee80211_sta *sta) ··· 697 693 spin_lock_bh(&dev->sta_poll_lock); 698 694 if (!list_empty(&msta->poll_list)) 699 695 list_del_init(&msta->poll_list); 700 - if (!list_empty(&msta->stats_list)) 701 - list_del_init(&msta->stats_list); 702 696 spin_unlock_bh(&dev->sta_poll_lock); 703 697 704 698 mt76_connac_power_save_sched(&dev->mphy, &dev->pm); 705 699 } 700 + EXPORT_SYMBOL_GPL(mt7921_mac_sta_remove); 706 701 707 702 void mt7921_tx_worker(struct mt76_worker *w) 708 703 { ··· 856 853 stats->dot11FCSErrorCount = mib->fcs_err_cnt; 857 854 stats->dot11ACKFailureCount = mib->ack_fail_cnt; 858 855 859 - memset(mib, 0, sizeof(*mib)); 860 - 861 856 mt7921_mutex_release(phy->dev); 862 857 863 858 return 0; 859 + } 860 + 861 + static const char mt7921_gstrings_stats[][ETH_GSTRING_LEN] = { 862 + /* tx counters */ 863 + "tx_ampdu_cnt", 864 + "tx_mpdu_attempts", 865 + "tx_mpdu_success", 866 + "tx_pkt_ebf_cnt", 867 + "tx_pkt_ibf_cnt", 868 + "tx_ampdu_len:0-1", 869 + "tx_ampdu_len:2-10", 870 + "tx_ampdu_len:11-19", 871 + "tx_ampdu_len:20-28", 872 + "tx_ampdu_len:29-37", 873 + "tx_ampdu_len:38-46", 874 + "tx_ampdu_len:47-55", 875 + "tx_ampdu_len:56-79", 876 + "tx_ampdu_len:80-103", 877 + "tx_ampdu_len:104-127", 878 + "tx_ampdu_len:128-151", 879 + "tx_ampdu_len:152-175", 880 + "tx_ampdu_len:176-199", 881 + "tx_ampdu_len:200-223", 882 + "tx_ampdu_len:224-247", 883 + "ba_miss_count", 884 + "tx_beamformer_ppdu_iBF", 885 + "tx_beamformer_ppdu_eBF", 886 + "tx_beamformer_rx_feedback_all", 887 + "tx_beamformer_rx_feedback_he", 888 + "tx_beamformer_rx_feedback_vht", 889 + "tx_beamformer_rx_feedback_ht", 890 + "tx_msdu_pack_1", 891 + "tx_msdu_pack_2", 892 + "tx_msdu_pack_3", 893 + "tx_msdu_pack_4", 894 + "tx_msdu_pack_5", 895 + "tx_msdu_pack_6", 896 + "tx_msdu_pack_7", 897 + "tx_msdu_pack_8", 898 + /* rx counters */ 899 + "rx_mpdu_cnt", 900 + "rx_ampdu_cnt", 901 + "rx_ampdu_bytes_cnt", 902 + "rx_ba_cnt", 903 + /* per vif counters */ 904 + "v_tx_mode_cck", 905 + "v_tx_mode_ofdm", 906 + "v_tx_mode_ht", 907 + "v_tx_mode_ht_gf", 908 + "v_tx_mode_vht", 909 + "v_tx_mode_he_su", 910 + "v_tx_mode_he_ext_su", 911 + "v_tx_mode_he_tb", 912 + "v_tx_mode_he_mu", 913 + "v_tx_bw_20", 914 + "v_tx_bw_40", 915 + "v_tx_bw_80", 916 + "v_tx_bw_160", 917 + "v_tx_mcs_0", 918 + "v_tx_mcs_1", 919 + "v_tx_mcs_2", 920 + "v_tx_mcs_3", 921 + "v_tx_mcs_4", 922 + "v_tx_mcs_5", 923 + "v_tx_mcs_6", 924 + "v_tx_mcs_7", 925 + "v_tx_mcs_8", 926 + "v_tx_mcs_9", 927 + "v_tx_mcs_10", 928 + "v_tx_mcs_11", 929 + }; 930 + 931 + static void 932 + mt7921_get_et_strings(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 933 + u32 sset, u8 *data) 934 + { 935 + if (sset != ETH_SS_STATS) 936 + return; 937 + 938 + memcpy(data, *mt7921_gstrings_stats, sizeof(mt7921_gstrings_stats)); 939 + } 940 + 941 + static int 942 + mt7921_get_et_sset_count(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 943 + int sset) 944 + { 945 + return sset == ETH_SS_STATS ? ARRAY_SIZE(mt7921_gstrings_stats) : 0; 946 + } 947 + 948 + static void 949 + mt7921_ethtool_worker(void *wi_data, struct ieee80211_sta *sta) 950 + { 951 + struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; 952 + struct mt76_ethtool_worker_info *wi = wi_data; 953 + 954 + if (msta->vif->mt76.idx != wi->idx) 955 + return; 956 + 957 + mt76_ethtool_worker(wi, &msta->stats); 958 + } 959 + 960 + static 961 + void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 962 + struct ethtool_stats *stats, u64 *data) 963 + { 964 + struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; 965 + struct mt7921_phy *phy = mt7921_hw_phy(hw); 966 + struct mt7921_dev *dev = phy->dev; 967 + struct mib_stats *mib = &phy->mib; 968 + struct mt76_ethtool_worker_info wi = { 969 + .data = data, 970 + .idx = mvif->mt76.idx, 971 + }; 972 + int i, ei = 0; 973 + 974 + mt7921_mutex_acquire(dev); 975 + 976 + mt7921_mac_update_mib_stats(phy); 977 + 978 + data[ei++] = mib->tx_ampdu_cnt; 979 + data[ei++] = mib->tx_mpdu_attempts_cnt; 980 + data[ei++] = mib->tx_mpdu_success_cnt; 981 + data[ei++] = mib->tx_pkt_ebf_cnt; 982 + data[ei++] = mib->tx_pkt_ibf_cnt; 983 + 984 + /* Tx ampdu stat */ 985 + for (i = 0; i < 15; i++) 986 + data[ei++] = dev->mt76.aggr_stats[i]; 987 + 988 + data[ei++] = phy->mib.ba_miss_cnt; 989 + 990 + /* Tx Beamformer monitor */ 991 + data[ei++] = mib->tx_bf_ibf_ppdu_cnt; 992 + data[ei++] = mib->tx_bf_ebf_ppdu_cnt; 993 + 994 + /* Tx Beamformer Rx feedback monitor */ 995 + data[ei++] = mib->tx_bf_rx_fb_all_cnt; 996 + data[ei++] = mib->tx_bf_rx_fb_he_cnt; 997 + data[ei++] = mib->tx_bf_rx_fb_vht_cnt; 998 + data[ei++] = mib->tx_bf_rx_fb_ht_cnt; 999 + 1000 + /* Tx amsdu info (pack-count histogram) */ 1001 + for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++) 1002 + data[ei++] = mib->tx_amsdu[i]; 1003 + 1004 + /* rx counters */ 1005 + data[ei++] = mib->rx_mpdu_cnt; 1006 + data[ei++] = mib->rx_ampdu_cnt; 1007 + data[ei++] = mib->rx_ampdu_bytes_cnt; 1008 + data[ei++] = mib->rx_ba_cnt; 1009 + 1010 + /* Add values for all stations owned by this vif */ 1011 + wi.initial_stat_idx = ei; 1012 + ieee80211_iterate_stations_atomic(hw, mt7921_ethtool_worker, &wi); 1013 + 1014 + mt7921_mutex_release(dev); 1015 + 1016 + if (!wi.sta_count) 1017 + return; 1018 + 1019 + ei += wi.worker_stat_count; 1020 + if (ei != ARRAY_SIZE(mt7921_gstrings_stats)) 1021 + dev_err(dev->mt76.dev, "ei: %d SSTATS_LEN: %lu", 1022 + ei, ARRAY_SIZE(mt7921_gstrings_stats)); 864 1023 } 865 1024 866 1025 static u64 ··· 1213 1048 struct station_info *sinfo) 1214 1049 { 1215 1050 struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; 1216 - struct mt7921_sta_stats *stats = &msta->stats; 1051 + struct rate_info *txrate = &msta->wcid.rate; 1217 1052 1218 - if (!stats->tx_rate.legacy && !stats->tx_rate.flags) 1053 + if (!txrate->legacy && !txrate->flags) 1219 1054 return; 1220 1055 1221 - if (stats->tx_rate.legacy) { 1222 - sinfo->txrate.legacy = stats->tx_rate.legacy; 1056 + if (txrate->legacy) { 1057 + sinfo->txrate.legacy = txrate->legacy; 1223 1058 } else { 1224 - sinfo->txrate.mcs = stats->tx_rate.mcs; 1225 - sinfo->txrate.nss = stats->tx_rate.nss; 1226 - sinfo->txrate.bw = stats->tx_rate.bw; 1227 - sinfo->txrate.he_gi = stats->tx_rate.he_gi; 1228 - sinfo->txrate.he_dcm = stats->tx_rate.he_dcm; 1229 - sinfo->txrate.he_ru_alloc = stats->tx_rate.he_ru_alloc; 1059 + sinfo->txrate.mcs = txrate->mcs; 1060 + sinfo->txrate.nss = txrate->nss; 1061 + sinfo->txrate.bw = txrate->bw; 1062 + sinfo->txrate.he_gi = txrate->he_gi; 1063 + sinfo->txrate.he_dcm = txrate->he_dcm; 1064 + sinfo->txrate.he_ru_alloc = txrate->he_ru_alloc; 1230 1065 } 1231 - sinfo->txrate.flags = stats->tx_rate.flags; 1066 + sinfo->txrate.flags = txrate->flags; 1232 1067 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 1233 1068 } 1234 1069 ··· 1337 1172 MCU_UNI_CMD_STA_REC_UPDATE); 1338 1173 } 1339 1174 1175 + static int mt7921_set_sar_specs(struct ieee80211_hw *hw, 1176 + const struct cfg80211_sar_specs *sar) 1177 + { 1178 + const struct cfg80211_sar_capa *capa = hw->wiphy->sar_capa; 1179 + struct mt7921_dev *dev = mt7921_hw_dev(hw); 1180 + struct mt76_freq_range_power *data, *frp; 1181 + struct mt76_phy *mphy = hw->priv; 1182 + int err; 1183 + u32 i; 1184 + 1185 + if (sar->type != NL80211_SAR_TYPE_POWER || !sar->num_sub_specs) 1186 + return -EINVAL; 1187 + 1188 + mt7921_mutex_acquire(dev); 1189 + 1190 + data = mphy->frp; 1191 + 1192 + for (i = 0; i < sar->num_sub_specs; i++) { 1193 + u32 index = sar->sub_specs[i].freq_range_index; 1194 + /* SAR specifies power limitaton in 0.25dbm */ 1195 + s32 power = sar->sub_specs[i].power >> 1; 1196 + 1197 + if (power > 127 || power < -127) 1198 + power = 127; 1199 + 1200 + frp = &data[index]; 1201 + frp->range = &capa->freq_ranges[index]; 1202 + frp->power = power; 1203 + } 1204 + 1205 + err = mt76_connac_mcu_set_rate_txpower(mphy); 1206 + 1207 + mt7921_mutex_release(dev); 1208 + 1209 + return err; 1210 + } 1211 + 1340 1212 const struct ieee80211_ops mt7921_ops = { 1341 1213 .tx = mt7921_tx, 1342 1214 .start = mt7921_start, ··· 1394 1192 .release_buffered_frames = mt76_release_buffered_frames, 1395 1193 .get_txpower = mt76_get_txpower, 1396 1194 .get_stats = mt7921_get_stats, 1195 + .get_et_sset_count = mt7921_get_et_sset_count, 1196 + .get_et_strings = mt7921_get_et_strings, 1197 + .get_et_stats = mt7921_get_et_stats, 1397 1198 .get_tsf = mt7921_get_tsf, 1398 1199 .set_tsf = mt7921_set_tsf, 1399 1200 .get_survey = mt76_get_survey, ··· 1408 1203 .sta_statistics = mt7921_sta_statistics, 1409 1204 .sched_scan_start = mt7921_start_sched_scan, 1410 1205 .sched_scan_stop = mt7921_stop_sched_scan, 1206 + CFG80211_TESTMODE_CMD(mt7921_testmode_cmd) 1207 + CFG80211_TESTMODE_DUMP(mt7921_testmode_dump) 1411 1208 #ifdef CONFIG_PM 1412 1209 .suspend = mt7921_suspend, 1413 1210 .resume = mt7921_resume, ··· 1417 1210 .set_rekey_data = mt7921_set_rekey_data, 1418 1211 #endif /* CONFIG_PM */ 1419 1212 .flush = mt7921_flush, 1213 + .set_sar_specs = mt7921_set_sar_specs, 1420 1214 }; 1215 + EXPORT_SYMBOL_GPL(mt7921_ops); 1216 + 1217 + MODULE_LICENSE("Dual BSD/GPL"); 1218 + MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
+190 -262
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
··· 82 82 #define FW_START_OVERRIDE BIT(0) 83 83 #define FW_START_WORKING_PDA_CR4 BIT(2) 84 84 85 + #define PATCH_SEC_NOT_SUPPORT GENMASK(31, 0) 85 86 #define PATCH_SEC_TYPE_MASK GENMASK(15, 0) 86 87 #define PATCH_SEC_TYPE_INFO 0x2 88 + 89 + #define PATCH_SEC_ENC_TYPE_MASK GENMASK(31, 24) 90 + #define PATCH_SEC_ENC_TYPE_PLAIN 0x00 91 + #define PATCH_SEC_ENC_TYPE_AES 0x01 92 + #define PATCH_SEC_ENC_TYPE_SCRAMBLE 0x02 93 + #define PATCH_SEC_ENC_SCRAMBLE_INFO_MASK GENMASK(15, 0) 94 + #define PATCH_SEC_ENC_AES_KEY_MASK GENMASK(7, 0) 87 95 88 96 #define to_wcid_lo(id) FIELD_GET(GENMASK(7, 0), (u16)id) 89 97 #define to_wcid_hi(id) FIELD_GET(GENMASK(9, 8), (u16)id) ··· 160 152 return 0; 161 153 } 162 154 163 - static int 164 - mt7921_mcu_parse_response(struct mt76_dev *mdev, int cmd, 165 - struct sk_buff *skb, int seq) 155 + int mt7921_mcu_parse_response(struct mt76_dev *mdev, int cmd, 156 + struct sk_buff *skb, int seq) 166 157 { 167 158 struct mt7921_mcu_rxd *rxd; 159 + int mcu_cmd = cmd & MCU_CMD_MASK; 168 160 int ret = 0; 169 161 170 162 if (!skb) { ··· 202 194 skb_pull(skb, sizeof(*rxd)); 203 195 event = (struct mt7921_mcu_uni_event *)skb->data; 204 196 ret = le32_to_cpu(event->status); 197 + /* skip invalid event */ 198 + if (mcu_cmd != event->cid) 199 + ret = -EAGAIN; 205 200 break; 206 201 } 207 202 case MCU_CMD_REG_READ: { ··· 222 211 223 212 return ret; 224 213 } 214 + EXPORT_SYMBOL_GPL(mt7921_mcu_parse_response); 225 215 226 - static int 227 - mt7921_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, 228 - int cmd, int *wait_seq) 216 + int mt7921_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb, 217 + int cmd, int *wait_seq) 229 218 { 230 219 struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 231 220 int txd_len, mcu_cmd = cmd & MCU_CMD_MASK; 232 - enum mt76_mcuq_id txq = MT_MCUQ_WM; 233 221 struct mt7921_uni_txd *uni_txd; 234 222 struct mt7921_mcu_txd *mcu_txd; 235 223 __le32 *txd; ··· 250 240 if (!seq) 251 241 seq = ++dev->mt76.mcu.msg_seq & 0xf; 252 242 253 - if (cmd == MCU_CMD_FW_SCATTER) { 254 - txq = MT_MCUQ_FWDL; 243 + if (cmd == MCU_CMD_FW_SCATTER) 255 244 goto exit; 256 - } 257 245 258 246 txd_len = cmd & MCU_UNI_PREFIX ? sizeof(*uni_txd) : sizeof(*mcu_txd); 259 247 txd = (__le32 *)skb_push(skb, txd_len); ··· 315 307 if (wait_seq) 316 308 *wait_seq = seq; 317 309 318 - return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[txq], skb, 0); 310 + return 0; 319 311 } 320 - 321 - static void 322 - mt7921_mcu_tx_rate_parse(struct mt76_phy *mphy, 323 - struct mt7921_mcu_peer_cap *peer, 324 - struct rate_info *rate, u16 r) 325 - { 326 - struct ieee80211_supported_band *sband; 327 - u16 flags = 0; 328 - u8 txmode = FIELD_GET(MT_WTBL_RATE_TX_MODE, r); 329 - u8 gi = 0; 330 - u8 bw = 0; 331 - 332 - rate->mcs = FIELD_GET(MT_WTBL_RATE_MCS, r); 333 - rate->nss = FIELD_GET(MT_WTBL_RATE_NSS, r) + 1; 334 - 335 - switch (peer->bw) { 336 - case IEEE80211_STA_RX_BW_160: 337 - gi = peer->g16; 338 - break; 339 - case IEEE80211_STA_RX_BW_80: 340 - gi = peer->g8; 341 - break; 342 - case IEEE80211_STA_RX_BW_40: 343 - gi = peer->g4; 344 - break; 345 - default: 346 - gi = peer->g2; 347 - break; 348 - } 349 - 350 - gi = txmode >= MT_PHY_TYPE_HE_SU ? 351 - FIELD_GET(MT_WTBL_RATE_HE_GI, gi) : 352 - FIELD_GET(MT_WTBL_RATE_GI, gi); 353 - 354 - switch (txmode) { 355 - case MT_PHY_TYPE_CCK: 356 - case MT_PHY_TYPE_OFDM: 357 - if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) 358 - sband = &mphy->sband_5g.sband; 359 - else 360 - sband = &mphy->sband_2g.sband; 361 - 362 - rate->legacy = sband->bitrates[rate->mcs].bitrate; 363 - break; 364 - case MT_PHY_TYPE_HT: 365 - case MT_PHY_TYPE_HT_GF: 366 - flags |= RATE_INFO_FLAGS_MCS; 367 - 368 - if (gi) 369 - flags |= RATE_INFO_FLAGS_SHORT_GI; 370 - break; 371 - case MT_PHY_TYPE_VHT: 372 - flags |= RATE_INFO_FLAGS_VHT_MCS; 373 - 374 - if (gi) 375 - flags |= RATE_INFO_FLAGS_SHORT_GI; 376 - break; 377 - case MT_PHY_TYPE_HE_SU: 378 - case MT_PHY_TYPE_HE_EXT_SU: 379 - case MT_PHY_TYPE_HE_TB: 380 - case MT_PHY_TYPE_HE_MU: 381 - rate->he_gi = gi; 382 - rate->he_dcm = FIELD_GET(MT_RA_RATE_DCM_EN, r); 383 - 384 - flags |= RATE_INFO_FLAGS_HE_MCS; 385 - break; 386 - default: 387 - break; 388 - } 389 - rate->flags = flags; 390 - 391 - bw = mt7921_mcu_chan_bw(&mphy->chandef) - FIELD_GET(MT_RA_RATE_BW, r); 392 - 393 - switch (bw) { 394 - case IEEE80211_STA_RX_BW_160: 395 - rate->bw = RATE_INFO_BW_160; 396 - break; 397 - case IEEE80211_STA_RX_BW_80: 398 - rate->bw = RATE_INFO_BW_80; 399 - break; 400 - case IEEE80211_STA_RX_BW_40: 401 - rate->bw = RATE_INFO_BW_40; 402 - break; 403 - default: 404 - rate->bw = RATE_INFO_BW_20; 405 - break; 406 - } 407 - } 312 + EXPORT_SYMBOL_GPL(mt7921_mcu_fill_message); 408 313 409 314 static void 410 315 mt7921_mcu_scan_event(struct mt7921_dev *dev, struct sk_buff *skb) ··· 419 498 } 420 499 421 500 static void 422 - mt7921_mcu_tx_done_event(struct mt7921_dev *dev, struct sk_buff *skb) 423 - { 424 - struct mt7921_mcu_tx_done_event *event; 425 - struct mt7921_sta *msta; 426 - struct mt7921_phy *mphy = &dev->phy; 427 - struct mt7921_mcu_peer_cap peer; 428 - struct ieee80211_sta *sta; 429 - LIST_HEAD(list); 430 - 431 - skb_pull(skb, sizeof(struct mt7921_mcu_rxd)); 432 - event = (struct mt7921_mcu_tx_done_event *)skb->data; 433 - 434 - spin_lock_bh(&dev->sta_poll_lock); 435 - list_splice_init(&mphy->stats_list, &list); 436 - 437 - while (!list_empty(&list)) { 438 - msta = list_first_entry(&list, struct mt7921_sta, stats_list); 439 - list_del_init(&msta->stats_list); 440 - 441 - if (msta->wcid.idx != event->wlan_idx) 442 - continue; 443 - 444 - spin_unlock_bh(&dev->sta_poll_lock); 445 - 446 - sta = wcid_to_sta(&msta->wcid); 447 - 448 - /* peer config based on IEEE SPEC */ 449 - memset(&peer, 0x0, sizeof(peer)); 450 - peer.bw = event->bw; 451 - peer.g2 = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20); 452 - peer.g4 = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40); 453 - peer.g8 = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80); 454 - peer.g16 = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160); 455 - mt7921_mcu_tx_rate_parse(mphy->mt76, &peer, 456 - &msta->stats.tx_rate, event->tx_rate); 457 - 458 - spin_lock_bh(&dev->sta_poll_lock); 459 - break; 460 - } 461 - spin_unlock_bh(&dev->sta_poll_lock); 462 - } 463 - 464 - static void 465 501 mt7921_mcu_rx_unsolicited_event(struct mt7921_dev *dev, struct sk_buff *skb) 466 502 { 467 503 struct mt7921_mcu_rxd *rxd = (struct mt7921_mcu_rxd *)skb->data; ··· 438 560 mt7921_mcu_debug_msg_event(dev, skb); 439 561 break; 440 562 case MCU_EVENT_COREDUMP: 563 + dev->fw_assert = true; 441 564 mt76_connac_mcu_coredump_event(&dev->mt76, skb, 442 565 &dev->coredump); 443 566 return; 444 567 case MCU_EVENT_LP_INFO: 445 568 mt7921_mcu_low_power_event(dev, skb); 446 - break; 447 - case MCU_EVENT_TX_DONE: 448 - mt7921_mcu_tx_done_event(dev, skb); 449 569 break; 450 570 default: 451 571 break; ··· 453 577 454 578 void mt7921_mcu_rx_event(struct mt7921_dev *dev, struct sk_buff *skb) 455 579 { 456 - struct mt7921_mcu_rxd *rxd = (struct mt7921_mcu_rxd *)skb->data; 580 + struct mt7921_mcu_rxd *rxd; 581 + 582 + if (skb_linearize(skb)) 583 + return; 584 + 585 + rxd = (struct mt7921_mcu_rxd *)skb->data; 457 586 458 587 if (rxd->eid == 0x6) { 459 588 mt76_mcu_rx_event(&dev->mt76, skb); ··· 500 619 u8 cipher; 501 620 502 621 cipher = mt7921_mcu_get_cipher(key->cipher); 503 - if (cipher == MT_CIPHER_NONE) 622 + if (cipher == MCU_CIPHER_NONE) 504 623 return -EOPNOTSUPP; 505 624 506 625 sec_key = &sec->key[0]; ··· 593 712 enable, false); 594 713 } 595 714 596 - static int mt7921_mcu_restart(struct mt76_dev *dev) 715 + int mt7921_mcu_restart(struct mt76_dev *dev) 597 716 { 598 717 struct { 599 718 u8 power_mode; ··· 605 724 return mt76_mcu_send_msg(dev, MCU_CMD_NIC_POWER_CTRL, &req, 606 725 sizeof(req), false); 607 726 } 727 + EXPORT_SYMBOL_GPL(mt7921_mcu_restart); 608 728 609 - static int mt7921_driver_own(struct mt7921_dev *dev) 729 + static u32 mt7921_get_data_mode(struct mt7921_dev *dev, u32 info) 610 730 { 611 - u32 reg = mt7921_reg_map_l1(dev, MT_TOP_LPCR_HOST_BAND0); 731 + u32 mode = DL_MODE_NEED_RSP; 612 732 613 - mt76_wr(dev, reg, MT_TOP_LPCR_HOST_DRV_OWN); 614 - if (!mt76_poll_msec(dev, reg, MT_TOP_LPCR_HOST_FW_OWN, 615 - 0, 500)) { 616 - dev_err(dev->mt76.dev, "Timeout for driver own\n"); 617 - return -EIO; 733 + if (info == PATCH_SEC_NOT_SUPPORT) 734 + return mode; 735 + 736 + switch (FIELD_GET(PATCH_SEC_ENC_TYPE_MASK, info)) { 737 + case PATCH_SEC_ENC_TYPE_PLAIN: 738 + break; 739 + case PATCH_SEC_ENC_TYPE_AES: 740 + mode |= DL_MODE_ENCRYPT; 741 + mode |= FIELD_PREP(DL_MODE_KEY_IDX, 742 + (info & PATCH_SEC_ENC_AES_KEY_MASK)) & DL_MODE_KEY_IDX; 743 + mode |= DL_MODE_RESET_SEC_IV; 744 + break; 745 + case PATCH_SEC_ENC_TYPE_SCRAMBLE: 746 + mode |= DL_MODE_ENCRYPT; 747 + mode |= DL_CONFIG_ENCRY_MODE_SEL; 748 + mode |= DL_MODE_RESET_SEC_IV; 749 + break; 750 + default: 751 + dev_err(dev->mt76.dev, "Encryption type not support!\n"); 618 752 } 619 753 620 - return 0; 754 + return mode; 755 + } 756 + 757 + static char *mt7921_patch_name(struct mt7921_dev *dev) 758 + { 759 + char *ret; 760 + 761 + if (is_mt7922(&dev->mt76)) 762 + ret = MT7922_ROM_PATCH; 763 + else 764 + ret = MT7921_ROM_PATCH; 765 + 766 + return ret; 621 767 } 622 768 623 769 static int mt7921_load_patch(struct mt7921_dev *dev) 624 770 { 625 771 const struct mt7921_patch_hdr *hdr; 626 772 const struct firmware *fw = NULL; 627 - int i, ret, sem; 773 + int i, ret, sem, max_len; 774 + 775 + max_len = mt76_is_sdio(&dev->mt76) ? 2048 : 4096; 628 776 629 777 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, true); 630 778 switch (sem) { ··· 666 756 return -EAGAIN; 667 757 } 668 758 669 - ret = request_firmware(&fw, MT7921_ROM_PATCH, dev->mt76.dev); 759 + ret = request_firmware(&fw, mt7921_patch_name(dev), dev->mt76.dev); 670 760 if (ret) 671 761 goto out; 672 762 ··· 684 774 for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) { 685 775 struct mt7921_patch_sec *sec; 686 776 const u8 *dl; 687 - u32 len, addr; 777 + u32 len, addr, mode; 778 + u32 sec_info = 0; 688 779 689 780 sec = (struct mt7921_patch_sec *)(fw->data + sizeof(*hdr) + 690 781 i * sizeof(*sec)); ··· 698 787 addr = be32_to_cpu(sec->info.addr); 699 788 len = be32_to_cpu(sec->info.len); 700 789 dl = fw->data + be32_to_cpu(sec->offs); 790 + sec_info = be32_to_cpu(sec->info.sec_key_idx); 791 + mode = mt7921_get_data_mode(dev, sec_info); 701 792 702 793 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len, 703 - DL_MODE_NEED_RSP); 794 + mode); 704 795 if (ret) { 705 796 dev_err(dev->mt76.dev, "Download request failed\n"); 706 797 goto out; 707 798 } 708 799 709 - ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD_FW_SCATTER, 710 - dl, len); 800 + ret = __mt76_mcu_send_firmware(&dev->mt76, MCU_CMD_FW_SCATTER, 801 + dl, len, max_len); 711 802 if (ret) { 712 803 dev_err(dev->mt76.dev, "Failed to send patch\n"); 713 804 goto out; ··· 728 815 default: 729 816 ret = -EAGAIN; 730 817 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n"); 731 - goto out; 818 + break; 732 819 } 733 820 release_firmware(fw); 734 821 ··· 756 843 const struct mt7921_fw_trailer *hdr, 757 844 const u8 *data, bool is_wa) 758 845 { 759 - int i, offset = 0; 846 + int i, offset = 0, max_len; 760 847 u32 override = 0, option = 0; 848 + 849 + max_len = mt76_is_sdio(&dev->mt76) ? 2048 : 4096; 761 850 762 851 for (i = 0; i < hdr->n_region; i++) { 763 852 const struct mt7921_fw_region *region; ··· 782 867 return err; 783 868 } 784 869 785 - err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD_FW_SCATTER, 786 - data + offset, len); 870 + err = __mt76_mcu_send_firmware(&dev->mt76, MCU_CMD_FW_SCATTER, 871 + data + offset, len, max_len); 787 872 if (err) { 788 873 dev_err(dev->mt76.dev, "Failed to send firmware.\n"); 789 874 return err; ··· 801 886 return mt76_connac_mcu_start_firmware(&dev->mt76, override, option); 802 887 } 803 888 889 + static char *mt7921_ram_name(struct mt7921_dev *dev) 890 + { 891 + char *ret; 892 + 893 + if (is_mt7922(&dev->mt76)) 894 + ret = MT7922_FIRMWARE_WM; 895 + else 896 + ret = MT7921_FIRMWARE_WM; 897 + 898 + return ret; 899 + } 900 + 804 901 static int mt7921_load_ram(struct mt7921_dev *dev) 805 902 { 806 903 const struct mt7921_fw_trailer *hdr; 807 904 const struct firmware *fw; 808 905 int ret; 809 906 810 - ret = request_firmware(&fw, MT7921_FIRMWARE_WM, dev->mt76.dev); 907 + ret = request_firmware(&fw, mt7921_ram_name(dev), dev->mt76.dev); 811 908 if (ret) 812 909 return ret; 813 910 ··· 856 929 int ret; 857 930 858 931 ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY); 859 - if (ret) { 932 + if (ret && mt76_is_mmio(&dev->mt76)) { 860 933 dev_dbg(dev->mt76.dev, "Firmware is already download\n"); 861 934 goto fw_loaded; 862 935 } ··· 877 950 } 878 951 879 952 fw_loaded: 880 - mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false); 881 953 882 954 #ifdef CONFIG_PM 883 955 dev->mt76.hw->wiphy->wowlan = &mt76_connac_wowlan_support; ··· 904 978 { 905 979 int err; 906 980 907 - err = mt7921_driver_own(dev); 908 - if (err) 909 - return err; 910 - 911 981 err = mt7921_load_firmware(dev); 912 982 if (err) 913 983 return err; 914 984 985 + err = mt76_connac_mcu_get_nic_capability(&dev->mphy); 986 + if (err) 987 + return err; 988 + 915 989 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state); 916 - mt7921_mcu_fw_log_2_host(dev, 1); 917 - 918 - return mt76_connac_mcu_get_nic_capability(&dev->mphy); 990 + return mt7921_mcu_fw_log_2_host(dev, 1); 919 991 } 920 - 921 - int mt7921_mcu_init(struct mt7921_dev *dev) 922 - { 923 - static const struct mt76_mcu_ops mt7921_mcu_ops = { 924 - .headroom = sizeof(struct mt7921_mcu_txd), 925 - .mcu_skb_send_msg = mt7921_mcu_send_message, 926 - .mcu_parse_response = mt7921_mcu_parse_response, 927 - .mcu_restart = mt7921_mcu_restart, 928 - }; 929 - 930 - dev->mt76.mcu_ops = &mt7921_mcu_ops; 931 - 932 - return mt7921_run_firmware(dev); 933 - } 992 + EXPORT_SYMBOL_GPL(mt7921_run_firmware); 934 993 935 994 void mt7921_mcu_exit(struct mt7921_dev *dev) 936 995 { 937 - mt7921_wfsys_reset(dev); 938 996 skb_queue_purge(&dev->mt76.mcu.res_q); 939 997 } 998 + EXPORT_SYMBOL_GPL(mt7921_mcu_exit); 940 999 941 1000 int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif) 942 1001 { ··· 952 1041 .total = IEEE80211_NUM_ACS, 953 1042 }; 954 1043 struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; 955 - int ac; 1044 + struct mu_edca { 1045 + u8 cw_min; 1046 + u8 cw_max; 1047 + u8 aifsn; 1048 + u8 acm; 1049 + u8 timer; 1050 + u8 padding[3]; 1051 + }; 1052 + struct mt7921_mcu_mu_tx { 1053 + u8 ver; 1054 + u8 pad0; 1055 + __le16 len; 1056 + u8 bss_idx; 1057 + u8 qos; 1058 + u8 wmm_idx; 1059 + u8 pad1; 1060 + struct mu_edca edca[IEEE80211_NUM_ACS]; 1061 + u8 pad3[32]; 1062 + } __packed req_mu = { 1063 + .bss_idx = mvif->mt76.idx, 1064 + .qos = vif->bss_conf.qos, 1065 + .wmm_idx = mvif->mt76.wmm_idx, 1066 + }; 1067 + int ac, ret; 956 1068 957 1069 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { 958 1070 struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac]; ··· 996 1062 else 997 1063 e->cw_max = cpu_to_le16(10); 998 1064 } 999 - return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EDCA_UPDATE, &req, 1000 - sizeof(req), true); 1065 + 1066 + ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EDCA_UPDATE, &req, 1067 + sizeof(req), true); 1068 + if (ret) 1069 + return ret; 1070 + 1071 + if (!vif->bss_conf.he_support) 1072 + return 0; 1073 + 1074 + for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { 1075 + struct ieee80211_he_mu_edca_param_ac_rec *q; 1076 + struct mu_edca *e; 1077 + int to_aci[] = {1, 0, 2, 3}; 1078 + 1079 + if (!mvif->queue_params[ac].mu_edca) 1080 + break; 1081 + 1082 + q = &mvif->queue_params[ac].mu_edca_param_rec; 1083 + e = &(req_mu.edca[to_aci[ac]]); 1084 + 1085 + e->cw_min = q->ecw_min_max & 0xf; 1086 + e->cw_max = (q->ecw_min_max & 0xf0) >> 4; 1087 + e->aifsn = q->aifsn; 1088 + e->timer = q->mu_edca_timer; 1089 + } 1090 + 1091 + return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_MU_EDCA_PARMS, &req_mu, 1092 + sizeof(req_mu), false); 1001 1093 } 1002 1094 1003 1095 int mt7921_mcu_set_chan_info(struct mt7921_phy *phy, int cmd) ··· 1055 1095 .tx_streams_num = hweight8(phy->mt76->antenna_mask), 1056 1096 .rx_streams = phy->mt76->antenna_mask, 1057 1097 .band_idx = phy != &dev->phy, 1058 - .channel_band = chandef->chan->band, 1059 1098 }; 1099 + 1100 + if (chandef->chan->band == NL80211_BAND_6GHZ) 1101 + req.channel_band = 2; 1102 + else 1103 + req.channel_band = chandef->chan->band; 1060 1104 1061 1105 if (dev->mt76.hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) 1062 1106 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD; ··· 1096 1132 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EFUSE_BUFFER_MODE, 1097 1133 &req, sizeof(req), true); 1098 1134 } 1135 + EXPORT_SYMBOL_GPL(mt7921_mcu_set_eeprom); 1099 1136 1100 1137 int mt7921_mcu_get_eeprom(struct mt7921_dev *dev, u32 offset) 1101 1138 { ··· 1158 1193 &ps_req, sizeof(ps_req), true); 1159 1194 } 1160 1195 1161 - int mt7921_mcu_uni_bss_bcnft(struct mt7921_dev *dev, struct ieee80211_vif *vif, 1162 - bool enable) 1196 + static int 1197 + mt7921_mcu_uni_bss_bcnft(struct mt7921_dev *dev, struct ieee80211_vif *vif, 1198 + bool enable) 1163 1199 { 1164 1200 struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; 1165 1201 struct { ··· 1194 1228 &bcnft_req, sizeof(bcnft_req), true); 1195 1229 } 1196 1230 1197 - int mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif, 1198 - bool enable) 1231 + static int 1232 + mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif, 1233 + bool enable) 1199 1234 { 1200 1235 struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; 1201 1236 struct { ··· 1259 1292 return mt76_connac_mcu_sta_cmd(&dev->mphy, &info); 1260 1293 } 1261 1294 1262 - int __mt7921_mcu_drv_pmctrl(struct mt7921_dev *dev) 1263 - { 1264 - struct mt76_phy *mphy = &dev->mt76.phy; 1265 - struct mt76_connac_pm *pm = &dev->pm; 1266 - int i, err = 0; 1267 - 1268 - for (i = 0; i < MT7921_DRV_OWN_RETRY_COUNT; i++) { 1269 - mt76_wr(dev, MT_CONN_ON_LPCTL, PCIE_LPCR_HOST_CLR_OWN); 1270 - if (mt76_poll_msec(dev, MT_CONN_ON_LPCTL, 1271 - PCIE_LPCR_HOST_OWN_SYNC, 0, 50)) 1272 - break; 1273 - } 1274 - 1275 - if (i == MT7921_DRV_OWN_RETRY_COUNT) { 1276 - dev_err(dev->mt76.dev, "driver own failed\n"); 1277 - err = -EIO; 1278 - goto out; 1279 - } 1280 - 1281 - mt7921_wpdma_reinit_cond(dev); 1282 - clear_bit(MT76_STATE_PM, &mphy->state); 1283 - 1284 - pm->stats.last_wake_event = jiffies; 1285 - pm->stats.doze_time += pm->stats.last_wake_event - 1286 - pm->stats.last_doze_event; 1287 - out: 1288 - return err; 1289 - } 1290 - 1291 1295 int mt7921_mcu_drv_pmctrl(struct mt7921_dev *dev) 1292 1296 { 1293 1297 struct mt76_phy *mphy = &dev->mt76.phy; ··· 1279 1341 1280 1342 return err; 1281 1343 } 1344 + EXPORT_SYMBOL_GPL(mt7921_mcu_drv_pmctrl); 1282 1345 1283 1346 int mt7921_mcu_fw_pmctrl(struct mt7921_dev *dev) 1284 1347 { 1285 1348 struct mt76_phy *mphy = &dev->mt76.phy; 1286 1349 struct mt76_connac_pm *pm = &dev->pm; 1287 - int i, err = 0; 1350 + int err = 0; 1288 1351 1289 1352 mutex_lock(&pm->mutex); 1290 1353 1291 1354 if (mt76_connac_skip_fw_pmctrl(mphy, pm)) 1292 1355 goto out; 1293 1356 1294 - for (i = 0; i < MT7921_DRV_OWN_RETRY_COUNT; i++) { 1295 - mt76_wr(dev, MT_CONN_ON_LPCTL, PCIE_LPCR_HOST_SET_OWN); 1296 - if (mt76_poll_msec(dev, MT_CONN_ON_LPCTL, 1297 - PCIE_LPCR_HOST_OWN_SYNC, 4, 50)) 1298 - break; 1299 - } 1300 - 1301 - if (i == MT7921_DRV_OWN_RETRY_COUNT) { 1302 - dev_err(dev->mt76.dev, "firmware own failed\n"); 1303 - clear_bit(MT76_STATE_PM, &mphy->state); 1304 - err = -EIO; 1305 - } 1306 - 1307 - pm->stats.last_doze_event = jiffies; 1308 - pm->stats.awake_time += pm->stats.last_doze_event - 1309 - pm->stats.last_wake_event; 1357 + err = __mt7921_mcu_fw_pmctrl(dev); 1310 1358 out: 1311 1359 mutex_unlock(&pm->mutex); 1312 1360 ··· 1301 1377 1302 1378 return err; 1303 1379 } 1380 + EXPORT_SYMBOL_GPL(mt7921_mcu_fw_pmctrl); 1304 1381 1305 - void 1306 - mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif) 1382 + int mt7921_mcu_set_beacon_filter(struct mt7921_dev *dev, 1383 + struct ieee80211_vif *vif, 1384 + bool enable) 1307 1385 { 1308 - struct mt7921_phy *phy = priv; 1309 - struct mt7921_dev *dev = phy->dev; 1310 1386 struct ieee80211_hw *hw = mt76_hw(dev); 1311 - int ret; 1387 + int err; 1312 1388 1313 - if (dev->pm.enable) 1314 - ret = mt7921_mcu_uni_bss_bcnft(dev, vif, true); 1315 - else 1316 - ret = mt7921_mcu_set_bss_pm(dev, vif, false); 1389 + if (enable) { 1390 + err = mt7921_mcu_uni_bss_bcnft(dev, vif, true); 1391 + if (err) 1392 + return err; 1317 1393 1318 - if (ret) 1319 - return; 1320 - 1321 - if (dev->pm.enable) { 1322 1394 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER; 1323 1395 ieee80211_hw_set(hw, CONNECTION_MONITOR); 1324 1396 mt76_set(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON); 1325 - } else { 1326 - vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER; 1327 - __clear_bit(IEEE80211_HW_CONNECTION_MONITOR, hw->flags); 1328 - mt76_clear(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON); 1397 + 1398 + return 0; 1329 1399 } 1400 + 1401 + err = mt7921_mcu_set_bss_pm(dev, vif, false); 1402 + if (err) 1403 + return err; 1404 + 1405 + vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER; 1406 + __clear_bit(IEEE80211_HW_CONNECTION_MONITOR, hw->flags); 1407 + mt76_clear(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON); 1408 + 1409 + return 0; 1330 1410 } 1331 1411 1332 1412 int mt7921_get_txpwr_info(struct mt7921_dev *dev, struct mt7921_txpwr *txpwr)
+21 -42
drivers/net/wireless/mediatek/mt76/mt7921/mcu.h
··· 259 259 u8 ant_id[4]; 260 260 } __packed; 261 261 262 - struct mt7921_mcu_peer_cap { 263 - struct mt7921_mcu_ant_id_config ant_id_config; 264 - 265 - u8 power_offset; 266 - u8 bw_selector; 267 - u8 change_bw_rate_n; 268 - u8 bw; 269 - u8 spe_idx; 270 - 271 - u8 g2; 272 - u8 g4; 273 - u8 g8; 274 - u8 g16; 275 - 276 - u8 mmss; 277 - u8 ampdu_factor; 278 - u8 rsv[1]; 279 - } __packed; 280 - 281 262 struct mt7921_txpwr_req { 282 263 u8 ver; 283 264 u8 action; ··· 274 293 struct mt7921_txpwr txpwr; 275 294 } __packed; 276 295 277 - struct mt7921_mcu_tx_done_event { 278 - u8 pid; 279 - u8 status; 280 - u16 seq; 296 + enum { 297 + TM_SWITCH_MODE, 298 + TM_SET_AT_CMD, 299 + TM_QUERY_AT_CMD, 300 + }; 281 301 282 - u8 wlan_idx; 283 - u8 tx_cnt; 284 - u16 tx_rate; 302 + enum { 303 + MT7921_TM_NORMAL, 304 + MT7921_TM_TESTMODE, 305 + MT7921_TM_ICAP, 306 + MT7921_TM_ICAP_OVERLAP, 307 + MT7921_TM_WIFISPECTRUM, 308 + }; 285 309 286 - u8 flag; 287 - u8 tid; 288 - u8 rsp_rate; 289 - u8 mcs; 310 + struct mt7921_rftest_cmd { 311 + u8 action; 312 + u8 rsv[3]; 313 + __le32 param0; 314 + __le32 param1; 315 + } __packed; 290 316 291 - u8 bw; 292 - u8 tx_pwr; 293 - u8 reason; 294 - u8 rsv0[1]; 295 - 296 - u32 delay; 297 - u32 timestamp; 298 - u32 applied_flag; 299 - 300 - u8 txs[28]; 301 - 302 - u8 rsv1[32]; 317 + struct mt7921_rftest_evt { 318 + __le32 param0; 319 + __le32 param1; 303 320 } __packed; 304 321 #endif
+127 -52
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
··· 29 29 #define MT7921_RX_MCU_RING_SIZE 512 30 30 31 31 #define MT7921_DRV_OWN_RETRY_COUNT 10 32 + #define MT7921_MCU_INIT_RETRY_COUNT 10 32 33 33 34 #define MT7921_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7961_1.bin" 34 35 #define MT7921_ROM_PATCH "mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin" 36 + 37 + #define MT7922_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7922_1.bin" 38 + #define MT7922_ROM_PATCH "mediatek/WIFI_MT7922_patch_mcu_1_1_hdr.bin" 35 39 36 40 #define MT7921_EEPROM_SIZE 3584 37 41 #define MT7921_TOKEN_SIZE 8192 38 42 39 43 #define MT7921_CFEND_RATE_DEFAULT 0x49 /* OFDM 24M */ 40 44 #define MT7921_CFEND_RATE_11B 0x03 /* 11B LP, 11M */ 41 - #define MT7921_5G_RATE_DEFAULT 0x4b /* OFDM 6M */ 42 - #define MT7921_2G_RATE_DEFAULT 0x0 /* CCK 1M */ 43 45 44 46 #define MT7921_SKU_RATE_NUM 161 45 47 #define MT7921_SKU_MAX_DELTA_IDX MT7921_SKU_RATE_NUM 46 48 #define MT7921_SKU_TABLE_SIZE (MT7921_SKU_RATE_NUM + 1) 49 + 50 + #define MT7921_SDIO_HDR_TX_BYTES GENMASK(15, 0) 51 + #define MT7921_SDIO_HDR_PKT_TYPE GENMASK(17, 16) 52 + 53 + enum mt7921_sdio_pkt_type { 54 + MT7921_SDIO_TXD, 55 + MT7921_SDIO_DATA, 56 + MT7921_SDIO_CMD, 57 + MT7921_SDIO_FWDL, 58 + }; 59 + 60 + struct mt7921_sdio_intr { 61 + u32 isr; 62 + struct { 63 + u32 wtqcr[16]; 64 + } tx; 65 + struct { 66 + u16 num[2]; 67 + u16 len0[16]; 68 + u16 len1[128]; 69 + } rx; 70 + u32 rec_mb[2]; 71 + } __packed; 47 72 48 73 #define to_rssi(field, rxv) ((FIELD_GET(field, rxv) - 220) / 2) 49 74 #define to_rcpi(rssi) (2 * (rssi) + 220) ··· 89 64 MT7921_RXQ_MCU_WM = 0, 90 65 }; 91 66 92 - struct mt7921_sta_stats { 93 - struct rate_info prob_rate; 94 - struct rate_info tx_rate; 95 - 96 - unsigned long per; 97 - unsigned long changed; 98 - unsigned long jiffies; 99 - }; 100 - 101 67 struct mt7921_sta_key_conf { 102 68 s8 keyidx; 103 69 u8 key[16]; ··· 99 83 100 84 struct mt7921_vif *vif; 101 85 102 - struct list_head stats_list; 103 86 struct list_head poll_list; 104 87 u32 airtime_ac[8]; 105 88 106 - struct mt7921_sta_stats stats; 107 - 89 + unsigned long last_txs; 108 90 unsigned long ampdu_state; 91 + struct mt76_sta_stats stats; 109 92 110 93 struct mt7921_sta_key_conf bip; 111 - 112 - unsigned long next_txs_ts; 113 94 }; 114 95 115 96 DECLARE_EWMA(rssi, 10, 8); ··· 130 117 u32 rts_cnt; 131 118 u32 rts_retries_cnt; 132 119 u32 ba_miss_cnt; 120 + 121 + u32 tx_bf_ibf_ppdu_cnt; 122 + u32 tx_bf_ebf_ppdu_cnt; 123 + u32 tx_bf_rx_fb_all_cnt; 124 + u32 tx_bf_rx_fb_he_cnt; 125 + u32 tx_bf_rx_fb_vht_cnt; 126 + u32 tx_bf_rx_fb_ht_cnt; 127 + 128 + u32 tx_ampdu_cnt; 129 + u32 tx_mpdu_attempts_cnt; 130 + u32 tx_mpdu_success_cnt; 131 + u32 tx_pkt_ebf_cnt; 132 + u32 tx_pkt_ibf_cnt; 133 + 134 + u32 rx_mpdu_cnt; 135 + u32 rx_ampdu_cnt; 136 + u32 rx_ampdu_bytes_cnt; 137 + u32 rx_ba_cnt; 138 + 139 + u32 tx_amsdu[8]; 140 + u32 tx_amsdu_cnt; 133 141 }; 134 142 135 143 struct mt7921_phy { 136 144 struct mt76_phy *mt76; 137 145 struct mt7921_dev *dev; 138 146 139 - struct ieee80211_sband_iftype_data iftype[2][NUM_NL80211_IFTYPES]; 140 - 141 - struct ieee80211_vif *monitor_vif; 147 + struct ieee80211_sband_iftype_data iftype[NUM_NL80211_BANDS][NUM_NL80211_IFTYPES]; 142 148 143 149 u32 rxfilter; 144 150 u64 omac_mask; ··· 171 139 u32 ampdu_ref; 172 140 173 141 struct mib_stats mib; 174 - struct list_head stats_list; 175 142 176 143 u8 sta_work_count; 177 144 178 145 struct sk_buff_head scan_event_list; 179 146 struct delayed_work scan_work; 147 + }; 148 + 149 + #define mt7921_init_reset(dev) ((dev)->hif_ops->init_reset(dev)) 150 + #define mt7921_dev_reset(dev) ((dev)->hif_ops->reset(dev)) 151 + #define mt7921_mcu_init(dev) ((dev)->hif_ops->mcu_init(dev)) 152 + #define __mt7921_mcu_drv_pmctrl(dev) ((dev)->hif_ops->drv_own(dev)) 153 + #define __mt7921_mcu_fw_pmctrl(dev) ((dev)->hif_ops->fw_own(dev)) 154 + struct mt7921_hif_ops { 155 + int (*init_reset)(struct mt7921_dev *dev); 156 + int (*reset)(struct mt7921_dev *dev); 157 + int (*mcu_init)(struct mt7921_dev *dev); 158 + int (*drv_own)(struct mt7921_dev *dev); 159 + int (*fw_own)(struct mt7921_dev *dev); 180 160 }; 181 161 182 162 struct mt7921_dev { ··· 201 157 struct mt7921_phy phy; 202 158 struct tasklet_struct irq_tasklet; 203 159 204 - u16 chainmask; 205 - 206 160 struct work_struct reset_work; 207 161 bool hw_full_reset:1; 208 162 bool hw_init_done:1; 163 + bool fw_assert:1; 209 164 210 165 struct list_head sta_poll_list; 211 166 spinlock_t sta_poll_lock; ··· 213 170 214 171 struct mt76_connac_pm pm; 215 172 struct mt76_connac_coredump coredump; 173 + const struct mt7921_hif_ops *hif_ops; 216 174 }; 217 175 218 176 enum { ··· 291 247 int __mt7921_start(struct mt7921_phy *phy); 292 248 int mt7921_register_device(struct mt7921_dev *dev); 293 249 void mt7921_unregister_device(struct mt7921_dev *dev); 294 - int mt7921_eeprom_init(struct mt7921_dev *dev); 295 - void mt7921_eeprom_parse_band_config(struct mt7921_phy *phy); 296 - int mt7921_eeprom_get_target_power(struct mt7921_dev *dev, 297 - struct ieee80211_channel *chan, 298 - u8 chain_idx); 299 - void mt7921_eeprom_init_sku(struct mt7921_dev *dev); 300 250 int mt7921_dma_init(struct mt7921_dev *dev); 301 251 int mt7921_wpdma_reset(struct mt7921_dev *dev, bool force); 302 252 int mt7921_wpdma_reinit_cond(struct mt7921_dev *dev); 303 253 void mt7921_dma_cleanup(struct mt7921_dev *dev); 304 254 int mt7921_run_firmware(struct mt7921_dev *dev); 305 - int mt7921_mcu_init(struct mt7921_dev *dev); 306 255 int mt7921_mcu_add_key(struct mt7921_dev *dev, struct ieee80211_vif *vif, 307 256 struct mt7921_sta *msta, struct ieee80211_key_conf *key, 308 257 enum set_key_cmd cmd); ··· 361 324 return !mt76_get_field(dev, MT_WFDMA_DUMMY_CR, MT_WFDMA_NEED_REINIT); 362 325 } 363 326 327 + static inline void mt7921_mcu_tx_cleanup(struct mt7921_dev *dev) 328 + { 329 + mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false); 330 + mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WA], false); 331 + } 332 + 333 + static inline void mt7921_skb_add_sdio_hdr(struct sk_buff *skb, 334 + enum mt7921_sdio_pkt_type type) 335 + { 336 + u32 hdr; 337 + 338 + hdr = FIELD_PREP(MT7921_SDIO_HDR_TX_BYTES, skb->len + sizeof(hdr)) | 339 + FIELD_PREP(MT7921_SDIO_HDR_PKT_TYPE, type); 340 + 341 + put_unaligned_le32(hdr, skb_push(skb, sizeof(hdr))); 342 + } 343 + 364 344 int mt7921_mac_init(struct mt7921_dev *dev); 365 345 bool mt7921_mac_wtbl_update(struct mt7921_dev *dev, int idx, u32 mask); 366 346 void mt7921_mac_reset_counters(struct mt7921_phy *phy); 367 - void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi, 368 - struct sk_buff *skb, struct mt76_wcid *wcid, 369 - struct ieee80211_key_conf *key, bool beacon); 370 347 void mt7921_mac_set_timing(struct mt7921_phy *phy); 371 - int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb); 372 - void mt7921_mac_fill_rx_vector(struct mt7921_dev *dev, struct sk_buff *skb); 373 - void mt7921_mac_tx_free(struct mt7921_dev *dev, struct sk_buff *skb); 374 348 int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, 375 349 struct ieee80211_sta *sta); 376 350 void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif, ··· 390 342 struct ieee80211_sta *sta); 391 343 void mt7921_mac_work(struct work_struct *work); 392 344 void mt7921_mac_reset_work(struct work_struct *work); 345 + void mt7921_mac_update_mib_stats(struct mt7921_phy *phy); 393 346 void mt7921_reset(struct mt76_dev *mdev); 394 - void mt7921_tx_cleanup(struct mt7921_dev *dev); 395 - int mt7921_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 396 - enum mt76_txq_id qid, struct mt76_wcid *wcid, 397 - struct ieee80211_sta *sta, 398 - struct mt76_tx_info *tx_info); 347 + int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 348 + enum mt76_txq_id qid, struct mt76_wcid *wcid, 349 + struct ieee80211_sta *sta, 350 + struct mt76_tx_info *tx_info); 399 351 400 352 void mt7921_tx_worker(struct mt76_worker *w); 401 - void mt7921_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e); 353 + void mt7921e_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e); 402 354 int mt7921_init_tx_queues(struct mt7921_phy *phy, int idx, int n_desc); 403 355 void mt7921_tx_token_put(struct mt7921_dev *dev); 404 356 void mt7921_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, 405 357 struct sk_buff *skb); 406 358 void mt7921_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps); 407 359 void mt7921_stats_work(struct work_struct *work); 408 - void mt7921_txp_skb_unmap(struct mt76_dev *dev, 409 - struct mt76_txwi_cache *txwi); 410 360 void mt7921_set_stream_he_caps(struct mt7921_phy *phy); 411 361 void mt7921_update_channel(struct mt76_phy *mphy); 412 362 int mt7921_init_debugfs(struct mt7921_dev *dev); 413 363 364 + int mt7921_mcu_set_beacon_filter(struct mt7921_dev *dev, 365 + struct ieee80211_vif *vif, 366 + bool enable); 414 367 int mt7921_mcu_uni_tx_ba(struct mt7921_dev *dev, 415 368 struct ieee80211_ampdu_params *params, 416 369 bool enable); ··· 420 371 bool enable); 421 372 void mt7921_scan_work(struct work_struct *work); 422 373 int mt7921_mcu_uni_bss_ps(struct mt7921_dev *dev, struct ieee80211_vif *vif); 423 - int mt7921_mcu_uni_bss_bcnft(struct mt7921_dev *dev, struct ieee80211_vif *vif, 424 - bool enable); 425 - int mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif, 426 - bool enable); 427 - int __mt7921_mcu_drv_pmctrl(struct mt7921_dev *dev); 428 374 int mt7921_mcu_drv_pmctrl(struct mt7921_dev *dev); 429 375 int mt7921_mcu_fw_pmctrl(struct mt7921_dev *dev); 430 376 void mt7921_pm_wake_work(struct work_struct *work); 431 377 void mt7921_pm_power_save_work(struct work_struct *work); 432 378 bool mt7921_wait_for_mcu_init(struct mt7921_dev *dev); 433 - int mt7921_mac_set_beacon_filter(struct mt7921_phy *phy, 434 - struct ieee80211_vif *vif, 435 - bool enable); 436 - void mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif); 437 379 void mt7921_coredump_work(struct work_struct *work); 438 380 int mt7921_wfsys_reset(struct mt7921_dev *dev); 439 381 int mt7921_get_txpwr_info(struct mt7921_dev *dev, struct mt7921_txpwr *txpwr); 382 + int mt7921_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 383 + void *data, int len); 384 + int mt7921_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg, 385 + struct netlink_callback *cb, void *data, int len); 386 + void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi, 387 + struct sk_buff *skb, struct mt76_wcid *wcid, 388 + struct ieee80211_key_conf *key, int pid, 389 + bool beacon); 390 + void mt7921_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi); 391 + void mt7921_mac_sta_poll(struct mt7921_dev *dev); 392 + int mt7921_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb, 393 + int cmd, int *wait_seq); 394 + int mt7921_mcu_parse_response(struct mt76_dev *mdev, int cmd, 395 + struct sk_buff *skb, int seq); 396 + int mt7921_mcu_restart(struct mt76_dev *dev); 397 + 398 + void mt7921e_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, 399 + struct sk_buff *skb); 400 + int mt7921e_mac_reset(struct mt7921_dev *dev); 401 + int mt7921e_mcu_init(struct mt7921_dev *dev); 402 + int mt7921s_wfsys_reset(struct mt7921_dev *dev); 403 + int mt7921s_mac_reset(struct mt7921_dev *dev); 404 + int mt7921s_init_reset(struct mt7921_dev *dev); 405 + int mt7921e_mcu_drv_pmctrl(struct mt7921_dev *dev); 406 + int mt7921e_mcu_fw_pmctrl(struct mt7921_dev *dev); 407 + 408 + int mt7921s_mcu_init(struct mt7921_dev *dev); 409 + int mt7921s_mcu_drv_pmctrl(struct mt7921_dev *dev); 410 + int mt7921s_mcu_fw_pmctrl(struct mt7921_dev *dev); 411 + int mt7921s_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 412 + enum mt76_txq_id qid, struct mt76_wcid *wcid, 413 + struct ieee80211_sta *sta, 414 + struct mt76_tx_info *tx_info); 415 + void mt7921s_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e); 416 + bool mt7921s_tx_status_data(struct mt76_dev *mdev, u8 *update); 440 417 #endif
+58 -8
drivers/net/wireless/mediatek/mt76/mt7921/pci.c
··· 14 14 15 15 static const struct pci_device_id mt7921_pci_device_table[] = { 16 16 { PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, 0x7961) }, 17 + { PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, 0x7922) }, 17 18 { }, 18 19 }; 20 + 21 + static bool mt7921_disable_aspm; 22 + module_param_named(disable_aspm, mt7921_disable_aspm, bool, 0644); 23 + MODULE_PARM_DESC(disable_aspm, "disable PCI ASPM support"); 19 24 20 25 static void 21 26 mt7921_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q) ··· 93 88 napi_schedule(&dev->mt76.napi[MT_RXQ_MAIN]); 94 89 } 95 90 91 + static int mt7921e_init_reset(struct mt7921_dev *dev) 92 + { 93 + return mt7921_wpdma_reset(dev, true); 94 + } 95 + 96 + static void mt7921e_unregister_device(struct mt7921_dev *dev) 97 + { 98 + int i; 99 + struct mt76_connac_pm *pm = &dev->pm; 100 + 101 + mt76_unregister_device(&dev->mt76); 102 + mt76_for_each_q_rx(&dev->mt76, i) 103 + napi_disable(&dev->mt76.napi[i]); 104 + cancel_delayed_work_sync(&pm->ps_work); 105 + cancel_work_sync(&pm->wake_work); 106 + 107 + mt7921_tx_token_put(dev); 108 + mt7921_mcu_drv_pmctrl(dev); 109 + mt7921_dma_cleanup(dev); 110 + mt7921_wfsys_reset(dev); 111 + mt7921_mcu_exit(dev); 112 + 113 + tasklet_disable(&dev->irq_tasklet); 114 + mt76_free_device(&dev->mt76); 115 + } 116 + 96 117 static int mt7921_pci_probe(struct pci_dev *pdev, 97 118 const struct pci_device_id *id) 98 119 { 99 120 static const struct mt76_driver_ops drv_ops = { 100 121 /* txwi_size = txd size + txp size */ 101 122 .txwi_size = MT_TXD_SIZE + sizeof(struct mt7921_txp_common), 102 - .drv_flags = MT_DRV_TXWI_NO_FREE | MT_DRV_HW_MGMT_TXQ | 103 - MT_DRV_AMSDU_OFFLOAD, 123 + .drv_flags = MT_DRV_TXWI_NO_FREE | MT_DRV_HW_MGMT_TXQ, 104 124 .survey_flags = SURVEY_INFO_TIME_TX | 105 125 SURVEY_INFO_TIME_RX | 106 126 SURVEY_INFO_TIME_BSS_RX, 107 127 .token_size = MT7921_TOKEN_SIZE, 108 - .tx_prepare_skb = mt7921_tx_prepare_skb, 109 - .tx_complete_skb = mt7921_tx_complete_skb, 110 - .rx_skb = mt7921_queue_rx_skb, 128 + .tx_prepare_skb = mt7921e_tx_prepare_skb, 129 + .tx_complete_skb = mt7921e_tx_complete_skb, 130 + .rx_skb = mt7921e_queue_rx_skb, 111 131 .rx_poll_complete = mt7921_rx_poll_complete, 112 132 .sta_ps = mt7921_sta_ps, 113 133 .sta_add = mt7921_mac_sta_add, ··· 140 110 .sta_remove = mt7921_mac_sta_remove, 141 111 .update_survey = mt7921_update_channel, 142 112 }; 113 + 114 + static const struct mt7921_hif_ops mt7921_pcie_ops = { 115 + .init_reset = mt7921e_init_reset, 116 + .reset = mt7921e_mac_reset, 117 + .mcu_init = mt7921e_mcu_init, 118 + .drv_own = mt7921e_mcu_drv_pmctrl, 119 + .fw_own = mt7921e_mcu_fw_pmctrl, 120 + }; 121 + 143 122 struct mt7921_dev *dev; 144 123 struct mt76_dev *mdev; 145 124 int ret; ··· 167 128 if (ret < 0) 168 129 return ret; 169 130 170 - ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 131 + ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); 171 132 if (ret) 172 133 goto err_free_pci_vec; 173 134 174 - mt76_pci_disable_aspm(pdev); 135 + if (mt7921_disable_aspm) 136 + mt76_pci_disable_aspm(pdev); 175 137 176 138 mdev = mt76_alloc_device(&pdev->dev, sizeof(*dev), &mt7921_ops, 177 139 &drv_ops); ··· 182 142 } 183 143 184 144 dev = container_of(mdev, struct mt7921_dev, mt76); 145 + dev->hif_ops = &mt7921_pcie_ops; 185 146 186 147 mt76_mmio_init(&dev->mt76, pcim_iomap_table(pdev)[0]); 187 148 tasklet_init(&dev->irq_tasklet, mt7921_irq_tasklet, (unsigned long)dev); ··· 198 157 IRQF_SHARED, KBUILD_MODNAME, dev); 199 158 if (ret) 200 159 goto err_free_dev; 160 + 161 + ret = mt7921_dma_init(dev); 162 + if (ret) 163 + goto err_free_irq; 201 164 202 165 ret = mt7921_register_device(dev); 203 166 if (ret) ··· 224 179 struct mt76_dev *mdev = pci_get_drvdata(pdev); 225 180 struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 226 181 227 - mt7921_unregister_device(dev); 182 + mt7921e_unregister_device(dev); 228 183 devm_free_irq(&pdev->dev, pdev->irq, dev); 229 184 pci_free_irq_vectors(pdev); 230 185 } ··· 342 297 MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN); 343 298 344 299 mt76_worker_enable(&mdev->tx_worker); 300 + 301 + local_bh_disable(); 345 302 mt76_for_each_q_rx(mdev, i) { 346 303 napi_enable(&mdev->napi[i]); 347 304 napi_schedule(&mdev->napi[i]); 348 305 } 349 306 napi_enable(&mdev->tx_napi); 350 307 napi_schedule(&mdev->tx_napi); 308 + local_bh_enable(); 351 309 352 310 /* restore previous ds setting */ 353 311 if (!pm->ds_enable) ··· 379 331 MODULE_DEVICE_TABLE(pci, mt7921_pci_device_table); 380 332 MODULE_FIRMWARE(MT7921_FIRMWARE_WM); 381 333 MODULE_FIRMWARE(MT7921_ROM_PATCH); 334 + MODULE_FIRMWARE(MT7922_FIRMWARE_WM); 335 + MODULE_FIRMWARE(MT7922_ROM_PATCH); 382 336 MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); 383 337 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 384 338 MODULE_LICENSE("Dual BSD/GPL");
+348
drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
··· 1 + // SPDX-License-Identifier: ISC 2 + /* Copyright (C) 2021 MediaTek Inc. */ 3 + 4 + #include "mt7921.h" 5 + #include "../dma.h" 6 + #include "mac.h" 7 + 8 + static void 9 + mt7921_write_hw_txp(struct mt7921_dev *dev, struct mt76_tx_info *tx_info, 10 + void *txp_ptr, u32 id) 11 + { 12 + struct mt7921_hw_txp *txp = txp_ptr; 13 + struct mt7921_txp_ptr *ptr = &txp->ptr[0]; 14 + int i, nbuf = tx_info->nbuf - 1; 15 + 16 + tx_info->buf[0].len = MT_TXD_SIZE + sizeof(*txp); 17 + tx_info->nbuf = 1; 18 + 19 + txp->msdu_id[0] = cpu_to_le16(id | MT_MSDU_ID_VALID); 20 + 21 + for (i = 0; i < nbuf; i++) { 22 + u16 len = tx_info->buf[i + 1].len & MT_TXD_LEN_MASK; 23 + u32 addr = tx_info->buf[i + 1].addr; 24 + 25 + if (i == nbuf - 1) 26 + len |= MT_TXD_LEN_LAST; 27 + 28 + if (i & 1) { 29 + ptr->buf1 = cpu_to_le32(addr); 30 + ptr->len1 = cpu_to_le16(len); 31 + ptr++; 32 + } else { 33 + ptr->buf0 = cpu_to_le32(addr); 34 + ptr->len0 = cpu_to_le16(len); 35 + } 36 + } 37 + } 38 + 39 + int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 40 + enum mt76_txq_id qid, struct mt76_wcid *wcid, 41 + struct ieee80211_sta *sta, 42 + struct mt76_tx_info *tx_info) 43 + { 44 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 45 + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb); 46 + struct ieee80211_key_conf *key = info->control.hw_key; 47 + struct mt76_txwi_cache *t; 48 + struct mt7921_txp_common *txp; 49 + int id, pid; 50 + u8 *txwi = (u8 *)txwi_ptr; 51 + 52 + if (unlikely(tx_info->skb->len <= ETH_HLEN)) 53 + return -EINVAL; 54 + 55 + if (!wcid) 56 + wcid = &dev->mt76.global_wcid; 57 + 58 + t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size); 59 + t->skb = tx_info->skb; 60 + 61 + id = mt76_token_consume(mdev, &t); 62 + if (id < 0) 63 + return id; 64 + 65 + if (sta) { 66 + struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; 67 + 68 + if (time_after(jiffies, msta->last_txs + HZ / 4)) { 69 + info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; 70 + msta->last_txs = jiffies; 71 + } 72 + } 73 + 74 + pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb); 75 + mt7921_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key, 76 + pid, false); 77 + 78 + txp = (struct mt7921_txp_common *)(txwi + MT_TXD_SIZE); 79 + memset(txp, 0, sizeof(struct mt7921_txp_common)); 80 + mt7921_write_hw_txp(dev, tx_info, txp, id); 81 + 82 + tx_info->skb = DMA_DUMMY_DATA; 83 + 84 + return 0; 85 + } 86 + 87 + static void 88 + mt7921_txp_skb_unmap(struct mt76_dev *dev, struct mt76_txwi_cache *t) 89 + { 90 + struct mt7921_txp_common *txp; 91 + int i; 92 + 93 + txp = mt7921_txwi_to_txp(dev, t); 94 + 95 + for (i = 0; i < ARRAY_SIZE(txp->hw.ptr); i++) { 96 + struct mt7921_txp_ptr *ptr = &txp->hw.ptr[i]; 97 + bool last; 98 + u16 len; 99 + 100 + len = le16_to_cpu(ptr->len0); 101 + last = len & MT_TXD_LEN_LAST; 102 + len &= MT_TXD_LEN_MASK; 103 + dma_unmap_single(dev->dev, le32_to_cpu(ptr->buf0), len, 104 + DMA_TO_DEVICE); 105 + if (last) 106 + break; 107 + 108 + len = le16_to_cpu(ptr->len1); 109 + last = len & MT_TXD_LEN_LAST; 110 + len &= MT_TXD_LEN_MASK; 111 + dma_unmap_single(dev->dev, le32_to_cpu(ptr->buf1), len, 112 + DMA_TO_DEVICE); 113 + if (last) 114 + break; 115 + } 116 + } 117 + 118 + static void 119 + mt7921_txwi_free(struct mt7921_dev *dev, struct mt76_txwi_cache *t, 120 + struct ieee80211_sta *sta, bool clear_status, 121 + struct list_head *free_list) 122 + { 123 + struct mt76_dev *mdev = &dev->mt76; 124 + __le32 *txwi; 125 + u16 wcid_idx; 126 + 127 + mt7921_txp_skb_unmap(mdev, t); 128 + if (!t->skb) 129 + goto out; 130 + 131 + txwi = (__le32 *)mt76_get_txwi_ptr(mdev, t); 132 + if (sta) { 133 + struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv; 134 + 135 + if (likely(t->skb->protocol != cpu_to_be16(ETH_P_PAE))) 136 + mt7921_tx_check_aggr(sta, txwi); 137 + 138 + wcid_idx = wcid->idx; 139 + } else { 140 + wcid_idx = FIELD_GET(MT_TXD1_WLAN_IDX, le32_to_cpu(txwi[1])); 141 + } 142 + 143 + __mt76_tx_complete_skb(mdev, wcid_idx, t->skb, free_list); 144 + 145 + out: 146 + t->skb = NULL; 147 + mt76_put_txwi(mdev, t); 148 + } 149 + 150 + static void 151 + mt7921_mac_tx_free(struct mt7921_dev *dev, struct sk_buff *skb) 152 + { 153 + struct mt7921_tx_free *free = (struct mt7921_tx_free *)skb->data; 154 + struct mt76_dev *mdev = &dev->mt76; 155 + struct mt76_txwi_cache *txwi; 156 + struct ieee80211_sta *sta = NULL; 157 + LIST_HEAD(free_list); 158 + struct sk_buff *tmp; 159 + bool wake = false; 160 + u8 i, count; 161 + 162 + /* clean DMA queues and unmap buffers first */ 163 + mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_PSD], false); 164 + mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_BE], false); 165 + 166 + /* TODO: MT_TX_FREE_LATENCY is msdu time from the TXD is queued into PLE, 167 + * to the time ack is received or dropped by hw (air + hw queue time). 168 + * Should avoid accessing WTBL to get Tx airtime, and use it instead. 169 + */ 170 + count = FIELD_GET(MT_TX_FREE_MSDU_CNT, le16_to_cpu(free->ctrl)); 171 + for (i = 0; i < count; i++) { 172 + u32 msdu, info = le32_to_cpu(free->info[i]); 173 + u8 stat; 174 + 175 + /* 1'b1: new wcid pair. 176 + * 1'b0: msdu_id with the same 'wcid pair' as above. 177 + */ 178 + if (info & MT_TX_FREE_PAIR) { 179 + struct mt7921_sta *msta; 180 + struct mt76_wcid *wcid; 181 + u16 idx; 182 + 183 + count++; 184 + idx = FIELD_GET(MT_TX_FREE_WLAN_ID, info); 185 + wcid = rcu_dereference(dev->mt76.wcid[idx]); 186 + sta = wcid_to_sta(wcid); 187 + if (!sta) 188 + continue; 189 + 190 + msta = container_of(wcid, struct mt7921_sta, wcid); 191 + spin_lock_bh(&dev->sta_poll_lock); 192 + if (list_empty(&msta->poll_list)) 193 + list_add_tail(&msta->poll_list, &dev->sta_poll_list); 194 + spin_unlock_bh(&dev->sta_poll_lock); 195 + continue; 196 + } 197 + 198 + msdu = FIELD_GET(MT_TX_FREE_MSDU_ID, info); 199 + stat = FIELD_GET(MT_TX_FREE_STATUS, info); 200 + 201 + txwi = mt76_token_release(mdev, msdu, &wake); 202 + if (!txwi) 203 + continue; 204 + 205 + mt7921_txwi_free(dev, txwi, sta, stat, &free_list); 206 + } 207 + 208 + if (wake) 209 + mt76_set_tx_blocked(&dev->mt76, false); 210 + 211 + napi_consume_skb(skb, 1); 212 + 213 + list_for_each_entry_safe(skb, tmp, &free_list, list) { 214 + skb_list_del_init(skb); 215 + napi_consume_skb(skb, 1); 216 + } 217 + 218 + rcu_read_lock(); 219 + mt7921_mac_sta_poll(dev); 220 + rcu_read_unlock(); 221 + 222 + mt76_worker_schedule(&dev->mt76.tx_worker); 223 + } 224 + 225 + void mt7921e_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, 226 + struct sk_buff *skb) 227 + { 228 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 229 + __le32 *rxd = (__le32 *)skb->data; 230 + enum rx_pkt_type type; 231 + 232 + type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 233 + 234 + switch (type) { 235 + case PKT_TYPE_TXRX_NOTIFY: 236 + mt7921_mac_tx_free(dev, skb); 237 + break; 238 + default: 239 + mt7921_queue_rx_skb(mdev, q, skb); 240 + break; 241 + } 242 + } 243 + 244 + void mt7921e_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e) 245 + { 246 + if (!e->txwi) { 247 + dev_kfree_skb_any(e->skb); 248 + return; 249 + } 250 + 251 + /* error path */ 252 + if (e->skb == DMA_DUMMY_DATA) { 253 + struct mt76_txwi_cache *t; 254 + struct mt7921_txp_common *txp; 255 + u16 token; 256 + 257 + txp = mt7921_txwi_to_txp(mdev, e->txwi); 258 + token = le16_to_cpu(txp->hw.msdu_id[0]) & ~MT_MSDU_ID_VALID; 259 + t = mt76_token_put(mdev, token); 260 + e->skb = t ? t->skb : NULL; 261 + } 262 + 263 + if (e->skb) 264 + mt76_tx_complete_skb(mdev, e->wcid, e->skb); 265 + } 266 + 267 + void mt7921_tx_token_put(struct mt7921_dev *dev) 268 + { 269 + struct mt76_txwi_cache *txwi; 270 + int id; 271 + 272 + spin_lock_bh(&dev->mt76.token_lock); 273 + idr_for_each_entry(&dev->mt76.token, txwi, id) { 274 + mt7921_txwi_free(dev, txwi, NULL, false, NULL); 275 + dev->mt76.token_count--; 276 + } 277 + spin_unlock_bh(&dev->mt76.token_lock); 278 + idr_destroy(&dev->mt76.token); 279 + } 280 + 281 + int mt7921e_mac_reset(struct mt7921_dev *dev) 282 + { 283 + int i, err; 284 + 285 + mt7921e_mcu_drv_pmctrl(dev); 286 + 287 + mt76_connac_free_pending_tx_skbs(&dev->pm, NULL); 288 + 289 + mt76_wr(dev, MT_WFDMA0_HOST_INT_ENA, 0); 290 + mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0); 291 + 292 + set_bit(MT76_RESET, &dev->mphy.state); 293 + set_bit(MT76_MCU_RESET, &dev->mphy.state); 294 + wake_up(&dev->mt76.mcu.wait); 295 + skb_queue_purge(&dev->mt76.mcu.res_q); 296 + 297 + mt76_txq_schedule_all(&dev->mphy); 298 + 299 + mt76_worker_disable(&dev->mt76.tx_worker); 300 + napi_disable(&dev->mt76.napi[MT_RXQ_MAIN]); 301 + napi_disable(&dev->mt76.napi[MT_RXQ_MCU]); 302 + napi_disable(&dev->mt76.napi[MT_RXQ_MCU_WA]); 303 + napi_disable(&dev->mt76.tx_napi); 304 + 305 + mt7921_tx_token_put(dev); 306 + idr_init(&dev->mt76.token); 307 + 308 + mt7921_wpdma_reset(dev, true); 309 + 310 + local_bh_disable(); 311 + mt76_for_each_q_rx(&dev->mt76, i) { 312 + napi_enable(&dev->mt76.napi[i]); 313 + napi_schedule(&dev->mt76.napi[i]); 314 + } 315 + local_bh_enable(); 316 + 317 + clear_bit(MT76_MCU_RESET, &dev->mphy.state); 318 + 319 + mt76_wr(dev, MT_WFDMA0_HOST_INT_ENA, 320 + MT_INT_RX_DONE_ALL | MT_INT_TX_DONE_ALL | 321 + MT_INT_MCU_CMD); 322 + mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0xff); 323 + 324 + err = mt7921_run_firmware(dev); 325 + if (err) 326 + goto out; 327 + 328 + err = mt7921_mcu_set_eeprom(dev); 329 + if (err) 330 + goto out; 331 + 332 + err = mt7921_mac_init(dev); 333 + if (err) 334 + goto out; 335 + 336 + err = __mt7921_start(&dev->phy); 337 + out: 338 + clear_bit(MT76_RESET, &dev->mphy.state); 339 + 340 + local_bh_disable(); 341 + napi_enable(&dev->mt76.tx_napi); 342 + napi_schedule(&dev->mt76.tx_napi); 343 + local_bh_enable(); 344 + 345 + mt76_worker_enable(&dev->mt76.tx_worker); 346 + 347 + return err; 348 + }
+115
drivers/net/wireless/mediatek/mt76/mt7921/pci_mcu.c
··· 1 + // SPDX-License-Identifier: ISC 2 + /* Copyright (C) 2021 MediaTek Inc. */ 3 + 4 + #include "mt7921.h" 5 + #include "mcu.h" 6 + 7 + static int mt7921e_driver_own(struct mt7921_dev *dev) 8 + { 9 + u32 reg = mt7921_reg_map_l1(dev, MT_TOP_LPCR_HOST_BAND0); 10 + 11 + mt76_wr(dev, reg, MT_TOP_LPCR_HOST_DRV_OWN); 12 + if (!mt76_poll_msec(dev, reg, MT_TOP_LPCR_HOST_FW_OWN, 13 + 0, 500)) { 14 + dev_err(dev->mt76.dev, "Timeout for driver own\n"); 15 + return -EIO; 16 + } 17 + 18 + return 0; 19 + } 20 + 21 + static int 22 + mt7921_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, 23 + int cmd, int *seq) 24 + { 25 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 26 + enum mt76_mcuq_id txq = MT_MCUQ_WM; 27 + int ret; 28 + 29 + ret = mt7921_mcu_fill_message(mdev, skb, cmd, seq); 30 + if (ret) 31 + return ret; 32 + 33 + if (cmd == MCU_CMD_FW_SCATTER) 34 + txq = MT_MCUQ_FWDL; 35 + 36 + return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[txq], skb, 0); 37 + } 38 + 39 + int mt7921e_mcu_init(struct mt7921_dev *dev) 40 + { 41 + static const struct mt76_mcu_ops mt7921_mcu_ops = { 42 + .headroom = sizeof(struct mt7921_mcu_txd), 43 + .mcu_skb_send_msg = mt7921_mcu_send_message, 44 + .mcu_parse_response = mt7921_mcu_parse_response, 45 + .mcu_restart = mt7921_mcu_restart, 46 + }; 47 + int err; 48 + 49 + dev->mt76.mcu_ops = &mt7921_mcu_ops; 50 + 51 + err = mt7921e_driver_own(dev); 52 + if (err) 53 + return err; 54 + 55 + err = mt7921_run_firmware(dev); 56 + 57 + mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false); 58 + 59 + return err; 60 + } 61 + 62 + int mt7921e_mcu_drv_pmctrl(struct mt7921_dev *dev) 63 + { 64 + struct mt76_phy *mphy = &dev->mt76.phy; 65 + struct mt76_connac_pm *pm = &dev->pm; 66 + int i, err = 0; 67 + 68 + for (i = 0; i < MT7921_DRV_OWN_RETRY_COUNT; i++) { 69 + mt76_wr(dev, MT_CONN_ON_LPCTL, PCIE_LPCR_HOST_CLR_OWN); 70 + if (mt76_poll_msec(dev, MT_CONN_ON_LPCTL, 71 + PCIE_LPCR_HOST_OWN_SYNC, 0, 50)) 72 + break; 73 + } 74 + 75 + if (i == MT7921_DRV_OWN_RETRY_COUNT) { 76 + dev_err(dev->mt76.dev, "driver own failed\n"); 77 + err = -EIO; 78 + goto out; 79 + } 80 + 81 + mt7921_wpdma_reinit_cond(dev); 82 + clear_bit(MT76_STATE_PM, &mphy->state); 83 + 84 + pm->stats.last_wake_event = jiffies; 85 + pm->stats.doze_time += pm->stats.last_wake_event - 86 + pm->stats.last_doze_event; 87 + out: 88 + return err; 89 + } 90 + 91 + int mt7921e_mcu_fw_pmctrl(struct mt7921_dev *dev) 92 + { 93 + struct mt76_phy *mphy = &dev->mt76.phy; 94 + struct mt76_connac_pm *pm = &dev->pm; 95 + int i, err = 0; 96 + 97 + for (i = 0; i < MT7921_DRV_OWN_RETRY_COUNT; i++) { 98 + mt76_wr(dev, MT_CONN_ON_LPCTL, PCIE_LPCR_HOST_SET_OWN); 99 + if (mt76_poll_msec(dev, MT_CONN_ON_LPCTL, 100 + PCIE_LPCR_HOST_OWN_SYNC, 4, 50)) 101 + break; 102 + } 103 + 104 + if (i == MT7921_DRV_OWN_RETRY_COUNT) { 105 + dev_err(dev->mt76.dev, "firmware own failed\n"); 106 + clear_bit(MT76_STATE_PM, &mphy->state); 107 + err = -EIO; 108 + } 109 + 110 + pm->stats.last_doze_event = jiffies; 111 + pm->stats.awake_time += pm->stats.last_doze_event - 112 + pm->stats.last_wake_event; 113 + 114 + return err; 115 + }
+45 -13
drivers/net/wireless/mediatek/mt76/mt7921/regs.h
··· 14 14 #define MT_MCU_INT_EVENT_SER_TRIGGER BIT(2) 15 15 #define MT_MCU_INT_EVENT_RESET_DONE BIT(3) 16 16 17 - #define MT_PLE_BASE 0x8000 17 + #define MT_PLE_BASE 0x820c0000 18 18 #define MT_PLE(ofs) (MT_PLE_BASE + (ofs)) 19 19 20 20 #define MT_PLE_FL_Q0_CTRL MT_PLE(0x1b0) ··· 26 26 ((n) << 2)) 27 27 #define MT_PLE_AMSDU_PACK_MSDU_CNT(n) MT_PLE(0x10e0 + ((n) << 2)) 28 28 29 - #define MT_MDP_BASE 0xf000 29 + #define MT_MDP_BASE 0x820cd000 30 30 #define MT_MDP(ofs) (MT_MDP_BASE + (ofs)) 31 31 32 32 #define MT_MDP_DCR0 MT_MDP(0x000) ··· 49 49 #define MT_MDP_TO_WM 1 50 50 51 51 /* TMAC: band 0(0x21000), band 1(0xa1000) */ 52 - #define MT_WF_TMAC_BASE(_band) ((_band) ? 0xa1000 : 0x21000) 52 + #define MT_WF_TMAC_BASE(_band) ((_band) ? 0x820f4000 : 0x820e4000) 53 53 #define MT_WF_TMAC(_band, ofs) (MT_WF_TMAC_BASE(_band) + (ofs)) 54 54 55 55 #define MT_TMAC_TCR0(_band) MT_WF_TMAC(_band, 0) ··· 74 74 #define MT_TMAC_TRCR0(_band) MT_WF_TMAC(_band, 0x09c) 75 75 #define MT_TMAC_TFCR0(_band) MT_WF_TMAC(_band, 0x1e0) 76 76 77 - #define MT_WF_DMA_BASE(_band) ((_band) ? 0xa1e00 : 0x21e00) 77 + #define MT_WF_DMA_BASE(_band) ((_band) ? 0x820f7000 : 0x820e7000) 78 78 #define MT_WF_DMA(_band, ofs) (MT_WF_DMA_BASE(_band) + (ofs)) 79 79 80 80 #define MT_DMA_DCR0(_band) MT_WF_DMA(_band, 0x000) ··· 82 82 #define MT_DMA_DCR0_RXD_G5_EN BIT(23) 83 83 84 84 /* LPON: band 0(0x24200), band 1(0xa4200) */ 85 - #define MT_WF_LPON_BASE(_band) ((_band) ? 0xa4200 : 0x24200) 85 + #define MT_WF_LPON_BASE(_band) ((_band) ? 0x820fb000 : 0x820eb000) 86 86 #define MT_WF_LPON(_band, ofs) (MT_WF_LPON_BASE(_band) + (ofs)) 87 87 88 88 #define MT_LPON_UTTR0(_band) MT_WF_LPON(_band, 0x080) ··· 92 92 #define MT_LPON_TCR_SW_MODE GENMASK(1, 0) 93 93 #define MT_LPON_TCR_SW_WRITE BIT(0) 94 94 95 + /* ETBF: band 0(0x24000), band 1(0xa4000) */ 96 + #define MT_WF_ETBF_BASE(_band) ((_band) ? 0x820fa000 : 0x820ea000) 97 + #define MT_WF_ETBF(_band, ofs) (MT_WF_ETBF_BASE(_band) + (ofs)) 98 + 99 + #define MT_ETBF_TX_APP_CNT(_band) MT_WF_ETBF(_band, 0x150) 100 + #define MT_ETBF_TX_IBF_CNT GENMASK(31, 16) 101 + #define MT_ETBF_TX_EBF_CNT GENMASK(15, 0) 102 + 103 + #define MT_ETBF_RX_FB_CNT(_band) MT_WF_ETBF(_band, 0x158) 104 + #define MT_ETBF_RX_FB_ALL GENMASK(31, 24) 105 + #define MT_ETBF_RX_FB_HE GENMASK(23, 16) 106 + #define MT_ETBF_RX_FB_VHT GENMASK(15, 8) 107 + #define MT_ETBF_RX_FB_HT GENMASK(7, 0) 108 + 95 109 /* MIB: band 0(0x24800), band 1(0xa4800) */ 96 - #define MT_WF_MIB_BASE(_band) ((_band) ? 0xa4800 : 0x24800) 110 + #define MT_WF_MIB_BASE(_band) ((_band) ? 0x820fd000 : 0x820ed000) 97 111 #define MT_WF_MIB(_band, ofs) (MT_WF_MIB_BASE(_band) + (ofs)) 112 + 113 + #define MT_MIB_SCR1(_band) MT_WF_MIB(_band, 0x004) 114 + #define MT_MIB_TXDUR_EN BIT(8) 115 + #define MT_MIB_RXDUR_EN BIT(9) 98 116 99 117 #define MT_MIB_SDR3(_band) MT_WF_MIB(_band, 0x698) 100 118 #define MT_MIB_SDR3_FCS_ERR_MASK GENMASK(31, 16) 101 119 120 + #define MT_MIB_SDR5(_band) MT_WF_MIB(_band, 0x780) 121 + 102 122 #define MT_MIB_SDR9(_band) MT_WF_MIB(_band, 0x02c) 103 123 #define MT_MIB_SDR9_BUSY_MASK GENMASK(23, 0) 124 + 125 + #define MT_MIB_SDR12(_band) MT_WF_MIB(_band, 0x558) 126 + #define MT_MIB_SDR14(_band) MT_WF_MIB(_band, 0x564) 127 + #define MT_MIB_SDR15(_band) MT_WF_MIB(_band, 0x568) 104 128 105 129 #define MT_MIB_SDR16(_band) MT_WF_MIB(_band, 0x048) 106 130 #define MT_MIB_SDR16_BUSY_MASK GENMASK(23, 0) 107 131 132 + #define MT_MIB_SDR22(_band) MT_WF_MIB(_band, 0x770) 133 + #define MT_MIB_SDR23(_band) MT_WF_MIB(_band, 0x774) 134 + #define MT_MIB_SDR31(_band) MT_WF_MIB(_band, 0x55c) 135 + 136 + #define MT_MIB_SDR32(_band) MT_WF_MIB(_band, 0x7a8) 137 + #define MT_MIB_SDR9_IBF_CNT_MASK GENMASK(31, 16) 138 + #define MT_MIB_SDR9_EBF_CNT_MASK GENMASK(15, 0) 139 + 108 140 #define MT_MIB_SDR34(_band) MT_WF_MIB(_band, 0x090) 109 141 #define MT_MIB_MU_BF_TX_CNT GENMASK(15, 0) 110 142 111 - #define MT_MIB_SDR36(_band) MT_WF_MIB(_band, 0x098) 143 + #define MT_MIB_SDR36(_band) MT_WF_MIB(_band, 0x054) 112 144 #define MT_MIB_SDR36_TXTIME_MASK GENMASK(23, 0) 113 - #define MT_MIB_SDR37(_band) MT_WF_MIB(_band, 0x09c) 145 + #define MT_MIB_SDR37(_band) MT_WF_MIB(_band, 0x058) 114 146 #define MT_MIB_SDR37_RXTIME_MASK GENMASK(23, 0) 115 147 116 148 #define MT_MIB_DR8(_band) MT_WF_MIB(_band, 0x0c0) ··· 170 138 #define MT_MIB_ARNG(_band, n) MT_WF_MIB(_band, 0x0b0 + ((n) << 2)) 171 139 #define MT_MIB_ARNCR_RANGE(val, n) (((val) >> ((n) << 3)) & GENMASK(7, 0)) 172 140 173 - #define MT_WTBLON_TOP_BASE 0x34000 141 + #define MT_WTBLON_TOP_BASE 0x820d4000 174 142 #define MT_WTBLON_TOP(ofs) (MT_WTBLON_TOP_BASE + (ofs)) 175 143 #define MT_WTBLON_TOP_WDUCR MT_WTBLON_TOP(0x200) 176 144 #define MT_WTBLON_TOP_WDUCR_GROUP GENMASK(2, 0) ··· 180 148 #define MT_WTBL_UPDATE_ADM_COUNT_CLEAR BIT(12) 181 149 #define MT_WTBL_UPDATE_BUSY BIT(31) 182 150 183 - #define MT_WTBL_BASE 0x38000 151 + #define MT_WTBL_BASE 0x820d8000 184 152 #define MT_WTBL_LMAC_ID GENMASK(14, 8) 185 153 #define MT_WTBL_LMAC_DW GENMASK(7, 2) 186 154 #define MT_WTBL_LMAC_OFFS(_id, _dw) (MT_WTBL_BASE | \ ··· 188 156 FIELD_PREP(MT_WTBL_LMAC_DW, _dw)) 189 157 190 158 /* AGG: band 0(0x20800), band 1(0xa0800) */ 191 - #define MT_WF_AGG_BASE(_band) ((_band) ? 0xa0800 : 0x20800) 159 + #define MT_WF_AGG_BASE(_band) ((_band) ? 0x820f2000 : 0x820e2000) 192 160 #define MT_WF_AGG(_band, ofs) (MT_WF_AGG_BASE(_band) + (ofs)) 193 161 194 162 #define MT_AGG_AWSCR0(_band, _n) MT_WF_AGG(_band, 0x05c + (_n) * 4) ··· 219 187 #define MT_AGG_ATCR3(_band) MT_WF_AGG(_band, 0x0f4) 220 188 221 189 /* ARB: band 0(0x20c00), band 1(0xa0c00) */ 222 - #define MT_WF_ARB_BASE(_band) ((_band) ? 0xa0c00 : 0x20c00) 190 + #define MT_WF_ARB_BASE(_band) ((_band) ? 0x820f3000 : 0x820e3000) 223 191 #define MT_WF_ARB(_band, ofs) (MT_WF_ARB_BASE(_band) + (ofs)) 224 192 225 193 #define MT_ARB_SCR(_band) MT_WF_ARB(_band, 0x080) ··· 229 197 #define MT_ARB_DRNGR0(_band, _n) MT_WF_ARB(_band, 0x194 + (_n) * 4) 230 198 231 199 /* RMAC: band 0(0x21400), band 1(0xa1400) */ 232 - #define MT_WF_RMAC_BASE(_band) ((_band) ? 0xa1400 : 0x21400) 200 + #define MT_WF_RMAC_BASE(_band) ((_band) ? 0x820f5000 : 0x820e5000) 233 201 #define MT_WF_RMAC(_band, ofs) (MT_WF_RMAC_BASE(_band) + (ofs)) 234 202 235 203 #define MT_WF_RFCR(_band) MT_WF_RMAC(_band, 0x000)
+317
drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
··· 1 + // SPDX-License-Identifier: ISC 2 + /* Copyright (C) 2021 MediaTek Inc. 3 + * 4 + */ 5 + 6 + #include <linux/kernel.h> 7 + #include <linux/iopoll.h> 8 + #include <linux/module.h> 9 + 10 + #include <linux/mmc/host.h> 11 + #include <linux/mmc/sdio_ids.h> 12 + #include <linux/mmc/sdio_func.h> 13 + 14 + #include "mt7921.h" 15 + #include "../sdio.h" 16 + #include "mac.h" 17 + #include "mcu.h" 18 + 19 + static const struct sdio_device_id mt7921s_table[] = { 20 + { SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, 0x7901) }, 21 + { } /* Terminating entry */ 22 + }; 23 + 24 + static void mt7921s_txrx_worker(struct mt76_worker *w) 25 + { 26 + struct mt76_sdio *sdio = container_of(w, struct mt76_sdio, 27 + txrx_worker); 28 + struct mt76_dev *mdev = container_of(sdio, struct mt76_dev, sdio); 29 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 30 + 31 + if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) { 32 + queue_work(mdev->wq, &dev->pm.wake_work); 33 + return; 34 + } 35 + 36 + mt76s_txrx_worker(sdio); 37 + mt76_connac_pm_unref(&dev->mphy, &dev->pm); 38 + } 39 + 40 + static void mt7921s_unregister_device(struct mt7921_dev *dev) 41 + { 42 + struct mt76_connac_pm *pm = &dev->pm; 43 + 44 + mt76_unregister_device(&dev->mt76); 45 + cancel_delayed_work_sync(&pm->ps_work); 46 + cancel_work_sync(&pm->wake_work); 47 + 48 + mt76s_deinit(&dev->mt76); 49 + mt7921s_wfsys_reset(dev); 50 + mt7921_mcu_exit(dev); 51 + 52 + mt76_free_device(&dev->mt76); 53 + } 54 + 55 + static int mt7921s_parse_intr(struct mt76_dev *dev, struct mt76s_intr *intr) 56 + { 57 + struct mt76_sdio *sdio = &dev->sdio; 58 + struct mt7921_sdio_intr *irq_data = sdio->intr_data; 59 + int i, err; 60 + 61 + err = sdio_readsb(sdio->func, irq_data, MCR_WHISR, sizeof(*irq_data)); 62 + if (err < 0) 63 + return err; 64 + 65 + intr->isr = irq_data->isr; 66 + intr->rec_mb = irq_data->rec_mb; 67 + intr->tx.wtqcr = irq_data->tx.wtqcr; 68 + intr->rx.num = irq_data->rx.num; 69 + for (i = 0; i < 2 ; i++) { 70 + if (!i) 71 + intr->rx.len[0] = irq_data->rx.len0; 72 + else 73 + intr->rx.len[1] = irq_data->rx.len1; 74 + } 75 + 76 + return 0; 77 + } 78 + 79 + static int mt7921s_probe(struct sdio_func *func, 80 + const struct sdio_device_id *id) 81 + { 82 + static const struct mt76_driver_ops drv_ops = { 83 + .txwi_size = MT_SDIO_TXD_SIZE, 84 + .survey_flags = SURVEY_INFO_TIME_TX | 85 + SURVEY_INFO_TIME_RX | 86 + SURVEY_INFO_TIME_BSS_RX, 87 + .tx_prepare_skb = mt7921s_tx_prepare_skb, 88 + .tx_complete_skb = mt7921s_tx_complete_skb, 89 + .tx_status_data = mt7921s_tx_status_data, 90 + .rx_skb = mt7921_queue_rx_skb, 91 + .sta_ps = mt7921_sta_ps, 92 + .sta_add = mt7921_mac_sta_add, 93 + .sta_assoc = mt7921_mac_sta_assoc, 94 + .sta_remove = mt7921_mac_sta_remove, 95 + .update_survey = mt7921_update_channel, 96 + }; 97 + static const struct mt76_bus_ops mt7921s_ops = { 98 + .rr = mt76s_rr, 99 + .rmw = mt76s_rmw, 100 + .wr = mt76s_wr, 101 + .write_copy = mt76s_write_copy, 102 + .read_copy = mt76s_read_copy, 103 + .wr_rp = mt76s_wr_rp, 104 + .rd_rp = mt76s_rd_rp, 105 + .type = MT76_BUS_SDIO, 106 + }; 107 + static const struct mt7921_hif_ops mt7921_sdio_ops = { 108 + .init_reset = mt7921s_init_reset, 109 + .reset = mt7921s_mac_reset, 110 + .mcu_init = mt7921s_mcu_init, 111 + .drv_own = mt7921s_mcu_drv_pmctrl, 112 + .fw_own = mt7921s_mcu_fw_pmctrl, 113 + }; 114 + 115 + struct mt7921_dev *dev; 116 + struct mt76_dev *mdev; 117 + int ret, i; 118 + 119 + mdev = mt76_alloc_device(&func->dev, sizeof(*dev), &mt7921_ops, 120 + &drv_ops); 121 + if (!mdev) 122 + return -ENOMEM; 123 + 124 + dev = container_of(mdev, struct mt7921_dev, mt76); 125 + dev->hif_ops = &mt7921_sdio_ops; 126 + 127 + sdio_set_drvdata(func, dev); 128 + 129 + ret = mt76s_init(mdev, func, &mt7921s_ops); 130 + if (ret < 0) 131 + goto error; 132 + 133 + ret = mt76s_hw_init(mdev, func, MT76_CONNAC2_SDIO); 134 + if (ret) 135 + goto error; 136 + 137 + mdev->rev = (mt76_rr(dev, MT_HW_CHIPID) << 16) | 138 + (mt76_rr(dev, MT_HW_REV) & 0xff); 139 + dev_dbg(mdev->dev, "ASIC revision: %04x\n", mdev->rev); 140 + 141 + mdev->sdio.parse_irq = mt7921s_parse_intr; 142 + mdev->sdio.intr_data = devm_kmalloc(mdev->dev, 143 + sizeof(struct mt7921_sdio_intr), 144 + GFP_KERNEL); 145 + if (!mdev->sdio.intr_data) { 146 + ret = -ENOMEM; 147 + goto error; 148 + } 149 + 150 + for (i = 0; i < ARRAY_SIZE(mdev->sdio.xmit_buf); i++) { 151 + mdev->sdio.xmit_buf[i] = devm_kmalloc(mdev->dev, 152 + MT76S_XMIT_BUF_SZ, 153 + GFP_KERNEL); 154 + if (!mdev->sdio.xmit_buf[i]) { 155 + ret = -ENOMEM; 156 + goto error; 157 + } 158 + } 159 + 160 + ret = mt76s_alloc_rx_queue(mdev, MT_RXQ_MAIN); 161 + if (ret) 162 + goto error; 163 + 164 + ret = mt76s_alloc_rx_queue(mdev, MT_RXQ_MCU); 165 + if (ret) 166 + goto error; 167 + 168 + ret = mt76s_alloc_tx(mdev); 169 + if (ret) 170 + goto error; 171 + 172 + ret = mt76_worker_setup(mt76_hw(dev), &mdev->sdio.txrx_worker, 173 + mt7921s_txrx_worker, "sdio-txrx"); 174 + if (ret) 175 + goto error; 176 + 177 + sched_set_fifo_low(mdev->sdio.txrx_worker.task); 178 + 179 + ret = mt7921_register_device(dev); 180 + if (ret) 181 + goto error; 182 + 183 + return 0; 184 + 185 + error: 186 + mt76s_deinit(&dev->mt76); 187 + mt76_free_device(&dev->mt76); 188 + 189 + return ret; 190 + } 191 + 192 + static void mt7921s_remove(struct sdio_func *func) 193 + { 194 + struct mt7921_dev *dev = sdio_get_drvdata(func); 195 + 196 + mt7921s_unregister_device(dev); 197 + } 198 + 199 + #ifdef CONFIG_PM 200 + static int mt7921s_suspend(struct device *__dev) 201 + { 202 + struct sdio_func *func = dev_to_sdio_func(__dev); 203 + struct mt7921_dev *dev = sdio_get_drvdata(func); 204 + struct mt76_connac_pm *pm = &dev->pm; 205 + struct mt76_dev *mdev = &dev->mt76; 206 + bool hif_suspend; 207 + int err; 208 + 209 + pm->suspended = true; 210 + cancel_delayed_work_sync(&pm->ps_work); 211 + cancel_work_sync(&pm->wake_work); 212 + 213 + err = mt7921_mcu_drv_pmctrl(dev); 214 + if (err < 0) 215 + goto restore_suspend; 216 + 217 + hif_suspend = !test_bit(MT76_STATE_SUSPEND, &dev->mphy.state); 218 + if (hif_suspend) { 219 + err = mt76_connac_mcu_set_hif_suspend(mdev, true); 220 + if (err) 221 + goto restore_suspend; 222 + } 223 + 224 + /* always enable deep sleep during suspend to reduce 225 + * power consumption 226 + */ 227 + mt76_connac_mcu_set_deep_sleep(mdev, true); 228 + 229 + mt76_txq_schedule_all(&dev->mphy); 230 + mt76_worker_disable(&mdev->tx_worker); 231 + mt76_worker_disable(&mdev->sdio.txrx_worker); 232 + mt76_worker_disable(&mdev->sdio.status_worker); 233 + mt76_worker_disable(&mdev->sdio.net_worker); 234 + cancel_work_sync(&mdev->sdio.stat_work); 235 + clear_bit(MT76_READING_STATS, &dev->mphy.state); 236 + 237 + mt76_tx_status_check(mdev, true); 238 + 239 + err = mt7921_mcu_fw_pmctrl(dev); 240 + if (err) 241 + goto restore_worker; 242 + 243 + sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); 244 + 245 + return 0; 246 + 247 + restore_worker: 248 + mt76_worker_enable(&mdev->tx_worker); 249 + mt76_worker_enable(&mdev->sdio.txrx_worker); 250 + mt76_worker_enable(&mdev->sdio.status_worker); 251 + mt76_worker_enable(&mdev->sdio.net_worker); 252 + 253 + if (!pm->ds_enable) 254 + mt76_connac_mcu_set_deep_sleep(mdev, false); 255 + 256 + if (hif_suspend) 257 + mt76_connac_mcu_set_hif_suspend(mdev, false); 258 + 259 + restore_suspend: 260 + pm->suspended = false; 261 + 262 + return err; 263 + } 264 + 265 + static int mt7921s_resume(struct device *__dev) 266 + { 267 + struct sdio_func *func = dev_to_sdio_func(__dev); 268 + struct mt7921_dev *dev = sdio_get_drvdata(func); 269 + struct mt76_connac_pm *pm = &dev->pm; 270 + struct mt76_dev *mdev = &dev->mt76; 271 + int err; 272 + 273 + pm->suspended = false; 274 + 275 + err = mt7921_mcu_drv_pmctrl(dev); 276 + if (err < 0) 277 + return err; 278 + 279 + mt76_worker_enable(&mdev->tx_worker); 280 + mt76_worker_enable(&mdev->sdio.txrx_worker); 281 + mt76_worker_enable(&mdev->sdio.status_worker); 282 + mt76_worker_enable(&mdev->sdio.net_worker); 283 + 284 + /* restore previous ds setting */ 285 + if (!pm->ds_enable) 286 + mt76_connac_mcu_set_deep_sleep(mdev, false); 287 + 288 + if (!test_bit(MT76_STATE_SUSPEND, &dev->mphy.state)) 289 + err = mt76_connac_mcu_set_hif_suspend(mdev, false); 290 + 291 + return err; 292 + } 293 + 294 + static const struct dev_pm_ops mt7921s_pm_ops = { 295 + .suspend = mt7921s_suspend, 296 + .resume = mt7921s_resume, 297 + }; 298 + #endif 299 + 300 + MODULE_DEVICE_TABLE(sdio, mt7921s_table); 301 + MODULE_FIRMWARE(MT7921_FIRMWARE_WM); 302 + MODULE_FIRMWARE(MT7921_ROM_PATCH); 303 + 304 + static struct sdio_driver mt7921s_driver = { 305 + .name = KBUILD_MODNAME, 306 + .probe = mt7921s_probe, 307 + .remove = mt7921s_remove, 308 + .id_table = mt7921s_table, 309 + #ifdef CONFIG_PM 310 + .drv = { 311 + .pm = &mt7921s_pm_ops, 312 + } 313 + #endif 314 + }; 315 + module_sdio_driver(mt7921s_driver); 316 + MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); 317 + MODULE_LICENSE("Dual BSD/GPL");
+220
drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c
··· 1 + // SPDX-License-Identifier: ISC 2 + /* Copyright (C) 2021 MediaTek Inc. */ 3 + 4 + #include <linux/iopoll.h> 5 + #include <linux/mmc/sdio_func.h> 6 + #include "mt7921.h" 7 + #include "mac.h" 8 + #include "../sdio.h" 9 + 10 + static void mt7921s_enable_irq(struct mt76_dev *dev) 11 + { 12 + struct mt76_sdio *sdio = &dev->sdio; 13 + 14 + sdio_claim_host(sdio->func); 15 + sdio_writel(sdio->func, WHLPCR_INT_EN_SET, MCR_WHLPCR, NULL); 16 + sdio_release_host(sdio->func); 17 + } 18 + 19 + static void mt7921s_disable_irq(struct mt76_dev *dev) 20 + { 21 + struct mt76_sdio *sdio = &dev->sdio; 22 + 23 + sdio_claim_host(sdio->func); 24 + sdio_writel(sdio->func, WHLPCR_INT_EN_CLR, MCR_WHLPCR, NULL); 25 + sdio_release_host(sdio->func); 26 + } 27 + 28 + static u32 mt7921s_read_whcr(struct mt76_dev *dev) 29 + { 30 + return sdio_readl(dev->sdio.func, MCR_WHCR, NULL); 31 + } 32 + 33 + int mt7921s_wfsys_reset(struct mt7921_dev *dev) 34 + { 35 + struct mt76_sdio *sdio = &dev->mt76.sdio; 36 + u32 val, status; 37 + 38 + mt7921s_mcu_drv_pmctrl(dev); 39 + 40 + sdio_claim_host(sdio->func); 41 + 42 + val = sdio_readl(sdio->func, MCR_WHCR, NULL); 43 + val &= ~WF_WHOLE_PATH_RSTB; 44 + sdio_writel(sdio->func, val, MCR_WHCR, NULL); 45 + 46 + msleep(50); 47 + 48 + val = sdio_readl(sdio->func, MCR_WHCR, NULL); 49 + val &= ~WF_SDIO_WF_PATH_RSTB; 50 + sdio_writel(sdio->func, val, MCR_WHCR, NULL); 51 + 52 + usleep_range(1000, 2000); 53 + 54 + val = sdio_readl(sdio->func, MCR_WHCR, NULL); 55 + val |= WF_WHOLE_PATH_RSTB; 56 + sdio_writel(sdio->func, val, MCR_WHCR, NULL); 57 + 58 + readx_poll_timeout(mt7921s_read_whcr, &dev->mt76, status, 59 + status & WF_RST_DONE, 50000, 2000000); 60 + 61 + sdio_release_host(sdio->func); 62 + 63 + /* activate mt7921s again */ 64 + mt7921s_mcu_fw_pmctrl(dev); 65 + mt7921s_mcu_drv_pmctrl(dev); 66 + 67 + return 0; 68 + } 69 + 70 + int mt7921s_init_reset(struct mt7921_dev *dev) 71 + { 72 + set_bit(MT76_MCU_RESET, &dev->mphy.state); 73 + 74 + wake_up(&dev->mt76.mcu.wait); 75 + skb_queue_purge(&dev->mt76.mcu.res_q); 76 + wait_event_timeout(dev->mt76.sdio.wait, 77 + mt76s_txqs_empty(&dev->mt76), 5 * HZ); 78 + mt76_worker_disable(&dev->mt76.sdio.txrx_worker); 79 + 80 + mt7921s_disable_irq(&dev->mt76); 81 + mt7921s_wfsys_reset(dev); 82 + 83 + mt76_worker_enable(&dev->mt76.sdio.txrx_worker); 84 + clear_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state); 85 + clear_bit(MT76_MCU_RESET, &dev->mphy.state); 86 + mt7921s_enable_irq(&dev->mt76); 87 + 88 + return 0; 89 + } 90 + 91 + int mt7921s_mac_reset(struct mt7921_dev *dev) 92 + { 93 + int err; 94 + 95 + mt76_connac_free_pending_tx_skbs(&dev->pm, NULL); 96 + mt76_txq_schedule_all(&dev->mphy); 97 + mt76_worker_disable(&dev->mt76.tx_worker); 98 + set_bit(MT76_RESET, &dev->mphy.state); 99 + set_bit(MT76_MCU_RESET, &dev->mphy.state); 100 + wake_up(&dev->mt76.mcu.wait); 101 + skb_queue_purge(&dev->mt76.mcu.res_q); 102 + wait_event_timeout(dev->mt76.sdio.wait, 103 + mt76s_txqs_empty(&dev->mt76), 5 * HZ); 104 + mt76_worker_disable(&dev->mt76.sdio.txrx_worker); 105 + mt76_worker_disable(&dev->mt76.sdio.status_worker); 106 + mt76_worker_disable(&dev->mt76.sdio.net_worker); 107 + cancel_work_sync(&dev->mt76.sdio.stat_work); 108 + 109 + mt7921s_disable_irq(&dev->mt76); 110 + mt7921s_wfsys_reset(dev); 111 + 112 + mt76_worker_enable(&dev->mt76.sdio.txrx_worker); 113 + mt76_worker_enable(&dev->mt76.sdio.status_worker); 114 + mt76_worker_enable(&dev->mt76.sdio.net_worker); 115 + 116 + dev->fw_assert = false; 117 + clear_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state); 118 + clear_bit(MT76_MCU_RESET, &dev->mphy.state); 119 + mt7921s_enable_irq(&dev->mt76); 120 + 121 + err = mt7921_run_firmware(dev); 122 + if (err) 123 + goto out; 124 + 125 + err = mt7921_mcu_set_eeprom(dev); 126 + if (err) 127 + goto out; 128 + 129 + err = mt7921_mac_init(dev); 130 + if (err) 131 + goto out; 132 + 133 + err = __mt7921_start(&dev->phy); 134 + out: 135 + clear_bit(MT76_RESET, &dev->mphy.state); 136 + 137 + mt76_worker_enable(&dev->mt76.tx_worker); 138 + 139 + return err; 140 + } 141 + 142 + static void 143 + mt7921s_write_txwi(struct mt7921_dev *dev, struct mt76_wcid *wcid, 144 + enum mt76_txq_id qid, struct ieee80211_sta *sta, 145 + struct sk_buff *skb) 146 + { 147 + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 148 + struct ieee80211_key_conf *key = info->control.hw_key; 149 + __le32 *txwi; 150 + int pid; 151 + 152 + pid = mt76_tx_status_skb_add(&dev->mt76, wcid, skb); 153 + txwi = (__le32 *)(skb->data - MT_SDIO_TXD_SIZE); 154 + memset(txwi, 0, MT_SDIO_TXD_SIZE); 155 + mt7921_mac_write_txwi(dev, txwi, skb, wcid, key, pid, false); 156 + skb_push(skb, MT_SDIO_TXD_SIZE); 157 + } 158 + 159 + int mt7921s_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 160 + enum mt76_txq_id qid, struct mt76_wcid *wcid, 161 + struct ieee80211_sta *sta, 162 + struct mt76_tx_info *tx_info) 163 + { 164 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 165 + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb); 166 + struct sk_buff *skb = tx_info->skb; 167 + int pad; 168 + 169 + if (unlikely(tx_info->skb->len <= ETH_HLEN)) 170 + return -EINVAL; 171 + 172 + if (!wcid) 173 + wcid = &dev->mt76.global_wcid; 174 + 175 + if (sta) { 176 + struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; 177 + 178 + if (time_after(jiffies, msta->last_txs + HZ / 4)) { 179 + info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; 180 + msta->last_txs = jiffies; 181 + } 182 + } 183 + 184 + mt7921s_write_txwi(dev, wcid, qid, sta, skb); 185 + 186 + mt7921_skb_add_sdio_hdr(skb, MT7921_SDIO_DATA); 187 + pad = round_up(skb->len, 4) - skb->len; 188 + 189 + return mt76_skb_adjust_pad(skb, pad); 190 + } 191 + 192 + void mt7921s_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e) 193 + { 194 + __le32 *txwi = (__le32 *)(e->skb->data + MT_SDIO_HDR_SIZE); 195 + unsigned int headroom = MT_SDIO_TXD_SIZE + MT_SDIO_HDR_SIZE; 196 + struct ieee80211_sta *sta; 197 + struct mt76_wcid *wcid; 198 + u16 idx; 199 + 200 + idx = FIELD_GET(MT_TXD1_WLAN_IDX, le32_to_cpu(txwi[1])); 201 + wcid = rcu_dereference(mdev->wcid[idx]); 202 + sta = wcid_to_sta(wcid); 203 + 204 + if (sta && likely(e->skb->protocol != cpu_to_be16(ETH_P_PAE))) 205 + mt7921_tx_check_aggr(sta, txwi); 206 + 207 + skb_pull(e->skb, headroom); 208 + mt76_tx_complete_skb(mdev, e->wcid, e->skb); 209 + } 210 + 211 + bool mt7921s_tx_status_data(struct mt76_dev *mdev, u8 *update) 212 + { 213 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 214 + 215 + mt7921_mutex_acquire(dev); 216 + mt7921_mac_sta_poll(dev); 217 + mt7921_mutex_release(dev); 218 + 219 + return 0; 220 + }
+135
drivers/net/wireless/mediatek/mt76/mt7921/sdio_mcu.c
··· 1 + // SPDX-License-Identifier: ISC 2 + /* Copyright (C) 2021 MediaTek Inc. */ 3 + 4 + #include <linux/kernel.h> 5 + #include <linux/mmc/sdio_func.h> 6 + #include <linux/module.h> 7 + #include <linux/iopoll.h> 8 + 9 + #include "mt7921.h" 10 + #include "../sdio.h" 11 + #include "mac.h" 12 + #include "mcu.h" 13 + #include "regs.h" 14 + 15 + static int 16 + mt7921s_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, 17 + int cmd, int *seq) 18 + { 19 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 20 + enum mt7921_sdio_pkt_type type = MT7921_SDIO_CMD; 21 + enum mt76_mcuq_id txq = MT_MCUQ_WM; 22 + int ret, pad; 23 + 24 + /* We just return in case firmware assertion to avoid blocking the 25 + * common workqueue to run, for example, the coredump work might be 26 + * blocked by mt7921_mac_work that is excuting register access via sdio 27 + * bus. 28 + */ 29 + if (dev->fw_assert) 30 + return -EBUSY; 31 + 32 + ret = mt7921_mcu_fill_message(mdev, skb, cmd, seq); 33 + if (ret) 34 + return ret; 35 + 36 + if (cmd == MCU_CMD_FW_SCATTER) 37 + type = MT7921_SDIO_FWDL; 38 + 39 + mt7921_skb_add_sdio_hdr(skb, type); 40 + pad = round_up(skb->len, 4) - skb->len; 41 + __skb_put_zero(skb, pad); 42 + 43 + ret = mt76_tx_queue_skb_raw(dev, mdev->q_mcu[txq], skb, 0); 44 + if (ret) 45 + return ret; 46 + 47 + mt76_queue_kick(dev, mdev->q_mcu[txq]); 48 + 49 + return ret; 50 + } 51 + 52 + int mt7921s_mcu_init(struct mt7921_dev *dev) 53 + { 54 + static const struct mt76_mcu_ops mt7921s_mcu_ops = { 55 + .headroom = MT_SDIO_HDR_SIZE + sizeof(struct mt7921_mcu_txd), 56 + .tailroom = MT_SDIO_TAIL_SIZE, 57 + .mcu_skb_send_msg = mt7921s_mcu_send_message, 58 + .mcu_parse_response = mt7921_mcu_parse_response, 59 + .mcu_rr = mt76_connac_mcu_reg_rr, 60 + .mcu_wr = mt76_connac_mcu_reg_wr, 61 + }; 62 + int ret; 63 + 64 + mt7921s_mcu_drv_pmctrl(dev); 65 + 66 + dev->mt76.mcu_ops = &mt7921s_mcu_ops; 67 + 68 + ret = mt7921_run_firmware(dev); 69 + if (ret) 70 + return ret; 71 + 72 + set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state); 73 + 74 + return 0; 75 + } 76 + 77 + int mt7921s_mcu_drv_pmctrl(struct mt7921_dev *dev) 78 + { 79 + struct sdio_func *func = dev->mt76.sdio.func; 80 + struct mt76_phy *mphy = &dev->mt76.phy; 81 + struct mt76_connac_pm *pm = &dev->pm; 82 + int err = 0; 83 + u32 status; 84 + 85 + sdio_claim_host(func); 86 + 87 + sdio_writel(func, WHLPCR_FW_OWN_REQ_CLR, MCR_WHLPCR, NULL); 88 + 89 + err = readx_poll_timeout(mt76s_read_pcr, &dev->mt76, status, 90 + status & WHLPCR_IS_DRIVER_OWN, 2000, 1000000); 91 + sdio_release_host(func); 92 + 93 + if (err < 0) { 94 + dev_err(dev->mt76.dev, "driver own failed\n"); 95 + err = -EIO; 96 + goto out; 97 + } 98 + 99 + clear_bit(MT76_STATE_PM, &mphy->state); 100 + 101 + pm->stats.last_wake_event = jiffies; 102 + pm->stats.doze_time += pm->stats.last_wake_event - 103 + pm->stats.last_doze_event; 104 + out: 105 + return err; 106 + } 107 + 108 + int mt7921s_mcu_fw_pmctrl(struct mt7921_dev *dev) 109 + { 110 + struct sdio_func *func = dev->mt76.sdio.func; 111 + struct mt76_phy *mphy = &dev->mt76.phy; 112 + struct mt76_connac_pm *pm = &dev->pm; 113 + int err = 0; 114 + u32 status; 115 + 116 + sdio_claim_host(func); 117 + 118 + sdio_writel(func, WHLPCR_FW_OWN_REQ_SET, MCR_WHLPCR, NULL); 119 + 120 + err = readx_poll_timeout(mt76s_read_pcr, &dev->mt76, status, 121 + !(status & WHLPCR_IS_DRIVER_OWN), 2000, 1000000); 122 + sdio_release_host(func); 123 + 124 + if (err < 0) { 125 + dev_err(dev->mt76.dev, "firmware own failed\n"); 126 + clear_bit(MT76_STATE_PM, &mphy->state); 127 + err = -EIO; 128 + } 129 + 130 + pm->stats.last_doze_event = jiffies; 131 + pm->stats.awake_time += pm->stats.last_doze_event - 132 + pm->stats.last_wake_event; 133 + 134 + return err; 135 + }
+197
drivers/net/wireless/mediatek/mt76/mt7921/testmode.c
··· 1 + // SPDX-License-Identifier: ISC 2 + 3 + #include "mt7921.h" 4 + #include "mcu.h" 5 + 6 + enum mt7921_testmode_attr { 7 + MT7921_TM_ATTR_UNSPEC, 8 + MT7921_TM_ATTR_SET, 9 + MT7921_TM_ATTR_QUERY, 10 + MT7921_TM_ATTR_RSP, 11 + 12 + /* keep last */ 13 + NUM_MT7921_TM_ATTRS, 14 + MT7921_TM_ATTR_MAX = NUM_MT7921_TM_ATTRS - 1, 15 + }; 16 + 17 + struct mt7921_tm_cmd { 18 + u8 action; 19 + u32 param0; 20 + u32 param1; 21 + }; 22 + 23 + struct mt7921_tm_evt { 24 + u32 param0; 25 + u32 param1; 26 + }; 27 + 28 + static const struct nla_policy mt7921_tm_policy[NUM_MT7921_TM_ATTRS] = { 29 + [MT7921_TM_ATTR_SET] = NLA_POLICY_EXACT_LEN(sizeof(struct mt7921_tm_cmd)), 30 + [MT7921_TM_ATTR_QUERY] = NLA_POLICY_EXACT_LEN(sizeof(struct mt7921_tm_cmd)), 31 + }; 32 + 33 + static int 34 + mt7921_tm_set(struct mt7921_dev *dev, struct mt7921_tm_cmd *req) 35 + { 36 + struct mt7921_rftest_cmd cmd = { 37 + .action = req->action, 38 + .param0 = cpu_to_le32(req->param0), 39 + .param1 = cpu_to_le32(req->param1), 40 + }; 41 + bool testmode = false, normal = false; 42 + struct mt76_connac_pm *pm = &dev->pm; 43 + struct mt76_phy *phy = &dev->mphy; 44 + int ret = -ENOTCONN; 45 + 46 + mutex_lock(&dev->mt76.mutex); 47 + 48 + if (req->action == TM_SWITCH_MODE) { 49 + if (req->param0 == MT7921_TM_NORMAL) 50 + normal = true; 51 + else 52 + testmode = true; 53 + } 54 + 55 + if (testmode) { 56 + /* Make sure testmode running on full power mode */ 57 + pm->enable = false; 58 + cancel_delayed_work_sync(&pm->ps_work); 59 + cancel_work_sync(&pm->wake_work); 60 + __mt7921_mcu_drv_pmctrl(dev); 61 + 62 + mt76_wr(dev, MT_WF_RFCR(0), dev->mt76.rxfilter); 63 + phy->test.state = MT76_TM_STATE_ON; 64 + } 65 + 66 + if (!mt76_testmode_enabled(phy)) 67 + goto out; 68 + 69 + ret = mt76_mcu_send_msg(&dev->mt76, MCU_CMD_TEST_CTRL, &cmd, 70 + sizeof(cmd), false); 71 + if (ret) 72 + goto out; 73 + 74 + if (normal) { 75 + /* Switch back to the normal world */ 76 + phy->test.state = MT76_TM_STATE_OFF; 77 + pm->enable = true; 78 + } 79 + out: 80 + mutex_unlock(&dev->mt76.mutex); 81 + 82 + return ret; 83 + } 84 + 85 + static int 86 + mt7921_tm_query(struct mt7921_dev *dev, struct mt7921_tm_cmd *req, 87 + struct mt7921_tm_evt *evt_resp) 88 + { 89 + struct mt7921_rftest_cmd cmd = { 90 + .action = req->action, 91 + .param0 = cpu_to_le32(req->param0), 92 + .param1 = cpu_to_le32(req->param1), 93 + }; 94 + struct mt7921_rftest_evt *evt; 95 + struct sk_buff *skb; 96 + int ret; 97 + 98 + ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_CMD_TEST_CTRL, 99 + &cmd, sizeof(cmd), true, &skb); 100 + if (ret) 101 + goto out; 102 + 103 + evt = (struct mt7921_rftest_evt *)skb->data; 104 + evt_resp->param0 = le32_to_cpu(evt->param0); 105 + evt_resp->param1 = le32_to_cpu(evt->param1); 106 + out: 107 + dev_kfree_skb(skb); 108 + 109 + return ret; 110 + } 111 + 112 + int mt7921_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 113 + void *data, int len) 114 + { 115 + struct nlattr *tb[NUM_MT76_TM_ATTRS]; 116 + struct mt76_phy *mphy = hw->priv; 117 + struct mt7921_phy *phy = mphy->priv; 118 + int err; 119 + 120 + if (!test_bit(MT76_STATE_RUNNING, &mphy->state) || 121 + !(hw->conf.flags & IEEE80211_CONF_MONITOR)) 122 + return -ENOTCONN; 123 + 124 + err = nla_parse_deprecated(tb, MT76_TM_ATTR_MAX, data, len, 125 + mt76_tm_policy, NULL); 126 + if (err) 127 + return err; 128 + 129 + if (tb[MT76_TM_ATTR_DRV_DATA]) { 130 + struct nlattr *drv_tb[NUM_MT7921_TM_ATTRS], *data; 131 + int ret; 132 + 133 + data = tb[MT76_TM_ATTR_DRV_DATA]; 134 + ret = nla_parse_nested_deprecated(drv_tb, 135 + MT7921_TM_ATTR_MAX, 136 + data, mt7921_tm_policy, 137 + NULL); 138 + if (ret) 139 + return ret; 140 + 141 + data = drv_tb[MT7921_TM_ATTR_SET]; 142 + if (data) 143 + return mt7921_tm_set(phy->dev, nla_data(data)); 144 + } 145 + 146 + return -EINVAL; 147 + } 148 + 149 + int mt7921_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg, 150 + struct netlink_callback *cb, void *data, int len) 151 + { 152 + struct nlattr *tb[NUM_MT76_TM_ATTRS]; 153 + struct mt76_phy *mphy = hw->priv; 154 + struct mt7921_phy *phy = mphy->priv; 155 + int err; 156 + 157 + if (!test_bit(MT76_STATE_RUNNING, &mphy->state) || 158 + !(hw->conf.flags & IEEE80211_CONF_MONITOR) || 159 + !mt76_testmode_enabled(mphy)) 160 + return -ENOTCONN; 161 + 162 + if (cb->args[2]++ > 0) 163 + return -ENOENT; 164 + 165 + err = nla_parse_deprecated(tb, MT76_TM_ATTR_MAX, data, len, 166 + mt76_tm_policy, NULL); 167 + if (err) 168 + return err; 169 + 170 + if (tb[MT76_TM_ATTR_DRV_DATA]) { 171 + struct nlattr *drv_tb[NUM_MT7921_TM_ATTRS], *data; 172 + int ret; 173 + 174 + data = tb[MT76_TM_ATTR_DRV_DATA]; 175 + ret = nla_parse_nested_deprecated(drv_tb, 176 + MT7921_TM_ATTR_MAX, 177 + data, mt7921_tm_policy, 178 + NULL); 179 + if (ret) 180 + return ret; 181 + 182 + data = drv_tb[MT7921_TM_ATTR_QUERY]; 183 + if (data) { 184 + struct mt7921_tm_evt evt_resp; 185 + 186 + err = mt7921_tm_query(phy->dev, nla_data(data), 187 + &evt_resp); 188 + if (err) 189 + return err; 190 + 191 + return nla_put(msg, MT7921_TM_ATTR_RSP, 192 + sizeof(evt_resp), &evt_resp); 193 + } 194 + } 195 + 196 + return -EINVAL; 197 + }
+287 -16
drivers/net/wireless/mediatek/mt76/sdio.c
··· 16 16 #include <linux/kthread.h> 17 17 18 18 #include "mt76.h" 19 + #include "sdio.h" 19 20 20 - static int 21 - mt76s_alloc_rx_queue(struct mt76_dev *dev, enum mt76_rxq_id qid) 21 + static u32 mt76s_read_whisr(struct mt76_dev *dev) 22 + { 23 + return sdio_readl(dev->sdio.func, MCR_WHISR, NULL); 24 + } 25 + 26 + u32 mt76s_read_pcr(struct mt76_dev *dev) 27 + { 28 + struct mt76_sdio *sdio = &dev->sdio; 29 + 30 + return sdio_readl(sdio->func, MCR_WHLPCR, NULL); 31 + } 32 + EXPORT_SYMBOL_GPL(mt76s_read_pcr); 33 + 34 + static u32 mt76s_read_mailbox(struct mt76_dev *dev, u32 offset) 35 + { 36 + struct sdio_func *func = dev->sdio.func; 37 + u32 val = ~0, status; 38 + int err; 39 + 40 + sdio_claim_host(func); 41 + 42 + sdio_writel(func, offset, MCR_H2DSM0R, &err); 43 + if (err < 0) { 44 + dev_err(dev->dev, "failed setting address [err=%d]\n", err); 45 + goto out; 46 + } 47 + 48 + sdio_writel(func, H2D_SW_INT_READ, MCR_WSICR, &err); 49 + if (err < 0) { 50 + dev_err(dev->dev, "failed setting read mode [err=%d]\n", err); 51 + goto out; 52 + } 53 + 54 + err = readx_poll_timeout(mt76s_read_whisr, dev, status, 55 + status & H2D_SW_INT_READ, 0, 1000000); 56 + if (err < 0) { 57 + dev_err(dev->dev, "query whisr timeout\n"); 58 + goto out; 59 + } 60 + 61 + sdio_writel(func, H2D_SW_INT_READ, MCR_WHISR, &err); 62 + if (err < 0) { 63 + dev_err(dev->dev, "failed setting read mode [err=%d]\n", err); 64 + goto out; 65 + } 66 + 67 + val = sdio_readl(func, MCR_H2DSM0R, &err); 68 + if (err < 0) { 69 + dev_err(dev->dev, "failed reading h2dsm0r [err=%d]\n", err); 70 + goto out; 71 + } 72 + 73 + if (val != offset) { 74 + dev_err(dev->dev, "register mismatch\n"); 75 + val = ~0; 76 + goto out; 77 + } 78 + 79 + val = sdio_readl(func, MCR_D2HRM1R, &err); 80 + if (err < 0) 81 + dev_err(dev->dev, "failed reading d2hrm1r [err=%d]\n", err); 82 + 83 + out: 84 + sdio_release_host(func); 85 + 86 + return val; 87 + } 88 + 89 + static void mt76s_write_mailbox(struct mt76_dev *dev, u32 offset, u32 val) 90 + { 91 + struct sdio_func *func = dev->sdio.func; 92 + u32 status; 93 + int err; 94 + 95 + sdio_claim_host(func); 96 + 97 + sdio_writel(func, offset, MCR_H2DSM0R, &err); 98 + if (err < 0) { 99 + dev_err(dev->dev, "failed setting address [err=%d]\n", err); 100 + goto out; 101 + } 102 + 103 + sdio_writel(func, val, MCR_H2DSM1R, &err); 104 + if (err < 0) { 105 + dev_err(dev->dev, 106 + "failed setting write value [err=%d]\n", err); 107 + goto out; 108 + } 109 + 110 + sdio_writel(func, H2D_SW_INT_WRITE, MCR_WSICR, &err); 111 + if (err < 0) { 112 + dev_err(dev->dev, "failed setting write mode [err=%d]\n", err); 113 + goto out; 114 + } 115 + 116 + err = readx_poll_timeout(mt76s_read_whisr, dev, status, 117 + status & H2D_SW_INT_WRITE, 0, 1000000); 118 + if (err < 0) { 119 + dev_err(dev->dev, "query whisr timeout\n"); 120 + goto out; 121 + } 122 + 123 + sdio_writel(func, H2D_SW_INT_WRITE, MCR_WHISR, &err); 124 + if (err < 0) { 125 + dev_err(dev->dev, "failed setting write mode [err=%d]\n", err); 126 + goto out; 127 + } 128 + 129 + val = sdio_readl(func, MCR_H2DSM0R, &err); 130 + if (err < 0) { 131 + dev_err(dev->dev, "failed reading h2dsm0r [err=%d]\n", err); 132 + goto out; 133 + } 134 + 135 + if (val != offset) 136 + dev_err(dev->dev, "register mismatch\n"); 137 + 138 + out: 139 + sdio_release_host(func); 140 + } 141 + 142 + u32 mt76s_rr(struct mt76_dev *dev, u32 offset) 143 + { 144 + if (test_bit(MT76_STATE_MCU_RUNNING, &dev->phy.state)) 145 + return dev->mcu_ops->mcu_rr(dev, offset); 146 + else 147 + return mt76s_read_mailbox(dev, offset); 148 + } 149 + EXPORT_SYMBOL_GPL(mt76s_rr); 150 + 151 + void mt76s_wr(struct mt76_dev *dev, u32 offset, u32 val) 152 + { 153 + if (test_bit(MT76_STATE_MCU_RUNNING, &dev->phy.state)) 154 + dev->mcu_ops->mcu_wr(dev, offset, val); 155 + else 156 + mt76s_write_mailbox(dev, offset, val); 157 + } 158 + EXPORT_SYMBOL_GPL(mt76s_wr); 159 + 160 + u32 mt76s_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val) 161 + { 162 + val |= mt76s_rr(dev, offset) & ~mask; 163 + mt76s_wr(dev, offset, val); 164 + 165 + return val; 166 + } 167 + EXPORT_SYMBOL_GPL(mt76s_rmw); 168 + 169 + void mt76s_write_copy(struct mt76_dev *dev, u32 offset, 170 + const void *data, int len) 171 + { 172 + const u32 *val = data; 173 + int i; 174 + 175 + for (i = 0; i < len / sizeof(u32); i++) { 176 + mt76s_wr(dev, offset, val[i]); 177 + offset += sizeof(u32); 178 + } 179 + } 180 + EXPORT_SYMBOL_GPL(mt76s_write_copy); 181 + 182 + void mt76s_read_copy(struct mt76_dev *dev, u32 offset, 183 + void *data, int len) 184 + { 185 + u32 *val = data; 186 + int i; 187 + 188 + for (i = 0; i < len / sizeof(u32); i++) { 189 + val[i] = mt76s_rr(dev, offset); 190 + offset += sizeof(u32); 191 + } 192 + } 193 + EXPORT_SYMBOL_GPL(mt76s_read_copy); 194 + 195 + int mt76s_wr_rp(struct mt76_dev *dev, u32 base, 196 + const struct mt76_reg_pair *data, 197 + int len) 198 + { 199 + int i; 200 + 201 + for (i = 0; i < len; i++) { 202 + mt76s_wr(dev, data->reg, data->value); 203 + data++; 204 + } 205 + 206 + return 0; 207 + } 208 + EXPORT_SYMBOL_GPL(mt76s_wr_rp); 209 + 210 + int mt76s_rd_rp(struct mt76_dev *dev, u32 base, 211 + struct mt76_reg_pair *data, int len) 212 + { 213 + int i; 214 + 215 + for (i = 0; i < len; i++) { 216 + data->value = mt76s_rr(dev, data->reg); 217 + data++; 218 + } 219 + 220 + return 0; 221 + } 222 + EXPORT_SYMBOL_GPL(mt76s_rd_rp); 223 + 224 + int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func, int hw_ver) 225 + { 226 + u32 status, ctrl; 227 + int ret; 228 + 229 + dev->sdio.hw_ver = hw_ver; 230 + 231 + sdio_claim_host(func); 232 + 233 + ret = sdio_enable_func(func); 234 + if (ret < 0) 235 + goto release; 236 + 237 + /* Get ownership from the device */ 238 + sdio_writel(func, WHLPCR_INT_EN_CLR | WHLPCR_FW_OWN_REQ_CLR, 239 + MCR_WHLPCR, &ret); 240 + if (ret < 0) 241 + goto disable_func; 242 + 243 + ret = readx_poll_timeout(mt76s_read_pcr, dev, status, 244 + status & WHLPCR_IS_DRIVER_OWN, 2000, 1000000); 245 + if (ret < 0) { 246 + dev_err(dev->dev, "Cannot get ownership from device"); 247 + goto disable_func; 248 + } 249 + 250 + ret = sdio_set_block_size(func, 512); 251 + if (ret < 0) 252 + goto disable_func; 253 + 254 + /* Enable interrupt */ 255 + sdio_writel(func, WHLPCR_INT_EN_SET, MCR_WHLPCR, &ret); 256 + if (ret < 0) 257 + goto disable_func; 258 + 259 + ctrl = WHIER_RX0_DONE_INT_EN | WHIER_TX_DONE_INT_EN; 260 + if (hw_ver == MT76_CONNAC2_SDIO) 261 + ctrl |= WHIER_RX1_DONE_INT_EN; 262 + sdio_writel(func, ctrl, MCR_WHIER, &ret); 263 + if (ret < 0) 264 + goto disable_func; 265 + 266 + switch (hw_ver) { 267 + case MT76_CONNAC_SDIO: 268 + /* set WHISR as read clear and Rx aggregation number as 16 */ 269 + ctrl = FIELD_PREP(MAX_HIF_RX_LEN_NUM, 16); 270 + break; 271 + default: 272 + ctrl = sdio_readl(func, MCR_WHCR, &ret); 273 + if (ret < 0) 274 + goto disable_func; 275 + ctrl &= ~MAX_HIF_RX_LEN_NUM_CONNAC2; 276 + ctrl &= ~W_INT_CLR_CTRL; /* read clear */ 277 + ctrl |= FIELD_PREP(MAX_HIF_RX_LEN_NUM_CONNAC2, 0); 278 + break; 279 + } 280 + 281 + sdio_writel(func, ctrl, MCR_WHCR, &ret); 282 + if (ret < 0) 283 + goto disable_func; 284 + 285 + ret = sdio_claim_irq(func, mt76s_sdio_irq); 286 + if (ret < 0) 287 + goto disable_func; 288 + 289 + sdio_release_host(func); 290 + 291 + return 0; 292 + 293 + disable_func: 294 + sdio_disable_func(func); 295 + release: 296 + sdio_release_host(func); 297 + 298 + return ret; 299 + } 300 + EXPORT_SYMBOL_GPL(mt76s_hw_init); 301 + 302 + int mt76s_alloc_rx_queue(struct mt76_dev *dev, enum mt76_rxq_id qid) 22 303 { 23 304 struct mt76_queue *q = &dev->q_rx[qid]; 24 305 ··· 316 35 317 36 return 0; 318 37 } 38 + EXPORT_SYMBOL_GPL(mt76s_alloc_rx_queue); 319 39 320 40 static struct mt76_queue *mt76s_alloc_tx_queue(struct mt76_dev *dev) 321 41 { ··· 338 56 return q; 339 57 } 340 58 341 - static int mt76s_alloc_tx(struct mt76_dev *dev) 59 + int mt76s_alloc_tx(struct mt76_dev *dev) 342 60 { 343 61 struct mt76_queue *q; 344 62 int i; ··· 361 79 362 80 return 0; 363 81 } 364 - 365 - int mt76s_alloc_queues(struct mt76_dev *dev) 366 - { 367 - int err; 368 - 369 - err = mt76s_alloc_rx_queue(dev, MT_RXQ_MAIN); 370 - if (err < 0) 371 - return err; 372 - 373 - return mt76s_alloc_tx(dev); 374 - } 375 - EXPORT_SYMBOL_GPL(mt76s_alloc_queues); 82 + EXPORT_SYMBOL_GPL(mt76s_alloc_tx); 376 83 377 84 static struct mt76_queue_entry * 378 85 mt76s_get_next_rx_entry(struct mt76_queue *q) ··· 599 328 cancel_work_sync(&sdio->stat_work); 600 329 clear_bit(MT76_READING_STATS, &dev->phy.state); 601 330 602 - mt76_tx_status_check(dev, NULL, true); 331 + mt76_tx_status_check(dev, true); 603 332 604 333 sdio_claim_host(sdio->func); 605 334 sdio_release_irq(sdio->func);
+3 -1
drivers/net/wireless/mediatek/mt76/testmode.c
··· 2 2 /* Copyright (C) 2020 Felix Fietkau <nbd@nbd.name> */ 3 3 #include "mt76.h" 4 4 5 - static const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS] = { 5 + const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS] = { 6 6 [MT76_TM_ATTR_RESET] = { .type = NLA_FLAG }, 7 7 [MT76_TM_ATTR_STATE] = { .type = NLA_U8 }, 8 8 [MT76_TM_ATTR_TX_COUNT] = { .type = NLA_U32 }, ··· 21 21 [MT76_TM_ATTR_TX_IPG] = { .type = NLA_U32 }, 22 22 [MT76_TM_ATTR_TX_TIME] = { .type = NLA_U32 }, 23 23 [MT76_TM_ATTR_FREQ_OFFSET] = { .type = NLA_U32 }, 24 + [MT76_TM_ATTR_DRV_DATA] = { .type = NLA_NESTED }, 24 25 }; 26 + EXPORT_SYMBOL_GPL(mt76_tm_policy); 25 27 26 28 void mt76_testmode_tx_pending(struct mt76_phy *phy) 27 29 {
+7
drivers/net/wireless/mediatek/mt76/testmode.h
··· 44 44 * @MT76_TM_ATTR_TX_IPG: tx inter-packet gap, in unit of us (u32) 45 45 * @MT76_TM_ATTR_TX_TIME: packet transmission time, in unit of us (u32) 46 46 * 47 + * @MT76_TM_ATTR_DRV_DATA: driver specific netlink attrs (nested) 47 48 */ 48 49 enum mt76_testmode_attr { 49 50 MT76_TM_ATTR_UNSPEC, ··· 78 77 MT76_TM_ATTR_TX_DUTY_CYCLE, 79 78 MT76_TM_ATTR_TX_IPG, 80 79 MT76_TM_ATTR_TX_TIME, 80 + 81 + MT76_TM_ATTR_DRV_DATA, 81 82 82 83 /* keep last */ 83 84 NUM_MT76_TM_ATTRS, ··· 147 144 * @MT76_TM_STATE_TX_FRAMES: send a fixed number of test frames 148 145 * @MT76_TM_STATE_RX_FRAMES: receive packets and keep statistics 149 146 * @MT76_TM_STATE_TX_CONT: waveform tx without time gap 147 + * @MT76_TM_STATE_ON: test mode enabled used in offload firmware 150 148 */ 151 149 enum mt76_testmode_state { 152 150 MT76_TM_STATE_OFF, ··· 155 151 MT76_TM_STATE_TX_FRAMES, 156 152 MT76_TM_STATE_RX_FRAMES, 157 153 MT76_TM_STATE_TX_CONT, 154 + MT76_TM_STATE_ON, 158 155 159 156 /* keep last */ 160 157 NUM_MT76_TM_STATES, ··· 188 183 NUM_MT76_TM_TX_MODES, 189 184 MT76_TM_TX_MODE_MAX = NUM_MT76_TM_TX_MODES - 1, 190 185 }; 186 + 187 + extern const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS]; 191 188 192 189 #endif
+57 -27
drivers/net/wireless/mediatek/mt76/tx.c
··· 38 38 39 39 void 40 40 mt76_tx_status_lock(struct mt76_dev *dev, struct sk_buff_head *list) 41 - __acquires(&dev->status_list.lock) 41 + __acquires(&dev->status_lock) 42 42 { 43 43 __skb_queue_head_init(list); 44 - spin_lock_bh(&dev->status_list.lock); 44 + spin_lock_bh(&dev->status_lock); 45 45 } 46 46 EXPORT_SYMBOL_GPL(mt76_tx_status_lock); 47 47 48 48 void 49 49 mt76_tx_status_unlock(struct mt76_dev *dev, struct sk_buff_head *list) 50 - __releases(&dev->status_list.lock) 50 + __releases(&dev->status_lock) 51 51 { 52 52 struct ieee80211_hw *hw; 53 53 struct sk_buff *skb; 54 54 55 - spin_unlock_bh(&dev->status_list.lock); 55 + spin_unlock_bh(&dev->status_lock); 56 56 57 57 rcu_read_lock(); 58 58 while ((skb = __skb_dequeue(list)) != NULL) { ··· 64 64 struct mt76_wcid *wcid; 65 65 66 66 wcid = rcu_dereference(dev->wcid[cb->wcid]); 67 - if (wcid) 67 + if (wcid) { 68 68 status.sta = wcid_to_sta(wcid); 69 + 70 + if (status.sta) 71 + status.rate = &wcid->rate; 72 + } 69 73 70 74 hw = mt76_tx_status_get_hw(dev, skb); 71 75 ieee80211_tx_status_ext(hw, &status); ··· 91 87 92 88 if ((flags & done) != done) 93 89 return; 94 - 95 - __skb_unlink(skb, &dev->status_list); 96 90 97 91 /* Tx status can be unreliable. if it fails, mark the frame as ACKed */ 98 92 if (flags & MT_TX_CB_TXS_FAILED) { ··· 118 116 struct mt76_tx_cb *cb = mt76_tx_skb_cb(skb); 119 117 int pid; 120 118 119 + memset(cb, 0, sizeof(*cb)); 120 + 121 121 if (!wcid) 122 122 return MT_PACKET_ID_NO_ACK; 123 123 ··· 130 126 IEEE80211_TX_CTL_RATE_CTRL_PROBE))) 131 127 return MT_PACKET_ID_NO_SKB; 132 128 133 - spin_lock_bh(&dev->status_list.lock); 129 + spin_lock_bh(&dev->status_lock); 134 130 135 - memset(cb, 0, sizeof(*cb)); 136 - pid = mt76_get_next_pkt_id(wcid); 131 + pid = idr_alloc(&wcid->pktid, skb, MT_PACKET_ID_FIRST, 132 + MT_PACKET_ID_MASK, GFP_ATOMIC); 133 + if (pid < 0) { 134 + pid = MT_PACKET_ID_NO_SKB; 135 + goto out; 136 + } 137 + 137 138 cb->wcid = wcid->idx; 138 139 cb->pktid = pid; 139 - cb->jiffies = jiffies; 140 140 141 - __skb_queue_tail(&dev->status_list, skb); 142 - spin_unlock_bh(&dev->status_list.lock); 141 + if (list_empty(&wcid->list)) 142 + list_add_tail(&wcid->list, &dev->wcid_list); 143 + 144 + out: 145 + spin_unlock_bh(&dev->status_lock); 143 146 144 147 return pid; 145 148 } ··· 156 145 mt76_tx_status_skb_get(struct mt76_dev *dev, struct mt76_wcid *wcid, int pktid, 157 146 struct sk_buff_head *list) 158 147 { 159 - struct sk_buff *skb, *tmp; 148 + struct sk_buff *skb; 149 + int id; 160 150 161 - skb_queue_walk_safe(&dev->status_list, skb, tmp) { 151 + lockdep_assert_held(&dev->status_lock); 152 + 153 + skb = idr_remove(&wcid->pktid, pktid); 154 + if (skb) 155 + goto out; 156 + 157 + /* look for stale entries in the wcid idr queue */ 158 + idr_for_each_entry(&wcid->pktid, skb, id) { 162 159 struct mt76_tx_cb *cb = mt76_tx_skb_cb(skb); 163 160 164 - if (wcid && cb->wcid != wcid->idx) 165 - continue; 161 + if (pktid >= 0) { 162 + if (!(cb->flags & MT_TX_CB_DMA_DONE)) 163 + continue; 166 164 167 - if (cb->pktid == pktid) 168 - return skb; 165 + if (!time_is_after_jiffies(cb->jiffies + 166 + MT_TX_STATUS_SKB_TIMEOUT)) 167 + continue; 168 + } 169 169 170 - if (pktid >= 0 && !time_after(jiffies, cb->jiffies + 171 - MT_TX_STATUS_SKB_TIMEOUT)) 172 - continue; 173 - 170 + /* It has been too long since DMA_DONE, time out this packet 171 + * and stop waiting for TXS callback. 172 + */ 173 + idr_remove(&wcid->pktid, cb->pktid); 174 174 __mt76_tx_status_skb_done(dev, skb, MT_TX_CB_TXS_FAILED | 175 175 MT_TX_CB_TXS_DONE, list); 176 176 } 177 177 178 - return NULL; 178 + out: 179 + if (idr_is_empty(&wcid->pktid)) 180 + list_del_init(&wcid->list); 181 + 182 + return skb; 179 183 } 180 184 EXPORT_SYMBOL_GPL(mt76_tx_status_skb_get); 181 185 182 186 void 183 - mt76_tx_status_check(struct mt76_dev *dev, struct mt76_wcid *wcid, bool flush) 187 + mt76_tx_status_check(struct mt76_dev *dev, bool flush) 184 188 { 189 + struct mt76_wcid *wcid, *tmp; 185 190 struct sk_buff_head list; 186 191 187 192 mt76_tx_status_lock(dev, &list); 188 - mt76_tx_status_skb_get(dev, wcid, flush ? -1 : 0, &list); 193 + list_for_each_entry_safe(wcid, tmp, &dev->wcid_list, list) 194 + mt76_tx_status_skb_get(dev, wcid, flush ? -1 : 0, &list); 189 195 mt76_tx_status_unlock(dev, &list); 190 196 } 191 197 EXPORT_SYMBOL_GPL(mt76_tx_status_check); ··· 225 197 void __mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid_idx, struct sk_buff *skb, 226 198 struct list_head *free_list) 227 199 { 200 + struct mt76_tx_cb *cb = mt76_tx_skb_cb(skb); 228 201 struct ieee80211_tx_status status = { 229 202 .skb = skb, 230 203 .free_list = free_list, ··· 255 226 } 256 227 #endif 257 228 258 - if (!skb->prev) { 229 + if (cb->pktid < MT_PACKET_ID_FIRST) { 259 230 hw = mt76_tx_status_get_hw(dev, skb); 260 231 status.sta = wcid_to_sta(wcid); 261 232 ieee80211_tx_status_ext(hw, &status); ··· 263 234 } 264 235 265 236 mt76_tx_status_lock(dev, &list); 237 + cb->jiffies = jiffies; 266 238 __mt76_tx_status_skb_done(dev, skb, MT_TX_CB_DMA_DONE, &list); 267 239 mt76_tx_status_unlock(dev, &list); 268 240
+1 -1
drivers/net/wireless/mediatek/mt76/usb.c
··· 1081 1081 1082 1082 mt76_worker_enable(&dev->usb.status_worker); 1083 1083 1084 - mt76_tx_status_check(dev, NULL, true); 1084 + mt76_tx_status_check(dev, true); 1085 1085 } 1086 1086 EXPORT_SYMBOL_GPL(mt76u_stop_tx); 1087 1087