| 1 | --- a/ath/if_athvar.h |
| 2 | +++ b/ath/if_athvar.h |
| 3 | @@ -126,6 +126,11 @@ typedef void irqreturn_t; |
| 4 | #define ATH_GET_NETDEV_DEV(ndev) ((ndev)->class_dev.dev) |
| 5 | #endif |
| 6 | |
| 7 | +#ifndef NETDEV_TX_OK |
| 8 | +#define NETDEV_TX_OK 0 |
| 9 | +#define NETDEV_TX_BUSY 1 |
| 10 | +#endif |
| 11 | + |
| 12 | #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) |
| 13 | static inline struct net_device *_alloc_netdev(int sizeof_priv, const char *mask, |
| 14 | void (*setup)(struct net_device *)) |
| 15 | --- a/ath/if_ath_radar.c |
| 16 | +++ b/ath/if_ath_radar.c |
| 17 | @@ -92,6 +92,13 @@ |
| 18 | #define nofloat_pct(_value, _pct) \ |
| 19 | ( (_value * (1000 + _pct)) / 1000 ) |
| 20 | |
| 21 | +#ifndef list_for_each_entry_reverse |
| 22 | +#define list_for_each_entry_reverse(pos, head, member) \ |
| 23 | + for (pos = list_entry((head)->prev, typeof(*pos), member); \ |
| 24 | + prefetch(pos->member.prev), &pos->member != (head); \ |
| 25 | + pos = list_entry(pos->member.prev, typeof(*pos), member)) |
| 26 | +#endif |
| 27 | + |
| 28 | struct radar_pattern_specification { |
| 29 | /* The name of the rule/specification (i.e. what did we detect) */ |
| 30 | const char *name; |
| 31 | --- a/ath/if_ath.c |
| 32 | +++ b/ath/if_ath.c |
| 33 | @@ -4705,6 +4705,46 @@ ath_beacon_setup(struct ath_softc *sc, s |
| 34 | #undef USE_SHPREAMBLE |
| 35 | } |
| 36 | |
| 37 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) |
| 38 | +static inline int atomic_cmpxchg(atomic_t *v, int old, int new) |
| 39 | +{ |
| 40 | + int ret; |
| 41 | + unsigned long flags; |
| 42 | + |
| 43 | + local_irq_save(flags); |
| 44 | + ret = v->counter; |
| 45 | + if (likely(ret == old)) |
| 46 | + v->counter = new; |
| 47 | + local_irq_restore(flags); |
| 48 | + |
| 49 | + return ret; |
| 50 | +} |
| 51 | + |
| 52 | +/** |
| 53 | + * atomic_add_unless - add unless the number is a given value |
| 54 | + * @v: pointer of type atomic_t |
| 55 | + * @a: the amount to add to v... |
| 56 | + * @u: ...unless v is equal to u. |
| 57 | + * |
| 58 | + * Atomically adds @a to @v, so long as it was not @u. |
| 59 | + * Returns non-zero if @v was not @u, and zero otherwise. |
| 60 | + */ |
| 61 | +static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) |
| 62 | +{ |
| 63 | + int c, old; |
| 64 | + c = atomic_read(v); |
| 65 | + for (;;) { |
| 66 | + if (unlikely(c == (u))) |
| 67 | + break; |
| 68 | + old = atomic_cmpxchg((v), c, c + (a)); |
| 69 | + if (likely(old == c)) |
| 70 | + break; |
| 71 | + c = old; |
| 72 | + } |
| 73 | + return c != (u); |
| 74 | +} |
| 75 | +#endif |
| 76 | + |
| 77 | /* |
| 78 | * Generate beacon frame and queue cab data for a VAP. |
| 79 | */ |
| 80 | --- /dev/null |
| 81 | +++ b/net80211/sort.c |
| 82 | @@ -0,0 +1,120 @@ |
| 83 | +/* |
| 84 | + * A fast, small, non-recursive O(nlog n) sort for the Linux kernel |
| 85 | + * |
| 86 | + * Jan 23 2005 Matt Mackall <mpm@selenic.com> |
| 87 | + */ |
| 88 | + |
| 89 | +#include <linux/kernel.h> |
| 90 | +#include <linux/module.h> |
| 91 | +#include <linux/slab.h> |
| 92 | + |
| 93 | +static void u32_swap(void *a, void *b, int size) |
| 94 | +{ |
| 95 | + u32 t = *(u32 *)a; |
| 96 | + *(u32 *)a = *(u32 *)b; |
| 97 | + *(u32 *)b = t; |
| 98 | +} |
| 99 | + |
| 100 | +static void generic_swap(void *a, void *b, int size) |
| 101 | +{ |
| 102 | + char t; |
| 103 | + |
| 104 | + do { |
| 105 | + t = *(char *)a; |
| 106 | + *(char *)a++ = *(char *)b; |
| 107 | + *(char *)b++ = t; |
| 108 | + } while (--size > 0); |
| 109 | +} |
| 110 | + |
| 111 | +/** |
| 112 | + * sort - sort an array of elements |
| 113 | + * @base: pointer to data to sort |
| 114 | + * @num: number of elements |
| 115 | + * @size: size of each element |
| 116 | + * @cmp: pointer to comparison function |
| 117 | + * @swap: pointer to swap function or NULL |
| 118 | + * |
| 119 | + * This function does a heapsort on the given array. You may provide a |
| 120 | + * swap function optimized to your element type. |
| 121 | + * |
| 122 | + * Sorting time is O(n log n) both on average and worst-case. While |
| 123 | + * qsort is about 20% faster on average, it suffers from exploitable |
| 124 | + * O(n*n) worst-case behavior and extra memory requirements that make |
| 125 | + * it less suitable for kernel use. |
| 126 | + */ |
| 127 | + |
| 128 | +static void sort(void *base, size_t num, size_t size, |
| 129 | + int (*cmp)(const void *, const void *), |
| 130 | + void (*swap)(void *, void *, int size)) |
| 131 | +{ |
| 132 | + /* pre-scale counters for performance */ |
| 133 | + int i = (num/2 - 1) * size, n = num * size, c, r; |
| 134 | + |
| 135 | + if (!swap) |
| 136 | + swap = (size == 4 ? u32_swap : generic_swap); |
| 137 | + |
| 138 | + /* heapify */ |
| 139 | + for ( ; i >= 0; i -= size) { |
| 140 | + for (r = i; r * 2 + size < n; r = c) { |
| 141 | + c = r * 2 + size; |
| 142 | + if (c < n - size && cmp(base + c, base + c + size) < 0) |
| 143 | + c += size; |
| 144 | + if (cmp(base + r, base + c) >= 0) |
| 145 | + break; |
| 146 | + swap(base + r, base + c, size); |
| 147 | + } |
| 148 | + } |
| 149 | + |
| 150 | + /* sort */ |
| 151 | + for (i = n - size; i >= 0; i -= size) { |
| 152 | + swap(base, base + i, size); |
| 153 | + for (r = 0; r * 2 + size < i; r = c) { |
| 154 | + c = r * 2 + size; |
| 155 | + if (c < i - size && cmp(base + c, base + c + size) < 0) |
| 156 | + c += size; |
| 157 | + if (cmp(base + r, base + c) >= 0) |
| 158 | + break; |
| 159 | + swap(base + r, base + c, size); |
| 160 | + } |
| 161 | + } |
| 162 | +} |
| 163 | + |
| 164 | +EXPORT_SYMBOL(sort); |
| 165 | + |
| 166 | +#if 0 |
| 167 | +/* a simple boot-time regression test */ |
| 168 | + |
| 169 | +int cmpint(const void *a, const void *b) |
| 170 | +{ |
| 171 | + return *(int *)a - *(int *)b; |
| 172 | +} |
| 173 | + |
| 174 | +static int sort_test(void) |
| 175 | +{ |
| 176 | + int *a, i, r = 1; |
| 177 | + |
| 178 | + a = kmalloc(1000 * sizeof(int), GFP_KERNEL); |
| 179 | + BUG_ON(!a); |
| 180 | + |
| 181 | + printk("testing sort()\n"); |
| 182 | + |
| 183 | + for (i = 0; i < 1000; i++) { |
| 184 | + r = (r * 725861) % 6599; |
| 185 | + a[i] = r; |
| 186 | + } |
| 187 | + |
| 188 | + sort(a, 1000, sizeof(int), cmpint, NULL); |
| 189 | + |
| 190 | + for (i = 0; i < 999; i++) |
| 191 | + if (a[i] > a[i+1]) { |
| 192 | + printk("sort() failed!\n"); |
| 193 | + break; |
| 194 | + } |
| 195 | + |
| 196 | + kfree(a); |
| 197 | + |
| 198 | + return 0; |
| 199 | +} |
| 200 | + |
| 201 | +module_init(sort_test); |
| 202 | +#endif |
| 203 | |