提交 9eb071f8 编写于 作者: C Chien-Hsun Liao 提交者: Kalle Valo

rtw88: recover rates of rate adaptive mechanism

Some APs like CMW270 only support one phyrate and the function
rtw_update_rate_mask could disable that rate. To fix such problem, we
restore the rate mask if we find that the rate_mask is empty.
Signed-off-by: NChien-Hsun Liao <ben.liao@realtek.com>
Signed-off-by: NKuan-Chung Chen <damon.chen@realtek.com>
Signed-off-by: NPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: NKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220208082427.42433-2-pkshih@realtek.com
上级 b478ff6b
...@@ -1020,37 +1020,52 @@ static u8 get_rate_id(u8 wireless_set, enum rtw_bandwidth bw_mode, u8 tx_num) ...@@ -1020,37 +1020,52 @@ static u8 get_rate_id(u8 wireless_set, enum rtw_bandwidth bw_mode, u8 tx_num)
#define RA_MASK_VHT_RATES (RA_MASK_VHT_RATES_1SS | \ #define RA_MASK_VHT_RATES (RA_MASK_VHT_RATES_1SS | \
RA_MASK_VHT_RATES_2SS | \ RA_MASK_VHT_RATES_2SS | \
RA_MASK_VHT_RATES_3SS) RA_MASK_VHT_RATES_3SS)
#define RA_MASK_CCK_IN_BG 0x00005
#define RA_MASK_CCK_IN_HT 0x00005 #define RA_MASK_CCK_IN_HT 0x00005
#define RA_MASK_CCK_IN_VHT 0x00005 #define RA_MASK_CCK_IN_VHT 0x00005
#define RA_MASK_OFDM_IN_VHT 0x00010 #define RA_MASK_OFDM_IN_VHT 0x00010
#define RA_MASK_OFDM_IN_HT_2G 0x00010 #define RA_MASK_OFDM_IN_HT_2G 0x00010
#define RA_MASK_OFDM_IN_HT_5G 0x00030 #define RA_MASK_OFDM_IN_HT_5G 0x00030
static u64 rtw_update_rate_mask(struct rtw_dev *rtwdev, static u64 rtw_rate_mask_rssi(struct rtw_sta_info *si, u8 wireless_set)
struct rtw_sta_info *si, {
u64 ra_mask, bool is_vht_enable, u8 rssi_level = si->rssi_level;
u8 wireless_set)
if (wireless_set == WIRELESS_CCK)
return 0xffffffffffffffffULL;
if (rssi_level == 0)
return 0xffffffffffffffffULL;
else if (rssi_level == 1)
return 0xfffffffffffffff0ULL;
else if (rssi_level == 2)
return 0xffffffffffffefe0ULL;
else if (rssi_level == 3)
return 0xffffffffffffcfc0ULL;
else if (rssi_level == 4)
return 0xffffffffffff8f80ULL;
else
return 0xffffffffffff0f00ULL;
}
static u64 rtw_rate_mask_recover(u64 ra_mask, u64 ra_mask_bak)
{
if ((ra_mask & ~(RA_MASK_CCK_RATES | RA_MASK_OFDM_RATES)) == 0)
ra_mask |= (ra_mask_bak & ~(RA_MASK_CCK_RATES | RA_MASK_OFDM_RATES));
if (ra_mask == 0)
ra_mask |= (ra_mask_bak & (RA_MASK_CCK_RATES | RA_MASK_OFDM_RATES));
return ra_mask;
}
static u64 rtw_rate_mask_cfg(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
u64 ra_mask, bool is_vht_enable)
{ {
struct rtw_hal *hal = &rtwdev->hal; struct rtw_hal *hal = &rtwdev->hal;
const struct cfg80211_bitrate_mask *mask = si->mask; const struct cfg80211_bitrate_mask *mask = si->mask;
u64 cfg_mask = GENMASK_ULL(63, 0); u64 cfg_mask = GENMASK_ULL(63, 0);
u8 rssi_level, band; u8 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;
}
if (!si->use_cfg_mask) if (!si->use_cfg_mask)
return ra_mask; return ra_mask;
...@@ -1100,6 +1115,7 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si) ...@@ -1100,6 +1115,7 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
u8 ldpc_en = 0; u8 ldpc_en = 0;
u8 tx_num = 1; u8 tx_num = 1;
u64 ra_mask = 0; u64 ra_mask = 0;
u64 ra_mask_bak = 0;
bool is_vht_enable = false; bool is_vht_enable = false;
bool is_support_sgi = false; bool is_support_sgi = false;
...@@ -1124,6 +1140,7 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si) ...@@ -1124,6 +1140,7 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
if (hal->current_band_type == RTW_BAND_5G) { if (hal->current_band_type == RTW_BAND_5G) {
ra_mask |= (u64)sta->supp_rates[NL80211_BAND_5GHZ] << 4; ra_mask |= (u64)sta->supp_rates[NL80211_BAND_5GHZ] << 4;
ra_mask_bak = ra_mask;
if (sta->vht_cap.vht_supported) { if (sta->vht_cap.vht_supported) {
ra_mask &= RA_MASK_VHT_RATES | RA_MASK_OFDM_IN_VHT; ra_mask &= RA_MASK_VHT_RATES | RA_MASK_OFDM_IN_VHT;
wireless_set = WIRELESS_OFDM | WIRELESS_VHT; wireless_set = WIRELESS_OFDM | WIRELESS_VHT;
...@@ -1136,6 +1153,7 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si) ...@@ -1136,6 +1153,7 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
dm_info->rrsr_val_init = RRSR_INIT_5G; dm_info->rrsr_val_init = RRSR_INIT_5G;
} else if (hal->current_band_type == RTW_BAND_2G) { } else if (hal->current_band_type == RTW_BAND_2G) {
ra_mask |= sta->supp_rates[NL80211_BAND_2GHZ]; ra_mask |= sta->supp_rates[NL80211_BAND_2GHZ];
ra_mask_bak = ra_mask;
if (sta->vht_cap.vht_supported) { if (sta->vht_cap.vht_supported) {
ra_mask &= RA_MASK_VHT_RATES | RA_MASK_CCK_IN_VHT | ra_mask &= RA_MASK_VHT_RATES | RA_MASK_CCK_IN_VHT |
RA_MASK_OFDM_IN_VHT; RA_MASK_OFDM_IN_VHT;
...@@ -1149,11 +1167,13 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si) ...@@ -1149,11 +1167,13 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
} else if (sta->supp_rates[0] <= 0xf) { } else if (sta->supp_rates[0] <= 0xf) {
wireless_set = WIRELESS_CCK; wireless_set = WIRELESS_CCK;
} else { } else {
ra_mask &= RA_MASK_OFDM_RATES | RA_MASK_CCK_IN_BG;
wireless_set = WIRELESS_CCK | WIRELESS_OFDM; wireless_set = WIRELESS_CCK | WIRELESS_OFDM;
} }
dm_info->rrsr_val_init = RRSR_INIT_2G; dm_info->rrsr_val_init = RRSR_INIT_2G;
} else { } else {
rtw_err(rtwdev, "Unknown band type\n"); rtw_err(rtwdev, "Unknown band type\n");
ra_mask_bak = ra_mask;
wireless_set = 0; wireless_set = 0;
} }
...@@ -1185,8 +1205,9 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si) ...@@ -1185,8 +1205,9 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
rate_id = get_rate_id(wireless_set, bw_mode, tx_num); rate_id = get_rate_id(wireless_set, bw_mode, tx_num);
ra_mask = rtw_update_rate_mask(rtwdev, si, ra_mask, is_vht_enable, ra_mask &= rtw_rate_mask_rssi(si, wireless_set);
wireless_set); ra_mask = rtw_rate_mask_recover(ra_mask, ra_mask_bak);
ra_mask = rtw_rate_mask_cfg(rtwdev, si, ra_mask, is_vht_enable);
si->bw_mode = bw_mode; si->bw_mode = bw_mode;
si->stbc_en = stbc_en; si->stbc_en = stbc_en;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册