All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] wifi: rtw88: keep driver-owned buffers out of mac80211 TX status
@ 2026-10-29  6:08 Ho Jie Feng
  2026-10-29  6:08 ` [PATCH 1/2] wifi: rtw88: allow driver-owned TX buffers to bypass " 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
  0 siblings, 2 replies; 5+ 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

Complete driver-owned transmit buffers without reporting them to
mac80211. For USB aggregation, report TX status only for the original
frames, not for the aggregation buffer.

Tested on RTL8812AU.

Ho Jie Feng (2):
  wifi: rtw88: allow driver-owned TX buffers to bypass mac80211 TX
    status
  wifi: rtw88: usb: don't report the aggregation buffer as a frame

 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  | 9 +++++++++
 drivers/net/wireless/realtek/rtw88/usb.h  | 1 +
 7 files changed, 25 insertions(+)


base-commit: 9b0be45d4d52fd223994e151f169743a97abd290
-- 
2.55.0


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

* [PATCH 1/2] wifi: rtw88: allow driver-owned TX buffers to bypass mac80211 TX status
  2026-10-29  6:08 [PATCH 0/2] wifi: rtw88: keep driver-owned buffers out of mac80211 TX status Ho Jie Feng
@ 2026-10-29  6:08 ` Ho Jie Feng
  2026-10-29 12:05   ` Bitterblue Smith
  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, 1 reply; 5+ 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 related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] wifi: rtw88: usb: don't report the aggregation buffer as a frame
  2026-10-29  6:08 [PATCH 0/2] wifi: rtw88: keep driver-owned buffers out of mac80211 TX status Ho Jie Feng
  2026-10-29  6:08 ` [PATCH 1/2] wifi: rtw88: allow driver-owned TX buffers to bypass " Ho Jie Feng
@ 2026-10-29  6:08 ` Ho Jie Feng
  1 sibling, 0 replies; 5+ 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 related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] wifi: rtw88: allow driver-owned TX buffers to bypass mac80211 TX status
  2026-10-29  6:08 ` [PATCH 1/2] wifi: rtw88: allow driver-owned TX buffers to bypass " Ho Jie Feng
@ 2026-10-29 12:05   ` Bitterblue Smith
  2026-10-29 14:28     ` Ho Jie Feng
  0 siblings, 1 reply; 5+ messages in thread
From: Bitterblue Smith @ 2026-10-29 12:05 UTC (permalink / raw)
  To: linux-wireless

On 29/10/2026 08:08, Ho Jie Feng wrote:
> 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;

This is always false. Why add it?

>  };
>  
>  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) {

This is always false.

> +			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) {

This is always false.

> +		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 {


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

* Re: [PATCH 1/2] wifi: rtw88: allow driver-owned TX buffers to bypass mac80211 TX status
  2026-10-29 12:05   ` Bitterblue Smith
@ 2026-10-29 14:28     ` Ho Jie Feng
  0 siblings, 0 replies; 5+ messages in thread
From: Ho Jie Feng @ 2026-10-29 14:28 UTC (permalink / raw)
  To: linux-wireless, Bitterblue Smith; +Cc: Ping-Ke Shih

On 29/10/2026 14:05, Bitterblue Smith wrote:
> On 29/10/2026 08:08, Ho Jie Feng wrote:
>> 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;
>
> This is always false. Why add it?

This was accidentally left in, since I extracted it from
the patch series for adding beamformer support. It is
used by the code to send beamforming frames without reporting
TX status back.

Will remove it in v2.

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

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

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-29  6:08 [PATCH 0/2] wifi: rtw88: keep driver-owned buffers out of mac80211 TX status Ho Jie Feng
2026-10-29  6:08 ` [PATCH 1/2] wifi: rtw88: allow driver-owned TX buffers to bypass " Ho Jie Feng
2026-10-29 12:05   ` Bitterblue Smith
2026-10-29 14:28     ` 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.