1: 4852bd4fb80d ! 1: f471c49e69ac wifi: rtw88: allow driver-owned TX buffers to bypass mac80211 TX status @@ Metadata Author: Ho Jie Feng   ## Commit message ## - wifi: rtw88: allow driver-owned TX buffers to bypass mac80211 TX status + wifi: rtw88: usb: don't report the aggregation buffer as a frame  - 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. + 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.  - Signed-off-by: Ho Jie Feng  - - ## drivers/net/wireless/realtek/rtw88/main.h ## -@@ drivers/net/wireless/realtek/rtw88/main.h: struct rtw_tx_pkt_info { - u8 hw_ssn_sel; - bool nav_use_hdr; - bool bt_null; -+ bool drv_frame; - }; -  - struct rtw_rx_pkt_stat { - - ## drivers/net/wireless/realtek/rtw88/pci.c ## -@@ drivers/net/wireless/realtek/rtw88/pci.c: 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); -  -@@ drivers/net/wireless/realtek/rtw88/pci.c: 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 */ + Report TX status only for the original frames, and free the aggregate + buffer without passing it to mac80211.  - ## drivers/net/wireless/realtek/rtw88/pci.h ## -@@ drivers/net/wireless/realtek/rtw88/pci.h: struct rtw_pci_tx_buffer_desc { - struct rtw_pci_tx_data { - dma_addr_t dma; - u8 sn; -+ bool drv_frame; - }; -  - struct rtw_pci_ring { - - ## drivers/net/wireless/realtek/rtw88/sdio.c ## -@@ drivers/net/wireless/realtek/rtw88/sdio.c: 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); -@@ drivers/net/wireless/realtek/rtw88/sdio.c: 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); - - ## drivers/net/wireless/realtek/rtw88/sdio.h ## -@@ drivers/net/wireless/realtek/rtw88/sdio.h: struct sdio_device_id; -  - struct rtw_sdio_tx_data { - u8 sn; -+ bool drv_frame; - }; -  - struct rtw_sdio_work_data { + Fixes: a82dfd33d123 ("wifi: rtw88: Add common USB chip support") + Signed-off-by: Ho Jie Feng   ## drivers/net/wireless/realtek/rtw88/usb.c ##  @@ drivers/net/wireless/realtek/rtw88/usb.c: static void rtw_usb_write_port_tx_complete(struct urb *urb) @@ drivers/net/wireless/realtek/rtw88/usb.c: static void rtw_usb_write_port_tx_comp /* enqueue to wait for tx report */ if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { rtw_tx_report_enqueue(rtwdev, skb, tx_data->sn); +@@ drivers/net/wireless/realtek/rtw88/usb.c: 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; +   @@ drivers/net/wireless/realtek/rtw88/usb.c: 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; ++ tx_data->drv_frame = false;  skb_queue_tail(&rtwusb->tx_queue[ep], skb);  2: 57f6b3e360be < -: ------------ wifi: rtw88: usb: don't report the aggregation buffer as a frame