--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 21 Aug 2020 05:49:07 +0200
+Subject: [PATCH] mac80211: extend ieee80211_tx_status_ext to support
+ bulk free
+
+Store processed skbs ready to be freed in a list so the driver bulk free them
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -1092,12 +1092,14 @@ ieee80211_info_get_tx_time_est(struct ie
+ * @info: Basic tx status information
+ * @skb: Packet skb (can be NULL if not provided by the driver)
+ * @rate: The TX rate that was used when sending the packet
++ * @free_list: list where processed skbs are stored to be free'd by the driver
+ */
+ struct ieee80211_tx_status {
+ struct ieee80211_sta *sta;
+ struct ieee80211_tx_info *info;
+ struct sk_buff *skb;
+ struct rate_info *rate;
++ struct list_head *free_list;
+ };
+
+ /**
+--- a/net/mac80211/status.c
++++ b/net/mac80211/status.c
+@@ -1053,7 +1053,10 @@ static void __ieee80211_tx_status(struct
+ * with this test...
+ */
+ if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) {
+- dev_kfree_skb(skb);
++ if (status->free_list)
++ list_add_tail(&skb->list, status->free_list);
++ else
++ dev_kfree_skb(skb);
+ return;
+ }
+
+@@ -1182,7 +1185,10 @@ free:
+ return;
+
+ ieee80211_report_used_skb(local, skb, false);
+- dev_kfree_skb(skb);
++ if (status->free_list)
++ list_add_tail(&skb->list, status->free_list);
++ else
++ dev_kfree_skb(skb);
+ }
+ EXPORT_SYMBOL(ieee80211_tx_status_ext);
+