The field mask should be bits 16-31, but suddenly use wrong bits 24-31, rarely causing a little performance degraded if DAC/DAC FIFO stays on an unexpected state. Found this by Geert who works on bit field functions. Cc: Geert Uytterhoeven Signed-off-by: Ping-Ke Shih --- drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c index e74257d19412..463399413318 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c @@ -756,8 +756,8 @@ static void _iqk_rxk_setting(struct rtw89_dev *rtwdev, u8 path) rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1); rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H2, 0x0); udelay(1); - rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0303); - rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0000); + rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0303); + rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0000); switch (iqk_info->iqk_band[path]) { case RTW89_BAND_2G: @@ -1239,8 +1239,8 @@ static void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path) udelay(1); rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041); udelay(1); - rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0303); - rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0000); + rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0303); + rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0000); switch (iqk_info->iqk_band[path]) { case RTW89_BAND_2G: rtw89_write_rf(rtwdev, path, RR_XALNA2, RR_XALNA2_SW, 0x00); -- 2.25.1 The power value and enable bit fields can be not consecutive mask, but normally we expect mask argument of rtw89_mac_txpwr_write32_mask() is consecutive bit mask. Therefore, change the code accordingly. Cc: Geert Uytterhoeven Signed-off-by: Ping-Ke Shih --- drivers/net/wireless/realtek/rtw89/mac.h | 20 ++++++++++++++ drivers/net/wireless/realtek/rtw89/rtw8851b.c | 26 +++++-------------- drivers/net/wireless/realtek/rtw89/rtw8852b.c | 26 +++++-------------- drivers/net/wireless/realtek/rtw89/rtw8852c.c | 26 +++++-------------- 4 files changed, 41 insertions(+), 57 deletions(-) diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h index 3cc97fd0c0ec..01a9fb7c9e31 100644 --- a/drivers/net/wireless/realtek/rtw89/mac.h +++ b/drivers/net/wireless/realtek/rtw89/mac.h @@ -1456,6 +1456,26 @@ static inline int rtw89_mac_txpwr_write32_mask(struct rtw89_dev *rtwdev, return 0; } +static inline +void rtw89_mac_write_txpwr_ctrl(struct rtw89_dev *rtwdev, u32 reg, u32 mask, u32 val, + u32 mask_en, bool cond) +{ + u32 wrt = u32_encode_bits(val, mask); + u32 val32; + int ret; + + if (cond) + wrt |= mask_en; + + ret = rtw89_mac_txpwr_read32(rtwdev, RTW89_PHY_0, reg, &val32); + if (ret) + return; + + val32 &= ~(mask | mask_en); + val32 |= wrt; + rtw89_mac_txpwr_write32(rtwdev, RTW89_PHY_0, reg, val32); +} + static inline void rtw89_mac_ctrl_hci_dma_tx(struct rtw89_dev *rtwdev, bool enable) { diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c index 2019f6022cbb..1253c4af2fb2 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c @@ -2291,18 +2291,6 @@ rtw8851b_btc_set_wl_txpwr_ctrl(struct rtw89_dev *rtwdev, u32 txpwr_val) union rtw8851b_btc_wl_txpwr_ctrl arg = { .txpwr_val = txpwr_val }; s32 val; -#define __write_ctrl(_reg, _msk, _val, _en, _cond) \ -do { \ - u32 _wrt = FIELD_PREP(_msk, _val); \ - BUILD_BUG_ON(!!(_msk & _en)); \ - if (_cond) \ - _wrt |= _en; \ - else \ - _wrt &= ~_en; \ - rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, _reg, \ - _msk | _en, _wrt); \ -} while (0) - switch (arg.ctrl_all_time) { case 0xffff: val = 0; @@ -2312,9 +2300,10 @@ do { \ break; } - __write_ctrl(R_AX_PWR_RATE_CTRL, B_AX_FORCE_PWR_BY_RATE_VALUE_MASK, - val, B_AX_FORCE_PWR_BY_RATE_EN, - arg.ctrl_all_time != 0xffff); + rtw89_mac_write_txpwr_ctrl(rtwdev, R_AX_PWR_RATE_CTRL, + B_AX_FORCE_PWR_BY_RATE_VALUE_MASK, + val, B_AX_FORCE_PWR_BY_RATE_EN, + arg.ctrl_all_time != 0xffff); switch (arg.ctrl_gnt_bt) { case 0xffff: @@ -2325,10 +2314,9 @@ do { \ break; } - __write_ctrl(R_AX_PWR_COEXT_CTRL, B_AX_TXAGC_BT_MASK, val, - B_AX_TXAGC_BT_EN, arg.ctrl_gnt_bt != 0xffff); - -#undef __write_ctrl + rtw89_mac_write_txpwr_ctrl(rtwdev, R_AX_PWR_COEXT_CTRL, + B_AX_TXAGC_BT_MASK, val, + B_AX_TXAGC_BT_EN, arg.ctrl_gnt_bt != 0xffff); } static diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b.c b/drivers/net/wireless/realtek/rtw89/rtw8852b.c index 38cd151f8c3f..de02d52150c1 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852b.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852b.c @@ -761,18 +761,6 @@ rtw8852b_btc_set_wl_txpwr_ctrl(struct rtw89_dev *rtwdev, u32 txpwr_val) union rtw8852b_btc_wl_txpwr_ctrl arg = { .txpwr_val = txpwr_val }; s32 val; -#define __write_ctrl(_reg, _msk, _val, _en, _cond) \ -do { \ - u32 _wrt = FIELD_PREP(_msk, _val); \ - BUILD_BUG_ON(!!(_msk & _en)); \ - if (_cond) \ - _wrt |= _en; \ - else \ - _wrt &= ~_en; \ - rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, _reg, \ - _msk | _en, _wrt); \ -} while (0) - switch (arg.ctrl_all_time) { case 0xffff: val = 0; @@ -782,9 +770,10 @@ do { \ break; } - __write_ctrl(R_AX_PWR_RATE_CTRL, B_AX_FORCE_PWR_BY_RATE_VALUE_MASK, - val, B_AX_FORCE_PWR_BY_RATE_EN, - arg.ctrl_all_time != 0xffff); + rtw89_mac_write_txpwr_ctrl(rtwdev, R_AX_PWR_RATE_CTRL, + B_AX_FORCE_PWR_BY_RATE_VALUE_MASK, + val, B_AX_FORCE_PWR_BY_RATE_EN, + arg.ctrl_all_time != 0xffff); switch (arg.ctrl_gnt_bt) { case 0xffff: @@ -795,10 +784,9 @@ do { \ break; } - __write_ctrl(R_AX_PWR_COEXT_CTRL, B_AX_TXAGC_BT_MASK, val, - B_AX_TXAGC_BT_EN, arg.ctrl_gnt_bt != 0xffff); - -#undef __write_ctrl + rtw89_mac_write_txpwr_ctrl(rtwdev, R_AX_PWR_COEXT_CTRL, + B_AX_TXAGC_BT_MASK, val, + B_AX_TXAGC_BT_EN, arg.ctrl_gnt_bt != 0xffff); } static const struct rtw89_chip_ops rtw8852b_chip_ops = { diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c index ee81a6792eee..7fd1485d1eb7 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c @@ -2760,18 +2760,6 @@ rtw8852c_btc_set_wl_txpwr_ctrl(struct rtw89_dev *rtwdev, u32 txpwr_val) union rtw8852c_btc_wl_txpwr_ctrl arg = { .txpwr_val = txpwr_val }; s32 val; -#define __write_ctrl(_reg, _msk, _val, _en, _cond) \ -do { \ - u32 _wrt = FIELD_PREP(_msk, _val); \ - BUILD_BUG_ON((_msk & _en) != 0); \ - if (_cond) \ - _wrt |= _en; \ - else \ - _wrt &= ~_en; \ - rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, _reg, \ - _msk | _en, _wrt); \ -} while (0) - switch (arg.ctrl_all_time) { case 0xffff: val = 0; @@ -2781,9 +2769,10 @@ do { \ break; } - __write_ctrl(R_AX_PWR_RATE_CTRL, B_AX_FORCE_PWR_BY_RATE_VALUE_MASK, - val, B_AX_FORCE_PWR_BY_RATE_EN, - arg.ctrl_all_time != 0xffff); + rtw89_mac_write_txpwr_ctrl(rtwdev, R_AX_PWR_RATE_CTRL, + B_AX_FORCE_PWR_BY_RATE_VALUE_MASK, + val, B_AX_FORCE_PWR_BY_RATE_EN, + arg.ctrl_all_time != 0xffff); switch (arg.ctrl_gnt_bt) { case 0xffff: @@ -2794,10 +2783,9 @@ do { \ break; } - __write_ctrl(R_AX_PWR_COEXT_CTRL, B_AX_TXAGC_BT_MASK, val, - B_AX_TXAGC_BT_EN, arg.ctrl_gnt_bt != 0xffff); - -#undef __write_ctrl + rtw89_mac_write_txpwr_ctrl(rtwdev, R_AX_PWR_COEXT_CTRL, + B_AX_TXAGC_BT_MASK, val, + B_AX_TXAGC_BT_EN, arg.ctrl_gnt_bt != 0xffff); } static -- 2.25.1