diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl12xx.h')
-rw-r--r-- | drivers/net/wireless/wl12xx/wl12xx.h | 682 |
1 files changed, 682 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/wl12xx.h b/drivers/net/wireless/wl12xx/wl12xx.h new file mode 100644 index 00000000000..1a8751eb814 --- /dev/null +++ b/drivers/net/wireless/wl12xx/wl12xx.h | |||
@@ -0,0 +1,682 @@ | |||
1 | /* | ||
2 | * This file is part of wl1271 | ||
3 | * | ||
4 | * Copyright (C) 1998-2009 Texas Instruments. All rights reserved. | ||
5 | * Copyright (C) 2008-2009 Nokia Corporation | ||
6 | * | ||
7 | * Contact: Luciano Coelho <luciano.coelho@nokia.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * version 2 as published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, but | ||
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | * General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
21 | * 02110-1301 USA | ||
22 | * | ||
23 | */ | ||
24 | |||
25 | #ifndef __WL12XX_H__ | ||
26 | #define __WL12XX_H__ | ||
27 | |||
28 | #include <linux/mutex.h> | ||
29 | #include <linux/completion.h> | ||
30 | #include <linux/spinlock.h> | ||
31 | #include <linux/list.h> | ||
32 | #include <linux/bitops.h> | ||
33 | #include <net/mac80211.h> | ||
34 | |||
35 | #include "conf.h" | ||
36 | #include "ini.h" | ||
37 | |||
38 | #define DRIVER_NAME "wl1271" | ||
39 | #define DRIVER_PREFIX DRIVER_NAME ": " | ||
40 | |||
41 | /* | ||
42 | * FW versions support BA 11n | ||
43 | * versions marks x.x.x.50-60.x | ||
44 | */ | ||
45 | #define WL12XX_BA_SUPPORT_FW_COST_VER2_START 50 | ||
46 | #define WL12XX_BA_SUPPORT_FW_COST_VER2_END 60 | ||
47 | |||
48 | enum { | ||
49 | DEBUG_NONE = 0, | ||
50 | DEBUG_IRQ = BIT(0), | ||
51 | DEBUG_SPI = BIT(1), | ||
52 | DEBUG_BOOT = BIT(2), | ||
53 | DEBUG_MAILBOX = BIT(3), | ||
54 | DEBUG_TESTMODE = BIT(4), | ||
55 | DEBUG_EVENT = BIT(5), | ||
56 | DEBUG_TX = BIT(6), | ||
57 | DEBUG_RX = BIT(7), | ||
58 | DEBUG_SCAN = BIT(8), | ||
59 | DEBUG_CRYPT = BIT(9), | ||
60 | DEBUG_PSM = BIT(10), | ||
61 | DEBUG_MAC80211 = BIT(11), | ||
62 | DEBUG_CMD = BIT(12), | ||
63 | DEBUG_ACX = BIT(13), | ||
64 | DEBUG_SDIO = BIT(14), | ||
65 | DEBUG_FILTERS = BIT(15), | ||
66 | DEBUG_ADHOC = BIT(16), | ||
67 | DEBUG_AP = BIT(17), | ||
68 | DEBUG_MASTER = (DEBUG_ADHOC | DEBUG_AP), | ||
69 | DEBUG_ALL = ~0, | ||
70 | }; | ||
71 | |||
72 | extern u32 wl12xx_debug_level; | ||
73 | |||
74 | #define DEBUG_DUMP_LIMIT 1024 | ||
75 | |||
76 | #define wl1271_error(fmt, arg...) \ | ||
77 | pr_err(DRIVER_PREFIX "ERROR " fmt "\n", ##arg) | ||
78 | |||
79 | #define wl1271_warning(fmt, arg...) \ | ||
80 | pr_warning(DRIVER_PREFIX "WARNING " fmt "\n", ##arg) | ||
81 | |||
82 | #define wl1271_notice(fmt, arg...) \ | ||
83 | pr_info(DRIVER_PREFIX fmt "\n", ##arg) | ||
84 | |||
85 | #define wl1271_info(fmt, arg...) \ | ||
86 | pr_info(DRIVER_PREFIX fmt "\n", ##arg) | ||
87 | |||
88 | #define wl1271_debug(level, fmt, arg...) \ | ||
89 | do { \ | ||
90 | if (level & wl12xx_debug_level) \ | ||
91 | pr_debug(DRIVER_PREFIX fmt "\n", ##arg); \ | ||
92 | } while (0) | ||
93 | |||
94 | /* TODO: use pr_debug_hex_dump when it will be available */ | ||
95 | #define wl1271_dump(level, prefix, buf, len) \ | ||
96 | do { \ | ||
97 | if (level & wl12xx_debug_level) \ | ||
98 | print_hex_dump(KERN_DEBUG, DRIVER_PREFIX prefix, \ | ||
99 | DUMP_PREFIX_OFFSET, 16, 1, \ | ||
100 | buf, \ | ||
101 | min_t(size_t, len, DEBUG_DUMP_LIMIT), \ | ||
102 | 0); \ | ||
103 | } while (0) | ||
104 | |||
105 | #define wl1271_dump_ascii(level, prefix, buf, len) \ | ||
106 | do { \ | ||
107 | if (level & wl12xx_debug_level) \ | ||
108 | print_hex_dump(KERN_DEBUG, DRIVER_PREFIX prefix, \ | ||
109 | DUMP_PREFIX_OFFSET, 16, 1, \ | ||
110 | buf, \ | ||
111 | min_t(size_t, len, DEBUG_DUMP_LIMIT), \ | ||
112 | true); \ | ||
113 | } while (0) | ||
114 | |||
115 | #define WL1271_DEFAULT_STA_RX_CONFIG (CFG_UNI_FILTER_EN | \ | ||
116 | CFG_BSSID_FILTER_EN | \ | ||
117 | CFG_MC_FILTER_EN) | ||
118 | |||
119 | #define WL1271_DEFAULT_STA_RX_FILTER (CFG_RX_RCTS_ACK | CFG_RX_PRSP_EN | \ | ||
120 | CFG_RX_MGMT_EN | CFG_RX_DATA_EN | \ | ||
121 | CFG_RX_CTL_EN | CFG_RX_BCN_EN | \ | ||
122 | CFG_RX_AUTH_EN | CFG_RX_ASSOC_EN) | ||
123 | |||
124 | #define WL1271_DEFAULT_AP_RX_CONFIG 0 | ||
125 | |||
126 | #define WL1271_DEFAULT_AP_RX_FILTER (CFG_RX_RCTS_ACK | CFG_RX_PREQ_EN | \ | ||
127 | CFG_RX_MGMT_EN | CFG_RX_DATA_EN | \ | ||
128 | CFG_RX_CTL_EN | CFG_RX_AUTH_EN | \ | ||
129 | CFG_RX_ASSOC_EN) | ||
130 | |||
131 | |||
132 | |||
133 | #define WL1271_FW_NAME "ti-connectivity/wl1271-fw-2.bin" | ||
134 | #define WL128X_FW_NAME "ti-connectivity/wl128x-fw.bin" | ||
135 | #define WL127X_AP_FW_NAME "ti-connectivity/wl1271-fw-ap.bin" | ||
136 | #define WL128X_AP_FW_NAME "ti-connectivity/wl128x-fw-ap.bin" | ||
137 | |||
138 | /* | ||
139 | * wl127x and wl128x are using the same NVS file name. However, the | ||
140 | * ini parameters between them are different. The driver validates | ||
141 | * the correct NVS size in wl1271_boot_upload_nvs(). | ||
142 | */ | ||
143 | #define WL12XX_NVS_NAME "ti-connectivity/wl1271-nvs.bin" | ||
144 | |||
145 | #define WL1271_TX_SECURITY_LO16(s) ((u16)((s) & 0xffff)) | ||
146 | #define WL1271_TX_SECURITY_HI32(s) ((u32)(((s) >> 16) & 0xffffffff)) | ||
147 | #define WL1271_TX_SQN_POST_RECOVERY_PADDING 0xff | ||
148 | |||
149 | #define WL1271_CIPHER_SUITE_GEM 0x00147201 | ||
150 | |||
151 | #define WL1271_BUSY_WORD_CNT 1 | ||
152 | #define WL1271_BUSY_WORD_LEN (WL1271_BUSY_WORD_CNT * sizeof(u32)) | ||
153 | |||
154 | #define WL1271_ELP_HW_STATE_ASLEEP 0 | ||
155 | #define WL1271_ELP_HW_STATE_IRQ 1 | ||
156 | |||
157 | #define WL1271_DEFAULT_BEACON_INT 100 | ||
158 | #define WL1271_DEFAULT_DTIM_PERIOD 1 | ||
159 | |||
160 | #define WL1271_AP_GLOBAL_HLID 0 | ||
161 | #define WL1271_AP_BROADCAST_HLID 1 | ||
162 | #define WL1271_AP_STA_HLID_START 2 | ||
163 | |||
164 | /* | ||
165 | * When in AP-mode, we allow (at least) this number of mem-blocks | ||
166 | * to be transmitted to FW for a STA in PS-mode. Only when packets are | ||
167 | * present in the FW buffers it will wake the sleeping STA. We want to put | ||
168 | * enough packets for the driver to transmit all of its buffered data before | ||
169 | * the STA goes to sleep again. But we don't want to take too much mem-blocks | ||
170 | * as it might hurt the throughput of active STAs. | ||
171 | * The number of blocks (18) is enough for 2 large packets. | ||
172 | */ | ||
173 | #define WL1271_PS_STA_MAX_BLOCKS (2 * 9) | ||
174 | |||
175 | #define WL1271_AP_BSS_INDEX 0 | ||
176 | #define WL1271_AP_DEF_BEACON_EXP 20 | ||
177 | |||
178 | #define ACX_TX_DESCRIPTORS 32 | ||
179 | |||
180 | #define WL1271_AGGR_BUFFER_SIZE (4 * PAGE_SIZE) | ||
181 | |||
182 | enum wl1271_state { | ||
183 | WL1271_STATE_OFF, | ||
184 | WL1271_STATE_ON, | ||
185 | WL1271_STATE_PLT, | ||
186 | }; | ||
187 | |||
188 | enum wl1271_partition_type { | ||
189 | PART_DOWN, | ||
190 | PART_WORK, | ||
191 | PART_DRPW, | ||
192 | |||
193 | PART_TABLE_LEN | ||
194 | }; | ||
195 | |||
196 | struct wl1271_partition { | ||
197 | u32 size; | ||
198 | u32 start; | ||
199 | }; | ||
200 | |||
201 | struct wl1271_partition_set { | ||
202 | struct wl1271_partition mem; | ||
203 | struct wl1271_partition reg; | ||
204 | struct wl1271_partition mem2; | ||
205 | struct wl1271_partition mem3; | ||
206 | }; | ||
207 | |||
208 | struct wl1271; | ||
209 | |||
210 | enum { | ||
211 | FW_VER_CHIP, | ||
212 | FW_VER_IF_TYPE, | ||
213 | FW_VER_MAJOR, | ||
214 | FW_VER_SUBTYPE, | ||
215 | FW_VER_MINOR, | ||
216 | |||
217 | NUM_FW_VER | ||
218 | }; | ||
219 | |||
220 | #define FW_VER_CHIP_WL127X 6 | ||
221 | #define FW_VER_CHIP_WL128X 7 | ||
222 | |||
223 | #define FW_VER_IF_TYPE_STA 1 | ||
224 | #define FW_VER_IF_TYPE_AP 2 | ||
225 | |||
226 | #define FW_VER_MINOR_1_SPARE_STA_MIN 58 | ||
227 | #define FW_VER_MINOR_1_SPARE_AP_MIN 47 | ||
228 | |||
229 | #define FW_VER_MINOR_FWLOG_STA_MIN 70 | ||
230 | |||
231 | struct wl1271_chip { | ||
232 | u32 id; | ||
233 | char fw_ver_str[ETHTOOL_BUSINFO_LEN]; | ||
234 | unsigned int fw_ver[NUM_FW_VER]; | ||
235 | }; | ||
236 | |||
237 | struct wl1271_stats { | ||
238 | struct acx_statistics *fw_stats; | ||
239 | unsigned long fw_stats_update; | ||
240 | |||
241 | unsigned int retry_count; | ||
242 | unsigned int excessive_retries; | ||
243 | }; | ||
244 | |||
245 | #define NUM_TX_QUEUES 4 | ||
246 | #define NUM_RX_PKT_DESC 8 | ||
247 | |||
248 | #define AP_MAX_STATIONS 5 | ||
249 | |||
250 | /* Broadcast and Global links + links to stations */ | ||
251 | #define AP_MAX_LINKS (AP_MAX_STATIONS + 2) | ||
252 | |||
253 | /* FW status registers common for AP/STA */ | ||
254 | struct wl1271_fw_common_status { | ||
255 | __le32 intr; | ||
256 | u8 fw_rx_counter; | ||
257 | u8 drv_rx_counter; | ||
258 | u8 reserved; | ||
259 | u8 tx_results_counter; | ||
260 | __le32 rx_pkt_descs[NUM_RX_PKT_DESC]; | ||
261 | __le32 tx_released_blks[NUM_TX_QUEUES]; | ||
262 | __le32 fw_localtime; | ||
263 | } __packed; | ||
264 | |||
265 | /* FW status registers for AP */ | ||
266 | struct wl1271_fw_ap_status { | ||
267 | struct wl1271_fw_common_status common; | ||
268 | |||
269 | /* Next fields valid only in AP FW */ | ||
270 | |||
271 | /* | ||
272 | * A bitmap (where each bit represents a single HLID) | ||
273 | * to indicate if the station is in PS mode. | ||
274 | */ | ||
275 | __le32 link_ps_bitmap; | ||
276 | |||
277 | /* Number of freed MBs per HLID */ | ||
278 | u8 tx_lnk_free_blks[AP_MAX_LINKS]; | ||
279 | u8 padding_1[1]; | ||
280 | } __packed; | ||
281 | |||
282 | /* FW status registers for STA */ | ||
283 | struct wl1271_fw_sta_status { | ||
284 | struct wl1271_fw_common_status common; | ||
285 | |||
286 | u8 tx_total; | ||
287 | u8 reserved1; | ||
288 | __le16 reserved2; | ||
289 | __le32 log_start_addr; | ||
290 | } __packed; | ||
291 | |||
292 | struct wl1271_fw_full_status { | ||
293 | union { | ||
294 | struct wl1271_fw_common_status common; | ||
295 | struct wl1271_fw_sta_status sta; | ||
296 | struct wl1271_fw_ap_status ap; | ||
297 | }; | ||
298 | } __packed; | ||
299 | |||
300 | |||
301 | struct wl1271_rx_mem_pool_addr { | ||
302 | u32 addr; | ||
303 | u32 addr_extra; | ||
304 | }; | ||
305 | |||
306 | #define WL1271_MAX_CHANNELS 64 | ||
307 | struct wl1271_scan { | ||
308 | struct cfg80211_scan_request *req; | ||
309 | unsigned long scanned_ch[BITS_TO_LONGS(WL1271_MAX_CHANNELS)]; | ||
310 | bool failed; | ||
311 | u8 state; | ||
312 | u8 ssid[IW_ESSID_MAX_SIZE+1]; | ||
313 | size_t ssid_len; | ||
314 | }; | ||
315 | |||
316 | struct wl1271_if_operations { | ||
317 | void (*read)(struct wl1271 *wl, int addr, void *buf, size_t len, | ||
318 | bool fixed); | ||
319 | void (*write)(struct wl1271 *wl, int addr, void *buf, size_t len, | ||
320 | bool fixed); | ||
321 | void (*reset)(struct wl1271 *wl); | ||
322 | void (*init)(struct wl1271 *wl); | ||
323 | int (*power)(struct wl1271 *wl, bool enable); | ||
324 | struct device* (*dev)(struct wl1271 *wl); | ||
325 | void (*enable_irq)(struct wl1271 *wl); | ||
326 | void (*disable_irq)(struct wl1271 *wl); | ||
327 | void (*set_block_size) (struct wl1271 *wl, unsigned int blksz); | ||
328 | }; | ||
329 | |||
330 | #define MAX_NUM_KEYS 14 | ||
331 | #define MAX_KEY_SIZE 32 | ||
332 | |||
333 | struct wl1271_ap_key { | ||
334 | u8 id; | ||
335 | u8 key_type; | ||
336 | u8 key_size; | ||
337 | u8 key[MAX_KEY_SIZE]; | ||
338 | u8 hlid; | ||
339 | u32 tx_seq_32; | ||
340 | u16 tx_seq_16; | ||
341 | }; | ||
342 | |||
343 | enum wl12xx_flags { | ||
344 | WL1271_FLAG_STA_ASSOCIATED, | ||
345 | WL1271_FLAG_JOINED, | ||
346 | WL1271_FLAG_GPIO_POWER, | ||
347 | WL1271_FLAG_TX_QUEUE_STOPPED, | ||
348 | WL1271_FLAG_TX_PENDING, | ||
349 | WL1271_FLAG_IN_ELP, | ||
350 | WL1271_FLAG_ELP_REQUESTED, | ||
351 | WL1271_FLAG_PSM, | ||
352 | WL1271_FLAG_PSM_REQUESTED, | ||
353 | WL1271_FLAG_IRQ_RUNNING, | ||
354 | WL1271_FLAG_IDLE, | ||
355 | WL1271_FLAG_PSPOLL_FAILURE, | ||
356 | WL1271_FLAG_STA_STATE_SENT, | ||
357 | WL1271_FLAG_FW_TX_BUSY, | ||
358 | WL1271_FLAG_AP_STARTED, | ||
359 | WL1271_FLAG_IF_INITIALIZED, | ||
360 | WL1271_FLAG_DUMMY_PACKET_PENDING, | ||
361 | WL1271_FLAG_SUSPENDED, | ||
362 | WL1271_FLAG_PENDING_WORK, | ||
363 | WL1271_FLAG_SOFT_GEMINI, | ||
364 | WL1271_FLAG_RX_STREAMING_STARTED, | ||
365 | WL1271_FLAG_RECOVERY_IN_PROGRESS, | ||
366 | }; | ||
367 | |||
368 | struct wl1271_link { | ||
369 | /* AP-mode - TX queue per AC in link */ | ||
370 | struct sk_buff_head tx_queue[NUM_TX_QUEUES]; | ||
371 | |||
372 | /* accounting for allocated / available TX blocks in FW */ | ||
373 | u8 allocated_blks; | ||
374 | u8 prev_freed_blks; | ||
375 | |||
376 | u8 addr[ETH_ALEN]; | ||
377 | }; | ||
378 | |||
379 | struct wl1271 { | ||
380 | struct platform_device *plat_dev; | ||
381 | struct ieee80211_hw *hw; | ||
382 | bool mac80211_registered; | ||
383 | |||
384 | void *if_priv; | ||
385 | |||
386 | struct wl1271_if_operations *if_ops; | ||
387 | |||
388 | void (*set_power)(bool enable); | ||
389 | int irq; | ||
390 | int ref_clock; | ||
391 | |||
392 | spinlock_t wl_lock; | ||
393 | |||
394 | enum wl1271_state state; | ||
395 | struct mutex mutex; | ||
396 | |||
397 | unsigned long flags; | ||
398 | |||
399 | struct wl1271_partition_set part; | ||
400 | |||
401 | struct wl1271_chip chip; | ||
402 | |||
403 | int cmd_box_addr; | ||
404 | int event_box_addr; | ||
405 | |||
406 | u8 *fw; | ||
407 | size_t fw_len; | ||
408 | u8 fw_bss_type; | ||
409 | void *nvs; | ||
410 | size_t nvs_len; | ||
411 | |||
412 | s8 hw_pg_ver; | ||
413 | |||
414 | u8 bssid[ETH_ALEN]; | ||
415 | u8 mac_addr[ETH_ALEN]; | ||
416 | u8 bss_type; | ||
417 | u8 set_bss_type; | ||
418 | u8 ssid[IW_ESSID_MAX_SIZE + 1]; | ||
419 | u8 ssid_len; | ||
420 | int channel; | ||
421 | |||
422 | struct wl1271_acx_mem_map *target_mem_map; | ||
423 | |||
424 | /* Accounting for allocated / available TX blocks on HW */ | ||
425 | u32 tx_blocks_freed[NUM_TX_QUEUES]; | ||
426 | u32 tx_blocks_available; | ||
427 | u32 tx_allocated_blocks[NUM_TX_QUEUES]; | ||
428 | u32 tx_results_count; | ||
429 | |||
430 | /* Transmitted TX packets counter for chipset interface */ | ||
431 | u32 tx_packets_count; | ||
432 | |||
433 | /* Time-offset between host and chipset clocks */ | ||
434 | s64 time_offset; | ||
435 | |||
436 | /* Session counter for the chipset */ | ||
437 | int session_counter; | ||
438 | |||
439 | /* Frames scheduled for transmission, not handled yet */ | ||
440 | struct sk_buff_head tx_queue[NUM_TX_QUEUES]; | ||
441 | int tx_queue_count[NUM_TX_QUEUES]; | ||
442 | long stopped_queues_map; | ||
443 | |||
444 | /* Frames received, not handled yet by mac80211 */ | ||
445 | struct sk_buff_head deferred_rx_queue; | ||
446 | |||
447 | /* Frames sent, not returned yet to mac80211 */ | ||
448 | struct sk_buff_head deferred_tx_queue; | ||
449 | |||
450 | struct work_struct tx_work; | ||
451 | struct workqueue_struct *freezable_wq; | ||
452 | |||
453 | /* Pending TX frames */ | ||
454 | unsigned long tx_frames_map[BITS_TO_LONGS(ACX_TX_DESCRIPTORS)]; | ||
455 | struct sk_buff *tx_frames[ACX_TX_DESCRIPTORS]; | ||
456 | int tx_frames_cnt; | ||
457 | |||
458 | /* | ||
459 | * Security sequence number | ||
460 | * bits 0-15: lower 16 bits part of sequence number | ||
461 | * bits 16-47: higher 32 bits part of sequence number | ||
462 | * bits 48-63: not in use | ||
463 | */ | ||
464 | u64 tx_security_seq; | ||
465 | |||
466 | /* 8 bits of the last sequence number in use */ | ||
467 | u8 tx_security_last_seq_lsb; | ||
468 | |||
469 | /* FW Rx counter */ | ||
470 | u32 rx_counter; | ||
471 | |||
472 | /* Rx memory pool address */ | ||
473 | struct wl1271_rx_mem_pool_addr rx_mem_pool_addr; | ||
474 | |||
475 | /* Intermediate buffer, used for packet aggregation */ | ||
476 | u8 *aggr_buf; | ||
477 | |||
478 | /* Reusable dummy packet template */ | ||
479 | struct sk_buff *dummy_packet; | ||
480 | |||
481 | /* Network stack work */ | ||
482 | struct work_struct netstack_work; | ||
483 | |||
484 | /* FW log buffer */ | ||
485 | u8 *fwlog; | ||
486 | |||
487 | /* Number of valid bytes in the FW log buffer */ | ||
488 | ssize_t fwlog_size; | ||
489 | |||
490 | /* Sysfs FW log entry readers wait queue */ | ||
491 | wait_queue_head_t fwlog_waitq; | ||
492 | |||
493 | /* Hardware recovery work */ | ||
494 | struct work_struct recovery_work; | ||
495 | |||
496 | /* The mbox event mask */ | ||
497 | u32 event_mask; | ||
498 | |||
499 | /* Mailbox pointers */ | ||
500 | u32 mbox_ptr[2]; | ||
501 | |||
502 | /* Are we currently scanning */ | ||
503 | struct wl1271_scan scan; | ||
504 | struct delayed_work scan_complete_work; | ||
505 | |||
506 | bool sched_scanning; | ||
507 | |||
508 | /* probe-req template for the current AP */ | ||
509 | struct sk_buff *probereq; | ||
510 | |||
511 | /* Our association ID */ | ||
512 | u16 aid; | ||
513 | |||
514 | /* | ||
515 | * currently configured rate set: | ||
516 | * bits 0-15 - 802.11abg rates | ||
517 | * bits 16-23 - 802.11n MCS index mask | ||
518 | * support only 1 stream, thus only 8 bits for the MCS rates (0-7). | ||
519 | */ | ||
520 | u32 basic_rate_set; | ||
521 | u32 basic_rate; | ||
522 | u32 rate_set; | ||
523 | |||
524 | /* The current band */ | ||
525 | enum ieee80211_band band; | ||
526 | |||
527 | /* Beaconing interval (needed for ad-hoc) */ | ||
528 | u32 beacon_int; | ||
529 | |||
530 | /* Default key (for WEP) */ | ||
531 | u32 default_key; | ||
532 | |||
533 | /* Rx Streaming */ | ||
534 | struct work_struct rx_streaming_enable_work; | ||
535 | struct work_struct rx_streaming_disable_work; | ||
536 | struct timer_list rx_streaming_timer; | ||
537 | |||
538 | unsigned int filters; | ||
539 | unsigned int rx_config; | ||
540 | unsigned int rx_filter; | ||
541 | |||
542 | struct completion *elp_compl; | ||
543 | struct completion *ps_compl; | ||
544 | struct delayed_work elp_work; | ||
545 | struct delayed_work pspoll_work; | ||
546 | |||
547 | /* counter for ps-poll delivery failures */ | ||
548 | int ps_poll_failures; | ||
549 | |||
550 | /* retry counter for PSM entries */ | ||
551 | u8 psm_entry_retry; | ||
552 | |||
553 | /* in dBm */ | ||
554 | int power_level; | ||
555 | |||
556 | int rssi_thold; | ||
557 | int last_rssi_event; | ||
558 | |||
559 | struct wl1271_stats stats; | ||
560 | |||
561 | __le32 buffer_32; | ||
562 | u32 buffer_cmd; | ||
563 | u32 buffer_busyword[WL1271_BUSY_WORD_CNT]; | ||
564 | |||
565 | struct wl1271_fw_full_status *fw_status; | ||
566 | struct wl1271_tx_hw_res_if *tx_res_if; | ||
567 | |||
568 | struct ieee80211_vif *vif; | ||
569 | |||
570 | /* Current chipset configuration */ | ||
571 | struct conf_drv_settings conf; | ||
572 | |||
573 | bool sg_enabled; | ||
574 | |||
575 | bool enable_11a; | ||
576 | |||
577 | struct list_head list; | ||
578 | |||
579 | /* Most recently reported noise in dBm */ | ||
580 | s8 noise; | ||
581 | |||
582 | /* map for HLIDs of associated stations - when operating in AP mode */ | ||
583 | unsigned long ap_hlid_map[BITS_TO_LONGS(AP_MAX_STATIONS)]; | ||
584 | |||
585 | /* recoreded keys for AP-mode - set here before AP startup */ | ||
586 | struct wl1271_ap_key *recorded_ap_keys[MAX_NUM_KEYS]; | ||
587 | |||
588 | /* bands supported by this instance of wl12xx */ | ||
589 | struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS]; | ||
590 | |||
591 | /* RX BA constraint value */ | ||
592 | bool ba_support; | ||
593 | u8 ba_rx_bitmap; | ||
594 | bool ba_allowed; | ||
595 | |||
596 | int tcxo_clock; | ||
597 | |||
598 | /* | ||
599 | * wowlan trigger was configured during suspend. | ||
600 | * (currently, only "ANY" trigger is supported) | ||
601 | */ | ||
602 | bool wow_enabled; | ||
603 | bool irq_wake_enabled; | ||
604 | |||
605 | /* | ||
606 | * AP-mode - links indexed by HLID. The global and broadcast links | ||
607 | * are always active. | ||
608 | */ | ||
609 | struct wl1271_link links[AP_MAX_LINKS]; | ||
610 | |||
611 | /* the hlid of the link where the last transmitted skb came from */ | ||
612 | int last_tx_hlid; | ||
613 | |||
614 | /* AP-mode - a bitmap of links currently in PS mode according to FW */ | ||
615 | u32 ap_fw_ps_map; | ||
616 | |||
617 | /* AP-mode - a bitmap of links currently in PS mode in mac80211 */ | ||
618 | unsigned long ap_ps_map; | ||
619 | |||
620 | /* Quirks of specific hardware revisions */ | ||
621 | unsigned int quirks; | ||
622 | |||
623 | /* Platform limitations */ | ||
624 | unsigned int platform_quirks; | ||
625 | }; | ||
626 | |||
627 | struct wl1271_station { | ||
628 | u8 hlid; | ||
629 | }; | ||
630 | |||
631 | int wl1271_plt_start(struct wl1271 *wl); | ||
632 | int wl1271_plt_stop(struct wl1271 *wl); | ||
633 | int wl1271_recalc_rx_streaming(struct wl1271 *wl); | ||
634 | void wl12xx_queue_recovery_work(struct wl1271 *wl); | ||
635 | size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen); | ||
636 | |||
637 | #define JOIN_TIMEOUT 5000 /* 5000 milliseconds to join */ | ||
638 | |||
639 | #define SESSION_COUNTER_MAX 7 /* maximum value for the session counter */ | ||
640 | |||
641 | #define WL1271_DEFAULT_POWER_LEVEL 0 | ||
642 | |||
643 | #define WL1271_TX_QUEUE_LOW_WATERMARK 32 | ||
644 | #define WL1271_TX_QUEUE_HIGH_WATERMARK 256 | ||
645 | |||
646 | #define WL1271_DEFERRED_QUEUE_LIMIT 64 | ||
647 | |||
648 | /* WL1271 needs a 200ms sleep after power on, and a 20ms sleep before power | ||
649 | on in case is has been shut down shortly before */ | ||
650 | #define WL1271_PRE_POWER_ON_SLEEP 20 /* in milliseconds */ | ||
651 | #define WL1271_POWER_ON_SLEEP 200 /* in milliseconds */ | ||
652 | |||
653 | /* Macros to handle wl1271.sta_rate_set */ | ||
654 | #define HW_BG_RATES_MASK 0xffff | ||
655 | #define HW_HT_RATES_OFFSET 16 | ||
656 | |||
657 | /* Quirks */ | ||
658 | |||
659 | /* Each RX/TX transaction requires an end-of-transaction transfer */ | ||
660 | #define WL12XX_QUIRK_END_OF_TRANSACTION BIT(0) | ||
661 | |||
662 | /* | ||
663 | * Older firmwares use 2 spare TX blocks | ||
664 | * (for STA < 6.1.3.50.58 or for AP < 6.2.0.0.47) | ||
665 | */ | ||
666 | #define WL12XX_QUIRK_USE_2_SPARE_BLOCKS BIT(1) | ||
667 | |||
668 | /* WL128X requires aggregated packets to be aligned to the SDIO block size */ | ||
669 | #define WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT BIT(2) | ||
670 | |||
671 | /* | ||
672 | * WL127X AP mode requires Low Power DRPw (LPD) enable to reduce power | ||
673 | * consumption | ||
674 | */ | ||
675 | #define WL12XX_QUIRK_LPD_MODE BIT(3) | ||
676 | |||
677 | /* Older firmwares did not implement the FW logger over bus feature */ | ||
678 | #define WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED BIT(4) | ||
679 | |||
680 | #define WL12XX_HW_BLOCK_SIZE 256 | ||
681 | |||
682 | #endif | ||