diff mbox series

[v2,1/2] rtw88: follow the AP basic rates for tx mgmt frame

Message ID 20210422030413.9738-1-pkshih@realtek.com
State New
Headers show
Series [v2,1/2] rtw88: follow the AP basic rates for tx mgmt frame | expand

Commit Message

Ping-Ke Shih April 22, 2021, 3:04 a.m. UTC
From: Yu-Yen Ting <steventing@realtek.com>

By default the driver uses the 1M and 6M rate for managemnt frames
in 2G and 5G bands respectively. But when the basic rates is
configured from the mac80211, we need to send the management frames
according to the basic rates.

This commit makes the driver use the lowest basic rates to send
the management frames.

Signed-off-by: Yu-Yen Ting <steventing@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
v2: move debugfs as a separated patch
v1: the original patch is "[PATCH 2/7] rtw88: follow the AP basic rates for tx mgmt frame"
---
 drivers/net/wireless/realtek/rtw88/tx.c | 26 ++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

Comments

Ping-Ke Shih June 10, 2021, 3:03 a.m. UTC | #1
> -----Original Message-----

> From: Ping-Ke Shih [mailto:pkshih@realtek.com]

> Sent: Thursday, April 22, 2021 11:04 AM

> To: tony0620emma@gmail.com; kvalo@codeaurora.org

> Cc: linux-wireless@vger.kernel.org; Steven Ting

> Subject: [PATCH v2 1/2] rtw88: follow the AP basic rates for tx mgmt frame

> 

> From: Yu-Yen Ting <steventing@realtek.com>

> 

> By default the driver uses the 1M and 6M rate for managemnt frames

> in 2G and 5G bands respectively. But when the basic rates is

> configured from the mac80211, we need to send the management frames

> according to the basic rates.

> 

> This commit makes the driver use the lowest basic rates to send

> the management frames.

> 

> Signed-off-by: Yu-Yen Ting <steventing@realtek.com>

> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>

> ---

> v2: move debugfs as a separated patch

> v1: the original patch is "[PATCH 2/7] rtw88: follow the AP basic rates for tx mgmt frame"

> ---


[...]

Gentle ping.
The patchset v2 is separated into two patches. Is there any further suggestion?

--
Ping-Ke
Brian Norris June 11, 2021, 10:44 p.m. UTC | #2
On Thu, Apr 22, 2021 at 11:04:12AM +0800, Ping-Ke Shih wrote:
> From: Yu-Yen Ting <steventing@realtek.com>

> 

> By default the driver uses the 1M and 6M rate for managemnt frames

> in 2G and 5G bands respectively. But when the basic rates is

> configured from the mac80211, we need to send the management frames

> according to the basic rates.

> 

> This commit makes the driver use the lowest basic rates to send

> the management frames.

> 

> Signed-off-by: Yu-Yen Ting <steventing@realtek.com>

> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>

> ---

> v2: move debugfs as a separated patch

> v1: the original patch is "[PATCH 2/7] rtw88: follow the AP basic rates for tx mgmt frame"


FWIW:

Reviewed-by: Brian Norris <briannorris@chromium.org>

Tested-by: Brian Norris <briannorris@chromium.org>
diff mbox series

Patch

diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c
index 0193708fc013..e5949a775283 100644
--- a/drivers/net/wireless/realtek/rtw88/tx.c
+++ b/drivers/net/wireless/realtek/rtw88/tx.c
@@ -233,17 +233,33 @@  void rtw_tx_report_handle(struct rtw_dev *rtwdev, struct sk_buff *skb, int src)
 	spin_unlock_irqrestore(&tx_report->q_lock, flags);
 }
 
+static u8 rtw_get_mgmt_rate(struct rtw_dev *rtwdev, struct sk_buff *skb,
+			    u8 lowest_rate, bool ignore_rate)
+{
+	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
+	struct ieee80211_vif *vif = tx_info->control.vif;
+
+	if (!vif || !vif->bss_conf.basic_rates || ignore_rate)
+		return lowest_rate;
+
+	return __ffs(vif->bss_conf.basic_rates) + lowest_rate;
+}
+
 static void rtw_tx_pkt_info_update_rate(struct rtw_dev *rtwdev,
 					struct rtw_tx_pkt_info *pkt_info,
-					struct sk_buff *skb)
+					struct sk_buff *skb,
+					bool ignore_rate)
 {
 	if (rtwdev->hal.current_band_type == RTW_BAND_2G) {
 		pkt_info->rate_id = RTW_RATEID_B_20M;
-		pkt_info->rate = DESC_RATE1M;
+		pkt_info->rate = rtw_get_mgmt_rate(rtwdev, skb, DESC_RATE1M,
+						   ignore_rate);
 	} else {
 		pkt_info->rate_id = RTW_RATEID_G;
-		pkt_info->rate = DESC_RATE6M;
+		pkt_info->rate = rtw_get_mgmt_rate(rtwdev, skb, DESC_RATE6M,
+						   ignore_rate);
 	}
+
 	pkt_info->use_rate = true;
 	pkt_info->dis_rate_fallback = true;
 }
@@ -280,7 +296,7 @@  static void rtw_tx_mgmt_pkt_info_update(struct rtw_dev *rtwdev,
 					struct ieee80211_sta *sta,
 					struct sk_buff *skb)
 {
-	rtw_tx_pkt_info_update_rate(rtwdev, pkt_info, skb);
+	rtw_tx_pkt_info_update_rate(rtwdev, pkt_info, skb, false);
 	pkt_info->dis_qselseq = true;
 	pkt_info->en_hwseq = true;
 	pkt_info->hw_ssn_sel = 0;
@@ -404,7 +420,7 @@  void rtw_tx_rsvd_page_pkt_info_update(struct rtw_dev *rtwdev,
 	if (type != RSVD_BEACON && type != RSVD_DUMMY)
 		pkt_info->qsel = TX_DESC_QSEL_MGMT;
 
-	rtw_tx_pkt_info_update_rate(rtwdev, pkt_info, skb);
+	rtw_tx_pkt_info_update_rate(rtwdev, pkt_info, skb, true);
 
 	bmc = is_broadcast_ether_addr(hdr->addr1) ||
 	      is_multicast_ether_addr(hdr->addr1);