The removed patches were applied upstream. Remove the 300-mac80211-optimize-skb-resizing.patch. This patch was not applied upstream, but it conflicts with upstream changes and needs bigger changes. It was applied with Felix to remove this patch for now. It should be reworked and then send upstream later. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
159 lines
4.5 KiB
Diff
159 lines
4.5 KiB
Diff
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Mon, 17 Aug 2020 13:54:19 +0200
|
|
Subject: [PATCH] mac80211: unify 802.3 (offload) and 802.11 tx status
|
|
codepath
|
|
|
|
Make ieee80211_tx_status_8023 call ieee80211_tx_status_ext, similar to
|
|
ieee80211_tx_status.
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
---
|
|
|
|
--- a/net/mac80211/status.c
|
|
+++ b/net/mac80211/status.c
|
|
@@ -901,7 +901,6 @@ static void __ieee80211_tx_status(struct
|
|
struct ieee80211_bar *bar;
|
|
int shift = 0;
|
|
int tid = IEEE80211_NUM_TIDS;
|
|
- u16 tx_time_est;
|
|
|
|
sband = local->hw.wiphy->bands[info->band];
|
|
fc = hdr->frame_control;
|
|
@@ -994,17 +993,6 @@ static void __ieee80211_tx_status(struct
|
|
ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
|
ieee80211_sta_tx_notify(sta->sdata, (void *) skb->data,
|
|
acked, info->status.tx_time);
|
|
-
|
|
- if ((tx_time_est = ieee80211_info_get_tx_time_est(info)) > 0) {
|
|
- /* Do this here to avoid the expensive lookup of the sta
|
|
- * in ieee80211_report_used_skb().
|
|
- */
|
|
- ieee80211_sta_update_pending_airtime(local, sta,
|
|
- skb_get_queue_mapping(skb),
|
|
- tx_time_est,
|
|
- true);
|
|
- ieee80211_info_set_tx_time_est(info, 0);
|
|
- }
|
|
}
|
|
|
|
/* SNMP counters
|
|
@@ -1100,9 +1088,11 @@ void ieee80211_tx_status_ext(struct ieee
|
|
struct ieee80211_tx_info *info = status->info;
|
|
struct ieee80211_sta *pubsta = status->sta;
|
|
struct ieee80211_supported_band *sband;
|
|
- struct sta_info *sta;
|
|
+ struct sk_buff *skb = status->skb;
|
|
+ struct sta_info *sta = NULL;
|
|
int rates_idx, retry_count;
|
|
bool acked, noack_success;
|
|
+ u16 tx_time_est;
|
|
|
|
if (pubsta) {
|
|
sta = container_of(pubsta, struct sta_info, sta);
|
|
@@ -1154,7 +1144,18 @@ void ieee80211_tx_status_ext(struct ieee
|
|
ieee80211s_update_metric(local, sta, status);
|
|
}
|
|
|
|
- if (status->skb)
|
|
+ if (skb && (tx_time_est = ieee80211_info_get_tx_time_est(info)) > 0) {
|
|
+ /* Do this here to avoid the expensive lookup of the sta
|
|
+ * in ieee80211_report_used_skb().
|
|
+ */
|
|
+ ieee80211_sta_update_pending_airtime(local, sta,
|
|
+ skb_get_queue_mapping(skb),
|
|
+ tx_time_est,
|
|
+ true);
|
|
+ ieee80211_info_set_tx_time_est(info, 0);
|
|
+ }
|
|
+
|
|
+ if (skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
|
|
return __ieee80211_tx_status(hw, status, rates_idx,
|
|
retry_count);
|
|
|
|
@@ -1169,6 +1170,12 @@ void ieee80211_tx_status_ext(struct ieee
|
|
} else {
|
|
I802_DEBUG_INC(local->dot11FailedCount);
|
|
}
|
|
+
|
|
+ if (!skb)
|
|
+ return;
|
|
+
|
|
+ ieee80211_report_used_skb(local, skb, false);
|
|
+ dev_kfree_skb(skb);
|
|
}
|
|
EXPORT_SYMBOL(ieee80211_tx_status_ext);
|
|
|
|
@@ -1195,66 +1202,23 @@ void ieee80211_tx_status_8023(struct iee
|
|
struct ieee80211_vif *vif,
|
|
struct sk_buff *skb)
|
|
{
|
|
- struct ieee80211_local *local = hw_to_local(hw);
|
|
struct ieee80211_sub_if_data *sdata;
|
|
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
+ struct ieee80211_tx_status status = {
|
|
+ .skb = skb,
|
|
+ .info = IEEE80211_SKB_CB(skb),
|
|
+ };
|
|
struct sta_info *sta;
|
|
- int retry_count;
|
|
- int rates_idx;
|
|
- bool acked;
|
|
|
|
sdata = vif_to_sdata(vif);
|
|
|
|
- acked = info->flags & IEEE80211_TX_STAT_ACK;
|
|
- rates_idx = ieee80211_tx_get_rates(hw, info, &retry_count);
|
|
-
|
|
rcu_read_lock();
|
|
|
|
- if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
|
|
- goto counters_update;
|
|
-
|
|
- if (IS_ERR(sta))
|
|
- goto counters_update;
|
|
-
|
|
- if (!acked)
|
|
- sta->status_stats.retry_failed++;
|
|
-
|
|
- if (rates_idx != -1)
|
|
- sta->tx_stats.last_rate = info->status.rates[rates_idx];
|
|
-
|
|
- sta->status_stats.retry_count += retry_count;
|
|
-
|
|
- if (ieee80211_hw_check(hw, REPORTS_TX_ACK_STATUS)) {
|
|
- sta->status_stats.last_ack = jiffies;
|
|
- if (info->flags & IEEE80211_TX_STAT_ACK) {
|
|
- if (sta->status_stats.lost_packets)
|
|
- sta->status_stats.lost_packets = 0;
|
|
+ if (!ieee80211_lookup_ra_sta(sdata, skb, &sta) && !IS_ERR(sta))
|
|
+ status.sta = &sta->sta;
|
|
|
|
- sta->status_stats.last_pkt_time = jiffies;
|
|
- } else {
|
|
- ieee80211_lost_packet(sta, info);
|
|
- }
|
|
- }
|
|
+ ieee80211_tx_status_ext(hw, &status);
|
|
|
|
-counters_update:
|
|
rcu_read_unlock();
|
|
- ieee80211_led_tx(local);
|
|
-
|
|
- if (!(info->flags & IEEE80211_TX_STAT_ACK) &&
|
|
- !(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED))
|
|
- goto skip_stats_update;
|
|
-
|
|
- I802_DEBUG_INC(local->dot11TransmittedFrameCount);
|
|
- if (is_multicast_ether_addr(skb->data))
|
|
- I802_DEBUG_INC(local->dot11MulticastTransmittedFrameCount);
|
|
- if (retry_count > 0)
|
|
- I802_DEBUG_INC(local->dot11RetryCount);
|
|
- if (retry_count > 1)
|
|
- I802_DEBUG_INC(local->dot11MultipleRetryCount);
|
|
-
|
|
-skip_stats_update:
|
|
- ieee80211_report_used_skb(local, skb, false);
|
|
- dev_kfree_skb(skb);
|
|
}
|
|
EXPORT_SYMBOL(ieee80211_tx_status_8023);
|
|
|