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

Configure Feed

Select the types of activity you want to include in your feed.

wifi: rtw89: add drop tx packet function

When entering WoWLAN mode, we need to drop all transmit packets,
including those in mac buffer, to avoid memory leakage, so implement
the drop_tx function.

Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Chin-Yen Lee <timlee@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20221027052707.14605-5-pkshih@realtek.com

authored by

Chih-Kang Chang and committed by
Kalle Valo
41d56769 7a68ec3d

+137
+3
drivers/net/wireless/realtek/rtw89/core.h
··· 2624 2624 u32 rsvd_ple_ofst; 2625 2625 const struct rtw89_hfc_param_ini *hfc_param_ini; 2626 2626 const struct rtw89_dle_mem *dle_mem; 2627 + u8 wde_qempty_acq_num; 2628 + u8 wde_qempty_mgq_sel; 2627 2629 u32 rf_base_addr[2]; 2628 2630 u8 support_chanctx_num; 2629 2631 u8 support_bands; ··· 2951 2949 u8 port; 2952 2950 u8 mbssid; 2953 2951 bool tf_trs; 2952 + u32 macid_band_sel[4]; 2954 2953 }; 2955 2954 2956 2955 struct rtw89_pkt_stat {
+9
drivers/net/wireless/realtek/rtw89/fw.c
··· 2900 2900 case RTW89_PKT_DROP_SEL_MACID_BK_ONCE: 2901 2901 case RTW89_PKT_DROP_SEL_MACID_VI_ONCE: 2902 2902 case RTW89_PKT_DROP_SEL_MACID_VO_ONCE: 2903 + case RTW89_PKT_DROP_SEL_BAND_ONCE: 2903 2904 break; 2904 2905 default: 2905 2906 rtw89_debug(rtwdev, RTW89_DBG_FW, ··· 2916 2915 RTW89_SET_FWCMD_PKT_DROP_PORT(skb->data, params->port); 2917 2916 RTW89_SET_FWCMD_PKT_DROP_MBSSID(skb->data, params->mbssid); 2918 2917 RTW89_SET_FWCMD_PKT_DROP_ROLE_A_INFO_TF_TRS(skb->data, params->tf_trs); 2918 + RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_0(skb->data, 2919 + params->macid_band_sel[0]); 2920 + RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_1(skb->data, 2921 + params->macid_band_sel[1]); 2922 + RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_2(skb->data, 2923 + params->macid_band_sel[2]); 2924 + RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_3(skb->data, 2925 + params->macid_band_sel[3]); 2919 2926 2920 2927 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, 2921 2928 H2C_CAT_MAC,
+20
drivers/net/wireless/realtek/rtw89/fw.h
··· 1873 1873 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(15, 8)); 1874 1874 } 1875 1875 1876 + static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_0(void *cmd, u32 val) 1877 + { 1878 + le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0)); 1879 + } 1880 + 1881 + static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_1(void *cmd, u32 val) 1882 + { 1883 + le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(31, 0)); 1884 + } 1885 + 1886 + static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_2(void *cmd, u32 val) 1887 + { 1888 + le32p_replace_bits((__le32 *)cmd + 4, val, GENMASK(31, 0)); 1889 + } 1890 + 1891 + static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_3(void *cmd, u32 val) 1892 + { 1893 + le32p_replace_bits((__le32 *)cmd + 5, val, GENMASK(31, 0)); 1894 + } 1895 + 1876 1896 enum rtw89_btc_btf_h2c_class { 1877 1897 BTFC_SET = 0x10, 1878 1898 BTFC_GET = 0x11,
+75
drivers/net/wireless/realtek/rtw89/mac.c
··· 1335 1335 return cfg; 1336 1336 } 1337 1337 1338 + static bool mac_is_txq_empty(struct rtw89_dev *rtwdev) 1339 + { 1340 + struct rtw89_mac_dle_dfi_qempty qempty; 1341 + u32 qnum, qtmp, val32, msk32; 1342 + int i, j, ret; 1343 + 1344 + qnum = rtwdev->chip->wde_qempty_acq_num; 1345 + qempty.dle_type = DLE_CTRL_TYPE_WDE; 1346 + 1347 + for (i = 0; i < qnum; i++) { 1348 + qempty.grpsel = i; 1349 + ret = dle_dfi_qempty(rtwdev, &qempty); 1350 + if (ret) { 1351 + rtw89_warn(rtwdev, "dle dfi acq empty %d\n", ret); 1352 + return false; 1353 + } 1354 + qtmp = qempty.qempty; 1355 + for (j = 0 ; j < QEMP_ACQ_GRP_MACID_NUM; j++) { 1356 + val32 = FIELD_GET(QEMP_ACQ_GRP_QSEL_MASK, qtmp); 1357 + if (val32 != QEMP_ACQ_GRP_QSEL_MASK) 1358 + return false; 1359 + qtmp >>= QEMP_ACQ_GRP_QSEL_SH; 1360 + } 1361 + } 1362 + 1363 + qempty.grpsel = rtwdev->chip->wde_qempty_mgq_sel; 1364 + ret = dle_dfi_qempty(rtwdev, &qempty); 1365 + if (ret) { 1366 + rtw89_warn(rtwdev, "dle dfi mgq empty %d\n", ret); 1367 + return false; 1368 + } 1369 + msk32 = B_CMAC0_MGQ_NORMAL | B_CMAC0_MGQ_NO_PWRSAV | B_CMAC0_CPUMGQ; 1370 + if ((qempty.qempty & msk32) != msk32) 1371 + return false; 1372 + 1373 + if (rtwdev->dbcc_en) { 1374 + msk32 |= B_CMAC1_MGQ_NORMAL | B_CMAC1_MGQ_NO_PWRSAV | B_CMAC1_CPUMGQ; 1375 + if ((qempty.qempty & msk32) != msk32) 1376 + return false; 1377 + } 1378 + 1379 + msk32 = B_AX_WDE_EMPTY_QTA_DMAC_WLAN_CPU | B_AX_WDE_EMPTY_QTA_DMAC_DATA_CPU | 1380 + B_AX_PLE_EMPTY_QTA_DMAC_WLAN_CPU | B_AX_PLE_EMPTY_QTA_DMAC_H2C | 1381 + B_AX_WDE_EMPTY_QUE_OTHERS | B_AX_PLE_EMPTY_QUE_DMAC_MPDU_TX | 1382 + B_AX_WDE_EMPTY_QTA_DMAC_CPUIO | B_AX_PLE_EMPTY_QTA_DMAC_CPUIO | 1383 + B_AX_WDE_EMPTY_QUE_DMAC_PKTIN | B_AX_WDE_EMPTY_QTA_DMAC_HIF | 1384 + B_AX_PLE_EMPTY_QUE_DMAC_SEC_TX | B_AX_WDE_EMPTY_QTA_DMAC_PKTIN | 1385 + B_AX_PLE_EMPTY_QTA_DMAC_B0_TXPL | B_AX_PLE_EMPTY_QTA_DMAC_B1_TXPL | 1386 + B_AX_PLE_EMPTY_QTA_DMAC_MPDU_TX; 1387 + val32 = rtw89_read32(rtwdev, R_AX_DLE_EMPTY0); 1388 + 1389 + return (val32 & msk32) == msk32; 1390 + } 1391 + 1338 1392 static inline u32 dle_used_size(const struct rtw89_dle_size *wde, 1339 1393 const struct rtw89_dle_size *ple) 1340 1394 { ··· 4946 4892 ieee80211_iterate_stations_atomic(rtwdev->hw, 4947 4893 rtw89_mac_pkt_drop_vif_iter, 4948 4894 rtwvif); 4895 + } 4896 + 4897 + int rtw89_mac_ptk_drop_by_band_and_wait(struct rtw89_dev *rtwdev, 4898 + enum rtw89_mac_idx band) 4899 + { 4900 + struct rtw89_pkt_drop_params params = {0}; 4901 + bool empty; 4902 + int i, ret = 0, try_cnt = 3; 4903 + 4904 + params.mac_band = band; 4905 + params.sel = RTW89_PKT_DROP_SEL_BAND_ONCE; 4906 + 4907 + for (i = 0; i < try_cnt; i++) { 4908 + ret = read_poll_timeout(mac_is_txq_empty, empty, empty, 50, 4909 + 50000, false, rtwdev); 4910 + if (ret) 4911 + rtw89_fw_h2c_pkt_drop(rtwdev, &params); 4912 + else 4913 + return 0; 4914 + } 4915 + return ret; 4949 4916 }
+13
drivers/net/wireless/realtek/rtw89/mac.h
··· 420 420 #define S_AX_PLE_PAGE_SEL_128 1 421 421 #define S_AX_PLE_PAGE_SEL_256 2 422 422 423 + #define B_CMAC0_MGQ_NORMAL BIT(2) 424 + #define B_CMAC0_MGQ_NO_PWRSAV BIT(3) 425 + #define B_CMAC0_CPUMGQ BIT(4) 426 + #define B_CMAC1_MGQ_NORMAL BIT(10) 427 + #define B_CMAC1_MGQ_NO_PWRSAV BIT(11) 428 + #define B_CMAC1_CPUMGQ BIT(12) 429 + 430 + #define QEMP_ACQ_GRP_MACID_NUM 8 431 + #define QEMP_ACQ_GRP_QSEL_SH 4 432 + #define QEMP_ACQ_GRP_QSEL_MASK 0xF 433 + 423 434 #define SDIO_LOCAL_BASE_ADDR 0x80000000 424 435 425 436 #define PWR_CMD_WRITE 0 ··· 1039 1028 int rtw89_mac_set_cpuio(struct rtw89_dev *rtwdev, 1040 1029 struct rtw89_cpuio_ctrl *ctrl_para, bool wd); 1041 1030 int rtw89_mac_resize_ple_rx_quota(struct rtw89_dev *rtwdev, bool wow); 1031 + int rtw89_mac_ptk_drop_by_band_and_wait(struct rtw89_dev *rtwdev, 1032 + enum rtw89_mac_idx band); 1042 1033 1043 1034 #endif
+13
drivers/net/wireless/realtek/rtw89/reg.h
··· 545 545 #define B_AX_WDE_EMPTY_QUE_CMAC0_MBH BIT(1) 546 546 #define B_AX_WDE_EMPTY_QUE_CMAC0_ALL_AC BIT(0) 547 547 548 + #define R_AX_DLE_EMPTY1 0x8434 549 + #define B_AX_PLE_EMPTY_QTA_DMAC_WDRLS BIT(20) 550 + #define B_AX_PLE_EMPTY_QTA_CMAC1_DMA_BBRPT BIT(19) 551 + #define B_AX_PLE_EMPTY_QTA_CMAC1_DMA_RX BIT(18) 552 + #define B_AX_PLE_EMPTY_QTA_CMAC0_DMA_RX BIT(17) 553 + #define B_AX_PLE_EMPTY_QTA_DMAC_C2H BIT(16) 554 + #define B_AX_PLE_EMPTY_QUE_DMAC_PLRLS BIT(5) 555 + #define B_AX_PLE_EMPTY_QUE_DMAC_CPUIO BIT(4) 556 + #define B_AX_PLE_EMPTY_QUE_DMAC_SEC_RX BIT(3) 557 + #define B_AX_PLE_EMPTY_QUE_DMAC_MPDU_RX BIT(2) 558 + #define B_AX_PLE_EMPTY_QUE_DMAC_HDP BIT(1) 559 + #define B_AX_WDE_EMPTY_QUE_DMAC_WDRLS BIT(0) 560 + 548 561 #define R_AX_DMAC_ERR_IMR 0x8520 549 562 #define B_AX_DLE_CPUIO_ERR_INT_EN BIT(10) 550 563 #define B_AX_APB_BRIDGE_ERR_INT_EN BIT(9)
+2
drivers/net/wireless/realtek/rtw89/rtw8852a.c
··· 2049 2049 .rsvd_ple_ofst = 0x6f800, 2050 2050 .hfc_param_ini = rtw8852a_hfc_param_ini_pcie, 2051 2051 .dle_mem = rtw8852a_dle_mem_pcie, 2052 + .wde_qempty_acq_num = 16, 2053 + .wde_qempty_mgq_sel = 16, 2052 2054 .rf_base_addr = {0xc000, 0xd000}, 2053 2055 .pwr_on_seq = pwr_on_seq_8852a, 2054 2056 .pwr_off_seq = pwr_off_seq_8852a,
+2
drivers/net/wireless/realtek/rtw89/rtw8852c.c
··· 2855 2855 .rsvd_ple_ofst = 0x6f800, 2856 2856 .hfc_param_ini = rtw8852c_hfc_param_ini_pcie, 2857 2857 .dle_mem = rtw8852c_dle_mem_pcie, 2858 + .wde_qempty_acq_num = 16, 2859 + .wde_qempty_mgq_sel = 16, 2858 2860 .rf_base_addr = {0xe000, 0xf000}, 2859 2861 .pwr_on_seq = NULL, 2860 2862 .pwr_off_seq = NULL,