diff options
author | Felix Fietkau <nbd@nbd.name> | 2021-08-16 14:10:19 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2021-08-24 17:35:45 +0200 |
commit | 0f6887972adc48449a1f5efaa143fa3f740a8c36 (patch) | |
tree | 31eab8a54f71b8e8b94352e1268cdd85f0fa765d /package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch | |
parent | f04c0ead33d6dac274ebd686e9bd9c05b1ead321 (diff) | |
download | upstream-0f6887972adc48449a1f5efaa143fa3f740a8c36.tar.gz upstream-0f6887972adc48449a1f5efaa143fa3f740a8c36.tar.bz2 upstream-0f6887972adc48449a1f5efaa143fa3f740a8c36.zip |
mac80211: add missing change for encap offload on devices with sw rate control
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch')
-rw-r--r-- | package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch | 58 |
1 files changed, 38 insertions, 20 deletions
diff --git a/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch b/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch index 43a4a1334d..2a4551023f 100644 --- a/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch +++ b/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch @@ -7,24 +7,6 @@ The software rate control cannot deal with encap offload, so fix it. Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> --- ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -2024,6 +2024,15 @@ static inline void ieee80211_tx_skb(stru - ieee80211_tx_skb_tid(sdata, skb, 7); - } - -+static inline bool ieee80211_is_tx_data(struct sk_buff *skb) -+{ -+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ -+ return info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP || -+ ieee80211_is_data(hdr->frame_control); -+} -+ - u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, - struct ieee802_11_elems *elems, - u64 filter, u32 crc, u8 *transmitter_bssid, --- a/net/mac80211/rate.c +++ b/net/mac80211/rate.c @@ -297,15 +297,11 @@ void ieee80211_check_rate_mask(struct ie @@ -44,7 +26,18 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> } static void rc_send_low_basicrate(struct ieee80211_tx_rate *rate, -@@ -870,7 +866,6 @@ void ieee80211_get_tx_rates(struct ieee8 +@@ -396,6 +392,10 @@ static bool rate_control_send_low(struct + int mcast_rate; + bool use_basicrate = false; + ++ if (ieee80211_is_tx_data(txrc->skb) && ++ info->flags & IEEE80211_TX_CTL_NO_ACK) ++ return false; ++ + if (!pubsta || rc_no_data_or_no_ack_use_min(txrc)) { + __rate_control_send_low(txrc->hw, sband, pubsta, info, + txrc->rate_idx_mask); +@@ -870,7 +870,6 @@ void ieee80211_get_tx_rates(struct ieee8 int max_rates) { struct ieee80211_sub_if_data *sdata; @@ -52,7 +45,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_supported_band *sband; -@@ -882,7 +877,7 @@ void ieee80211_get_tx_rates(struct ieee8 +@@ -882,7 +881,7 @@ void ieee80211_get_tx_rates(struct ieee8 sdata = vif_to_sdata(vif); sband = sdata->local->hw.wiphy->bands[info->band]; @@ -117,3 +110,28 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) { struct sta_info *sta = container_of(txq->sta, struct sta_info, +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -6728,4 +6728,22 @@ struct sk_buff *ieee80211_get_fils_disco + struct sk_buff * + ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw, + struct ieee80211_vif *vif); ++ ++/** ++ * ieee80211_is_tx_data - check if frame is a data frame ++ * ++ * The function is used to check if a frame is a data frame. Frames with ++ * hardware encapsulation enabled are data frames. ++ * ++ * @skb: the frame to be transmitted. ++ */ ++static inline bool ieee80211_is_tx_data(struct sk_buff *skb) ++{ ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ieee80211_hdr *hdr = (void *) skb->data; ++ ++ return info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP || ++ ieee80211_is_data(hdr->frame_control); ++} ++ + #endif /* MAC80211_H */ |