40#include <sys/libkern.h>
56 spin_lock_irqsave(&alloc->
lock, flags);
58 obj = find_next_zero_bit(alloc->
table, alloc->
max, alloc->
last);
59 if (obj >= alloc->
max)
60 obj = find_first_zero_bit(alloc->
table, alloc->
max);
62 if (obj < alloc->max) {
64 alloc->
last += arc4random() % RANDOM_SKIP;
66 alloc->
last = obj + 1;
69 set_bit(obj, alloc->
table);
74 spin_unlock_irqrestore(&alloc->
lock, flags);
85 spin_lock_irqsave(&alloc->
lock, flags);
86 clear_bit(obj, alloc->
table);
87 spin_unlock_irqrestore(&alloc->
lock, flags);
98 alloc->
last = arc4random() % RANDOM_SKIP;
102 spin_lock_init(&alloc->
lock);
103 alloc->
table = kmalloc(BITS_TO_LONGS(num) *
sizeof(
long),
108 bitmap_zero(alloc->
table, num);
110 for (i = 0; i < reserved; ++i)
111 set_bit(i, alloc->
table);
#define C4IW_ID_TABLE_F_EMPTY
void c4iw_id_free(struct c4iw_id_table *alloc, u32 obj)
void c4iw_id_table_free(struct c4iw_id_table *alloc)
#define C4IW_ID_TABLE_F_RANDOM
u32 c4iw_id_alloc(struct c4iw_id_table *alloc)
int c4iw_id_table_alloc(struct c4iw_id_table *alloc, u32 start, u32 num, u32 reserved, u32 flags)