Skip to content

Commit 1c2423d

Browse files
Johnson LinKalle Valo
authored andcommitted
rtw89: refine DIG feature to support 160M and CCK PD
DIG, which is short for dynamic initial gain, is used to adjust gain to get good RX performance. CCK PD feature, a mechanism that adjusts 802.11b CCK packet detection(PD) power threshold based on environment noisy level in order to avoid false alarm. Also, refine related variable naming. Signed-off-by: Johnson Lin <[email protected]> Signed-off-by: Ping-Ke Shih <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 89e4a00 commit 1c2423d

File tree

5 files changed

+44
-7
lines changed

5 files changed

+44
-7
lines changed

drivers/net/wireless/realtek/rtw89/core.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2563,6 +2563,13 @@ static void rtw89_read_chip_ver(struct rtw89_dev *rtwdev)
25632563
rtwdev->hal.cv = cv;
25642564
}
25652565

2566+
static void rtw89_core_setup_phycap(struct rtw89_dev *rtwdev)
2567+
{
2568+
rtwdev->hal.support_cckpd =
2569+
!(rtwdev->chip->chip_id == RTL8852A && rtwdev->hal.cv <= CHIP_CBV) &&
2570+
!(rtwdev->chip->chip_id == RTL8852B && rtwdev->hal.cv <= CHIP_CAV);
2571+
}
2572+
25662573
static int rtw89_chip_efuse_info_setup(struct rtw89_dev *rtwdev)
25672574
{
25682575
int ret;
@@ -2583,6 +2590,8 @@ static int rtw89_chip_efuse_info_setup(struct rtw89_dev *rtwdev)
25832590
if (ret)
25842591
return ret;
25852592

2593+
rtw89_core_setup_phycap(rtwdev);
2594+
25862595
rtw89_mac_pwr_off(rtwdev);
25872596

25882597
return 0;

drivers/net/wireless/realtek/rtw89/core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2378,6 +2378,7 @@ struct rtw89_hal {
23782378
u32 antenna_rx;
23792379
u8 tx_nss;
23802380
u8 rx_nss;
2381+
bool support_cckpd;
23812382
};
23822383

23832384
#define RTW89_MAX_MAC_ID_NUM 128

drivers/net/wireless/realtek/rtw89/phy.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2855,7 +2855,9 @@ static void rtw89_phy_dig_dyn_pd_th(struct rtw89_dev *rtwdev, u8 rssi,
28552855
enum rtw89_bandwidth cbw = rtwdev->hal.current_band_width;
28562856
struct rtw89_dig_info *dig = &rtwdev->dig;
28572857
u8 final_rssi = 0, under_region = dig->pd_low_th_ofst;
2858-
u32 val = 0;
2858+
u8 ofdm_cca_th;
2859+
s8 cck_cca_th;
2860+
u32 pd_val = 0;
28592861

28602862
under_region += PD_TH_SB_FLTR_CMP_VAL;
28612863

@@ -2866,6 +2868,9 @@ static void rtw89_phy_dig_dyn_pd_th(struct rtw89_dev *rtwdev, u8 rssi,
28662868
case RTW89_CHANNEL_WIDTH_80:
28672869
under_region += PD_TH_BW80_CMP_VAL;
28682870
break;
2871+
case RTW89_CHANNEL_WIDTH_160:
2872+
under_region += PD_TH_BW160_CMP_VAL;
2873+
break;
28692874
case RTW89_CHANNEL_WIDTH_20:
28702875
fallthrough;
28712876
default:
@@ -2876,23 +2881,38 @@ static void rtw89_phy_dig_dyn_pd_th(struct rtw89_dev *rtwdev, u8 rssi,
28762881
dig->dyn_pd_th_max = dig->igi_rssi;
28772882

28782883
final_rssi = min_t(u8, rssi, dig->igi_rssi);
2879-
final_rssi = clamp_t(u8, final_rssi, PD_TH_MIN_RSSI + under_region,
2880-
PD_TH_MAX_RSSI + under_region);
2884+
ofdm_cca_th = clamp_t(u8, final_rssi, PD_TH_MIN_RSSI + under_region,
2885+
PD_TH_MAX_RSSI + under_region);
28812886

28822887
if (enable) {
2883-
val = (final_rssi - under_region - PD_TH_MIN_RSSI) >> 1;
2888+
pd_val = (ofdm_cca_th - under_region - PD_TH_MIN_RSSI) >> 1;
28842889
rtw89_debug(rtwdev, RTW89_DBG_DIG,
2885-
"dyn_max=%d, final_rssi=%d, total=%d, PD_low=%d\n",
2886-
dig->igi_rssi, final_rssi, under_region, val);
2890+
"igi=%d, ofdm_ccaTH=%d, backoff=%d, PD_low=%d\n",
2891+
final_rssi, ofdm_cca_th, under_region, pd_val);
28872892
} else {
28882893
rtw89_debug(rtwdev, RTW89_DBG_DIG,
28892894
"Dynamic PD th disabled, Set PD_low_bd=0\n");
28902895
}
28912896

28922897
rtw89_phy_write32_mask(rtwdev, R_SEG0R_PD, B_SEG0R_PD_LOWER_BOUND_MSK,
2893-
val);
2898+
pd_val);
28942899
rtw89_phy_write32_mask(rtwdev, R_SEG0R_PD,
28952900
B_SEG0R_PD_SPATIAL_REUSE_EN_MSK, enable);
2901+
2902+
if (!rtwdev->hal.support_cckpd)
2903+
return;
2904+
2905+
cck_cca_th = max_t(s8, final_rssi - under_region, CCKPD_TH_MIN_RSSI);
2906+
pd_val = (u32)(cck_cca_th - IGI_RSSI_MAX);
2907+
2908+
rtw89_debug(rtwdev, RTW89_DBG_DIG,
2909+
"igi=%d, cck_ccaTH=%d, backoff=%d, cck_PD_low=((%d))dB\n",
2910+
final_rssi, cck_cca_th, under_region, pd_val);
2911+
2912+
rtw89_phy_write32_mask(rtwdev, R_BMODE_PDTH_EN_V1,
2913+
B_BMODE_PDTH_LIMIT_EN_MSK_V1, enable);
2914+
rtw89_phy_write32_mask(rtwdev, R_BMODE_PDTH_V1,
2915+
B_BMODE_PDTH_LOWER_BOUND_MSK_V1, pd_val);
28962916
}
28972917

28982918
void rtw89_phy_dig_reset(struct rtw89_dev *rtwdev)

drivers/net/wireless/realtek/rtw89/phy.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,11 @@
8787
#define RXB_IDX_MAX 31
8888
#define RXB_IDX_MIN 0
8989

90+
#define IGI_RSSI_MAX 110
9091
#define PD_TH_MAX_RSSI 70
9192
#define PD_TH_MIN_RSSI 8
93+
#define CCKPD_TH_MIN_RSSI (-18)
94+
#define PD_TH_BW160_CMP_VAL 9
9295
#define PD_TH_BW80_CMP_VAL 6
9396
#define PD_TH_BW40_CMP_VAL 3
9497
#define PD_TH_BW20_CMP_VAL 0

drivers/net/wireless/realtek/rtw89/reg.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1971,6 +1971,10 @@
19711971
#define R_CHBW_MOD 0x4978
19721972
#define B_CHBW_MOD_PRICH GENMASK(11, 8)
19731973
#define B_CHBW_MOD_SBW GENMASK(13, 12)
1974+
#define R_BMODE_PDTH_V1 0x4B64
1975+
#define B_BMODE_PDTH_LOWER_BOUND_MSK_V1 GENMASK(31, 24)
1976+
#define R_BMODE_PDTH_EN_V1 0x4B74
1977+
#define B_BMODE_PDTH_LIMIT_EN_MSK_V1 BIT(30)
19741978
#define R_CFO_COMP_SEG1_L 0x5384
19751979
#define R_CFO_COMP_SEG1_H 0x5388
19761980
#define R_CFO_COMP_SEG1_CTRL 0x538C

0 commit comments

Comments
 (0)