| From 7b9fd020ffee9e341e1e7840f84fc5386edb6dcb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 17 Jul 2020 14:49:32 +0800 |
| Subject: rtw88: fix short GI capability based on current bandwidth |
| |
| From: Tsang-Shian Lin <thlin@realtek.com> |
| |
| [ Upstream commit 4dd86b901d1373ef8446ecb50a7ca009f3475211 ] |
| |
| 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: e3037485c68e ("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 |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/wireless/realtek/rtw88/main.c | 11 ++++++----- |
| 1 file changed, 6 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c |
| index 7640e97706f52..72fe026e8a3c9 100644 |
| --- a/drivers/net/wireless/realtek/rtw88/main.c |
| +++ b/drivers/net/wireless/realtek/rtw88/main.c |
| @@ -703,8 +703,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); |
| @@ -712,9 +710,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) |
| @@ -756,12 +751,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; |
| } |
| |
| -- |
| 2.25.1 |
| |