diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl12xx.h')
-rw-r--r-- | drivers/net/wireless/wl12xx/wl12xx.h | 639 |
1 files changed, 639 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/wl12xx.h b/drivers/net/wireless/wl12xx/wl12xx.h new file mode 100644 index 000000000000..fbe8f46d1232 --- /dev/null +++ b/drivers/net/wireless/wl12xx/wl12xx.h | |||
@@ -0,0 +1,639 @@ | |||
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 | |||
148 | #define WL1271_CIPHER_SUITE_GEM 0x00147201 | ||
149 | |||
150 | #define WL1271_BUSY_WORD_CNT 1 | ||
151 | #define WL1271_BUSY_WORD_LEN (WL1271_BUSY_WORD_CNT * sizeof(u32)) | ||
152 | |||
153 | #define WL1271_ELP_HW_STATE_ASLEEP 0 | ||
154 | #define WL1271_ELP_HW_STATE_IRQ 1 | ||
155 | |||
156 | #define WL1271_DEFAULT_BEACON_INT 100 | ||
157 | #define WL1271_DEFAULT_DTIM_PERIOD 1 | ||
158 | |||
159 | #define WL1271_AP_GLOBAL_HLID 0 | ||
160 | #define WL1271_AP_BROADCAST_HLID 1 | ||
161 | #define WL1271_AP_STA_HLID_START 2 | ||
162 | |||
163 | /* | ||
164 | * When in AP-mode, we allow (at least) this number of mem-blocks | ||
165 | * to be transmitted to FW for a STA in PS-mode. Only when packets are | ||
166 | * present in the FW buffers it will wake the sleeping STA. We want to put | ||
167 | * enough packets for the driver to transmit all of its buffered data before | ||
168 | * the STA goes to sleep again. But we don't want to take too much mem-blocks | ||
169 | * as it might hurt the throughput of active STAs. | ||
170 | * The number of blocks (18) is enough for 2 large packets. | ||
171 | */ | ||
172 | #define WL1271_PS_STA_MAX_BLOCKS (2 * 9) | ||
173 | |||
174 | #define WL1271_AP_BSS_INDEX 0 | ||
175 | #define WL1271_AP_DEF_INACTIV_SEC 300 | ||
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 | struct wl1271_chip { | ||
230 | u32 id; | ||
231 | char fw_ver_str[ETHTOOL_BUSINFO_LEN]; | ||
232 | unsigned int fw_ver[NUM_FW_VER]; | ||
233 | }; | ||
234 | |||
235 | struct wl1271_stats { | ||
236 | struct acx_statistics *fw_stats; | ||
237 | unsigned long fw_stats_update; | ||
238 | |||
239 | unsigned int retry_count; | ||
240 | unsigned int excessive_retries; | ||
241 | }; | ||
242 | |||
243 | #define NUM_TX_QUEUES 4 | ||
244 | #define NUM_RX_PKT_DESC 8 | ||
245 | |||
246 | #define AP_MAX_STATIONS 5 | ||
247 | |||
248 | /* Broadcast and Global links + links to stations */ | ||
249 | #define AP_MAX_LINKS (AP_MAX_STATIONS + 2) | ||
250 | |||
251 | /* FW status registers common for AP/STA */ | ||
252 | struct wl1271_fw_common_status { | ||
253 | __le32 intr; | ||
254 | u8 fw_rx_counter; | ||
255 | u8 drv_rx_counter; | ||
256 | u8 reserved; | ||
257 | u8 tx_results_counter; | ||
258 | __le32 rx_pkt_descs[NUM_RX_PKT_DESC]; | ||
259 | __le32 tx_released_blks[NUM_TX_QUEUES]; | ||
260 | __le32 fw_localtime; | ||
261 | } __packed; | ||
262 | |||
263 | /* FW status registers for AP */ | ||
264 | struct wl1271_fw_ap_status { | ||
265 | struct wl1271_fw_common_status common; | ||
266 | |||
267 | /* Next fields valid only in AP FW */ | ||
268 | |||
269 | /* | ||
270 | * A bitmap (where each bit represents a single HLID) | ||
271 | * to indicate if the station is in PS mode. | ||
272 | */ | ||
273 | __le32 link_ps_bitmap; | ||
274 | |||
275 | /* Number of freed MBs per HLID */ | ||
276 | u8 tx_lnk_free_blks[AP_MAX_LINKS]; | ||
277 | u8 padding_1[1]; | ||
278 | } __packed; | ||
279 | |||
280 | /* FW status registers for STA */ | ||
281 | struct wl1271_fw_sta_status { | ||
282 | struct wl1271_fw_common_status common; | ||
283 | |||
284 | u8 tx_total; | ||
285 | u8 reserved1; | ||
286 | __le16 reserved2; | ||
287 | /* Total structure size is 68 bytes */ | ||
288 | u32 padding; | ||
289 | } __packed; | ||
290 | |||
291 | struct wl1271_fw_full_status { | ||
292 | union { | ||
293 | struct wl1271_fw_common_status common; | ||
294 | struct wl1271_fw_sta_status sta; | ||
295 | struct wl1271_fw_ap_status ap; | ||
296 | }; | ||
297 | } __packed; | ||
298 | |||
299 | |||
300 | struct wl1271_rx_mem_pool_addr { | ||
301 | u32 addr; | ||
302 | u32 addr_extra; | ||
303 | }; | ||
304 | |||
305 | #define WL1271_MAX_CHANNELS 64 | ||
306 | struct wl1271_scan { | ||
307 | struct cfg80211_scan_request *req; | ||
308 | unsigned long scanned_ch[BITS_TO_LONGS(WL1271_MAX_CHANNELS)]; | ||
309 | bool failed; | ||
310 | u8 state; | ||
311 | u8 ssid[IW_ESSID_MAX_SIZE+1]; | ||
312 | size_t ssid_len; | ||
313 | }; | ||
314 | |||
315 | struct wl1271_if_operations { | ||
316 | void (*read)(struct wl1271 *wl, int addr, void *buf, size_t len, | ||
317 | bool fixed); | ||
318 | void (*write)(struct wl1271 *wl, int addr, void *buf, size_t len, | ||
319 | bool fixed); | ||
320 | void (*reset)(struct wl1271 *wl); | ||
321 | void (*init)(struct wl1271 *wl); | ||
322 | int (*power)(struct wl1271 *wl, bool enable); | ||
323 | struct device* (*dev)(struct wl1271 *wl); | ||
324 | void (*enable_irq)(struct wl1271 *wl); | ||
325 | void (*disable_irq)(struct wl1271 *wl); | ||
326 | void (*set_block_size) (struct wl1271 *wl, unsigned int blksz); | ||
327 | }; | ||
328 | |||
329 | #define MAX_NUM_KEYS 14 | ||
330 | #define MAX_KEY_SIZE 32 | ||
331 | |||
332 | struct wl1271_ap_key { | ||
333 | u8 id; | ||
334 | u8 key_type; | ||
335 | u8 key_size; | ||
336 | u8 key[MAX_KEY_SIZE]; | ||
337 | u8 hlid; | ||
338 | u32 tx_seq_32; | ||
339 | u16 tx_seq_16; | ||
340 | }; | ||
341 | |||
342 | enum wl12xx_flags { | ||
343 | WL1271_FLAG_STA_ASSOCIATED, | ||
344 | WL1271_FLAG_JOINED, | ||
345 | WL1271_FLAG_GPIO_POWER, | ||
346 | WL1271_FLAG_TX_QUEUE_STOPPED, | ||
347 | WL1271_FLAG_TX_PENDING, | ||
348 | WL1271_FLAG_IN_ELP, | ||
349 | WL1271_FLAG_ELP_REQUESTED, | ||
350 | WL1271_FLAG_PSM, | ||
351 | WL1271_FLAG_PSM_REQUESTED, | ||
352 | WL1271_FLAG_IRQ_RUNNING, | ||
353 | WL1271_FLAG_IDLE, | ||
354 | WL1271_FLAG_PSPOLL_FAILURE, | ||
355 | WL1271_FLAG_STA_STATE_SENT, | ||
356 | WL1271_FLAG_FW_TX_BUSY, | ||
357 | WL1271_FLAG_AP_STARTED, | ||
358 | WL1271_FLAG_IF_INITIALIZED, | ||
359 | WL1271_FLAG_DUMMY_PACKET_PENDING, | ||
360 | WL1271_FLAG_SUSPENDED, | ||
361 | WL1271_FLAG_PENDING_WORK, | ||
362 | }; | ||
363 | |||
364 | struct wl1271_link { | ||
365 | /* AP-mode - TX queue per AC in link */ | ||
366 | struct sk_buff_head tx_queue[NUM_TX_QUEUES]; | ||
367 | |||
368 | /* accounting for allocated / available TX blocks in FW */ | ||
369 | u8 allocated_blks; | ||
370 | u8 prev_freed_blks; | ||
371 | |||
372 | u8 addr[ETH_ALEN]; | ||
373 | }; | ||
374 | |||
375 | struct wl1271 { | ||
376 | struct platform_device *plat_dev; | ||
377 | struct ieee80211_hw *hw; | ||
378 | bool mac80211_registered; | ||
379 | |||
380 | void *if_priv; | ||
381 | |||
382 | struct wl1271_if_operations *if_ops; | ||
383 | |||
384 | void (*set_power)(bool enable); | ||
385 | int irq; | ||
386 | int ref_clock; | ||
387 | |||
388 | spinlock_t wl_lock; | ||
389 | |||
390 | enum wl1271_state state; | ||
391 | struct mutex mutex; | ||
392 | |||
393 | unsigned long flags; | ||
394 | |||
395 | struct wl1271_partition_set part; | ||
396 | |||
397 | struct wl1271_chip chip; | ||
398 | |||
399 | int cmd_box_addr; | ||
400 | int event_box_addr; | ||
401 | |||
402 | u8 *fw; | ||
403 | size_t fw_len; | ||
404 | u8 fw_bss_type; | ||
405 | void *nvs; | ||
406 | size_t nvs_len; | ||
407 | |||
408 | s8 hw_pg_ver; | ||
409 | |||
410 | u8 bssid[ETH_ALEN]; | ||
411 | u8 mac_addr[ETH_ALEN]; | ||
412 | u8 bss_type; | ||
413 | u8 set_bss_type; | ||
414 | u8 ssid[IW_ESSID_MAX_SIZE + 1]; | ||
415 | u8 ssid_len; | ||
416 | int channel; | ||
417 | |||
418 | struct wl1271_acx_mem_map *target_mem_map; | ||
419 | |||
420 | /* Accounting for allocated / available TX blocks on HW */ | ||
421 | u32 tx_blocks_freed[NUM_TX_QUEUES]; | ||
422 | u32 tx_blocks_available; | ||
423 | u32 tx_allocated_blocks; | ||
424 | u32 tx_results_count; | ||
425 | |||
426 | /* Transmitted TX packets counter for chipset interface */ | ||
427 | u32 tx_packets_count; | ||
428 | |||
429 | /* Time-offset between host and chipset clocks */ | ||
430 | s64 time_offset; | ||
431 | |||
432 | /* Session counter for the chipset */ | ||
433 | int session_counter; | ||
434 | |||
435 | /* Frames scheduled for transmission, not handled yet */ | ||
436 | struct sk_buff_head tx_queue[NUM_TX_QUEUES]; | ||
437 | int tx_queue_count; | ||
438 | |||
439 | /* Frames received, not handled yet by mac80211 */ | ||
440 | struct sk_buff_head deferred_rx_queue; | ||
441 | |||
442 | /* Frames sent, not returned yet to mac80211 */ | ||
443 | struct sk_buff_head deferred_tx_queue; | ||
444 | |||
445 | struct work_struct tx_work; | ||
446 | |||
447 | /* Pending TX frames */ | ||
448 | unsigned long tx_frames_map[BITS_TO_LONGS(ACX_TX_DESCRIPTORS)]; | ||
449 | struct sk_buff *tx_frames[ACX_TX_DESCRIPTORS]; | ||
450 | int tx_frames_cnt; | ||
451 | |||
452 | /* Security sequence number counters */ | ||
453 | u8 tx_security_last_seq; | ||
454 | s64 tx_security_seq; | ||
455 | |||
456 | /* FW Rx counter */ | ||
457 | u32 rx_counter; | ||
458 | |||
459 | /* Rx memory pool address */ | ||
460 | struct wl1271_rx_mem_pool_addr rx_mem_pool_addr; | ||
461 | |||
462 | /* Intermediate buffer, used for packet aggregation */ | ||
463 | u8 *aggr_buf; | ||
464 | |||
465 | /* Reusable dummy packet template */ | ||
466 | struct sk_buff *dummy_packet; | ||
467 | |||
468 | /* Network stack work */ | ||
469 | struct work_struct netstack_work; | ||
470 | |||
471 | /* Hardware recovery work */ | ||
472 | struct work_struct recovery_work; | ||
473 | |||
474 | /* The mbox event mask */ | ||
475 | u32 event_mask; | ||
476 | |||
477 | /* Mailbox pointers */ | ||
478 | u32 mbox_ptr[2]; | ||
479 | |||
480 | /* Are we currently scanning */ | ||
481 | struct wl1271_scan scan; | ||
482 | struct delayed_work scan_complete_work; | ||
483 | |||
484 | bool sched_scanning; | ||
485 | |||
486 | /* probe-req template for the current AP */ | ||
487 | struct sk_buff *probereq; | ||
488 | |||
489 | /* Our association ID */ | ||
490 | u16 aid; | ||
491 | |||
492 | /* | ||
493 | * currently configured rate set: | ||
494 | * bits 0-15 - 802.11abg rates | ||
495 | * bits 16-23 - 802.11n MCS index mask | ||
496 | * support only 1 stream, thus only 8 bits for the MCS rates (0-7). | ||
497 | */ | ||
498 | u32 basic_rate_set; | ||
499 | u32 basic_rate; | ||
500 | u32 rate_set; | ||
501 | |||
502 | /* The current band */ | ||
503 | enum ieee80211_band band; | ||
504 | |||
505 | /* Beaconing interval (needed for ad-hoc) */ | ||
506 | u32 beacon_int; | ||
507 | |||
508 | /* Default key (for WEP) */ | ||
509 | u32 default_key; | ||
510 | |||
511 | unsigned int filters; | ||
512 | unsigned int rx_config; | ||
513 | unsigned int rx_filter; | ||
514 | |||
515 | struct completion *elp_compl; | ||
516 | struct completion *ps_compl; | ||
517 | struct delayed_work elp_work; | ||
518 | struct delayed_work pspoll_work; | ||
519 | |||
520 | /* counter for ps-poll delivery failures */ | ||
521 | int ps_poll_failures; | ||
522 | |||
523 | /* retry counter for PSM entries */ | ||
524 | u8 psm_entry_retry; | ||
525 | |||
526 | /* in dBm */ | ||
527 | int power_level; | ||
528 | |||
529 | int rssi_thold; | ||
530 | int last_rssi_event; | ||
531 | |||
532 | struct wl1271_stats stats; | ||
533 | |||
534 | __le32 buffer_32; | ||
535 | u32 buffer_cmd; | ||
536 | u32 buffer_busyword[WL1271_BUSY_WORD_CNT]; | ||
537 | |||
538 | struct wl1271_fw_full_status *fw_status; | ||
539 | struct wl1271_tx_hw_res_if *tx_res_if; | ||
540 | |||
541 | struct ieee80211_vif *vif; | ||
542 | |||
543 | /* Current chipset configuration */ | ||
544 | struct conf_drv_settings conf; | ||
545 | |||
546 | bool sg_enabled; | ||
547 | |||
548 | bool enable_11a; | ||
549 | |||
550 | struct list_head list; | ||
551 | |||
552 | /* Most recently reported noise in dBm */ | ||
553 | s8 noise; | ||
554 | |||
555 | /* map for HLIDs of associated stations - when operating in AP mode */ | ||
556 | unsigned long ap_hlid_map[BITS_TO_LONGS(AP_MAX_STATIONS)]; | ||
557 | |||
558 | /* recoreded keys for AP-mode - set here before AP startup */ | ||
559 | struct wl1271_ap_key *recorded_ap_keys[MAX_NUM_KEYS]; | ||
560 | |||
561 | /* bands supported by this instance of wl12xx */ | ||
562 | struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS]; | ||
563 | |||
564 | /* RX BA constraint value */ | ||
565 | bool ba_support; | ||
566 | u8 ba_rx_bitmap; | ||
567 | |||
568 | int tcxo_clock; | ||
569 | |||
570 | /* | ||
571 | * wowlan trigger was configured during suspend. | ||
572 | * (currently, only "ANY" trigger is supported) | ||
573 | */ | ||
574 | bool wow_enabled; | ||
575 | |||
576 | /* | ||
577 | * AP-mode - links indexed by HLID. The global and broadcast links | ||
578 | * are always active. | ||
579 | */ | ||
580 | struct wl1271_link links[AP_MAX_LINKS]; | ||
581 | |||
582 | /* the hlid of the link where the last transmitted skb came from */ | ||
583 | int last_tx_hlid; | ||
584 | |||
585 | /* AP-mode - a bitmap of links currently in PS mode according to FW */ | ||
586 | u32 ap_fw_ps_map; | ||
587 | |||
588 | /* AP-mode - a bitmap of links currently in PS mode in mac80211 */ | ||
589 | unsigned long ap_ps_map; | ||
590 | |||
591 | /* Quirks of specific hardware revisions */ | ||
592 | unsigned int quirks; | ||
593 | |||
594 | /* Platform limitations */ | ||
595 | unsigned int platform_quirks; | ||
596 | }; | ||
597 | |||
598 | struct wl1271_station { | ||
599 | u8 hlid; | ||
600 | }; | ||
601 | |||
602 | int wl1271_plt_start(struct wl1271 *wl); | ||
603 | int wl1271_plt_stop(struct wl1271 *wl); | ||
604 | |||
605 | #define JOIN_TIMEOUT 5000 /* 5000 milliseconds to join */ | ||
606 | |||
607 | #define SESSION_COUNTER_MAX 7 /* maximum value for the session counter */ | ||
608 | |||
609 | #define WL1271_DEFAULT_POWER_LEVEL 0 | ||
610 | |||
611 | #define WL1271_TX_QUEUE_LOW_WATERMARK 10 | ||
612 | #define WL1271_TX_QUEUE_HIGH_WATERMARK 25 | ||
613 | |||
614 | #define WL1271_DEFERRED_QUEUE_LIMIT 64 | ||
615 | |||
616 | /* WL1271 needs a 200ms sleep after power on, and a 20ms sleep before power | ||
617 | on in case is has been shut down shortly before */ | ||
618 | #define WL1271_PRE_POWER_ON_SLEEP 20 /* in milliseconds */ | ||
619 | #define WL1271_POWER_ON_SLEEP 200 /* in milliseconds */ | ||
620 | |||
621 | /* Macros to handle wl1271.sta_rate_set */ | ||
622 | #define HW_BG_RATES_MASK 0xffff | ||
623 | #define HW_HT_RATES_OFFSET 16 | ||
624 | |||
625 | /* Quirks */ | ||
626 | |||
627 | /* Each RX/TX transaction requires an end-of-transaction transfer */ | ||
628 | #define WL12XX_QUIRK_END_OF_TRANSACTION BIT(0) | ||
629 | |||
630 | /* | ||
631 | * Older firmwares use 2 spare TX blocks | ||
632 | * (for STA < 6.1.3.50.58 or for AP < 6.2.0.0.47) | ||
633 | */ | ||
634 | #define WL12XX_QUIRK_USE_2_SPARE_BLOCKS BIT(1) | ||
635 | |||
636 | /* WL128X requires aggregated packets to be aligned to the SDIO block size */ | ||
637 | #define WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT BIT(2) | ||
638 | |||
639 | #endif | ||