rtw88: don't check CRC of VHT-SIG-B in 802.11ac signal
authorChin-Yen Lee <timlee@realtek.com>
Fri, 17 Dec 2021 01:24:21 +0000 (09:24 +0800)
committerKalle Valo <kvalo@kernel.org>
Mon, 20 Dec 2021 18:49:02 +0000 (20:49 +0200)
Currently all realtek wifi chip is set to check CRC of VHT-SIG-B
in 802.11ac signal, but some AP don't calculate the CRC and packets
from these AP can't be received and lead to disconnection.
We disable the check defaultly to avoid this case.

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/20211217012421.7859-1-pkshih@realtek.com
drivers/net/wireless/realtek/rtw88/bf.c
drivers/net/wireless/realtek/rtw88/bf.h
drivers/net/wireless/realtek/rtw88/rtw8821c.c
drivers/net/wireless/realtek/rtw88/rtw8822b.c
drivers/net/wireless/realtek/rtw88/rtw8822c.c

index aff70e4..df750b3 100644 (file)
@@ -130,7 +130,8 @@ void rtw_bf_cfg_sounding(struct rtw_dev *rtwdev, struct rtw_vif *vif,
                  BIT_WMAC_USE_NDPARATE |
                  (csi_rsc << 13);
 
-       rtw_write8(rtwdev, REG_SND_PTCL_CTRL, RTW_SND_CTRL_SOUNDING);
+       rtw_write8_mask(rtwdev, REG_SND_PTCL_CTRL, BIT_MASK_BEAMFORM,
+                       RTW_SND_CTRL_SOUNDING);
        rtw_write8(rtwdev, REG_SND_PTCL_CTRL + 3, 0x26);
        rtw_write8_clr(rtwdev, REG_RXFLTMAP1, BIT_RXFLTMAP1_BF_REPORT_POLL);
        rtw_write8_clr(rtwdev, REG_RXFLTMAP4, BIT_RXFLTMAP4_BF_REPORT_POLL);
@@ -177,7 +178,7 @@ void rtw_bf_del_bfer_entry_mu(struct rtw_dev *rtwdev)
 
 void rtw_bf_del_sounding(struct rtw_dev *rtwdev)
 {
-       rtw_write8(rtwdev, REG_SND_PTCL_CTRL, 0);
+       rtw_write8_mask(rtwdev, REG_SND_PTCL_CTRL, BIT_MASK_BEAMFORM, 0);
 }
 
 void rtw_bf_enable_bfee_su(struct rtw_dev *rtwdev, struct rtw_vif *vif,
@@ -204,7 +205,8 @@ void rtw_bf_enable_bfee_su(struct rtw_dev *rtwdev, struct rtw_vif *vif,
        }
 
        /* Sounding protocol control */
-       rtw_write8(rtwdev, REG_SND_PTCL_CTRL, RTW_SND_CTRL_SOUNDING);
+       rtw_write8_mask(rtwdev, REG_SND_PTCL_CTRL, BIT_MASK_BEAMFORM,
+                       RTW_SND_CTRL_SOUNDING);
 
        /* MAC address/Partial AID of Beamformer */
        for (i = 0; i < ETH_ALEN; i++)
@@ -273,7 +275,8 @@ void rtw_bf_remove_bfee_su(struct rtw_dev *rtwdev,
        struct rtw_bf_info *bfinfo = &rtwdev->bf_info;
 
        rtw_dbg(rtwdev, RTW_DBG_BF, "remove as a su bfee\n");
-       rtw_write8(rtwdev, REG_SND_PTCL_CTRL, RTW_SND_CTRL_REMOVE);
+       rtw_write8_mask(rtwdev, REG_SND_PTCL_CTRL, BIT_MASK_BEAMFORM,
+                       RTW_SND_CTRL_REMOVE);
 
        switch (bfee->su_reg_index) {
        case 0:
@@ -298,7 +301,8 @@ void rtw_bf_remove_bfee_mu(struct rtw_dev *rtwdev,
 {
        struct rtw_bf_info *bfinfo = &rtwdev->bf_info;
 
-       rtw_write8(rtwdev, REG_SND_PTCL_CTRL, RTW_SND_CTRL_REMOVE);
+       rtw_write8_mask(rtwdev, REG_SND_PTCL_CTRL, BIT_MASK_BEAMFORM,
+                       RTW_SND_CTRL_REMOVE);
 
        rtw_bf_del_bfer_entry_mu(rtwdev);
 
index 17855ed..7b40c2c 100644 (file)
@@ -13,6 +13,9 @@
 #define REG_ASSOCIATED_BFMER1_INFO     0x06EC
 #define REG_TX_CSI_RPT_PARAM_BW20      0x06F4
 #define REG_SND_PTCL_CTRL              0x0718
+#define BIT_DIS_CHK_VHTSIGB_CRC                BIT(6)
+#define BIT_DIS_CHK_VHTSIGA_CRC                BIT(5)
+#define BIT_MASK_BEAMFORM              (GENMASK(4, 0) | BIT(7))
 #define REG_MU_TX_CTL                  0x14C0
 #define REG_MU_STA_GID_VLD             0x14C4
 #define REG_MU_STA_USER_POS_INFO       0x14C8
@@ -42,8 +45,8 @@
 #define BIT_RXFLTMAP4_BF_REPORT_POLL   BIT(4)
 
 #define RTW_NDP_RX_STANDBY_TIME        0x70
-#define RTW_SND_CTRL_REMOVE    0xD8
-#define RTW_SND_CTRL_SOUNDING  0xDB
+#define RTW_SND_CTRL_REMOVE    0x98
+#define RTW_SND_CTRL_SOUNDING  0x9B
 
 enum csi_seg_len {
        HAL_CSI_SEG_4K = 0,
index 80a6f4d..db078df 100644 (file)
@@ -223,7 +223,8 @@ static int rtw8821c_mac_init(struct rtw_dev *rtwdev)
        rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1);
        rtw_write8(rtwdev, REG_ACKTO_CCK, 0x40);
        rtw_write8_set(rtwdev, REG_WMAC_TRXPTCL_CTL_H, BIT(1));
-       rtw_write8_set(rtwdev, REG_SND_PTCL_CTRL, BIT(6));
+       rtw_write8_set(rtwdev, REG_SND_PTCL_CTRL,
+                      BIT_DIS_CHK_VHTSIGB_CRC);
        rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2);
        rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, WLAN_MAC_OPT_NORM_FUNC1);
 
index c409c8c..a4cbcc6 100644 (file)
@@ -262,6 +262,8 @@ static int rtw8822b_mac_init(struct rtw_dev *rtwdev)
        rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1);
        rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2);
        rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, WLAN_MAC_OPT_NORM_FUNC1);
+       rtw_write8_set(rtwdev, REG_SND_PTCL_CTRL,
+                      BIT_DIS_CHK_VHTSIGB_CRC);
 
        return 0;
 }
index 46b881e..a8b95dc 100644 (file)
@@ -2102,6 +2102,8 @@ static int rtw8822c_mac_init(struct rtw_dev *rtwdev)
                     BIT_RXPSF_CONT_ERRCHKEN);
        value16 = BIT_SET_RXPSF_ERRTHR(value16, 0x07);
        rtw_write16(rtwdev, REG_RXPSF_CTRL, value16);
+       rtw_write8_set(rtwdev, REG_SND_PTCL_CTRL,
+                      BIT_DIS_CHK_VHTSIGB_CRC);
 
        /* Interrupt migration configuration */
        rtw_write32(rtwdev, REG_INT_MIG, WLAN_MAC_INT_MIG_CFG);