rtw88: 8822c: modify rf protection setting
authorChien-Hsun Liao <ben.liao@realtek.com>
Thu, 30 Jan 2020 05:31:12 +0000 (13:31 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 12 Feb 2020 16:20:40 +0000 (18:20 +0200)
According to some experiments, the original RF register protection
setting of 8822c cannot perfectly make sure that there is no hardware
PI write (direct) during direct write. Modify the setting so that the
hardware block of PI would be turned off via rtw8822c_rstb_3wire()
during the direct write, to avoid RF register racing.

Note that 8822b uses SIPI write (indirect), so 8822b does not
have such problem.

Signed-off-by: Chien-Hsun Liao <ben.liao@realtek.com>
Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Reviewed-by: Chris Chiu <chiu@endlessm.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtw88/phy.c
drivers/net/wireless/realtek/rtw88/rtw8822c.c
drivers/net/wireless/realtek/rtw88/rtw8822c.h

index eea9d88..8793dd2 100644 (file)
@@ -749,20 +749,10 @@ bool rtw_phy_write_rf_reg(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
        direct_addr = base_addr[rf_path] + (addr << 2);
        mask &= RFREG_MASK;
 
-       if (addr == RF_CFGCH) {
-               rtw_write32_mask(rtwdev, REG_RSV_CTRL, BITS_RFC_DIRECT, DISABLE_PI);
-               rtw_write32_mask(rtwdev, REG_WLRF1, BITS_RFC_DIRECT, DISABLE_PI);
-       }
-
        rtw_write32_mask(rtwdev, direct_addr, mask, data);
 
        udelay(1);
 
-       if (addr == RF_CFGCH) {
-               rtw_write32_mask(rtwdev, REG_RSV_CTRL, BITS_RFC_DIRECT, ENABLE_PI);
-               rtw_write32_mask(rtwdev, REG_WLRF1, BITS_RFC_DIRECT, ENABLE_PI);
-       }
-
        return true;
 }
 
index 56de9d0..a32d227 100644 (file)
@@ -1289,6 +1289,17 @@ static int rtw8822c_mac_init(struct rtw_dev *rtwdev)
        return 0;
 }
 
+static void rtw8822c_rstb_3wire(struct rtw_dev *rtwdev, bool enable)
+{
+       if (enable) {
+               rtw_write32_mask(rtwdev, REG_RSTB, BIT_RSTB_3WIRE, 0x1);
+               rtw_write32_mask(rtwdev, REG_ANAPAR_A, BIT_ANAPAR_UPDATE, 0x1);
+               rtw_write32_mask(rtwdev, REG_ANAPAR_B, BIT_ANAPAR_UPDATE, 0x1);
+       } else {
+               rtw_write32_mask(rtwdev, REG_RSTB, BIT_RSTB_3WIRE, 0x0);
+       }
+}
+
 static void rtw8822c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
 {
 #define RF18_BAND_MASK         (BIT(16) | BIT(9) | BIT(8))
@@ -1337,6 +1348,8 @@ static void rtw8822c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
                break;
        }
 
+       rtw8822c_rstb_3wire(rtwdev, false);
+
        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, 0x04, 0x01);
        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, 0x1f, 0x12);
        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, 0xfffff, rf_rxbb);
@@ -1349,6 +1362,8 @@ static void rtw8822c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
 
        rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_reg18);
        rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_reg18);
+
+       rtw8822c_rstb_3wire(rtwdev, true);
 }
 
 static void rtw8822c_toggle_igi(struct rtw_dev *rtwdev)
index abd9f30..dfd8662 100644 (file)
@@ -190,6 +190,8 @@ const struct rtw_table name ## _tbl = {                     \
 #define BIT_3WIRE_TX_EN                BIT(0)
 #define BIT_3WIRE_RX_EN                BIT(1)
 #define BIT_3WIRE_PI_ON                BIT(28)
+#define REG_ANAPAR_A   0x1830
+#define BIT_ANAPAR_UPDATE      BIT(29)
 #define REG_RXAGCCTL0  0x18ac
 #define BITS_RXAGC_CCK         GENMASK(15, 12)
 #define BITS_RXAGC_OFDM                GENMASK(8, 4)
@@ -223,6 +225,8 @@ const struct rtw_table name ## _tbl = {                     \
 #define BIT_CCK_BLK_EN         BIT(1)
 #define BIT_CCK_OFDM_BLK_EN    (BIT(0) | BIT(1))
 #define REG_CCAMSK     0x1c80
+#define REG_RSTB       0x1c90
+#define BIT_RSTB_3WIRE         BIT(8)
 #define REG_RX_BREAK   0x1d2c
 #define BIT_COM_RX_GCK_EN      BIT(31)
 #define REG_RXFNCTL    0x1d30
@@ -243,6 +247,7 @@ const struct rtw_table name ## _tbl = {                     \
 #define REG_OFDM_TXCNT 0x2de0
 #define REG_ORITXCODE2 0x4100
 #define REG_3WIRE2     0x410c
+#define REG_ANAPAR_B   0x4130
 #define REG_RXAGCCTL   0x41ac
 #define REG_DCKB_I_0   0x41bc
 #define REG_DCKB_I_1   0x41c0