mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-29 10:34:22 -04:00
wifi: rtw89: drop invalid TX rate report of legacy rate
Somehow, firmware could report invalid TX rate, and we consider the invalid rate as 0 that will make a wrong decision. So, drop invalid reports, and also suppress the warning message. Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Kalle Valo <kvalo@kernel.org> Link: https://lore.kernel.org/r/20220610072610.27095-9-pkshih@realtek.com
This commit is contained in:
@@ -155,18 +155,19 @@ static struct ieee80211_rate rtw89_bitrates[] = {
|
||||
{ .bitrate = 540, .hw_value = 0x0b, },
|
||||
};
|
||||
|
||||
u16 rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate)
|
||||
bool rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate, u16 *bitrate)
|
||||
{
|
||||
struct ieee80211_rate rate;
|
||||
|
||||
if (unlikely(rpt_rate >= ARRAY_SIZE(rtw89_bitrates))) {
|
||||
rtw89_info(rtwdev, "invalid rpt rate %d\n", rpt_rate);
|
||||
return 0;
|
||||
rtw89_debug(rtwdev, RTW89_DBG_UNEXP, "invalid rpt rate %d\n", rpt_rate);
|
||||
return false;
|
||||
}
|
||||
|
||||
rate = rtw89_bitrates[rpt_rate];
|
||||
*bitrate = rate.bitrate;
|
||||
|
||||
return rate.bitrate;
|
||||
return true;
|
||||
}
|
||||
|
||||
static struct ieee80211_supported_band rtw89_sband_2ghz = {
|
||||
|
||||
@@ -3914,7 +3914,7 @@ int rtw89_core_acquire_sta_ba_entry(struct rtw89_sta *rtwsta, u8 tid, u8 *cam_id
|
||||
int rtw89_core_release_sta_ba_entry(struct rtw89_sta *rtwsta, u8 tid, u8 *cam_idx);
|
||||
void rtw89_vif_type_mapping(struct ieee80211_vif *vif, bool assoc);
|
||||
int rtw89_chip_info_setup(struct rtw89_dev *rtwdev);
|
||||
u16 rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate);
|
||||
bool rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate, u16 *bitrate);
|
||||
int rtw89_regd_init(struct rtw89_dev *rtwdev,
|
||||
void (*reg_notifier)(struct wiphy *wiphy, struct regulatory_request *request));
|
||||
void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request);
|
||||
|
||||
@@ -1918,21 +1918,29 @@ static void rtw89_phy_c2h_ra_rpt_iter(void *data, struct ieee80211_sta *sta)
|
||||
struct rtw89_ra_report *ra_report = &rtwsta->ra_report;
|
||||
struct sk_buff *c2h = ra_data->c2h;
|
||||
u8 mode, rate, bw, giltf, mac_id;
|
||||
u16 legacy_bitrate;
|
||||
bool valid;
|
||||
|
||||
mac_id = RTW89_GET_PHY_C2H_RA_RPT_MACID(c2h->data);
|
||||
if (mac_id != rtwsta->mac_id)
|
||||
return;
|
||||
|
||||
memset(ra_report, 0, sizeof(*ra_report));
|
||||
|
||||
rate = RTW89_GET_PHY_C2H_RA_RPT_MCSNSS(c2h->data);
|
||||
bw = RTW89_GET_PHY_C2H_RA_RPT_BW(c2h->data);
|
||||
giltf = RTW89_GET_PHY_C2H_RA_RPT_GILTF(c2h->data);
|
||||
mode = RTW89_GET_PHY_C2H_RA_RPT_MD_SEL(c2h->data);
|
||||
|
||||
if (mode == RTW89_RA_RPT_MODE_LEGACY) {
|
||||
valid = rtw89_ra_report_to_bitrate(rtwdev, rate, &legacy_bitrate);
|
||||
if (!valid)
|
||||
return;
|
||||
}
|
||||
|
||||
memset(ra_report, 0, sizeof(*ra_report));
|
||||
|
||||
switch (mode) {
|
||||
case RTW89_RA_RPT_MODE_LEGACY:
|
||||
ra_report->txrate.legacy = rtw89_ra_report_to_bitrate(rtwdev, rate);
|
||||
ra_report->txrate.legacy = legacy_bitrate;
|
||||
break;
|
||||
case RTW89_RA_RPT_MODE_HT:
|
||||
ra_report->txrate.flags |= RATE_INFO_FLAGS_MCS;
|
||||
|
||||
Reference in New Issue
Block a user