mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 18:13:04 +00:00
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:
parent
ebe8dee7ae
commit
3922dc9fbd
@ -1168,6 +1168,26 @@ struct h2c_cmd {
|
||||
u8 cmd;
|
||||
u8 data;
|
||||
} __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);
|
||||
void (*report_connect) (struct rtl8xxxu_priv *priv,
|
||||
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,
|
||||
struct ieee80211_tx_info *tx_info,
|
||||
struct rtl8xxxu_txdesc32 *tx_desc, bool sgi,
|
||||
@ -1686,6 +1707,8 @@ void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
|
||||
u8 macid, bool connect);
|
||||
void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
|
||||
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_enable_rf(struct rtl8xxxu_priv *priv);
|
||||
void rtl8xxxu_gen1_disable_rf(struct rtl8xxxu_priv *priv);
|
||||
|
@ -1784,6 +1784,11 @@ rtl8188e_update_rate_mask(struct rtl8xxxu_priv *priv,
|
||||
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)
|
||||
{
|
||||
ra->decision_rate = DESC_RATE_MCS7;
|
||||
@ -1842,6 +1847,7 @@ struct rtl8xxxu_fileops rtl8188eu_fops = {
|
||||
.set_tx_power = rtl8188f_set_tx_power,
|
||||
.update_rate_mask = rtl8188e_update_rate_mask,
|
||||
.report_connect = rtl8xxxu_gen2_report_connect,
|
||||
.report_rssi = rtl8188e_ra_set_rssi,
|
||||
.fill_txdesc = rtl8xxxu_fill_txdesc_v3,
|
||||
.set_crystal_cap = rtl8188f_set_crystal_cap,
|
||||
.cck_rssi = rtl8188e_cck_rssi,
|
||||
|
@ -1732,6 +1732,7 @@ struct rtl8xxxu_fileops rtl8188fu_fops = {
|
||||
.set_tx_power = rtl8188f_set_tx_power,
|
||||
.update_rate_mask = rtl8xxxu_gen2_update_rate_mask,
|
||||
.report_connect = rtl8xxxu_gen2_report_connect,
|
||||
.report_rssi = rtl8xxxu_gen2_report_rssi,
|
||||
.fill_txdesc = rtl8xxxu_fill_txdesc_v2,
|
||||
.set_crystal_cap = rtl8188f_set_crystal_cap,
|
||||
.cck_rssi = rtl8188f_cck_rssi,
|
||||
|
@ -609,6 +609,7 @@ struct rtl8xxxu_fileops rtl8192cu_fops = {
|
||||
.set_tx_power = rtl8xxxu_gen1_set_tx_power,
|
||||
.update_rate_mask = rtl8xxxu_update_rate_mask,
|
||||
.report_connect = rtl8xxxu_gen1_report_connect,
|
||||
.report_rssi = rtl8xxxu_gen1_report_rssi,
|
||||
.fill_txdesc = rtl8xxxu_fill_txdesc_v1,
|
||||
.cck_rssi = rtl8723a_cck_rssi,
|
||||
.writeN_block_size = 128,
|
||||
|
@ -1784,6 +1784,7 @@ struct rtl8xxxu_fileops rtl8192eu_fops = {
|
||||
.set_tx_power = rtl8192e_set_tx_power,
|
||||
.update_rate_mask = rtl8xxxu_gen2_update_rate_mask,
|
||||
.report_connect = rtl8xxxu_gen2_report_connect,
|
||||
.report_rssi = rtl8xxxu_gen2_report_rssi,
|
||||
.fill_txdesc = rtl8xxxu_fill_txdesc_v2,
|
||||
.set_crystal_cap = rtl8723a_set_crystal_cap,
|
||||
.cck_rssi = rtl8192e_cck_rssi,
|
||||
|
@ -478,6 +478,7 @@ struct rtl8xxxu_fileops rtl8723au_fops = {
|
||||
.set_tx_power = rtl8xxxu_gen1_set_tx_power,
|
||||
.update_rate_mask = rtl8xxxu_update_rate_mask,
|
||||
.report_connect = rtl8xxxu_gen1_report_connect,
|
||||
.report_rssi = rtl8xxxu_gen1_report_rssi,
|
||||
.fill_txdesc = rtl8xxxu_fill_txdesc_v1,
|
||||
.set_crystal_cap = rtl8723a_set_crystal_cap,
|
||||
.cck_rssi = rtl8723a_cck_rssi,
|
||||
|
@ -1727,6 +1727,7 @@ struct rtl8xxxu_fileops rtl8723bu_fops = {
|
||||
.set_tx_power = rtl8723b_set_tx_power,
|
||||
.update_rate_mask = rtl8xxxu_gen2_update_rate_mask,
|
||||
.report_connect = rtl8xxxu_gen2_report_connect,
|
||||
.report_rssi = rtl8xxxu_gen2_report_rssi,
|
||||
.fill_txdesc = rtl8xxxu_fill_txdesc_v2,
|
||||
.set_crystal_cap = rtl8723a_set_crystal_cap,
|
||||
.cck_rssi = rtl8723b_cck_rssi,
|
||||
|
@ -4461,6 +4461,37 @@ void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
priv->fops->report_rssi(priv, 0,
|
||||
rtl8xxxu_signal_to_snr(signal));
|
||||
|
||||
if (priv->fops->set_crystal_cap)
|
||||
rtl8xxxu_track_cfo(priv);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user