rtw89: 8822c: add GAPK
Ping-Ke Shih
maintainerv2 cover rtw89: 8822c: add GAPK
GAPK is used to calibrate RF character to make every module good performance. With a debug switch, we can make sure if it helps in field.
Besides, we sort the register definition to make it looks better. Since previous patchset "rtw88: add some fixes and 8822c features" also changes the registers, I create this patchset based on the previous one, expecting this patchset is merged later than it.
---
v2: fix merge conflicts
Guo-Feng Fan (3):
rtw88: 8822c: reorder macro position according to the register number
rtw88: 8822c: Add gap-k calibration to improve long range performance
rtw88: 8822c: debug: allow debugfs to enable/disable TXGAPK
drivers/net/wireless/realtek/rtw88/debug.c | 91 +++ drivers/net/wireless/realtek/rtw88/fw.c | 12 + drivers/net/wireless/realtek/rtw88/fw.h | 5 + drivers/net/wireless/realtek/rtw88/main.h | 31 + drivers/net/wireless/realtek/rtw88/reg.h | 8 + drivers/net/wireless/realtek/rtw88/rtw8822c.c | 724 +++++++++++++++++- drivers/net/wireless/realtek/rtw88/rtw8822c.h | 336 ++++---- 7 files changed, 1065 insertions(+), 142 deletions(-)
Signature · 1 line
2.21.0
Ping-Ke Shih
maintainerPATCH v2 1/3 rtw88: 8822c: reorder macro position according to the register number
From: Guo-Feng Fan <[email protected]>
This patch doesn't change logic at all, just a refactor patch.
1. Move BIT MASK and BIT definition along with the register definition
2. Remove redundant definition
3. Align macros with Tab key
--- drivers/net/wireless/realtek/rtw88/rtw8822c.c | 16 +- drivers/net/wireless/realtek/rtw88/rtw8822c.h | 275 +++++++++--------- 2 files changed, 148 insertions(+), 143 deletions(-)
drivers/net/wireless/realtek/rtw88/rtw8822c.c +8 -8
@@ -1095,13 +1095,13 @@ static void rtw8822c_pa_bias(struct rtw_dev *rtwdev)if (pg_pa_bias ==EFUSE_READ_FAIL )return ; pg_pa_bias =FIELD_GET (PPG_PABIAS_MASK , pg_pa_bias); -rtw_write_rf (rtwdev, path,0x60 ,RF_PABIAS_2G_MASK , pg_pa_bias); +rtw_write_rf (rtwdev, path,RF_PA ,RF_PABIAS_2G_MASK , pg_pa_bias); }for (path =0 ; path < rtwdev->hal.rf_path_num; path++) {rtw_read8_physical_efuse (rtwdev, rf_efuse_5g[path], &pg_pa_bias); pg_pa_bias =FIELD_GET (PPG_PABIAS_MASK , pg_pa_bias); -rtw_write_rf (rtwdev, path,0x60 ,RF_PABIAS_5G_MASK , pg_pa_bias); +rtw_write_rf (rtwdev, path,RF_PA ,RF_PABIAS_5G_MASK , pg_pa_bias); } }
@@ -2546,9 +2546,9 @@ static void rtw8822c_dpk_pre_setting(struct rtw_dev *rtwdev)rtw_write_rf (rtwdev, path,RF_RXAGC_OFFSET ,RFREG_MASK ,0x0 );rtw_write32 (rtwdev,REG_NCTL0 ,0x8 | (path <<1 ));if (rtwdev->dm_info.dpk_info.dpk_band ==RTW_BAND_2G ) -rtw_write32 (rtwdev,REG_DPD_LUT3 ,0x1f100000 ); +rtw_write32 (rtwdev,REG_DPD_CTL1_S1 ,0x1f100000 );else -rtw_write32 (rtwdev,REG_DPD_LUT3 ,0x1f0d0000 ); +rtw_write32 (rtwdev,REG_DPD_CTL1_S1 ,0x1f0d0000 );rtw_write32_mask (rtwdev,REG_DPD_LUT0 ,BIT_GLOSS_DB ,0x4 );rtw_write32_mask (rtwdev,REG_IQK_CTL1 ,BIT_TX_CFIR ,0x3 ); }
@@ -2566,11 +2566,11 @@ static u32 rtw8822c_dpk_rf_setting(struct rtw_dev *rtwdev, u8 path)rtw_write_rf (rtwdev, path,RF_DEBUG ,BIT_DE_TX_GAIN ,0x1 );rtw_write_rf (rtwdev, path,RF_DEBUG ,BIT_DE_PWR_TRIM ,0x1 ); -rtw_write_rf (rtwdev, path,RF_TX_GAIN_OFFSET ,BIT_TX_OFFSET_VAL ,0x0 ); +rtw_write_rf (rtwdev, path,RF_TX_GAIN_OFFSET ,BIT_BB_GAIN ,0x0 );rtw_write_rf (rtwdev, path,RF_TX_GAIN ,RFREG_MASK , ori_txbb);if (rtwdev->dm_info.dpk_info.dpk_band ==RTW_BAND_2G ) { -rtw_write_rf (rtwdev, path,RF_TX_GAIN_OFFSET ,BIT_LB_ATT ,0x1 ); +rtw_write_rf (rtwdev, path,RF_TX_GAIN_OFFSET ,BIT_RF_GAIN ,0x1 );rtw_write_rf (rtwdev, path,RF_RXG_GAIN ,BIT_RXG_GAIN ,0x0 ); }else {rtw_write_rf (rtwdev, path,RF_TXA_LB_SW ,BIT_TXA_LB_ATT ,0x0 );
@@ -3317,9 +3317,9 @@ static void rtw8822c_dpk_reload_data(struct rtw_dev *rtwdev)rtw_write32_mask (rtwdev,REG_NCTL0 ,BIT_SUBPAGE ,0x8 | (path <<1 ));if (dpk_info->dpk_band ==RTW_BAND_2G ) -rtw_write32 (rtwdev,REG_DPD_LUT3 ,0x1f100000 ); +rtw_write32 (rtwdev,REG_DPD_CTL1_S1 ,0x1f100000 );else -rtw_write32 (rtwdev,REG_DPD_LUT3 ,0x1f0d0000 ); +rtw_write32 (rtwdev,REG_DPD_CTL1_S1 ,0x1f0d0000 );rtw_write8 (rtwdev,REG_DPD_AGC , dpk_info->dpk_txagc[path]);
drivers/net/wireless/realtek/rtw88/rtw8822c.h +140 -135
320 lines not on this page · raw message
Signature · 1 line
2.21.0
Re: [PATCH v2 1/3] rtw88: 8822c: reorder macro position according to the register number
Quoted 10 lines · Ping-Ke Shih
From: Guo-Feng Fan <[email protected]>
This patch doesn't change logic at all, just a refactor patch.
1. Move BIT MASK and BIT definition along with the register definition
2. Remove redundant definition
3. Align macros with Tab keySigned-off-by Guo-Feng Fan <[email protected]>Signed-off-by Ping-Ke Shih <[email protected]>
3 patches applied to wireless-drivers-next.git, thanks.
f98bf9ee6312 rtw88: 8822c: reorder macro position according to the register number 056b239f8672 rtw88: 8822c: Add gap-k calibration to improve long range performance 3b25bac89353 rtw88: 8822c: debug: allow debugfs to enable/disable TXGAPK
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Ping-Ke Shih
maintainerPATCH v2 2/3 rtw88: 8822c: Add gap-k calibration to improve long range performance
In reply to Ping-Ke ShihFrom: Guo-Feng Fan <[email protected]>
gap-k is a calibration mechanism to eliminate power gaps between two nearly rate groups.
This mechanism improves performance in long range test by applying proper power value to those rate groups which have nonlinear power gap.
--- drivers/net/wireless/realtek/rtw88/fw.c | 12 + drivers/net/wireless/realtek/rtw88/fw.h | 5 + drivers/net/wireless/realtek/rtw88/main.h | 23 + drivers/net/wireless/realtek/rtw88/reg.h | 8 + drivers/net/wireless/realtek/rtw88/rtw8822c.c | 697 ++++++++++++++++++ drivers/net/wireless/realtek/rtw88/rtw8822c.h | 65 +- 6 files changed, 809 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw88/fw.c +12 -0
@@ -350,6 +350,18 @@ void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para) }EXPORT_SYMBOL (rtw_fw_do_iqk); +void rtw_fw_inform_rfk_status (struct rtw_dev *rtwdev,bool start) +{ +u8 h2c_pkt[H2C_PKT_SIZE ] = {0 }; + +SET_H2C_CMD_ID_CLASS (h2c_pkt,H2C_CMD_WIFI_CALIBRATION ); + +RFK_SET_INFORM_START (h2c_pkt, start); + +rtw_fw_send_h2c_command (rtwdev, h2c_pkt); +} +EXPORT_SYMBOL (rtw_fw_inform_rfk_status); +void rtw_fw_query_bt_info (struct rtw_dev *rtwdev) {u8 h2c_pkt[H2C_PKT_SIZE ] = {0 };
drivers/net/wireless/realtek/rtw88/fw.h +5 -0
@@ -354,6 +354,7 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)#define H2C_CMD_WL_CH_INFO 0x66#define H2C_CMD_QUERY_BT_MP_INFO 0x67#define H2C_CMD_BT_WIFI_CONTROL 0x69 +#define H2C_CMD_WIFI_CALIBRATION 0x6d#define H2C_CMD_KEEP_ALIVE 0x03#define H2C_CMD_DISCONNECT_DECISION 0x04
@@ -542,6 +543,9 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id) le32_get_bits(*((__le32 *)(_header) + 0x01), GENMASK(31, 16))#define GET_FW_DUMP_TLV_VAL (_header) \ le32_get_bits(*((__le32 *)(_header) + 0x02), GENMASK(31, 0)) + +#define RFK_SET_INFORM_START (h2c_pkt, value) \ + le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))static inline struct rtw_c2h_cmd *get_c2h_from_skb (struct sk_buff *skb) {u32 pkt_offset;
@@ -557,6 +561,7 @@ void rtw_fw_send_general_info(struct rtw_dev *rtwdev);void rtw_fw_send_phydm_info (struct rtw_dev *rtwdev);void rtw_fw_do_iqk (struct rtw_dev *rtwdev,struct rtw_iqk_para *para); +void rtw_fw_inform_rfk_status (struct rtw_dev *rtwdev,bool start);void rtw_fw_set_pwr_mode (struct rtw_dev *rtwdev);void rtw_fw_set_pg_info (struct rtw_dev *rtwdev);void rtw_fw_query_bt_info (struct rtw_dev *rtwdev);
drivers/net/wireless/realtek/rtw88/main.h +23 -0
@@ -1502,6 +1502,27 @@ struct rtw_iqk_info { } result; }; +enum rtw_rf_band { +RF_BAND_2G_CCK , +RF_BAND_2G_OFDM , +RF_BAND_5G_L , +RF_BAND_5G_M , +RF_BAND_5G_H , +RF_BAND_MAX +}; + +#define RF_GAIN_NUM 11 +#define RF_HW_OFFSET_NUM 10 + +struct rtw_gapk_info { +u32 rf3f_bp[RF_BAND_MAX ][RF_GAIN_NUM ][RTW_RF_PATH_MAX ]; +bool txgapk_bp_done; +s8 offset[RF_GAIN_NUM ][RTW_RF_PATH_MAX ]; +s8 fianl_offset[RF_GAIN_NUM ][RTW_RF_PATH_MAX ]; +u8 read_txgain; +u8 channel; +}; +struct rtw_cfo_track {bool is_adjust;u8 crystal_cap;
@@ -1583,6 +1604,8 @@ struct rtw_dm_info {struct ewma_snr ewma_snr[RTW_SNR_NUM ];struct rtw_iqk_info iqk; +struct rtw_gapk_info gapk; +bool is_bt_iqk_timeout; };struct rtw_efuse {
drivers/net/wireless/realtek/rtw88/reg.h +8 -0
@@ -129,6 +129,9 @@#define REG_MCU_TST_CFG 0x84#define VAL_FW_TRIGGER 0x1 +#define REG_PMC_DBG_CTRL1 0xa8 +#define BITS_PMC_BT_IQK_STS GENMASK(22, 21) +#define REG_EFUSE_ACCESS 0x00CF#define EFUSE_ACCESS_ON 0x69#define EFUSE_ACCESS_OFF 0x00
@@ -360,6 +363,7 @@#define REG_TX_PTCL_CTRL 0x0520#define BIT_SIFS_BK_EN BIT(12)#define REG_TXPAUSE 0x0522 +#define BIT_AC_QUEUE GENMASK(7, 0)#define REG_RD_CTRL 0x0524#define BIT_DIS_TXOP_CFE BIT(10)#define BIT_DIS_LSIG_CFE BIT(9)
@@ -644,10 +648,13 @@#define RF_WLSEL 0x02#define RF_DTXLOK 0x08#define RF_CFGCH 0x18 +#define BIT_BAND GENMASK(18, 16)#define RF_RCK 0x1d#define RF_LUTWA 0x33#define RF_LUTWD1 0x3e#define RF_LUTWD0 0x3f +#define BIT_GAIN_EXT BIT(12) +#define BIT_DATA_L GENMASK(11, 0)#define RF_T_METER 0x42#define RF_BSPAD 0x54#define RF_GAINTX 0x56
@@ -664,6 +671,7 @@#define RF_RCKD 0xde#define RF_TXADBG 0xde#define RF_LUTDBG 0xdf +#define BIT_TXA_TANK BIT(4)#define RF_LUTWE2 0xee#define RF_LUTWE 0xef
drivers/net/wireless/realtek/rtw88/rtw8822c.c +697 -0
711 lines not on this page · raw message
drivers/net/wireless/realtek/rtw88/rtw8822c.h +64 -1
170 lines not on this page · raw message
Signature · 1 line
2.21.0
Ping-Ke Shih
maintainerPATCH v2 3/3 rtw88: 8822c: debug: allow debugfs to enable/disable TXGAPK
In reply to Ping-Ke ShihFrom: Guo-Feng Fan <[email protected]>
Use "cat dm_cap" to show all features; where, prefix +/- means feature is enabled/disabled:
$ cat dm_cap DM capability 0x00000002 ( 1) +TXGAPK
To control dm_cap:
use "echo +1 > dm_cap" to enable TXGAPK
use "echo -1 > dm_cap" to disable TXGAPK
Below is an example to disable TXGAPK.
$ echo -1 > dm_cap $ cat dm_cap DM capability 0x00000000 ( 1) -TXGAPK
Below is an example to show TXGAPK status
$ echo 1 > dm_cap; cat dm_cap
( 1) +TXGAPK
path 0:0x56 = 0x88c89
[TXGAPK] offset 1 0
[TXGAPK] offset 1 1
[TXGAPK] offset 1 2
[TXGAPK] offset 1 3
[TXGAPK] offset 0 4
[TXGAPK] offset 0 5
[TXGAPK] offset 0 6
[TXGAPK] offset 0 7
[TXGAPK] offset 0 8
[TXGAPK] offset 0 9
path 1:0x56 = 0x89c89
[TXGAPK] offset 1 0
[TXGAPK] offset 1 1
[TXGAPK] offset 1 2
[TXGAPK] offset 1 3
[TXGAPK] offset 0 4
[TXGAPK] offset 0 5
[TXGAPK] offset 0 6
[TXGAPK] offset 0 7
[TXGAPK] offset 0 8
[TXGAPK] offset 0 9
--- drivers/net/wireless/realtek/rtw88/debug.c | 91 +++++++++++++++++++ drivers/net/wireless/realtek/rtw88/main.h | 8 ++ drivers/net/wireless/realtek/rtw88/rtw8822c.c | 15 ++- 3 files changed, 112 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw88/debug.c +91 -0
@@ -35,9 +35,17 @@ struct rtw_debugfs_priv {u32 addr;u32 len; } read_reg; +struct { +u8 bit; + } dm_cap; }; }; +static const char *const rtw_dm_cap_strs[] = { + [RTW_DM_CAP_NA ] ="NA" , + [RTW_DM_CAP_TXGAPK ] ="TXGAPK" , +}; +static int rtw_debugfs_single_show (struct seq_file *m,void *v) {struct rtw_debugfs_priv *debugfs_priv = m->private;
@@ -853,6 +861,83 @@ static int rtw_debugfs_get_fw_crash(struct seq_file *m, void *v)return 0 ; } +static ssize_t rtw_debugfs_set_dm_cap (struct file *filp, +const char __user *buffer, +size_t count,loff_t *loff) +{ +struct seq_file *seqpriv = (struct seq_file *)filp->private_data; +struct rtw_debugfs_priv *debugfs_priv = seqpriv->private; +struct rtw_dev *rtwdev = debugfs_priv->rtwdev; +struct rtw_dm_info *dm_info = &rtwdev->dm_info; +int bit; +bool en; + +if (kstrtoint_from_user (buffer, count,10 , &bit)) +return -EINVAL ; + + en = bit >0 ; + bit =abs (bit); + +if (bit >=RTW_DM_CAP_NUM ) { +rtw_warn (rtwdev,"unknown DM CAP %d\n" , bit); +return -EINVAL ; + } + +if (en) + dm_info->dm_flags &= ~BIT (bit); +else + dm_info->dm_flags |=BIT (bit); + + debugfs_priv->dm_cap.bit = bit; + +return count; +} + +static void dump_gapk_status (struct rtw_dev *rtwdev,struct seq_file *m) +{ +struct rtw_dm_info *dm_info = &rtwdev->dm_info; +struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk; +int i, path; +u32 val; + +seq_printf (m,"\n(%2d) %c%s\n\n" ,RTW_DM_CAP_TXGAPK , + dm_info->dm_flags &BIT (RTW_DM_CAP_TXGAPK ) ?'-' :'+' , + rtw_dm_cap_strs[RTW_DM_CAP_TXGAPK ]); + +for (path =0 ; path < rtwdev->hal.rf_path_num; path++) { + val =rtw_read_rf (rtwdev, path,RF_GAINTX ,RFREG_MASK ); +seq_printf (m,"path %d:\n0x%x = 0x%x\n" , path,RF_GAINTX , val); + +for (i =0 ; i <RF_HW_OFFSET_NUM ; i++) +seq_printf (m,"[TXGAPK] offset %d %d\n" , + txgapk->rf3f_fs[path][i], i); +seq_puts (m,"\n" ); + } +} + +static int rtw_debugfs_get_dm_cap (struct seq_file *m,void *v) +{ +struct rtw_debugfs_priv *debugfs_priv = m->private; +struct rtw_dev *rtwdev = debugfs_priv->rtwdev; +struct rtw_dm_info *dm_info = &rtwdev->dm_info; +int i; + +switch (debugfs_priv->dm_cap.bit) { +case RTW_DM_CAP_TXGAPK : +dump_gapk_status (rtwdev, m); +break ; +default : +for (i =1 ; i <RTW_DM_CAP_NUM ; i++) { +seq_printf (m,"(%2d) %c%s\n" , i, + dm_info->dm_flags &BIT (i) ?'-' :'+' , + rtw_dm_cap_strs[i]); + } +break ; + } + debugfs_priv->dm_cap.bit =RTW_DM_CAP_NA ; +return 0 ; +} +#define rtw_debug_impl_mac (page, addr) \ static struct rtw_debugfs_priv rtw_debug_priv_mac_ ##page = { \ .cb_read = rtw_debug_get_mac_page, \
@@ -961,6 +1046,11 @@ static struct rtw_debugfs_priv rtw_debug_priv_fw_crash = { .cb_read = rtw_debugfs_get_fw_crash, }; +static struct rtw_debugfs_priv rtw_debug_priv_dm_cap = { + .cb_write = rtw_debugfs_set_dm_cap, + .cb_read = rtw_debugfs_get_dm_cap, +}; +#define rtw_debugfs_add_core (name, mode, fopname, parent) \ do { \ rtw_debug_priv_ ##name.rtwdev = rtwdev; \
@@ -1035,6 +1125,7 @@ void rtw_debugfs_init(struct rtw_dev *rtwdev)rtw_debugfs_add_r (rf_dump);rtw_debugfs_add_r (tx_pwr_tbl);rtw_debugfs_add_rw (fw_crash); + rtw_debugfs_add_rw(dm_cap); }#endif /* CONFIG_RTW88_DEBUGFS */
drivers/net/wireless/realtek/rtw88/main.h +8 -0
@@ -1516,6 +1516,7 @@ enum rtw_rf_band {struct rtw_gapk_info {u32 rf3f_bp[RF_BAND_MAX ][RF_GAIN_NUM ][RTW_RF_PATH_MAX ]; +u32 rf3f_fs[RTW_RF_PATH_MAX ][RF_GAIN_NUM ];bool txgapk_bp_done;s8 offset[RF_GAIN_NUM ][RTW_RF_PATH_MAX ];s8 fianl_offset[RF_GAIN_NUM ][RTW_RF_PATH_MAX ];
@@ -1535,6 +1536,12 @@ struct rtw_cfo_track {#define RRSR_INIT_2G 0x15f#define RRSR_INIT_5G 0x150 +enum rtw_dm_cap { +RTW_DM_CAP_NA , +RTW_DM_CAP_TXGAPK , +RTW_DM_CAP_NUM +}; +struct rtw_dm_info {u32 cck_fa_cnt;u32 ofdm_fa_cnt;
@@ -1603,6 +1610,7 @@ struct rtw_dm_info {struct ewma_evm ewma_evm[RTW_EVM_NUM ];struct ewma_snr ewma_snr[RTW_SNR_NUM ]; +u32 dm_flags;/* enum rtw_dm_cap */ struct rtw_iqk_info iqk;struct rtw_gapk_info gapk;bool is_bt_iqk_timeout;
drivers/net/wireless/realtek/rtw88/rtw8822c.c +13 -2
@@ -1665,14 +1665,16 @@ static void rtw8822c_txgapk_write_tx_gain(struct rtw_dev *rtwdev) } v = txgapk->rf3f_bp[band][i][path]; -if (_rtw8822c_txgapk_gain_valid (rtwdev, v)) +if (_rtw8822c_txgapk_gain_valid (rtwdev, v)) {rtw_dbg (rtwdev,RTW_DBG_RFK ,"[TXGAPK] tx_gain=0x%03X >= 0xCEX\n" , txgapk->rf3f_bp[band][i][path]); -else + }else { + txgapk->rf3f_fs[path][i] = offset_tmp[i];rtw_dbg (rtwdev,RTW_DBG_RFK ,"[TXGAPK] offset %d %d\n" , offset_tmp[i], i); + } }rtw_write_rf (rtwdev, path,RF_LUTWE2 ,RFREG_MASK ,0x10000 );
@@ -1704,6 +1706,9 @@ static void rtw8822c_txgapk_save_all_tx_gain_table(struct rtw_dev *rtwdev)u8 path, band, gain, rf0_idx;u32 rf18, v; +if (rtwdev->dm_info.dm_flags &BIT (RTW_DM_CAP_TXGAPK )) +return ; +rtw_dbg (rtwdev,RTW_DBG_RFK ,"[TXGAPK] ======>%s\n" , __func__);if (txgapk->read_txgain ==1 ) {
@@ -1794,6 +1799,12 @@ static void rtw8822c_txgapk(struct rtw_dev *rtwdev)static void rtw8822c_do_gapk (struct rtw_dev *rtwdev) { +struct rtw_dm_info *dm = &rtwdev->dm_info; + +if (dm->dm_flags &BIT (RTW_DM_CAP_TXGAPK )) { +rtw_dbg (rtwdev,RTW_DBG_RFK ,"[TXGAPK] feature disable!!!\n" ); +return ; + }rtw8822c_rfk_handshake (rtwdev, true);rtw8822c_txgapk (rtwdev);rtw8822c_rfk_handshake (rtwdev, false);
Signature · 1 line
2.21.0