]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
rtw88: fix short GI capability based on current bandwidth
authorTsang-Shian Lin <thlin@realtek.com>
Fri, 17 Jul 2020 06:49:32 +0000 (14:49 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 Aug 2020 06:16:19 +0000 (08:16 +0200)
[ 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

index 88e2252bf8a2bc37474802b492c7c6a5717fbfb3..15c7a6fc37b90397ebdf2f1152c837c9f2a6233c 100644 (file)
@@ -553,8 +553,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);
@@ -562,9 +560,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)
@@ -606,12 +601,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;
        }