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

Merge tag 'mt76-for-kvalo-2022-03-16' of https://github.com/nbd168/wireless

mt76 patches for 5.18

- bugfixes
- mbssid support for mt7915
- 6 GHz support for mt7915
- mt7921u driver

+1461 -462
+3 -2
drivers/net/wireless/mediatek/mt76/mac80211.c
··· 942 942 for (chains = status->chains; chains; chains >>= 1, chain_signal++) { 943 943 int cur, diff; 944 944 945 - if (!(chains & BIT(0))) 945 + cur = *chain_signal; 946 + if (!(chains & BIT(0)) || 947 + cur > 0) 946 948 continue; 947 949 948 - cur = *chain_signal; 949 950 if (cur > signal) 950 951 swap(cur, signal); 951 952
+11 -3
drivers/net/wireless/mediatek/mt76/mt76.h
··· 19 19 20 20 #define MT_MCU_RING_SIZE 32 21 21 #define MT_RX_BUF_SIZE 2048 22 - #define MT_SKB_HEAD_LEN 128 22 + #define MT_SKB_HEAD_LEN 256 23 23 24 24 #define MT_MAX_NON_AQL_PKT 16 25 25 #define MT_TXQ_FREE_THR 32 ··· 1274 1274 void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi, 1275 1275 struct mt76_sta_stats *stats); 1276 1276 int mt76_skb_adjust_pad(struct sk_buff *skb, int pad); 1277 + int __mt76u_vendor_request(struct mt76_dev *dev, u8 req, u8 req_type, 1278 + u16 val, u16 offset, void *buf, size_t len); 1277 1279 int mt76u_vendor_request(struct mt76_dev *dev, u8 req, 1278 1280 u8 req_type, u16 val, u16 offset, 1279 1281 void *buf, size_t len); 1280 1282 void mt76u_single_wr(struct mt76_dev *dev, const u8 req, 1281 1283 const u16 offset, const u32 val); 1282 - int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf, 1283 - bool ext); 1284 + void mt76u_read_copy(struct mt76_dev *dev, u32 offset, 1285 + void *data, int len); 1286 + u32 ___mt76u_rr(struct mt76_dev *dev, u8 req, u8 req_type, u32 addr); 1287 + void ___mt76u_wr(struct mt76_dev *dev, u8 req, u8 req_type, 1288 + u32 addr, u32 val); 1289 + int __mt76u_init(struct mt76_dev *dev, struct usb_interface *intf, 1290 + struct mt76_bus_ops *ops); 1291 + int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf); 1284 1292 int mt76u_alloc_mcu_queue(struct mt76_dev *dev); 1285 1293 int mt76u_alloc_queues(struct mt76_dev *dev); 1286 1294 void mt76u_stop_tx(struct mt76_dev *dev);
+1 -1
drivers/net/wireless/mediatek/mt76/mt7603/dma.c
··· 76 76 __le32 *end = (__le32 *)&skb->data[skb->len]; 77 77 enum rx_pkt_type type; 78 78 79 - type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 79 + type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE); 80 80 81 81 if (q == MT_RXQ_MCU) { 82 82 if (type == PKT_TYPE_RX_EVENT)
+3 -6
drivers/net/wireless/mediatek/mt76/mt7603/mac.c
··· 1130 1130 } 1131 1131 1132 1132 rate_set_tsf = READ_ONCE(sta->rate_set_tsf); 1133 - rs_idx = !((u32)(FIELD_GET(MT_TXS1_F0_TIMESTAMP, le32_to_cpu(txs_data[1])) - 1133 + rs_idx = !((u32)(le32_get_bits(txs_data[1], MT_TXS1_F0_TIMESTAMP) - 1134 1134 rate_set_tsf) < 1000000); 1135 1135 rs_idx ^= rate_set_tsf & BIT(0); 1136 1136 rs = &sta->rateset[rs_idx]; ··· 1244 1244 struct mt7603_sta *msta = NULL; 1245 1245 struct mt76_wcid *wcid; 1246 1246 __le32 *txs_data = data; 1247 - u32 txs; 1248 1247 u8 wcidx; 1249 1248 u8 pid; 1250 1249 1251 - txs = le32_to_cpu(txs_data[4]); 1252 - pid = FIELD_GET(MT_TXS4_PID, txs); 1253 - txs = le32_to_cpu(txs_data[3]); 1254 - wcidx = FIELD_GET(MT_TXS3_WCID, txs); 1250 + pid = le32_get_bits(txs_data[4], MT_TXS4_PID); 1251 + wcidx = le32_get_bits(txs_data[3], MT_TXS3_WCID); 1255 1252 1256 1253 if (pid == MT_PACKET_ID_NO_ACK) 1257 1254 return;
+9 -11
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
··· 261 261 struct ieee80211_hdr hdr; 262 262 u16 frame_control; 263 263 264 - if (FIELD_GET(MT_RXD1_NORMAL_ADDR_TYPE, le32_to_cpu(rxd[1])) != 264 + if (le32_get_bits(rxd[1], MT_RXD1_NORMAL_ADDR_TYPE) != 265 265 MT_RXD1_NORMAL_U2M) 266 266 return -EINVAL; 267 267 ··· 1427 1427 } 1428 1428 1429 1429 rate_set_tsf = READ_ONCE(sta->rate_set_tsf); 1430 - rs_idx = !((u32)(FIELD_GET(MT_TXS4_F0_TIMESTAMP, le32_to_cpu(txs_data[4])) - 1430 + rs_idx = !((u32)(le32_get_bits(txs_data[4], MT_TXS4_F0_TIMESTAMP) - 1431 1431 rate_set_tsf) < 1000000); 1432 1432 rs_idx ^= rate_set_tsf & BIT(0); 1433 1433 rs = &sta->rateset[rs_idx]; ··· 1558 1558 struct mt76_wcid *wcid; 1559 1559 struct mt76_phy *mphy = &dev->mt76.phy; 1560 1560 __le32 *txs_data = data; 1561 - u32 txs; 1562 1561 u8 wcidx; 1563 1562 u8 pid; 1564 1563 1565 - txs = le32_to_cpu(txs_data[0]); 1566 - pid = FIELD_GET(MT_TXS0_PID, txs); 1567 - txs = le32_to_cpu(txs_data[2]); 1568 - wcidx = FIELD_GET(MT_TXS2_WCID, txs); 1564 + pid = le32_get_bits(txs_data[0], MT_TXS0_PID); 1565 + wcidx = le32_get_bits(txs_data[2], MT_TXS2_WCID); 1569 1566 1570 1567 if (pid == MT_PACKET_ID_NO_ACK) 1571 1568 return; ··· 1650 1653 mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[i], false); 1651 1654 } 1652 1655 1653 - count = FIELD_GET(MT_TX_FREE_MSDU_ID_CNT, le16_to_cpu(free->ctrl)); 1656 + count = le16_get_bits(free->ctrl, MT_TX_FREE_MSDU_ID_CNT); 1654 1657 if (is_mt7615(&dev->mt76)) { 1655 1658 __le16 *token = &free->token[0]; 1656 1659 ··· 1683 1686 __le32 *end = (__le32 *)&rxd[len / 4]; 1684 1687 enum rx_pkt_type type; 1685 1688 1686 - type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 1689 + type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE); 1690 + 1687 1691 switch (type) { 1688 1692 case PKT_TYPE_TXRX_NOTIFY: 1689 1693 mt7615_mac_tx_free(dev, data, len); ··· 1708 1710 enum rx_pkt_type type; 1709 1711 u16 flag; 1710 1712 1711 - type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 1712 - flag = FIELD_GET(MT_RXD0_PKT_FLAG, le32_to_cpu(rxd[0])); 1713 + type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE); 1714 + flag = le32_get_bits(rxd[0], MT_RXD0_PKT_FLAG); 1713 1715 if (type == PKT_TYPE_RX_EVENT && flag == 0x1) 1714 1716 type = PKT_TYPE_NORMAL_MCU; 1715 1717
+3 -2
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
··· 880 880 NULL, wtbl_hdr); 881 881 if (sta) 882 882 mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, wskb, sta, 883 - NULL, wtbl_hdr, true); 883 + NULL, wtbl_hdr, true, true); 884 884 mt76_connac_mcu_wtbl_hdr_trans_tlv(wskb, vif, &msta->wcid, 885 885 NULL, wtbl_hdr); 886 886 } ··· 2151 2151 .center_chan2 = ieee80211_frequency_to_channel(freq2), 2152 2152 }; 2153 2153 2154 - if (cmd == MCU_EXT_CMD(SET_RX_PATH)) 2154 + if (cmd == MCU_EXT_CMD(SET_RX_PATH) || 2155 + dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR) 2155 2156 req.switch_reason = CH_SWITCH_NORMAL; 2156 2157 else if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) 2157 2158 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
+1
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
··· 559 559 struct mt76_queue_entry *e); 560 560 int mt7663_usb_sdio_register_device(struct mt7615_dev *dev); 561 561 int mt7663u_mcu_init(struct mt7615_dev *dev); 562 + int mt7663u_mcu_power_on(struct mt7615_dev *dev); 562 563 563 564 /* sdio */ 564 565 int mt7663s_mcu_init(struct mt7615_dev *dev);
+72 -18
drivers/net/wireless/mediatek/mt76/mt7615/usb.c
··· 21 21 { }, 22 22 }; 23 23 24 + static u32 mt7663u_rr(struct mt76_dev *dev, u32 addr) 25 + { 26 + u32 ret; 27 + 28 + mutex_lock(&dev->usb.usb_ctrl_mtx); 29 + ret = ___mt76u_rr(dev, MT_VEND_READ_EXT, 30 + USB_DIR_IN | USB_TYPE_VENDOR, addr); 31 + mutex_unlock(&dev->usb.usb_ctrl_mtx); 32 + 33 + return ret; 34 + } 35 + 36 + static void mt7663u_wr(struct mt76_dev *dev, u32 addr, u32 val) 37 + { 38 + mutex_lock(&dev->usb.usb_ctrl_mtx); 39 + ___mt76u_wr(dev, MT_VEND_WRITE_EXT, 40 + USB_DIR_OUT | USB_TYPE_VENDOR, addr, val); 41 + mutex_unlock(&dev->usb.usb_ctrl_mtx); 42 + } 43 + 44 + static u32 mt7663u_rmw(struct mt76_dev *dev, u32 addr, 45 + u32 mask, u32 val) 46 + { 47 + mutex_lock(&dev->usb.usb_ctrl_mtx); 48 + val |= ___mt76u_rr(dev, MT_VEND_READ_EXT, 49 + USB_DIR_IN | USB_TYPE_VENDOR, addr) & ~mask; 50 + ___mt76u_wr(dev, MT_VEND_WRITE_EXT, 51 + USB_DIR_OUT | USB_TYPE_VENDOR, addr, val); 52 + mutex_unlock(&dev->usb.usb_ctrl_mtx); 53 + 54 + return val; 55 + } 56 + 57 + static void mt7663u_copy(struct mt76_dev *dev, u32 offset, 58 + const void *data, int len) 59 + { 60 + struct mt76_usb *usb = &dev->usb; 61 + int ret, i = 0, batch_len; 62 + const u8 *val = data; 63 + 64 + len = round_up(len, 4); 65 + 66 + mutex_lock(&usb->usb_ctrl_mtx); 67 + while (i < len) { 68 + batch_len = min_t(int, usb->data_len, len - i); 69 + memcpy(usb->data, val + i, batch_len); 70 + ret = __mt76u_vendor_request(dev, MT_VEND_WRITE_EXT, 71 + USB_DIR_OUT | USB_TYPE_VENDOR, 72 + (offset + i) >> 16, offset + i, 73 + usb->data, batch_len); 74 + if (ret < 0) 75 + break; 76 + 77 + i += batch_len; 78 + } 79 + mutex_unlock(&usb->usb_ctrl_mtx); 80 + } 81 + 24 82 static void mt7663u_stop(struct ieee80211_hw *hw) 25 83 { 26 84 struct mt7615_phy *phy = mt7615_hw_phy(hw); ··· 124 66 .sta_remove = mt7615_mac_sta_remove, 125 67 .update_survey = mt7615_update_channel, 126 68 }; 69 + static struct mt76_bus_ops bus_ops = { 70 + .rr = mt7663u_rr, 71 + .wr = mt7663u_wr, 72 + .rmw = mt7663u_rmw, 73 + .read_copy = mt76u_read_copy, 74 + .write_copy = mt7663u_copy, 75 + .type = MT76_BUS_USB, 76 + }; 127 77 struct usb_device *udev = interface_to_usbdev(usb_intf); 128 78 struct ieee80211_ops *ops; 129 79 struct mt7615_dev *dev; ··· 158 92 INIT_WORK(&dev->mcu_work, mt7663u_init_work); 159 93 dev->reg_map = mt7663_usb_sdio_reg_map; 160 94 dev->ops = ops; 161 - ret = mt76u_init(mdev, usb_intf, true); 95 + ret = __mt76u_init(mdev, usb_intf, &bus_ops); 162 96 if (ret < 0) 163 97 goto error; 164 98 ··· 166 100 (mt76_rr(dev, MT_HW_REV) & 0xff); 167 101 dev_dbg(mdev->dev, "ASIC revision: %04x\n", mdev->rev); 168 102 169 - if (mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_PWR_ON, 170 - FW_STATE_PWR_ON << 1, 500)) { 171 - dev_dbg(dev->mt76.dev, "Usb device already powered on\n"); 172 - set_bit(MT76_STATE_POWER_OFF, &dev->mphy.state); 173 - goto alloc_queues; 174 - } 175 - 176 - ret = mt76u_vendor_request(&dev->mt76, MT_VEND_POWER_ON, 177 - USB_DIR_OUT | USB_TYPE_VENDOR, 178 - 0x0, 0x1, NULL, 0); 179 - if (ret) 180 - goto error; 181 - 182 103 if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_PWR_ON, 183 104 FW_STATE_PWR_ON << 1, 500)) { 184 - dev_err(dev->mt76.dev, "Timeout for power on\n"); 185 - ret = -EIO; 186 - goto error; 105 + ret = mt7663u_mcu_power_on(dev); 106 + if (ret) 107 + goto error; 108 + } else { 109 + set_bit(MT76_STATE_POWER_OFF, &dev->mphy.state); 187 110 } 188 111 189 - alloc_queues: 190 112 ret = mt76u_alloc_mcu_queue(&dev->mt76); 191 113 if (ret) 192 114 goto error;
+26 -12
drivers/net/wireless/mediatek/mt76/mt7615/usb_mcu.c
··· 42 42 return ret; 43 43 } 44 44 45 + int mt7663u_mcu_power_on(struct mt7615_dev *dev) 46 + { 47 + int ret; 48 + 49 + ret = mt76u_vendor_request(&dev->mt76, MT_VEND_POWER_ON, 50 + USB_DIR_OUT | USB_TYPE_VENDOR, 51 + 0x0, 0x1, NULL, 0); 52 + if (ret) 53 + return ret; 54 + 55 + if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, 56 + MT_TOP_MISC2_FW_PWR_ON, 57 + FW_STATE_PWR_ON << 1, 500)) { 58 + dev_err(dev->mt76.dev, "Timeout for power on\n"); 59 + ret = -EIO; 60 + } 61 + 62 + return 0; 63 + } 64 + 45 65 int mt7663u_mcu_init(struct mt7615_dev *dev) 46 66 { 47 67 static const struct mt76_mcu_ops mt7663u_mcu_ops = { ··· 77 57 78 58 mt76_set(dev, MT_UDMA_TX_QSEL, MT_FW_DL_EN); 79 59 if (test_and_clear_bit(MT76_STATE_POWER_OFF, &dev->mphy.state)) { 80 - mt7615_mcu_restart(&dev->mt76); 81 - if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, 82 - MT_TOP_MISC2_FW_PWR_ON, 0, 500)) 83 - return -EIO; 84 - 85 - ret = mt76u_vendor_request(&dev->mt76, MT_VEND_POWER_ON, 86 - USB_DIR_OUT | USB_TYPE_VENDOR, 87 - 0x0, 0x1, NULL, 0); 60 + ret = mt7615_mcu_restart(&dev->mt76); 88 61 if (ret) 89 62 return ret; 90 63 91 64 if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, 92 - MT_TOP_MISC2_FW_PWR_ON, 93 - FW_STATE_PWR_ON << 1, 500)) { 94 - dev_err(dev->mt76.dev, "Timeout for power on\n"); 65 + MT_TOP_MISC2_FW_PWR_ON, 0, 500)) 95 66 return -EIO; 96 - } 67 + 68 + ret = mt7663u_mcu_power_on(dev); 69 + if (ret) 70 + return ret; 97 71 } 98 72 99 73 ret = __mt7663_load_firmware(dev);
+39 -15
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
··· 899 899 900 900 void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb, 901 901 struct ieee80211_sta *sta, void *sta_wtbl, 902 - void *wtbl_tlv, bool ldpc) 902 + void *wtbl_tlv, bool ht_ldpc, bool vht_ldpc) 903 903 { 904 904 struct wtbl_ht *ht = NULL; 905 905 struct tlv *tlv; 906 906 u32 flags = 0; 907 907 908 - if (sta->ht_cap.ht_supported) { 908 + if (sta->ht_cap.ht_supported || sta->he_6ghz_capa.capa) { 909 909 tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht), 910 910 wtbl_tlv, sta_wtbl); 911 911 ht = (struct wtbl_ht *)tlv; 912 - ht->ldpc = ldpc && 912 + ht->ldpc = ht_ldpc && 913 913 !!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING); 914 - ht->af = sta->ht_cap.ampdu_factor; 915 - ht->mm = sta->ht_cap.ampdu_density; 914 + 915 + if (sta->ht_cap.ht_supported) { 916 + ht->af = sta->ht_cap.ampdu_factor; 917 + ht->mm = sta->ht_cap.ampdu_density; 918 + } else { 919 + ht->af = le16_get_bits(sta->he_6ghz_capa.capa, 920 + IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 921 + ht->mm = le16_get_bits(sta->he_6ghz_capa.capa, 922 + IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START); 923 + } 924 + 916 925 ht->ht = true; 917 926 } 918 927 919 - if (sta->vht_cap.vht_supported) { 928 + if (sta->vht_cap.vht_supported || sta->he_6ghz_capa.capa) { 920 929 struct wtbl_vht *vht; 921 930 u8 af; 922 931 ··· 933 924 sizeof(*vht), wtbl_tlv, 934 925 sta_wtbl); 935 926 vht = (struct wtbl_vht *)tlv; 936 - vht->ldpc = ldpc && 927 + vht->ldpc = vht_ldpc && 937 928 !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC); 938 929 vht->vht = true; 939 930 ··· 1013 1004 sta_wtbl, wtbl_hdr); 1014 1005 if (info->sta) 1015 1006 mt76_connac_mcu_wtbl_ht_tlv(dev, skb, info->sta, 1016 - sta_wtbl, wtbl_hdr, true); 1007 + sta_wtbl, wtbl_hdr, 1008 + true, true); 1017 1009 } 1018 1010 1019 1011 return mt76_mcu_skb_send_msg(dev, skb, info->cmd, true); ··· 1054 1044 } 1055 1045 1056 1046 if (enable && tx) { 1057 - u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 }; 1047 + static const u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 }; 1058 1048 int i; 1059 1049 1060 1050 for (i = 7; i > 0; i--) { ··· 1251 1241 1252 1242 if (he_cap && he_cap->has_he) 1253 1243 mode |= PHY_MODE_AX_24G; 1254 - } else if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) { 1244 + } else if (band == NL80211_BAND_5GHZ) { 1255 1245 mode |= PHY_MODE_A; 1256 1246 1257 1247 if (ht_cap->ht_supported) ··· 1260 1250 if (vht_cap->vht_supported) 1261 1251 mode |= PHY_MODE_AC; 1262 1252 1263 - if (he_cap && he_cap->has_he && band == NL80211_BAND_5GHZ) 1253 + if (he_cap && he_cap->has_he) 1264 1254 mode |= PHY_MODE_AX_5G; 1255 + } else if (band == NL80211_BAND_6GHZ) { 1256 + mode |= PHY_MODE_A | PHY_MODE_AN | 1257 + PHY_MODE_AC | PHY_MODE_AX_5G; 1265 1258 } 1266 1259 1267 1260 return mode; ··· 2675 2662 struct bss_info_basic *bss; 2676 2663 struct tlv *tlv; 2677 2664 2665 + tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss)); 2666 + bss = (struct bss_info_basic *)tlv; 2667 + 2678 2668 switch (vif->type) { 2679 2669 case NL80211_IFTYPE_MESH_POINT: 2680 - case NL80211_IFTYPE_AP: 2681 2670 case NL80211_IFTYPE_MONITOR: 2671 + break; 2672 + case NL80211_IFTYPE_AP: 2673 + if (ieee80211_hw_check(phy->hw, SUPPORTS_MULTI_BSSID)) { 2674 + u8 bssid_id = vif->bss_conf.bssid_indicator; 2675 + struct wiphy *wiphy = phy->hw->wiphy; 2676 + 2677 + if (bssid_id > ilog2(wiphy->mbssid_max_interfaces)) 2678 + return -EINVAL; 2679 + 2680 + bss->non_tx_bssid = vif->bss_conf.bssid_index; 2681 + bss->max_bssid = bssid_id; 2682 + } 2682 2683 break; 2683 2684 case NL80211_IFTYPE_STATION: 2684 2685 if (enable) { ··· 2718 2691 break; 2719 2692 } 2720 2693 2721 - tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss)); 2722 - 2723 - bss = (struct bss_info_basic *)tlv; 2724 2694 bss->network_type = cpu_to_le32(type); 2725 2695 bss->bmc_wcid_lo = to_wcid_lo(wlan_idx); 2726 2696 bss->bmc_wcid_hi = to_wcid_hi(wlan_idx);
+2 -1
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
··· 993 993 MCU_UNI_CMD_SUSPEND = 0x05, 994 994 MCU_UNI_CMD_OFFLOAD = 0x06, 995 995 MCU_UNI_CMD_HIF_CTRL = 0x07, 996 + MCU_UNI_CMD_SNIFFER = 0x24, 996 997 }; 997 998 998 999 enum { ··· 1562 1561 u8 rcpi, u8 state); 1563 1562 void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb, 1564 1563 struct ieee80211_sta *sta, void *sta_wtbl, 1565 - void *wtbl_tlv, bool ldpc); 1564 + void *wtbl_tlv, bool ht_ldpc, bool vht_ldpc); 1566 1565 void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb, 1567 1566 struct ieee80211_ampdu_params *params, 1568 1567 bool enable, bool tx, void *sta_wtbl,
+1 -1
drivers/net/wireless/mediatek/mt76/mt76x0/usb.c
··· 245 245 usb_set_intfdata(usb_intf, dev); 246 246 247 247 mt76x02u_init_mcu(mdev); 248 - ret = mt76u_init(mdev, usb_intf, false); 248 + ret = mt76u_init(mdev, usb_intf); 249 249 if (ret) 250 250 goto err; 251 251
+1 -1
drivers/net/wireless/mediatek/mt76/mt76x2/usb.c
··· 57 57 usb_set_intfdata(intf, dev); 58 58 59 59 mt76x02u_init_mcu(mdev); 60 - err = mt76u_init(mdev, intf, false); 60 + err = mt76u_init(mdev, intf); 61 61 if (err < 0) 62 62 goto err; 63 63
+53 -29
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
··· 135 135 136 136 val = eeprom[MT_EE_WIFI_CONF + phy->band_idx]; 137 137 val = FIELD_GET(MT_EE_WIFI_CONF0_BAND_SEL, val); 138 - if (val == MT_EE_BAND_SEL_DEFAULT && 139 - (!is_mt7915(&dev->mt76) || dev->dbdc_support)) 140 - val = phy->band_idx ? MT_EE_BAND_SEL_5GHZ : MT_EE_BAND_SEL_2GHZ; 138 + 139 + if (!is_mt7915(&dev->mt76)) { 140 + switch (val) { 141 + case MT_EE_V2_BAND_SEL_5GHZ: 142 + phy->mt76->cap.has_5ghz = true; 143 + return; 144 + case MT_EE_V2_BAND_SEL_6GHZ: 145 + phy->mt76->cap.has_6ghz = true; 146 + return; 147 + case MT_EE_V2_BAND_SEL_5GHZ_6GHZ: 148 + phy->mt76->cap.has_5ghz = true; 149 + phy->mt76->cap.has_6ghz = true; 150 + return; 151 + default: 152 + phy->mt76->cap.has_2ghz = true; 153 + return; 154 + } 155 + } 141 156 142 157 switch (val) { 143 158 case MT_EE_BAND_SEL_5GHZ: ··· 263 248 { 264 249 u8 *eeprom = dev->mt76.eeprom.data; 265 250 int index, target_power; 266 - bool tssi_on; 251 + bool tssi_on, is_7976; 267 252 268 253 if (chain_idx > 3) 269 254 return -EINVAL; 270 255 271 256 tssi_on = mt7915_tssi_enabled(dev, chan->band); 257 + is_7976 = mt7915_check_adie(dev, false) || is_mt7916(&dev->mt76); 272 258 273 259 if (chan->band == NL80211_BAND_2GHZ) { 274 - u32 power = is_mt7915(&dev->mt76) ? 275 - MT_EE_TX0_POWER_2G : MT_EE_TX0_POWER_2G_V2; 260 + if (is_7976) { 261 + index = MT_EE_TX0_POWER_2G_V2 + chain_idx; 262 + target_power = eeprom[index]; 263 + } else { 264 + index = MT_EE_TX0_POWER_2G + chain_idx * 3; 265 + target_power = eeprom[index]; 276 266 277 - index = power + chain_idx * 3; 278 - target_power = eeprom[index]; 267 + if (!tssi_on) 268 + target_power += eeprom[index + 1]; 269 + } 270 + } else if (chan->band == NL80211_BAND_5GHZ) { 271 + int group = mt7915_get_channel_group_5g(chan->hw_value, is_7976); 279 272 280 - if (!tssi_on) 281 - target_power += eeprom[index + 1]; 273 + if (is_7976) { 274 + index = MT_EE_TX0_POWER_5G_V2 + chain_idx * 5; 275 + target_power = eeprom[index + group]; 276 + } else { 277 + index = MT_EE_TX0_POWER_5G + chain_idx * 12; 278 + target_power = eeprom[index + group]; 279 + 280 + if (!tssi_on) 281 + target_power += eeprom[index + 8]; 282 + } 282 283 } else { 283 - int group = mt7915_get_channel_group(chan->hw_value); 284 - u32 power = is_mt7915(&dev->mt76) ? 285 - MT_EE_TX0_POWER_5G : MT_EE_TX0_POWER_5G_V2; 284 + int group = mt7915_get_channel_group_6g(chan->hw_value); 286 285 287 - index = power + chain_idx * 12; 288 - target_power = eeprom[index + group]; 289 - 290 - if (!tssi_on) 291 - target_power += eeprom[index + 8]; 286 + index = MT_EE_TX0_POWER_6G_V2 + chain_idx * 8; 287 + target_power = is_7976 ? eeprom[index + group] : 0; 292 288 } 293 289 294 290 return target_power; ··· 308 282 s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band) 309 283 { 310 284 u8 *eeprom = dev->mt76.eeprom.data; 311 - u32 val; 285 + u32 val, offs; 312 286 s8 delta; 313 - u32 rate_2g, rate_5g; 314 - 315 - rate_2g = is_mt7915(&dev->mt76) ? 316 - MT_EE_RATE_DELTA_2G : MT_EE_RATE_DELTA_2G_V2; 317 - 318 - rate_5g = is_mt7915(&dev->mt76) ? 319 - MT_EE_RATE_DELTA_5G : MT_EE_RATE_DELTA_5G_V2; 287 + bool is_7976 = mt7915_check_adie(dev, false) || is_mt7916(&dev->mt76); 320 288 321 289 if (band == NL80211_BAND_2GHZ) 322 - val = eeprom[rate_2g]; 290 + offs = is_7976 ? MT_EE_RATE_DELTA_2G_V2 : MT_EE_RATE_DELTA_2G; 291 + else if (band == NL80211_BAND_5GHZ) 292 + offs = is_7976 ? MT_EE_RATE_DELTA_5G_V2 : MT_EE_RATE_DELTA_5G; 323 293 else 324 - val = eeprom[rate_5g]; 294 + offs = is_7976 ? MT_EE_RATE_DELTA_6G_V2 : 0; 325 295 326 - if (!(val & MT_EE_RATE_DELTA_EN)) 296 + val = eeprom[offs]; 297 + 298 + if (!offs || !(val & MT_EE_RATE_DELTA_EN)) 327 299 return 0; 328 300 329 301 delta = FIELD_GET(MT_EE_RATE_DELTA_MASK, val);
+31 -1
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h
··· 25 25 MT_EE_TX0_POWER_5G = 0x34b, 26 26 MT_EE_RATE_DELTA_2G_V2 = 0x7d3, 27 27 MT_EE_RATE_DELTA_5G_V2 = 0x81e, 28 + MT_EE_RATE_DELTA_6G_V2 = 0x884, /* 6g fields only appear in eeprom v2 */ 28 29 MT_EE_TX0_POWER_2G_V2 = 0x441, 29 30 MT_EE_TX0_POWER_5G_V2 = 0x445, 31 + MT_EE_TX0_POWER_6G_V2 = 0x465, 30 32 MT_EE_ADIE_FT_VERSION = 0x9a0, 31 33 32 34 __MT_EE_MAX = 0xe00, ··· 78 76 MT_EE_BAND_SEL_DUAL, 79 77 }; 80 78 79 + enum { 80 + MT_EE_V2_BAND_SEL_2GHZ, 81 + MT_EE_V2_BAND_SEL_5GHZ, 82 + MT_EE_V2_BAND_SEL_6GHZ, 83 + MT_EE_V2_BAND_SEL_5GHZ_6GHZ, 84 + }; 85 + 81 86 enum mt7915_sku_rate_group { 82 87 SKU_CCK, 83 88 SKU_OFDM, ··· 105 96 }; 106 97 107 98 static inline int 108 - mt7915_get_channel_group(int channel) 99 + mt7915_get_channel_group_5g(int channel, bool is_7976) 109 100 { 101 + if (is_7976) { 102 + if (channel <= 64) 103 + return 0; 104 + if (channel <= 96) 105 + return 1; 106 + if (channel <= 128) 107 + return 2; 108 + if (channel <= 144) 109 + return 3; 110 + return 4; 111 + } 112 + 110 113 if (channel >= 184 && channel <= 196) 111 114 return 0; 112 115 if (channel <= 48) ··· 134 113 if (channel <= 144) 135 114 return 6; 136 115 return 7; 116 + } 117 + 118 + static inline int 119 + mt7915_get_channel_group_6g(int channel) 120 + { 121 + if (channel <= 29) 122 + return 0; 123 + 124 + return DIV_ROUND_UP(channel - 29, 32); 137 125 } 138 126 139 127 static inline bool
+51 -8
drivers/net/wireless/mediatek/mt76/mt7915/init.c
··· 312 312 313 313 mt7915_init_txpower(dev, &mphy->sband_2g.sband); 314 314 mt7915_init_txpower(dev, &mphy->sband_5g.sband); 315 + mt7915_init_txpower(dev, &mphy->sband_6g.sband); 315 316 316 317 mphy->dfs_state = MT_DFS_STATE_UNKNOWN; 317 318 mt7915_dfs_init_radar_detector(phy); ··· 343 342 wiphy->n_iface_combinations = ARRAY_SIZE(if_comb); 344 343 wiphy->reg_notifier = mt7915_regd_notifier; 345 344 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; 345 + wiphy->mbssid_max_interfaces = 16; 346 346 347 347 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BSS_COLOR); 348 348 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_VHT_IBSS); ··· 361 359 ieee80211_hw_set(hw, HAS_RATE_CONTROL); 362 360 ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD); 363 361 ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD); 362 + ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID); 364 363 ieee80211_hw_set(hw, WANT_MONITOR_VIF); 365 364 366 365 hw->max_tx_fragments = 4; ··· 561 558 mt7915_mac_init(dev); 562 559 mt7915_init_txpower(dev, &dev->mphy.sband_2g.sband); 563 560 mt7915_init_txpower(dev, &dev->mphy.sband_5g.sband); 561 + mt7915_init_txpower(dev, &dev->mphy.sband_6g.sband); 564 562 mt7915_txbf_init(dev); 565 563 } 566 564 ··· 583 579 val &= ~MT_TOP_PWR_SW_RST; 584 580 mt76_wr(dev, MT_TOP_PWR_CTRL, val); 585 581 586 - /* release wfsys then mcu re-excutes romcode */ 582 + /* release wfsys then mcu re-executes romcode */ 587 583 val |= MT_TOP_PWR_SW_RST; 588 584 mt76_wr(dev, MT_TOP_PWR_CTRL, val); 589 585 ··· 728 724 } 729 725 730 726 static void 731 - mt7915_set_stream_he_txbf_caps(struct ieee80211_sta_he_cap *he_cap, 727 + mt7915_set_stream_he_txbf_caps(struct mt7915_dev *dev, 728 + struct ieee80211_sta_he_cap *he_cap, 732 729 int vif, int nss) 733 730 { 734 731 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; 735 - u8 c; 732 + u8 c, nss_160; 733 + 734 + /* Can do 1/2 of NSS streams in 160Mhz mode for mt7915 */ 735 + if (is_mt7915(&dev->mt76) && !dev->dbdc_support) 736 + nss_160 = nss / 2; 737 + else 738 + nss_160 = nss; 736 739 737 740 #ifdef CONFIG_MAC80211_MESH 738 741 if (vif == NL80211_IFTYPE_MESH_POINT) ··· 793 782 /* num_snd_dim 794 783 * for mt7915, max supported nss is 2 for bw > 80MHz 795 784 */ 796 - c = (nss - 1) | 797 - IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2; 785 + c = FIELD_PREP(IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK, 786 + nss - 1) | 787 + FIELD_PREP(IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK, 788 + nss_160 - 1); 798 789 elem->phy_cap_info[5] |= c; 799 790 800 791 c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | 801 792 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB; 802 793 elem->phy_cap_info[6] |= c; 794 + 795 + if (!is_mt7915(&dev->mt76)) { 796 + c = IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ | 797 + IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ; 798 + elem->phy_cap_info[7] |= c; 799 + } 803 800 } 804 801 805 802 static void ··· 891 872 if (band == NL80211_BAND_2GHZ) 892 873 he_cap_elem->phy_cap_info[0] = 893 874 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G; 894 - else if (band == NL80211_BAND_5GHZ) 875 + else 895 876 he_cap_elem->phy_cap_info[0] = 896 877 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | 897 878 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | ··· 930 911 if (band == NL80211_BAND_2GHZ) 931 912 he_cap_elem->phy_cap_info[0] |= 932 913 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G; 933 - else if (band == NL80211_BAND_5GHZ) 914 + else 934 915 he_cap_elem->phy_cap_info[0] |= 935 916 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G; 936 917 ··· 969 950 he_mcs->rx_mcs_80p80 = cpu_to_le16(mcs_map_160); 970 951 he_mcs->tx_mcs_80p80 = cpu_to_le16(mcs_map_160); 971 952 972 - mt7915_set_stream_he_txbf_caps(he_cap, i, nss); 953 + mt7915_set_stream_he_txbf_caps(dev, he_cap, i, nss); 973 954 974 955 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); 975 956 if (he_cap_elem->phy_cap_info[6] & ··· 980 961 u8_encode_bits(IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US, 981 962 IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK); 982 963 } 964 + 965 + if (band == NL80211_BAND_6GHZ) { 966 + u16 cap = IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS | 967 + IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS; 968 + 969 + cap |= u16_encode_bits(IEEE80211_HT_MPDU_DENSITY_8, 970 + IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START) | 971 + u16_encode_bits(IEEE80211_VHT_MAX_AMPDU_1024K, 972 + IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP) | 973 + u16_encode_bits(IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454, 974 + IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN); 975 + 976 + data[idx].he_6ghz_capa.capa = cpu_to_le16(cap); 977 + } 978 + 983 979 idx++; 984 980 } 985 981 ··· 1021 987 n = mt7915_init_he_caps(phy, NL80211_BAND_5GHZ, data); 1022 988 1023 989 band = &phy->mt76->sband_5g.sband; 990 + band->iftype_data = data; 991 + band->n_iftype_data = n; 992 + } 993 + 994 + if (phy->mt76->cap.has_6ghz) { 995 + data = phy->iftype[NL80211_BAND_6GHZ]; 996 + n = mt7915_init_he_caps(phy, NL80211_BAND_6GHZ, data); 997 + 998 + band = &phy->mt76->sband_6g.sband; 1024 999 band->iftype_data = data; 1025 1000 band->n_iftype_data = n; 1026 1001 }
+88 -59
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
··· 226 226 u32 ru_h, ru_l; 227 227 u8 ru, offs = 0; 228 228 229 - ru_l = FIELD_GET(MT_PRXV_HE_RU_ALLOC_L, le32_to_cpu(rxv[0])); 230 - ru_h = FIELD_GET(MT_PRXV_HE_RU_ALLOC_H, le32_to_cpu(rxv[1])); 229 + ru_l = le32_get_bits(rxv[0], MT_PRXV_HE_RU_ALLOC_L); 230 + ru_h = le32_get_bits(rxv[1], MT_PRXV_HE_RU_ALLOC_H); 231 231 ru = (u8)(ru_l | ru_h << 4); 232 232 233 233 status->bw = RATE_INFO_BW_HE_RU; ··· 349 349 case MT_PHY_TYPE_HE_SU: 350 350 he->data1 |= HE_BITS(DATA1_FORMAT_SU) | 351 351 HE_BITS(DATA1_UL_DL_KNOWN) | 352 - HE_BITS(DATA1_BEAM_CHANGE_KNOWN); 352 + HE_BITS(DATA1_BEAM_CHANGE_KNOWN) | 353 + HE_BITS(DATA1_BW_RU_ALLOC_KNOWN); 353 354 354 355 he->data3 |= HE_PREP(DATA3_BEAM_CHANGE, BEAM_CHNG, rxv[14]) | 355 356 HE_PREP(DATA3_UL_DL, UPLINK, rxv[2]); 356 357 break; 357 358 case MT_PHY_TYPE_HE_EXT_SU: 358 359 he->data1 |= HE_BITS(DATA1_FORMAT_EXT_SU) | 359 - HE_BITS(DATA1_UL_DL_KNOWN); 360 + HE_BITS(DATA1_UL_DL_KNOWN) | 361 + HE_BITS(DATA1_BW_RU_ALLOC_KNOWN); 360 362 361 363 he->data3 |= HE_PREP(DATA3_UL_DL, UPLINK, rxv[2]); 362 364 break; ··· 402 400 struct ieee80211_hdr hdr; 403 401 u16 frame_control; 404 402 405 - if (FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, le32_to_cpu(rxd[3])) != 403 + if (le32_get_bits(rxd[3], MT_RXD3_NORMAL_ADDR_TYPE) != 406 404 MT_RXD3_NORMAL_U2M) 407 405 return -EINVAL; 408 406 ··· 640 638 status->band = mphy->chandef.chan->band; 641 639 if (status->band == NL80211_BAND_5GHZ) 642 640 sband = &mphy->sband_5g.sband; 641 + else if (status->band == NL80211_BAND_6GHZ) 642 + sband = &mphy->sband_6g.sband; 643 643 else 644 644 sband = &mphy->sband_2g.sband; 645 645 ··· 863 859 u8 snr; 864 860 int i; 865 861 866 - band_idx = FIELD_GET(MT_RXV_HDR_BAND_IDX, le32_to_cpu(rxv_hdr[1])); 862 + band_idx = le32_get_bits(rxv_hdr[1], MT_RXV_HDR_BAND_IDX); 867 863 if (band_idx && !phy->band_idx) 868 864 phy = mt7915_ext_phy(dev); 869 865 ··· 1105 1101 if (ieee80211_is_beacon(fc)) { 1106 1102 txwi[3] &= ~cpu_to_le32(MT_TXD3_SW_POWER_MGMT); 1107 1103 txwi[3] |= cpu_to_le32(MT_TXD3_REM_TX_COUNT); 1104 + txwi[7] |= cpu_to_le32(FIELD_PREP(MT_TXD7_SPE_IDX, 0x18)); 1108 1105 } 1109 1106 1110 1107 if (info->flags & IEEE80211_TX_CTL_INJECTED) { ··· 1220 1215 FIELD_PREP(MT_TXD1_WLAN_IDX, wcid->idx) | 1221 1216 FIELD_PREP(MT_TXD1_OWN_MAC, omac_idx); 1222 1217 1223 - if ((ext_phy || band_idx) && 1224 - q_idx >= MT_LMAC_ALTX0 && q_idx <= MT_LMAC_BCN0) 1218 + if (ext_phy || band_idx) 1225 1219 val |= MT_TXD1_TGID; 1226 1220 1227 1221 txwi[1] = cpu_to_le32(val); ··· 1354 1350 u16 fc, tid; 1355 1351 u32 val; 1356 1352 1357 - if (!sta || !sta->ht_cap.ht_supported) 1353 + if (!sta || !(sta->ht_cap.ht_supported || sta->he_cap.has_he)) 1358 1354 return; 1359 1355 1360 - tid = FIELD_GET(MT_TXD1_TID, le32_to_cpu(txwi[1])); 1356 + tid = le32_get_bits(txwi[1], MT_TXD1_TID); 1361 1357 if (tid >= 6) /* skip VO queue */ 1362 1358 return; 1363 1359 ··· 1405 1401 if (likely(t->skb->protocol != cpu_to_be16(ETH_P_PAE))) 1406 1402 mt7915_tx_check_aggr(sta, txwi); 1407 1403 } else { 1408 - wcid_idx = FIELD_GET(MT_TXD1_WLAN_IDX, le32_to_cpu(txwi[1])); 1404 + wcid_idx = le32_get_bits(txwi[1], MT_TXD1_WLAN_IDX); 1409 1405 } 1410 1406 1411 1407 __mt76_tx_complete_skb(mdev, wcid_idx, t->skb, free_list); ··· 1439 1435 mt76_queue_tx_cleanup(dev, mphy_ext->q_tx[MT_TXQ_BE], false); 1440 1436 } 1441 1437 1442 - /* 1443 - * TODO: MT_TX_FREE_LATENCY is msdu time from the TXD is queued into PLE, 1444 - * to the time ack is received or dropped by hw (air + hw queue time). 1445 - * Should avoid accessing WTBL to get Tx airtime, and use it instead. 1446 - */ 1447 - total = FIELD_GET(MT_TX_FREE_MSDU_CNT, le16_to_cpu(free->ctrl)); 1438 + total = le16_get_bits(free->ctrl, MT_TX_FREE_MSDU_CNT); 1448 1439 v3 = (FIELD_GET(MT_TX_FREE_VER, txd) == 0x4); 1449 1440 if (WARN_ON_ONCE((void *)&free->info[total >> v3] > end)) 1450 1441 return; ··· 1557 1558 1558 1559 if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) 1559 1560 sband = &mphy->sband_5g.sband; 1561 + else if (mphy->chandef.chan->band == NL80211_BAND_6GHZ) 1562 + sband = &mphy->sband_6g.sband; 1560 1563 else 1561 1564 sband = &mphy->sband_2g.sband; 1562 1565 ··· 1632 1631 struct mt76_wcid *wcid; 1633 1632 __le32 *txs_data = data; 1634 1633 u16 wcidx; 1635 - u32 txs; 1636 1634 u8 pid; 1637 1635 1638 - txs = le32_to_cpu(txs_data[0]); 1639 - if (FIELD_GET(MT_TXS0_TXS_FORMAT, txs) > 1) 1636 + if (le32_get_bits(txs_data[0], MT_TXS0_TXS_FORMAT) > 1) 1640 1637 return; 1641 1638 1642 - txs = le32_to_cpu(txs_data[2]); 1643 - wcidx = FIELD_GET(MT_TXS2_WCID, txs); 1644 - 1645 - txs = le32_to_cpu(txs_data[3]); 1646 - pid = FIELD_GET(MT_TXS3_PID, txs); 1639 + wcidx = le32_get_bits(txs_data[2], MT_TXS2_WCID); 1640 + pid = le32_get_bits(txs_data[3], MT_TXS3_PID); 1647 1641 1648 1642 if (pid < MT_PACKET_ID_FIRST) 1649 1643 return; ··· 1675 1679 __le32 *end = (__le32 *)&rxd[len / 4]; 1676 1680 enum rx_pkt_type type; 1677 1681 1678 - type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 1682 + type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE); 1683 + 1679 1684 switch (type) { 1680 1685 case PKT_TYPE_TXRX_NOTIFY: 1681 1686 mt7915_mac_tx_free(dev, data, len); ··· 1701 1704 __le32 *end = (__le32 *)&skb->data[skb->len]; 1702 1705 enum rx_pkt_type type; 1703 1706 1704 - type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 1707 + type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE); 1705 1708 1706 1709 switch (type) { 1707 1710 case PKT_TYPE_TXRX_NOTIFY: ··· 1800 1803 u32 ofdm = FIELD_PREP(MT_TIMEOUT_VAL_PLCP, 60) | 1801 1804 FIELD_PREP(MT_TIMEOUT_VAL_CCA, 28); 1802 1805 int offset; 1803 - bool is_5ghz = phy->mt76->chandef.chan->band == NL80211_BAND_5GHZ; 1806 + bool a_band = !(phy->mt76->chandef.chan->band == NL80211_BAND_2GHZ); 1804 1807 1805 1808 if (!test_bit(MT76_STATE_RUNNING, &phy->mt76->state)) 1806 1809 return; ··· 1820 1823 mt76_wr(dev, MT_TMAC_CDTR(phy->band_idx), cck + reg_offset); 1821 1824 mt76_wr(dev, MT_TMAC_ODTR(phy->band_idx), ofdm + reg_offset); 1822 1825 mt76_wr(dev, MT_TMAC_ICR0(phy->band_idx), 1823 - FIELD_PREP(MT_IFS_EIFS_OFDM, is_5ghz ? 84 : 78) | 1826 + FIELD_PREP(MT_IFS_EIFS_OFDM, a_band ? 84 : 78) | 1824 1827 FIELD_PREP(MT_IFS_RIFS, 2) | 1825 1828 FIELD_PREP(MT_IFS_SIFS, 10) | 1826 1829 FIELD_PREP(MT_IFS_SLOT, phy->slottime)); ··· 1828 1831 mt76_wr(dev, MT_TMAC_ICR1(phy->band_idx), 1829 1832 FIELD_PREP(MT_IFS_EIFS_CCK, 314)); 1830 1833 1831 - if (phy->slottime < 20 || is_5ghz) 1834 + if (phy->slottime < 20 || a_band) 1832 1835 val = MT7915_CFEND_RATE_DEFAULT; 1833 1836 else 1834 1837 val = MT7915_CFEND_RATE_11B; ··· 2187 2190 cnt = mt76_rr(dev, MT_MIB_SDR31(phy->band_idx)); 2188 2191 mib->rx_ba_cnt += cnt; 2189 2192 2190 - cnt = mt76_rr(dev, MT_MIB_SDR32(phy->band_idx)); 2191 - mib->tx_pkt_ebf_cnt += FIELD_GET(MT_MIB_SDR32_TX_PKT_EBF_CNT_MASK, cnt); 2192 - 2193 - if (is_mt7915(&dev->mt76)) 2194 - cnt = mt76_rr(dev, MT_MIB_SDR33(phy->band_idx)); 2195 - mib->tx_pkt_ibf_cnt += is_mt7915(&dev->mt76) ? 2196 - FIELD_GET(MT_MIB_SDR32_TX_PKT_IBF_CNT_MASK, cnt) : 2197 - FIELD_GET(MT_MIB_SDR32_TX_PKT_IBF_CNT_MASK_MT7916, cnt); 2198 - 2199 2193 cnt = mt76_rr(dev, MT_MIB_SDRMUBF(phy->band_idx)); 2200 2194 mib->tx_bf_cnt += FIELD_GET(MT_MIB_MU_BF_TX_CNT, cnt); 2201 2195 ··· 2199 2211 cnt = mt76_rr(dev, MT_MIB_DR11(phy->band_idx)); 2200 2212 mib->tx_su_acked_mpdu_cnt += cnt; 2201 2213 2202 - cnt = mt76_rr(dev, MT_ETBF_TX_APP_CNT(phy->band_idx)); 2203 - mib->tx_bf_ibf_ppdu_cnt += FIELD_GET(MT_ETBF_TX_IBF_CNT, cnt); 2204 - mib->tx_bf_ebf_ppdu_cnt += FIELD_GET(MT_ETBF_TX_EBF_CNT, cnt); 2205 - 2206 - cnt = mt76_rr(dev, MT_ETBF_RX_FB_CNT(phy->band_idx)); 2207 - mib->tx_bf_rx_fb_all_cnt += FIELD_GET(MT_ETBF_RX_FB_ALL, cnt); 2208 - mib->tx_bf_rx_fb_he_cnt += FIELD_GET(MT_ETBF_RX_FB_HE, cnt); 2209 - mib->tx_bf_rx_fb_vht_cnt += FIELD_GET(MT_ETBF_RX_FB_VHT, cnt); 2210 - mib->tx_bf_rx_fb_ht_cnt += FIELD_GET(MT_ETBF_RX_FB_HT, cnt); 2211 - 2212 - cnt = mt76_rr(dev, MT_ETBF_RX_FB_CONT(phy->band_idx)); 2213 - mib->tx_bf_rx_fb_bw = FIELD_GET(MT_ETBF_RX_FB_BW, cnt); 2214 - mib->tx_bf_rx_fb_nc_cnt += FIELD_GET(MT_ETBF_RX_FB_NC, cnt); 2215 - mib->tx_bf_rx_fb_nr_cnt += FIELD_GET(MT_ETBF_RX_FB_NR, cnt); 2216 - 2217 - cnt = mt76_rr(dev, MT_ETBF_TX_NDP_BFRP(phy->band_idx)); 2218 - mib->tx_bf_fb_cpl_cnt += FIELD_GET(MT_ETBF_TX_FB_CPL, cnt); 2219 - mib->tx_bf_fb_trig_cnt += FIELD_GET(MT_ETBF_TX_FB_TRI, cnt); 2214 + cnt = mt76_rr(dev, MT_ETBF_PAR_RPT0(phy->band_idx)); 2215 + mib->tx_bf_rx_fb_bw = FIELD_GET(MT_ETBF_PAR_RPT0_FB_BW, cnt); 2216 + mib->tx_bf_rx_fb_nc_cnt += FIELD_GET(MT_ETBF_PAR_RPT0_FB_NC, cnt); 2217 + mib->tx_bf_rx_fb_nr_cnt += FIELD_GET(MT_ETBF_PAR_RPT0_FB_NR, cnt); 2220 2218 2221 2219 for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++) { 2222 2220 cnt = mt76_rr(dev, MT_PLE_AMSDU_PACK_MSDU_CNT(i)); ··· 2231 2257 dev->mt76.aggr_stats[aggr1++] += val & 0xffff; 2232 2258 dev->mt76.aggr_stats[aggr1++] += val >> 16; 2233 2259 } 2260 + 2261 + cnt = mt76_rr(dev, MT_MIB_SDR32(phy->band_idx)); 2262 + mib->tx_pkt_ebf_cnt += FIELD_GET(MT_MIB_SDR32_TX_PKT_EBF_CNT, cnt); 2263 + 2264 + cnt = mt76_rr(dev, MT_MIB_SDR33(phy->band_idx)); 2265 + mib->tx_pkt_ibf_cnt += FIELD_GET(MT_MIB_SDR33_TX_PKT_IBF_CNT, cnt); 2266 + 2267 + cnt = mt76_rr(dev, MT_ETBF_TX_APP_CNT(phy->band_idx)); 2268 + mib->tx_bf_ibf_ppdu_cnt += FIELD_GET(MT_ETBF_TX_IBF_CNT, cnt); 2269 + mib->tx_bf_ebf_ppdu_cnt += FIELD_GET(MT_ETBF_TX_EBF_CNT, cnt); 2270 + 2271 + cnt = mt76_rr(dev, MT_ETBF_TX_NDP_BFRP(phy->band_idx)); 2272 + mib->tx_bf_fb_cpl_cnt += FIELD_GET(MT_ETBF_TX_FB_CPL, cnt); 2273 + mib->tx_bf_fb_trig_cnt += FIELD_GET(MT_ETBF_TX_FB_TRI, cnt); 2274 + 2275 + cnt = mt76_rr(dev, MT_ETBF_RX_FB_CNT(phy->band_idx)); 2276 + mib->tx_bf_rx_fb_all_cnt += FIELD_GET(MT_ETBF_RX_FB_ALL, cnt); 2277 + mib->tx_bf_rx_fb_he_cnt += FIELD_GET(MT_ETBF_RX_FB_HE, cnt); 2278 + mib->tx_bf_rx_fb_vht_cnt += FIELD_GET(MT_ETBF_RX_FB_VHT, cnt); 2279 + mib->tx_bf_rx_fb_ht_cnt += FIELD_GET(MT_ETBF_RX_FB_HT, cnt); 2234 2280 } else { 2235 2281 for (i = 0; i < 2; i++) { 2236 2282 /* rts count */ ··· 2279 2285 dev->mt76.aggr_stats[aggr0++] += FIELD_GET(GENMASK(15, 0), val); 2280 2286 dev->mt76.aggr_stats[aggr0++] += FIELD_GET(GENMASK(31, 16), val); 2281 2287 } 2288 + 2289 + cnt = mt76_rr(dev, MT_MIB_SDR32(phy->band_idx)); 2290 + mib->tx_pkt_ibf_cnt += FIELD_GET(MT_MIB_SDR32_TX_PKT_IBF_CNT, cnt); 2291 + mib->tx_bf_ibf_ppdu_cnt += FIELD_GET(MT_MIB_SDR32_TX_PKT_IBF_CNT, cnt); 2292 + mib->tx_pkt_ebf_cnt += FIELD_GET(MT_MIB_SDR32_TX_PKT_EBF_CNT, cnt); 2293 + mib->tx_bf_ebf_ppdu_cnt += FIELD_GET(MT_MIB_SDR32_TX_PKT_EBF_CNT, cnt); 2294 + 2295 + cnt = mt76_rr(dev, MT_MIB_BFCR7(phy->band_idx)); 2296 + mib->tx_bf_fb_cpl_cnt += FIELD_GET(MT_MIB_BFCR7_BFEE_TX_FB_CPL, cnt); 2297 + 2298 + cnt = mt76_rr(dev, MT_MIB_BFCR2(phy->band_idx)); 2299 + mib->tx_bf_fb_trig_cnt += FIELD_GET(MT_MIB_BFCR2_BFEE_TX_FB_TRIG, cnt); 2300 + 2301 + cnt = mt76_rr(dev, MT_MIB_BFCR0(phy->band_idx)); 2302 + mib->tx_bf_rx_fb_vht_cnt += FIELD_GET(MT_MIB_BFCR0_RX_FB_VHT, cnt); 2303 + mib->tx_bf_rx_fb_all_cnt += FIELD_GET(MT_MIB_BFCR0_RX_FB_VHT, cnt); 2304 + mib->tx_bf_rx_fb_ht_cnt += FIELD_GET(MT_MIB_BFCR0_RX_FB_HT, cnt); 2305 + mib->tx_bf_rx_fb_all_cnt += FIELD_GET(MT_MIB_BFCR0_RX_FB_HT, cnt); 2306 + 2307 + cnt = mt76_rr(dev, MT_MIB_BFCR1(phy->band_idx)); 2308 + mib->tx_bf_rx_fb_he_cnt += FIELD_GET(MT_MIB_BFCR1_RX_FB_HE, cnt); 2309 + mib->tx_bf_rx_fb_all_cnt += FIELD_GET(MT_MIB_BFCR1_RX_FB_HE, cnt); 2282 2310 } 2283 2311 } 2284 2312 ··· 2380 2364 2381 2365 static int mt7915_dfs_start_rdd(struct mt7915_dev *dev, int chain) 2382 2366 { 2383 - int err; 2367 + int err, region; 2368 + 2369 + switch (dev->mt76.region) { 2370 + case NL80211_DFS_ETSI: 2371 + region = 0; 2372 + break; 2373 + case NL80211_DFS_JP: 2374 + region = 2; 2375 + break; 2376 + case NL80211_DFS_FCC: 2377 + default: 2378 + region = 1; 2379 + break; 2380 + } 2384 2381 2385 2382 err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_START, chain, 2386 - MT_RX_SEL0, 0); 2383 + MT_RX_SEL0, region); 2387 2384 if (err < 0) 2388 2385 return err; 2389 2386
+91 -14
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
··· 821 821 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G)) 822 822 cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT; 823 823 824 - if (mvif->cap.ldpc && (elem->phy_cap_info[1] & 825 - IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)) 824 + if (mvif->cap.he_ldpc && 825 + (elem->phy_cap_info[1] & 826 + IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)) 826 827 cap |= STA_REC_HE_CAP_LDPC; 827 828 828 829 if (elem->phy_cap_info[1] & ··· 987 986 struct sta_rec_ht *ht; 988 987 struct tlv *tlv; 989 988 989 + if (!sta->ht_cap.ht_supported) 990 + return; 991 + 990 992 tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht)); 991 993 992 994 ht = (struct sta_rec_ht *)tlv; ··· 1077 1073 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, wcid, tlv, wtbl_hdr); 1078 1074 if (sta) 1079 1075 mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, skb, sta, tlv, 1080 - wtbl_hdr, mvif->cap.ldpc); 1076 + wtbl_hdr, mvif->cap.ht_ldpc, 1077 + mvif->cap.vht_ldpc); 1081 1078 1082 1079 return 0; 1083 1080 } ··· 1270 1265 }; 1271 1266 bool ebf; 1272 1267 1268 + if (!(sta->ht_cap.ht_supported || sta->he_cap.has_he)) 1269 + return; 1270 + 1273 1271 ebf = mt7915_is_ebf_supported(phy, vif, sta, false); 1274 1272 if (!ebf && !dev->ibf) 1275 1273 return; ··· 1332 1324 struct sta_rec_bfee *bfee; 1333 1325 struct tlv *tlv; 1334 1326 u8 nrow = 0; 1327 + 1328 + if (!(sta->vht_cap.vht_supported || sta->he_cap.has_he)) 1329 + return; 1335 1330 1336 1331 if (!mt7915_is_ebf_supported(phy, vif, sta, true)) 1337 1332 return; ··· 1593 1582 cap |= STA_CAP_TX_STBC; 1594 1583 if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC) 1595 1584 cap |= STA_CAP_RX_STBC; 1596 - if (mvif->cap.ldpc && 1585 + if (mvif->cap.ht_ldpc && 1597 1586 (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)) 1598 1587 cap |= STA_CAP_LDPC; 1599 1588 ··· 1619 1608 cap |= STA_CAP_VHT_TX_STBC; 1620 1609 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1) 1621 1610 cap |= STA_CAP_VHT_RX_STBC; 1622 - if (mvif->cap.ldpc && 1611 + if (mvif->cap.vht_ldpc && 1623 1612 (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)) 1624 1613 cap |= STA_CAP_VHT_LDPC; 1625 1614 ··· 1630 1619 if (sta->he_cap.has_he) { 1631 1620 ra->supp_mode |= MODE_HE; 1632 1621 cap |= STA_CAP_HE; 1622 + 1623 + if (sta->he_6ghz_capa.capa) 1624 + ra->af = le16_get_bits(sta->he_6ghz_capa.capa, 1625 + IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP); 1633 1626 } 1634 1627 1635 1628 ra->sta_cap = cpu_to_le32(cap); ··· 1656 1641 * once dev->rc_work changes the settings driver should also 1657 1642 * update sta_rec_he here. 1658 1643 */ 1659 - if (sta->he_cap.has_he && changed) 1644 + if (changed) 1660 1645 mt7915_mcu_sta_he_tlv(skb, sta, vif); 1661 1646 1662 1647 /* sta_rec_ra accommodates BW, NSS and only MCS range format ··· 1725 1710 goto out; 1726 1711 1727 1712 /* tag order is in accordance with firmware dependency. */ 1728 - if (sta && sta->ht_cap.ht_supported) { 1713 + if (sta) { 1729 1714 /* starec bfer */ 1730 1715 mt7915_mcu_sta_bfer_tlv(dev, skb, vif, sta); 1731 1716 /* starec ht */ ··· 1742 1727 return ret; 1743 1728 } 1744 1729 1745 - if (sta && sta->ht_cap.ht_supported) { 1730 + if (sta) { 1746 1731 /* starec amsdu */ 1747 1732 mt7915_mcu_sta_amsdu_tlv(dev, skb, vif, sta); 1748 1733 /* starec he */ ··· 1826 1811 } 1827 1812 1828 1813 static void 1814 + mt7915_mcu_beacon_mbss(struct sk_buff *rskb, struct sk_buff *skb, 1815 + struct ieee80211_vif *vif, struct bss_info_bcn *bcn, 1816 + struct ieee80211_mutable_offsets *offs) 1817 + { 1818 + struct bss_info_bcn_mbss *mbss; 1819 + const struct element *elem; 1820 + struct tlv *tlv; 1821 + 1822 + if (!vif->bss_conf.bssid_indicator) 1823 + return; 1824 + 1825 + tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_MBSSID, 1826 + sizeof(*mbss), &bcn->sub_ntlv, 1827 + &bcn->len); 1828 + 1829 + mbss = (struct bss_info_bcn_mbss *)tlv; 1830 + mbss->offset[0] = cpu_to_le16(offs->tim_offset); 1831 + mbss->bitmap = cpu_to_le32(1); 1832 + 1833 + for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, 1834 + &skb->data[offs->mbssid_off], 1835 + skb->len - offs->mbssid_off) { 1836 + const struct element *sub_elem; 1837 + 1838 + if (elem->datalen < 2) 1839 + continue; 1840 + 1841 + for_each_element(sub_elem, elem->data + 1, elem->datalen - 1) { 1842 + const u8 *data; 1843 + 1844 + if (sub_elem->id || sub_elem->datalen < 4) 1845 + continue; /* not a valid BSS profile */ 1846 + 1847 + /* Find WLAN_EID_MULTI_BSSID_IDX 1848 + * in the merged nontransmitted profile 1849 + */ 1850 + data = cfg80211_find_ie(WLAN_EID_MULTI_BSSID_IDX, 1851 + sub_elem->data, 1852 + sub_elem->datalen); 1853 + if (!data || data[1] < 1 || !data[2]) 1854 + continue; 1855 + 1856 + mbss->offset[data[2]] = cpu_to_le16(data - skb->data); 1857 + mbss->bitmap |= cpu_to_le32(BIT(data[2])); 1858 + } 1859 + } 1860 + } 1861 + 1862 + static void 1829 1863 mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct ieee80211_vif *vif, 1830 1864 struct sk_buff *rskb, struct sk_buff *skb, 1831 1865 struct bss_info_bcn *bcn, ··· 1936 1872 len); 1937 1873 if (ie && ie[1] >= sizeof(*ht)) { 1938 1874 ht = (void *)(ie + 2); 1939 - vc->ldpc |= !!(le16_to_cpu(ht->cap_info) & 1940 - IEEE80211_HT_CAP_LDPC_CODING); 1875 + vc->ht_ldpc = !!(le16_to_cpu(ht->cap_info) & 1876 + IEEE80211_HT_CAP_LDPC_CODING); 1941 1877 } 1942 1878 1943 1879 ie = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, mgmt->u.beacon.variable, ··· 1948 1884 vht = (void *)(ie + 2); 1949 1885 bc = le32_to_cpu(vht->vht_cap_info); 1950 1886 1951 - vc->ldpc |= !!(bc & IEEE80211_VHT_CAP_RXLDPC); 1887 + vc->vht_ldpc = !!(bc & IEEE80211_VHT_CAP_RXLDPC); 1952 1888 vc->vht_su_ebfer = 1953 1889 (bc & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) && 1954 1890 (pc & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); ··· 1972 1908 1973 1909 he = (void *)(ie + 3); 1974 1910 1911 + vc->he_ldpc = 1912 + HE_PHY(CAP1_LDPC_CODING_IN_PAYLOAD, pe->phy_cap_info[1]); 1975 1913 vc->he_su_ebfer = 1976 1914 HE_PHY(CAP3_SU_BEAMFORMER, he->phy_cap_info[3]) && 1977 1915 HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]); ··· 2000 1934 struct bss_info_bcn *bcn; 2001 1935 int len = MT7915_BEACON_UPDATE_SIZE + MAX_BEACON_SIZE; 2002 1936 bool ext_phy = phy != &dev->phy; 1937 + 1938 + if (vif->bss_conf.nontransmitted) 1939 + return 0; 2003 1940 2004 1941 rskb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, 2005 1942 NULL, len); ··· 2033 1964 2034 1965 mt7915_mcu_beacon_check_caps(phy, vif, skb); 2035 1966 2036 - /* TODO: subtag - 11v MBSSID */ 2037 1967 mt7915_mcu_beacon_cntdwn(vif, rskb, skb, bcn, &offs); 1968 + mt7915_mcu_beacon_mbss(rskb, skb, vif, bcn, &offs); 2038 1969 mt7915_mcu_beacon_cont(dev, vif, rskb, skb, bcn, &offs); 2039 1970 dev_kfree_skb(skb); 2040 1971 ··· 2837 2768 2838 2769 int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd) 2839 2770 { 2771 + static const u8 ch_band[] = { 2772 + [NL80211_BAND_2GHZ] = 0, 2773 + [NL80211_BAND_5GHZ] = 1, 2774 + [NL80211_BAND_6GHZ] = 2, 2775 + }; 2840 2776 struct mt7915_dev *dev = phy->dev; 2841 2777 struct cfg80211_chan_def *chandef = &phy->mt76->chandef; 2842 2778 int freq1 = chandef->center_freq1; ··· 2869 2795 .tx_streams_num = hweight8(phy->mt76->antenna_mask), 2870 2796 .rx_streams = phy->mt76->antenna_mask, 2871 2797 .band_idx = phy->band_idx, 2872 - .channel_band = chandef->chan->band, 2798 + .channel_band = ch_band[chandef->chan->band], 2873 2799 }; 2874 2800 2875 2801 #ifdef CONFIG_NL80211_TESTMODE ··· 2885 2811 } 2886 2812 #endif 2887 2813 2888 - if (cmd == MCU_EXT_CMD(SET_RX_PATH)) 2814 + if (cmd == MCU_EXT_CMD(SET_RX_PATH) || 2815 + dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR) 2889 2816 req.switch_reason = CH_SWITCH_NORMAL; 2890 2817 else if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) 2891 2818 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD; ··· 3532 3457 case MT_PHY_TYPE_OFDM: 3533 3458 if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) 3534 3459 sband = &mphy->sband_5g.sband; 3460 + else if (mphy->chandef.chan->band == NL80211_BAND_6GHZ) 3461 + sband = &mphy->sband_6g.sband; 3535 3462 else 3536 3463 sband = &mphy->sband_2g.sband; 3537 3464
+2
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
··· 122 122 [PLE_PG_HIF_GROUP] = 0x110, 123 123 [PLE_HIF_PG_INFO] = 0x114, 124 124 [AC_OFFSET] = 0x040, 125 + [ETBF_PAR_RPT0] = 0x068, 125 126 }; 126 127 127 128 static const u32 mt7916_offs[] = { ··· 195 194 [PLE_PG_HIF_GROUP] = 0x00c, 196 195 [PLE_HIF_PG_INFO] = 0x388, 197 196 [AC_OFFSET] = 0x080, 197 + [ETBF_PAR_RPT0] = 0x100, 198 198 }; 199 199 200 200 static const struct __map mt7915_reg_map[] = {
+4 -2
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
··· 138 138 }; 139 139 140 140 struct mt7915_vif_cap { 141 - bool ldpc:1; 141 + bool ht_ldpc:1; 142 + bool vht_ldpc:1; 143 + bool he_ldpc:1; 142 144 bool vht_su_ebfer:1; 143 145 bool vht_su_ebfee:1; 144 146 bool vht_mu_ebfer:1; ··· 227 225 struct mt76_phy *mt76; 228 226 struct mt7915_dev *dev; 229 227 230 - struct ieee80211_sband_iftype_data iftype[2][NUM_NL80211_IFTYPES]; 228 + struct ieee80211_sband_iftype_data iftype[NUM_NL80211_BANDS][NUM_NL80211_IFTYPES]; 231 229 232 230 struct ieee80211_vif *monitor_vif; 233 231
+21 -7
drivers/net/wireless/mediatek/mt76/mt7915/regs.h
··· 103 103 PLE_PG_HIF_GROUP, 104 104 PLE_HIF_PG_INFO, 105 105 AC_OFFSET, 106 + ETBF_PAR_RPT0, 106 107 __MT_OFFS_MAX, 107 108 }; 108 109 ··· 224 223 #define MT_ETBF_TX_FB_CPL GENMASK(31, 16) 225 224 #define MT_ETBF_TX_FB_TRI GENMASK(15, 0) 226 225 227 - #define MT_ETBF_RX_FB_CONT(_band) MT_WF_ETBF(_band, 0x068) 228 - #define MT_ETBF_RX_FB_BW GENMASK(7, 6) 229 - #define MT_ETBF_RX_FB_NC GENMASK(5, 3) 230 - #define MT_ETBF_RX_FB_NR GENMASK(2, 0) 226 + #define MT_ETBF_PAR_RPT0(_band) MT_WF_ETBF(_band, __OFFS(ETBF_PAR_RPT0)) 227 + #define MT_ETBF_PAR_RPT0_FB_BW GENMASK(7, 6) 228 + #define MT_ETBF_PAR_RPT0_FB_NC GENMASK(5, 3) 229 + #define MT_ETBF_PAR_RPT0_FB_NR GENMASK(2, 0) 231 230 232 231 #define MT_ETBF_TX_APP_CNT(_band) MT_WF_ETBF(_band, 0x0f0) 233 232 #define MT_ETBF_TX_IBF_CNT GENMASK(31, 16) ··· 368 367 #define MT_MIB_SDR31(_band) MT_WF_MIB(_band, __OFFS(MIB_SDR31)) 369 368 370 369 #define MT_MIB_SDR32(_band) MT_WF_MIB(_band, __OFFS(MIB_SDR32)) 371 - #define MT_MIB_SDR32_TX_PKT_EBF_CNT_MASK GENMASK(15, 0) 370 + #define MT_MIB_SDR32_TX_PKT_EBF_CNT GENMASK(15, 0) 371 + #define MT_MIB_SDR32_TX_PKT_IBF_CNT GENMASK(31, 16) 372 372 373 373 #define MT_MIB_SDR33(_band) MT_WF_MIB(_band, 0x088) 374 - #define MT_MIB_SDR32_TX_PKT_IBF_CNT_MASK GENMASK(15, 0) 375 - #define MT_MIB_SDR32_TX_PKT_IBF_CNT_MASK_MT7916 GENMASK(31, 16) 374 + #define MT_MIB_SDR33_TX_PKT_IBF_CNT GENMASK(15, 0) 376 375 377 376 #define MT_MIB_SDRMUBF(_band) MT_WF_MIB(_band, __OFFS(MIB_SDRMUBF)) 378 377 #define MT_MIB_MU_BF_TX_CNT GENMASK(15, 0) ··· 401 400 #define MT_MIB_ARNG(_band, n) MT_WF_MIB(_band, __OFFS(MIB_ARNG) + \ 402 401 ((n) << 2)) 403 402 #define MT_MIB_ARNCR_RANGE(val, n) (((val) >> ((n) << 3)) & GENMASK(7, 0)) 403 + 404 + #define MT_MIB_BFCR0(_band) MT_WF_MIB(_band, 0x7b0) 405 + #define MT_MIB_BFCR0_RX_FB_HT GENMASK(15, 0) 406 + #define MT_MIB_BFCR0_RX_FB_VHT GENMASK(31, 16) 407 + 408 + #define MT_MIB_BFCR1(_band) MT_WF_MIB(_band, 0x7b4) 409 + #define MT_MIB_BFCR1_RX_FB_HE GENMASK(15, 0) 410 + 411 + #define MT_MIB_BFCR2(_band) MT_WF_MIB(_band, 0x7b8) 412 + #define MT_MIB_BFCR2_BFEE_TX_FB_TRIG GENMASK(15, 0) 413 + 414 + #define MT_MIB_BFCR7(_band) MT_WF_MIB(_band, 0x7cc) 415 + #define MT_MIB_BFCR7_BFEE_TX_FB_CPL GENMASK(15, 0) 404 416 405 417 /* WTBLON TOP */ 406 418 #define MT_WTBLON_TOP_BASE 0x820d4000
+2
drivers/net/wireless/mediatek/mt76/mt7915/soc.c
··· 196 196 197 197 type = mt7986_wmac_check_adie_type(dev); 198 198 pinctrl = devm_pinctrl_get(dev->mt76.dev); 199 + if (IS_ERR(pinctrl)) 200 + return PTR_ERR(pinctrl); 199 201 200 202 switch (type) { 201 203 case ADIE_SB:
+4
drivers/net/wireless/mediatek/mt76/mt7915/testmode.c
··· 271 271 case MT76_TM_TX_MODE_OFDM: 272 272 if (mphy->chandef.chan->band == NL80211_BAND_5GHZ) 273 273 sband = &mphy->sband_5g.sband; 274 + else if (mphy->chandef.chan->band == NL80211_BAND_6GHZ) 275 + sband = &mphy->sband_6g.sband; 274 276 else 275 277 sband = &mphy->sband_2g.sband; 276 278 ··· 574 572 575 573 if (chandef->chan->band == NL80211_BAND_5GHZ) 576 574 sband = &phy->mt76->sband_5g.sband; 575 + else if (chandef->chan->band == NL80211_BAND_6GHZ) 576 + sband = &phy->mt76->sband_6g.sband; 577 577 else 578 578 sband = &phy->mt76->sband_2g.sband; 579 579
+11
drivers/net/wireless/mediatek/mt76/mt7921/Kconfig
··· 24 24 This adds support for MT7921S 802.11ax 2x2:2SS wireless devices. 25 25 26 26 To compile this driver as a module, choose M here. 27 + 28 + config MT7921U 29 + tristate "MediaTek MT7921U (USB) support" 30 + select MT76_USB 31 + select MT7921_COMMON 32 + depends on MAC80211 33 + depends on USB 34 + help 35 + This adds support for MT7921U 802.11ax 2x2:2SS wireless devices. 36 + 37 + To compile this driver as a module, choose M here.
+2
drivers/net/wireless/mediatek/mt76/mt7921/Makefile
··· 3 3 obj-$(CONFIG_MT7921_COMMON) += mt7921-common.o 4 4 obj-$(CONFIG_MT7921E) += mt7921e.o 5 5 obj-$(CONFIG_MT7921S) += mt7921s.o 6 + obj-$(CONFIG_MT7921U) += mt7921u.o 6 7 7 8 CFLAGS_trace.o := -I$(src) 8 9 ··· 11 10 mt7921-common-$(CONFIG_NL80211_TESTMODE) += testmode.o 12 11 mt7921e-y := pci.o pci_mac.o pci_mcu.o dma.o 13 12 mt7921s-y := sdio.o sdio_mac.o sdio_mcu.o 13 + mt7921u-y := usb.o usb_mac.o
+19 -9
drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c
··· 129 129 130 130 mt7921_mutex_acquire(dev); 131 131 132 - for (i = 0; i < 16; i++) { 133 - int j, acs = i / 4, index = i % 4; 132 + for (i = 0; i < 4; i++) { 134 133 u32 ctrl, val, qlen = 0; 134 + int j; 135 135 136 - val = mt76_rr(dev, MT_PLE_AC_QEMPTY(acs, index)); 137 - ctrl = BIT(31) | BIT(15) | (acs << 8); 136 + val = mt76_rr(dev, MT_PLE_AC_QEMPTY(i)); 137 + ctrl = BIT(31) | BIT(11) | (i << 24); 138 138 139 139 for (j = 0; j < 32; j++) { 140 140 if (val & BIT(j)) 141 141 continue; 142 142 143 - mt76_wr(dev, MT_PLE_FL_Q0_CTRL, 144 - ctrl | (j + (index << 5))); 143 + mt76_wr(dev, MT_PLE_FL_Q0_CTRL, ctrl | j); 145 144 qlen += mt76_get_field(dev, MT_PLE_FL_Q3_CTRL, 146 145 GENMASK(11, 0)); 147 146 } 148 - seq_printf(s, "AC%d%d: queued=%d\n", acs, index, qlen); 147 + seq_printf(s, "AC%d: queued=%d\n", i, qlen); 149 148 } 150 149 151 150 mt7921_mutex_release(dev); ··· 267 268 struct mt7921_dev *dev = data; 268 269 struct mt76_connac_pm *pm = &dev->pm; 269 270 271 + if (mt76_is_usb(&dev->mt76)) 272 + return -EOPNOTSUPP; 273 + 270 274 mutex_lock(&dev->mt76.mutex); 271 275 272 276 if (val == pm->enable_user) ··· 313 311 struct mt76_connac_pm *pm = &dev->pm; 314 312 bool monitor = !!(dev->mphy.hw->conf.flags & IEEE80211_CONF_MONITOR); 315 313 bool enable = !!val; 314 + 315 + if (mt76_is_usb(&dev->mt76)) 316 + return -EOPNOTSUPP; 316 317 317 318 mt7921_mutex_acquire(dev); 318 319 if (pm->ds_enable_user == enable) ··· 434 429 if (!dir) 435 430 return -ENOMEM; 436 431 437 - debugfs_create_devm_seqfile(dev->mt76.dev, "queues", dir, 438 - mt7921_queues_read); 432 + if (mt76_is_mmio(&dev->mt76)) 433 + debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues", 434 + dir, mt7921_queues_read); 435 + else 436 + debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues", 437 + dir, mt76_queues_read); 438 + 439 439 debugfs_create_devm_seqfile(dev->mt76.dev, "acq", dir, 440 440 mt7921_queues_acq); 441 441 debugfs_create_devm_seqfile(dev->mt76.dev, "txpower_sku", dir,
+1 -1
drivers/net/wireless/mediatek/mt76/mt7921/dma.c
··· 5 5 #include "../dma.h" 6 6 #include "mac.h" 7 7 8 - int mt7921_init_tx_queues(struct mt7921_phy *phy, int idx, int n_desc) 8 + static int mt7921_init_tx_queues(struct mt7921_phy *phy, int idx, int n_desc) 9 9 { 10 10 int i, err; 11 11
+50 -24
drivers/net/wireless/mediatek/mt76/mt7921/init.c
··· 165 165 166 166 static int mt7921_init_hardware(struct mt7921_dev *dev) 167 167 { 168 - int ret, idx, i; 168 + int ret, i; 169 169 170 170 set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state); 171 171 ··· 182 182 return ret; 183 183 } 184 184 185 + return 0; 186 + } 187 + 188 + static int mt7921_init_wcid(struct mt7921_dev *dev) 189 + { 190 + int idx; 191 + 185 192 /* Beacon and mgmt frames should occupy wcid 0 */ 186 193 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7921_WTBL_STA - 1); 187 194 if (idx) ··· 200 193 rcu_assign_pointer(dev->mt76.wcid[idx], &dev->mt76.global_wcid); 201 194 202 195 return 0; 196 + } 197 + 198 + static void mt7921_init_work(struct work_struct *work) 199 + { 200 + struct mt7921_dev *dev = container_of(work, struct mt7921_dev, 201 + init_work); 202 + int ret; 203 + 204 + ret = mt7921_init_hardware(dev); 205 + if (ret) 206 + return; 207 + 208 + mt76_set_stream_caps(&dev->mphy, true); 209 + mt7921_set_stream_he_caps(&dev->phy); 210 + 211 + ret = mt76_register_device(&dev->mt76, true, mt76_rates, 212 + ARRAY_SIZE(mt76_rates)); 213 + if (ret) { 214 + dev_err(dev->mt76.dev, "register device failed\n"); 215 + return; 216 + } 217 + 218 + ret = mt7921_init_debugfs(dev); 219 + if (ret) { 220 + dev_err(dev->mt76.dev, "register debugfs failed\n"); 221 + return; 222 + } 223 + 224 + /* we support chip reset now */ 225 + dev->hw_init_done = true; 226 + 227 + mt76_connac_mcu_set_deep_sleep(&dev->mt76, dev->pm.ds_enable); 203 228 } 204 229 205 230 int mt7921_register_device(struct mt7921_dev *dev) ··· 261 222 spin_lock_init(&dev->sta_poll_lock); 262 223 263 224 INIT_WORK(&dev->reset_work, mt7921_mac_reset_work); 225 + INIT_WORK(&dev->init_work, mt7921_init_work); 264 226 265 227 dev->pm.idle_timeout = MT7921_PM_TIMEOUT; 266 228 dev->pm.stats.last_wake_event = jiffies; 267 229 dev->pm.stats.last_doze_event = jiffies; 268 - dev->pm.enable_user = true; 269 - dev->pm.enable = true; 270 - dev->pm.ds_enable_user = true; 271 - dev->pm.ds_enable = true; 230 + if (!mt76_is_usb(&dev->mt76)) { 231 + dev->pm.enable_user = true; 232 + dev->pm.enable = true; 233 + dev->pm.ds_enable_user = true; 234 + dev->pm.ds_enable = true; 235 + } 272 236 273 - if (mt76_is_sdio(&dev->mt76)) 237 + if (!mt76_is_mmio(&dev->mt76)) 274 238 hw->extra_tx_headroom += MT_SDIO_TXD_SIZE + MT_SDIO_HDR_SIZE; 275 239 276 - ret = mt7921_init_hardware(dev); 240 + ret = mt7921_init_wcid(dev); 277 241 if (ret) 278 242 return ret; 279 243 ··· 304 262 dev->mphy.hw->wiphy->available_antennas_rx = dev->mphy.chainmask; 305 263 dev->mphy.hw->wiphy->available_antennas_tx = dev->mphy.chainmask; 306 264 307 - mt76_set_stream_caps(&dev->mphy, true); 308 - mt7921_set_stream_he_caps(&dev->phy); 309 - 310 - ret = mt76_register_device(&dev->mt76, true, mt76_rates, 311 - ARRAY_SIZE(mt76_rates)); 312 - if (ret) 313 - return ret; 314 - 315 - ret = mt7921_init_debugfs(dev); 316 - if (ret) 317 - return ret; 318 - 319 - ret = mt76_connac_mcu_set_deep_sleep(&dev->mt76, dev->pm.ds_enable); 320 - if (ret) 321 - return ret; 322 - 323 - dev->hw_init_done = true; 265 + queue_work(system_wq, &dev->init_work); 324 266 325 267 return 0; 326 268 }
+108 -20
drivers/net/wireless/mediatek/mt76/mt7921/mac.c
··· 176 176 u32 ru_h, ru_l; 177 177 u8 ru, offs = 0; 178 178 179 - ru_l = FIELD_GET(MT_PRXV_HE_RU_ALLOC_L, le32_to_cpu(rxv[0])); 180 - ru_h = FIELD_GET(MT_PRXV_HE_RU_ALLOC_H, le32_to_cpu(rxv[1])); 179 + ru_l = le32_get_bits(rxv[0], MT_PRXV_HE_RU_ALLOC_L); 180 + ru_h = le32_get_bits(rxv[1], MT_PRXV_HE_RU_ALLOC_H); 181 181 ru = (u8)(ru_l | ru_h << 4); 182 182 183 183 status->bw = RATE_INFO_BW_HE_RU; ··· 247 247 MU_PREP(FLAGS2_SIG_B_SYMS_USERS, 248 248 le32_get_bits(rxv[2], MT_CRXV_HE_NUM_USER)); 249 249 250 - he_mu->ru_ch1[0] = FIELD_GET(MT_CRXV_HE_RU0, le32_to_cpu(rxv[3])); 250 + he_mu->ru_ch1[0] = le32_get_bits(rxv[3], MT_CRXV_HE_RU0); 251 251 252 252 if (status->bw >= RATE_INFO_BW_40) { 253 253 he_mu->flags1 |= HE_BITS(MU_FLAGS1_CH2_RU_KNOWN); 254 254 he_mu->ru_ch2[0] = 255 - FIELD_GET(MT_CRXV_HE_RU1, le32_to_cpu(rxv[3])); 255 + le32_get_bits(rxv[3], MT_CRXV_HE_RU1); 256 256 } 257 257 258 258 if (status->bw >= RATE_INFO_BW_80) { 259 259 he_mu->ru_ch1[1] = 260 - FIELD_GET(MT_CRXV_HE_RU2, le32_to_cpu(rxv[3])); 260 + le32_get_bits(rxv[3], MT_CRXV_HE_RU2); 261 261 he_mu->ru_ch2[1] = 262 - FIELD_GET(MT_CRXV_HE_RU3, le32_to_cpu(rxv[3])); 262 + le32_get_bits(rxv[3], MT_CRXV_HE_RU3); 263 263 } 264 264 } 265 265 ··· 304 304 case MT_PHY_TYPE_HE_SU: 305 305 he->data1 |= HE_BITS(DATA1_FORMAT_SU) | 306 306 HE_BITS(DATA1_UL_DL_KNOWN) | 307 - HE_BITS(DATA1_BEAM_CHANGE_KNOWN); 307 + HE_BITS(DATA1_BEAM_CHANGE_KNOWN) | 308 + HE_BITS(DATA1_BW_RU_ALLOC_KNOWN); 308 309 309 310 he->data3 |= HE_PREP(DATA3_BEAM_CHANGE, BEAM_CHNG, rxv[14]) | 310 311 HE_PREP(DATA3_UL_DL, UPLINK, rxv[2]); 311 312 break; 312 313 case MT_PHY_TYPE_HE_EXT_SU: 313 314 he->data1 |= HE_BITS(DATA1_FORMAT_EXT_SU) | 314 - HE_BITS(DATA1_UL_DL_KNOWN); 315 + HE_BITS(DATA1_UL_DL_KNOWN) | 316 + HE_BITS(DATA1_BW_RU_ALLOC_KNOWN); 315 317 316 318 he->data3 |= HE_PREP(DATA3_UL_DL, UPLINK, rxv[2]); 317 319 break; ··· 411 409 struct ieee80211_hdr hdr; 412 410 u16 frame_control; 413 411 414 - if (FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, le32_to_cpu(rxd[3])) != 412 + if (le32_get_bits(rxd[3], MT_RXD3_NORMAL_ADDR_TYPE) != 415 413 MT_RXD3_NORMAL_U2M) 416 414 return -EINVAL; 417 415 ··· 1026 1024 if (!sta || !(sta->ht_cap.ht_supported || sta->he_cap.has_he)) 1027 1025 return; 1028 1026 1029 - tid = FIELD_GET(MT_TXD1_TID, le32_to_cpu(txwi[1])); 1027 + tid = le32_get_bits(txwi[1], MT_TXD1_TID); 1030 1028 if (tid >= 6) /* skip VO queue */ 1031 1029 return; 1032 1030 ··· 1165 1163 struct mt76_wcid *wcid; 1166 1164 __le32 *txs_data = data; 1167 1165 u16 wcidx; 1168 - u32 txs; 1169 1166 u8 pid; 1170 1167 1171 - txs = le32_to_cpu(txs_data[0]); 1172 - if (FIELD_GET(MT_TXS0_TXS_FORMAT, txs) > 1) 1168 + if (le32_get_bits(txs_data[0], MT_TXS0_TXS_FORMAT) > 1) 1173 1169 return; 1174 1170 1175 - txs = le32_to_cpu(txs_data[2]); 1176 - wcidx = FIELD_GET(MT_TXS2_WCID, txs); 1177 - 1178 - txs = le32_to_cpu(txs_data[3]); 1179 - pid = FIELD_GET(MT_TXS3_PID, txs); 1171 + wcidx = le32_get_bits(txs_data[2], MT_TXS2_WCID); 1172 + pid = le32_get_bits(txs_data[3], MT_TXS3_PID); 1180 1173 1181 1174 if (pid < MT_PACKET_ID_FIRST) 1182 1175 return; ··· 1210 1213 enum rx_pkt_type type; 1211 1214 u16 flag; 1212 1215 1213 - type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 1214 - flag = FIELD_GET(MT_RXD0_PKT_FLAG, le32_to_cpu(rxd[0])); 1216 + type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE); 1217 + flag = le32_get_bits(rxd[0], MT_RXD0_PKT_FLAG); 1215 1218 1216 1219 if (type == PKT_TYPE_RX_EVENT && flag == 0x1) 1217 1220 type = PKT_TYPE_NORMAL_MCU; ··· 1624 1627 1625 1628 mt7921_reset(&dev->mt76); 1626 1629 } 1630 + 1631 + /* usb_sdio */ 1632 + static void 1633 + mt7921_usb_sdio_write_txwi(struct mt7921_dev *dev, struct mt76_wcid *wcid, 1634 + enum mt76_txq_id qid, struct ieee80211_sta *sta, 1635 + struct ieee80211_key_conf *key, int pid, 1636 + struct sk_buff *skb) 1637 + { 1638 + __le32 *txwi = (__le32 *)(skb->data - MT_SDIO_TXD_SIZE); 1639 + 1640 + memset(txwi, 0, MT_SDIO_TXD_SIZE); 1641 + mt7921_mac_write_txwi(dev, txwi, skb, wcid, key, pid, false); 1642 + skb_push(skb, MT_SDIO_TXD_SIZE); 1643 + } 1644 + 1645 + int mt7921_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 1646 + enum mt76_txq_id qid, struct mt76_wcid *wcid, 1647 + struct ieee80211_sta *sta, 1648 + struct mt76_tx_info *tx_info) 1649 + { 1650 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 1651 + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb); 1652 + struct ieee80211_key_conf *key = info->control.hw_key; 1653 + struct sk_buff *skb = tx_info->skb; 1654 + int err, pad, pktid, type; 1655 + 1656 + if (unlikely(tx_info->skb->len <= ETH_HLEN)) 1657 + return -EINVAL; 1658 + 1659 + if (!wcid) 1660 + wcid = &dev->mt76.global_wcid; 1661 + 1662 + if (sta) { 1663 + struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; 1664 + 1665 + if (time_after(jiffies, msta->last_txs + HZ / 4)) { 1666 + info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; 1667 + msta->last_txs = jiffies; 1668 + } 1669 + } 1670 + 1671 + pktid = mt76_tx_status_skb_add(&dev->mt76, wcid, skb); 1672 + mt7921_usb_sdio_write_txwi(dev, wcid, qid, sta, key, pktid, skb); 1673 + 1674 + type = mt76_is_sdio(mdev) ? MT7921_SDIO_DATA : 0; 1675 + mt7921_skb_add_usb_sdio_hdr(dev, skb, type); 1676 + pad = round_up(skb->len, 4) - skb->len; 1677 + if (mt76_is_usb(mdev)) 1678 + pad += 4; 1679 + 1680 + err = mt76_skb_adjust_pad(skb, pad); 1681 + if (err) 1682 + /* Release pktid in case of error. */ 1683 + idr_remove(&wcid->pktid, pktid); 1684 + 1685 + return err; 1686 + } 1687 + EXPORT_SYMBOL_GPL(mt7921_usb_sdio_tx_prepare_skb); 1688 + 1689 + void mt7921_usb_sdio_tx_complete_skb(struct mt76_dev *mdev, 1690 + struct mt76_queue_entry *e) 1691 + { 1692 + __le32 *txwi = (__le32 *)(e->skb->data + MT_SDIO_HDR_SIZE); 1693 + unsigned int headroom = MT_SDIO_TXD_SIZE + MT_SDIO_HDR_SIZE; 1694 + struct ieee80211_sta *sta; 1695 + struct mt76_wcid *wcid; 1696 + u16 idx; 1697 + 1698 + idx = le32_get_bits(txwi[1], MT_TXD1_WLAN_IDX); 1699 + wcid = rcu_dereference(mdev->wcid[idx]); 1700 + sta = wcid_to_sta(wcid); 1701 + 1702 + if (sta && likely(e->skb->protocol != cpu_to_be16(ETH_P_PAE))) 1703 + mt7921_tx_check_aggr(sta, txwi); 1704 + 1705 + skb_pull(e->skb, headroom); 1706 + mt76_tx_complete_skb(mdev, e->wcid, e->skb); 1707 + } 1708 + EXPORT_SYMBOL_GPL(mt7921_usb_sdio_tx_complete_skb); 1709 + 1710 + bool mt7921_usb_sdio_tx_status_data(struct mt76_dev *mdev, u8 *update) 1711 + { 1712 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 1713 + 1714 + mt7921_mutex_acquire(dev); 1715 + mt7921_mac_sta_poll(dev); 1716 + mt7921_mutex_release(dev); 1717 + 1718 + return false; 1719 + } 1720 + EXPORT_SYMBOL_GPL(mt7921_usb_sdio_tx_status_data);
+1
drivers/net/wireless/mediatek/mt76/mt7921/mac.h
··· 202 202 #define MT_SDIO_TXD_SIZE (MT_TXD_SIZE + 8 * 4) 203 203 #define MT_SDIO_TAIL_SIZE 8 204 204 #define MT_SDIO_HDR_SIZE 4 205 + #define MT_USB_TAIL_SIZE 4 205 206 206 207 #define MT_TXD0_Q_IDX GENMASK(31, 25) 207 208 #define MT_TXD0_PKT_FMT GENMASK(24, 23)
+25 -13
drivers/net/wireless/mediatek/mt76/mt7921/main.c
··· 264 264 return err; 265 265 } 266 266 267 - static void mt7921_stop(struct ieee80211_hw *hw) 267 + void mt7921_stop(struct ieee80211_hw *hw) 268 268 { 269 269 struct mt7921_dev *dev = mt7921_hw_dev(hw); 270 270 struct mt7921_phy *phy = mt7921_hw_phy(hw); ··· 281 281 mt76_connac_mcu_set_mac_enable(&dev->mt76, 0, false, false); 282 282 mt7921_mutex_release(dev); 283 283 } 284 + EXPORT_SYMBOL_GPL(mt7921_stop); 284 285 285 286 static int mt7921_add_interface(struct ieee80211_hw *hw, 286 287 struct ieee80211_vif *vif) ··· 480 479 mt7921_mcu_set_beacon_filter(dev, vif, dev->pm.enable); 481 480 } 482 481 482 + static void 483 + mt7921_sniffer_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif) 484 + { 485 + struct mt7921_dev *dev = priv; 486 + struct ieee80211_hw *hw = mt76_hw(dev); 487 + struct mt76_connac_pm *pm = &dev->pm; 488 + bool monitor = !!(hw->conf.flags & IEEE80211_CONF_MONITOR); 489 + 490 + mt7921_mcu_set_sniffer(dev, vif, monitor); 491 + pm->enable = !monitor; 492 + pm->ds_enable = !monitor; 493 + 494 + mt76_connac_mcu_set_deep_sleep(&dev->mt76, pm->ds_enable); 495 + 496 + if (monitor) 497 + mt7921_mcu_set_beacon_filter(dev, vif, false); 498 + } 499 + 483 500 void mt7921_set_runtime_pm(struct mt7921_dev *dev) 484 501 { 485 - struct ieee80211_hw *hw = dev->mphy.hw; 502 + struct ieee80211_hw *hw = mt76_hw(dev); 486 503 struct mt76_connac_pm *pm = &dev->pm; 487 504 bool monitor = !!(hw->conf.flags & IEEE80211_CONF_MONITOR); 488 505 ··· 535 516 } 536 517 537 518 if (changed & IEEE80211_CONF_CHANGE_MONITOR) { 538 - bool enabled = !!(hw->conf.flags & IEEE80211_CONF_MONITOR); 539 - 540 - if (!enabled) 541 - phy->rxfilter |= MT_WF_RFCR_DROP_OTHER_UC; 542 - else 543 - phy->rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC; 544 - 545 - mt76_rmw_field(dev, MT_DMA_DCR0(0), MT_DMA_DCR0_RXD_G5_EN, 546 - enabled); 547 - mt76_wr(dev, MT_WF_RFCR(0), phy->rxfilter); 548 - mt7921_set_runtime_pm(dev); 519 + ieee80211_iterate_active_interfaces(hw, 520 + IEEE80211_IFACE_ITER_RESUME_ALL, 521 + mt7921_sniffer_interface_iter, dev); 522 + dev->mt76.rxfilter = mt76_rr(dev, MT_WF_RFCR(0)); 549 523 } 550 524 551 525 out:
+32 -1
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
··· 863 863 else 864 864 req.channel_band = chandef->chan->band; 865 865 866 - if (cmd == MCU_EXT_CMD(SET_RX_PATH)) 866 + if (cmd == MCU_EXT_CMD(SET_RX_PATH) || 867 + dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR) 867 868 req.switch_reason = CH_SWITCH_NORMAL; 868 869 else if (dev->mt76.hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) 869 870 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD; ··· 1135 1134 dev_kfree_skb(skb); 1136 1135 1137 1136 return 0; 1137 + } 1138 + 1139 + int mt7921_mcu_set_sniffer(struct mt7921_dev *dev, struct ieee80211_vif *vif, 1140 + bool enable) 1141 + { 1142 + struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv; 1143 + struct { 1144 + struct { 1145 + u8 band_idx; 1146 + u8 pad[3]; 1147 + } __packed hdr; 1148 + struct sniffer_enable_tlv { 1149 + __le16 tag; 1150 + __le16 len; 1151 + u8 enable; 1152 + u8 pad[3]; 1153 + } __packed enable; 1154 + } req = { 1155 + .hdr = { 1156 + .band_idx = mvif->band_idx, 1157 + }, 1158 + .enable = { 1159 + .tag = cpu_to_le16(0), 1160 + .len = cpu_to_le16(sizeof(struct sniffer_enable_tlv)), 1161 + .enable = enable, 1162 + }, 1163 + }; 1164 + 1165 + return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(SNIFFER), &req, sizeof(req), 1166 + true); 1138 1167 }
+30 -12
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
··· 30 30 31 31 #define MT7921_DRV_OWN_RETRY_COUNT 10 32 32 #define MT7921_MCU_INIT_RETRY_COUNT 10 33 + #define MT7921_WFSYS_INIT_RETRY_COUNT 2 33 34 34 35 #define MT7921_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7961_1.bin" 35 36 #define MT7921_ROM_PATCH "mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin" ··· 205 204 struct list_head sta_poll_list; 206 205 spinlock_t sta_poll_lock; 207 206 207 + struct work_struct init_work; 208 + 208 209 u8 fw_debug; 209 210 210 211 struct mt76_connac_pm pm; ··· 355 352 mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WA], false); 356 353 } 357 354 358 - static inline void mt7921_skb_add_sdio_hdr(struct sk_buff *skb, 359 - enum mt7921_sdio_pkt_type type) 355 + static inline void 356 + mt7921_skb_add_usb_sdio_hdr(struct mt7921_dev *dev, struct sk_buff *skb, 357 + int type) 360 358 { 361 - u32 hdr; 359 + u32 hdr, len; 362 360 363 - hdr = FIELD_PREP(MT7921_SDIO_HDR_TX_BYTES, skb->len + sizeof(hdr)) | 361 + len = mt76_is_usb(&dev->mt76) ? skb->len : skb->len + sizeof(hdr); 362 + hdr = FIELD_PREP(MT7921_SDIO_HDR_TX_BYTES, len) | 364 363 FIELD_PREP(MT7921_SDIO_HDR_PKT_TYPE, type); 365 364 366 365 put_unaligned_le32(hdr, skb_push(skb, sizeof(hdr))); 367 366 } 368 367 368 + void mt7921_stop(struct ieee80211_hw *hw); 369 369 int mt7921_mac_init(struct mt7921_dev *dev); 370 370 bool mt7921_mac_wtbl_update(struct mt7921_dev *dev, int idx, u32 mask); 371 371 void mt7921_mac_reset_counters(struct mt7921_phy *phy); ··· 390 384 391 385 void mt7921_tx_worker(struct mt76_worker *w); 392 386 void mt7921e_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e); 393 - int mt7921_init_tx_queues(struct mt7921_phy *phy, int idx, int n_desc); 394 387 void mt7921_tx_token_put(struct mt7921_dev *dev); 395 388 void mt7921_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, 396 389 struct sk_buff *skb); ··· 414 409 int mt7921_mcu_fw_pmctrl(struct mt7921_dev *dev); 415 410 void mt7921_pm_wake_work(struct work_struct *work); 416 411 void mt7921_pm_power_save_work(struct work_struct *work); 417 - bool mt7921_wait_for_mcu_init(struct mt7921_dev *dev); 418 412 void mt7921_coredump_work(struct work_struct *work); 419 413 int mt7921_wfsys_reset(struct mt7921_dev *dev); 420 414 int mt7921_get_txpwr_info(struct mt7921_dev *dev, struct mt7921_txpwr *txpwr); ··· 448 444 int mt7921s_mcu_init(struct mt7921_dev *dev); 449 445 int mt7921s_mcu_drv_pmctrl(struct mt7921_dev *dev); 450 446 int mt7921s_mcu_fw_pmctrl(struct mt7921_dev *dev); 451 - int mt7921s_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 452 - enum mt76_txq_id qid, struct mt76_wcid *wcid, 453 - struct ieee80211_sta *sta, 454 - struct mt76_tx_info *tx_info); 455 - void mt7921s_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e); 456 - bool mt7921s_tx_status_data(struct mt76_dev *mdev, u8 *update); 457 447 void mt7921_mac_add_txs(struct mt7921_dev *dev, void *data); 458 448 void mt7921_set_runtime_pm(struct mt7921_dev *dev); 449 + int mt7921_mcu_set_sniffer(struct mt7921_dev *dev, struct ieee80211_vif *vif, 450 + bool enable); 451 + 452 + int mt7921_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 453 + enum mt76_txq_id qid, struct mt76_wcid *wcid, 454 + struct ieee80211_sta *sta, 455 + struct mt76_tx_info *tx_info); 456 + void mt7921_usb_sdio_tx_complete_skb(struct mt76_dev *mdev, 457 + struct mt76_queue_entry *e); 458 + bool mt7921_usb_sdio_tx_status_data(struct mt76_dev *mdev, u8 *update); 459 + 460 + /* usb */ 461 + #define MT_USB_TYPE_VENDOR (USB_TYPE_VENDOR | 0x1f) 462 + #define MT_USB_TYPE_UHW_VENDOR (USB_TYPE_VENDOR | 0x1e) 463 + 464 + int mt7921u_mcu_power_on(struct mt7921_dev *dev); 465 + int mt7921u_wfsys_reset(struct mt7921_dev *dev); 466 + int mt7921u_dma_init(struct mt7921_dev *dev); 467 + int mt7921u_init_reset(struct mt7921_dev *dev); 468 + int mt7921u_mac_reset(struct mt7921_dev *dev); 459 469 #endif
+1
drivers/net/wireless/mediatek/mt76/mt7921/pci.c
··· 105 105 int i; 106 106 struct mt76_connac_pm *pm = &dev->pm; 107 107 108 + cancel_work_sync(&dev->init_work); 108 109 mt76_unregister_device(&dev->mt76); 109 110 mt76_for_each_q_rx(&dev->mt76, i) 110 111 napi_disable(&dev->mt76.napi[i]);
+5 -8
drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
··· 137 137 138 138 wcid_idx = wcid->idx; 139 139 } else { 140 - wcid_idx = FIELD_GET(MT_TXD1_WLAN_IDX, le32_to_cpu(txwi[1])); 140 + wcid_idx = le32_get_bits(txwi[1], MT_TXD1_WLAN_IDX); 141 141 } 142 142 143 143 __mt76_tx_complete_skb(mdev, wcid_idx, t->skb, free_list); ··· 164 164 mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_PSD], false); 165 165 mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_BE], false); 166 166 167 - /* TODO: MT_TX_FREE_LATENCY is msdu time from the TXD is queued into PLE, 168 - * to the time ack is received or dropped by hw (air + hw queue time). 169 - * Should avoid accessing WTBL to get Tx airtime, and use it instead. 170 - */ 171 - count = FIELD_GET(MT_TX_FREE_MSDU_CNT, le16_to_cpu(free->ctrl)); 167 + count = le16_get_bits(free->ctrl, MT_TX_FREE_MSDU_CNT); 172 168 if (WARN_ON_ONCE((void *)&free->info[count] > end)) 173 169 return; 174 170 ··· 227 231 __le32 *end = (__le32 *)&rxd[len / 4]; 228 232 enum rx_pkt_type type; 229 233 230 - type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 234 + type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE); 235 + 231 236 switch (type) { 232 237 case PKT_TYPE_TXRX_NOTIFY: 233 238 mt7921e_mac_tx_free(dev, data, len); ··· 249 252 __le32 *rxd = (__le32 *)skb->data; 250 253 enum rx_pkt_type type; 251 254 252 - type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0])); 255 + type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE); 253 256 254 257 switch (type) { 255 258 case PKT_TYPE_TXRX_NOTIFY:
+54 -7
drivers/net/wireless/mediatek/mt76/mt7921/regs.h
··· 17 17 #define MT_PLE_BASE 0x820c0000 18 18 #define MT_PLE(ofs) (MT_PLE_BASE + (ofs)) 19 19 20 - #define MT_PLE_FL_Q0_CTRL MT_PLE(0x1b0) 21 - #define MT_PLE_FL_Q1_CTRL MT_PLE(0x1b4) 22 - #define MT_PLE_FL_Q2_CTRL MT_PLE(0x1b8) 23 - #define MT_PLE_FL_Q3_CTRL MT_PLE(0x1bc) 20 + #define MT_PLE_FL_Q0_CTRL MT_PLE(0x3e0) 21 + #define MT_PLE_FL_Q1_CTRL MT_PLE(0x3e4) 22 + #define MT_PLE_FL_Q2_CTRL MT_PLE(0x3e8) 23 + #define MT_PLE_FL_Q3_CTRL MT_PLE(0x3ec) 24 24 25 - #define MT_PLE_AC_QEMPTY(ac, n) MT_PLE(0x300 + 0x10 * (ac) + \ 26 - ((n) << 2)) 25 + #define MT_PLE_AC_QEMPTY(_n) MT_PLE(0x500 + 0x40 * (_n)) 27 26 #define MT_PLE_AMSDU_PACK_MSDU_CNT(n) MT_PLE(0x10e0 + ((n) << 2)) 28 27 29 28 #define MT_MDP_BASE 0x820cd000 ··· 353 354 #define MT_WFDMA0_GLO_CFG_RX_DMA_EN BIT(2) 354 355 #define MT_WFDMA0_GLO_CFG_RX_DMA_BUSY BIT(3) 355 356 #define MT_WFDMA0_GLO_CFG_TX_WB_DDONE BIT(6) 357 + #define MT_WFDMA0_GLO_CFG_FW_DWLD_BYPASS_DMASHDL BIT(9) 356 358 #define MT_WFDMA0_GLO_CFG_FIFO_LITTLE_ENDIAN BIT(12) 357 359 #define MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN BIT(15) 358 360 #define MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2 BIT(21) ··· 377 377 #define MT_WFDMA0_TX_RING6_EXT_CTRL MT_WFDMA0(0x618) 378 378 #define MT_WFDMA0_TX_RING16_EXT_CTRL MT_WFDMA0(0x640) 379 379 #define MT_WFDMA0_TX_RING17_EXT_CTRL MT_WFDMA0(0x644) 380 + 381 + #define MT_WPDMA0_MAX_CNT_MASK GENMASK(7, 0) 382 + #define MT_WPDMA0_BASE_PTR_MASK GENMASK(31, 16) 380 383 381 384 #define MT_WFDMA0_RX_RING0_EXT_CTRL MT_WFDMA0(0x680) 382 385 #define MT_WFDMA0_RX_RING1_EXT_CTRL MT_WFDMA0(0x684) ··· 429 426 #define MT_WFDMA_DUMMY_CR MT_MCU_WPDMA0(0x120) 430 427 #define MT_WFDMA_NEED_REINIT BIT(1) 431 428 429 + #define MT_CBTOP_RGU(ofs) (0x70002000 + (ofs)) 430 + #define MT_CBTOP_RGU_WF_SUBSYS_RST MT_CBTOP_RGU(0x600) 431 + #define MT_CBTOP_RGU_WF_SUBSYS_RST_WF_WHOLE_PATH BIT(0) 432 + 432 433 #define MT_HW_BOUND 0x70010020 433 434 #define MT_HW_CHIPID 0x70010200 434 435 #define MT_HW_REV 0x70010204 ··· 441 434 #define MT_PCIE_MAC(ofs) (MT_PCIE_MAC_BASE + (ofs)) 442 435 #define MT_PCIE_MAC_INT_ENABLE MT_PCIE_MAC(0x188) 443 436 444 - #define MT_DMA_SHDL(ofs) (0xd6000 + (ofs)) 437 + #define MT_DMA_SHDL(ofs) (0x7c026000 + (ofs)) 445 438 #define MT_DMASHDL_SW_CONTROL MT_DMA_SHDL(0x004) 446 439 #define MT_DMASHDL_DMASHDL_BYPASS BIT(28) 447 440 #define MT_DMASHDL_OPTIONAL MT_DMA_SHDL(0x008) 448 441 #define MT_DMASHDL_PAGE MT_DMA_SHDL(0x00c) 442 + #define MT_DMASHDL_GROUP_SEQ_ORDER BIT(16) 449 443 #define MT_DMASHDL_REFILL MT_DMA_SHDL(0x010) 444 + #define MT_DMASHDL_REFILL_MASK GENMASK(31, 16) 450 445 #define MT_DMASHDL_PKT_MAX_SIZE MT_DMA_SHDL(0x01c) 451 446 #define MT_DMASHDL_PKT_MAX_SIZE_PLE GENMASK(11, 0) 452 447 #define MT_DMASHDL_PKT_MAX_SIZE_PSE GENMASK(27, 16) ··· 463 454 464 455 #define MT_DMASHDL_SCHED_SET(_n) MT_DMA_SHDL(0x070 + ((_n) << 2)) 465 456 457 + #define MT_WFDMA_HOST_CONFIG 0x7c027030 458 + #define MT_WFDMA_HOST_CONFIG_USB_RXEVT_EP4_EN BIT(6) 459 + 460 + #define MT_UMAC(ofs) (0x74000000 + (ofs)) 461 + #define MT_UDMA_TX_QSEL MT_UMAC(0x008) 462 + #define MT_FW_DL_EN BIT(3) 463 + 464 + #define MT_UDMA_WLCFG_1 MT_UMAC(0x00c) 465 + #define MT_WL_RX_AGG_PKT_LMT GENMASK(7, 0) 466 + #define MT_WL_TX_TMOUT_LMT GENMASK(27, 8) 467 + 468 + #define MT_UDMA_WLCFG_0 MT_UMAC(0x18) 469 + #define MT_WL_RX_AGG_TO GENMASK(7, 0) 470 + #define MT_WL_RX_AGG_LMT GENMASK(15, 8) 471 + #define MT_WL_TX_TMOUT_FUNC_EN BIT(16) 472 + #define MT_WL_TX_DPH_CHK_EN BIT(17) 473 + #define MT_WL_RX_MPSZ_PAD0 BIT(18) 474 + #define MT_WL_RX_FLUSH BIT(19) 475 + #define MT_TICK_1US_EN BIT(20) 476 + #define MT_WL_RX_AGG_EN BIT(21) 477 + #define MT_WL_RX_EN BIT(22) 478 + #define MT_WL_TX_EN BIT(23) 479 + #define MT_WL_RX_BUSY BIT(30) 480 + #define MT_WL_TX_BUSY BIT(31) 481 + 482 + #define MT_UDMA_CONN_INFRA_STATUS MT_UMAC(0xa20) 483 + #define MT_UDMA_CONN_WFSYS_INIT_DONE BIT(22) 484 + #define MT_UDMA_CONN_INFRA_STATUS_SEL MT_UMAC(0xa24) 485 + 486 + #define MT_SSUSB_EPCTL_CSR(ofs) (0x74011800 + (ofs)) 487 + #define MT_SSUSB_EPCTL_CSR_EP_RST_OPT MT_SSUSB_EPCTL_CSR(0x090) 488 + 489 + #define MT_UWFDMA0(ofs) (0x7c024000 + (ofs)) 490 + #define MT_UWFDMA0_GLO_CFG MT_UWFDMA0(0x208) 491 + #define MT_UWFDMA0_GLO_CFG_EXT0 MT_UWFDMA0(0x2b0) 492 + #define MT_UWFDMA0_TX_RING_EXT_CTRL(_n) MT_UWFDMA0(0x600 + ((_n) << 2)) 493 + 466 494 #define MT_CONN_STATUS 0x7c053c10 467 495 #define MT_WIFI_PATCH_DL_STATE BIT(0) 468 496 ··· 513 467 #define WFSYS_SW_INIT_DONE BIT(4) 514 468 515 469 #define MT_CONN_ON_MISC 0x7c0600f0 470 + #define MT_TOP_MISC2_FW_PWR_ON BIT(0) 516 471 #define MT_TOP_MISC2_FW_N9_RDY GENMASK(1, 0) 517 472 518 473 #endif
+4 -3
drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
··· 41 41 { 42 42 struct mt76_connac_pm *pm = &dev->pm; 43 43 44 + cancel_work_sync(&dev->init_work); 44 45 mt76_unregister_device(&dev->mt76); 45 46 cancel_delayed_work_sync(&pm->ps_work); 46 47 cancel_work_sync(&pm->wake_work); ··· 92 91 .survey_flags = SURVEY_INFO_TIME_TX | 93 92 SURVEY_INFO_TIME_RX | 94 93 SURVEY_INFO_TIME_BSS_RX, 95 - .tx_prepare_skb = mt7921s_tx_prepare_skb, 96 - .tx_complete_skb = mt7921s_tx_complete_skb, 97 - .tx_status_data = mt7921s_tx_status_data, 94 + .tx_prepare_skb = mt7921_usb_sdio_tx_prepare_skb, 95 + .tx_complete_skb = mt7921_usb_sdio_tx_complete_skb, 96 + .tx_status_data = mt7921_usb_sdio_tx_status_data, 98 97 .rx_skb = mt7921_queue_rx_skb, 99 98 .sta_ps = mt7921_sta_ps, 100 99 .sta_add = mt7921_mac_sta_add,
-83
drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c
··· 140 140 141 141 return err; 142 142 } 143 - 144 - static void 145 - mt7921s_write_txwi(struct mt7921_dev *dev, struct mt76_wcid *wcid, 146 - enum mt76_txq_id qid, struct ieee80211_sta *sta, 147 - struct ieee80211_key_conf *key, int pid, 148 - struct sk_buff *skb) 149 - { 150 - __le32 *txwi = (__le32 *)(skb->data - MT_SDIO_TXD_SIZE); 151 - 152 - memset(txwi, 0, MT_SDIO_TXD_SIZE); 153 - mt7921_mac_write_txwi(dev, txwi, skb, wcid, key, pid, false); 154 - skb_push(skb, MT_SDIO_TXD_SIZE); 155 - } 156 - 157 - int mt7921s_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 158 - enum mt76_txq_id qid, struct mt76_wcid *wcid, 159 - struct ieee80211_sta *sta, 160 - struct mt76_tx_info *tx_info) 161 - { 162 - struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 163 - struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb); 164 - struct ieee80211_key_conf *key = info->control.hw_key; 165 - struct sk_buff *skb = tx_info->skb; 166 - int err, pad, pktid; 167 - 168 - if (unlikely(tx_info->skb->len <= ETH_HLEN)) 169 - return -EINVAL; 170 - 171 - if (!wcid) 172 - wcid = &dev->mt76.global_wcid; 173 - 174 - if (sta) { 175 - struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; 176 - 177 - if (time_after(jiffies, msta->last_txs + HZ / 4)) { 178 - info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; 179 - msta->last_txs = jiffies; 180 - } 181 - } 182 - 183 - pktid = mt76_tx_status_skb_add(&dev->mt76, wcid, skb); 184 - mt7921s_write_txwi(dev, wcid, qid, sta, key, pktid, skb); 185 - 186 - mt7921_skb_add_sdio_hdr(skb, MT7921_SDIO_DATA); 187 - pad = round_up(skb->len, 4) - skb->len; 188 - 189 - err = mt76_skb_adjust_pad(skb, pad); 190 - if (err) 191 - /* Release pktid in case of error. */ 192 - idr_remove(&wcid->pktid, pktid); 193 - 194 - return err; 195 - } 196 - 197 - void mt7921s_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e) 198 - { 199 - __le32 *txwi = (__le32 *)(e->skb->data + MT_SDIO_HDR_SIZE); 200 - unsigned int headroom = MT_SDIO_TXD_SIZE + MT_SDIO_HDR_SIZE; 201 - struct ieee80211_sta *sta; 202 - struct mt76_wcid *wcid; 203 - u16 idx; 204 - 205 - idx = FIELD_GET(MT_TXD1_WLAN_IDX, le32_to_cpu(txwi[1])); 206 - wcid = rcu_dereference(mdev->wcid[idx]); 207 - sta = wcid_to_sta(wcid); 208 - 209 - if (sta && likely(e->skb->protocol != cpu_to_be16(ETH_P_PAE))) 210 - mt7921_tx_check_aggr(sta, txwi); 211 - 212 - skb_pull(e->skb, headroom); 213 - mt76_tx_complete_skb(mdev, e->wcid, e->skb); 214 - } 215 - 216 - bool mt7921s_tx_status_data(struct mt76_dev *mdev, u8 *update) 217 - { 218 - struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 219 - 220 - mt7921_mutex_acquire(dev); 221 - mt7921_mac_sta_poll(dev); 222 - mt7921_mutex_release(dev); 223 - 224 - return false; 225 - }
+1 -1
drivers/net/wireless/mediatek/mt76/mt7921/sdio_mcu.c
··· 36 36 if (cmd == MCU_CMD(FW_SCATTER)) 37 37 type = MT7921_SDIO_FWDL; 38 38 39 - mt7921_skb_add_sdio_hdr(skb, type); 39 + mt7921_skb_add_usb_sdio_hdr(dev, skb, type); 40 40 pad = round_up(skb->len, 4) - skb->len; 41 41 __skb_put_zero(skb, pad); 42 42
+306
drivers/net/wireless/mediatek/mt76/mt7921/usb.c
··· 1 + // SPDX-License-Identifier: ISC 2 + /* Copyright (C) 2022 MediaTek Inc. 3 + * 4 + * Author: Lorenzo Bianconi <lorenzo@kernel.org> 5 + */ 6 + 7 + #include <linux/kernel.h> 8 + #include <linux/module.h> 9 + #include <linux/usb.h> 10 + 11 + #include "mt7921.h" 12 + #include "mcu.h" 13 + #include "mac.h" 14 + 15 + static const struct usb_device_id mt7921u_device_table[] = { 16 + { USB_DEVICE_AND_INTERFACE_INFO(0x0e8d, 0x7961, 0xff, 0xff, 0xff) }, 17 + { }, 18 + }; 19 + 20 + static u32 mt7921u_rr(struct mt76_dev *dev, u32 addr) 21 + { 22 + u32 ret; 23 + 24 + mutex_lock(&dev->usb.usb_ctrl_mtx); 25 + ret = ___mt76u_rr(dev, MT_VEND_READ_EXT, 26 + USB_DIR_IN | MT_USB_TYPE_VENDOR, addr); 27 + mutex_unlock(&dev->usb.usb_ctrl_mtx); 28 + 29 + return ret; 30 + } 31 + 32 + static void mt7921u_wr(struct mt76_dev *dev, u32 addr, u32 val) 33 + { 34 + mutex_lock(&dev->usb.usb_ctrl_mtx); 35 + ___mt76u_wr(dev, MT_VEND_WRITE_EXT, 36 + USB_DIR_OUT | MT_USB_TYPE_VENDOR, addr, val); 37 + mutex_unlock(&dev->usb.usb_ctrl_mtx); 38 + } 39 + 40 + static u32 mt7921u_rmw(struct mt76_dev *dev, u32 addr, 41 + u32 mask, u32 val) 42 + { 43 + mutex_lock(&dev->usb.usb_ctrl_mtx); 44 + val |= ___mt76u_rr(dev, MT_VEND_READ_EXT, 45 + USB_DIR_IN | MT_USB_TYPE_VENDOR, addr) & ~mask; 46 + ___mt76u_wr(dev, MT_VEND_WRITE_EXT, 47 + USB_DIR_OUT | MT_USB_TYPE_VENDOR, addr, val); 48 + mutex_unlock(&dev->usb.usb_ctrl_mtx); 49 + 50 + return val; 51 + } 52 + 53 + static void mt7921u_copy(struct mt76_dev *dev, u32 offset, 54 + const void *data, int len) 55 + { 56 + struct mt76_usb *usb = &dev->usb; 57 + int ret, i = 0, batch_len; 58 + const u8 *val = data; 59 + 60 + len = round_up(len, 4); 61 + 62 + mutex_lock(&usb->usb_ctrl_mtx); 63 + while (i < len) { 64 + batch_len = min_t(int, usb->data_len, len - i); 65 + memcpy(usb->data, val + i, batch_len); 66 + ret = __mt76u_vendor_request(dev, MT_VEND_WRITE_EXT, 67 + USB_DIR_OUT | MT_USB_TYPE_VENDOR, 68 + (offset + i) >> 16, offset + i, 69 + usb->data, batch_len); 70 + if (ret < 0) 71 + break; 72 + 73 + i += batch_len; 74 + } 75 + mutex_unlock(&usb->usb_ctrl_mtx); 76 + } 77 + 78 + int mt7921u_mcu_power_on(struct mt7921_dev *dev) 79 + { 80 + int ret; 81 + 82 + ret = mt76u_vendor_request(&dev->mt76, MT_VEND_POWER_ON, 83 + USB_DIR_OUT | MT_USB_TYPE_VENDOR, 84 + 0x0, 0x1, NULL, 0); 85 + if (ret) 86 + return ret; 87 + 88 + if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_PWR_ON, 89 + MT_TOP_MISC2_FW_PWR_ON, 500)) { 90 + dev_err(dev->mt76.dev, "Timeout for power on\n"); 91 + ret = -EIO; 92 + } 93 + 94 + return ret; 95 + } 96 + 97 + static int 98 + mt7921u_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, 99 + int cmd, int *seq) 100 + { 101 + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); 102 + u32 pad, ep; 103 + int ret; 104 + 105 + ret = mt7921_mcu_fill_message(mdev, skb, cmd, seq); 106 + if (ret) 107 + return ret; 108 + 109 + if (cmd != MCU_CMD(FW_SCATTER)) 110 + ep = MT_EP_OUT_INBAND_CMD; 111 + else 112 + ep = MT_EP_OUT_AC_BE; 113 + 114 + mt7921_skb_add_usb_sdio_hdr(dev, skb, 0); 115 + pad = round_up(skb->len, 4) + 4 - skb->len; 116 + __skb_put_zero(skb, pad); 117 + 118 + ret = mt76u_bulk_msg(&dev->mt76, skb->data, skb->len, NULL, 119 + 1000, ep); 120 + dev_kfree_skb(skb); 121 + 122 + return ret; 123 + } 124 + 125 + static int mt7921u_mcu_init(struct mt7921_dev *dev) 126 + { 127 + static const struct mt76_mcu_ops mcu_ops = { 128 + .headroom = MT_SDIO_HDR_SIZE + sizeof(struct mt7921_mcu_txd), 129 + .tailroom = MT_USB_TAIL_SIZE, 130 + .mcu_skb_send_msg = mt7921u_mcu_send_message, 131 + .mcu_parse_response = mt7921_mcu_parse_response, 132 + .mcu_restart = mt76_connac_mcu_restart, 133 + }; 134 + int ret; 135 + 136 + dev->mt76.mcu_ops = &mcu_ops; 137 + 138 + mt76_set(dev, MT_UDMA_TX_QSEL, MT_FW_DL_EN); 139 + ret = mt7921_run_firmware(dev); 140 + if (ret) 141 + return ret; 142 + 143 + set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state); 144 + mt76_clear(dev, MT_UDMA_TX_QSEL, MT_FW_DL_EN); 145 + 146 + return 0; 147 + } 148 + 149 + static void mt7921u_stop(struct ieee80211_hw *hw) 150 + { 151 + struct mt7921_dev *dev = mt7921_hw_dev(hw); 152 + 153 + mt76u_stop_tx(&dev->mt76); 154 + mt7921_stop(hw); 155 + } 156 + 157 + static void mt7921u_cleanup(struct mt7921_dev *dev) 158 + { 159 + clear_bit(MT76_STATE_INITIALIZED, &dev->mphy.state); 160 + mt7921u_wfsys_reset(dev); 161 + mt7921_mcu_exit(dev); 162 + mt76u_queues_deinit(&dev->mt76); 163 + } 164 + 165 + static int mt7921u_probe(struct usb_interface *usb_intf, 166 + const struct usb_device_id *id) 167 + { 168 + static const struct mt76_driver_ops drv_ops = { 169 + .txwi_size = MT_SDIO_TXD_SIZE, 170 + .drv_flags = MT_DRV_RX_DMA_HDR | MT_DRV_HW_MGMT_TXQ, 171 + .survey_flags = SURVEY_INFO_TIME_TX | 172 + SURVEY_INFO_TIME_RX | 173 + SURVEY_INFO_TIME_BSS_RX, 174 + .tx_prepare_skb = mt7921_usb_sdio_tx_prepare_skb, 175 + .tx_complete_skb = mt7921_usb_sdio_tx_complete_skb, 176 + .tx_status_data = mt7921_usb_sdio_tx_status_data, 177 + .rx_skb = mt7921_queue_rx_skb, 178 + .sta_ps = mt7921_sta_ps, 179 + .sta_add = mt7921_mac_sta_add, 180 + .sta_assoc = mt7921_mac_sta_assoc, 181 + .sta_remove = mt7921_mac_sta_remove, 182 + .update_survey = mt7921_update_channel, 183 + }; 184 + static const struct mt7921_hif_ops hif_ops = { 185 + .mcu_init = mt7921u_mcu_init, 186 + .init_reset = mt7921u_init_reset, 187 + .reset = mt7921u_mac_reset, 188 + }; 189 + static struct mt76_bus_ops bus_ops = { 190 + .rr = mt7921u_rr, 191 + .wr = mt7921u_wr, 192 + .rmw = mt7921u_rmw, 193 + .read_copy = mt76u_read_copy, 194 + .write_copy = mt7921u_copy, 195 + .type = MT76_BUS_USB, 196 + }; 197 + struct usb_device *udev = interface_to_usbdev(usb_intf); 198 + struct ieee80211_ops *ops; 199 + struct ieee80211_hw *hw; 200 + struct mt7921_dev *dev; 201 + struct mt76_dev *mdev; 202 + int ret; 203 + 204 + ops = devm_kmemdup(&usb_intf->dev, &mt7921_ops, sizeof(mt7921_ops), 205 + GFP_KERNEL); 206 + if (!ops) 207 + return -ENOMEM; 208 + 209 + ops->stop = mt7921u_stop; 210 + 211 + mdev = mt76_alloc_device(&usb_intf->dev, sizeof(*dev), ops, &drv_ops); 212 + if (!mdev) 213 + return -ENOMEM; 214 + 215 + dev = container_of(mdev, struct mt7921_dev, mt76); 216 + dev->hif_ops = &hif_ops; 217 + 218 + udev = usb_get_dev(udev); 219 + usb_reset_device(udev); 220 + 221 + usb_set_intfdata(usb_intf, dev); 222 + 223 + ret = __mt76u_init(mdev, usb_intf, &bus_ops); 224 + if (ret < 0) 225 + goto error; 226 + 227 + mdev->rev = (mt76_rr(dev, MT_HW_CHIPID) << 16) | 228 + (mt76_rr(dev, MT_HW_REV) & 0xff); 229 + dev_dbg(mdev->dev, "ASIC revision: %04x\n", mdev->rev); 230 + 231 + if (mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY)) { 232 + ret = mt7921u_wfsys_reset(dev); 233 + if (ret) 234 + goto error; 235 + } 236 + 237 + ret = mt7921u_mcu_power_on(dev); 238 + if (ret) 239 + goto error; 240 + 241 + ret = mt76u_alloc_mcu_queue(&dev->mt76); 242 + if (ret) 243 + goto error; 244 + 245 + ret = mt76u_alloc_queues(&dev->mt76); 246 + if (ret) 247 + goto error; 248 + 249 + ret = mt7921u_dma_init(dev); 250 + if (ret) 251 + return ret; 252 + 253 + hw = mt76_hw(dev); 254 + /* check hw sg support in order to enable AMSDU */ 255 + hw->max_tx_fragments = mdev->usb.sg_en ? MT_HW_TXP_MAX_BUF_NUM : 1; 256 + 257 + ret = mt7921_register_device(dev); 258 + if (ret) 259 + goto error; 260 + 261 + return 0; 262 + 263 + error: 264 + mt76u_queues_deinit(&dev->mt76); 265 + 266 + usb_set_intfdata(usb_intf, NULL); 267 + usb_put_dev(interface_to_usbdev(usb_intf)); 268 + 269 + mt76_free_device(&dev->mt76); 270 + 271 + return ret; 272 + } 273 + 274 + static void mt7921u_disconnect(struct usb_interface *usb_intf) 275 + { 276 + struct mt7921_dev *dev = usb_get_intfdata(usb_intf); 277 + 278 + cancel_work_sync(&dev->init_work); 279 + if (!test_bit(MT76_STATE_INITIALIZED, &dev->mphy.state)) 280 + return; 281 + 282 + mt76_unregister_device(&dev->mt76); 283 + mt7921u_cleanup(dev); 284 + 285 + usb_set_intfdata(usb_intf, NULL); 286 + usb_put_dev(interface_to_usbdev(usb_intf)); 287 + 288 + mt76_free_device(&dev->mt76); 289 + } 290 + 291 + MODULE_DEVICE_TABLE(usb, mt7921u_device_table); 292 + MODULE_FIRMWARE(MT7921_FIRMWARE_WM); 293 + MODULE_FIRMWARE(MT7921_ROM_PATCH); 294 + 295 + static struct usb_driver mt7921u_driver = { 296 + .name = KBUILD_MODNAME, 297 + .id_table = mt7921u_device_table, 298 + .probe = mt7921u_probe, 299 + .disconnect = mt7921u_disconnect, 300 + .soft_unbind = 1, 301 + .disable_hub_initiated_lpm = 1, 302 + }; 303 + module_usb_driver(mt7921u_driver); 304 + 305 + MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 306 + MODULE_LICENSE("Dual BSD/GPL");
+252
drivers/net/wireless/mediatek/mt76/mt7921/usb_mac.c
··· 1 + // SPDX-License-Identifier: ISC 2 + /* Copyright (C) 2022 MediaTek Inc. 3 + * 4 + * Author: Lorenzo Bianconi <lorenzo@kernel.org> 5 + */ 6 + 7 + #include <linux/kernel.h> 8 + #include <linux/module.h> 9 + #include <linux/usb.h> 10 + 11 + #include "mt7921.h" 12 + #include "mcu.h" 13 + #include "mac.h" 14 + 15 + static u32 mt7921u_uhw_rr(struct mt76_dev *dev, u32 addr) 16 + { 17 + u32 ret; 18 + 19 + mutex_lock(&dev->usb.usb_ctrl_mtx); 20 + ret = ___mt76u_rr(dev, MT_VEND_DEV_MODE, 21 + USB_DIR_IN | MT_USB_TYPE_UHW_VENDOR, addr); 22 + mutex_unlock(&dev->usb.usb_ctrl_mtx); 23 + 24 + return ret; 25 + } 26 + 27 + static void mt7921u_uhw_wr(struct mt76_dev *dev, u32 addr, u32 val) 28 + { 29 + mutex_lock(&dev->usb.usb_ctrl_mtx); 30 + ___mt76u_wr(dev, MT_VEND_WRITE, 31 + USB_DIR_OUT | MT_USB_TYPE_UHW_VENDOR, addr, val); 32 + mutex_unlock(&dev->usb.usb_ctrl_mtx); 33 + } 34 + 35 + static void mt7921u_dma_prefetch(struct mt7921_dev *dev) 36 + { 37 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(0), 38 + MT_WPDMA0_MAX_CNT_MASK, 4); 39 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(0), 40 + MT_WPDMA0_BASE_PTR_MASK, 0x80); 41 + 42 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(1), 43 + MT_WPDMA0_MAX_CNT_MASK, 4); 44 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(1), 45 + MT_WPDMA0_BASE_PTR_MASK, 0xc0); 46 + 47 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(2), 48 + MT_WPDMA0_MAX_CNT_MASK, 4); 49 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(2), 50 + MT_WPDMA0_BASE_PTR_MASK, 0x100); 51 + 52 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(3), 53 + MT_WPDMA0_MAX_CNT_MASK, 4); 54 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(3), 55 + MT_WPDMA0_BASE_PTR_MASK, 0x140); 56 + 57 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(4), 58 + MT_WPDMA0_MAX_CNT_MASK, 4); 59 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(4), 60 + MT_WPDMA0_BASE_PTR_MASK, 0x180); 61 + 62 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(16), 63 + MT_WPDMA0_MAX_CNT_MASK, 4); 64 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(16), 65 + MT_WPDMA0_BASE_PTR_MASK, 0x280); 66 + 67 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(17), 68 + MT_WPDMA0_MAX_CNT_MASK, 4); 69 + mt76_rmw(dev, MT_UWFDMA0_TX_RING_EXT_CTRL(17), 70 + MT_WPDMA0_BASE_PTR_MASK, 0x2c0); 71 + } 72 + 73 + static void mt7921u_wfdma_init(struct mt7921_dev *dev) 74 + { 75 + mt7921u_dma_prefetch(dev); 76 + 77 + mt76_clear(dev, MT_UWFDMA0_GLO_CFG, MT_WFDMA0_GLO_CFG_OMIT_RX_INFO); 78 + mt76_set(dev, MT_UWFDMA0_GLO_CFG, 79 + MT_WFDMA0_GLO_CFG_OMIT_TX_INFO | 80 + MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2 | 81 + MT_WFDMA0_GLO_CFG_FW_DWLD_BYPASS_DMASHDL | 82 + MT_WFDMA0_GLO_CFG_TX_DMA_EN | 83 + MT_WFDMA0_GLO_CFG_RX_DMA_EN); 84 + 85 + /* disable dmashdl */ 86 + mt76_clear(dev, MT_UWFDMA0_GLO_CFG_EXT0, 87 + MT_WFDMA0_CSR_TX_DMASHDL_ENABLE); 88 + mt76_set(dev, MT_DMASHDL_SW_CONTROL, MT_DMASHDL_DMASHDL_BYPASS); 89 + 90 + mt76_set(dev, MT_WFDMA_DUMMY_CR, MT_WFDMA_NEED_REINIT); 91 + } 92 + 93 + static int mt7921u_dma_rx_evt_ep4(struct mt7921_dev *dev) 94 + { 95 + if (!mt76_poll(dev, MT_UWFDMA0_GLO_CFG, 96 + MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 1000)) 97 + return -ETIMEDOUT; 98 + 99 + mt76_clear(dev, MT_UWFDMA0_GLO_CFG, MT_WFDMA0_GLO_CFG_RX_DMA_EN); 100 + mt76_set(dev, MT_WFDMA_HOST_CONFIG, 101 + MT_WFDMA_HOST_CONFIG_USB_RXEVT_EP4_EN); 102 + mt76_set(dev, MT_UWFDMA0_GLO_CFG, MT_WFDMA0_GLO_CFG_RX_DMA_EN); 103 + 104 + return 0; 105 + } 106 + 107 + static void mt7921u_epctl_rst_opt(struct mt7921_dev *dev, bool reset) 108 + { 109 + u32 val; 110 + 111 + /* usb endpoint reset opt 112 + * bits[4,9]: out blk ep 4-9 113 + * bits[20,21]: in blk ep 4-5 114 + * bits[22]: in int ep 6 115 + */ 116 + val = mt7921u_uhw_rr(&dev->mt76, MT_SSUSB_EPCTL_CSR_EP_RST_OPT); 117 + if (reset) 118 + val |= GENMASK(9, 4) | GENMASK(22, 20); 119 + else 120 + val &= ~(GENMASK(9, 4) | GENMASK(22, 20)); 121 + mt7921u_uhw_wr(&dev->mt76, MT_SSUSB_EPCTL_CSR_EP_RST_OPT, val); 122 + } 123 + 124 + int mt7921u_dma_init(struct mt7921_dev *dev) 125 + { 126 + int err; 127 + 128 + mt7921u_wfdma_init(dev); 129 + 130 + mt76_clear(dev, MT_UDMA_WLCFG_0, MT_WL_RX_FLUSH); 131 + 132 + mt76_set(dev, MT_UDMA_WLCFG_0, 133 + MT_WL_RX_EN | MT_WL_TX_EN | 134 + MT_WL_RX_MPSZ_PAD0 | MT_TICK_1US_EN); 135 + mt76_clear(dev, MT_UDMA_WLCFG_0, 136 + MT_WL_RX_AGG_TO | MT_WL_RX_AGG_LMT); 137 + mt76_clear(dev, MT_UDMA_WLCFG_1, MT_WL_RX_AGG_PKT_LMT); 138 + 139 + err = mt7921u_dma_rx_evt_ep4(dev); 140 + if (err) 141 + return err; 142 + 143 + mt7921u_epctl_rst_opt(dev, false); 144 + 145 + return 0; 146 + } 147 + 148 + int mt7921u_wfsys_reset(struct mt7921_dev *dev) 149 + { 150 + u32 val; 151 + int i; 152 + 153 + mt7921u_epctl_rst_opt(dev, false); 154 + 155 + val = mt7921u_uhw_rr(&dev->mt76, MT_CBTOP_RGU_WF_SUBSYS_RST); 156 + val |= MT_CBTOP_RGU_WF_SUBSYS_RST_WF_WHOLE_PATH; 157 + mt7921u_uhw_wr(&dev->mt76, MT_CBTOP_RGU_WF_SUBSYS_RST, val); 158 + 159 + usleep_range(10, 20); 160 + 161 + val = mt7921u_uhw_rr(&dev->mt76, MT_CBTOP_RGU_WF_SUBSYS_RST); 162 + val &= ~MT_CBTOP_RGU_WF_SUBSYS_RST_WF_WHOLE_PATH; 163 + mt7921u_uhw_wr(&dev->mt76, MT_CBTOP_RGU_WF_SUBSYS_RST, val); 164 + 165 + mt7921u_uhw_wr(&dev->mt76, MT_UDMA_CONN_INFRA_STATUS_SEL, 0); 166 + for (i = 0; i < MT7921_WFSYS_INIT_RETRY_COUNT; i++) { 167 + val = mt7921u_uhw_rr(&dev->mt76, MT_UDMA_CONN_INFRA_STATUS); 168 + if (val & MT_UDMA_CONN_WFSYS_INIT_DONE) 169 + break; 170 + 171 + msleep(100); 172 + } 173 + 174 + if (i == MT7921_WFSYS_INIT_RETRY_COUNT) 175 + return -ETIMEDOUT; 176 + 177 + return 0; 178 + } 179 + 180 + int mt7921u_init_reset(struct mt7921_dev *dev) 181 + { 182 + set_bit(MT76_RESET, &dev->mphy.state); 183 + 184 + wake_up(&dev->mt76.mcu.wait); 185 + mt7921_mcu_exit(dev); 186 + 187 + mt76u_stop_rx(&dev->mt76); 188 + mt76u_stop_tx(&dev->mt76); 189 + 190 + mt7921u_wfsys_reset(dev); 191 + 192 + clear_bit(MT76_RESET, &dev->mphy.state); 193 + 194 + return mt76u_resume_rx(&dev->mt76); 195 + } 196 + 197 + int mt7921u_mac_reset(struct mt7921_dev *dev) 198 + { 199 + int err; 200 + 201 + mt76_txq_schedule_all(&dev->mphy); 202 + mt76_worker_disable(&dev->mt76.tx_worker); 203 + 204 + set_bit(MT76_RESET, &dev->mphy.state); 205 + set_bit(MT76_MCU_RESET, &dev->mphy.state); 206 + 207 + wake_up(&dev->mt76.mcu.wait); 208 + mt7921_mcu_exit(dev); 209 + 210 + mt76u_stop_rx(&dev->mt76); 211 + mt76u_stop_tx(&dev->mt76); 212 + 213 + mt7921u_wfsys_reset(dev); 214 + 215 + clear_bit(MT76_MCU_RESET, &dev->mphy.state); 216 + err = mt76u_resume_rx(&dev->mt76); 217 + if (err) 218 + goto out; 219 + 220 + err = mt7921u_mcu_power_on(dev); 221 + if (err) 222 + goto out; 223 + 224 + err = mt7921u_dma_init(dev); 225 + if (err) 226 + goto out; 227 + 228 + mt76_wr(dev, MT_SWDEF_MODE, MT_SWDEF_NORMAL_MODE); 229 + mt76_set(dev, MT_UDMA_TX_QSEL, MT_FW_DL_EN); 230 + 231 + err = mt7921_run_firmware(dev); 232 + if (err) 233 + goto out; 234 + 235 + mt76_clear(dev, MT_UDMA_TX_QSEL, MT_FW_DL_EN); 236 + 237 + err = mt7921_mcu_set_eeprom(dev); 238 + if (err) 239 + goto out; 240 + 241 + err = mt7921_mac_init(dev); 242 + if (err) 243 + goto out; 244 + 245 + err = __mt7921_start(&dev->phy); 246 + out: 247 + clear_bit(MT76_RESET, &dev->mphy.state); 248 + 249 + mt76_worker_enable(&dev->mt76.tx_worker); 250 + 251 + return err; 252 + }
+1 -1
drivers/net/wireless/mediatek/mt76/sdio_txrx.c
··· 118 118 __le32 *rxd = (__le32 *)buf; 119 119 120 120 /* parse rxd to get the actual packet length */ 121 - len = FIELD_GET(GENMASK(15, 0), le32_to_cpu(rxd[0])); 121 + len = le32_get_bits(rxd[0], GENMASK(15, 0)); 122 122 e->skb = mt76s_build_rx_skb(buf, len, round_up(len + 4, 4)); 123 123 if (!e->skb) 124 124 break;
+39 -86
drivers/net/wireless/mediatek/mt76/usb.c
··· 15 15 module_param_named(disable_usb_sg, disable_usb_sg, bool, 0644); 16 16 MODULE_PARM_DESC(disable_usb_sg, "Disable usb scatter-gather support"); 17 17 18 - static int __mt76u_vendor_request(struct mt76_dev *dev, u8 req, 19 - u8 req_type, u16 val, u16 offset, 20 - void *buf, size_t len) 18 + int __mt76u_vendor_request(struct mt76_dev *dev, u8 req, u8 req_type, 19 + u16 val, u16 offset, void *buf, size_t len) 21 20 { 22 21 struct usb_interface *uintf = to_usb_interface(dev->dev); 23 22 struct usb_device *udev = interface_to_usbdev(uintf); ··· 44 45 req, offset, ret); 45 46 return ret; 46 47 } 48 + EXPORT_SYMBOL_GPL(__mt76u_vendor_request); 47 49 48 50 int mt76u_vendor_request(struct mt76_dev *dev, u8 req, 49 51 u8 req_type, u16 val, u16 offset, ··· 62 62 } 63 63 EXPORT_SYMBOL_GPL(mt76u_vendor_request); 64 64 65 - static u32 ___mt76u_rr(struct mt76_dev *dev, u8 req, u32 addr) 65 + u32 ___mt76u_rr(struct mt76_dev *dev, u8 req, u8 req_type, u32 addr) 66 66 { 67 67 struct mt76_usb *usb = &dev->usb; 68 68 u32 data = ~0; 69 69 int ret; 70 70 71 - ret = __mt76u_vendor_request(dev, req, 72 - USB_DIR_IN | USB_TYPE_VENDOR, 73 - addr >> 16, addr, usb->data, 74 - sizeof(__le32)); 71 + ret = __mt76u_vendor_request(dev, req, req_type, addr >> 16, 72 + addr, usb->data, sizeof(__le32)); 75 73 if (ret == sizeof(__le32)) 76 74 data = get_unaligned_le32(usb->data); 77 75 trace_usb_reg_rr(dev, addr, data); 78 76 79 77 return data; 80 78 } 79 + EXPORT_SYMBOL_GPL(___mt76u_rr); 81 80 82 81 static u32 __mt76u_rr(struct mt76_dev *dev, u32 addr) 83 82 { ··· 94 95 break; 95 96 } 96 97 97 - return ___mt76u_rr(dev, req, addr & ~MT_VEND_TYPE_MASK); 98 + return ___mt76u_rr(dev, req, USB_DIR_IN | USB_TYPE_VENDOR, 99 + addr & ~MT_VEND_TYPE_MASK); 98 100 } 99 101 100 102 static u32 mt76u_rr(struct mt76_dev *dev, u32 addr) ··· 109 109 return ret; 110 110 } 111 111 112 - static u32 mt76u_rr_ext(struct mt76_dev *dev, u32 addr) 113 - { 114 - u32 ret; 115 - 116 - mutex_lock(&dev->usb.usb_ctrl_mtx); 117 - ret = ___mt76u_rr(dev, MT_VEND_READ_EXT, addr); 118 - mutex_unlock(&dev->usb.usb_ctrl_mtx); 119 - 120 - return ret; 121 - } 122 - 123 - static void ___mt76u_wr(struct mt76_dev *dev, u8 req, 124 - u32 addr, u32 val) 112 + void ___mt76u_wr(struct mt76_dev *dev, u8 req, u8 req_type, 113 + u32 addr, u32 val) 125 114 { 126 115 struct mt76_usb *usb = &dev->usb; 127 116 128 117 put_unaligned_le32(val, usb->data); 129 - __mt76u_vendor_request(dev, req, 130 - USB_DIR_OUT | USB_TYPE_VENDOR, 131 - addr >> 16, addr, usb->data, 132 - sizeof(__le32)); 118 + __mt76u_vendor_request(dev, req, req_type, addr >> 16, 119 + addr, usb->data, sizeof(__le32)); 133 120 trace_usb_reg_wr(dev, addr, val); 134 121 } 122 + EXPORT_SYMBOL_GPL(___mt76u_wr); 135 123 136 124 static void __mt76u_wr(struct mt76_dev *dev, u32 addr, u32 val) 137 125 { ··· 133 145 req = MT_VEND_MULTI_WRITE; 134 146 break; 135 147 } 136 - ___mt76u_wr(dev, req, addr & ~MT_VEND_TYPE_MASK, val); 148 + ___mt76u_wr(dev, req, USB_DIR_OUT | USB_TYPE_VENDOR, 149 + addr & ~MT_VEND_TYPE_MASK, val); 137 150 } 138 151 139 152 static void mt76u_wr(struct mt76_dev *dev, u32 addr, u32 val) ··· 144 155 mutex_unlock(&dev->usb.usb_ctrl_mtx); 145 156 } 146 157 147 - static void mt76u_wr_ext(struct mt76_dev *dev, u32 addr, u32 val) 148 - { 149 - mutex_lock(&dev->usb.usb_ctrl_mtx); 150 - ___mt76u_wr(dev, MT_VEND_WRITE_EXT, addr, val); 151 - mutex_unlock(&dev->usb.usb_ctrl_mtx); 152 - } 153 - 154 158 static u32 mt76u_rmw(struct mt76_dev *dev, u32 addr, 155 159 u32 mask, u32 val) 156 160 { 157 161 mutex_lock(&dev->usb.usb_ctrl_mtx); 158 162 val |= __mt76u_rr(dev, addr) & ~mask; 159 163 __mt76u_wr(dev, addr, val); 160 - mutex_unlock(&dev->usb.usb_ctrl_mtx); 161 - 162 - return val; 163 - } 164 - 165 - static u32 mt76u_rmw_ext(struct mt76_dev *dev, u32 addr, 166 - u32 mask, u32 val) 167 - { 168 - mutex_lock(&dev->usb.usb_ctrl_mtx); 169 - val |= ___mt76u_rr(dev, MT_VEND_READ_EXT, addr) & ~mask; 170 - ___mt76u_wr(dev, MT_VEND_WRITE_EXT, addr, val); 171 164 mutex_unlock(&dev->usb.usb_ctrl_mtx); 172 165 173 166 return val; ··· 187 216 mutex_unlock(&usb->usb_ctrl_mtx); 188 217 } 189 218 190 - static void mt76u_copy_ext(struct mt76_dev *dev, u32 offset, 191 - const void *data, int len) 192 - { 193 - struct mt76_usb *usb = &dev->usb; 194 - int ret, i = 0, batch_len; 195 - const u8 *val = data; 196 - 197 - len = round_up(len, 4); 198 - mutex_lock(&usb->usb_ctrl_mtx); 199 - while (i < len) { 200 - batch_len = min_t(int, usb->data_len, len - i); 201 - memcpy(usb->data, val + i, batch_len); 202 - ret = __mt76u_vendor_request(dev, MT_VEND_WRITE_EXT, 203 - USB_DIR_OUT | USB_TYPE_VENDOR, 204 - (offset + i) >> 16, offset + i, 205 - usb->data, batch_len); 206 - if (ret < 0) 207 - break; 208 - 209 - i += batch_len; 210 - } 211 - mutex_unlock(&usb->usb_ctrl_mtx); 212 - } 213 - 214 - static void 215 - mt76u_read_copy_ext(struct mt76_dev *dev, u32 offset, 216 - void *data, int len) 219 + void mt76u_read_copy(struct mt76_dev *dev, u32 offset, 220 + void *data, int len) 217 221 { 218 222 struct mt76_usb *usb = &dev->usb; 219 223 int i = 0, batch_len, ret; ··· 210 264 } 211 265 mutex_unlock(&usb->usb_ctrl_mtx); 212 266 } 267 + EXPORT_SYMBOL_GPL(mt76u_read_copy); 213 268 214 269 void mt76u_single_wr(struct mt76_dev *dev, const u8 req, 215 270 const u16 offset, const u32 val) ··· 1059 1112 .kick = mt76u_tx_kick, 1060 1113 }; 1061 1114 1062 - int mt76u_init(struct mt76_dev *dev, 1063 - struct usb_interface *intf, bool ext) 1115 + int __mt76u_init(struct mt76_dev *dev, struct usb_interface *intf, 1116 + struct mt76_bus_ops *ops) 1064 1117 { 1065 - static struct mt76_bus_ops mt76u_ops = { 1066 - .read_copy = mt76u_read_copy_ext, 1067 - .wr_rp = mt76u_wr_rp, 1068 - .rd_rp = mt76u_rd_rp, 1069 - .type = MT76_BUS_USB, 1070 - }; 1071 1118 struct usb_device *udev = interface_to_usbdev(intf); 1072 1119 struct mt76_usb *usb = &dev->usb; 1073 1120 int err; 1074 - 1075 - mt76u_ops.rr = ext ? mt76u_rr_ext : mt76u_rr; 1076 - mt76u_ops.wr = ext ? mt76u_wr_ext : mt76u_wr; 1077 - mt76u_ops.rmw = ext ? mt76u_rmw_ext : mt76u_rmw; 1078 - mt76u_ops.write_copy = ext ? mt76u_copy_ext : mt76u_copy; 1079 1121 1080 1122 INIT_WORK(&usb->stat_work, mt76u_tx_status_data); 1081 1123 ··· 1077 1141 return -ENOMEM; 1078 1142 1079 1143 mutex_init(&usb->usb_ctrl_mtx); 1080 - dev->bus = &mt76u_ops; 1144 + dev->bus = ops; 1081 1145 dev->queue_ops = &usb_queue_ops; 1082 1146 1083 1147 dev_set_drvdata(&udev->dev, dev); ··· 1102 1166 sched_set_fifo_low(usb->status_worker.task); 1103 1167 1104 1168 return 0; 1169 + } 1170 + EXPORT_SYMBOL_GPL(__mt76u_init); 1171 + 1172 + int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf) 1173 + { 1174 + static struct mt76_bus_ops bus_ops = { 1175 + .rr = mt76u_rr, 1176 + .wr = mt76u_wr, 1177 + .rmw = mt76u_rmw, 1178 + .read_copy = mt76u_read_copy, 1179 + .write_copy = mt76u_copy, 1180 + .wr_rp = mt76u_wr_rp, 1181 + .rd_rp = mt76u_rd_rp, 1182 + .type = MT76_BUS_USB, 1183 + }; 1184 + 1185 + return __mt76u_init(dev, intf, &bus_ops); 1105 1186 } 1106 1187 EXPORT_SYMBOL_GPL(mt76u_init); 1107 1188