Lines Matching refs:alloc
49 u32 c4iw_id_alloc(struct c4iw_id_table *alloc)
54 spin_lock_irqsave(&alloc->lock, flags);
56 obj = find_next_zero_bit(alloc->table, alloc->max, alloc->last);
57 if (obj >= alloc->max)
58 obj = find_first_zero_bit(alloc->table, alloc->max);
60 if (obj < alloc->max) {
61 if (alloc->flags & C4IW_ID_TABLE_F_RANDOM)
62 alloc->last += arc4random() % RANDOM_SKIP;
64 alloc->last = obj + 1;
65 if (alloc->last >= alloc->max)
66 alloc->last = 0;
67 set_bit(obj, alloc->table);
68 obj += alloc->start;
72 spin_unlock_irqrestore(&alloc->lock, flags);
76 void c4iw_id_free(struct c4iw_id_table *alloc, u32 obj)
80 obj -= alloc->start;
83 spin_lock_irqsave(&alloc->lock, flags);
84 clear_bit(obj, alloc->table);
85 spin_unlock_irqrestore(&alloc->lock, flags);
88 int c4iw_id_table_alloc(struct c4iw_id_table *alloc, u32 start, u32 num,
93 alloc->start = start;
94 alloc->flags = flags;
96 alloc->last = arc4random() % RANDOM_SKIP;
98 alloc->last = 0;
99 alloc->max = num;
100 spin_lock_init(&alloc->lock);
101 alloc->table = kmalloc(BITS_TO_LONGS(num) * sizeof(long),
103 if (!alloc->table)
106 bitmap_zero(alloc->table, num);
107 if (!(alloc->flags & C4IW_ID_TABLE_F_EMPTY))
109 set_bit(i, alloc->table);
114 void c4iw_id_table_free(struct c4iw_id_table *alloc)
116 kfree(alloc->table);