wifi: rtl8xxxu: Report the RSSI to the firmware
authorBitterblue Smith <rtl8821cerfe2@gmail.com>
Sun, 8 Jan 2023 15:06:43 +0000 (17:06 +0200)
committerKalle Valo <kvalo@kernel.org>
Mon, 16 Jan 2023 16:27:05 +0000 (18:27 +0200)
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
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192c.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c

index be9479f..9026847 100644 (file)
@@ -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);
index 37658a0..08f3b93 100644 (file)
@@ -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,
index f5a0c7a..af6e2c8 100644 (file)
@@ -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,
index 8981a86..e61d65c 100644 (file)
@@ -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,
index ca16886..4a1c9bc 100644 (file)
@@ -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,
index e881ee3..5ed523d 100644 (file)
@@ -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,
index 0ed667d..21613d6 100644 (file)
@@ -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,
index 03ffb99..edf9bfb 100644 (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));
 }
 
+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);