wifi: rtl8xxxu: Report the RSSI to the firmware

Or in the case of RTL8188EU, report the RSSI to the rate control code.

The rate control code for RTL8188EU is less likely to switch to a lower
rate when the RSSI is high. The firmware-based rate control in the other
chips probably works the same way.

This affects all the chips, but it was only tested with RTL8188EU,
RTL8188FU, and RTL8192EU.

Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/2aab4f3f-e914-4fe1-f29a-deac91774d05@gmail.com
This commit is contained in:
Bitterblue Smith 2023-01-08 17:06:43 +02:00 committed by Kalle Valo
parent ebe8dee7ae
commit 3922dc9fbd
8 changed files with 68 additions and 0 deletions

View File

@ -1168,6 +1168,26 @@ struct h2c_cmd {
u8 cmd; u8 cmd;
u8 data; u8 data;
} __packed bt_grant; } __packed bt_grant;
struct {
u8 cmd;
u8 macid;
u8 unknown0;
u8 rssi;
/*
* [0] - is_rx
* [1] - stbc_en
* [2] - noisy_decision
* [6] - bf_en
*/
u8 data;
/*
* [0:6] - ra_th_offset
* [7] - ra_offset_direction
*/
u8 ra_th_offset;
u8 unknown1;
u8 unknown2;
} __packed rssi_report;
}; };
}; };
@ -1585,6 +1605,7 @@ struct rtl8xxxu_fileops {
u32 ramask, u8 rateid, int sgi, int txbw_40mhz); u32 ramask, u8 rateid, int sgi, int txbw_40mhz);
void (*report_connect) (struct rtl8xxxu_priv *priv, void (*report_connect) (struct rtl8xxxu_priv *priv,
u8 macid, bool connect); u8 macid, bool connect);
void (*report_rssi) (struct rtl8xxxu_priv *priv, u8 macid, u8 rssi);
void (*fill_txdesc) (struct ieee80211_hw *hw, struct ieee80211_hdr *hdr, void (*fill_txdesc) (struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
struct ieee80211_tx_info *tx_info, struct ieee80211_tx_info *tx_info,
struct rtl8xxxu_txdesc32 *tx_desc, bool sgi, struct rtl8xxxu_txdesc32 *tx_desc, bool sgi,
@ -1686,6 +1707,8 @@ void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
u8 macid, bool connect); u8 macid, bool connect);
void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv, void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
u8 macid, bool connect); u8 macid, bool connect);
void rtl8xxxu_gen1_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi);
void rtl8xxxu_gen2_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi);
void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv); void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv);
void rtl8xxxu_gen1_enable_rf(struct rtl8xxxu_priv *priv); void rtl8xxxu_gen1_enable_rf(struct rtl8xxxu_priv *priv);
void rtl8xxxu_gen1_disable_rf(struct rtl8xxxu_priv *priv); void rtl8xxxu_gen1_disable_rf(struct rtl8xxxu_priv *priv);

View File

@ -1784,6 +1784,11 @@ rtl8188e_update_rate_mask(struct rtl8xxxu_priv *priv,
rtl8188e_arfb_refresh(ra); rtl8188e_arfb_refresh(ra);
} }
static void rtl8188e_ra_set_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi)
{
priv->ra_info.rssi_sta_ra = rssi;
}
void rtl8188e_ra_info_init_all(struct rtl8xxxu_ra_info *ra) void rtl8188e_ra_info_init_all(struct rtl8xxxu_ra_info *ra)
{ {
ra->decision_rate = DESC_RATE_MCS7; ra->decision_rate = DESC_RATE_MCS7;
@ -1842,6 +1847,7 @@ struct rtl8xxxu_fileops rtl8188eu_fops = {
.set_tx_power = rtl8188f_set_tx_power, .set_tx_power = rtl8188f_set_tx_power,
.update_rate_mask = rtl8188e_update_rate_mask, .update_rate_mask = rtl8188e_update_rate_mask,
.report_connect = rtl8xxxu_gen2_report_connect, .report_connect = rtl8xxxu_gen2_report_connect,
.report_rssi = rtl8188e_ra_set_rssi,
.fill_txdesc = rtl8xxxu_fill_txdesc_v3, .fill_txdesc = rtl8xxxu_fill_txdesc_v3,
.set_crystal_cap = rtl8188f_set_crystal_cap, .set_crystal_cap = rtl8188f_set_crystal_cap,
.cck_rssi = rtl8188e_cck_rssi, .cck_rssi = rtl8188e_cck_rssi,

View File

@ -1732,6 +1732,7 @@ struct rtl8xxxu_fileops rtl8188fu_fops = {
.set_tx_power = rtl8188f_set_tx_power, .set_tx_power = rtl8188f_set_tx_power,
.update_rate_mask = rtl8xxxu_gen2_update_rate_mask, .update_rate_mask = rtl8xxxu_gen2_update_rate_mask,
.report_connect = rtl8xxxu_gen2_report_connect, .report_connect = rtl8xxxu_gen2_report_connect,
.report_rssi = rtl8xxxu_gen2_report_rssi,
.fill_txdesc = rtl8xxxu_fill_txdesc_v2, .fill_txdesc = rtl8xxxu_fill_txdesc_v2,
.set_crystal_cap = rtl8188f_set_crystal_cap, .set_crystal_cap = rtl8188f_set_crystal_cap,
.cck_rssi = rtl8188f_cck_rssi, .cck_rssi = rtl8188f_cck_rssi,

View File

@ -609,6 +609,7 @@ struct rtl8xxxu_fileops rtl8192cu_fops = {
.set_tx_power = rtl8xxxu_gen1_set_tx_power, .set_tx_power = rtl8xxxu_gen1_set_tx_power,
.update_rate_mask = rtl8xxxu_update_rate_mask, .update_rate_mask = rtl8xxxu_update_rate_mask,
.report_connect = rtl8xxxu_gen1_report_connect, .report_connect = rtl8xxxu_gen1_report_connect,
.report_rssi = rtl8xxxu_gen1_report_rssi,
.fill_txdesc = rtl8xxxu_fill_txdesc_v1, .fill_txdesc = rtl8xxxu_fill_txdesc_v1,
.cck_rssi = rtl8723a_cck_rssi, .cck_rssi = rtl8723a_cck_rssi,
.writeN_block_size = 128, .writeN_block_size = 128,

View File

@ -1784,6 +1784,7 @@ struct rtl8xxxu_fileops rtl8192eu_fops = {
.set_tx_power = rtl8192e_set_tx_power, .set_tx_power = rtl8192e_set_tx_power,
.update_rate_mask = rtl8xxxu_gen2_update_rate_mask, .update_rate_mask = rtl8xxxu_gen2_update_rate_mask,
.report_connect = rtl8xxxu_gen2_report_connect, .report_connect = rtl8xxxu_gen2_report_connect,
.report_rssi = rtl8xxxu_gen2_report_rssi,
.fill_txdesc = rtl8xxxu_fill_txdesc_v2, .fill_txdesc = rtl8xxxu_fill_txdesc_v2,
.set_crystal_cap = rtl8723a_set_crystal_cap, .set_crystal_cap = rtl8723a_set_crystal_cap,
.cck_rssi = rtl8192e_cck_rssi, .cck_rssi = rtl8192e_cck_rssi,

View File

@ -478,6 +478,7 @@ struct rtl8xxxu_fileops rtl8723au_fops = {
.set_tx_power = rtl8xxxu_gen1_set_tx_power, .set_tx_power = rtl8xxxu_gen1_set_tx_power,
.update_rate_mask = rtl8xxxu_update_rate_mask, .update_rate_mask = rtl8xxxu_update_rate_mask,
.report_connect = rtl8xxxu_gen1_report_connect, .report_connect = rtl8xxxu_gen1_report_connect,
.report_rssi = rtl8xxxu_gen1_report_rssi,
.fill_txdesc = rtl8xxxu_fill_txdesc_v1, .fill_txdesc = rtl8xxxu_fill_txdesc_v1,
.set_crystal_cap = rtl8723a_set_crystal_cap, .set_crystal_cap = rtl8723a_set_crystal_cap,
.cck_rssi = rtl8723a_cck_rssi, .cck_rssi = rtl8723a_cck_rssi,

View File

@ -1727,6 +1727,7 @@ struct rtl8xxxu_fileops rtl8723bu_fops = {
.set_tx_power = rtl8723b_set_tx_power, .set_tx_power = rtl8723b_set_tx_power,
.update_rate_mask = rtl8xxxu_gen2_update_rate_mask, .update_rate_mask = rtl8xxxu_gen2_update_rate_mask,
.report_connect = rtl8xxxu_gen2_report_connect, .report_connect = rtl8xxxu_gen2_report_connect,
.report_rssi = rtl8xxxu_gen2_report_rssi,
.fill_txdesc = rtl8xxxu_fill_txdesc_v2, .fill_txdesc = rtl8xxxu_fill_txdesc_v2,
.set_crystal_cap = rtl8723a_set_crystal_cap, .set_crystal_cap = rtl8723a_set_crystal_cap,
.cck_rssi = rtl8723b_cck_rssi, .cck_rssi = rtl8723b_cck_rssi,

View File

@ -4461,6 +4461,37 @@ void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.media_status_rpt)); rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.media_status_rpt));
} }
void rtl8xxxu_gen1_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi)
{
struct h2c_cmd h2c;
const int h2c_size = 4;
memset(&h2c, 0, sizeof(struct h2c_cmd));
h2c.rssi_report.cmd = H2C_SET_RSSI;
h2c.rssi_report.macid = macid;
h2c.rssi_report.rssi = rssi;
rtl8xxxu_gen1_h2c_cmd(priv, &h2c, h2c_size);
}
void rtl8xxxu_gen2_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi)
{
struct h2c_cmd h2c;
int h2c_size = sizeof(h2c.rssi_report);
if (priv->rtl_chip == RTL8723B)
h2c_size = 4;
memset(&h2c, 0, sizeof(struct h2c_cmd));
h2c.rssi_report.cmd = H2C_8723B_RSSI_SETTING;
h2c.rssi_report.macid = macid;
h2c.rssi_report.rssi = rssi;
rtl8xxxu_gen2_h2c_cmd(priv, &h2c, h2c_size);
}
void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv) void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv)
{ {
u8 agg_ctrl, usb_spec, page_thresh, timeout; u8 agg_ctrl, usb_spec, page_thresh, timeout;
@ -6697,6 +6728,9 @@ static void rtl8xxxu_watchdog_callback(struct work_struct *work)
signal = ieee80211_ave_rssi(vif); signal = ieee80211_ave_rssi(vif);
priv->fops->report_rssi(priv, 0,
rtl8xxxu_signal_to_snr(signal));
if (priv->fops->set_crystal_cap) if (priv->fops->set_crystal_cap)
rtl8xxxu_track_cfo(priv); rtl8xxxu_track_cfo(priv);