mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 1/2] wifi: rtw88: allow driver-owned TX buffers to bypass mac80211 TX status
       [not found] <20261029060859.90002-1-hjf3108@gmail.com>
@ 2026-10-29  6:08 ` Ho Jie Feng
  2026-10-29  6:08 ` [PATCH 2/2] wifi: rtw88: usb: don't report the aggregation buffer as a frame Ho Jie Feng
  1 sibling, 0 replies; 2+ messages in thread
From: Ho Jie Feng @ 2026-10-29  6:08 UTC (permalink / raw)
  To: Ping-Ke Shih; +Cc: linux-wireless, Ho Jie Feng, linux-kernel

Add a flag so that the driver can flag certain frames that
skip reporting back to mac80211. This is used for driver
generated frames that aren't a TX from mac80211.

Signed-off-by: Ho Jie Feng <hjf3108@gmail.com>
---
 drivers/net/wireless/realtek/rtw88/main.h | 1 +
 drivers/net/wireless/realtek/rtw88/pci.c  | 6 ++++++
 drivers/net/wireless/realtek/rtw88/pci.h  | 1 +
 drivers/net/wireless/realtek/rtw88/sdio.c | 6 ++++++
 drivers/net/wireless/realtek/rtw88/sdio.h | 1 +
 drivers/net/wireless/realtek/rtw88/usb.c  | 6 ++++++
 drivers/net/wireless/realtek/rtw88/usb.h  | 1 +
 7 files changed, 22 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
index d59f6e323adf0..7bd2e224e845b 100644
--- a/drivers/net/wireless/realtek/rtw88/main.h
+++ b/drivers/net/wireless/realtek/rtw88/main.h
@@ -637,6 +637,7 @@ struct rtw_tx_pkt_info {
 	u8 hw_ssn_sel;
 	bool nav_use_hdr;
 	bool bt_null;
+	bool drv_frame;
 };
 
 struct rtw_rx_pkt_stat {
diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
index 66d2e5f514447..5f6df521e9c16 100644
--- a/drivers/net/wireless/realtek/rtw88/pci.c
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
@@ -848,6 +848,7 @@ static int rtw_pci_tx_write_data(struct rtw_dev *rtwdev,
 	tx_data = rtw_pci_get_tx_data(skb);
 	tx_data->dma = dma;
 	tx_data->sn = pkt_info->sn;
+	tx_data->drv_frame = pkt_info->drv_frame;
 
 	spin_lock_bh(&rtwpci->irq_lock);
 
@@ -992,6 +993,11 @@ static void rtw_pci_tx_isr(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci,
 
 		skb_pull(skb, rtwdev->chip->tx_pkt_desc_sz);
 
+		if (tx_data->drv_frame) {
+			dev_kfree_skb_irq(skb);
+			continue;
+		}
+
 		info = IEEE80211_SKB_CB(skb);
 
 		/* enqueue to wait for tx report */
diff --git a/drivers/net/wireless/realtek/rtw88/pci.h b/drivers/net/wireless/realtek/rtw88/pci.h
index 8ffdea11378f0..37d90caf8269c 100644
--- a/drivers/net/wireless/realtek/rtw88/pci.h
+++ b/drivers/net/wireless/realtek/rtw88/pci.h
@@ -171,6 +171,7 @@ struct rtw_pci_tx_buffer_desc {
 struct rtw_pci_tx_data {
 	dma_addr_t dma;
 	u8 sn;
+	bool drv_frame;
 };
 
 struct rtw_pci_ring {
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
index dc2fd0f8f9fff..6666aa5245d70 100644
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
@@ -1312,6 +1312,7 @@ static int rtw_sdio_tx_write(struct rtw_dev *rtwdev,
 
 	tx_data = rtw_sdio_get_tx_data(skb);
 	tx_data->sn = pkt_info->sn;
+	tx_data->drv_frame = pkt_info->drv_frame;
 
 	/* The TX worker may already have freed the skb, so do not touch it. */
 	skb_queue_tail(&rtwsdio->tx_queue[queue], skb);
@@ -1604,6 +1605,11 @@ static void rtw_sdio_indicate_tx_status(struct rtw_dev *rtwdev,
 
 	skb_pull(skb, rtwdev->chip->tx_pkt_desc_sz);
 
+	if (tx_data->drv_frame) {
+		dev_kfree_skb_any(skb);
+		return;
+	}
+
 	/* enqueue to wait for tx report */
 	if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) {
 		rtw_tx_report_enqueue(rtwdev, skb, tx_data->sn);
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.h b/drivers/net/wireless/realtek/rtw88/sdio.h
index 6e7e6009744b0..19852077326a4 100644
--- a/drivers/net/wireless/realtek/rtw88/sdio.h
+++ b/drivers/net/wireless/realtek/rtw88/sdio.h
@@ -153,6 +153,7 @@ struct sdio_device_id;
 
 struct rtw_sdio_tx_data {
 	u8 sn;
+	bool drv_frame;
 };
 
 struct rtw_sdio_work_data {
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
index 715a2ce342d92..f03b00e517576 100644
--- a/drivers/net/wireless/realtek/rtw88/usb.c
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
@@ -342,6 +342,11 @@ static void rtw_usb_write_port_tx_complete(struct urb *urb)
 
 		skb_pull(skb, rtwdev->chip->tx_pkt_desc_sz);
 
+		if (tx_data->drv_frame) {
+			dev_kfree_skb_any(skb);
+			continue;
+		}
+
 		/* enqueue to wait for tx report */
 		if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) {
 			rtw_tx_report_enqueue(rtwdev, skb, tx_data->sn);
@@ -655,6 +660,7 @@ static int rtw_usb_tx_write(struct rtw_dev *rtwdev,
 	rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
 	tx_data = rtw_usb_get_tx_data(skb);
 	tx_data->sn = pkt_info->sn;
+	tx_data->drv_frame = pkt_info->drv_frame;
 
 	skb_queue_tail(&rtwusb->tx_queue[ep], skb);
 
diff --git a/drivers/net/wireless/realtek/rtw88/usb.h b/drivers/net/wireless/realtek/rtw88/usb.h
index 94ff21dd08463..e861e9a66ab22 100644
--- a/drivers/net/wireless/realtek/rtw88/usb.h
+++ b/drivers/net/wireless/realtek/rtw88/usb.h
@@ -59,6 +59,7 @@ struct rx_usb_ctrl_block {
 
 struct rtw_usb_tx_data {
 	u8 sn;
+	bool drv_frame;
 };
 
 struct rtw_usb {
-- 
2.55.0


^ permalink raw reply	[flat|nested] 2+ messages in thread

* [PATCH 2/2] wifi: rtw88: usb: don't report the aggregation buffer as a frame
       [not found] <20261029060859.90002-1-hjf3108@gmail.com>
  2026-10-29  6:08 ` [PATCH 1/2] wifi: rtw88: allow driver-owned TX buffers to bypass mac80211 TX status Ho Jie Feng
@ 2026-10-29  6:08 ` Ho Jie Feng
  1 sibling, 0 replies; 2+ messages in thread
From: Ho Jie Feng @ 2026-10-29  6:08 UTC (permalink / raw)
  To: Ping-Ke Shih
  Cc: linux-wireless, Ho Jie Feng, Sascha Hauer, neo_jou, Kalle Valo,
	Hans Ulli Kroll, linux-kernel

When rtw_usb_tx_agg_skb() has more than one frame queued, it copies them
into a new buffer. That buffer was also handed to mac80211, as one
additional TX completion.

Mark it as a driver frame, so that only the copied frames are reported.

Fixes: a82dfd33d123 ("wifi: rtw88: Add common USB chip support")
Signed-off-by: Ho Jie Feng <hjf3108@gmail.com>
---
 drivers/net/wireless/realtek/rtw88/usb.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
index f03b00e517576..34379dddf7c71 100644
--- a/drivers/net/wireless/realtek/rtw88/usb.c
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
@@ -436,6 +436,9 @@ static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list
 		goto queue;
 	}
 
+	/* report TX status only for the original frames */
+	rtw_usb_get_tx_data(skb_head)->drv_frame = true;
+
 	while (skb_iter) {
 		unsigned long flags;
 
-- 
2.55.0


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-10-29  6:09 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20261029060859.90002-1-hjf3108@gmail.com>
2026-10-29  6:08 ` [PATCH 1/2] wifi: rtw88: allow driver-owned TX buffers to bypass mac80211 TX status Ho Jie Feng
2026-10-29  6:08 ` [PATCH 2/2] wifi: rtw88: usb: don't report the aggregation buffer as a frame Ho Jie Feng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®