mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-19 10:23:03 +00:00
This series is based on * 2020-07-10 ipq6018-ilq-11-0_qca_oem-034672b0676c37b1f4519e5720e18e95fe6236ef Add support for * qsdk kernel/v4.4 * qsdk ethernet subsystem * v5.7 ath11k backport + QualComm staging patches (wlan_ap_1.0) * ath11k-firmware * hostapd/iw/... Feature support * full boot, system detection * sysupgrade to nand * HE support via latest hostapd * driver support for usb, crypto, hwmon, cpufreq, ... Missing * NSS/HW flow offloading - FW blob is not redistributable Using the qsdk v4.4 is an intermediate solution while the vanilla is being tested. Vanilla kernel is almost on feature par. Work has already started to upstream the ethernet and switch drivers. Once complete the target will be fully upstream. Signed-off-by: John Crispin <john@phrozen.org>
124 lines
4.0 KiB
Diff
124 lines
4.0 KiB
Diff
--- a/net/mac80211/util.c
|
|
+++ b/net/mac80211/util.c
|
|
@@ -299,16 +299,16 @@ out:
|
|
local_bh_enable();
|
|
}
|
|
|
|
-static void
|
|
-__releases(&local->queue_stop_reason_lock)
|
|
-__acquires(&local->queue_stop_reason_lock)
|
|
-_ieee80211_wake_txqs(struct ieee80211_local *local, unsigned long *flags)
|
|
+void ieee80211_wake_txqs(unsigned long data)
|
|
{
|
|
+ struct ieee80211_local *local = (struct ieee80211_local *)data;
|
|
struct ieee80211_sub_if_data *sdata;
|
|
int n_acs = IEEE80211_NUM_ACS;
|
|
+ unsigned long flags;
|
|
int i;
|
|
|
|
rcu_read_lock();
|
|
+ spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
|
|
|
if (local->hw.queues < IEEE80211_NUM_ACS)
|
|
n_acs = 1;
|
|
@@ -317,7 +317,7 @@ _ieee80211_wake_txqs(struct ieee80211_lo
|
|
if (local->queue_stop_reasons[i])
|
|
continue;
|
|
|
|
- spin_unlock_irqrestore(&local->queue_stop_reason_lock, *flags);
|
|
+ spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
|
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
|
int ac;
|
|
|
|
@@ -329,20 +329,11 @@ _ieee80211_wake_txqs(struct ieee80211_lo
|
|
__ieee80211_wake_txqs(sdata, ac);
|
|
}
|
|
}
|
|
- spin_lock_irqsave(&local->queue_stop_reason_lock, *flags);
|
|
+ spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
|
}
|
|
|
|
- rcu_read_unlock();
|
|
-}
|
|
-
|
|
-void ieee80211_wake_txqs(unsigned long data)
|
|
-{
|
|
- struct ieee80211_local *local = (struct ieee80211_local *)data;
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
|
- _ieee80211_wake_txqs(local, &flags);
|
|
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
|
+ rcu_read_unlock();
|
|
}
|
|
|
|
void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue)
|
|
@@ -380,8 +371,7 @@ void ieee80211_propagate_queue_wake(stru
|
|
|
|
static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
|
|
enum queue_stop_reason reason,
|
|
- bool refcounted,
|
|
- unsigned long *flags)
|
|
+ bool refcounted)
|
|
{
|
|
struct ieee80211_local *local = hw_to_local(hw);
|
|
|
|
@@ -415,19 +405,8 @@ static void __ieee80211_wake_queue(struc
|
|
} else
|
|
tasklet_schedule(&local->tx_pending_tasklet);
|
|
|
|
- /*
|
|
- * Calling _ieee80211_wake_txqs here can be a problem because it may
|
|
- * release queue_stop_reason_lock which has been taken by
|
|
- * __ieee80211_wake_queue's caller. It is certainly not very nice to
|
|
- * release someone's lock, but it is fine because all the callers of
|
|
- * __ieee80211_wake_queue call it right before releasing the lock.
|
|
- */
|
|
- if (local->ops->wake_tx_queue) {
|
|
- if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
|
|
- tasklet_schedule(&local->wake_txqs_tasklet);
|
|
- else
|
|
- _ieee80211_wake_txqs(local, flags);
|
|
- }
|
|
+ if (local->ops->wake_tx_queue)
|
|
+ tasklet_schedule(&local->wake_txqs_tasklet);
|
|
}
|
|
|
|
void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
|
|
@@ -438,7 +417,7 @@ void ieee80211_wake_queue_by_reason(stru
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
|
- __ieee80211_wake_queue(hw, queue, reason, refcounted, &flags);
|
|
+ __ieee80211_wake_queue(hw, queue, reason, refcounted);
|
|
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
|
}
|
|
|
|
@@ -535,7 +514,7 @@ void ieee80211_add_pending_skb(struct ie
|
|
false);
|
|
__skb_queue_tail(&local->pending[queue], skb);
|
|
__ieee80211_wake_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
|
|
- false, &flags);
|
|
+ false);
|
|
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
|
}
|
|
|
|
@@ -568,7 +547,7 @@ void ieee80211_add_pending_skbs(struct i
|
|
for (i = 0; i < hw->queues; i++)
|
|
__ieee80211_wake_queue(hw, i,
|
|
IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
|
|
- false, &flags);
|
|
+ false);
|
|
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
|
}
|
|
|
|
@@ -626,7 +605,7 @@ void ieee80211_wake_queues_by_reason(str
|
|
spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
|
|
|
for_each_set_bit(i, &queues, hw->queues)
|
|
- __ieee80211_wake_queue(hw, i, reason, refcounted, &flags);
|
|
+ __ieee80211_wake_queue(hw, i, reason, refcounted);
|
|
|
|
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
|
}
|