|
Oliver Neukum |
b77eb8 |
From 512b191d965237249999b3c58600fe50356ab323 Mon Sep 17 00:00:00 2001
|
|
Oliver Neukum |
b77eb8 |
From: Loic Poulain <loic.poulain@linaro.org>
|
|
Oliver Neukum |
b77eb8 |
Date: Fri, 24 Jul 2020 12:20:50 +0200
|
|
Oliver Neukum |
b77eb8 |
Subject: [PATCH] wcn36xx: Fix TX data path
|
|
Oliver Neukum |
b77eb8 |
Git-commit: 512b191d965237249999b3c58600fe50356ab323
|
|
Oliver Neukum |
b77eb8 |
References: git-fixes
|
|
Oliver Neukum |
b77eb8 |
Patch-mainline: v5.10-rc1
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
This patch contains the following fixes:
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
- Use correct queue for submitting QoS packet. The queue id to use
|
|
Oliver Neukum |
b77eb8 |
is a one-to-one mapping with the TID.
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
- Don't encrypt a frame with IEEE80211_TX_INTFL_DONT_ENCRYPT flag.
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
- Use the 'special queue' for null packets, preventing the firmware
|
|
Oliver Neukum |
b77eb8 |
to submit it as AMPDU.
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
|
|
Oliver Neukum |
b77eb8 |
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
|
Oliver Neukum |
b77eb8 |
Link: https://lore.kernel.org/r/1595586052-16081-5-git-send-email-loic.poulain@linaro.org
|
|
Oliver Neukum |
b77eb8 |
Signed-off-by: Oliver Neukum <oneukum@suse.com>
|
|
Oliver Neukum |
b77eb8 |
---
|
|
Oliver Neukum |
b77eb8 |
drivers/net/wireless/ath/wcn36xx/txrx.c | 23 +++++++++++++++++------
|
|
Oliver Neukum |
b77eb8 |
1 file changed, 17 insertions(+), 6 deletions(-)
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
--- a/drivers/net/wireless/ath/wcn36xx/txrx.c
|
|
Oliver Neukum |
b77eb8 |
+++ b/drivers/net/wireless/ath/wcn36xx/txrx.c
|
|
Oliver Neukum |
b77eb8 |
@@ -267,9 +267,11 @@ static void wcn36xx_set_tx_data(struct w
|
|
Oliver Neukum |
b77eb8 |
bool bcast)
|
|
Oliver Neukum |
b77eb8 |
{
|
|
Oliver Neukum |
b77eb8 |
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
|
Oliver Neukum |
b77eb8 |
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
Oliver Neukum |
b77eb8 |
struct ieee80211_vif *vif = NULL;
|
|
Oliver Neukum |
b77eb8 |
struct wcn36xx_vif *__vif_priv = NULL;
|
|
Oliver Neukum |
b77eb8 |
- bool is_data_qos;
|
|
Oliver Neukum |
b77eb8 |
+ bool is_data_qos = ieee80211_is_data_qos(hdr->frame_control);
|
|
Oliver Neukum |
b77eb8 |
+ u16 tid = 0;
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
bd->bd_rate = WCN36XX_BD_RATE_DATA;
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
@@ -297,10 +299,21 @@ static void wcn36xx_set_tx_data(struct w
|
|
Oliver Neukum |
b77eb8 |
bd->dpu_desc_idx = __vif_priv->self_dpu_desc_index;
|
|
Oliver Neukum |
b77eb8 |
bd->dpu_sign = __vif_priv->self_ucast_dpu_sign;
|
|
Oliver Neukum |
b77eb8 |
}
|
|
Oliver Neukum |
b77eb8 |
+ if (is_data_qos) {
|
|
Oliver Neukum |
b77eb8 |
+ tid = ieee80211_get_tid(hdr);
|
|
Oliver Neukum |
b77eb8 |
+ /* TID->QID is one-to-one mapping */
|
|
Oliver Neukum |
b77eb8 |
+ bd->queue_id = tid;
|
|
Oliver Neukum |
b77eb8 |
+ }
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
- if (ieee80211_is_nullfunc(hdr->frame_control) ||
|
|
Oliver Neukum |
b77eb8 |
- (sta_priv && !sta_priv->is_data_encrypted))
|
|
Oliver Neukum |
b77eb8 |
+ if (info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT ||
|
|
Oliver Neukum |
b77eb8 |
+ (sta_priv && !sta_priv->is_data_encrypted)) {
|
|
Oliver Neukum |
b77eb8 |
bd->dpu_ne = 1;
|
|
Oliver Neukum |
b77eb8 |
+ }
|
|
Oliver Neukum |
b77eb8 |
+
|
|
Oliver Neukum |
b77eb8 |
+ if (ieee80211_is_any_nullfunc(hdr->frame_control)) {
|
|
Oliver Neukum |
b77eb8 |
+ /* Don't use a regular queue for null packet (no ampdu) */
|
|
Oliver Neukum |
b77eb8 |
+ bd->queue_id = WCN36XX_TX_U_WQ_ID;
|
|
Oliver Neukum |
b77eb8 |
+ }
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
if (bcast) {
|
|
Oliver Neukum |
b77eb8 |
bd->ub = 1;
|
|
Oliver Neukum |
b77eb8 |
@@ -308,13 +321,11 @@ static void wcn36xx_set_tx_data(struct w
|
|
Oliver Neukum |
b77eb8 |
}
|
|
Oliver Neukum |
b77eb8 |
*vif_priv = __vif_priv;
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
- is_data_qos = ieee80211_is_data_qos(hdr->frame_control);
|
|
Oliver Neukum |
b77eb8 |
-
|
|
Oliver Neukum |
b77eb8 |
wcn36xx_set_tx_pdu(bd,
|
|
Oliver Neukum |
b77eb8 |
is_data_qos ?
|
|
Oliver Neukum |
b77eb8 |
sizeof(struct ieee80211_qos_hdr) :
|
|
Oliver Neukum |
b77eb8 |
sizeof(struct ieee80211_hdr_3addr),
|
|
Oliver Neukum |
b77eb8 |
- skb->len, sta_priv ? sta_priv->tid : 0);
|
|
Oliver Neukum |
b77eb8 |
+ skb->len, tid);
|
|
Oliver Neukum |
b77eb8 |
|
|
Oliver Neukum |
b77eb8 |
if (sta_priv && is_data_qos)
|
|
Oliver Neukum |
b77eb8 |
wcn36xx_tx_start_ampdu(wcn, sta_priv, skb);
|