From 8bccd2e819bc4c013d3fb83841460217d7f76989 Mon Sep 17 00:00:00 2001 From: nbd Date: Thu, 13 Dec 2007 04:26:55 +0000 Subject: refresh patches, make madwifi-dfs compile on linux 2.4 again git-svn-id: svn://svn.openwrt.org/openwrt/trunk@9719 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/madwifi/patches/124-linux24_compat.patch | 223 ++++++++++++++++++++++- 1 file changed, 220 insertions(+), 3 deletions(-) (limited to 'package/madwifi/patches/124-linux24_compat.patch') diff --git a/package/madwifi/patches/124-linux24_compat.patch b/package/madwifi/patches/124-linux24_compat.patch index 69657b261..59bf7f728 100644 --- a/package/madwifi/patches/124-linux24_compat.patch +++ b/package/madwifi/patches/124-linux24_compat.patch @@ -1,7 +1,7 @@ -Index: madwifi-ng-r2834-20071106/ath/if_athvar.h +Index: madwifi-dfs-r3053/ath/if_athvar.h =================================================================== ---- madwifi-ng-r2834-20071106.orig/ath/if_athvar.h 2007-11-07 14:02:02.861533944 +0100 -+++ madwifi-ng-r2834-20071106/ath/if_athvar.h 2007-11-07 14:02:03.557573608 +0100 +--- madwifi-dfs-r3053.orig/ath/if_athvar.h 2007-12-13 05:25:10.534225778 +0100 ++++ madwifi-dfs-r3053/ath/if_athvar.h 2007-12-13 05:25:12.842357313 +0100 @@ -128,6 +128,11 @@ #define NETDEV_TX_BUSY 1 #endif @@ -14,3 +14,220 @@ Index: madwifi-ng-r2834-20071106/ath/if_athvar.h #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) static inline struct net_device *_alloc_netdev(int sizeof_priv, const char *mask, void (*setup)(struct net_device *)) +Index: madwifi-dfs-r3053/ath/if_ath_radar.c +=================================================================== +--- madwifi-dfs-r3053.orig/ath/if_ath_radar.c 2007-12-13 05:25:10.538226007 +0100 ++++ madwifi-dfs-r3053/ath/if_ath_radar.c 2007-12-13 05:25:12.850357768 +0100 +@@ -92,6 +92,13 @@ + #define nofloat_pct(_value, _pct) \ + ( (_value * (1000 + _pct)) / 1000 ) + ++#ifndef list_for_each_entry_reverse ++#define list_for_each_entry_reverse(pos, head, member) \ ++ for (pos = list_entry((head)->prev, typeof(*pos), member); \ ++ prefetch(pos->member.prev), &pos->member != (head); \ ++ pos = list_entry(pos->member.prev, typeof(*pos), member)) ++#endif ++ + struct radar_pattern_specification { + /* The name of the rule/specification (i.e. what did we detect) */ + const char *name; +Index: madwifi-dfs-r3053/ath/if_ath.c +=================================================================== +--- madwifi-dfs-r3053.orig/ath/if_ath.c 2007-12-13 05:25:11.582285503 +0100 ++++ madwifi-dfs-r3053/ath/if_ath.c 2007-12-13 05:25:12.854357994 +0100 +@@ -4595,6 +4595,46 @@ + #undef USE_SHPREAMBLE + } + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) ++static inline int atomic_cmpxchg(atomic_t *v, int old, int new) ++{ ++ int ret; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ ret = v->counter; ++ if (likely(ret == old)) ++ v->counter = new; ++ local_irq_restore(flags); ++ ++ return ret; ++} ++ ++/** ++ * atomic_add_unless - add unless the number is a given value ++ * @v: pointer of type atomic_t ++ * @a: the amount to add to v... ++ * @u: ...unless v is equal to u. ++ * ++ * Atomically adds @a to @v, so long as it was not @u. ++ * Returns non-zero if @v was not @u, and zero otherwise. ++ */ ++static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) ++{ ++ int c, old; ++ c = atomic_read(v); ++ for (;;) { ++ if (unlikely(c == (u))) ++ break; ++ old = atomic_cmpxchg((v), c, c + (a)); ++ if (likely(old == c)) ++ break; ++ c = old; ++ } ++ return c != (u); ++} ++#endif ++ + /* + * Generate beacon frame and queue cab data for a VAP. + */ +Index: madwifi-dfs-r3053/net80211/ieee80211_scan_ap.c +=================================================================== +--- madwifi-dfs-r3053.orig/net80211/ieee80211_scan_ap.c 2007-12-13 05:25:10.554226918 +0100 ++++ madwifi-dfs-r3053/net80211/ieee80211_scan_ap.c 2007-12-13 05:25:12.858358223 +0100 +@@ -46,12 +46,16 @@ + #include + #include + #include +-#include +- + #include "if_media.h" + + #include + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11) ++#include "sort.c" ++#else ++#include ++#endif ++ + #define AP_PURGE_SCANS 2 /* age for purging entries (scans) */ + #define RSSI_LPF_LEN 10 + #define RSSI_EP_MULTIPLIER (1<<7) /* pow2 to optimize out * and / */ +Index: madwifi-dfs-r3053/net80211/sort.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ madwifi-dfs-r3053/net80211/sort.c 2007-12-13 05:25:12.862358452 +0100 +@@ -0,0 +1,120 @@ ++/* ++ * A fast, small, non-recursive O(nlog n) sort for the Linux kernel ++ * ++ * Jan 23 2005 Matt Mackall ++ */ ++ ++#include ++#include ++#include ++ ++static void u32_swap(void *a, void *b, int size) ++{ ++ u32 t = *(u32 *)a; ++ *(u32 *)a = *(u32 *)b; ++ *(u32 *)b = t; ++} ++ ++static void generic_swap(void *a, void *b, int size) ++{ ++ char t; ++ ++ do { ++ t = *(char *)a; ++ *(char *)a++ = *(char *)b; ++ *(char *)b++ = t; ++ } while (--size > 0); ++} ++ ++/** ++ * sort - sort an array of elements ++ * @base: pointer to data to sort ++ * @num: number of elements ++ * @size: size of each element ++ * @cmp: pointer to comparison function ++ * @swap: pointer to swap function or NULL ++ * ++ * This function does a heapsort on the given array. You may provide a ++ * swap function optimized to your element type. ++ * ++ * Sorting time is O(n log n) both on average and worst-case. While ++ * qsort is about 20% faster on average, it suffers from exploitable ++ * O(n*n) worst-case behavior and extra memory requirements that make ++ * it less suitable for kernel use. ++ */ ++ ++static void sort(void *base, size_t num, size_t size, ++ int (*cmp)(const void *, const void *), ++ void (*swap)(void *, void *, int size)) ++{ ++ /* pre-scale counters for performance */ ++ int i = (num/2 - 1) * size, n = num * size, c, r; ++ ++ if (!swap) ++ swap = (size == 4 ? u32_swap : generic_swap); ++ ++ /* heapify */ ++ for ( ; i >= 0; i -= size) { ++ for (r = i; r * 2 + size < n; r = c) { ++ c = r * 2 + size; ++ if (c < n - size && cmp(base + c, base + c + size) < 0) ++ c += size; ++ if (cmp(base + r, base + c) >= 0) ++ break; ++ swap(base + r, base + c, size); ++ } ++ } ++ ++ /* sort */ ++ for (i = n - size; i >= 0; i -= size) { ++ swap(base, base + i, size); ++ for (r = 0; r * 2 + size < i; r = c) { ++ c = r * 2 + size; ++ if (c < i - size && cmp(base + c, base + c + size) < 0) ++ c += size; ++ if (cmp(base + r, base + c) >= 0) ++ break; ++ swap(base + r, base + c, size); ++ } ++ } ++} ++ ++EXPORT_SYMBOL(sort); ++ ++#if 0 ++/* a simple boot-time regression test */ ++ ++int cmpint(const void *a, const void *b) ++{ ++ return *(int *)a - *(int *)b; ++} ++ ++static int sort_test(void) ++{ ++ int *a, i, r = 1; ++ ++ a = kmalloc(1000 * sizeof(int), GFP_KERNEL); ++ BUG_ON(!a); ++ ++ printk("testing sort()\n"); ++ ++ for (i = 0; i < 1000; i++) { ++ r = (r * 725861) % 6599; ++ a[i] = r; ++ } ++ ++ sort(a, 1000, sizeof(int), cmpint, NULL); ++ ++ for (i = 0; i < 999; i++) ++ if (a[i] > a[i+1]) { ++ printk("sort() failed!\n"); ++ break; ++ } ++ ++ kfree(a); ++ ++ return 0; ++} ++ ++module_init(sort_test); ++#endif -- cgit v1.2.3