linux/drivers/net/wireless/ath/main.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2009 Atheros Communications Inc.
   3 *
   4 * Permission to use, copy, modify, and/or distribute this software for any
   5 * purpose with or without fee is hereby granted, provided that the above
   6 * copyright notice and this permission notice appear in all copies.
   7 *
   8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15 */
  16
  17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  18
  19#include <linux/kernel.h>
  20#include <linux/module.h>
  21
  22#include "ath.h"
  23
  24MODULE_AUTHOR("Atheros Communications");
  25MODULE_DESCRIPTION("Shared library for Atheros wireless LAN cards.");
  26MODULE_LICENSE("Dual BSD/GPL");
  27
  28struct sk_buff *ath_rxbuf_alloc(struct ath_common *common,
  29                                u32 len,
  30                                gfp_t gfp_mask)
  31{
  32        struct sk_buff *skb;
  33        u32 off;
  34
  35        /*
  36         * Cache-line-align.  This is important (for the
  37         * 5210 at least) as not doing so causes bogus data
  38         * in rx'd frames.
  39         */
  40
  41        /* Note: the kernel can allocate a value greater than
  42         * what we ask it to give us. We really only need 4 KB as that
  43         * is this hardware supports and in fact we need at least 3849
  44         * as that is the MAX AMSDU size this hardware supports.
  45         * Unfortunately this means we may get 8 KB here from the
  46         * kernel... and that is actually what is observed on some
  47         * systems :( */
  48        skb = __dev_alloc_skb(len + common->cachelsz - 1, gfp_mask);
  49        if (skb != NULL) {
  50                off = ((unsigned long) skb->data) % common->cachelsz;
  51                if (off != 0)
  52                        skb_reserve(skb, common->cachelsz - off);
  53        } else {
  54                pr_err("skbuff alloc of size %u failed\n", len);
  55                return NULL;
  56        }
  57
  58        return skb;
  59}
  60EXPORT_SYMBOL(ath_rxbuf_alloc);
  61
  62void ath_printk(const char *level, const struct ath_common* common,
  63                const char *fmt, ...)
  64{
  65        struct va_format vaf;
  66        va_list args;
  67
  68        va_start(args, fmt);
  69
  70        vaf.fmt = fmt;
  71        vaf.va = &args;
  72
  73        if (common && common->hw && common->hw->wiphy)
  74                printk("%sath: %s: %pV",
  75                       level, wiphy_name(common->hw->wiphy), &vaf);
  76        else
  77                printk("%sath: %pV", level, &vaf);
  78
  79        va_end(args);
  80}
  81EXPORT_SYMBOL(ath_printk);
  82