Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / net / wireless / ath / ar5523 / ar5523.h
diff --git a/kernel/drivers/net/wireless/ath/ar5523/ar5523.h b/kernel/drivers/net/wireless/ath/ar5523/ar5523.h
new file mode 100644 (file)
index 0000000..9a322a6
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2006 Damien Bergamini <damien.bergamini@free.fr>
+ * Copyright (c) 2006 Sam Leffler, Errno Consulting
+ * Copyright (c) 2007 Christoph Hellwig <hch@lst.de>
+ * Copyright (c) 2008-2009 Weongyo Jeong <weongyo@freebsd.org>
+ * Copyright (c) 2012 Pontus Fuchs <pontus.fuchs@gmail.com>
+ *
+ * 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.
+ */
+
+#define AR5523_FLAG_PRE_FIRMWARE       (1 << 0)
+#define AR5523_FLAG_ABG                        (1 << 1)
+
+#define AR5523_FIRMWARE_FILE   "ar5523.bin"
+
+#define AR5523_CMD_TX_PIPE     0x01
+#define        AR5523_DATA_TX_PIPE     0x02
+#define        AR5523_CMD_RX_PIPE      0x81
+#define        AR5523_DATA_RX_PIPE     0x82
+
+#define ar5523_cmd_tx_pipe(dev) \
+       usb_sndbulkpipe((dev), AR5523_CMD_TX_PIPE)
+#define ar5523_data_tx_pipe(dev) \
+       usb_sndbulkpipe((dev), AR5523_DATA_TX_PIPE)
+#define ar5523_cmd_rx_pipe(dev) \
+       usb_rcvbulkpipe((dev), AR5523_CMD_RX_PIPE)
+#define ar5523_data_rx_pipe(dev) \
+       usb_rcvbulkpipe((dev), AR5523_DATA_RX_PIPE)
+
+#define        AR5523_DATA_TIMEOUT     10000
+#define        AR5523_CMD_TIMEOUT      1000
+
+#define AR5523_TX_DATA_COUNT           8
+#define AR5523_TX_DATA_RESTART_COUNT   2
+#define AR5523_RX_DATA_COUNT           16
+#define AR5523_RX_DATA_REFILL_COUNT    8
+
+#define AR5523_CMD_ID  1
+#define AR5523_DATA_ID 2
+
+#define AR5523_TX_WD_TIMEOUT   (HZ * 2)
+#define AR5523_FLUSH_TIMEOUT   (HZ * 3)
+
+enum AR5523_flags {
+       AR5523_HW_UP,
+       AR5523_USB_DISCONNECTED,
+       AR5523_CONNECTED
+};
+
+struct ar5523_tx_cmd {
+       struct ar5523           *ar;
+       struct urb              *urb_tx;
+       void                    *buf_tx;
+       void                    *odata;
+       int                     olen;
+       int                     flags;
+       int                     res;
+       struct completion       done;
+};
+
+/* This struct is placed in tx_info->driver_data. It must not be larger
+ *  than IEEE80211_TX_INFO_DRIVER_DATA_SIZE.
+ */
+struct ar5523_tx_data {
+       struct list_head        list;
+       struct ar5523           *ar;
+       struct urb              *urb;
+};
+
+struct ar5523_rx_data {
+       struct  list_head       list;
+       struct ar5523           *ar;
+       struct urb              *urb;
+       struct sk_buff          *skb;
+};
+
+struct ar5523 {
+       struct usb_device       *dev;
+       struct ieee80211_hw     *hw;
+
+       unsigned long           flags;
+       struct mutex            mutex;
+       struct workqueue_struct *wq;
+
+       struct ar5523_tx_cmd    tx_cmd;
+
+       struct delayed_work     stat_work;
+
+       struct timer_list       tx_wd_timer;
+       struct work_struct      tx_wd_work;
+       struct work_struct      tx_work;
+       struct list_head        tx_queue_pending;
+       struct list_head        tx_queue_submitted;
+       spinlock_t              tx_data_list_lock;
+       wait_queue_head_t       tx_flush_waitq;
+
+       /* Queued + Submitted TX frames */
+       atomic_t                tx_nr_total;
+
+       /* Submitted TX frames */
+       atomic_t                tx_nr_pending;
+
+       void                    *rx_cmd_buf;
+       struct urb              *rx_cmd_urb;
+
+       struct ar5523_rx_data   rx_data[AR5523_RX_DATA_COUNT];
+       spinlock_t              rx_data_list_lock;
+       struct list_head        rx_data_free;
+       struct list_head        rx_data_used;
+       atomic_t                rx_data_free_cnt;
+
+       struct work_struct      rx_refill_work;
+
+       unsigned int            rxbufsz;
+       u8                      serial[16];
+
+       struct ieee80211_channel channels[14];
+       struct ieee80211_rate   rates[12];
+       struct ieee80211_supported_band band;
+       struct ieee80211_vif    *vif;
+};
+
+/* flags for sending firmware commands */
+#define AR5523_CMD_FLAG_READ   (1 << 1)
+#define AR5523_CMD_FLAG_MAGIC  (1 << 2)
+
+#define ar5523_dbg(ar, format, arg...) \
+       dev_dbg(&(ar)->dev->dev, format, ## arg)
+
+/* On USB hot-unplug there can be a lot of URBs in flight and they'll all
+ * fail. Instead of dealing with them in every possible place just surpress
+ * any messages on USB disconnect.
+ */
+#define ar5523_err(ar, format, arg...) \
+do { \
+       if (!test_bit(AR5523_USB_DISCONNECTED, &ar->flags)) { \
+               dev_err(&(ar)->dev->dev, format, ## arg); \
+       } \
+} while (0)
+#define ar5523_info(ar, format, arg...)        \
+       dev_info(&(ar)->dev->dev, format, ## arg)