aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/main.c
diff options
context:
space:
mode:
authorLuis R. Rodriguez <lrodriguez@atheros.com>2009-08-12 12:56:59 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-08-14 09:14:05 -0400
commitd15dd3e5d74186a3b0a4db271b440bbdc0f6da36 (patch)
tree782cad60e7caa4330f23ef141cc2aec25663097e /drivers/net/wireless/ath/main.c
parent5ef5da0ff2fc4f04c856f4ce9a757e318a02ad06 (diff)
ath: add common ath_rxbuf_alloc() and make ath9k use it
Turns out ath5k and ath9k can share the same helper to allocates RX skbs. We allocate skbs aligned to the cache line size. This requirement seems to have come from AR5210; when this was not done it seems sometimes we'd get bogus data. I'm also told it may have been a performance enhancement consideration. In the end I can't be sure we can remove this on new hardware so just keep this and start sharing it through ath.ko. Make ath9k start using this, ath5k is next. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/main.c')
-rw-r--r--drivers/net/wireless/ath/main.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/main.c b/drivers/net/wireless/ath/main.c
index 9949b11cb151..487193f1de1a 100644
--- a/drivers/net/wireless/ath/main.c
+++ b/drivers/net/wireless/ath/main.c
@@ -17,6 +17,42 @@
17#include <linux/kernel.h> 17#include <linux/kernel.h>
18#include <linux/module.h> 18#include <linux/module.h>
19 19
20#include "ath.h"
21
20MODULE_AUTHOR("Atheros Communications"); 22MODULE_AUTHOR("Atheros Communications");
21MODULE_DESCRIPTION("Shared library for Atheros wireless LAN cards."); 23MODULE_DESCRIPTION("Shared library for Atheros wireless LAN cards.");
22MODULE_LICENSE("Dual BSD/GPL"); 24MODULE_LICENSE("Dual BSD/GPL");
25
26struct sk_buff *ath_rxbuf_alloc(struct ath_common *common,
27 u32 len,
28 gfp_t gfp_mask)
29{
30 struct sk_buff *skb;
31 u32 off;
32
33 /*
34 * Cache-line-align. This is important (for the
35 * 5210 at least) as not doing so causes bogus data
36 * in rx'd frames.
37 */
38
39 /* Note: the kernel can allocate a value greater than
40 * what we ask it to give us. We really only need 4 KB as that
41 * is this hardware supports and in fact we need at least 3849
42 * as that is the MAX AMSDU size this hardware supports.
43 * Unfortunately this means we may get 8 KB here from the
44 * kernel... and that is actually what is observed on some
45 * systems :( */
46 skb = __dev_alloc_skb(len + common->cachelsz - 1, gfp_mask);
47 if (skb != NULL) {
48 off = ((unsigned long) skb->data) % common->cachelsz;
49 if (off != 0)
50 skb_reserve(skb, common->cachelsz - off);
51 } else {
52 printk(KERN_ERR "skbuff alloc of size %u failed\n", len);
53 return NULL;
54 }
55
56 return skb;
57}
58EXPORT_SYMBOL(ath_rxbuf_alloc);