diff --git a/patches/openwrt/0009-mac80211-add-AQL-support-for-broadcast-multicast-packets.patch b/patches/openwrt/0009-mac80211-add-AQL-support-for-broadcast-multicast-packets.patch index eb2f9f9c35a9b167b9b8edbb914e75ee76db861a..a8f810850a415b32d0a6084cfd015dff84f57f3b 100644 --- a/patches/openwrt/0009-mac80211-add-AQL-support-for-broadcast-multicast-packets.patch +++ b/patches/openwrt/0009-mac80211-add-AQL-support-for-broadcast-multicast-packets.patch @@ -9,10 +9,10 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> diff --git a/package/kernel/mac80211/patches/subsys/330-mac80211-add-AQL-support-for-broadcast-packets.patch b/package/kernel/mac80211/patches/subsys/330-mac80211-add-AQL-support-for-broadcast-packets.patch new file mode 100644 -index 0000000000000000000000000000000000000000..9095f4916f1a80fee004bbef4d37c26899969f5a +index 0000000000000000000000000000000000000000..5f6754e5024f90f7ba6833c3702fe3ce425c50bb --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/330-mac80211-add-AQL-support-for-broadcast-packets.patch -@@ -0,0 +1,226 @@ +@@ -0,0 +1,302 @@ +From: Felix Fietkau <nbd@nbd.name> +Date: Fri, 9 Feb 2024 19:43:40 +0100 +Subject: [PATCH] mac80211: add AQL support for broadcast packets @@ -110,48 +110,48 @@ index 0000000000000000000000000000000000000000..9095f4916f1a80fee004bbef4d37c268 + spin_lock_init(&local->active_txq_lock[i]); +--- a/net/mac80211/sta_info.c ++++ b/net/mac80211/sta_info.c -+@@ -2166,28 +2166,27 @@ void ieee80211_sta_update_pending_airtim ++@@ -2164,13 +2164,28 @@ EXPORT_SYMBOL(ieee80211_sta_recalc_aggre ++ ++ void ieee80211_sta_update_pending_airtime(struct ieee80211_local *local, + struct sta_info *sta, u8 ac, -+ u16 tx_airtime, bool tx_completed) ++- u16 tx_airtime, bool tx_completed) +++ u16 tx_airtime, bool tx_completed, +++ bool mcast) + { -++ atomic_t *counter; + int tx_pending; + + if (!wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL)) + return; + -+- if (!tx_completed) { -+- if (sta) -+- atomic_add(tx_airtime, -+- &sta->airtime[ac].aql_tx_pending); -++ if (sta) -++ counter = &sta->airtime[ac].aql_tx_pending; -++ else -++ counter = &local->aql_bc_pending_airtime; -+ -++ if (!tx_completed) { -++ atomic_add(tx_airtime, counter); -+ atomic_add(tx_airtime, &local->aql_total_pending_airtime); -+ atomic_add(tx_airtime, &local->aql_ac_pending_airtime[ac]); -+ return; -+ } -+ -+- if (sta) { -+- tx_pending = atomic_sub_return(tx_airtime, -+- &sta->airtime[ac].aql_tx_pending); -+- if (tx_pending < 0) -+- atomic_cmpxchg(&sta->airtime[ac].aql_tx_pending, -+- tx_pending, 0); -+- } -++ tx_pending = atomic_sub_return(tx_airtime, counter); -++ if (tx_pending < 0) -++ atomic_cmpxchg(counter, tx_pending, 0); -+ -+ atomic_sub(tx_airtime, &local->aql_total_pending_airtime); -+ tx_pending = atomic_sub_return(tx_airtime, +++ if (mcast) { +++ if (!tx_completed) { +++ atomic_add(tx_airtime, &local->aql_bc_pending_airtime); +++ return; +++ } +++ +++ tx_pending = atomic_sub_return(tx_airtime, +++ &local->aql_bc_pending_airtime); +++ if (tx_pending < 0) +++ atomic_cmpxchg(&local->aql_bc_pending_airtime, +++ tx_pending, 0); +++ return; +++ } +++ ++ if (!tx_completed) { ++ if (sta) ++ atomic_add(tx_airtime, +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c -+@@ -3957,9 +3957,8 @@ begin: ++@@ -2553,7 +2553,7 @@ static u16 ieee80211_store_ack_skb(struc ++ ++ spin_lock_irqsave(&local->ack_status_lock, flags); ++ id = idr_alloc(&local->ack_status_frames, ack_skb, ++- 1, 0x2000, GFP_ATOMIC); +++ 1, 0x1000, GFP_ATOMIC); ++ spin_unlock_irqrestore(&local->ack_status_lock, flags); ++ ++ if (id >= 0) { ++@@ -3957,20 +3957,20 @@ begin: + encap_out: + IEEE80211_SKB_CB(skb)->control.vif = vif; + @@ -163,7 +163,26 @@ index 0000000000000000000000000000000000000000..9095f4916f1a80fee004bbef4d37c268 + u32 airtime; + + airtime = ieee80211_calc_expected_tx_airtime(hw, vif, txq->sta, -+@@ -4025,6 +4024,7 @@ struct ieee80211_txq *ieee80211_next_txq ++ skb->len, ampdu); ++- if (airtime) { ++- airtime = ieee80211_info_set_tx_time_est(info, airtime); ++- ieee80211_sta_update_pending_airtime(local, tx.sta, ++- txq->ac, ++- airtime, ++- false); ++- } +++ if (!airtime) +++ return skb; +++ +++ airtime = ieee80211_info_set_tx_time_est(info, airtime); +++ info->tx_time_mc = !tx.sta; +++ ieee80211_sta_update_pending_airtime(local, tx.sta, txq->ac, +++ airtime, false, +++ info->tx_time_mc); ++ } ++ ++ return skb; ++@@ -4025,6 +4025,7 @@ struct ieee80211_txq *ieee80211_next_txq + struct ieee80211_txq *ret = NULL; + struct txq_info *txqi = NULL, *head = NULL; + bool found_eligible_txq = false; @@ -171,7 +190,7 @@ index 0000000000000000000000000000000000000000..9095f4916f1a80fee004bbef4d37c268 + + spin_lock_bh(&local->active_txq_lock[ac]); + -+@@ -4048,26 +4048,26 @@ struct ieee80211_txq *ieee80211_next_txq ++@@ -4048,26 +4049,26 @@ struct ieee80211_txq *ieee80211_next_txq + if (!head) + head = txqi; + @@ -210,7 +229,7 @@ index 0000000000000000000000000000000000000000..9095f4916f1a80fee004bbef4d37c268 + if (txqi->schedule_round == local->schedule_round[ac]) + goto out; + -+@@ -4132,7 +4132,8 @@ bool ieee80211_txq_airtime_check(struct ++@@ -4132,7 +4133,8 @@ bool ieee80211_txq_airtime_check(struct + return true; + + if (!txq->sta) @@ -220,7 +239,7 @@ index 0000000000000000000000000000000000000000..9095f4916f1a80fee004bbef4d37c268 + + if (unlikely(txq->tid == IEEE80211_NUM_TIDS)) + return true; -+@@ -4181,15 +4182,15 @@ bool ieee80211_txq_may_transmit(struct i ++@@ -4181,15 +4183,15 @@ bool ieee80211_txq_may_transmit(struct i + + spin_lock_bh(&local->active_txq_lock[ac]); + @@ -239,3 +258,60 @@ index 0000000000000000000000000000000000000000..9095f4916f1a80fee004bbef4d37c268 + list_for_each_entry_safe(iter, tmp, &local->active_txqs[ac], + schedule_order) { + if (iter == txqi) ++--- a/include/net/mac80211.h +++++ b/include/net/mac80211.h ++@@ -1092,6 +1092,7 @@ ieee80211_rate_get_vht_nss(const struct ++ * link the frame will be transmitted on ++ * @hw_queue: HW queue to put the frame on, skb_get_queue_mapping() gives the AC ++ * @ack_frame_id: internal frame ID for TX status, used internally +++ * @tx_time_mc: TX time is for a multicast packet ++ * @tx_time_est: TX time estimate in units of 4us, used internally ++ * @control: union part for control data ++ * @control.rates: TX rates array to try ++@@ -1131,8 +1132,9 @@ struct ieee80211_tx_info { ++ /* common information */ ++ u32 flags; ++ u32 band:3, ++- ack_frame_id:13, +++ ack_frame_id:12, ++ hw_queue:4, +++ tx_time_mc:1, ++ tx_time_est:10; ++ /* 2 free bits */ ++ ++--- a/net/mac80211/sta_info.h +++++ b/net/mac80211/sta_info.h ++@@ -147,7 +147,8 @@ struct airtime_info { ++ ++ void ieee80211_sta_update_pending_airtime(struct ieee80211_local *local, ++ struct sta_info *sta, u8 ac, ++- u16 tx_airtime, bool tx_completed); +++ u16 tx_airtime, bool tx_completed, +++ bool mcast); ++ ++ struct sta_info; ++ ++--- a/net/mac80211/status.c +++++ b/net/mac80211/status.c ++@@ -716,7 +716,7 @@ static void ieee80211_report_used_skb(st ++ ieee80211_sta_update_pending_airtime(local, sta, ++ skb_get_queue_mapping(skb), ++ tx_time_est, ++- true); +++ true, info->tx_time_mc); ++ rcu_read_unlock(); ++ } ++ ++@@ -1127,10 +1127,11 @@ void ieee80211_tx_status_ext(struct ieee ++ /* Do this here to avoid the expensive lookup of the sta ++ * in ieee80211_report_used_skb(). ++ */ +++ bool mcast = IEEE80211_SKB_CB(skb)->tx_time_mc; ++ ieee80211_sta_update_pending_airtime(local, sta, ++ skb_get_queue_mapping(skb), ++ tx_time_est, ++- true); +++ true, mcast); ++ ieee80211_info_set_tx_time_est(IEEE80211_SKB_CB(skb), 0); ++ } ++