Search Linux Wireless

Re: [PATCH v2 2/2] rtw88: 8822c: modify rf protection setting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jan 30, 2020 at 1:31 PM <yhchuang@xxxxxxxxxxx> wrote:
>
> From: Chien-Hsun Liao <ben.liao@xxxxxxxxxxx>
>
> 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@xxxxxxxxxxx>
> Signed-off-by: Yan-Hsuan Chuang <yhchuang@xxxxxxxxxxx>
> ---
Reviewed-by: Chris Chiu <chiu@xxxxxxxxxxxx>
>
> v1 -> v2
>  * Add more descriptions
>
>  drivers/net/wireless/realtek/rtw88/phy.c      | 10 ----------
>  drivers/net/wireless/realtek/rtw88/rtw8822c.c | 15 +++++++++++++++
>  drivers/net/wireless/realtek/rtw88/rtw8822c.h |  5 +++++
>  3 files changed, 20 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
> index eea9d888fbf1..8793dd22188f 100644
> --- a/drivers/net/wireless/realtek/rtw88/phy.c
> +++ b/drivers/net/wireless/realtek/rtw88/phy.c
> @@ -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;
>  }
>
> diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
> index 4c416d603b33..fb621881fbd1 100644
> --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
> +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
> @@ -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)
> diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
> index abd9f300bedd..dfd8662a0c0e 100644
> --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h
> +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
> @@ -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
> --
> 2.17.1
>



[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux