On Tue, Oct 22, 2019 at 6:04 PM <[email protected]> wrote:
>
> From: Tzu-En Huang <[email protected]>
>
> Support setting bit rate from upper layer.
> After configuring the original rate control result in the driver, the
> result is then masked by the bit rate mask received from the ops
> set_bitrate_mask. Lastly, the masked result will be sent to firmware.
>
> Signed-off-by: Tzu-En Huang <[email protected]>
> Signed-off-by: Yan-Hsuan Chuang <[email protected]>
> ---
>
> v1 -> v2
> * No change
>
> v2 -> v3
> * use u64_encode_bits
>
> drivers/net/wireless/realtek/rtw88/mac80211.c | 53 +++++++++++++
> drivers/net/wireless/realtek/rtw88/main.c | 78 +++++++++++++++----
> drivers/net/wireless/realtek/rtw88/main.h | 3 +
> 3 files changed, 118 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c
> b/drivers/net/wireless/realtek/rtw88/mac80211.c
> index bc04cc280a96..2247bd61e716 100644
> --- a/drivers/net/wireless/realtek/rtw88/mac80211.c
> +++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
> @@ -684,6 +686,56 @@ static void rtw_ops_flush(struct ieee80211_hw *hw,
> mutex_unlock(&rtwdev->mutex);
> }
>
> +struct rtw_iter_bitrate_mask_data {
> + struct rtw_dev *rtwdev;
> + struct ieee80211_vif *vif;
> + const struct cfg80211_bitrate_mask *mask;
> +};
> +
> +static void rtw_ra_mask_info_update_iter(void *data, struct ieee80211_sta
> *sta)
> +{
> + struct rtw_iter_bitrate_mask_data *br_data = data;
> + struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
> +
> + if (si->vif != br_data->vif)
> + return;
> +
> + /* free previous mask setting */
> + kfree(si->mask);
You may want to do NULL check for si->mask before kfree.
> + si->mask = kmemdup(br_data->mask, sizeof(struct
> cfg80211_bitrate_mask),
> + GFP_ATOMIC);
> + if (!si->mask) {
> + si->use_cfg_mask = false;
> + return;
> + }
> +
> + si->use_cfg_mask = true;
> + rtw_update_sta_info(br_data->rtwdev, si);
> +}
> +
> diff --git a/drivers/net/wireless/realtek/rtw88/main.c
> b/drivers/net/wireless/realtek/rtw88/main.c
> index 47e74f0aec06..e53143132a9b 100644
> --- a/drivers/net/wireless/realtek/rtw88/main.c
> +++ b/drivers/net/wireless/realtek/rtw88/main.c
> @@ -612,12 +612,71 @@ static u8 get_rate_id(u8 wireless_set, enum
> rtw_bandwidth bw_mode, u8 tx_num)
> #define RA_MASK_OFDM_IN_HT_2G 0x00010
> #define RA_MASK_OFDM_IN_HT_5G 0x00030
>
> +static u64 rtw_update_rate_mask(struct rtw_dev *rtwdev,
> + struct rtw_sta_info *si,
> + u64 ra_mask, bool is_vht_enable,
> + u8 wireless_set)
> +{
> + struct rtw_hal *hal = &rtwdev->hal;
> + const struct cfg80211_bitrate_mask *mask = si->mask;
> + u64 cfg_mask = GENMASK(63, 0);
> + u8 rssi_level, band;
> +
> + if (wireless_set != WIRELESS_CCK) {
> + rssi_level = si->rssi_level;
> + if (rssi_level == 0)
> + ra_mask &= 0xffffffffffffffffULL;
> + else if (rssi_level == 1)
> + ra_mask &= 0xfffffffffffffff0ULL;
> + else if (rssi_level == 2)
> + ra_mask &= 0xffffffffffffefe0ULL;
> + else if (rssi_level == 3)
> + ra_mask &= 0xffffffffffffcfc0ULL;
> + else if (rssi_level == 4)
> + ra_mask &= 0xffffffffffff8f80ULL;
> + else if (rssi_level >= 5)
> + ra_mask &= 0xffffffffffff0f00ULL;
> + }
Would be better to enumerate rssi_level instead of 0 to 5. Does level
0 means bad rssi or good?
> --
> 2.17.1
>