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 aff70e4ae028819b617c51a6e483a19bce9847fa..df750b3a35e9d8b3b6380db6c173051c09740e8f 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 17855edb5006af91f97f54864077182da54c4a39..7b40c2c0385608ab5e65a868e927d27eadaea8ac 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 80a6f4da6acd999067eb9430cadbe41d31cc886e..db078df63f8555c8da10167013323ab0340b1540 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 c409c8c29ec8b8c23f5cb232acaf54d7a336f4f7..a4cbcc6bdcd14ba97d61a8fb5b620397043da6d9 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 46b881e8e4feb18d9d60c22aff183587a2f98ab7..a8b95dcdb8e905025a2c661ba03bd9502db459e2 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);