ar5523: Add new driver
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / net / wireless / ath / ar5523 / ar5523_hw.h
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 /* all fields are big endian */
22 struct ar5523_fwblock {
23 __be32 flags;
24 #define AR5523_WRITE_BLOCK (1 << 4)
25
26 __be32 len;
27 #define AR5523_MAX_FWBLOCK_SIZE 2048
28
29 __be32 total;
30 __be32 remain;
31 __be32 rxtotal;
32 __be32 pad[123];
33 } __packed;
34
35 #define AR5523_MAX_RXCMDSZ 1024
36 #define AR5523_MAX_TXCMDSZ 1024
37
38 struct ar5523_cmd_hdr {
39 __be32 len;
40 __be32 code;
41 /* NB: these are defined for rev 1.5 firmware; rev 1.6 is different */
42 /* messages from Host -> Target */
43 #define WDCMSG_HOST_AVAILABLE 0x01
44 #define WDCMSG_BIND 0x02
45 #define WDCMSG_TARGET_RESET 0x03
46 #define WDCMSG_TARGET_GET_CAPABILITY 0x04
47 #define WDCMSG_TARGET_SET_CONFIG 0x05
48 #define WDCMSG_TARGET_GET_STATUS 0x06
49 #define WDCMSG_TARGET_GET_STATS 0x07
50 #define WDCMSG_TARGET_START 0x08
51 #define WDCMSG_TARGET_STOP 0x09
52 #define WDCMSG_TARGET_ENABLE 0x0a
53 #define WDCMSG_TARGET_DISABLE 0x0b
54 #define WDCMSG_CREATE_CONNECTION 0x0c
55 #define WDCMSG_UPDATE_CONNECT_ATTR 0x0d
56 #define WDCMSG_DELETE_CONNECT 0x0e
57 #define WDCMSG_SEND 0x0f
58 #define WDCMSG_FLUSH 0x10
59 /* messages from Target -> Host */
60 #define WDCMSG_STATS_UPDATE 0x11
61 #define WDCMSG_BMISS 0x12
62 #define WDCMSG_DEVICE_AVAIL 0x13
63 #define WDCMSG_SEND_COMPLETE 0x14
64 #define WDCMSG_DATA_AVAIL 0x15
65 #define WDCMSG_SET_PWR_MODE 0x16
66 #define WDCMSG_BMISS_ACK 0x17
67 #define WDCMSG_SET_LED_STEADY 0x18
68 #define WDCMSG_SET_LED_BLINK 0x19
69 /* more messages */
70 #define WDCMSG_SETUP_BEACON_DESC 0x1a
71 #define WDCMSG_BEACON_INIT 0x1b
72 #define WDCMSG_RESET_KEY_CACHE 0x1c
73 #define WDCMSG_RESET_KEY_CACHE_ENTRY 0x1d
74 #define WDCMSG_SET_KEY_CACHE_ENTRY 0x1e
75 #define WDCMSG_SET_DECOMP_MASK 0x1f
76 #define WDCMSG_SET_REGULATORY_DOMAIN 0x20
77 #define WDCMSG_SET_LED_STATE 0x21
78 #define WDCMSG_WRITE_ASSOCID 0x22
79 #define WDCMSG_SET_STA_BEACON_TIMERS 0x23
80 #define WDCMSG_GET_TSF 0x24
81 #define WDCMSG_RESET_TSF 0x25
82 #define WDCMSG_SET_ADHOC_MODE 0x26
83 #define WDCMSG_SET_BASIC_RATE 0x27
84 #define WDCMSG_MIB_CONTROL 0x28
85 #define WDCMSG_GET_CHANNEL_DATA 0x29
86 #define WDCMSG_GET_CUR_RSSI 0x2a
87 #define WDCMSG_SET_ANTENNA_SWITCH 0x2b
88 #define WDCMSG_USE_SHORT_SLOT_TIME 0x2f
89 #define WDCMSG_SET_POWER_MODE 0x30
90 #define WDCMSG_SETUP_PSPOLL_DESC 0x31
91 #define WDCMSG_SET_RX_MULTICAST_FILTER 0x32
92 #define WDCMSG_RX_FILTER 0x33
93 #define WDCMSG_PER_CALIBRATION 0x34
94 #define WDCMSG_RESET 0x35
95 #define WDCMSG_DISABLE 0x36
96 #define WDCMSG_PHY_DISABLE 0x37
97 #define WDCMSG_SET_TX_POWER_LIMIT 0x38
98 #define WDCMSG_SET_TX_QUEUE_PARAMS 0x39
99 #define WDCMSG_SETUP_TX_QUEUE 0x3a
100 #define WDCMSG_RELEASE_TX_QUEUE 0x3b
101 #define WDCMSG_SET_DEFAULT_KEY 0x43
102
103 __u32 priv; /* driver private data,
104 don't care about endianess */
105 __be32 magic;
106 __be32 reserved2[4];
107 };
108
109 struct ar5523_cmd_host_available {
110 __be32 sw_ver_major;
111 __be32 sw_ver_minor;
112 __be32 sw_ver_patch;
113 __be32 sw_ver_build;
114 } __packed;
115
116 #define ATH_SW_VER_MAJOR 1
117 #define ATH_SW_VER_MINOR 5
118 #define ATH_SW_VER_PATCH 0
119 #define ATH_SW_VER_BUILD 9999
120
121 struct ar5523_chunk {
122 u8 seqnum; /* sequence number for ordering */
123 u8 flags;
124 #define UATH_CFLAGS_FINAL 0x01 /* final chunk of a msg */
125 #define UATH_CFLAGS_RXMSG 0x02 /* chunk contains rx completion */
126 #define UATH_CFLAGS_DEBUG 0x04 /* for debugging */
127 __be16 length; /* chunk size in bytes */
128 /* chunk data follows */
129 } __packed;
130
131 /*
132 * Message format for a WDCMSG_DATA_AVAIL message from Target to Host.
133 */
134 struct ar5523_rx_desc {
135 __be32 len; /* msg length including header */
136 __be32 code; /* WDCMSG_DATA_AVAIL */
137 __be32 gennum; /* generation number */
138 __be32 status; /* start of RECEIVE_INFO */
139 #define UATH_STATUS_OK 0
140 #define UATH_STATUS_STOP_IN_PROGRESS 1
141 #define UATH_STATUS_CRC_ERR 2
142 #define UATH_STATUS_PHY_ERR 3
143 #define UATH_STATUS_DECRYPT_CRC_ERR 4
144 #define UATH_STATUS_DECRYPT_MIC_ERR 5
145 #define UATH_STATUS_DECOMP_ERR 6
146 #define UATH_STATUS_KEY_ERR 7
147 #define UATH_STATUS_ERR 8
148 __be32 tstamp_low; /* low-order 32-bits of rx timestamp */
149 __be32 tstamp_high; /* high-order 32-bits of rx timestamp */
150 __be32 framelen; /* frame length */
151 __be32 rate; /* rx rate code */
152 __be32 antenna;
153 __be32 rssi;
154 __be32 channel;
155 __be32 phyerror;
156 __be32 connix; /* key table ix for bss traffic */
157 __be32 decrypterror;
158 __be32 keycachemiss;
159 __be32 pad; /* XXX? */
160 } __packed;
161
162 struct ar5523_tx_desc {
163 __be32 msglen;
164 __be32 msgid; /* msg id (supplied by host) */
165 __be32 type; /* opcode: WDMSG_SEND or WDCMSG_FLUSH */
166 __be32 txqid; /* tx queue id and flags */
167 #define UATH_TXQID_MASK 0x0f
168 #define UATH_TXQID_MINRATE 0x10 /* use min tx rate */
169 #define UATH_TXQID_FF 0x20 /* content is fast frame */
170 __be32 connid; /* tx connection id */
171 #define UATH_ID_INVALID 0xffffffff /* for sending prior to connection */
172 __be32 flags; /* non-zero if response desired */
173 #define UATH_TX_NOTIFY (1 << 24) /* f/w will send a UATH_NOTIF_TX */
174 __be32 buflen; /* payload length */
175 } __packed;
176
177
178 #define AR5523_ID_BSS 2
179 #define AR5523_ID_BROADCAST 0xffffffff
180
181 /* structure for command UATH_CMD_WRITE_MAC */
182 struct ar5523_write_mac {
183 __be32 reg;
184 __be32 len;
185 u8 data[32];
186 } __packed;
187
188 struct ar5523_cmd_rateset {
189 __u8 length;
190 #define AR5523_MAX_NRATES 32
191 __u8 set[AR5523_MAX_NRATES];
192 };
193
194 struct ar5523_cmd_set_associd { /* AR5523_WRITE_ASSOCID */
195 __be32 defaultrateix;
196 __be32 associd;
197 __be32 timoffset;
198 __be32 turboprime;
199 __u8 bssid[6];
200 } __packed;
201
202 /* structure for command WDCMSG_RESET */
203 struct ar5523_cmd_reset {
204 __be32 flags; /* channel flags */
205 #define UATH_CHAN_TURBO 0x0100
206 #define UATH_CHAN_CCK 0x0200
207 #define UATH_CHAN_OFDM 0x0400
208 #define UATH_CHAN_2GHZ 0x1000
209 #define UATH_CHAN_5GHZ 0x2000
210 __be32 freq; /* channel frequency */
211 __be32 maxrdpower;
212 __be32 cfgctl;
213 __be32 twiceantennareduction;
214 __be32 channelchange;
215 __be32 keeprccontent;
216 } __packed;
217
218 /* structure for command WDCMSG_SET_BASIC_RATE */
219 struct ar5523_cmd_rates {
220 __be32 connid;
221 __be32 keeprccontent;
222 __be32 size;
223 struct ar5523_cmd_rateset rateset;
224 } __packed;
225
226 enum {
227 WLAN_MODE_NONE = 0,
228 WLAN_MODE_11b,
229 WLAN_MODE_11a,
230 WLAN_MODE_11g,
231 WLAN_MODE_11a_TURBO,
232 WLAN_MODE_11g_TURBO,
233 WLAN_MODE_11a_TURBO_PRIME,
234 WLAN_MODE_11g_TURBO_PRIME,
235 WLAN_MODE_11a_XR,
236 WLAN_MODE_11g_XR,
237 };
238
239 struct ar5523_cmd_connection_attr {
240 __be32 longpreambleonly;
241 struct ar5523_cmd_rateset rateset;
242 __be32 wlanmode;
243 } __packed;
244
245 /* structure for command AR5523_CREATE_CONNECTION */
246 struct ar5523_cmd_create_connection {
247 __be32 connid;
248 __be32 bssid;
249 __be32 size;
250 struct ar5523_cmd_connection_attr connattr;
251 } __packed;
252
253 struct ar5523_cmd_ledsteady { /* WDCMSG_SET_LED_STEADY */
254 __be32 lednum;
255 #define UATH_LED_LINK 0
256 #define UATH_LED_ACTIVITY 1
257 __be32 ledmode;
258 #define UATH_LED_OFF 0
259 #define UATH_LED_ON 1
260 } __packed;
261
262 struct ar5523_cmd_ledblink { /* WDCMSG_SET_LED_BLINK */
263 __be32 lednum;
264 __be32 ledmode;
265 __be32 blinkrate;
266 __be32 slowmode;
267 } __packed;
268
269 struct ar5523_cmd_ledstate { /* WDCMSG_SET_LED_STATE */
270 __be32 connected;
271 } __packed;
272
273 struct ar5523_cmd_txq_attr {
274 __be32 priority;
275 __be32 aifs;
276 __be32 logcwmin;
277 __be32 logcwmax;
278 __be32 bursttime;
279 __be32 mode;
280 __be32 qflags;
281 } __packed;
282
283 struct ar5523_cmd_txq_setup { /* WDCMSG_SETUP_TX_QUEUE */
284 __be32 qid;
285 __be32 len;
286 struct ar5523_cmd_txq_attr attr;
287 } __packed;
288
289 struct ar5523_cmd_rx_filter { /* WDCMSG_RX_FILTER */
290 __be32 bits;
291 #define UATH_FILTER_RX_UCAST 0x00000001
292 #define UATH_FILTER_RX_MCAST 0x00000002
293 #define UATH_FILTER_RX_BCAST 0x00000004
294 #define UATH_FILTER_RX_CONTROL 0x00000008
295 #define UATH_FILTER_RX_BEACON 0x00000010 /* beacon frames */
296 #define UATH_FILTER_RX_PROM 0x00000020 /* promiscuous mode */
297 #define UATH_FILTER_RX_PHY_ERR 0x00000040 /* phy errors */
298 #define UATH_FILTER_RX_PHY_RADAR 0x00000080 /* radar phy errors */
299 #define UATH_FILTER_RX_XR_POOL 0x00000400 /* XR group polls */
300 #define UATH_FILTER_RX_PROBE_REQ 0x00000800
301 __be32 op;
302 #define UATH_FILTER_OP_INIT 0x0
303 #define UATH_FILTER_OP_SET 0x1
304 #define UATH_FILTER_OP_CLEAR 0x2
305 #define UATH_FILTER_OP_TEMP 0x3
306 #define UATH_FILTER_OP_RESTORE 0x4
307 } __packed;
308
309 enum {
310 CFG_NONE, /* Sentinal to indicate "no config" */
311 CFG_REG_DOMAIN, /* Regulatory Domain */
312 CFG_RATE_CONTROL_ENABLE,
313 CFG_DEF_XMIT_DATA_RATE, /* NB: if rate control is not enabled */
314 CFG_HW_TX_RETRIES,
315 CFG_SW_TX_RETRIES,
316 CFG_SLOW_CLOCK_ENABLE,
317 CFG_COMP_PROC,
318 CFG_USER_RTS_THRESHOLD,
319 CFG_XR2NORM_RATE_THRESHOLD,
320 CFG_XRMODE_SWITCH_COUNT,
321 CFG_PROTECTION_TYPE,
322 CFG_BURST_SEQ_THRESHOLD,
323 CFG_ABOLT,
324 CFG_IQ_LOG_COUNT_MAX,
325 CFG_MODE_CTS,
326 CFG_WME_ENABLED,
327 CFG_GPRS_CBR_PERIOD,
328 CFG_SERVICE_TYPE,
329 /* MAC Address to use. Overrides EEPROM */
330 CFG_MAC_ADDR,
331 CFG_DEBUG_EAR,
332 CFG_INIT_REGS,
333 /* An ID for use in error & debug messages */
334 CFG_DEBUG_ID,
335 CFG_COMP_WIN_SZ,
336 CFG_DIVERSITY_CTL,
337 CFG_TP_SCALE,
338 CFG_TPC_HALF_DBM5,
339 CFG_TPC_HALF_DBM2,
340 CFG_OVERRD_TX_POWER,
341 CFG_USE_32KHZ_CLOCK,
342 CFG_GMODE_PROTECTION,
343 CFG_GMODE_PROTECT_RATE_INDEX,
344 CFG_GMODE_NON_ERP_PREAMBLE,
345 CFG_WDC_TRANSPORT_CHUNK_SIZE,
346 };
347
348 enum {
349 /* Sentinal to indicate "no capability" */
350 CAP_NONE,
351 CAP_ALL, /* ALL capabilities */
352 CAP_TARGET_VERSION,
353 CAP_TARGET_REVISION,
354 CAP_MAC_VERSION,
355 CAP_MAC_REVISION,
356 CAP_PHY_REVISION,
357 CAP_ANALOG_5GHz_REVISION,
358 CAP_ANALOG_2GHz_REVISION,
359 /* Target supports WDC message debug features */
360 CAP_DEBUG_WDCMSG_SUPPORT,
361
362 CAP_REG_DOMAIN,
363 CAP_COUNTRY_CODE,
364 CAP_REG_CAP_BITS,
365
366 CAP_WIRELESS_MODES,
367 CAP_CHAN_SPREAD_SUPPORT,
368 CAP_SLEEP_AFTER_BEACON_BROKEN,
369 CAP_COMPRESS_SUPPORT,
370 CAP_BURST_SUPPORT,
371 CAP_FAST_FRAMES_SUPPORT,
372 CAP_CHAP_TUNING_SUPPORT,
373 CAP_TURBOG_SUPPORT,
374 CAP_TURBO_PRIME_SUPPORT,
375 CAP_DEVICE_TYPE,
376 CAP_XR_SUPPORT,
377 CAP_WME_SUPPORT,
378 CAP_TOTAL_QUEUES,
379 CAP_CONNECTION_ID_MAX, /* Should absorb CAP_KEY_CACHE_SIZE */
380
381 CAP_LOW_5GHZ_CHAN,
382 CAP_HIGH_5GHZ_CHAN,
383 CAP_LOW_2GHZ_CHAN,
384 CAP_HIGH_2GHZ_CHAN,
385
386 CAP_MIC_AES_CCM,
387 CAP_MIC_CKIP,
388 CAP_MIC_TKIP,
389 CAP_MIC_TKIP_WME,
390 CAP_CIPHER_AES_CCM,
391 CAP_CIPHER_CKIP,
392 CAP_CIPHER_TKIP,
393
394 CAP_TWICE_ANTENNAGAIN_5G,
395 CAP_TWICE_ANTENNAGAIN_2G,
396 };
397
398 enum {
399 ST_NONE, /* Sentinal to indicate "no status" */
400 ST_ALL,
401 ST_SERVICE_TYPE,
402 ST_WLAN_MODE,
403 ST_FREQ,
404 ST_BAND,
405 ST_LAST_RSSI,
406 ST_PS_FRAMES_DROPPED,
407 ST_CACHED_DEF_ANT,
408 ST_COUNT_OTHER_RX_ANT,
409 ST_USE_FAST_DIVERSITY,
410 ST_MAC_ADDR,
411 ST_RX_GENERATION_NUM,
412 ST_TX_QUEUE_DEPTH,
413 ST_SERIAL_NUMBER,
414 ST_WDC_TRANSPORT_CHUNK_SIZE,
415 };
416
417 enum {
418 TARGET_DEVICE_AWAKE,
419 TARGET_DEVICE_SLEEP,
420 TARGET_DEVICE_PWRDN,
421 TARGET_DEVICE_PWRSAVE,
422 TARGET_DEVICE_SUSPEND,
423 TARGET_DEVICE_RESUME,
424 };
425
426 /* this is in net/ieee80211.h, but that conflicts with the mac80211 headers */
427 #define IEEE80211_2ADDR_LEN 16
428
429 #define AR5523_MIN_RXBUFSZ \
430 (((sizeof(__be32) + IEEE80211_2ADDR_LEN + \
431 sizeof(struct ar5523_rx_desc)) + 3) & ~3)