mac80211: add functions to stop and wake all queues assigned to a vif
In some cases we may want to stop the queues of a single vif (for instance during a channel-switch). Add a function that stops all the queues that are assigned to a vif. If a queue is assigned to more than one vif, the corresponding netdev subqueue of the other vif(s) will also be stopped. If the HW doesn't set the IEEE80211_HW_QUEUE_CONTROL flag, then all queues are stopped. Also add a corresponding function to wake the queues of a vif back. Signed-off-by: Luciano Coelho <luciano.coelho@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
cca07b00a5
commit
26da23b695
2 changed files with 41 additions and 6 deletions
|
@ -1720,6 +1720,12 @@ void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw,
|
||||||
unsigned long queues,
|
unsigned long queues,
|
||||||
enum queue_stop_reason reason,
|
enum queue_stop_reason reason,
|
||||||
bool refcounted);
|
bool refcounted);
|
||||||
|
void ieee80211_stop_vif_queues(struct ieee80211_local *local,
|
||||||
|
struct ieee80211_sub_if_data *sdata,
|
||||||
|
enum queue_stop_reason reason);
|
||||||
|
void ieee80211_wake_vif_queues(struct ieee80211_local *local,
|
||||||
|
struct ieee80211_sub_if_data *sdata,
|
||||||
|
enum queue_stop_reason reason);
|
||||||
void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw,
|
void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw,
|
||||||
unsigned long queues,
|
unsigned long queues,
|
||||||
enum queue_stop_reason reason,
|
enum queue_stop_reason reason,
|
||||||
|
|
|
@ -552,13 +552,11 @@ void ieee80211_wake_queues(struct ieee80211_hw *hw)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ieee80211_wake_queues);
|
EXPORT_SYMBOL(ieee80211_wake_queues);
|
||||||
|
|
||||||
void ieee80211_flush_queues(struct ieee80211_local *local,
|
static unsigned int
|
||||||
|
ieee80211_get_vif_queues(struct ieee80211_local *local,
|
||||||
struct ieee80211_sub_if_data *sdata)
|
struct ieee80211_sub_if_data *sdata)
|
||||||
{
|
{
|
||||||
u32 queues;
|
unsigned int queues;
|
||||||
|
|
||||||
if (!local->ops->flush)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (sdata && local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) {
|
if (sdata && local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) {
|
||||||
int ac;
|
int ac;
|
||||||
|
@ -574,6 +572,19 @@ void ieee80211_flush_queues(struct ieee80211_local *local,
|
||||||
queues = BIT(local->hw.queues) - 1;
|
queues = BIT(local->hw.queues) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return queues;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ieee80211_flush_queues(struct ieee80211_local *local,
|
||||||
|
struct ieee80211_sub_if_data *sdata)
|
||||||
|
{
|
||||||
|
unsigned int queues;
|
||||||
|
|
||||||
|
if (!local->ops->flush)
|
||||||
|
return;
|
||||||
|
|
||||||
|
queues = ieee80211_get_vif_queues(local, sdata);
|
||||||
|
|
||||||
ieee80211_stop_queues_by_reason(&local->hw, queues,
|
ieee80211_stop_queues_by_reason(&local->hw, queues,
|
||||||
IEEE80211_QUEUE_STOP_REASON_FLUSH,
|
IEEE80211_QUEUE_STOP_REASON_FLUSH,
|
||||||
false);
|
false);
|
||||||
|
@ -585,6 +596,24 @@ void ieee80211_flush_queues(struct ieee80211_local *local,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ieee80211_stop_vif_queues(struct ieee80211_local *local,
|
||||||
|
struct ieee80211_sub_if_data *sdata,
|
||||||
|
enum queue_stop_reason reason)
|
||||||
|
{
|
||||||
|
ieee80211_stop_queues_by_reason(&local->hw,
|
||||||
|
ieee80211_get_vif_queues(local, sdata),
|
||||||
|
reason, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ieee80211_wake_vif_queues(struct ieee80211_local *local,
|
||||||
|
struct ieee80211_sub_if_data *sdata,
|
||||||
|
enum queue_stop_reason reason)
|
||||||
|
{
|
||||||
|
ieee80211_wake_queues_by_reason(&local->hw,
|
||||||
|
ieee80211_get_vif_queues(local, sdata),
|
||||||
|
reason, true);
|
||||||
|
}
|
||||||
|
|
||||||
static void __iterate_active_interfaces(struct ieee80211_local *local,
|
static void __iterate_active_interfaces(struct ieee80211_local *local,
|
||||||
u32 iter_flags,
|
u32 iter_flags,
|
||||||
void (*iterator)(void *data, u8 *mac,
|
void (*iterator)(void *data, u8 *mac,
|
||||||
|
|
Loading…
Add table
Reference in a new issue