Commit 3b25bac8 authored by Guo-Feng Fan's avatar Guo-Feng Fan Committed by Kalle Valo

rtw88: 8822c: debug: allow debugfs to enable/disable TXGAPK

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
Signed-off-by: default avatarGuo-Feng Fan <vincent_fann@realtek.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210419003748.3224-4-pkshih@realtek.com
parent 056b239f
......@@ -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 */
......
......@@ -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;
......
......@@ -1665,15 +1665,17 @@ 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);
for (i = 0; i < RF_GAIN_NUM; i++) {
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment