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 | |
54 | enum AR5523_flags { |
55 | AR5523_HW_UP, |
56 | AR5523_USB_DISCONNECTED, |
57 | AR5523_CONNECTED |
58 | }; |
59 | |
60 | struct 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 | */ |
74 | struct ar5523_tx_data { |
75 | struct list_head list; |
76 | struct ar5523 *ar; |
77 | struct urb *urb; |
78 | }; |
79 | |
80 | struct ar5523_rx_data { |
81 | struct list_head list; |
82 | struct ar5523 *ar; |
83 | struct urb *urb; |
84 | struct sk_buff *skb; |
85 | }; |
86 | |
87 | struct 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...) \ |
145 | do { \ |
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) |
152 | |