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