rtw88: add ieee80211:sta_rc_update ops
authorPo-Hao Huang <phhuang@realtek.com>
Thu, 7 Apr 2022 09:58:53 +0000 (17:58 +0800)
committerKalle Valo <kvalo@kernel.org>
Tue, 12 Apr 2022 13:52:05 +0000 (16:52 +0300)
Adding this allows us to get notification when bitrate configuration
of the station changes. Update according parameters to firmware so
the rate control algorithm can work properly.

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220407095858.46807-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw88/fw.c
drivers/net/wireless/realtek/rtw88/fw.h
drivers/net/wireless/realtek/rtw88/mac80211.c
drivers/net/wireless/realtek/rtw88/main.c
drivers/net/wireless/realtek/rtw88/main.h
drivers/net/wireless/realtek/rtw88/phy.c

index aa2aeb5..941df27 100644 (file)
@@ -585,10 +585,10 @@ void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
        rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
 }
 
-void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
+void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
+                        bool reset_ra_mask)
 {
        u8 h2c_pkt[H2C_PKT_SIZE] = {0};
-       bool no_update = si->updated;
        bool disable_pt = true;
 
        SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_RA_INFO);
@@ -599,7 +599,7 @@ void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
        SET_RA_INFO_SGI_EN(h2c_pkt, si->sgi_enable);
        SET_RA_INFO_BW_MODE(h2c_pkt, si->bw_mode);
        SET_RA_INFO_LDPC(h2c_pkt, !!si->ldpc_en);
-       SET_RA_INFO_NO_UPDATE(h2c_pkt, no_update);
+       SET_RA_INFO_NO_UPDATE(h2c_pkt, !reset_ra_mask);
        SET_RA_INFO_VHT_EN(h2c_pkt, si->vht_enable);
        SET_RA_INFO_DIS_PT(h2c_pkt, disable_pt);
        SET_RA_INFO_RA_MASK0(h2c_pkt, (si->ra_mask & 0xff));
@@ -608,7 +608,6 @@ void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
        SET_RA_INFO_RA_MASK3(h2c_pkt, (si->ra_mask & 0xff000000) >> 24);
 
        si->init_ra_lv = 0;
-       si->updated = true;
 
        rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
 }
index b59d2cb..3486eb9 100644 (file)
@@ -791,7 +791,8 @@ void rtw_fw_coex_query_hid_info(struct rtw_dev *rtwdev, u8 sub_id, u8 data);
 
 void rtw_fw_bt_wifi_control(struct rtw_dev *rtwdev, u8 op_code, u8 *data);
 void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
-void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
+void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
+                        bool reset_ra_mask);
 void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool conn);
 void rtw_fw_update_wl_phy_info(struct rtw_dev *rtwdev);
 void rtw_fw_beacon_filter_config(struct rtw_dev *rtwdev, bool connect,
index 5cdc54c..c9341af 100644 (file)
@@ -694,7 +694,7 @@ static void rtw_ra_mask_info_update_iter(void *data, struct ieee80211_sta *sta)
        }
 
        si->use_cfg_mask = true;
-       rtw_update_sta_info(br_data->rtwdev, si);
+       rtw_update_sta_info(br_data->rtwdev, si, true);
 }
 
 static void rtw_ra_mask_info_update(struct rtw_dev *rtwdev,
@@ -850,6 +850,17 @@ static int rtw_ops_set_sar_specs(struct ieee80211_hw *hw,
        return 0;
 }
 
+static void rtw_ops_sta_rc_update(struct ieee80211_hw *hw,
+                                 struct ieee80211_vif *vif,
+                                 struct ieee80211_sta *sta, u32 changed)
+{
+       struct rtw_dev *rtwdev = hw->priv;
+       struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
+
+       if (changed & IEEE80211_RC_BW_CHANGED)
+               rtw_update_sta_info(rtwdev, si, true);
+}
+
 const struct ieee80211_ops rtw_ops = {
        .tx                     = rtw_ops_tx,
        .wake_tx_queue          = rtw_ops_wake_tx_queue,
@@ -879,6 +890,7 @@ const struct ieee80211_ops rtw_ops = {
        .reconfig_complete      = rtw_reconfig_complete,
        .hw_scan                = rtw_ops_hw_scan,
        .cancel_hw_scan         = rtw_ops_cancel_hw_scan,
+       .sta_rc_update          = rtw_ops_sta_rc_update,
        .set_sar_specs          = rtw_ops_set_sar_specs,
 #ifdef CONFIG_PM
        .suspend                = rtw_ops_suspend,
index 1a4c8c9..66b6c14 100644 (file)
@@ -313,7 +313,7 @@ int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
        for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
                rtw_txq_init(rtwdev, sta->txq[i]);
 
-       rtw_update_sta_info(rtwdev, si);
+       rtw_update_sta_info(rtwdev, si, true);
        rtw_fw_media_status_report(rtwdev, si->mac_id, true);
 
        rtwdev->sta_cnt++;
@@ -1105,7 +1105,8 @@ static u64 rtw_rate_mask_cfg(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
        return ra_mask;
 }
 
-void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
+void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
+                        bool reset_ra_mask)
 {
        struct rtw_dm_info *dm_info = &rtwdev->dm_info;
        struct ieee80211_sta *sta = si->sta;
@@ -1223,7 +1224,7 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
        si->ra_mask = ra_mask;
        si->rate_id = rate_id;
 
-       rtw_fw_send_ra_info(rtwdev, si);
+       rtw_fw_send_ra_info(rtwdev, si, reset_ra_mask);
 }
 
 static int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
index 17815af..f694a2d 100644 (file)
@@ -753,7 +753,6 @@ struct rtw_sta_info {
        u8 ldpc_en:2;
        bool sgi_enable;
        bool vht_enable;
-       bool updated;
        u8 init_ra_lv;
        u64 ra_mask;
 
@@ -2145,7 +2144,8 @@ void rtw_chip_prepare_tx(struct rtw_dev *rtwdev);
 void rtw_vif_port_config(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif,
                         u32 config);
 void rtw_tx_report_purge_timer(struct timer_list *t);
-void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
+void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
+                        bool reset_ra_mask);
 void rtw_core_scan_start(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif,
                         const u8 *mac_addr, bool hw_scan);
 void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
index e505d17..8982e0c 100644 (file)
@@ -536,7 +536,7 @@ static void rtw_phy_ra_info_update_iter(void *data, struct ieee80211_sta *sta)
        struct rtw_dev *rtwdev = data;
        struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
 
-       rtw_update_sta_info(rtwdev, si);
+       rtw_update_sta_info(rtwdev, si, false);
 }
 
 static void rtw_phy_ra_info_update(struct rtw_dev *rtwdev)