rtw89: reset BA CAM
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 8 Apr 2022 00:13:46 +0000 (08:13 +0800)
committerKalle Valo <kvalo@kernel.org>
Tue, 12 Apr 2022 13:34:39 +0000 (16:34 +0300)
BA CAM is used to react receiving AMPDU packets, so reset them to be
expected initial state.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220408001353.17188-7-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/reg.h

index b60b925..ba8c7d3 100644 (file)
@@ -1964,6 +1964,21 @@ static int trxptcl_init(struct rtw89_dev *rtwdev, u8 mac_idx)
        return 0;
 }
 
+static void rst_bacam(struct rtw89_dev *rtwdev)
+{
+       u32 val32;
+       int ret;
+
+       rtw89_write32_mask(rtwdev, R_AX_RESPBA_CAM_CTRL, B_AX_BACAM_RST_MASK,
+                          S_AX_BACAM_RST_ALL);
+
+       ret = read_poll_timeout_atomic(rtw89_read32_mask, val32, val32 == 0,
+                                      1, 1000, false,
+                                      rtwdev, R_AX_RESPBA_CAM_CTRL, B_AX_BACAM_RST_MASK);
+       if (ret)
+               rtw89_warn(rtwdev, "failed to reset BA CAM\n");
+}
+
 static int rmac_init(struct rtw89_dev *rtwdev, u8 mac_idx)
 {
 #define TRXCFG_RMAC_CCA_TO     32
@@ -1978,6 +1993,9 @@ static int rmac_init(struct rtw89_dev *rtwdev, u8 mac_idx)
        if (ret)
                return ret;
 
+       if (mac_idx == RTW89_MAC_0)
+               rst_bacam(rtwdev);
+
        reg = rtw89_mac_reg_by_idx(R_AX_RESPBA_CAM_CTRL, mac_idx);
        rtw89_write8_set(rtwdev, reg, B_AX_SSN_SEL);
 
index e5f8374..bc343e7 100644 (file)
 #define R_AX_RESPBA_CAM_CTRL 0xCE3C
 #define R_AX_RESPBA_CAM_CTRL_C1 0xEE3C
 #define B_AX_SSN_SEL BIT(2)
+#define B_AX_BACAM_RST_MASK GENMASK(1, 0)
+#define S_AX_BACAM_RST_ALL 2
 
 #define R_AX_PPDU_STAT 0xCE40
 #define R_AX_PPDU_STAT_C1 0xEE40