summaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/315-mac80211-add-tx_status_noskb-to-rate_control_ops.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/315-mac80211-add-tx_status_noskb-to-rate_control_ops.patch')
-rw-r--r--package/kernel/mac80211/patches/315-mac80211-add-tx_status_noskb-to-rate_control_ops.patch43
1 files changed, 43 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/315-mac80211-add-tx_status_noskb-to-rate_control_ops.patch b/package/kernel/mac80211/patches/315-mac80211-add-tx_status_noskb-to-rate_control_ops.patch
new file mode 100644
index 0000000000..8a939709b4
--- /dev/null
+++ b/package/kernel/mac80211/patches/315-mac80211-add-tx_status_noskb-to-rate_control_ops.patch
@@ -0,0 +1,43 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Sat, 15 Nov 2014 22:23:44 +0100
+Subject: [PATCH] mac80211: add tx_status_noskb to rate_control_ops
+
+This op works like .tx_status, except it does not need access to the
+skb. This will be used by drivers that cannot match tx status
+information to specific packets.
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -4727,6 +4727,10 @@ struct rate_control_ops {
+ void (*free_sta)(void *priv, struct ieee80211_sta *sta,
+ void *priv_sta);
+
++ void (*tx_status_noskb)(void *priv,
++ struct ieee80211_supported_band *sband,
++ struct ieee80211_sta *sta, void *priv_sta,
++ struct ieee80211_tx_info *info);
+ void (*tx_status)(void *priv, struct ieee80211_supported_band *sband,
+ struct ieee80211_sta *sta, void *priv_sta,
+ struct sk_buff *skb);
+--- a/net/mac80211/rate.h
++++ b/net/mac80211/rate.h
+@@ -37,11 +37,15 @@ static inline void rate_control_tx_statu
+ struct rate_control_ref *ref = local->rate_ctrl;
+ struct ieee80211_sta *ista = &sta->sta;
+ void *priv_sta = sta->rate_ctrl_priv;
++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+
+ if (!ref || !test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
+ return;
+
+- ref->ops->tx_status(ref->priv, sband, ista, priv_sta, skb);
++ if (ref->ops->tx_status)
++ ref->ops->tx_status(ref->priv, sband, ista, priv_sta, skb);
++ else
++ ref->ops->tx_status_noskb(ref->priv, sband, ista, priv_sta, info);
+ }
+
+