summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2014-11-19 20:08:08 +0100
committerJohannes Berg <johannes.berg@intel.com>2014-11-28 15:01:50 +0100
commitf684565e0af43586bfc3e005d173f94b0f902a5d (patch)
treea10257c1c797c058cb5f5ed4a0ac437ea1d3927a
parent95943425c09616d22ba9bc185d70f8b815a77f9b (diff)
downloadlinux-f684565e0af43586bfc3e005d173f94b0f902a5d.tar.gz
linux-f684565e0af43586bfc3e005d173f94b0f902a5d.tar.bz2
linux-f684565e0af43586bfc3e005d173f94b0f902a5d.zip
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> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--include/net/mac80211.h4
-rw-r--r--net/mac80211/rate.h6
2 files changed, 9 insertions, 1 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 66cbfe46428d..01dfd22e45fd 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -4837,6 +4837,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);
diff --git a/net/mac80211/rate.h b/net/mac80211/rate.h
index 18babe302832..dd25964a300a 100644
--- a/net/mac80211/rate.h
+++ b/net/mac80211/rate.h
@@ -37,11 +37,15 @@ static inline void rate_control_tx_status(struct ieee80211_local *local,
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);
}