Lines Matching refs:queue

29 static inline void __cw1200_queue_lock(struct cw1200_queue *queue)  in __cw1200_queue_lock()  argument
31 struct cw1200_queue_stats *stats = queue->stats; in __cw1200_queue_lock()
32 if (queue->tx_locked_cnt++ == 0) { in __cw1200_queue_lock()
34 queue->queue_id); in __cw1200_queue_lock()
35 ieee80211_stop_queue(stats->priv->hw, queue->queue_id); in __cw1200_queue_lock()
39 static inline void __cw1200_queue_unlock(struct cw1200_queue *queue) in __cw1200_queue_unlock() argument
41 struct cw1200_queue_stats *stats = queue->stats; in __cw1200_queue_unlock()
42 BUG_ON(!queue->tx_locked_cnt); in __cw1200_queue_unlock()
43 if (--queue->tx_locked_cnt == 0) { in __cw1200_queue_unlock()
45 queue->queue_id); in __cw1200_queue_unlock()
46 ieee80211_wake_queue(stats->priv->hw, queue->queue_id); in __cw1200_queue_unlock()
92 static void __cw1200_queue_gc(struct cw1200_queue *queue, in __cw1200_queue_gc() argument
96 struct cw1200_queue_stats *stats = queue->stats; in __cw1200_queue_gc()
100 list_for_each_entry_safe(item, tmp, &queue->queue, head) { in __cw1200_queue_gc()
101 if (jiffies - item->queue_timestamp < queue->ttl) in __cw1200_queue_gc()
103 --queue->num_queued; in __cw1200_queue_gc()
104 --queue->link_map_cache[item->txpriv.link_id]; in __cw1200_queue_gc()
113 list_move_tail(&item->head, &queue->free_pool); in __cw1200_queue_gc()
119 if (queue->overfull) { in __cw1200_queue_gc()
120 if (queue->num_queued <= (queue->capacity >> 1)) { in __cw1200_queue_gc()
121 queue->overfull = false; in __cw1200_queue_gc()
123 __cw1200_queue_unlock(queue); in __cw1200_queue_gc()
125 unsigned long tmo = item->queue_timestamp + queue->ttl; in __cw1200_queue_gc()
126 mod_timer(&queue->gc, tmo); in __cw1200_queue_gc()
136 struct cw1200_queue *queue = in cw1200_queue_gc() local
139 spin_lock_bh(&queue->lock); in cw1200_queue_gc()
140 __cw1200_queue_gc(queue, &list, true); in cw1200_queue_gc()
141 spin_unlock_bh(&queue->lock); in cw1200_queue_gc()
142 cw1200_queue_post_gc(queue->stats, &list); in cw1200_queue_gc()
165 int cw1200_queue_init(struct cw1200_queue *queue, in cw1200_queue_init() argument
173 memset(queue, 0, sizeof(*queue)); in cw1200_queue_init()
174 queue->stats = stats; in cw1200_queue_init()
175 queue->capacity = capacity; in cw1200_queue_init()
176 queue->queue_id = queue_id; in cw1200_queue_init()
177 queue->ttl = ttl; in cw1200_queue_init()
178 INIT_LIST_HEAD(&queue->queue); in cw1200_queue_init()
179 INIT_LIST_HEAD(&queue->pending); in cw1200_queue_init()
180 INIT_LIST_HEAD(&queue->free_pool); in cw1200_queue_init()
181 spin_lock_init(&queue->lock); in cw1200_queue_init()
182 setup_timer(&queue->gc, cw1200_queue_gc, (unsigned long)queue); in cw1200_queue_init()
184 queue->pool = kzalloc(sizeof(struct cw1200_queue_item) * capacity, in cw1200_queue_init()
186 if (!queue->pool) in cw1200_queue_init()
189 queue->link_map_cache = kzalloc(sizeof(int) * stats->map_capacity, in cw1200_queue_init()
191 if (!queue->link_map_cache) { in cw1200_queue_init()
192 kfree(queue->pool); in cw1200_queue_init()
193 queue->pool = NULL; in cw1200_queue_init()
198 list_add_tail(&queue->pool[i].head, &queue->free_pool); in cw1200_queue_init()
203 int cw1200_queue_clear(struct cw1200_queue *queue) in cw1200_queue_clear() argument
207 struct cw1200_queue_stats *stats = queue->stats; in cw1200_queue_clear()
210 spin_lock_bh(&queue->lock); in cw1200_queue_clear()
211 queue->generation++; in cw1200_queue_clear()
212 list_splice_tail_init(&queue->queue, &queue->pending); in cw1200_queue_clear()
213 list_for_each_entry_safe(item, tmp, &queue->pending, head) { in cw1200_queue_clear()
217 list_move_tail(&item->head, &queue->free_pool); in cw1200_queue_clear()
219 queue->num_queued = 0; in cw1200_queue_clear()
220 queue->num_pending = 0; in cw1200_queue_clear()
224 stats->num_queued -= queue->link_map_cache[i]; in cw1200_queue_clear()
225 stats->link_map_cache[i] -= queue->link_map_cache[i]; in cw1200_queue_clear()
226 queue->link_map_cache[i] = 0; in cw1200_queue_clear()
229 if (queue->overfull) { in cw1200_queue_clear()
230 queue->overfull = false; in cw1200_queue_clear()
231 __cw1200_queue_unlock(queue); in cw1200_queue_clear()
233 spin_unlock_bh(&queue->lock); in cw1200_queue_clear()
245 void cw1200_queue_deinit(struct cw1200_queue *queue) in cw1200_queue_deinit() argument
247 cw1200_queue_clear(queue); in cw1200_queue_deinit()
248 del_timer_sync(&queue->gc); in cw1200_queue_deinit()
249 INIT_LIST_HEAD(&queue->free_pool); in cw1200_queue_deinit()
250 kfree(queue->pool); in cw1200_queue_deinit()
251 kfree(queue->link_map_cache); in cw1200_queue_deinit()
252 queue->pool = NULL; in cw1200_queue_deinit()
253 queue->link_map_cache = NULL; in cw1200_queue_deinit()
254 queue->capacity = 0; in cw1200_queue_deinit()
257 size_t cw1200_queue_get_num_queued(struct cw1200_queue *queue, in cw1200_queue_get_num_queued() argument
262 size_t map_capacity = queue->stats->map_capacity; in cw1200_queue_get_num_queued()
267 spin_lock_bh(&queue->lock); in cw1200_queue_get_num_queued()
269 ret = queue->num_queued - queue->num_pending; in cw1200_queue_get_num_queued()
274 ret += queue->link_map_cache[i]; in cw1200_queue_get_num_queued()
277 spin_unlock_bh(&queue->lock); in cw1200_queue_get_num_queued()
281 int cw1200_queue_put(struct cw1200_queue *queue, in cw1200_queue_put() argument
287 struct cw1200_queue_stats *stats = queue->stats; in cw1200_queue_put()
289 if (txpriv->link_id >= queue->stats->map_capacity) in cw1200_queue_put()
292 spin_lock_bh(&queue->lock); in cw1200_queue_put()
293 if (!WARN_ON(list_empty(&queue->free_pool))) { in cw1200_queue_put()
295 &queue->free_pool, struct cw1200_queue_item, head); in cw1200_queue_put()
298 list_move_tail(&item->head, &queue->queue); in cw1200_queue_put()
302 item->packet_id = cw1200_queue_mk_packet_id(queue->generation, in cw1200_queue_put()
303 queue->queue_id, in cw1200_queue_put()
305 item - queue->pool); in cw1200_queue_put()
308 ++queue->num_queued; in cw1200_queue_put()
309 ++queue->link_map_cache[txpriv->link_id]; in cw1200_queue_put()
319 if (queue->overfull == false && in cw1200_queue_put()
320 queue->num_queued >= in cw1200_queue_put()
321 (queue->capacity - (num_present_cpus() - 1))) { in cw1200_queue_put()
322 queue->overfull = true; in cw1200_queue_put()
323 __cw1200_queue_lock(queue); in cw1200_queue_put()
324 mod_timer(&queue->gc, jiffies); in cw1200_queue_put()
329 spin_unlock_bh(&queue->lock); in cw1200_queue_put()
333 int cw1200_queue_get(struct cw1200_queue *queue, in cw1200_queue_get() argument
341 struct cw1200_queue_stats *stats = queue->stats; in cw1200_queue_get()
344 spin_lock_bh(&queue->lock); in cw1200_queue_get()
345 list_for_each_entry(item, &queue->queue, head) { in cw1200_queue_get()
357 list_move_tail(&item->head, &queue->pending); in cw1200_queue_get()
358 ++queue->num_pending; in cw1200_queue_get()
359 --queue->link_map_cache[item->txpriv.link_id]; in cw1200_queue_get()
368 spin_unlock_bh(&queue->lock); in cw1200_queue_get()
374 int cw1200_queue_requeue(struct cw1200_queue *queue, u32 packet_id) in cw1200_queue_requeue() argument
379 struct cw1200_queue_stats *stats = queue->stats; in cw1200_queue_requeue()
384 item = &queue->pool[item_id]; in cw1200_queue_requeue()
386 spin_lock_bh(&queue->lock); in cw1200_queue_requeue()
387 BUG_ON(queue_id != queue->queue_id); in cw1200_queue_requeue()
388 if (queue_generation != queue->generation) { in cw1200_queue_requeue()
390 } else if (item_id >= (unsigned) queue->capacity) { in cw1200_queue_requeue()
397 --queue->num_pending; in cw1200_queue_requeue()
398 ++queue->link_map_cache[item->txpriv.link_id]; in cw1200_queue_requeue()
410 list_move(&item->head, &queue->queue); in cw1200_queue_requeue()
412 spin_unlock_bh(&queue->lock); in cw1200_queue_requeue()
416 int cw1200_queue_requeue_all(struct cw1200_queue *queue) in cw1200_queue_requeue_all() argument
419 struct cw1200_queue_stats *stats = queue->stats; in cw1200_queue_requeue_all()
420 spin_lock_bh(&queue->lock); in cw1200_queue_requeue_all()
422 list_for_each_entry_safe_reverse(item, tmp, &queue->pending, head) { in cw1200_queue_requeue_all()
423 --queue->num_pending; in cw1200_queue_requeue_all()
424 ++queue->link_map_cache[item->txpriv.link_id]; in cw1200_queue_requeue_all()
432 item->packet_id = cw1200_queue_mk_packet_id(queue->generation, in cw1200_queue_requeue_all()
433 queue->queue_id, in cw1200_queue_requeue_all()
435 item - queue->pool); in cw1200_queue_requeue_all()
436 list_move(&item->head, &queue->queue); in cw1200_queue_requeue_all()
438 spin_unlock_bh(&queue->lock); in cw1200_queue_requeue_all()
443 int cw1200_queue_remove(struct cw1200_queue *queue, u32 packet_id) in cw1200_queue_remove() argument
448 struct cw1200_queue_stats *stats = queue->stats; in cw1200_queue_remove()
455 item = &queue->pool[item_id]; in cw1200_queue_remove()
457 spin_lock_bh(&queue->lock); in cw1200_queue_remove()
458 BUG_ON(queue_id != queue->queue_id); in cw1200_queue_remove()
459 if (queue_generation != queue->generation) { in cw1200_queue_remove()
461 } else if (item_id >= (unsigned) queue->capacity) { in cw1200_queue_remove()
471 --queue->num_pending; in cw1200_queue_remove()
472 --queue->num_queued; in cw1200_queue_remove()
473 ++queue->num_sent; in cw1200_queue_remove()
478 list_move(&item->head, &queue->free_pool); in cw1200_queue_remove()
480 if (queue->overfull && in cw1200_queue_remove()
481 (queue->num_queued <= (queue->capacity >> 1))) { in cw1200_queue_remove()
482 queue->overfull = false; in cw1200_queue_remove()
483 __cw1200_queue_unlock(queue); in cw1200_queue_remove()
486 spin_unlock_bh(&queue->lock); in cw1200_queue_remove()
494 int cw1200_queue_get_skb(struct cw1200_queue *queue, u32 packet_id, in cw1200_queue_get_skb() argument
504 item = &queue->pool[item_id]; in cw1200_queue_get_skb()
506 spin_lock_bh(&queue->lock); in cw1200_queue_get_skb()
507 BUG_ON(queue_id != queue->queue_id); in cw1200_queue_get_skb()
508 if (queue_generation != queue->generation) { in cw1200_queue_get_skb()
510 } else if (item_id >= (unsigned) queue->capacity) { in cw1200_queue_get_skb()
520 spin_unlock_bh(&queue->lock); in cw1200_queue_get_skb()
524 void cw1200_queue_lock(struct cw1200_queue *queue) in cw1200_queue_lock() argument
526 spin_lock_bh(&queue->lock); in cw1200_queue_lock()
527 __cw1200_queue_lock(queue); in cw1200_queue_lock()
528 spin_unlock_bh(&queue->lock); in cw1200_queue_lock()
531 void cw1200_queue_unlock(struct cw1200_queue *queue) in cw1200_queue_unlock() argument
533 spin_lock_bh(&queue->lock); in cw1200_queue_unlock()
534 __cw1200_queue_unlock(queue); in cw1200_queue_unlock()
535 spin_unlock_bh(&queue->lock); in cw1200_queue_unlock()
538 bool cw1200_queue_get_xmit_timestamp(struct cw1200_queue *queue, in cw1200_queue_get_xmit_timestamp() argument
545 spin_lock_bh(&queue->lock); in cw1200_queue_get_xmit_timestamp()
546 ret = !list_empty(&queue->pending); in cw1200_queue_get_xmit_timestamp()
548 list_for_each_entry(item, &queue->pending, head) { in cw1200_queue_get_xmit_timestamp()
555 spin_unlock_bh(&queue->lock); in cw1200_queue_get_xmit_timestamp()