linux/drivers/net/wireless/ath/ar5523/ar5523.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2006 Damien Bergamini <damien.bergamini@free.fr>
   3 * Copyright (c) 2006 Sam Leffler, Errno Consulting
   4 * Copyright (c) 2007 Christoph Hellwig <hch@lst.de>
   5 * Copyright (c) 2008-2009 Weongyo Jeong <weongyo@freebsd.org>
   6 * Copyright (c) 2012 Pontus Fuchs <pontus.fuchs@gmail.com>
   7 *
   8 * Permission to use, copy, modify, and/or distribute this software for any
   9 * purpose with or without fee is hereby granted, provided that the above
  10 * copyright notice and this permission notice appear in all copies.
  11 *
  12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19 */
  20
  21#define AR5523_FLAG_PRE_FIRMWARE        (1 << 0)
  22#define AR5523_FLAG_ABG                 (1 << 1)
  23
  24#define AR5523_FIRMWARE_FILE    "ar5523.bin"
  25
  26#define AR5523_CMD_TX_PIPE      0x01
  27#define AR5523_DATA_TX_PIPE     0x02
  28#define AR5523_CMD_RX_PIPE      0x81
  29#define AR5523_DATA_RX_PIPE     0x82
  30
  31#define ar5523_cmd_tx_pipe(dev) \
  32        usb_sndbulkpipe((dev), AR5523_CMD_TX_PIPE)
  33#define ar5523_data_tx_pipe(dev) \
  34        usb_sndbulkpipe((dev), AR5523_DATA_TX_PIPE)
  35#define ar5523_cmd_rx_pipe(dev) \
  36        usb_rcvbulkpipe((dev), AR5523_CMD_RX_PIPE)
  37#define ar5523_data_rx_pipe(dev) \
  38        usb_rcvbulkpipe((dev), AR5523_DATA_RX_PIPE)
  39
  40#define AR5523_DATA_TIMEOUT     10000
  41#define AR5523_CMD_TIMEOUT      1000
  42
  43#define AR5523_TX_DATA_COUNT            8
  44#define AR5523_TX_DATA_RESTART_COUNT    2
  45#define AR5523_RX_DATA_COUNT            16
  46#define AR5523_RX_DATA_REFILL_COUNT     8
  47
  48#define AR5523_CMD_ID   1
  49#define AR5523_DATA_ID  2
  50
  51#define AR5523_TX_WD_TIMEOUT    (HZ * 2)
  52#define AR5523_FLUSH_TIMEOUT    (HZ * 3)
  53
  54enum AR5523_flags {
  55        AR5523_HW_UP,
  56        AR5523_USB_DISCONNECTED,
  57        AR5523_CONNECTED
  58};
  59
  60struct ar5523_tx_cmd {
  61        struct ar5523           *ar;
  62        struct urb              *urb_tx;
  63        void                    *buf_tx;
  64        void                    *odata;
  65        int                     olen;
  66        int                     flags;
  67        int                     res;
  68        struct completion       done;
  69};
  70
  71/* This struct is placed in tx_info->driver_data. It must not be larger
  72 *  than IEEE80211_TX_INFO_DRIVER_DATA_SIZE.
  73 */
  74struct ar5523_tx_data {
  75        struct list_head        list;
  76        struct ar5523           *ar;
  77        struct sk_buff          *skb;
  78        struct urb              *urb;
  79};
  80
  81struct ar5523_rx_data {
  82        struct  list_head       list;
  83        struct ar5523           *ar;
  84        struct urb              *urb;
  85        struct sk_buff          *skb;
  86};
  87
  88struct ar5523 {
  89        struct usb_device       *dev;
  90        struct ieee80211_hw     *hw;
  91
  92        unsigned long           flags;
  93        struct mutex            mutex;
  94        struct workqueue_struct *wq;
  95
  96        struct ar5523_tx_cmd    tx_cmd;
  97
  98        struct delayed_work     stat_work;
  99
 100        struct timer_list       tx_wd_timer;
 101        struct work_struct      tx_wd_work;
 102        struct work_struct      tx_work;
 103        struct list_head        tx_queue_pending;
 104        struct list_head        tx_queue_submitted;
 105        spinlock_t              tx_data_list_lock;
 106        wait_queue_head_t       tx_flush_waitq;
 107
 108        /* Queued + Submitted TX frames */
 109        atomic_t                tx_nr_total;
 110
 111        /* Submitted TX frames */
 112        atomic_t                tx_nr_pending;
 113
 114        void                    *rx_cmd_buf;
 115        struct urb              *rx_cmd_urb;
 116
 117        struct ar5523_rx_data   rx_data[AR5523_RX_DATA_COUNT];
 118        spinlock_t              rx_data_list_lock;
 119        struct list_head        rx_data_free;
 120        struct list_head        rx_data_used;
 121        atomic_t                rx_data_free_cnt;
 122
 123        struct work_struct      rx_refill_work;
 124
 125        unsigned int            rxbufsz;
 126        u8                      serial[16];
 127
 128        struct ieee80211_channel channels[14];
 129        struct ieee80211_rate   rates[12];
 130        struct ieee80211_supported_band band;
 131        struct ieee80211_vif    *vif;
 132};
 133
 134/* flags for sending firmware commands */
 135#define AR5523_CMD_FLAG_READ    (1 << 1)
 136#define AR5523_CMD_FLAG_MAGIC   (1 << 2)
 137
 138#define ar5523_dbg(ar, format, arg...) \
 139        dev_dbg(&(ar)->dev->dev, format, ## arg)
 140
 141/* On USB hot-unplug there can be a lot of URBs in flight and they'll all
 142 * fail. Instead of dealing with them in every possible place just surpress
 143 * any messages on USB disconnect.
 144 */
 145#define ar5523_err(ar, format, arg...) \
 146do { \
 147        if (!test_bit(AR5523_USB_DISCONNECTED, &ar->flags)) { \
 148                dev_err(&(ar)->dev->dev, format, ## arg); \
 149        } \
 150} while (0)
 151#define ar5523_info(ar, format, arg...) \
 152        dev_info(&(ar)->dev->dev, format, ## arg)
 153