Takashi Iwai f20d34
From 76c16af2cb10282274596e21add2c9f0b95c941b Mon Sep 17 00:00:00 2001
Takashi Iwai f20d34
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Takashi Iwai f20d34
Date: Thu, 1 Dec 2022 16:15:08 +0200
Takashi Iwai f20d34
Subject: [PATCH] wifi: rtl8xxxu: Fix the channel width reporting
Takashi Iwai f20d34
Git-commit: 76c16af2cb10282274596e21add2c9f0b95c941b
Takashi Iwai f20d34
Patch-mainline: v6.2-rc1
Takashi Iwai f20d34
References: git-fixes
Takashi Iwai f20d34
Takashi Iwai f20d34
The gen 2 chips RTL8192EU and RTL8188FU periodically send the driver
Takashi Iwai f20d34
reports about the TX rate, and the driver passes these reports to
Takashi Iwai f20d34
sta_statistics. The reports from RTL8192EU may or may not include the
Takashi Iwai f20d34
channel width. The reports from RTL8188FU do not include it.
Takashi Iwai f20d34
Takashi Iwai f20d34
Only access the c2h->ra_report.bw field if the report (skb) is big
Takashi Iwai f20d34
enough.
Takashi Iwai f20d34
Takashi Iwai f20d34
The other problem fixed here is that the code was actually never
Takashi Iwai f20d34
changing the channel width initially reported by
Takashi Iwai f20d34
rtl8xxxu_bss_info_changed because the value of RATE_INFO_BW_20 is 0.
Takashi Iwai f20d34
Takashi Iwai f20d34
Fixes: 0985d3a410ac ("rtl8xxxu: Feed current txrate information for mac80211")
Takashi Iwai f20d34
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Takashi Iwai f20d34
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
Takashi Iwai f20d34
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Takashi Iwai f20d34
Link: https://lore.kernel.org/r/5b41f1ae-72e7-6b7a-2459-b736399a1c40@gmail.com
Takashi Iwai f20d34
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai f20d34
Takashi Iwai f20d34
---
Takashi Iwai f20d34
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 10 +++++++---
Takashi Iwai f20d34
 1 file changed, 7 insertions(+), 3 deletions(-)
Takashi Iwai f20d34
Takashi Iwai f20d34
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
Takashi Iwai f20d34
index 28f136064297..7ca46fb77a3b 100644
Takashi Iwai f20d34
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
Takashi Iwai f20d34
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
Takashi Iwai f20d34
@@ -5569,7 +5569,6 @@ static void rtl8xxxu_c2hcmd_callback(struct work_struct *work)
Takashi Iwai f20d34
 			rarpt->txrate.flags = 0;
Takashi Iwai f20d34
 			rate = c2h->ra_report.rate;
Takashi Iwai f20d34
 			sgi = c2h->ra_report.sgi;
Takashi Iwai f20d34
-			bw = c2h->ra_report.bw;
Takashi Iwai f20d34
 
Takashi Iwai f20d34
 			if (rate < DESC_RATE_MCS0) {
Takashi Iwai f20d34
 				rarpt->txrate.legacy =
Takashi Iwai f20d34
@@ -5586,8 +5585,13 @@ static void rtl8xxxu_c2hcmd_callback(struct work_struct *work)
Takashi Iwai f20d34
 						RATE_INFO_FLAGS_SHORT_GI;
Takashi Iwai f20d34
 				}
Takashi Iwai f20d34
 
Takashi Iwai f20d34
-				if (bw == RATE_INFO_BW_20)
Takashi Iwai f20d34
-					rarpt->txrate.bw |= RATE_INFO_BW_20;
Takashi Iwai f20d34
+				if (skb->len >= offsetofend(typeof(*c2h), ra_report.bw)) {
Takashi Iwai f20d34
+					if (c2h->ra_report.bw == RTL8XXXU_CHANNEL_WIDTH_40)
Takashi Iwai f20d34
+						bw = RATE_INFO_BW_40;
Takashi Iwai f20d34
+					else
Takashi Iwai f20d34
+						bw = RATE_INFO_BW_20;
Takashi Iwai f20d34
+					rarpt->txrate.bw = bw;
Takashi Iwai f20d34
+				}
Takashi Iwai f20d34
 			}
Takashi Iwai f20d34
 			bit_rate = cfg80211_calculate_bitrate(&rarpt->txrate);
Takashi Iwai f20d34
 			rarpt->bit_rate = bit_rate;
Takashi Iwai f20d34
-- 
Takashi Iwai f20d34
2.35.3
Takashi Iwai f20d34