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

Merge tag 'wireless-next-2022-03-18' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next

Kalle Valo says:

====================
wireless-next patches for v5.18

Third set of patches for v5.18. Smaller set this time, support for
mt7921u and some work on MBSSID support. Also a workaround for rfkill
userspace event.

Major changes:

mac80211

* MBSSID beacon handling in AP mode

rfkill

* make new event layout opt-in to workaround buggy user space

rtlwifi

* support On Networks N150 device id

mt76

* mt7915: MBSSID and 6 GHz band support

* new driver mt7921u
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+2308 -593
+1 -1
MAINTAINERS
··· 15938 15938 L: ath11k@lists.infradead.org 15939 15939 S: Supported 15940 15940 T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git 15941 + F: Documentation/devicetree/bindings/net/wireless/qcom,ath11k.yaml 15941 15942 F: drivers/net/wireless/ath/ath11k/ 15942 - F: Documentation/devicetree/bindings/net/wireless/qcom,ath11k.txt 15943 15943 15944 15944 QUALCOMM ATHEROS ATH9K WIRELESS DRIVER 15945 15945 M: Toke Høiland-Jørgensen <toke@toke.dk>
+4 -4
drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
··· 90 90 #define P2PSD_ACTION_CATEGORY 0x04 /* Public action frame */ 91 91 #define P2PSD_ACTION_ID_GAS_IREQ 0x0a /* GAS Initial Request AF */ 92 92 #define P2PSD_ACTION_ID_GAS_IRESP 0x0b /* GAS Initial Response AF */ 93 - #define P2PSD_ACTION_ID_GAS_CREQ 0x0c /* GAS Comback Request AF */ 94 - #define P2PSD_ACTION_ID_GAS_CRESP 0x0d /* GAS Comback Response AF */ 93 + #define P2PSD_ACTION_ID_GAS_CREQ 0x0c /* GAS Comeback Request AF */ 94 + #define P2PSD_ACTION_ID_GAS_CRESP 0x0d /* GAS Comeback Response AF */ 95 95 96 96 #define BRCMF_P2P_DISABLE_TIMEOUT msecs_to_jiffies(500) 97 97 ··· 396 396 (tx) ? "TX" : "RX"); 397 397 break; 398 398 case P2PSD_ACTION_ID_GAS_CREQ: 399 - brcmf_dbg(TRACE, "%s P2P GAS Comback Request\n", 399 + brcmf_dbg(TRACE, "%s P2P GAS Comeback Request\n", 400 400 (tx) ? "TX" : "RX"); 401 401 break; 402 402 case P2PSD_ACTION_ID_GAS_CRESP: 403 - brcmf_dbg(TRACE, "%s P2P GAS Comback Response\n", 403 + brcmf_dbg(TRACE, "%s P2P GAS Comeback Response\n", 404 404 (tx) ? "TX" : "RX"); 405 405 break; 406 406 default:
+1 -1
drivers/net/wireless/cisco/airo.c
··· 545 545 #define MODE_CFG_MASK cpu_to_le16(0xff) 546 546 #define MODE_ETHERNET_HOST cpu_to_le16(0<<8) /* rx payloads converted */ 547 547 #define MODE_LLC_HOST cpu_to_le16(1<<8) /* rx payloads left as is */ 548 - #define MODE_AIRONET_EXTEND cpu_to_le16(1<<9) /* enable Aironet extenstions */ 548 + #define MODE_AIRONET_EXTEND cpu_to_le16(1<<9) /* enable Aironet extensions */ 549 549 #define MODE_AP_INTERFACE cpu_to_le16(1<<10) /* enable ap interface extensions */ 550 550 #define MODE_ANTENNA_ALIGN cpu_to_le16(1<<11) /* enable antenna alignment */ 551 551 #define MODE_ETHER_LLC cpu_to_le16(1<<12) /* enable ethernet LLC */
+1
drivers/net/wireless/intel/iwlwifi/Kconfig
··· 139 139 tristate "Intel Management Engine communication over WLAN" 140 140 depends on INTEL_MEI 141 141 depends on PM 142 + depends on CFG80211 142 143 help 143 144 Enables the iwlmei kernel module. 144 145
+1 -1
drivers/net/wireless/marvell/mwifiex/uap_cmd.c
··· 389 389 { 390 390 const u8 *vendor_ie; 391 391 const u8 *wmm_ie; 392 - u8 wmm_oui[] = {0x00, 0x50, 0xf2, 0x02}; 392 + static const u8 wmm_oui[] = {0x00, 0x50, 0xf2, 0x02}; 393 393 394 394 vendor_ie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, 395 395 WLAN_OUI_TYPE_MICROSOFT_WMM,
+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
+1
drivers/net/wireless/realtek/rtlwifi/rtl8192cu/sw.c
··· 334 334 {RTL_USB_DEVICE(0x04f2, 0xaff7, rtl92cu_hal_cfg)}, /*Xavi*/ 335 335 {RTL_USB_DEVICE(0x04f2, 0xaff9, rtl92cu_hal_cfg)}, /*Xavi*/ 336 336 {RTL_USB_DEVICE(0x04f2, 0xaffa, rtl92cu_hal_cfg)}, /*Xavi*/ 337 + {RTL_USB_DEVICE(0x0846, 0x9042, rtl92cu_hal_cfg)}, /*On Netwrks N150MA*/ 337 338 338 339 /****** 8188CUS Slim Combo ********/ 339 340 {RTL_USB_DEVICE(0x04f2, 0xaff8, rtl92cu_hal_cfg)}, /*Xavi*/
+3 -3
drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.c
··· 872 872 else 873 873 falsealm_cnt->cnt_all = falsealm_cnt->cnt_ofdm_fail; 874 874 875 - /*reset OFDM FA coutner*/ 875 + /*reset OFDM FA counter*/ 876 876 rtl_set_bbreg(hw, ODM_REG_OFDM_FA_RST_11AC, BIT(17), 1); 877 877 rtl_set_bbreg(hw, ODM_REG_OFDM_FA_RST_11AC, BIT(17), 0); 878 878 /* reset CCK FA counter*/ ··· 1464 1464 const u8 *delta_swing_table_idx_tup_b; 1465 1465 const u8 *delta_swing_table_idx_tdown_b; 1466 1466 1467 - /*2. Initilization ( 7 steps in total )*/ 1467 + /*2. Initialization ( 7 steps in total )*/ 1468 1468 rtl8812ae_get_delta_swing_table(hw, 1469 1469 &delta_swing_table_idx_tup_a, 1470 1470 &delta_swing_table_idx_tdown_a, ··· 2502 2502 rtlpriv->dm.dbginfo.num_non_be_pkt = 0; 2503 2503 2504 2504 /*=============================== 2505 - * list paramter for different platform 2505 + * list parameter for different platform 2506 2506 *=============================== 2507 2507 */ 2508 2508 pb_is_cur_rdl_state = &rtlpriv->dm.is_cur_rdlstate;
+15 -15
drivers/net/wireless/realtek/rtw89/coex.c
··· 1478 1478 } 1479 1479 } 1480 1480 1481 - rtw89_mac_cfg_gnt(rtwdev, &dm->gnt); 1481 + rtw89_chip_mac_cfg_gnt(rtwdev, &dm->gnt); 1482 1482 } 1483 1483 1484 1484 #define BTC_TDMA_WLROLE_MAX 2 ··· 2233 2233 } 2234 2234 } 2235 2235 2236 - rtw89_mac_cfg_gnt(rtwdev, &dm->gnt); 2236 + rtw89_chip_mac_cfg_gnt(rtwdev, &dm->gnt); 2237 2237 } 2238 2238 2239 2239 static void _set_bt_plut(struct rtw89_dev *rtwdev, u8 phy_map, ··· 2300 2300 2301 2301 switch (type) { 2302 2302 case BTC_ANT_WPOWERON: 2303 - rtw89_mac_cfg_ctrl_path(rtwdev, false); 2303 + rtw89_chip_cfg_ctrl_path(rtwdev, false); 2304 2304 break; 2305 2305 case BTC_ANT_WINIT: 2306 2306 if (bt->enable.now) { ··· 2310 2310 _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI); 2311 2311 _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_LO); 2312 2312 } 2313 - rtw89_mac_cfg_ctrl_path(rtwdev, true); 2313 + rtw89_chip_cfg_ctrl_path(rtwdev, true); 2314 2314 _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_BT, BTC_PLT_BT); 2315 2315 break; 2316 2316 case BTC_ANT_WONLY: 2317 2317 _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI); 2318 2318 _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_LO); 2319 - rtw89_mac_cfg_ctrl_path(rtwdev, true); 2319 + rtw89_chip_cfg_ctrl_path(rtwdev, true); 2320 2320 _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE); 2321 2321 break; 2322 2322 case BTC_ANT_WOFF: 2323 - rtw89_mac_cfg_ctrl_path(rtwdev, false); 2323 + rtw89_chip_cfg_ctrl_path(rtwdev, false); 2324 2324 _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE); 2325 2325 break; 2326 2326 case BTC_ANT_W2G: 2327 - rtw89_mac_cfg_ctrl_path(rtwdev, true); 2327 + rtw89_chip_cfg_ctrl_path(rtwdev, true); 2328 2328 if (rtwdev->dbcc_en) { 2329 2329 for (i = 0; i < RTW89_PHY_MAX; i++) { 2330 2330 b2g = (wl_dinfo->real_band[i] == RTW89_BAND_2G); ··· 2352 2352 } 2353 2353 break; 2354 2354 case BTC_ANT_W5G: 2355 - rtw89_mac_cfg_ctrl_path(rtwdev, true); 2355 + rtw89_chip_cfg_ctrl_path(rtwdev, true); 2356 2356 _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI); 2357 2357 _set_gnt_bt(rtwdev, phy_map, BTC_GNT_HW); 2358 2358 _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE); 2359 2359 break; 2360 2360 case BTC_ANT_W25G: 2361 - rtw89_mac_cfg_ctrl_path(rtwdev, true); 2361 + rtw89_chip_cfg_ctrl_path(rtwdev, true); 2362 2362 _set_gnt_wl(rtwdev, phy_map, BTC_GNT_HW); 2363 2363 _set_gnt_bt(rtwdev, phy_map, BTC_GNT_HW); 2364 2364 _set_bt_plut(rtwdev, BTC_PHY_ALL, 2365 2365 BTC_PLT_GNT_WL, BTC_PLT_GNT_WL); 2366 2366 break; 2367 2367 case BTC_ANT_FREERUN: 2368 - rtw89_mac_cfg_ctrl_path(rtwdev, true); 2368 + rtw89_chip_cfg_ctrl_path(rtwdev, true); 2369 2369 _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI); 2370 2370 _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_HI); 2371 2371 _set_bt_plut(rtwdev, BTC_PHY_ALL, BTC_PLT_NONE, BTC_PLT_NONE); 2372 2372 break; 2373 2373 case BTC_ANT_WRFK: 2374 - rtw89_mac_cfg_ctrl_path(rtwdev, true); 2374 + rtw89_chip_cfg_ctrl_path(rtwdev, true); 2375 2375 _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_HI); 2376 2376 _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_LO); 2377 2377 _set_bt_plut(rtwdev, phy_map, BTC_PLT_NONE, BTC_PLT_NONE); 2378 2378 break; 2379 2379 case BTC_ANT_BRFK: 2380 - rtw89_mac_cfg_ctrl_path(rtwdev, false); 2380 + rtw89_chip_cfg_ctrl_path(rtwdev, false); 2381 2381 _set_gnt_wl(rtwdev, phy_map, BTC_GNT_SW_LO); 2382 2382 _set_gnt_bt(rtwdev, phy_map, BTC_GNT_SW_HI); 2383 2383 _set_bt_plut(rtwdev, phy_map, BTC_PLT_NONE, BTC_PLT_NONE); ··· 4623 4623 ver_hotfix = FIELD_GET(GENMASK(15, 8), chip->wlcx_desired); 4624 4624 seq_printf(m, "(%s, desired:%d.%d.%d), ", 4625 4625 (wl->ver_info.fw_coex >= chip->wlcx_desired ? 4626 - "Match" : "Mis-Match"), ver_main, ver_sub, ver_hotfix); 4626 + "Match" : "Mismatch"), ver_main, ver_sub, ver_hotfix); 4627 4627 4628 4628 seq_printf(m, "BT_FW_coex:%d(%s, desired:%d)\n", 4629 4629 bt->ver_info.fw_coex, 4630 4630 (bt->ver_info.fw_coex >= chip->btcx_desired ? 4631 - "Match" : "Mis-Match"), chip->btcx_desired); 4631 + "Match" : "Mismatch"), chip->btcx_desired); 4632 4632 4633 4633 if (bt->enable.now && bt->ver_info.fw == 0) 4634 4634 rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_VER_INFO, true); ··· 5075 5075 seq_printf(m, "leak_ap:%d, fw_offload:%s%s\n", dm->leak_ap, 5076 5076 (BTC_CX_FW_OFFLOAD ? "Y" : "N"), 5077 5077 (dm->wl_fw_cx_offload == BTC_CX_FW_OFFLOAD ? 5078 - "" : "(Mis-Match!!)")); 5078 + "" : "(Mismatch!!)")); 5079 5079 5080 5080 if (dm->rf_trx_para.wl_tx_power == 0xff) 5081 5081 seq_printf(m,
+45 -2
drivers/net/wireless/realtek/rtw89/core.h
··· 609 609 }; 610 610 611 611 struct rtw89_channel_help_params { 612 - u16 tx_en; 612 + u32 tx_en; 613 613 }; 614 614 615 615 struct rtw89_port_reg { ··· 2065 2065 struct ieee80211_rx_status *status); 2066 2066 void (*bb_ctrl_btc_preagc)(struct rtw89_dev *rtwdev, bool bt_en); 2067 2067 void (*set_txpwr_ul_tb_offset)(struct rtw89_dev *rtwdev, 2068 - s16 pw_ofst, enum rtw89_mac_idx mac_idx); 2068 + s8 pw_ofst, enum rtw89_mac_idx mac_idx); 2069 2069 int (*pwr_on_func)(struct rtw89_dev *rtwdev); 2070 2070 int (*pwr_off_func)(struct rtw89_dev *rtwdev); 2071 + int (*cfg_ctrl_path)(struct rtw89_dev *rtwdev, bool wl); 2072 + int (*mac_cfg_gnt)(struct rtw89_dev *rtwdev, 2073 + const struct rtw89_mac_ax_coex_gnt *gnt_cfg); 2074 + int (*stop_sch_tx)(struct rtw89_dev *rtwdev, u8 mac_idx, 2075 + u32 *tx_en, enum rtw89_sch_tx_sel sel); 2076 + int (*resume_sch_tx)(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en); 2071 2077 2072 2078 void (*btc_set_rfe)(struct rtw89_dev *rtwdev); 2073 2079 void (*btc_init_cfg)(struct rtw89_dev *rtwdev); ··· 2235 2229 const struct rtw89_reg2_def *regs; 2236 2230 u32 n_regs; 2237 2231 enum rtw89_rf_path rf_path; 2232 + void (*config)(struct rtw89_dev *rtwdev, const struct rtw89_reg2_def *reg, 2233 + enum rtw89_rf_path rf_path, void *data); 2238 2234 }; 2239 2235 2240 2236 struct rtw89_txpwr_table { ··· 2340 2332 u32 c2h_ctrl_reg; 2341 2333 const u32 *c2h_regs; 2342 2334 const struct rtw89_page_regs *page_regs; 2335 + const struct rtw89_reg_def *dcfo_comp; 2336 + u8 dcfo_comp_sft; 2343 2337 }; 2344 2338 2345 2339 union rtw89_bus_info { ··· 3471 3461 3472 3462 if (chip->ops->ctrl_btg) 3473 3463 chip->ops->ctrl_btg(rtwdev, btg); 3464 + } 3465 + 3466 + static inline 3467 + void rtw89_chip_mac_cfg_gnt(struct rtw89_dev *rtwdev, 3468 + const struct rtw89_mac_ax_coex_gnt *gnt_cfg) 3469 + { 3470 + const struct rtw89_chip_info *chip = rtwdev->chip; 3471 + 3472 + chip->ops->mac_cfg_gnt(rtwdev, gnt_cfg); 3473 + } 3474 + 3475 + static inline void rtw89_chip_cfg_ctrl_path(struct rtw89_dev *rtwdev, bool wl) 3476 + { 3477 + const struct rtw89_chip_info *chip = rtwdev->chip; 3478 + 3479 + chip->ops->cfg_ctrl_path(rtwdev, wl); 3480 + } 3481 + 3482 + static inline 3483 + int rtw89_chip_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, 3484 + u32 *tx_en, enum rtw89_sch_tx_sel sel) 3485 + { 3486 + const struct rtw89_chip_info *chip = rtwdev->chip; 3487 + 3488 + return chip->ops->stop_sch_tx(rtwdev, mac_idx, tx_en, sel); 3489 + } 3490 + 3491 + static inline 3492 + int rtw89_chip_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en) 3493 + { 3494 + const struct rtw89_chip_info *chip = rtwdev->chip; 3495 + 3496 + return chip->ops->resume_sch_tx(rtwdev, mac_idx, tx_en); 3474 3497 } 3475 3498 3476 3499 static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr)
+1 -1
drivers/net/wireless/realtek/rtw89/fw.c
··· 1964 1964 struct ieee80211_scan_ies *ies = rtwvif->scan_ies; 1965 1965 struct rtw89_pktofld_info *info; 1966 1966 struct sk_buff *new; 1967 - int ret; 1967 + int ret = 0; 1968 1968 u8 band; 1969 1969 1970 1970 for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) {
+247 -36
drivers/net/wireless/realtek/rtw89/mac.c
··· 1128 1128 1129 1129 static int dmac_func_en(struct rtw89_dev *rtwdev) 1130 1130 { 1131 + enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; 1131 1132 u32 val32; 1132 1133 1133 - val32 = (B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN | B_AX_MAC_SEC_EN | 1134 - B_AX_DISPATCHER_EN | B_AX_DLE_CPUIO_EN | B_AX_PKT_IN_EN | 1135 - B_AX_DMAC_TBL_EN | B_AX_PKT_BUF_EN | B_AX_STA_SCH_EN | 1136 - B_AX_TXPKT_CTRL_EN | B_AX_WD_RLS_EN | B_AX_MPDU_PROC_EN); 1134 + if (chip_id == RTL8852C) 1135 + val32 = (B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN | 1136 + B_AX_MAC_SEC_EN | B_AX_DISPATCHER_EN | 1137 + B_AX_DLE_CPUIO_EN | B_AX_PKT_IN_EN | 1138 + B_AX_DMAC_TBL_EN | B_AX_PKT_BUF_EN | 1139 + B_AX_STA_SCH_EN | B_AX_TXPKT_CTRL_EN | 1140 + B_AX_WD_RLS_EN | B_AX_MPDU_PROC_EN | 1141 + B_AX_DMAC_CRPRT | B_AX_H_AXIDMA_EN); 1142 + else 1143 + val32 = (B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN | 1144 + B_AX_MAC_SEC_EN | B_AX_DISPATCHER_EN | 1145 + B_AX_DLE_CPUIO_EN | B_AX_PKT_IN_EN | 1146 + B_AX_DMAC_TBL_EN | B_AX_PKT_BUF_EN | 1147 + B_AX_STA_SCH_EN | B_AX_TXPKT_CTRL_EN | 1148 + B_AX_WD_RLS_EN | B_AX_MPDU_PROC_EN | 1149 + B_AX_DMAC_CRPRT); 1137 1150 rtw89_write32(rtwdev, R_AX_DMAC_FUNC_EN, val32); 1138 1151 1139 1152 val32 = (B_AX_MAC_SEC_CLK_EN | B_AX_DISPATCHER_CLK_EN | 1140 1153 B_AX_DLE_CPUIO_CLK_EN | B_AX_PKT_IN_CLK_EN | 1141 1154 B_AX_STA_SCH_CLK_EN | B_AX_TXPKT_CTRL_CLK_EN | 1142 - B_AX_WD_RLS_CLK_EN); 1155 + B_AX_WD_RLS_CLK_EN | B_AX_BBRPT_CLK_EN); 1143 1156 rtw89_write32(rtwdev, R_AX_DMAC_CLK_EN, val32); 1144 1157 1145 1158 return 0; ··· 1160 1147 1161 1148 static int chip_func_en(struct rtw89_dev *rtwdev) 1162 1149 { 1163 - rtw89_write32_set(rtwdev, R_AX_SPSLDO_ON_CTRL0, B_AX_OCP_L1_MASK); 1150 + enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; 1151 + 1152 + if (chip_id == RTL8852A) 1153 + rtw89_write32_set(rtwdev, R_AX_SPSLDO_ON_CTRL0, 1154 + B_AX_OCP_L1_MASK); 1164 1155 1165 1156 return 0; 1166 1157 } ··· 1545 1528 return ret; 1546 1529 } 1547 1530 1531 + static int preload_init_set(struct rtw89_dev *rtwdev, enum rtw89_mac_idx mac_idx, 1532 + enum rtw89_qta_mode mode) 1533 + { 1534 + u32 reg, max_preld_size, min_rsvd_size; 1535 + 1536 + max_preld_size = (mac_idx == RTW89_MAC_0 ? 1537 + PRELD_B0_ENT_NUM : PRELD_B1_ENT_NUM) * PRELD_AMSDU_SIZE; 1538 + reg = mac_idx == RTW89_MAC_0 ? 1539 + R_AX_TXPKTCTL_B0_PRELD_CFG0 : R_AX_TXPKTCTL_B1_PRELD_CFG0; 1540 + rtw89_write32_mask(rtwdev, reg, B_AX_B0_PRELD_USEMAXSZ_MASK, max_preld_size); 1541 + rtw89_write32_set(rtwdev, reg, B_AX_B0_PRELD_FEN); 1542 + 1543 + min_rsvd_size = PRELD_AMSDU_SIZE; 1544 + reg = mac_idx == RTW89_MAC_0 ? 1545 + R_AX_TXPKTCTL_B0_PRELD_CFG1 : R_AX_TXPKTCTL_B1_PRELD_CFG1; 1546 + rtw89_write32_mask(rtwdev, reg, B_AX_B0_PRELD_NXT_TXENDWIN_MASK, PRELD_NEXT_WND); 1547 + rtw89_write32_mask(rtwdev, reg, B_AX_B0_PRELD_NXT_RSVMINSZ_MASK, min_rsvd_size); 1548 + 1549 + return 0; 1550 + } 1551 + 1552 + static bool is_qta_poh(struct rtw89_dev *rtwdev) 1553 + { 1554 + return rtwdev->hci.type == RTW89_HCI_TYPE_PCIE; 1555 + } 1556 + 1557 + static int preload_init(struct rtw89_dev *rtwdev, enum rtw89_mac_idx mac_idx, 1558 + enum rtw89_qta_mode mode) 1559 + { 1560 + const struct rtw89_chip_info *chip = rtwdev->chip; 1561 + 1562 + if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B || !is_qta_poh(rtwdev)) 1563 + return 0; 1564 + 1565 + return preload_init_set(rtwdev, mac_idx, mode); 1566 + } 1567 + 1548 1568 static bool dle_is_txq_empty(struct rtw89_dev *rtwdev) 1549 1569 { 1550 1570 u32 msk32; ··· 1686 1632 ret = dle_init(rtwdev, rtwdev->mac.qta_mode, RTW89_QTA_INVALID); 1687 1633 if (ret) { 1688 1634 rtw89_err(rtwdev, "[ERR]DLE init %d\n", ret); 1635 + return ret; 1636 + } 1637 + 1638 + ret = preload_init(rtwdev, RTW89_MAC_0, rtwdev->mac.qta_mode); 1639 + if (ret) { 1640 + rtw89_err(rtwdev, "[ERR]preload init %d\n", ret); 1689 1641 return ret; 1690 1642 } 1691 1643 ··· 2246 2186 return 0; 2247 2187 } 2248 2188 2189 + static int rtw89_set_hw_sch_tx_en_v1(struct rtw89_dev *rtwdev, u8 mac_idx, 2190 + u32 tx_en, u32 tx_en_mask) 2191 + { 2192 + u32 reg = rtw89_mac_reg_by_idx(R_AX_CTN_DRV_TXEN, mac_idx); 2193 + u32 val; 2194 + int ret; 2195 + 2196 + ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 2197 + if (ret) 2198 + return ret; 2199 + 2200 + val = rtw89_read32(rtwdev, reg); 2201 + val = (val & ~tx_en_mask) | (tx_en & tx_en_mask); 2202 + rtw89_write32(rtwdev, reg, val); 2203 + 2204 + return 0; 2205 + } 2206 + 2249 2207 int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, 2250 - u16 *tx_en, enum rtw89_sch_tx_sel sel) 2208 + u32 *tx_en, enum rtw89_sch_tx_sel sel) 2251 2209 { 2252 2210 int ret; 2253 2211 ··· 2274 2196 2275 2197 switch (sel) { 2276 2198 case RTW89_SCH_TX_SEL_ALL: 2277 - ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, 0, 0xffff); 2199 + ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, 0, 2200 + B_AX_CTN_TXEN_ALL_MASK); 2278 2201 if (ret) 2279 2202 return ret; 2280 2203 break; ··· 2292 2213 return ret; 2293 2214 break; 2294 2215 case RTW89_SCH_TX_SEL_MACID: 2295 - ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, 0, 0xffff); 2216 + ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, 0, 2217 + B_AX_CTN_TXEN_ALL_MASK); 2296 2218 if (ret) 2297 2219 return ret; 2298 2220 break; ··· 2305 2225 } 2306 2226 EXPORT_SYMBOL(rtw89_mac_stop_sch_tx); 2307 2227 2308 - int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u16 tx_en) 2228 + int rtw89_mac_stop_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx, 2229 + u32 *tx_en, enum rtw89_sch_tx_sel sel) 2309 2230 { 2310 2231 int ret; 2311 2232 2312 - ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, tx_en, 0xffff); 2233 + *tx_en = rtw89_read32(rtwdev, 2234 + rtw89_mac_reg_by_idx(R_AX_CTN_DRV_TXEN, mac_idx)); 2235 + 2236 + switch (sel) { 2237 + case RTW89_SCH_TX_SEL_ALL: 2238 + ret = rtw89_set_hw_sch_tx_en_v1(rtwdev, mac_idx, 0, 2239 + B_AX_CTN_TXEN_ALL_MASK_V1); 2240 + if (ret) 2241 + return ret; 2242 + break; 2243 + case RTW89_SCH_TX_SEL_HIQ: 2244 + ret = rtw89_set_hw_sch_tx_en_v1(rtwdev, mac_idx, 2245 + 0, B_AX_CTN_TXEN_HGQ); 2246 + if (ret) 2247 + return ret; 2248 + break; 2249 + case RTW89_SCH_TX_SEL_MG0: 2250 + ret = rtw89_set_hw_sch_tx_en_v1(rtwdev, mac_idx, 2251 + 0, B_AX_CTN_TXEN_MGQ); 2252 + if (ret) 2253 + return ret; 2254 + break; 2255 + case RTW89_SCH_TX_SEL_MACID: 2256 + ret = rtw89_set_hw_sch_tx_en_v1(rtwdev, mac_idx, 0, 2257 + B_AX_CTN_TXEN_ALL_MASK_V1); 2258 + if (ret) 2259 + return ret; 2260 + break; 2261 + default: 2262 + return 0; 2263 + } 2264 + 2265 + return 0; 2266 + } 2267 + EXPORT_SYMBOL(rtw89_mac_stop_sch_tx_v1); 2268 + 2269 + int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en) 2270 + { 2271 + int ret; 2272 + 2273 + ret = rtw89_set_hw_sch_tx_en(rtwdev, mac_idx, tx_en, B_AX_CTN_TXEN_ALL_MASK); 2313 2274 if (ret) 2314 2275 return ret; 2315 2276 2316 2277 return 0; 2317 2278 } 2318 2279 EXPORT_SYMBOL(rtw89_mac_resume_sch_tx); 2280 + 2281 + int rtw89_mac_resume_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en) 2282 + { 2283 + int ret; 2284 + 2285 + ret = rtw89_set_hw_sch_tx_en_v1(rtwdev, mac_idx, tx_en, 2286 + B_AX_CTN_TXEN_ALL_MASK_V1); 2287 + if (ret) 2288 + return ret; 2289 + 2290 + return 0; 2291 + } 2292 + EXPORT_SYMBOL(rtw89_mac_resume_sch_tx_v1); 2319 2293 2320 2294 static u16 rtw89_mac_dle_buf_req(struct rtw89_dev *rtwdev, u16 buf_len, 2321 2295 bool wd) ··· 2533 2399 int ret, i; 2534 2400 u32 sleep_bak[4] = {0}; 2535 2401 u32 pause_bak[4] = {0}; 2536 - u16 tx_en; 2402 + u32 tx_en; 2537 2403 2538 - ret = rtw89_mac_stop_sch_tx(rtwdev, 0, &tx_en, RTW89_SCH_TX_SEL_ALL); 2404 + ret = rtw89_chip_stop_sch_tx(rtwdev, 0, &tx_en, RTW89_SCH_TX_SEL_ALL); 2539 2405 if (ret) { 2540 2406 rtw89_err(rtwdev, "[ERR]stop sch tx %d\n", ret); 2541 2407 return ret; ··· 2565 2431 rtw89_write32(rtwdev, R_AX_SS_MACID_PAUSE_0 + i * 4, pause_bak[i]); 2566 2432 } 2567 2433 2568 - ret = rtw89_mac_resume_sch_tx(rtwdev, 0, tx_en); 2434 + ret = rtw89_chip_resume_sch_tx(rtwdev, 0, tx_en); 2569 2435 if (ret) { 2570 2436 rtw89_err(rtwdev, "[ERR]CMAC1 resume sch tx %d\n", ret); 2571 2437 return ret; ··· 2759 2625 clear_bit(RTW89_FLAG_FW_RDY, rtwdev->flags); 2760 2626 2761 2627 rtw89_write32_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_WCPU_EN); 2628 + rtw89_write32_clr(rtwdev, R_AX_WCPU_FW_CTRL, B_AX_WCPU_FWDL_EN | 2629 + B_AX_H2C_PATH_RDY | B_AX_FWDL_PATH_RDY); 2762 2630 rtw89_write32_clr(rtwdev, R_AX_SYS_CLK_CTRL, B_AX_CPU_CLK_EN); 2631 + rtw89_write32_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN); 2632 + rtw89_write32_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN); 2763 2633 } 2764 2634 2765 2635 static int rtw89_mac_enable_cpu(struct rtw89_dev *rtwdev, u8 boot_reason, ··· 3695 3557 int rtw89_mac_cfg_gnt(struct rtw89_dev *rtwdev, 3696 3558 const struct rtw89_mac_ax_coex_gnt *gnt_cfg) 3697 3559 { 3698 - u32 val, ret; 3560 + u32 val = 0, ret; 3699 3561 3700 - ret = rtw89_mac_read_lte(rtwdev, R_AX_LTE_SW_CFG_1, &val); 3701 - if (ret) { 3702 - rtw89_err(rtwdev, "Read LTE fail!\n"); 3703 - return ret; 3704 - } 3705 - val = (gnt_cfg->band[0].gnt_bt ? 3706 - B_AX_GNT_BT_RFC_S0_SW_VAL | B_AX_GNT_BT_BB_S0_SW_VAL : 0) | 3707 - (gnt_cfg->band[0].gnt_bt_sw_en ? 3708 - B_AX_GNT_BT_RFC_S0_SW_CTRL | B_AX_GNT_BT_BB_S0_SW_CTRL : 0) | 3709 - (gnt_cfg->band[0].gnt_wl ? 3710 - B_AX_GNT_WL_RFC_S0_SW_VAL | B_AX_GNT_WL_BB_S0_SW_VAL : 0) | 3711 - (gnt_cfg->band[0].gnt_wl_sw_en ? 3712 - B_AX_GNT_WL_RFC_S0_SW_CTRL | B_AX_GNT_WL_BB_S0_SW_CTRL : 0) | 3713 - (gnt_cfg->band[1].gnt_bt ? 3714 - B_AX_GNT_BT_RFC_S1_SW_VAL | B_AX_GNT_BT_BB_S1_SW_VAL : 0) | 3715 - (gnt_cfg->band[1].gnt_bt_sw_en ? 3716 - B_AX_GNT_BT_RFC_S1_SW_CTRL | B_AX_GNT_BT_BB_S1_SW_CTRL : 0) | 3717 - (gnt_cfg->band[1].gnt_wl ? 3718 - B_AX_GNT_WL_RFC_S1_SW_VAL | B_AX_GNT_WL_BB_S1_SW_VAL : 0) | 3719 - (gnt_cfg->band[1].gnt_wl_sw_en ? 3720 - B_AX_GNT_WL_RFC_S1_SW_CTRL | B_AX_GNT_WL_BB_S1_SW_CTRL : 0); 3562 + if (gnt_cfg->band[0].gnt_bt) 3563 + val |= B_AX_GNT_BT_RFC_S0_SW_VAL | B_AX_GNT_BT_BB_S0_SW_VAL; 3564 + 3565 + if (gnt_cfg->band[0].gnt_bt_sw_en) 3566 + val |= B_AX_GNT_BT_RFC_S0_SW_CTRL | B_AX_GNT_BT_BB_S0_SW_CTRL; 3567 + 3568 + if (gnt_cfg->band[0].gnt_wl) 3569 + val |= B_AX_GNT_WL_RFC_S0_SW_VAL | B_AX_GNT_WL_BB_S0_SW_VAL; 3570 + 3571 + if (gnt_cfg->band[0].gnt_wl_sw_en) 3572 + val |= B_AX_GNT_WL_RFC_S0_SW_CTRL | B_AX_GNT_WL_BB_S0_SW_CTRL; 3573 + 3574 + if (gnt_cfg->band[1].gnt_bt) 3575 + val |= B_AX_GNT_BT_RFC_S1_SW_VAL | B_AX_GNT_BT_BB_S1_SW_VAL; 3576 + 3577 + if (gnt_cfg->band[1].gnt_bt_sw_en) 3578 + val |= B_AX_GNT_BT_RFC_S1_SW_CTRL | B_AX_GNT_BT_BB_S1_SW_CTRL; 3579 + 3580 + if (gnt_cfg->band[1].gnt_wl) 3581 + val |= B_AX_GNT_WL_RFC_S1_SW_VAL | B_AX_GNT_WL_BB_S1_SW_VAL; 3582 + 3583 + if (gnt_cfg->band[1].gnt_wl_sw_en) 3584 + val |= B_AX_GNT_WL_RFC_S1_SW_CTRL | B_AX_GNT_WL_BB_S1_SW_CTRL; 3585 + 3721 3586 ret = rtw89_mac_write_lte(rtwdev, R_AX_LTE_SW_CFG_1, val); 3722 3587 if (ret) { 3723 3588 rtw89_err(rtwdev, "Write LTE fail!\n"); ··· 3729 3588 3730 3589 return 0; 3731 3590 } 3591 + EXPORT_SYMBOL(rtw89_mac_cfg_gnt); 3592 + 3593 + int rtw89_mac_cfg_gnt_v1(struct rtw89_dev *rtwdev, 3594 + const struct rtw89_mac_ax_coex_gnt *gnt_cfg) 3595 + { 3596 + u32 val = 0; 3597 + 3598 + if (gnt_cfg->band[0].gnt_bt) 3599 + val |= B_AX_GNT_BT_RFC_S0_VAL | B_AX_GNT_BT_RX_VAL | 3600 + B_AX_GNT_BT_TX_VAL; 3601 + else 3602 + val |= B_AX_WL_ACT_VAL; 3603 + 3604 + if (gnt_cfg->band[0].gnt_bt_sw_en) 3605 + val |= B_AX_GNT_BT_RFC_S0_SWCTRL | B_AX_GNT_BT_RX_SWCTRL | 3606 + B_AX_GNT_BT_TX_SWCTRL | B_AX_WL_ACT_SWCTRL; 3607 + 3608 + if (gnt_cfg->band[0].gnt_wl) 3609 + val |= B_AX_GNT_WL_RFC_S0_VAL | B_AX_GNT_WL_RX_VAL | 3610 + B_AX_GNT_WL_TX_VAL | B_AX_GNT_WL_BB_VAL; 3611 + 3612 + if (gnt_cfg->band[0].gnt_wl_sw_en) 3613 + val |= B_AX_GNT_WL_RFC_S0_SWCTRL | B_AX_GNT_WL_RX_SWCTRL | 3614 + B_AX_GNT_WL_TX_SWCTRL | B_AX_GNT_WL_BB_SWCTRL; 3615 + 3616 + if (gnt_cfg->band[1].gnt_bt) 3617 + val |= B_AX_GNT_BT_RFC_S1_VAL | B_AX_GNT_BT_RX_VAL | 3618 + B_AX_GNT_BT_TX_VAL; 3619 + else 3620 + val |= B_AX_WL_ACT_VAL; 3621 + 3622 + if (gnt_cfg->band[1].gnt_bt_sw_en) 3623 + val |= B_AX_GNT_BT_RFC_S1_SWCTRL | B_AX_GNT_BT_RX_SWCTRL | 3624 + B_AX_GNT_BT_TX_SWCTRL | B_AX_WL_ACT_SWCTRL; 3625 + 3626 + if (gnt_cfg->band[1].gnt_wl) 3627 + val |= B_AX_GNT_WL_RFC_S1_VAL | B_AX_GNT_WL_RX_VAL | 3628 + B_AX_GNT_WL_TX_VAL | B_AX_GNT_WL_BB_VAL; 3629 + 3630 + if (gnt_cfg->band[1].gnt_wl_sw_en) 3631 + val |= B_AX_GNT_WL_RFC_S1_SWCTRL | B_AX_GNT_WL_RX_SWCTRL | 3632 + B_AX_GNT_WL_TX_SWCTRL | B_AX_GNT_WL_BB_SWCTRL; 3633 + 3634 + rtw89_write32(rtwdev, R_AX_GNT_SW_CTRL, val); 3635 + 3636 + return 0; 3637 + } 3638 + EXPORT_SYMBOL(rtw89_mac_cfg_gnt_v1); 3732 3639 3733 3640 int rtw89_mac_cfg_plt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_plt *plt) 3734 3641 { ··· 3836 3647 3837 3648 return 0; 3838 3649 } 3650 + EXPORT_SYMBOL(rtw89_mac_cfg_ctrl_path); 3651 + 3652 + int rtw89_mac_cfg_ctrl_path_v1(struct rtw89_dev *rtwdev, bool wl) 3653 + { 3654 + struct rtw89_btc *btc = &rtwdev->btc; 3655 + struct rtw89_btc_dm *dm = &btc->dm; 3656 + struct rtw89_mac_ax_gnt *g = dm->gnt.band; 3657 + int i; 3658 + 3659 + if (wl) 3660 + return 0; 3661 + 3662 + for (i = 0; i < RTW89_PHY_MAX; i++) { 3663 + g[i].gnt_bt_sw_en = 1; 3664 + g[i].gnt_bt = 1; 3665 + g[i].gnt_wl_sw_en = 1; 3666 + g[i].gnt_wl = 0; 3667 + } 3668 + 3669 + return rtw89_mac_cfg_gnt_v1(rtwdev, &dm->gnt); 3670 + } 3671 + EXPORT_SYMBOL(rtw89_mac_cfg_ctrl_path_v1); 3839 3672 3840 3673 bool rtw89_mac_get_ctrl_path(struct rtw89_dev *rtwdev) 3841 3674 {
+10 -2
drivers/net/wireless/realtek/rtw89/mac.h
··· 791 791 u32 len, u8 class, u8 func); 792 792 int rtw89_mac_setup_phycap(struct rtw89_dev *rtwdev); 793 793 int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, 794 - u16 *tx_en, enum rtw89_sch_tx_sel sel); 795 - int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u16 tx_en); 794 + u32 *tx_en, enum rtw89_sch_tx_sel sel); 795 + int rtw89_mac_stop_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx, 796 + u32 *tx_en, enum rtw89_sch_tx_sel sel); 797 + int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en); 798 + int rtw89_mac_resume_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en); 796 799 int rtw89_mac_cfg_ppdu_status(struct rtw89_dev *rtwdev, u8 mac_ids, bool enable); 797 800 void rtw89_mac_update_rts_threshold(struct rtw89_dev *rtwdev, u8 mac_idx); 798 801 void rtw89_mac_flush_txq(struct rtw89_dev *rtwdev, u32 queues, bool drop); 799 802 int rtw89_mac_coex_init(struct rtw89_dev *rtwdev, const struct rtw89_mac_ax_coex *coex); 800 803 int rtw89_mac_cfg_gnt(struct rtw89_dev *rtwdev, 801 804 const struct rtw89_mac_ax_coex_gnt *gnt_cfg); 805 + int rtw89_mac_cfg_gnt_v1(struct rtw89_dev *rtwdev, 806 + const struct rtw89_mac_ax_coex_gnt *gnt_cfg); 802 807 int rtw89_mac_cfg_plt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_plt *plt); 803 808 u16 rtw89_mac_get_plt_cnt(struct rtw89_dev *rtwdev, u8 band); 804 809 void rtw89_mac_cfg_sb(struct rtw89_dev *rtwdev, u32 val); 805 810 u32 rtw89_mac_get_sb(struct rtw89_dev *rtwdev); 806 811 bool rtw89_mac_get_ctrl_path(struct rtw89_dev *rtwdev); 807 812 int rtw89_mac_cfg_ctrl_path(struct rtw89_dev *rtwdev, bool wl); 813 + int rtw89_mac_cfg_ctrl_path_v1(struct rtw89_dev *rtwdev, bool wl); 808 814 bool rtw89_mac_get_txpwr_cr(struct rtw89_dev *rtwdev, 809 815 enum rtw89_phy_idx phy_idx, 810 816 u32 reg_base, u32 *cr); ··· 890 884 891 885 enum rtw89_mac_xtal_si_offset { 892 886 XTAL_SI_XTAL_SC_XI = 0x04, 887 + #define XTAL_SC_XI_MASK GENMASK(7, 0) 893 888 XTAL_SI_XTAL_SC_XO = 0x05, 889 + #define XTAL_SC_XO_MASK GENMASK(7, 0) 894 890 XTAL_SI_PWR_CUT = 0x10, 895 891 #define XTAL_SI_SMALL_PWR_CUT BIT(0) 896 892 #define XTAL_SI_BIG_PWR_CUT BIT(1)
+152 -12
drivers/net/wireless/realtek/rtw89/phy.c
··· 4 4 5 5 #include "debug.h" 6 6 #include "fw.h" 7 + #include "mac.h" 7 8 #include "phy.h" 8 9 #include "ps.h" 9 10 #include "reg.h" ··· 604 603 } 605 604 EXPORT_SYMBOL(rtw89_phy_get_txsc); 606 605 606 + static bool rtw89_phy_check_swsi_busy(struct rtw89_dev *rtwdev) 607 + { 608 + return !!rtw89_phy_read32_mask(rtwdev, R_SWSI_V1, B_SWSI_W_BUSY_V1) || 609 + !!rtw89_phy_read32_mask(rtwdev, R_SWSI_V1, B_SWSI_R_BUSY_V1); 610 + } 611 + 607 612 u32 rtw89_phy_read_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, 608 613 u32 addr, u32 mask) 609 614 { ··· 631 624 return val; 632 625 } 633 626 EXPORT_SYMBOL(rtw89_phy_read_rf); 627 + 628 + static u32 rtw89_phy_read_rf_a(struct rtw89_dev *rtwdev, 629 + enum rtw89_rf_path rf_path, u32 addr, u32 mask) 630 + { 631 + bool busy; 632 + bool done; 633 + u32 val; 634 + int ret; 635 + 636 + ret = read_poll_timeout_atomic(rtw89_phy_check_swsi_busy, busy, !busy, 637 + 1, 30, false, rtwdev); 638 + if (ret) { 639 + rtw89_err(rtwdev, "read rf busy swsi\n"); 640 + return INV_RF_DATA; 641 + } 642 + 643 + mask &= RFREG_MASK; 644 + 645 + val = FIELD_PREP(B_SWSI_READ_ADDR_PATH_V1, rf_path) | 646 + FIELD_PREP(B_SWSI_READ_ADDR_ADDR_V1, addr); 647 + rtw89_phy_write32_mask(rtwdev, R_SWSI_READ_ADDR_V1, B_SWSI_READ_ADDR_V1, val); 648 + udelay(2); 649 + 650 + ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, done, done, 1, 651 + 30, false, rtwdev, R_SWSI_V1, 652 + B_SWSI_R_DATA_DONE_V1); 653 + if (ret) { 654 + rtw89_err(rtwdev, "read swsi busy\n"); 655 + return INV_RF_DATA; 656 + } 657 + 658 + return rtw89_phy_read32_mask(rtwdev, R_SWSI_V1, mask); 659 + } 660 + 661 + u32 rtw89_phy_read_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, 662 + u32 addr, u32 mask) 663 + { 664 + bool ad_sel = FIELD_GET(RTW89_RF_ADDR_ADSEL_MASK, addr); 665 + 666 + if (rf_path >= rtwdev->chip->rf_path_num) { 667 + rtw89_err(rtwdev, "unsupported rf path (%d)\n", rf_path); 668 + return INV_RF_DATA; 669 + } 670 + 671 + if (ad_sel) 672 + return rtw89_phy_read_rf(rtwdev, rf_path, addr, mask); 673 + else 674 + return rtw89_phy_read_rf_a(rtwdev, rf_path, addr, mask); 675 + } 676 + EXPORT_SYMBOL(rtw89_phy_read_rf_v1); 634 677 635 678 bool rtw89_phy_write_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, 636 679 u32 addr, u32 mask, u32 data) ··· 706 649 return true; 707 650 } 708 651 EXPORT_SYMBOL(rtw89_phy_write_rf); 652 + 653 + static bool rtw89_phy_write_rf_a(struct rtw89_dev *rtwdev, 654 + enum rtw89_rf_path rf_path, u32 addr, u32 mask, 655 + u32 data) 656 + { 657 + u8 bit_shift; 658 + u32 val; 659 + bool busy, b_msk_en = false; 660 + int ret; 661 + 662 + ret = read_poll_timeout_atomic(rtw89_phy_check_swsi_busy, busy, !busy, 663 + 1, 30, false, rtwdev); 664 + if (ret) { 665 + rtw89_err(rtwdev, "write rf busy swsi\n"); 666 + return false; 667 + } 668 + 669 + data &= RFREG_MASK; 670 + mask &= RFREG_MASK; 671 + 672 + if (mask != RFREG_MASK) { 673 + b_msk_en = true; 674 + rtw89_phy_write32_mask(rtwdev, R_SWSI_BIT_MASK_V1, RFREG_MASK, 675 + mask); 676 + bit_shift = __ffs(mask); 677 + data = (data << bit_shift) & RFREG_MASK; 678 + } 679 + 680 + val = FIELD_PREP(B_SWSI_DATA_BIT_MASK_EN_V1, b_msk_en) | 681 + FIELD_PREP(B_SWSI_DATA_PATH_V1, rf_path) | 682 + FIELD_PREP(B_SWSI_DATA_ADDR_V1, addr) | 683 + FIELD_PREP(B_SWSI_DATA_VAL_V1, data); 684 + 685 + rtw89_phy_write32_mask(rtwdev, R_SWSI_DATA_V1, MASKDWORD, val); 686 + 687 + return true; 688 + } 689 + 690 + bool rtw89_phy_write_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, 691 + u32 addr, u32 mask, u32 data) 692 + { 693 + bool ad_sel = FIELD_GET(RTW89_RF_ADDR_ADSEL_MASK, addr); 694 + 695 + if (rf_path >= rtwdev->chip->rf_path_num) { 696 + rtw89_err(rtwdev, "unsupported rf path (%d)\n", rf_path); 697 + return false; 698 + } 699 + 700 + if (ad_sel) 701 + return rtw89_phy_write_rf(rtwdev, rf_path, addr, mask, data); 702 + else 703 + return rtw89_phy_write_rf_a(rtwdev, rf_path, addr, mask, data); 704 + } 705 + EXPORT_SYMBOL(rtw89_phy_write_rf_v1); 709 706 710 707 static void rtw89_phy_bb_reset(struct rtw89_dev *rtwdev, 711 708 enum rtw89_phy_idx phy_idx) ··· 861 750 (struct rtw89_fw_h2c_rf_reg_info *)extra_data); 862 751 } 863 752 } 753 + 754 + void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev, 755 + const struct rtw89_reg2_def *reg, 756 + enum rtw89_rf_path rf_path, 757 + void *extra_data) 758 + { 759 + rtw89_write_rf(rtwdev, rf_path, reg->addr, RFREG_MASK, reg->data); 760 + 761 + if (reg->addr < 0x100) 762 + return; 763 + 764 + rtw89_phy_cofig_rf_reg_store(rtwdev, reg, rf_path, 765 + (struct rtw89_fw_h2c_rf_reg_info *)extra_data); 766 + } 767 + EXPORT_SYMBOL(rtw89_phy_config_rf_reg_v1); 864 768 865 769 static int rtw89_phy_sel_headline(struct rtw89_dev *rtwdev, 866 770 const struct rtw89_phy_table *table, ··· 1048 922 1049 923 void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev) 1050 924 { 925 + void (*config)(struct rtw89_dev *rtwdev, const struct rtw89_reg2_def *reg, 926 + enum rtw89_rf_path rf_path, void *data); 1051 927 const struct rtw89_chip_info *chip = rtwdev->chip; 1052 928 const struct rtw89_phy_table *rf_table; 1053 929 struct rtw89_fw_h2c_rf_reg_info *rf_reg_info; ··· 1060 932 return; 1061 933 1062 934 for (path = RF_PATH_A; path < chip->rf_path_num; path++) { 1063 - rf_reg_info->rf_path = path; 1064 935 rf_table = chip->rf_table[path]; 1065 - rtw89_phy_init_reg(rtwdev, rf_table, rtw89_phy_config_rf_reg, 1066 - (void *)rf_reg_info); 936 + rf_reg_info->rf_path = rf_table->rf_path; 937 + config = rf_table->config ? rf_table->config : rtw89_phy_config_rf_reg; 938 + rtw89_phy_init_reg(rtwdev, rf_table, config, (void *)rf_reg_info); 1067 939 if (rtw89_phy_config_rf_reg_fw(rtwdev, rf_reg_info)) 1068 940 rtw89_warn(rtwdev, "rf path %d reg h2c config failed\n", 1069 - path); 941 + rf_reg_info->rf_path); 1070 942 } 1071 943 kfree(rf_reg_info); 1072 944 } ··· 1795 1667 u8 crystal_cap, bool force) 1796 1668 { 1797 1669 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; 1670 + const struct rtw89_chip_info *chip = rtwdev->chip; 1798 1671 u8 sc_xi_val, sc_xo_val; 1799 1672 1800 1673 if (!force && cfo->crystal_cap == crystal_cap) 1801 1674 return; 1802 1675 crystal_cap = clamp_t(u8, crystal_cap, 0, 127); 1803 - rtw89_phy_cfo_set_xcap_reg(rtwdev, true, crystal_cap); 1804 - rtw89_phy_cfo_set_xcap_reg(rtwdev, false, crystal_cap); 1805 - sc_xo_val = rtw89_phy_cfo_get_xcap_reg(rtwdev, true); 1806 - sc_xi_val = rtw89_phy_cfo_get_xcap_reg(rtwdev, false); 1676 + if (chip->chip_id == RTL8852A) { 1677 + rtw89_phy_cfo_set_xcap_reg(rtwdev, true, crystal_cap); 1678 + rtw89_phy_cfo_set_xcap_reg(rtwdev, false, crystal_cap); 1679 + sc_xo_val = rtw89_phy_cfo_get_xcap_reg(rtwdev, true); 1680 + sc_xi_val = rtw89_phy_cfo_get_xcap_reg(rtwdev, false); 1681 + } else { 1682 + rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XO, 1683 + crystal_cap, XTAL_SC_XO_MASK); 1684 + rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XI, 1685 + crystal_cap, XTAL_SC_XI_MASK); 1686 + rtw89_mac_read_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XO, &sc_xo_val); 1687 + rtw89_mac_read_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XI, &sc_xi_val); 1688 + } 1807 1689 cfo->crystal_cap = sc_xi_val; 1808 1690 cfo->x_cap_ofst = (s8)((int)cfo->crystal_cap - cfo->def_x_cap); 1809 1691 ··· 1843 1705 1844 1706 static void rtw89_dcfo_comp(struct rtw89_dev *rtwdev, s32 curr_cfo) 1845 1707 { 1708 + const struct rtw89_reg_def *dcfo_comp = rtwdev->chip->dcfo_comp; 1846 1709 bool is_linked = rtwdev->total_sta_assoc > 0; 1847 1710 s32 cfo_avg_312; 1848 - s32 dcfo_comp; 1711 + s32 dcfo_comp_val; 1712 + u8 dcfo_comp_sft = rtwdev->chip->dcfo_comp_sft; 1849 1713 int sign; 1850 1714 1851 1715 if (!is_linked) { ··· 1858 1718 rtw89_debug(rtwdev, RTW89_DBG_CFO, "DCFO: curr_cfo=%d\n", curr_cfo); 1859 1719 if (curr_cfo == 0) 1860 1720 return; 1861 - dcfo_comp = rtw89_phy_read32_mask(rtwdev, R_DCFO, B_DCFO); 1721 + dcfo_comp_val = rtw89_phy_read32_mask(rtwdev, R_DCFO, B_DCFO); 1862 1722 sign = curr_cfo > 0 ? 1 : -1; 1863 - cfo_avg_312 = (curr_cfo << 3) / 5 + sign * dcfo_comp; 1723 + cfo_avg_312 = (curr_cfo << dcfo_comp_sft) / 5 + sign * dcfo_comp_val; 1864 1724 rtw89_debug(rtwdev, RTW89_DBG_CFO, "DCFO: avg_cfo=%d\n", cfo_avg_312); 1865 1725 if (rtwdev->chip->chip_id == RTL8852A && rtwdev->hal.cv == CHIP_CBV) 1866 1726 cfo_avg_312 = -cfo_avg_312; 1867 - rtw89_phy_set_phy_regs(rtwdev, R_DCFO_COMP_S0, B_DCFO_COMP_S0_MSK, 1727 + rtw89_phy_set_phy_regs(rtwdev, dcfo_comp->addr, dcfo_comp->mask, 1868 1728 cfo_avg_312); 1869 1729 } 1870 1730
+9
drivers/net/wireless/realtek/rtw89/phy.h
··· 8 8 #include "core.h" 9 9 10 10 #define RTW89_PHY_ADDR_OFFSET 0x10000 11 + #define RTW89_RF_ADDR_ADSEL_MASK BIT(16) 11 12 12 13 #define get_phy_headline(addr) FIELD_GET(GENMASK(31, 28), addr) 13 14 #define PHY_HEADLINE_VALID 0xf ··· 396 395 enum rtw89_bandwidth dbw); 397 396 u32 rtw89_phy_read_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, 398 397 u32 addr, u32 mask); 398 + u32 rtw89_phy_read_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, 399 + u32 addr, u32 mask); 399 400 bool rtw89_phy_write_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, 400 401 u32 addr, u32 mask, u32 data); 402 + bool rtw89_phy_write_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, 403 + u32 addr, u32 mask, u32 data); 401 404 void rtw89_phy_init_bb_reg(struct rtw89_dev *rtwdev); 402 405 void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev); 406 + void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev, 407 + const struct rtw89_reg2_def *reg, 408 + enum rtw89_rf_path rf_path, 409 + void *extra_data); 403 410 void rtw89_phy_dm_init(struct rtw89_dev *rtwdev); 404 411 void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask, 405 412 u32 data, enum rtw89_phy_idx phy_idx);
+77
drivers/net/wireless/realtek/rtw89/reg.h
··· 312 312 #define R_AX_BOOT_DBG 0x83F0 313 313 314 314 #define R_AX_DMAC_FUNC_EN 0x8400 315 + #define B_AX_DMAC_CRPRT BIT(31) 315 316 #define B_AX_MAC_FUNC_EN BIT(30) 316 317 #define B_AX_DMAC_FUNC_EN BIT(29) 317 318 #define B_AX_MPDU_PROC_EN BIT(28) ··· 340 339 #define B_AX_PKT_IN_CLK_EN BIT(20) 341 340 #define B_AX_DLE_CPUIO_CLK_EN BIT(19) 342 341 #define B_AX_DISPATCHER_CLK_EN BIT(18) 342 + #define B_AX_BBRPT_CLK_EN BIT(17) 343 343 #define B_AX_MAC_SEC_CLK_EN BIT(16) 344 344 345 345 #define PCI_LTR_IDLE_TIMER_1US 0 ··· 742 740 #define R_AX_DBG_FUN_INTF_DATA 0x9F34 743 741 #define B_AX_DFI_DATA_MASK GENMASK(31, 0) 744 742 743 + #define R_AX_TXPKTCTL_B0_PRELD_CFG0 0x9F48 744 + #define B_AX_B0_PRELD_FEN BIT(31) 745 + #define B_AX_B0_PRELD_USEMAXSZ_MASK GENMASK(25, 16) 746 + #define PRELD_B0_ENT_NUM 10 747 + #define PRELD_AMSDU_SIZE 52 748 + #define B_AX_B0_PRELD_CAM_G1ENTNUM_MASK GENMASK(12, 8) 749 + #define B_AX_B0_PRELD_CAM_G0ENTNUM_MASK GENMASK(4, 0) 750 + 751 + #define R_AX_TXPKTCTL_B0_PRELD_CFG1 0x9F4C 752 + #define B_AX_B0_PRELD_NXT_TXENDWIN_MASK GENMASK(11, 8) 753 + #define PRELD_NEXT_WND 1 754 + #define B_AX_B0_PRELD_NXT_RSVMINSZ_MASK GENMASK(7, 0) 755 + 756 + #define R_AX_TXPKTCTL_B1_PRELD_CFG0 0x9F88 757 + #define B_AX_B1_PRELD_FEN BIT(31) 758 + #define B_AX_B1_PRELD_USEMAXSZ_MASK GENMASK(25, 16) 759 + #define PRELD_B1_ENT_NUM 4 760 + #define B_AX_B1_PRELD_CAM_G1ENTNUM_MASK GENMASK(12, 8) 761 + #define B_AX_B1_PRELD_CAM_G0ENTNUM_MASK GENMASK(4, 0) 762 + 763 + #define R_AX_TXPKTCTL_B1_PRELD_CFG1 0x9F8C 764 + #define B_AX_B1_PRELD_NXT_TXENDWIN_MASK GENMASK(11, 8) 765 + #define B_AX_B1_PRELD_NXT_RSVMINSZ_MASK GENMASK(7, 0) 766 + 745 767 #define R_AX_AFE_CTRL1 0x0024 746 768 747 769 #define B_AX_R_SYM_WLCMAC1_P4_PC_EN BIT(4) ··· 893 867 #define B_AX_CTN_TXEN_VI_0 BIT(2) 894 868 #define B_AX_CTN_TXEN_BK_0 BIT(1) 895 869 #define B_AX_CTN_TXEN_BE_0 BIT(0) 870 + #define B_AX_CTN_TXEN_ALL_MASK GENMASK(15, 0) 896 871 897 872 #define R_AX_MUEDCA_BE_PARAM_0 0xC350 898 873 #define R_AX_MUEDCA_BE_PARAM_0_C1 0xE350 ··· 939 912 #define B_AX_CTN_CHK_CCA_S40 BIT(2) 940 913 #define B_AX_CTN_CHK_CCA_S20 BIT(1) 941 914 #define B_AX_CTN_CHK_CCA_P20 BIT(0) 915 + 916 + #define R_AX_CTN_DRV_TXEN 0xC398 917 + #define R_AX_CTN_DRV_TXEN_C1 0xE398 918 + #define B_AX_CTN_TXEN_TWT_3 BIT(17) 919 + #define B_AX_CTN_TXEN_TWT_2 BIT(16) 920 + #define B_AX_CTN_TXEN_ALL_MASK_V1 GENMASK(17, 0) 942 921 943 922 #define R_AX_SCHEDULE_ERR_IMR 0xC3E8 944 923 #define R_AX_SCHEDULE_ERR_IMR_C1 0xE3E8 ··· 1558 1525 #define B_AX_PWR_UL_TB_CTRL_EN BIT(31) 1559 1526 #define R_AX_PWR_UL_TB_1T 0xD28C 1560 1527 #define B_AX_PWR_UL_TB_1T_MASK GENMASK(4, 0) 1528 + #define B_AX_PWR_UL_TB_1T_V1_MASK GENMASK(7, 0) 1561 1529 #define R_AX_PWR_UL_TB_2T 0xD290 1562 1530 #define B_AX_PWR_UL_TB_2T_MASK GENMASK(4, 0) 1531 + #define B_AX_PWR_UL_TB_2T_V1_MASK GENMASK(7, 0) 1563 1532 #define R_AX_PWR_BY_RATE_TABLE0 0xD2C0 1564 1533 #define R_AX_PWR_BY_RATE_TABLE10 0xD2E8 1565 1534 #define R_AX_PWR_BY_RATE R_AX_PWR_BY_RATE_TABLE0 ··· 1626 1591 #define R_AX_BT_STAST_LOW 0xDA48 1627 1592 #define B_AX_STATIS_BT_LO_TX_1_MASK GENMASK(15, 0) 1628 1593 #define B_AX_STATIS_BT_LO_RX_1_MASK GENMASK(31, 16) 1594 + 1595 + #define R_AX_GNT_SW_CTRL 0xDA48 1596 + #define R_AX_GNT_SW_CTRL_C1 0xFA48 1597 + #define B_AX_WL_ACT2_VAL BIT(21) 1598 + #define B_AX_WL_ACT2_SWCTRL BIT(20) 1599 + #define B_AX_WL_ACT_VAL BIT(19) 1600 + #define B_AX_WL_ACT_SWCTRL BIT(18) 1601 + #define B_AX_GNT_BT_RX_VAL BIT(17) 1602 + #define B_AX_GNT_BT_RX_SWCTRL BIT(16) 1603 + #define B_AX_GNT_BT_TX_VAL BIT(15) 1604 + #define B_AX_GNT_BT_TX_SWCTRL BIT(14) 1605 + #define B_AX_GNT_WL_RX_VAL BIT(13) 1606 + #define B_AX_GNT_WL_RX_SWCTRL BIT(12) 1607 + #define B_AX_GNT_WL_TX_VAL BIT(11) 1608 + #define B_AX_GNT_WL_TX_SWCTRL BIT(10) 1609 + #define B_AX_GNT_BT_RFC_S1_VAL BIT(9) 1610 + #define B_AX_GNT_BT_RFC_S1_SWCTRL BIT(8) 1611 + #define B_AX_GNT_WL_RFC_S1_VAL BIT(7) 1612 + #define B_AX_GNT_WL_RFC_S1_SWCTRL BIT(6) 1613 + #define B_AX_GNT_BT_RFC_S0_VAL BIT(5) 1614 + #define B_AX_GNT_BT_RFC_S0_SWCTRL BIT(4) 1615 + #define B_AX_GNT_WL_RFC_S0_VAL BIT(3) 1616 + #define B_AX_GNT_WL_RFC_S0_SWCTRL BIT(2) 1617 + #define B_AX_GNT_WL_BB_VAL BIT(1) 1618 + #define B_AX_GNT_WL_BB_SWCTRL BIT(0) 1629 1619 1630 1620 #define R_AX_TDMA_MODE 0xDA4C 1631 1621 #define R_AX_TDMA_MODE_C1 0xFA4C ··· 1863 1803 #define B_ANAPAR_FLTRST BIT(22) 1864 1804 #define B_ANAPAR_CRXBB GENMASK(18, 16) 1865 1805 #define B_ANAPAR_14 GENMASK(15, 0) 1806 + #define R_SWSI_DATA_V1 0x0370 1807 + #define B_SWSI_DATA_VAL_V1 GENMASK(19, 0) 1808 + #define B_SWSI_DATA_ADDR_V1 GENMASK(27, 20) 1809 + #define B_SWSI_DATA_PATH_V1 GENMASK(30, 28) 1810 + #define B_SWSI_DATA_BIT_MASK_EN_V1 BIT(31) 1811 + #define R_SWSI_BIT_MASK_V1 0x0374 1812 + #define B_SWSI_BIT_MASK_V1 GENMASK(19, 0) 1813 + #define R_SWSI_READ_ADDR_V1 0x0378 1814 + #define B_SWSI_READ_ADDR_ADDR_V1 GENMASK(7, 0) 1815 + #define B_SWSI_READ_ADDR_PATH_V1 GENMASK(10, 8) 1816 + #define B_SWSI_READ_ADDR_V1 GENMASK(10, 0) 1866 1817 #define R_UPD_CLK_ADC 0x0700 1867 1818 #define B_UPD_CLK_ADC_ON BIT(24) 1868 1819 #define B_UPD_CLK_ADC_VAL GENMASK(26, 25) ··· 1981 1910 #define R_CFO_COMP_SEG0_H 0x1388 1982 1911 #define R_CFO_COMP_SEG0_CTRL 0x138C 1983 1912 #define R_DBG32_D 0x1730 1913 + #define R_SWSI_V1 0x174C 1914 + #define B_SWSI_W_BUSY_V1 BIT(24) 1915 + #define B_SWSI_R_BUSY_V1 BIT(25) 1916 + #define B_SWSI_R_DATA_DONE_V1 BIT(26) 1984 1917 #define R_TX_COUNTER 0x1A40 1985 1918 #define R_IFS_CLM_TX_CNT 0x1ACC 1986 1919 #define B_IFS_CLM_EDCCA_EXCLUDE_CCA_FA_MSK GENMASK(31, 16) ··· 2168 2093 #define R_CHBW_MOD 0x4978 2169 2094 #define B_CHBW_MOD_PRICH GENMASK(11, 8) 2170 2095 #define B_CHBW_MOD_SBW GENMASK(13, 12) 2096 + #define R_DCFO_COMP_S0_V1 0x4A40 2097 + #define B_DCFO_COMP_S0_V1_MSK GENMASK(13, 0) 2171 2098 #define R_BMODE_PDTH_V1 0x4B64 2172 2099 #define B_BMODE_PDTH_LOWER_BOUND_MSK_V1 GENMASK(31, 24) 2173 2100 #define R_BMODE_PDTH_EN_V1 0x4B74
+16 -6
drivers/net/wireless/realtek/rtw89/rtw8852a.c
··· 402 402 .wp_page_info1 = R_AX_WP_PAGE_INFO1, 403 403 }; 404 404 405 + static const struct rtw89_reg_def rtw8852a_dcfo_comp = { 406 + R_DCFO_COMP_S0, B_DCFO_COMP_S0_MSK 407 + }; 408 + 405 409 static void rtw8852ae_efuse_parsing(struct rtw89_efuse *efuse, 406 410 struct rtw8852a_efuse *map) 407 411 { ··· 1167 1163 u8 phy_idx = RTW89_PHY_0; 1168 1164 1169 1165 if (enter) { 1170 - rtw89_mac_stop_sch_tx(rtwdev, RTW89_MAC_0, &p->tx_en, RTW89_SCH_TX_SEL_ALL); 1166 + rtw89_chip_stop_sch_tx(rtwdev, RTW89_MAC_0, &p->tx_en, RTW89_SCH_TX_SEL_ALL); 1171 1167 rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false); 1172 1168 rtw8852a_dfs_en(rtwdev, false); 1173 1169 rtw8852a_tssi_cont_en_phyidx(rtwdev, false, RTW89_PHY_0); ··· 1180 1176 rtw8852a_dfs_en(rtwdev, true); 1181 1177 rtw8852a_tssi_cont_en_phyidx(rtwdev, true, RTW89_PHY_0); 1182 1178 rtw8852a_bb_reset_en(rtwdev, phy_idx, true); 1183 - rtw89_mac_resume_sch_tx(rtwdev, RTW89_MAC_0, p->tx_en); 1179 + rtw89_chip_resume_sch_tx(rtwdev, RTW89_MAC_0, p->tx_en); 1184 1180 } 1185 1181 } 1186 1182 ··· 1275 1271 1276 1272 static 1277 1273 void rtw8852a_set_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev, 1278 - s16 pw_ofst, enum rtw89_mac_idx mac_idx) 1274 + s8 pw_ofst, enum rtw89_mac_idx mac_idx) 1279 1275 { 1280 - s32 val_1t = 0; 1281 - s32 val_2t = 0; 1276 + s8 val_1t = 0; 1277 + s8 val_2t = 0; 1282 1278 u32 reg; 1283 1279 1284 1280 if (pw_ofst < -16 || pw_ofst > 15) { ··· 1288 1284 } 1289 1285 reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_CTRL, mac_idx); 1290 1286 rtw89_write32_set(rtwdev, reg, B_AX_PWR_UL_TB_CTRL_EN); 1291 - val_1t = (s32)pw_ofst; 1287 + val_1t = pw_ofst; 1292 1288 reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_1T, mac_idx); 1293 1289 rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_1T_MASK, val_1t); 1294 1290 val_2t = max(val_1t - 3, -16); ··· 2019 2015 .set_txpwr_ul_tb_offset = rtw8852a_set_txpwr_ul_tb_offset, 2020 2016 .pwr_on_func = NULL, 2021 2017 .pwr_off_func = NULL, 2018 + .cfg_ctrl_path = rtw89_mac_cfg_ctrl_path, 2019 + .mac_cfg_gnt = rtw89_mac_cfg_gnt, 2020 + .stop_sch_tx = rtw89_mac_stop_sch_tx, 2021 + .resume_sch_tx = rtw89_mac_resume_sch_tx, 2022 2022 2023 2023 .btc_set_rfe = rtw8852a_btc_set_rfe, 2024 2024 .btc_init_cfg = rtw8852a_btc_init_cfg, ··· 2099 2091 .c2h_ctrl_reg = R_AX_C2HREG_CTRL, 2100 2092 .c2h_regs = rtw8852a_c2h_regs, 2101 2093 .page_regs = &rtw8852a_page_regs, 2094 + .dcfo_comp = &rtw8852a_dcfo_comp, 2095 + .dcfo_comp_sft = 3, 2102 2096 }; 2103 2097 EXPORT_SYMBOL(rtw8852a_chip_info); 2104 2098
+12 -12
drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
··· 3526 3526 const struct rtw89_chip_info *mac_reg = rtwdev->chip; 3527 3527 u8 ch = rtwdev->hal.current_channel, ch_tmp; 3528 3528 u8 bw = rtwdev->hal.current_band_width; 3529 - u16 tx_en; 3529 + u32 tx_en; 3530 3530 u8 phy_map = rtw89_btc_phymap(rtwdev, phy, 0); 3531 3531 s8 power; 3532 3532 s16 xdbm; ··· 3554 3554 __func__, phy, power, xdbm); 3555 3555 3556 3556 rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START); 3557 - rtw89_mac_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL); 3557 + rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL); 3558 3558 _wait_rx_mode(rtwdev, _kpath(rtwdev, phy)); 3559 3559 tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); 3560 3560 ··· 3600 3600 3601 3601 rtw8852a_bb_tx_mode_switch(rtwdev, phy, 0); 3602 3602 3603 - rtw89_mac_resume_sch_tx(rtwdev, phy, tx_en); 3603 + rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en); 3604 3604 rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP); 3605 3605 } 3606 3606 ··· 3623 3623 3624 3624 void rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 3625 3625 { 3626 - u16 tx_en; 3626 + u32 tx_en; 3627 3627 u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 3628 3628 3629 3629 rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START); 3630 - rtw89_mac_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 3630 + rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 3631 3631 _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 3632 3632 3633 3633 _iqk_init(rtwdev); ··· 3636 3636 else 3637 3637 _iqk(rtwdev, phy_idx, false); 3638 3638 3639 - rtw89_mac_resume_sch_tx(rtwdev, phy_idx, tx_en); 3639 + rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 3640 3640 rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP); 3641 3641 } 3642 3642 ··· 3648 3648 void rtw8852a_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 3649 3649 bool is_afe) 3650 3650 { 3651 - u16 tx_en; 3651 + u32 tx_en; 3652 3652 u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 3653 3653 3654 3654 rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START); 3655 - rtw89_mac_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 3655 + rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 3656 3656 _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 3657 3657 3658 3658 _rx_dck(rtwdev, phy_idx, is_afe); 3659 3659 3660 - rtw89_mac_resume_sch_tx(rtwdev, phy_idx, tx_en); 3660 + rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 3661 3661 rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP); 3662 3662 } 3663 3663 3664 3664 void rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 3665 3665 { 3666 - u16 tx_en; 3666 + u32 tx_en; 3667 3667 u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 3668 3668 3669 3669 rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START); 3670 - rtw89_mac_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 3670 + rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 3671 3671 _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 3672 3672 3673 3673 rtwdev->dpk.is_dpk_enable = true; 3674 3674 rtwdev->dpk.is_dpk_reload_en = false; 3675 3675 _dpk(rtwdev, phy_idx, false); 3676 3676 3677 - rtw89_mac_resume_sch_tx(rtwdev, phy_idx, tx_en); 3677 + rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 3678 3678 rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP); 3679 3679 } 3680 3680
+50
drivers/net/wireless/realtek/rtw89/rtw8852c.c
··· 5 5 #include "debug.h" 6 6 #include "fw.h" 7 7 #include "mac.h" 8 + #include "phy.h" 8 9 #include "reg.h" 9 10 #include "rtw8852c.h" 10 11 ··· 43 42 .wp_page_ctrl1 = R_AX_WP_PAGE_CTRL1_V1, 44 43 .wp_page_ctrl2 = R_AX_WP_PAGE_CTRL2_V1, 45 44 .wp_page_info1 = R_AX_WP_PAGE_INFO1_V1, 45 + }; 46 + 47 + static const struct rtw89_reg_def rtw8852c_dcfo_comp = { 48 + R_DCFO_COMP_S0_V1, B_DCFO_COMP_S0_V1_MSK 46 49 }; 47 50 48 51 static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev) ··· 446 441 rtw8852c_pa_bias_trim(rtwdev); 447 442 } 448 443 444 + static 445 + void rtw8852c_set_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev, 446 + s8 pw_ofst, enum rtw89_mac_idx mac_idx) 447 + { 448 + s8 pw_ofst_2tx; 449 + s8 val_1t; 450 + s8 val_2t; 451 + u32 reg; 452 + u8 i; 453 + 454 + if (pw_ofst < -32 || pw_ofst > 31) { 455 + rtw89_warn(rtwdev, "[ULTB] Err pwr_offset=%d\n", pw_ofst); 456 + return; 457 + } 458 + val_1t = pw_ofst << 2; 459 + pw_ofst_2tx = max(pw_ofst - 3, -32); 460 + val_2t = pw_ofst_2tx << 2; 461 + 462 + rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[ULTB] val_1tx=0x%x\n", val_1t); 463 + rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[ULTB] val_2tx=0x%x\n", val_2t); 464 + 465 + for (i = 0; i < 4; i++) { 466 + /* 1TX */ 467 + reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_1T, mac_idx); 468 + rtw89_write32_mask(rtwdev, reg, 469 + B_AX_PWR_UL_TB_1T_V1_MASK << (8 * i), 470 + val_1t); 471 + /* 2TX */ 472 + reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_2T, mac_idx); 473 + rtw89_write32_mask(rtwdev, reg, 474 + B_AX_PWR_UL_TB_2T_V1_MASK << (8 * i), 475 + val_2t); 476 + } 477 + } 478 + 449 479 static const struct rtw89_chip_ops rtw8852c_chip_ops = { 450 480 .read_efuse = rtw8852c_read_efuse, 451 481 .read_phycap = rtw8852c_read_phycap, 452 482 .power_trim = rtw8852c_power_trim, 483 + .read_rf = rtw89_phy_read_rf_v1, 484 + .write_rf = rtw89_phy_write_rf_v1, 485 + .set_txpwr_ul_tb_offset = rtw8852c_set_txpwr_ul_tb_offset, 453 486 .pwr_on_func = rtw8852c_pwr_on_func, 454 487 .pwr_off_func = rtw8852c_pwr_off_func, 488 + .cfg_ctrl_path = rtw89_mac_cfg_ctrl_path_v1, 489 + .mac_cfg_gnt = rtw89_mac_cfg_gnt_v1, 490 + .stop_sch_tx = rtw89_mac_stop_sch_tx_v1, 491 + .resume_sch_tx = rtw89_mac_resume_sch_tx_v1, 455 492 }; 456 493 457 494 const struct rtw89_chip_info rtw8852c_chip_info = { ··· 501 454 .ops = &rtw8852c_chip_ops, 502 455 .fw_name = "rtw89/rtw8852c_fw.bin", 503 456 .dle_mem = rtw8852c_dle_mem_pcie, 457 + .rf_base_addr = {0xe000, 0xf000}, 504 458 .pwr_on_seq = NULL, 505 459 .pwr_off_seq = NULL, 506 460 .sec_ctrl_efuse_size = 4, ··· 518 470 .c2h_ctrl_reg = R_AX_C2HREG_CTRL_V1, 519 471 .c2h_regs = rtw8852c_c2h_regs, 520 472 .page_regs = &rtw8852c_page_regs, 473 + .dcfo_comp = &rtw8852c_dcfo_comp, 474 + .dcfo_comp_sft = 5, 521 475 }; 522 476 EXPORT_SYMBOL(rtw8852c_chip_info); 523 477
+1 -2
drivers/net/wireless/zydas/zd1201.c
··· 521 521 zd->rxdatas = 0; 522 522 zd->rxlen = 0; 523 523 for (seq=0; len > 0; seq++) { 524 - request = kmalloc(16, gfp_mask); 524 + request = kzalloc(16, gfp_mask); 525 525 if (!request) 526 526 return -ENOMEM; 527 527 urb = usb_alloc_urb(0, gfp_mask); ··· 529 529 kfree(request); 530 530 return -ENOMEM; 531 531 } 532 - memset(request, 0, 16); 533 532 reqlen = len>12 ? 12 : len; 534 533 request[0] = ZD1201_USB_RESREQ; 535 534 request[1] = seq;
+2
include/net/mac80211.h
··· 4948 4948 * @cntdwn_counter_offs: array of IEEE80211_MAX_CNTDWN_COUNTERS_NUM offsets 4949 4949 * to countdown counters. This array can contain zero values which 4950 4950 * should be ignored. 4951 + * @mbssid_off: position of the multiple bssid element 4951 4952 */ 4952 4953 struct ieee80211_mutable_offsets { 4953 4954 u16 tim_offset; 4954 4955 u16 tim_length; 4955 4956 4956 4957 u16 cntdwn_counter_offs[IEEE80211_MAX_CNTDWN_COUNTERS_NUM]; 4958 + u16 mbssid_off; 4957 4959 }; 4958 4960 4959 4961 /**
+12 -2
include/uapi/linux/rfkill.h
··· 159 159 * old behaviour for all userspace, unless it explicitly opts in to the 160 160 * rules outlined here by using the new &struct rfkill_event_ext. 161 161 * 162 - * Userspace using &struct rfkill_event_ext must adhere to the following 163 - * rules 162 + * Additionally, some other userspace (bluez, g-s-d) was reading with a 163 + * large size but as streaming reads rather than message-based, or with 164 + * too strict checks for the returned size. So eventually, we completely 165 + * reverted this, and extended messages need to be opted in to by using 166 + * an ioctl: 167 + * 168 + * ioctl(fd, RFKILL_IOCTL_MAX_SIZE, sizeof(struct rfkill_event_ext)); 169 + * 170 + * Userspace using &struct rfkill_event_ext and the ioctl must adhere to 171 + * the following rules: 164 172 * 165 173 * 1. accept short writes, optionally using them to detect that it's 166 174 * running on an older kernel; ··· 183 175 #define RFKILL_IOC_MAGIC 'R' 184 176 #define RFKILL_IOC_NOINPUT 1 185 177 #define RFKILL_IOCTL_NOINPUT _IO(RFKILL_IOC_MAGIC, RFKILL_IOC_NOINPUT) 178 + #define RFKILL_IOC_MAX_SIZE 2 179 + #define RFKILL_IOCTL_MAX_SIZE _IOW(RFKILL_IOC_MAGIC, RFKILL_IOC_EXT_SIZE, __u32) 186 180 187 181 /* and that's all userspace gets */ 188 182
+114 -14
net/mac80211/cfg.c
··· 989 989 return 0; 990 990 } 991 991 992 + static int 993 + ieee80211_copy_mbssid_beacon(u8 *pos, struct cfg80211_mbssid_elems *dst, 994 + struct cfg80211_mbssid_elems *src) 995 + { 996 + int i, offset = 0; 997 + 998 + for (i = 0; i < src->cnt; i++) { 999 + memcpy(pos + offset, src->elem[i].data, src->elem[i].len); 1000 + dst->elem[i].len = src->elem[i].len; 1001 + dst->elem[i].data = pos + offset; 1002 + offset += dst->elem[i].len; 1003 + } 1004 + dst->cnt = src->cnt; 1005 + 1006 + return offset; 1007 + } 1008 + 992 1009 static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata, 993 1010 struct cfg80211_beacon_data *params, 994 1011 const struct ieee80211_csa_settings *csa, 995 1012 const struct ieee80211_color_change_settings *cca) 996 1013 { 1014 + struct cfg80211_mbssid_elems *mbssid = NULL; 997 1015 struct beacon_data *new, *old; 998 1016 int new_head_len, new_tail_len; 999 1017 int size, err; ··· 1039 1021 1040 1022 size = sizeof(*new) + new_head_len + new_tail_len; 1041 1023 1024 + /* new or old multiple BSSID elements? */ 1025 + if (params->mbssid_ies) { 1026 + mbssid = params->mbssid_ies; 1027 + size += struct_size(new->mbssid_ies, elem, mbssid->cnt); 1028 + size += ieee80211_get_mbssid_beacon_len(mbssid); 1029 + } else if (old && old->mbssid_ies) { 1030 + mbssid = old->mbssid_ies; 1031 + size += struct_size(new->mbssid_ies, elem, mbssid->cnt); 1032 + size += ieee80211_get_mbssid_beacon_len(mbssid); 1033 + } 1034 + 1042 1035 new = kzalloc(size, GFP_KERNEL); 1043 1036 if (!new) 1044 1037 return -ENOMEM; ··· 1058 1029 1059 1030 /* 1060 1031 * pointers go into the block we allocated, 1061 - * memory is | beacon_data | head | tail | 1032 + * memory is | beacon_data | head | tail | mbssid_ies 1062 1033 */ 1063 1034 new->head = ((u8 *) new) + sizeof(*new); 1064 1035 new->tail = new->head + new_head_len; 1065 1036 new->head_len = new_head_len; 1066 1037 new->tail_len = new_tail_len; 1038 + /* copy in optional mbssid_ies */ 1039 + if (mbssid) { 1040 + u8 *pos = new->tail + new->tail_len; 1041 + 1042 + new->mbssid_ies = (void *)pos; 1043 + pos += struct_size(new->mbssid_ies, elem, mbssid->cnt); 1044 + ieee80211_copy_mbssid_beacon(pos, new->mbssid_ies, mbssid); 1045 + /* update bssid_indicator */ 1046 + sdata->vif.bss_conf.bssid_indicator = 1047 + ilog2(__roundup_pow_of_two(mbssid->cnt + 1)); 1048 + } 1067 1049 1068 1050 if (csa) { 1069 1051 new->cntdwn_current_counter = csa->count; ··· 1372 1332 1373 1333 mutex_unlock(&local->mtx); 1374 1334 1375 - kfree(sdata->u.ap.next_beacon); 1376 - sdata->u.ap.next_beacon = NULL; 1335 + if (sdata->u.ap.next_beacon) { 1336 + kfree(sdata->u.ap.next_beacon->mbssid_ies); 1337 + kfree(sdata->u.ap.next_beacon); 1338 + sdata->u.ap.next_beacon = NULL; 1339 + } 1377 1340 1378 1341 /* turn off carrier for this interface and dependent VLANs */ 1379 1342 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) ··· 3178 3135 3179 3136 len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len + 3180 3137 beacon->proberesp_ies_len + beacon->assocresp_ies_len + 3181 - beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len; 3138 + beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len + 3139 + ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies); 3182 3140 3183 3141 new_beacon = kzalloc(sizeof(*new_beacon) + len, GFP_KERNEL); 3184 3142 if (!new_beacon) 3185 3143 return NULL; 3144 + 3145 + if (beacon->mbssid_ies && beacon->mbssid_ies->cnt) { 3146 + new_beacon->mbssid_ies = 3147 + kzalloc(struct_size(new_beacon->mbssid_ies, 3148 + elem, beacon->mbssid_ies->cnt), 3149 + GFP_KERNEL); 3150 + if (!new_beacon->mbssid_ies) { 3151 + kfree(new_beacon); 3152 + return NULL; 3153 + } 3154 + } 3186 3155 3187 3156 pos = (u8 *)(new_beacon + 1); 3188 3157 if (beacon->head_len) { ··· 3233 3178 memcpy(pos, beacon->probe_resp, beacon->probe_resp_len); 3234 3179 pos += beacon->probe_resp_len; 3235 3180 } 3181 + if (beacon->mbssid_ies && beacon->mbssid_ies->cnt) 3182 + pos += ieee80211_copy_mbssid_beacon(pos, 3183 + new_beacon->mbssid_ies, 3184 + beacon->mbssid_ies); 3236 3185 3237 3186 /* might copy -1, meaning no changes requested */ 3238 3187 new_beacon->ftm_responder = beacon->ftm_responder; ··· 3259 3200 void ieee80211_csa_finish(struct ieee80211_vif *vif) 3260 3201 { 3261 3202 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 3203 + struct ieee80211_local *local = sdata->local; 3262 3204 3263 - ieee80211_queue_work(&sdata->local->hw, 3264 - &sdata->csa_finalize_work); 3205 + rcu_read_lock(); 3206 + 3207 + if (vif->mbssid_tx_vif == vif) { 3208 + /* Trigger ieee80211_csa_finish() on the non-transmitting 3209 + * interfaces when channel switch is received on 3210 + * transmitting interface 3211 + */ 3212 + struct ieee80211_sub_if_data *iter; 3213 + 3214 + list_for_each_entry_rcu(iter, &local->interfaces, list) { 3215 + if (!ieee80211_sdata_running(iter)) 3216 + continue; 3217 + 3218 + if (iter == sdata || iter->vif.mbssid_tx_vif != vif) 3219 + continue; 3220 + 3221 + ieee80211_queue_work(&iter->local->hw, 3222 + &iter->csa_finalize_work); 3223 + } 3224 + } 3225 + ieee80211_queue_work(&local->hw, &sdata->csa_finalize_work); 3226 + 3227 + rcu_read_unlock(); 3265 3228 } 3266 3229 EXPORT_SYMBOL(ieee80211_csa_finish); 3267 3230 ··· 3308 3227 case NL80211_IFTYPE_AP: 3309 3228 err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon, 3310 3229 NULL, NULL); 3311 - kfree(sdata->u.ap.next_beacon); 3312 - sdata->u.ap.next_beacon = NULL; 3230 + if (sdata->u.ap.next_beacon) { 3231 + kfree(sdata->u.ap.next_beacon->mbssid_ies); 3232 + kfree(sdata->u.ap.next_beacon); 3233 + sdata->u.ap.next_beacon = NULL; 3234 + } 3313 3235 3314 3236 if (err < 0) 3315 3237 return err; ··· 3467 3383 if ((params->n_counter_offsets_beacon > 3468 3384 IEEE80211_MAX_CNTDWN_COUNTERS_NUM) || 3469 3385 (params->n_counter_offsets_presp > 3470 - IEEE80211_MAX_CNTDWN_COUNTERS_NUM)) 3386 + IEEE80211_MAX_CNTDWN_COUNTERS_NUM)) { 3387 + kfree(sdata->u.ap.next_beacon->mbssid_ies); 3388 + kfree(sdata->u.ap.next_beacon); 3389 + sdata->u.ap.next_beacon = NULL; 3471 3390 return -EINVAL; 3391 + } 3472 3392 3473 3393 csa.counter_offsets_beacon = params->counter_offsets_beacon; 3474 3394 csa.counter_offsets_presp = params->counter_offsets_presp; ··· 3482 3394 3483 3395 err = ieee80211_assign_beacon(sdata, &params->beacon_csa, &csa, NULL); 3484 3396 if (err < 0) { 3397 + kfree(sdata->u.ap.next_beacon->mbssid_ies); 3485 3398 kfree(sdata->u.ap.next_beacon); 3399 + sdata->u.ap.next_beacon = NULL; 3486 3400 return err; 3487 3401 } 3488 3402 *changed |= err; ··· 3574 3484 static void ieee80211_color_change_abort(struct ieee80211_sub_if_data *sdata) 3575 3485 { 3576 3486 sdata->vif.color_change_active = false; 3577 - kfree(sdata->u.ap.next_beacon); 3578 - sdata->u.ap.next_beacon = NULL; 3487 + if (sdata->u.ap.next_beacon) { 3488 + kfree(sdata->u.ap.next_beacon->mbssid_ies); 3489 + kfree(sdata->u.ap.next_beacon); 3490 + sdata->u.ap.next_beacon = NULL; 3491 + } 3579 3492 3580 3493 cfg80211_color_change_aborted_notify(sdata->dev); 3581 3494 } ··· 4316 4223 4317 4224 ret = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon, 4318 4225 NULL, NULL); 4319 - kfree(sdata->u.ap.next_beacon); 4320 - sdata->u.ap.next_beacon = NULL; 4226 + if (sdata->u.ap.next_beacon) { 4227 + kfree(sdata->u.ap.next_beacon->mbssid_ies); 4228 + kfree(sdata->u.ap.next_beacon); 4229 + sdata->u.ap.next_beacon = NULL; 4230 + } 4321 4231 4322 4232 if (ret < 0) 4323 4233 return ret; ··· 4363 4267 err = ieee80211_assign_beacon(sdata, &params->beacon_color_change, 4364 4268 NULL, &color_change); 4365 4269 if (err < 0) { 4366 - kfree(sdata->u.ap.next_beacon); 4270 + if (sdata->u.ap.next_beacon) { 4271 + kfree(sdata->u.ap.next_beacon->mbssid_ies); 4272 + kfree(sdata->u.ap.next_beacon); 4273 + sdata->u.ap.next_beacon = NULL; 4274 + } 4367 4275 return err; 4368 4276 } 4369 4277 *changed |= err;
+15
net/mac80211/ieee80211_i.h
··· 257 257 struct ieee80211_meshconf_ie *meshconf; 258 258 u16 cntdwn_counter_offsets[IEEE80211_MAX_CNTDWN_COUNTERS_NUM]; 259 259 u8 cntdwn_current_counter; 260 + struct cfg80211_mbssid_elems *mbssid_ies; 260 261 struct rcu_head rcu_head; 261 262 }; 262 263 ··· 1082 1081 rcu_read_unlock(); 1083 1082 1084 1083 return shift; 1084 + } 1085 + 1086 + static inline int 1087 + ieee80211_get_mbssid_beacon_len(struct cfg80211_mbssid_elems *elems) 1088 + { 1089 + int i, len = 0; 1090 + 1091 + if (!elems) 1092 + return 0; 1093 + 1094 + for (i = 0; i < elems->cnt; i++) 1095 + len += elems->elem[i].len; 1096 + 1097 + return len; 1085 1098 } 1086 1099 1087 1100 enum {
+1 -1
net/mac80211/mlme.c
··· 4934 4934 4935 4935 sdata_unlock(sdata); 4936 4936 } 4937 + #endif 4937 4938 4938 4939 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) 4939 4940 { ··· 4970 4969 4971 4970 sdata_unlock(sdata); 4972 4971 } 4973 - #endif 4974 4972 4975 4973 /* interface setup */ 4976 4974 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)
+22 -2
net/mac80211/tx.c
··· 5042 5042 IEEE80211_TX_CTL_FIRST_FRAGMENT; 5043 5043 } 5044 5044 5045 + static void 5046 + ieee80211_beacon_add_mbssid(struct sk_buff *skb, struct beacon_data *beacon) 5047 + { 5048 + int i; 5049 + 5050 + if (!beacon->mbssid_ies) 5051 + return; 5052 + 5053 + for (i = 0; i < beacon->mbssid_ies->cnt; i++) 5054 + skb_put_data(skb, beacon->mbssid_ies->elem[i].data, 5055 + beacon->mbssid_ies->elem[i].len); 5056 + } 5057 + 5045 5058 static struct sk_buff * 5046 5059 ieee80211_beacon_get_ap(struct ieee80211_hw *hw, 5047 5060 struct ieee80211_vif *vif, ··· 5068 5055 struct ieee80211_if_ap *ap = &sdata->u.ap; 5069 5056 struct sk_buff *skb = NULL; 5070 5057 u16 csa_off_base = 0; 5058 + int mbssid_len; 5071 5059 5072 5060 if (beacon->cntdwn_counter_offsets[0]) { 5073 5061 if (!is_template) ··· 5078 5064 } 5079 5065 5080 5066 /* headroom, head length, 5081 - * tail length and maximum TIM length 5067 + * tail length, maximum TIM length and multiple BSSID length 5082 5068 */ 5069 + mbssid_len = ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies); 5083 5070 skb = dev_alloc_skb(local->tx_headroom + beacon->head_len + 5084 5071 beacon->tail_len + 256 + 5085 - local->hw.extra_beacon_tailroom); 5072 + local->hw.extra_beacon_tailroom + mbssid_len); 5086 5073 if (!skb) 5087 5074 return NULL; 5088 5075 ··· 5096 5081 offs->tim_offset = beacon->head_len; 5097 5082 offs->tim_length = skb->len - beacon->head_len; 5098 5083 offs->cntdwn_counter_offs[0] = beacon->cntdwn_counter_offsets[0]; 5084 + 5085 + if (mbssid_len) { 5086 + ieee80211_beacon_add_mbssid(skb, beacon); 5087 + offs->mbssid_off = skb->len - mbssid_len; 5088 + } 5099 5089 5100 5090 /* for AP the csa offsets are from tail */ 5101 5091 csa_off_base = skb->len;
+34 -14
net/rfkill/core.c
··· 78 78 struct mutex mtx; 79 79 wait_queue_head_t read_wait; 80 80 bool input_handler; 81 + u8 max_size; 81 82 }; 82 83 83 84 ··· 1154 1153 if (!data) 1155 1154 return -ENOMEM; 1156 1155 1156 + data->max_size = RFKILL_EVENT_SIZE_V1; 1157 + 1157 1158 INIT_LIST_HEAD(&data->events); 1158 1159 mutex_init(&data->mtx); 1159 1160 init_waitqueue_head(&data->read_wait); ··· 1238 1235 list); 1239 1236 1240 1237 sz = min_t(unsigned long, sizeof(ev->ev), count); 1238 + sz = min_t(unsigned long, sz, data->max_size); 1241 1239 ret = sz; 1242 1240 if (copy_to_user(buf, &ev->ev, sz)) 1243 1241 ret = -EFAULT; ··· 1253 1249 static ssize_t rfkill_fop_write(struct file *file, const char __user *buf, 1254 1250 size_t count, loff_t *pos) 1255 1251 { 1252 + struct rfkill_data *data = file->private_data; 1256 1253 struct rfkill *rfkill; 1257 1254 struct rfkill_event_ext ev; 1258 1255 int ret; ··· 1268 1263 * our API version even in a write() call, if it cares. 1269 1264 */ 1270 1265 count = min(count, sizeof(ev)); 1266 + count = min_t(size_t, count, data->max_size); 1271 1267 if (copy_from_user(&ev, buf, count)) 1272 1268 return -EFAULT; 1273 1269 ··· 1328 1322 return 0; 1329 1323 } 1330 1324 1331 - #ifdef CONFIG_RFKILL_INPUT 1332 1325 static long rfkill_fop_ioctl(struct file *file, unsigned int cmd, 1333 1326 unsigned long arg) 1334 1327 { 1335 1328 struct rfkill_data *data = file->private_data; 1329 + int ret = -ENOSYS; 1330 + u32 size; 1336 1331 1337 1332 if (_IOC_TYPE(cmd) != RFKILL_IOC_MAGIC) 1338 1333 return -ENOSYS; 1339 1334 1340 - if (_IOC_NR(cmd) != RFKILL_IOC_NOINPUT) 1341 - return -ENOSYS; 1342 - 1343 1335 mutex_lock(&data->mtx); 1344 - 1345 - if (!data->input_handler) { 1346 - if (atomic_inc_return(&rfkill_input_disabled) == 1) 1347 - printk(KERN_DEBUG "rfkill: input handler disabled\n"); 1348 - data->input_handler = true; 1336 + switch (_IOC_NR(cmd)) { 1337 + #ifdef CONFIG_RFKILL_INPUT 1338 + case RFKILL_IOC_NOINPUT: 1339 + if (!data->input_handler) { 1340 + if (atomic_inc_return(&rfkill_input_disabled) == 1) 1341 + printk(KERN_DEBUG "rfkill: input handler disabled\n"); 1342 + data->input_handler = true; 1343 + } 1344 + ret = 0; 1345 + break; 1346 + #endif 1347 + case RFKILL_IOC_MAX_SIZE: 1348 + if (get_user(size, (__u32 __user *)arg)) { 1349 + ret = -EFAULT; 1350 + break; 1351 + } 1352 + if (size < RFKILL_EVENT_SIZE_V1 || size > U8_MAX) { 1353 + ret = -EINVAL; 1354 + break; 1355 + } 1356 + data->max_size = size; 1357 + ret = 0; 1358 + break; 1359 + default: 1360 + break; 1349 1361 } 1350 - 1351 1362 mutex_unlock(&data->mtx); 1352 1363 1353 - return 0; 1364 + return ret; 1354 1365 } 1355 - #endif 1356 1366 1357 1367 static const struct file_operations rfkill_fops = { 1358 1368 .owner = THIS_MODULE, ··· 1377 1355 .write = rfkill_fop_write, 1378 1356 .poll = rfkill_fop_poll, 1379 1357 .release = rfkill_fop_release, 1380 - #ifdef CONFIG_RFKILL_INPUT 1381 1358 .unlocked_ioctl = rfkill_fop_ioctl, 1382 1359 .compat_ioctl = compat_ptr_ioctl, 1383 - #endif 1384 1360 .llseek = no_llseek, 1385 1361 }; 1386 1362