1 Index: madwifi-trunk-r3776/ath/if_athvar.h
2 ===================================================================
3 --- madwifi-trunk-r3776.orig/ath/if_athvar.h 2008-07-17 00:21:39.000000000 +0200
4 +++ madwifi-trunk-r3776/ath/if_athvar.h 2008-07-17 00:50:03.000000000 +0200
6 #define ATH_GET_NETDEV_DEV(ndev) ((ndev)->class_dev.dev)
10 +#define NETDEV_TX_OK 0
11 +#define NETDEV_TX_BUSY 1
14 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)
15 static inline struct net_device *_alloc_netdev(int sizeof_priv, const char *mask,
16 void (*setup)(struct net_device *))
17 Index: madwifi-trunk-r3776/ath/if_ath_radar.c
18 ===================================================================
19 --- madwifi-trunk-r3776.orig/ath/if_ath_radar.c 2008-07-17 00:21:39.000000000 +0200
20 +++ madwifi-trunk-r3776/ath/if_ath_radar.c 2008-07-17 00:50:03.000000000 +0200
22 #define nofloat_pct(_value, _pct) \
23 ( (_value * (1000 + _pct)) / 1000 )
25 +#ifndef list_for_each_entry_reverse
26 +#define list_for_each_entry_reverse(pos, head, member) \
27 + for (pos = list_entry((head)->prev, typeof(*pos), member); \
28 + prefetch(pos->member.prev), &pos->member != (head); \
29 + pos = list_entry(pos->member.prev, typeof(*pos), member))
32 struct radar_pattern_specification {
33 /* The name of the rule/specification (i.e. what did we detect) */
35 Index: madwifi-trunk-r3776/ath/if_ath.c
36 ===================================================================
37 --- madwifi-trunk-r3776.orig/ath/if_ath.c 2008-07-17 00:47:22.000000000 +0200
38 +++ madwifi-trunk-r3776/ath/if_ath.c 2008-07-17 00:50:03.000000000 +0200
39 @@ -4878,6 +4878,46 @@
40 return (txqs & (1 << qnum));
43 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
44 +static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
47 + unsigned long flags;
49 + local_irq_save(flags);
51 + if (likely(ret == old))
53 + local_irq_restore(flags);
59 + * atomic_add_unless - add unless the number is a given value
60 + * @v: pointer of type atomic_t
61 + * @a: the amount to add to v...
62 + * @u: ...unless v is equal to u.
64 + * Atomically adds @a to @v, so long as it was not @u.
65 + * Returns non-zero if @v was not @u, and zero otherwise.
67 +static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
72 + if (unlikely(c == (u)))
74 + old = atomic_cmpxchg((v), c, c + (a));
75 + if (likely(old == c))
84 * Generate beacon frame and queue cab data for a VAP.
86 Index: madwifi-trunk-r3776/net80211/sort.c
87 ===================================================================
88 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
89 +++ madwifi-trunk-r3776/net80211/sort.c 2008-07-17 00:50:03.000000000 +0200
92 + * A fast, small, non-recursive O(nlog n) sort for the Linux kernel
94 + * Jan 23 2005 Matt Mackall <mpm@selenic.com>
97 +#include <linux/kernel.h>
98 +#include <linux/module.h>
99 +#include <linux/slab.h>
101 +static void u32_swap(void *a, void *b, int size)
104 + *(u32 *)a = *(u32 *)b;
108 +static void generic_swap(void *a, void *b, int size)
114 + *(char *)a++ = *(char *)b;
116 + } while (--size > 0);
120 + * sort - sort an array of elements
121 + * @base: pointer to data to sort
122 + * @num: number of elements
123 + * @size: size of each element
124 + * @cmp: pointer to comparison function
125 + * @swap: pointer to swap function or NULL
127 + * This function does a heapsort on the given array. You may provide a
128 + * swap function optimized to your element type.
130 + * Sorting time is O(n log n) both on average and worst-case. While
131 + * qsort is about 20% faster on average, it suffers from exploitable
132 + * O(n*n) worst-case behavior and extra memory requirements that make
133 + * it less suitable for kernel use.
136 +static void sort(void *base, size_t num, size_t size,
137 + int (*cmp)(const void *, const void *),
138 + void (*swap)(void *, void *, int size))
140 + /* pre-scale counters for performance */
141 + int i = (num/2 - 1) * size, n = num * size, c, r;
144 + swap = (size == 4 ? u32_swap : generic_swap);
147 + for ( ; i >= 0; i -= size) {
148 + for (r = i; r * 2 + size < n; r = c) {
150 + if (c < n - size && cmp(base + c, base + c + size) < 0)
152 + if (cmp(base + r, base + c) >= 0)
154 + swap(base + r, base + c, size);
159 + for (i = n - size; i >= 0; i -= size) {
160 + swap(base, base + i, size);
161 + for (r = 0; r * 2 + size < i; r = c) {
163 + if (c < i - size && cmp(base + c, base + c + size) < 0)
165 + if (cmp(base + r, base + c) >= 0)
167 + swap(base + r, base + c, size);
172 +EXPORT_SYMBOL(sort);
175 +/* a simple boot-time regression test */
177 +int cmpint(const void *a, const void *b)
179 + return *(int *)a - *(int *)b;
182 +static int sort_test(void)
186 + a = kmalloc(1000 * sizeof(int), GFP_KERNEL);
189 + printk("testing sort()\n");
191 + for (i = 0; i < 1000; i++) {
192 + r = (r * 725861) % 6599;
196 + sort(a, 1000, sizeof(int), cmpint, NULL);
198 + for (i = 0; i < 999; i++)
199 + if (a[i] > a[i+1]) {
200 + printk("sort() failed!\n");
209 +module_init(sort_test);