diff options
Diffstat (limited to 'drivers/net/wireless/iwlegacy/common.h')
| -rw-r--r-- | drivers/net/wireless/iwlegacy/common.h | 41 | 
1 files changed, 37 insertions, 4 deletions
diff --git a/drivers/net/wireless/iwlegacy/common.h b/drivers/net/wireless/iwlegacy/common.h index 4caaf52986a4..83f8ed8a5528 100644 --- a/drivers/net/wireless/iwlegacy/common.h +++ b/drivers/net/wireless/iwlegacy/common.h @@ -1299,6 +1299,8 @@ struct il_priv {  	/* queue refcounts */  #define IL_MAX_HW_QUEUES	32  	unsigned long queue_stopped[BITS_TO_LONGS(IL_MAX_HW_QUEUES)]; +#define IL_STOP_REASON_PASSIVE	0 +	unsigned long stop_reason;  	/* for each AC */  	atomic_t queue_stop_count[4]; @@ -2257,6 +2259,19 @@ il_set_swq_id(struct il_tx_queue *txq, u8 ac, u8 hwq)  }  static inline void +_il_wake_queue(struct il_priv *il, u8 ac) +{ +	if (atomic_dec_return(&il->queue_stop_count[ac]) <= 0) +		ieee80211_wake_queue(il->hw, ac); +} + +static inline void +_il_stop_queue(struct il_priv *il, u8 ac) +{ +	if (atomic_inc_return(&il->queue_stop_count[ac]) > 0) +		ieee80211_stop_queue(il->hw, ac); +} +static inline void  il_wake_queue(struct il_priv *il, struct il_tx_queue *txq)  {  	u8 queue = txq->swq_id; @@ -2264,8 +2279,7 @@ il_wake_queue(struct il_priv *il, struct il_tx_queue *txq)  	u8 hwq = (queue >> 2) & 0x1f;  	if (test_and_clear_bit(hwq, il->queue_stopped)) -		if (atomic_dec_return(&il->queue_stop_count[ac]) <= 0) -			ieee80211_wake_queue(il->hw, ac); +		_il_wake_queue(il, ac);  }  static inline void @@ -2276,8 +2290,27 @@ il_stop_queue(struct il_priv *il, struct il_tx_queue *txq)  	u8 hwq = (queue >> 2) & 0x1f;  	if (!test_and_set_bit(hwq, il->queue_stopped)) -		if (atomic_inc_return(&il->queue_stop_count[ac]) > 0) -			ieee80211_stop_queue(il->hw, ac); +		_il_stop_queue(il, ac); +} + +static inline void +il_wake_queues_by_reason(struct il_priv *il, int reason) +{ +	u8 ac; + +	if (test_and_clear_bit(reason, &il->stop_reason)) +		for (ac = 0; ac < 4; ac++) +			_il_wake_queue(il, ac); +} + +static inline void +il_stop_queues_by_reason(struct il_priv *il, int reason) +{ +	u8 ac; + +	if (!test_and_set_bit(reason, &il->stop_reason)) +		for (ac = 0; ac < 4; ac++) +			_il_stop_queue(il, ac);  }  #ifdef ieee80211_stop_queue  | 
