Skip to content

Commit 14a5b11

Browse files
Zong-Zhe YangKalle Valo
authored andcommitted
wifi: rtw88: 8821c: tweak CCK TX filter setting for SRRC regulation
Since new criterion released by SRRC (State Radio Regulatory Commission, China) is stricter, we have adjusted TX power limit tables for it. But, due to RTL8821C HW characteristic, we still need to use specific parameter in CCK TX filter when set channel to avoid violations in some corner cases. Signed-off-by: Zong-Zhe Yang <[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 02f697a commit 14a5b11

File tree

4 files changed

+78
-0
lines changed

4 files changed

+78
-0
lines changed

drivers/net/wireless/realtek/rtw88/regd.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,14 @@ u8 rtw_regd_get(struct rtw_dev *rtwdev)
502502
}
503503
EXPORT_SYMBOL(rtw_regd_get);
504504

505+
bool rtw_regd_srrc(struct rtw_dev *rtwdev)
506+
{
507+
struct rtw_regd *regd = &rtwdev->regd;
508+
509+
return rtw_reg_match(regd->regulatory, "CN");
510+
}
511+
EXPORT_SYMBOL(rtw_regd_srrc);
512+
505513
struct rtw_regd_alternative_t {
506514
bool set;
507515
u8 alt;

drivers/net/wireless/realtek/rtw88/regd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,6 @@ int rtw_regd_init(struct rtw_dev *rtwdev);
6868
int rtw_regd_hint(struct rtw_dev *rtwdev);
6969
u8 rtw_regd_get(struct rtw_dev *rtwdev);
7070
bool rtw_regd_has_alt(u8 regd, u8 *regd_alt);
71+
bool rtw_regd_srrc(struct rtw_dev *rtwdev);
72+
7173
#endif

drivers/net/wireless/realtek/rtw88/rtw8821c.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,65 @@ static void rtw8821c_set_channel_rxdfir(struct rtw_dev *rtwdev, u8 bw)
381381
}
382382
}
383383

384+
static void rtw8821c_cck_tx_filter_srrc(struct rtw_dev *rtwdev, u8 channel, u8 bw)
385+
{
386+
struct rtw_hal *hal = &rtwdev->hal;
387+
388+
if (channel == 14) {
389+
rtw_write32_mask(rtwdev, REG_CCA_FLTR, MASKHWORD, 0xe82c);
390+
rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x0000b81c);
391+
rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000);
392+
rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 0x00003667);
393+
394+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00002);
395+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001e);
396+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
397+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001c);
398+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
399+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000e);
400+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
401+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000c);
402+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
403+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00000);
404+
} else if (channel == 13 ||
405+
(channel == 11 && bw == RTW_CHANNEL_WIDTH_40)) {
406+
rtw_write32_mask(rtwdev, REG_CCA_FLTR, MASKHWORD, 0xf8fe);
407+
rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x64b80c1c);
408+
rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x8810);
409+
rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 0x01235667);
410+
411+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00002);
412+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001e);
413+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00027);
414+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001c);
415+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00027);
416+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000e);
417+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00029);
418+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000c);
419+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00026);
420+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00000);
421+
} else {
422+
rtw_write32_mask(rtwdev, REG_CCA_FLTR, MASKHWORD, 0xe82c);
423+
rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD,
424+
hal->ch_param[0]);
425+
rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD,
426+
hal->ch_param[1] & MASKLWORD);
427+
rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD,
428+
hal->ch_param[2]);
429+
430+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00002);
431+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001e);
432+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
433+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001c);
434+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
435+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000e);
436+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
437+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000c);
438+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
439+
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00000);
440+
}
441+
}
442+
384443
static void rtw8821c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
385444
u8 primary_ch_idx)
386445
{
@@ -395,6 +454,13 @@ static void rtw8821c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
395454

396455
rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x0);
397456
rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x96a);
457+
458+
if (rtw_regd_srrc(rtwdev)) {
459+
rtw8821c_cck_tx_filter_srrc(rtwdev, channel, bw);
460+
goto set_bw;
461+
}
462+
463+
/* CCK TX filter parameters for default case */
398464
if (channel == 14) {
399465
rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x0000b81c);
400466
rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000);
@@ -430,6 +496,7 @@ static void rtw8821c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
430496
rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412);
431497
}
432498

499+
set_bw:
433500
switch (bw) {
434501
case RTW_CHANNEL_WIDTH_20:
435502
default:

drivers/net/wireless/realtek/rtw88/rtw8821c.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ extern const struct rtw_chip_info rtw8821c_hw_spec;
238238
#define REG_RXSB 0xa00
239239
#define REG_ADCINI 0xa04
240240
#define REG_PWRTH 0xa08
241+
#define REG_CCA_FLTR 0xa20
241242
#define REG_TXSF2 0xa24
242243
#define REG_TXSF6 0xa28
243244
#define REG_FA_CCK 0xa5c

0 commit comments

Comments
 (0)