cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ar5523.h (4175B)


      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 urb		*urb;
     78};
     79
     80struct ar5523_rx_data {
     81	struct	list_head	list;
     82	struct ar5523		*ar;
     83	struct urb		*urb;
     84	struct sk_buff		*skb;
     85};
     86
     87struct ar5523 {
     88	struct usb_device	*dev;
     89	struct ieee80211_hw	*hw;
     90
     91	unsigned long		flags;
     92	struct mutex		mutex;
     93	struct workqueue_struct *wq;
     94
     95	struct ar5523_tx_cmd	tx_cmd;
     96
     97	struct delayed_work	stat_work;
     98
     99	struct timer_list	tx_wd_timer;
    100	struct work_struct	tx_wd_work;
    101	struct work_struct	tx_work;
    102	struct list_head	tx_queue_pending;
    103	struct list_head	tx_queue_submitted;
    104	spinlock_t		tx_data_list_lock;
    105	wait_queue_head_t	tx_flush_waitq;
    106
    107	/* Queued + Submitted TX frames */
    108	atomic_t		tx_nr_total;
    109
    110	/* Submitted TX frames */
    111	atomic_t		tx_nr_pending;
    112
    113	void			*rx_cmd_buf;
    114	struct urb		*rx_cmd_urb;
    115
    116	struct ar5523_rx_data	rx_data[AR5523_RX_DATA_COUNT];
    117	spinlock_t		rx_data_list_lock;
    118	struct list_head	rx_data_free;
    119	struct list_head	rx_data_used;
    120	atomic_t		rx_data_free_cnt;
    121
    122	struct work_struct	rx_refill_work;
    123
    124	unsigned int		rxbufsz;
    125	u8			serial[16];
    126
    127	struct ieee80211_channel channels[14];
    128	struct ieee80211_rate	rates[12];
    129	struct ieee80211_supported_band band;
    130	struct ieee80211_vif	*vif;
    131};
    132
    133/* flags for sending firmware commands */
    134#define AR5523_CMD_FLAG_READ	(1 << 1)
    135#define AR5523_CMD_FLAG_MAGIC	(1 << 2)
    136
    137#define ar5523_dbg(ar, format, arg...) \
    138	dev_dbg(&(ar)->dev->dev, format, ## arg)
    139
    140/* On USB hot-unplug there can be a lot of URBs in flight and they'll all
    141 * fail. Instead of dealing with them in every possible place just surpress
    142 * any messages on USB disconnect.
    143 */
    144#define ar5523_err(ar, format, arg...) \
    145do { \
    146	if (!test_bit(AR5523_USB_DISCONNECTED, &ar->flags)) { \
    147		dev_err(&(ar)->dev->dev, format, ## arg); \
    148	} \
    149} while (0)
    150#define ar5523_info(ar, format, arg...)	\
    151	dev_info(&(ar)->dev->dev, format, ## arg)