2009-04-14 22:11:20 +02:00
/*
* Copyright ( c ) 2009 Atheros Communications Inc .
*
* Permission to use , copy , modify , and / or distribute this software for any
* purpose with or without fee is hereby granted , provided that the above
* copyright notice and this permission notice appear in all copies .
*
* THE SOFTWARE IS PROVIDED " AS IS " AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS . IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL , DIRECT , INDIRECT , OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE , DATA OR PROFITS , WHETHER IN AN
* ACTION OF CONTRACT , NEGLIGENCE OR OTHER TORTIOUS ACTION , ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE .
*/
# include <linux/kernel.h>
# include <linux/module.h>
2009-08-12 09:56:59 -07:00
# include "ath.h"
2009-04-14 22:11:20 +02:00
MODULE_AUTHOR ( " Atheros Communications " ) ;
MODULE_DESCRIPTION ( " Shared library for Atheros wireless LAN cards. " ) ;
MODULE_LICENSE ( " Dual BSD/GPL " ) ;
2009-08-12 09:56:59 -07:00
struct sk_buff * ath_rxbuf_alloc ( struct ath_common * common ,
u32 len ,
gfp_t gfp_mask )
{
struct sk_buff * skb ;
u32 off ;
/*
* Cache - line - align . This is important ( for the
* 5210 at least ) as not doing so causes bogus data
* in rx ' d frames .
*/
/* Note: the kernel can allocate a value greater than
* what we ask it to give us . We really only need 4 KB as that
* is this hardware supports and in fact we need at least 3849
* as that is the MAX AMSDU size this hardware supports .
* Unfortunately this means we may get 8 KB here from the
* kernel . . . and that is actually what is observed on some
* systems : ( */
skb = __dev_alloc_skb ( len + common - > cachelsz - 1 , gfp_mask ) ;
if ( skb ! = NULL ) {
off = ( ( unsigned long ) skb - > data ) % common - > cachelsz ;
if ( off ! = 0 )
skb_reserve ( skb , common - > cachelsz - off ) ;
} else {
printk ( KERN_ERR " skbuff alloc of size %u failed \n " , len ) ;
return NULL ;
}
return skb ;
}
EXPORT_SYMBOL ( ath_rxbuf_alloc ) ;
2010-12-02 19:12:35 -08:00
int ath_printk ( const char * level , struct ath_common * common ,
const char * fmt , . . . )
{
struct va_format vaf ;
va_list args ;
int rtn ;
va_start ( args , fmt ) ;
vaf . fmt = fmt ;
vaf . va = & args ;
rtn = printk ( " %sath: %pV " , level , & vaf ) ;
va_end ( args ) ;
return rtn ;
}
EXPORT_SYMBOL ( ath_printk ) ;