| From 0839669f09a9990cb9c86f5c24f2824bc6f8003e Mon Sep 17 00:00:00 2001 |
| From: Yan-Hsuan Chuang <yhchuang@realtek.com> |
| Date: Fri, 13 Mar 2020 14:51:14 +0800 |
| Subject: [PATCH] FROMLIST: rtw88: add debugfs to fix tx rate |
| |
| It is useful to fix the bit rate of TX packets. For example, if |
| someone is measuring the TX power, or debugging with the issues |
| of the TX throughput on the field. |
| |
| To set the value of fixed rate, one should input corresponding |
| desc rate index (ex, 0x0b for DESC_RATE54M to fix at 54 Mbps). |
| Set a value larger than DESC_RATE_MAX will disable fix rate, so |
| the rate adaptive mechanism can resume to work. |
| |
| Example, |
| To fix rate at MCS 1: |
| echo 0x0d > /sys/kernel/debug/ieee80211/phy0/rtw88/fix_rate |
| |
| To not to fix rate: |
| echo 0xff > /sys/kernel/debug/ieee80211/phy0/rtw88/fix_rate |
| |
| To know which rate was fixed at: |
| cat /sys/kernel/debug/ieee80211/phy0/rtw88/fix_rate |
| |
| Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com> |
| (am from https://patchwork.kernel.org/patch/11436035/) |
| (also found at https://lkml.kernel.org/r/20200313065114.23433-1-yhchuang@realtek.com) |
| |
| BUG=b:124400293 |
| BUG=b:150971082 |
| BUG=b:137376638 |
| TEST=none |
| |
| Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com> |
| Change-Id: I86c6e85ab5b8c895abf0243d2342c532f72d77ca |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/2101402 |
| Reviewed-by: Sean Paul <seanpaul@chromium.org> |
| Reviewed-by: Brian Norris <briannorris@chromium.org> |
| Commit-Queue: Brian Norris <briannorris@chromium.org> |
| Tested-by: Brian Norris <briannorris@chromium.org> |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/2163317 |
| --- |
| drivers/net/wireless/realtek/rtw88/debug.c | 47 ++++++++++++++++++++++ |
| drivers/net/wireless/realtek/rtw88/main.c | 1 + |
| drivers/net/wireless/realtek/rtw88/main.h | 1 + |
| drivers/net/wireless/realtek/rtw88/tx.c | 9 +++++ |
| 4 files changed, 58 insertions(+) |
| |
| diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c |
| index 948cb79050ea..4625c0676b13 100644 |
| --- a/drivers/net/wireless/realtek/rtw88/debug.c |
| +++ b/drivers/net/wireless/realtek/rtw88/debug.c |
| @@ -141,6 +141,22 @@ static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v) |
| return 0; |
| } |
| |
| +static int rtw_debugfs_get_fix_rate(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; |
| + u8 fix_rate = dm_info->fix_rate; |
| + |
| + if (fix_rate >= DESC_RATE_MAX) { |
| + seq_printf(m, "Fix rate disabled, fix_rate = %u\n", fix_rate); |
| + return 0; |
| + } |
| + |
| + seq_printf(m, "Data frames fixed at desc rate %u\n", fix_rate); |
| + return 0; |
| +} |
| + |
| static int rtw_debugfs_copy_from_user(char tmp[], int size, |
| const char __user *buffer, size_t count, |
| int num) |
| @@ -426,6 +442,31 @@ static ssize_t rtw_debugfs_set_rf_read(struct file *filp, |
| return count; |
| } |
| |
| +static ssize_t rtw_debugfs_set_fix_rate(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; |
| + u8 fix_rate; |
| + char tmp[32 + 1]; |
| + int ret; |
| + |
| + rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1); |
| + |
| + ret = kstrtou8(tmp, 0, &fix_rate); |
| + if (ret) { |
| + rtw_warn(rtwdev, "invalid args, [rate]\n"); |
| + return ret; |
| + } |
| + |
| + dm_info->fix_rate = fix_rate; |
| + |
| + return count; |
| +} |
| + |
| static int rtw_debug_get_mac_page(struct seq_file *m, void *v) |
| { |
| struct rtw_debugfs_priv *debugfs_priv = m->private; |
| @@ -898,6 +939,11 @@ static struct rtw_debugfs_priv rtw_debug_priv_read_reg = { |
| .cb_read = rtw_debugfs_get_read_reg, |
| }; |
| |
| +static struct rtw_debugfs_priv rtw_debug_priv_fix_rate = { |
| + .cb_write = rtw_debugfs_set_fix_rate, |
| + .cb_read = rtw_debugfs_get_fix_rate, |
| +}; |
| + |
| static struct rtw_debugfs_priv rtw_debug_priv_dump_cam = { |
| .cb_write = rtw_debugfs_set_single_input, |
| .cb_read = rtw_debugfs_get_dump_cam, |
| @@ -948,6 +994,7 @@ void rtw_debugfs_init(struct rtw_dev *rtwdev) |
| rtw_debugfs_add_rw(read_reg); |
| rtw_debugfs_add_w(rf_write); |
| rtw_debugfs_add_rw(rf_read); |
| + rtw_debugfs_add_rw(fix_rate); |
| rtw_debugfs_add_rw(dump_cam); |
| rtw_debugfs_add_rw(rsvd_page); |
| rtw_debugfs_add_r(phy_info); |
| diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c |
| index e6989c0525cc..60cd7dc0b508 100644 |
| --- a/drivers/net/wireless/realtek/rtw88/main.c |
| +++ b/drivers/net/wireless/realtek/rtw88/main.c |
| @@ -1692,6 +1692,7 @@ int rtw_core_init(struct rtw_dev *rtwdev) |
| |
| rtwdev->sec.total_cam_num = 32; |
| rtwdev->hal.current_channel = 1; |
| + rtwdev->dm_info.fix_rate = U8_MAX; |
| set_bit(RTW_BC_MC_MACID, rtwdev->mac_id_map); |
| |
| rtw_stats_init(rtwdev); |
| diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h |
| index 35afea91fd29..54c806e1bd0c 100644 |
| --- a/drivers/net/wireless/realtek/rtw88/main.h |
| +++ b/drivers/net/wireless/realtek/rtw88/main.h |
| @@ -1529,6 +1529,7 @@ struct rtw_dm_info { |
| u8 cck_gi_u_bnd; |
| u8 cck_gi_l_bnd; |
| |
| + u8 fix_rate; |
| u8 tx_rate; |
| u32 rrsr_val_init; |
| u32 rrsr_mask_min; |
| diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c |
| index 0193708fc013..784b1288017d 100644 |
| --- a/drivers/net/wireless/realtek/rtw88/tx.c |
| +++ b/drivers/net/wireless/realtek/rtw88/tx.c |
| @@ -295,7 +295,9 @@ static void rtw_tx_data_pkt_info_update(struct rtw_dev *rtwdev, |
| struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
| struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
| struct ieee80211_hw *hw = rtwdev->hw; |
| + struct rtw_dm_info *dm_info = &rtwdev->dm_info; |
| struct rtw_sta_info *si; |
| + u8 fix_rate; |
| u16 seq; |
| u8 ampdu_factor = 0; |
| u8 ampdu_density = 0; |
| @@ -347,6 +349,13 @@ static void rtw_tx_data_pkt_info_update(struct rtw_dev *rtwdev, |
| pkt_info->bw = bw; |
| pkt_info->stbc = stbc; |
| pkt_info->ldpc = ldpc; |
| + |
| + fix_rate = dm_info->fix_rate; |
| + if (fix_rate < DESC_RATE_MAX) { |
| + pkt_info->rate = fix_rate; |
| + pkt_info->dis_rate_fallback = true; |
| + pkt_info->use_rate = true; |
| + } |
| } |
| |
| void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev, |
| -- |
| 2.17.1 |
| |