mirror of https://gitee.com/openkylin/linux.git
rtw88: fix short GI capability based on current bandwidth
Fix the transmission is not sent with short GI under
some conditions even if the receiver supports short GI.
If VHT capability IE exists in the beacon, the original
code uses the short GI for 80M field as driver's short GI
setting for transmission, even the current bandwidth is
not 80MHz.
Short GI supported fields for 20M/40M are informed in HT
capability information element, and short GI supported
field for 80M is informed in VHT capability information
element.
These three fields may be set to different values.
Driver needs to record each short GI support field for
each bandwidth, and send correct info depends on current
bandwidth to the WiFi firmware.
Fixes: e3037485c6
("rtw88: new Realtek 802.11ac driver")
Signed-off-by: Tsang-Shian Lin <thlin@realtek.com>
Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20200717064937.27966-3-yhchuang@realtek.com
This commit is contained in:
parent
ae44fa993e
commit
4dd86b901d
|
@ -722,8 +722,6 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
|
|||
stbc_en = VHT_STBC_EN;
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
|
||||
ldpc_en = VHT_LDPC_EN;
|
||||
if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
|
||||
is_support_sgi = true;
|
||||
} else if (sta->ht_cap.ht_supported) {
|
||||
ra_mask |= (sta->ht_cap.mcs.rx_mask[1] << 20) |
|
||||
(sta->ht_cap.mcs.rx_mask[0] << 12);
|
||||
|
@ -731,9 +729,6 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
|
|||
stbc_en = HT_STBC_EN;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
|
||||
ldpc_en = HT_LDPC_EN;
|
||||
if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20 ||
|
||||
sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
|
||||
is_support_sgi = true;
|
||||
}
|
||||
|
||||
if (efuse->hw_cap.nss == 1)
|
||||
|
@ -775,12 +770,18 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
|
|||
switch (sta->bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_80:
|
||||
bw_mode = RTW_CHANNEL_WIDTH_80;
|
||||
is_support_sgi = sta->vht_cap.vht_supported &&
|
||||
(sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
|
||||
break;
|
||||
case IEEE80211_STA_RX_BW_40:
|
||||
bw_mode = RTW_CHANNEL_WIDTH_40;
|
||||
is_support_sgi = sta->ht_cap.ht_supported &&
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
|
||||
break;
|
||||
default:
|
||||
bw_mode = RTW_CHANNEL_WIDTH_20;
|
||||
is_support_sgi = sta->ht_cap.ht_supported &&
|
||||
(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue