2 * O(1) TX queue with built-in allocator for ST-Ericsson CW1200 drivers
4 * Copyright (c) 2010, ST-Ericsson
5 * Author: Dmitry Tarnyagin <dmitry.tarnyagin@lockless.no>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <net/mac80211.h>
13 #include <linux/sched.h>
18 /* private */ struct cw1200_queue_item
20 struct list_head head
;
23 unsigned long queue_timestamp
;
24 unsigned long xmit_timestamp
;
25 struct cw1200_txpriv txpriv
;
29 static inline void __cw1200_queue_lock(struct cw1200_queue
*queue
)
31 struct cw1200_queue_stats
*stats
= queue
->stats
;
32 if (queue
->tx_locked_cnt
++ == 0) {
33 pr_debug("[TX] Queue %d is locked.\n",
35 ieee80211_stop_queue(stats
->priv
->hw
, queue
->queue_id
);
39 static inline void __cw1200_queue_unlock(struct cw1200_queue
*queue
)
41 struct cw1200_queue_stats
*stats
= queue
->stats
;
42 BUG_ON(!queue
->tx_locked_cnt
);
43 if (--queue
->tx_locked_cnt
== 0) {
44 pr_debug("[TX] Queue %d is unlocked.\n",
46 ieee80211_wake_queue(stats
->priv
->hw
, queue
->queue_id
);
50 static inline void cw1200_queue_parse_id(u32 packet_id
, u8
*queue_generation
,
51 u8
*queue_id
, u8
*item_generation
,
54 *item_id
= (packet_id
>> 0) & 0xFF;
55 *item_generation
= (packet_id
>> 8) & 0xFF;
56 *queue_id
= (packet_id
>> 16) & 0xFF;
57 *queue_generation
= (packet_id
>> 24) & 0xFF;
60 static inline u32
cw1200_queue_mk_packet_id(u8 queue_generation
, u8 queue_id
,
61 u8 item_generation
, u8 item_id
)
63 return ((u32
)item_id
<< 0) |
64 ((u32
)item_generation
<< 8) |
65 ((u32
)queue_id
<< 16) |
66 ((u32
)queue_generation
<< 24);
69 static void cw1200_queue_post_gc(struct cw1200_queue_stats
*stats
,
70 struct list_head
*gc_list
)
72 struct cw1200_queue_item
*item
, *tmp
;
74 list_for_each_entry_safe(item
, tmp
, gc_list
, head
) {
75 list_del(&item
->head
);
76 stats
->skb_dtor(stats
->priv
, item
->skb
, &item
->txpriv
);
81 static void cw1200_queue_register_post_gc(struct list_head
*gc_list
,
82 struct cw1200_queue_item
*item
)
84 struct cw1200_queue_item
*gc_item
;
85 gc_item
= kmalloc(sizeof(struct cw1200_queue_item
),
88 memcpy(gc_item
, item
, sizeof(struct cw1200_queue_item
));
89 list_add_tail(&gc_item
->head
, gc_list
);
92 static void __cw1200_queue_gc(struct cw1200_queue
*queue
,
93 struct list_head
*head
,
96 struct cw1200_queue_stats
*stats
= queue
->stats
;
97 struct cw1200_queue_item
*item
= NULL
, *tmp
;
98 bool wakeup_stats
= false;
100 list_for_each_entry_safe(item
, tmp
, &queue
->queue
, head
) {
101 if (jiffies
- item
->queue_timestamp
< queue
->ttl
)
104 --queue
->link_map_cache
[item
->txpriv
.link_id
];
105 spin_lock_bh(&stats
->lock
);
107 if (!--stats
->link_map_cache
[item
->txpriv
.link_id
])
109 spin_unlock_bh(&stats
->lock
);
110 cw1200_debug_tx_ttl(stats
->priv
);
111 cw1200_queue_register_post_gc(head
, item
);
113 list_move_tail(&item
->head
, &queue
->free_pool
);
117 wake_up(&stats
->wait_link_id_empty
);
119 if (queue
->overfull
) {
120 if (queue
->num_queued
<= (queue
->capacity
>> 1)) {
121 queue
->overfull
= false;
123 __cw1200_queue_unlock(queue
);
125 unsigned long tmo
= item
->queue_timestamp
+ queue
->ttl
;
126 mod_timer(&queue
->gc
, tmo
);
127 cw1200_pm_stay_awake(&stats
->priv
->pm_state
,
133 static void cw1200_queue_gc(unsigned long arg
)
136 struct cw1200_queue
*queue
=
137 (struct cw1200_queue
*)arg
;
139 spin_lock_bh(&queue
->lock
);
140 __cw1200_queue_gc(queue
, &list
, true);
141 spin_unlock_bh(&queue
->lock
);
142 cw1200_queue_post_gc(queue
->stats
, &list
);
145 int cw1200_queue_stats_init(struct cw1200_queue_stats
*stats
,
147 cw1200_queue_skb_dtor_t skb_dtor
,
148 struct cw1200_common
*priv
)
150 memset(stats
, 0, sizeof(*stats
));
151 stats
->map_capacity
= map_capacity
;
152 stats
->skb_dtor
= skb_dtor
;
154 spin_lock_init(&stats
->lock
);
155 init_waitqueue_head(&stats
->wait_link_id_empty
);
157 stats
->link_map_cache
= kzalloc(sizeof(int) * map_capacity
,
159 if (!stats
->link_map_cache
)
165 int cw1200_queue_init(struct cw1200_queue
*queue
,
166 struct cw1200_queue_stats
*stats
,
173 memset(queue
, 0, sizeof(*queue
));
174 queue
->stats
= stats
;
175 queue
->capacity
= capacity
;
176 queue
->queue_id
= queue_id
;
178 INIT_LIST_HEAD(&queue
->queue
);
179 INIT_LIST_HEAD(&queue
->pending
);
180 INIT_LIST_HEAD(&queue
->free_pool
);
181 spin_lock_init(&queue
->lock
);
182 init_timer(&queue
->gc
);
183 queue
->gc
.data
= (unsigned long)queue
;
184 queue
->gc
.function
= cw1200_queue_gc
;
186 queue
->pool
= kzalloc(sizeof(struct cw1200_queue_item
) * capacity
,
191 queue
->link_map_cache
= kzalloc(sizeof(int) * stats
->map_capacity
,
193 if (!queue
->link_map_cache
) {
199 for (i
= 0; i
< capacity
; ++i
)
200 list_add_tail(&queue
->pool
[i
].head
, &queue
->free_pool
);
205 int cw1200_queue_clear(struct cw1200_queue
*queue
)
209 struct cw1200_queue_stats
*stats
= queue
->stats
;
210 struct cw1200_queue_item
*item
, *tmp
;
212 spin_lock_bh(&queue
->lock
);
214 list_splice_tail_init(&queue
->queue
, &queue
->pending
);
215 list_for_each_entry_safe(item
, tmp
, &queue
->pending
, head
) {
217 cw1200_queue_register_post_gc(&gc_list
, item
);
219 list_move_tail(&item
->head
, &queue
->free_pool
);
221 queue
->num_queued
= 0;
222 queue
->num_pending
= 0;
224 spin_lock_bh(&stats
->lock
);
225 for (i
= 0; i
< stats
->map_capacity
; ++i
) {
226 stats
->num_queued
-= queue
->link_map_cache
[i
];
227 stats
->link_map_cache
[i
] -= queue
->link_map_cache
[i
];
228 queue
->link_map_cache
[i
] = 0;
230 spin_unlock_bh(&stats
->lock
);
231 if (queue
->overfull
) {
232 queue
->overfull
= false;
233 __cw1200_queue_unlock(queue
);
235 spin_unlock_bh(&queue
->lock
);
236 wake_up(&stats
->wait_link_id_empty
);
237 cw1200_queue_post_gc(stats
, &gc_list
);
241 void cw1200_queue_stats_deinit(struct cw1200_queue_stats
*stats
)
243 kfree(stats
->link_map_cache
);
244 stats
->link_map_cache
= NULL
;
247 void cw1200_queue_deinit(struct cw1200_queue
*queue
)
249 cw1200_queue_clear(queue
);
250 del_timer_sync(&queue
->gc
);
251 INIT_LIST_HEAD(&queue
->free_pool
);
253 kfree(queue
->link_map_cache
);
255 queue
->link_map_cache
= NULL
;
259 size_t cw1200_queue_get_num_queued(struct cw1200_queue
*queue
,
264 size_t map_capacity
= queue
->stats
->map_capacity
;
269 spin_lock_bh(&queue
->lock
);
270 if (link_id_map
== (u32
)-1) {
271 ret
= queue
->num_queued
- queue
->num_pending
;
274 for (i
= 0, bit
= 1; i
< map_capacity
; ++i
, bit
<<= 1) {
275 if (link_id_map
& bit
)
276 ret
+= queue
->link_map_cache
[i
];
279 spin_unlock_bh(&queue
->lock
);
283 int cw1200_queue_put(struct cw1200_queue
*queue
,
285 struct cw1200_txpriv
*txpriv
)
289 struct cw1200_queue_stats
*stats
= queue
->stats
;
291 if (txpriv
->link_id
>= queue
->stats
->map_capacity
)
294 spin_lock_bh(&queue
->lock
);
295 if (!WARN_ON(list_empty(&queue
->free_pool
))) {
296 struct cw1200_queue_item
*item
= list_first_entry(
297 &queue
->free_pool
, struct cw1200_queue_item
, head
);
300 list_move_tail(&item
->head
, &queue
->queue
);
302 item
->txpriv
= *txpriv
;
303 item
->generation
= 0;
304 item
->packet_id
= cw1200_queue_mk_packet_id(queue
->generation
,
308 item
->queue_timestamp
= jiffies
;
311 ++queue
->link_map_cache
[txpriv
->link_id
];
313 spin_lock_bh(&stats
->lock
);
315 ++stats
->link_map_cache
[txpriv
->link_id
];
316 spin_unlock_bh(&stats
->lock
);
318 /* TX may happen in parallel sometimes.
319 * Leave extra queue slots so we don't overflow.
321 if (queue
->overfull
== false &&
323 (queue
->capacity
- (num_present_cpus() - 1))) {
324 queue
->overfull
= true;
325 __cw1200_queue_lock(queue
);
326 mod_timer(&queue
->gc
, jiffies
);
331 spin_unlock_bh(&queue
->lock
);
335 int cw1200_queue_get(struct cw1200_queue
*queue
,
338 struct ieee80211_tx_info
**tx_info
,
339 const struct cw1200_txpriv
**txpriv
)
342 struct cw1200_queue_item
*item
;
343 struct cw1200_queue_stats
*stats
= queue
->stats
;
344 bool wakeup_stats
= false;
346 spin_lock_bh(&queue
->lock
);
347 list_for_each_entry(item
, &queue
->queue
, head
) {
348 if (link_id_map
& BIT(item
->txpriv
.link_id
)) {
355 *tx
= (struct wsm_tx
*)item
->skb
->data
;
356 *tx_info
= IEEE80211_SKB_CB(item
->skb
);
357 *txpriv
= &item
->txpriv
;
358 (*tx
)->packet_id
= item
->packet_id
;
359 list_move_tail(&item
->head
, &queue
->pending
);
360 ++queue
->num_pending
;
361 --queue
->link_map_cache
[item
->txpriv
.link_id
];
362 item
->xmit_timestamp
= jiffies
;
364 spin_lock_bh(&stats
->lock
);
366 if (!--stats
->link_map_cache
[item
->txpriv
.link_id
])
368 spin_unlock_bh(&stats
->lock
);
370 spin_unlock_bh(&queue
->lock
);
372 wake_up(&stats
->wait_link_id_empty
);
376 int cw1200_queue_requeue(struct cw1200_queue
*queue
, u32 packet_id
)
379 u8 queue_generation
, queue_id
, item_generation
, item_id
;
380 struct cw1200_queue_item
*item
;
381 struct cw1200_queue_stats
*stats
= queue
->stats
;
383 cw1200_queue_parse_id(packet_id
, &queue_generation
, &queue_id
,
384 &item_generation
, &item_id
);
386 item
= &queue
->pool
[item_id
];
388 spin_lock_bh(&queue
->lock
);
389 BUG_ON(queue_id
!= queue
->queue_id
);
390 if (queue_generation
!= queue
->generation
) {
392 } else if (item_id
>= (unsigned) queue
->capacity
) {
395 } else if (item
->generation
!= item_generation
) {
399 --queue
->num_pending
;
400 ++queue
->link_map_cache
[item
->txpriv
.link_id
];
402 spin_lock_bh(&stats
->lock
);
404 ++stats
->link_map_cache
[item
->txpriv
.link_id
];
405 spin_unlock_bh(&stats
->lock
);
407 item
->generation
= ++item_generation
;
408 item
->packet_id
= cw1200_queue_mk_packet_id(queue_generation
,
412 list_move(&item
->head
, &queue
->queue
);
414 spin_unlock_bh(&queue
->lock
);
418 int cw1200_queue_requeue_all(struct cw1200_queue
*queue
)
420 struct cw1200_queue_item
*item
, *tmp
;
421 struct cw1200_queue_stats
*stats
= queue
->stats
;
422 spin_lock_bh(&queue
->lock
);
424 list_for_each_entry_safe_reverse(item
, tmp
, &queue
->pending
, head
) {
425 --queue
->num_pending
;
426 ++queue
->link_map_cache
[item
->txpriv
.link_id
];
428 spin_lock_bh(&stats
->lock
);
430 ++stats
->link_map_cache
[item
->txpriv
.link_id
];
431 spin_unlock_bh(&stats
->lock
);
434 item
->packet_id
= cw1200_queue_mk_packet_id(queue
->generation
,
438 list_move(&item
->head
, &queue
->queue
);
440 spin_unlock_bh(&queue
->lock
);
445 int cw1200_queue_remove(struct cw1200_queue
*queue
, u32 packet_id
)
448 u8 queue_generation
, queue_id
, item_generation
, item_id
;
449 struct cw1200_queue_item
*item
;
450 struct cw1200_queue_stats
*stats
= queue
->stats
;
451 struct sk_buff
*gc_skb
= NULL
;
452 struct cw1200_txpriv gc_txpriv
;
454 cw1200_queue_parse_id(packet_id
, &queue_generation
, &queue_id
,
455 &item_generation
, &item_id
);
457 item
= &queue
->pool
[item_id
];
459 spin_lock_bh(&queue
->lock
);
460 BUG_ON(queue_id
!= queue
->queue_id
);
461 if (queue_generation
!= queue
->generation
) {
463 } else if (item_id
>= (unsigned) queue
->capacity
) {
466 } else if (item
->generation
!= item_generation
) {
470 gc_txpriv
= item
->txpriv
;
473 --queue
->num_pending
;
477 /* Do not use list_move_tail here, but list_move:
478 * try to utilize cache row.
480 list_move(&item
->head
, &queue
->free_pool
);
482 if (queue
->overfull
&&
483 (queue
->num_queued
<= (queue
->capacity
>> 1))) {
484 queue
->overfull
= false;
485 __cw1200_queue_unlock(queue
);
488 spin_unlock_bh(&queue
->lock
);
491 stats
->skb_dtor(stats
->priv
, gc_skb
, &gc_txpriv
);
496 int cw1200_queue_get_skb(struct cw1200_queue
*queue
, u32 packet_id
,
497 struct sk_buff
**skb
,
498 const struct cw1200_txpriv
**txpriv
)
501 u8 queue_generation
, queue_id
, item_generation
, item_id
;
502 struct cw1200_queue_item
*item
;
503 cw1200_queue_parse_id(packet_id
, &queue_generation
, &queue_id
,
504 &item_generation
, &item_id
);
506 item
= &queue
->pool
[item_id
];
508 spin_lock_bh(&queue
->lock
);
509 BUG_ON(queue_id
!= queue
->queue_id
);
510 if (queue_generation
!= queue
->generation
) {
512 } else if (item_id
>= (unsigned) queue
->capacity
) {
515 } else if (item
->generation
!= item_generation
) {
520 *txpriv
= &item
->txpriv
;
522 spin_unlock_bh(&queue
->lock
);
526 void cw1200_queue_lock(struct cw1200_queue
*queue
)
528 spin_lock_bh(&queue
->lock
);
529 __cw1200_queue_lock(queue
);
530 spin_unlock_bh(&queue
->lock
);
533 void cw1200_queue_unlock(struct cw1200_queue
*queue
)
535 spin_lock_bh(&queue
->lock
);
536 __cw1200_queue_unlock(queue
);
537 spin_unlock_bh(&queue
->lock
);
540 bool cw1200_queue_get_xmit_timestamp(struct cw1200_queue
*queue
,
541 unsigned long *timestamp
,
542 u32 pending_frame_id
)
544 struct cw1200_queue_item
*item
;
547 spin_lock_bh(&queue
->lock
);
548 ret
= !list_empty(&queue
->pending
);
550 list_for_each_entry(item
, &queue
->pending
, head
) {
551 if (item
->packet_id
!= pending_frame_id
)
552 if (time_before(item
->xmit_timestamp
,
554 *timestamp
= item
->xmit_timestamp
;
557 spin_unlock_bh(&queue
->lock
);
561 bool cw1200_queue_stats_is_empty(struct cw1200_queue_stats
*stats
,
566 spin_lock_bh(&stats
->lock
);
567 if (link_id_map
== (u32
)-1) {
568 empty
= stats
->num_queued
== 0;
571 for (i
= 0; i
< stats
->map_capacity
; ++i
) {
572 if (link_id_map
& BIT(i
)) {
573 if (stats
->link_map_cache
[i
]) {
580 spin_unlock_bh(&stats
->lock
);