Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
wlcore_i.h
Go to the documentation of this file.
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 <[email protected]>
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 __WLCORE_I_H__
26 #define __WLCORE_I_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 /*
39  * wl127x and wl128x are using the same NVS file name. However, the
40  * ini parameters between them are different. The driver validates
41  * the correct NVS size in wl1271_boot_upload_nvs().
42  */
43 #define WL12XX_NVS_NAME "ti-connectivity/wl1271-nvs.bin"
44 
45 #define WL1271_TX_SECURITY_LO16(s) ((u16)((s) & 0xffff))
46 #define WL1271_TX_SECURITY_HI32(s) ((u32)(((s) >> 16) & 0xffffffff))
47 #define WL1271_TX_SQN_POST_RECOVERY_PADDING 0xff
48 
49 #define WL1271_CIPHER_SUITE_GEM 0x00147201
50 
51 #define WL1271_BUSY_WORD_CNT 1
52 #define WL1271_BUSY_WORD_LEN (WL1271_BUSY_WORD_CNT * sizeof(u32))
53 
54 #define WL1271_ELP_HW_STATE_ASLEEP 0
55 #define WL1271_ELP_HW_STATE_IRQ 1
56 
57 #define WL1271_DEFAULT_BEACON_INT 100
58 #define WL1271_DEFAULT_DTIM_PERIOD 1
59 
60 #define WL12XX_MAX_ROLES 4
61 #define WL12XX_MAX_LINKS 12
62 #define WL12XX_INVALID_ROLE_ID 0xff
63 #define WL12XX_INVALID_LINK_ID 0xff
64 
65 /* the driver supports the 2.4Ghz and 5Ghz bands */
66 #define WLCORE_NUM_BANDS 2
67 
68 #define WL12XX_MAX_RATE_POLICIES 16
69 #define WLCORE_MAX_KLV_TEMPLATES 4
70 
71 /* Defined by FW as 0. Will not be freed or allocated. */
72 #define WL12XX_SYSTEM_HLID 0
73 
74 /*
75  * When in AP-mode, we allow (at least) this number of packets
76  * to be transmitted to FW for a STA in PS-mode. Only when packets are
77  * present in the FW buffers it will wake the sleeping STA. We want to put
78  * enough packets for the driver to transmit all of its buffered data before
79  * the STA goes to sleep again. But we don't want to take too much memory
80  * as it might hurt the throughput of active STAs.
81  */
82 #define WL1271_PS_STA_MAX_PACKETS 2
83 
84 #define WL1271_AP_BSS_INDEX 0
85 #define WL1271_AP_DEF_BEACON_EXP 20
86 
91 };
92 
98 };
99 
100 struct wl1271;
101 
102 enum {
108 
110 };
111 
112 #define FW_VER_CHIP_WL127X 6
113 #define FW_VER_CHIP_WL128X 7
114 
115 #define FW_VER_IF_TYPE_STA 1
116 #define FW_VER_IF_TYPE_AP 2
117 
118 #define FW_VER_MINOR_1_SPARE_STA_MIN 58
119 #define FW_VER_MINOR_1_SPARE_AP_MIN 47
120 
121 #define FW_VER_MINOR_FWLOG_STA_MIN 70
122 
123 struct wl1271_chip {
126  unsigned int fw_ver[NUM_FW_VER];
128 };
129 
130 #define NUM_TX_QUEUES 4
131 
132 #define AP_MAX_STATIONS 8
133 
135  /* Cumulative counter of released packets per AC */
137 
138  /* Cumulative counter of freed packets per HLID */
140 
141  /* Cumulative counter of released Voice memory blocks */
143 
145 } __packed;
146 
147 /* FW status registers */
155 } __packed;
156 
157 /*
158  * Each HW arch has a different number of Rx descriptors.
159  * The length of the status depends on it, since it holds an array
160  * of descriptors.
161  */
162 #define WLCORE_FW_STATUS_1_LEN(num_rx_desc) \
163  (sizeof(struct wl_fw_status_1) + \
164  (sizeof(((struct wl_fw_status_1 *)0)->rx_pkt_descs[0])) * \
165  num_rx_desc)
166 
169 
170  /*
171  * A bitmap (where each bit represents a single HLID)
172  * to indicate if the station is in PS mode.
173  */
175 
176  /*
177  * A bitmap (where each bit represents a single HLID) to indicate
178  * if the station is in Fast mode
179  */
181 
182  /* Cumulative counter of total released mem blocks since FW-reset */
184 
185  /* Size (in Memory Blocks) of TX pool */
187 
189 
191 
192  /* Private status to be used by the lower drivers */
193  u8 priv[0];
194 } __packed;
195 
196 #define WL1271_MAX_CHANNELS 64
197 struct wl1271_scan {
200  bool failed;
203  size_t ssid_len;
204 };
205 
207  int __must_check (*read)(struct device *child, int addr, void *buf,
208  size_t len, bool fixed);
209  int __must_check (*write)(struct device *child, int addr, void *buf,
210  size_t len, bool fixed);
211  void (*reset)(struct device *child);
212  void (*init)(struct device *child);
213  int (*power)(struct device *child, bool enable);
214  void (*set_block_size) (struct device *child, unsigned int blksz);
215 };
216 
217 #define MAX_NUM_KEYS 14
218 #define MAX_KEY_SIZE 32
219 
228 };
229 
246 };
247 
261 };
262 
263 struct wl1271_link {
264  /* AP-mode - TX queue per AC in link */
266 
267  /* accounting for allocated / freed packets in FW */
270 
272 
273  /* bitmap of TIDs where RX BA sessions are active for this link */
275 };
276 
277 #define WL1271_MAX_RX_FILTERS 5
278 #define WL1271_RX_FILTER_MAX_FIELDS 8
279 
280 #define WL1271_RX_FILTER_ETH_HEADER_SIZE 14
281 #define WL1271_RX_FILTER_MAX_FIELDS_SIZE 95
282 #define RX_FILTER_FIELD_OVERHEAD \
283  (sizeof(struct wl12xx_rx_filter_field) - sizeof(u8 *))
284 #define WL1271_RX_FILTER_MAX_PATTERN_SIZE \
285  (WL1271_RX_FILTER_MAX_FIELDS_SIZE - RX_FILTER_FIELD_OVERHEAD)
286 
287 #define WL1271_RX_FILTER_FLAG_MASK BIT(0)
288 #define WL1271_RX_FILTER_FLAG_IP_HEADER 0
289 #define WL1271_RX_FILTER_FLAG_ETHERNET_HEADER BIT(1)
290 
295 };
296 
297 enum plt_mode {
298  PLT_OFF = 0,
299  PLT_ON = 1,
301 };
302 
308 } __packed;
309 
314 };
315 
318 };
319 
320 struct wl12xx_vif {
321  struct wl1271 *wl;
322  struct list_head list;
323  unsigned long flags;
325  u8 p2p; /* we are using p2p role */
327 
328  /* sta/ibss specific */
331 
332  union {
333  struct {
336 
340 
342 
343  bool qos;
344  } sta;
345  struct {
348 
349  /* HLIDs bitmap of associated stations */
350  unsigned long sta_hlid_map[BITS_TO_LONGS(
352 
353  /* recoreded keys - set here before AP startup */
355 
359  } ap;
360  };
361 
362  /* the hlid of the last transmitted skb */
364 
366 
369 
370  /* The current band */
372  int channel;
374 
377 
378  /*
379  * currently configured rate set:
380  * bits 0-15 - 802.11abg rates
381  * bits 16-23 - 802.11n MCS index mask
382  * support only 1 stream, thus only 8 bits for the MCS rates (0-7).
383  */
386 
387  /* probe-req template for the current AP */
388  struct sk_buff *probereq;
389 
390  /* Beaconing interval (needed for ad-hoc) */
392 
393  /* Default key (for WEP) */
395 
396  /* Our association ID */
398 
399  /* Session counter for the chipset */
401 
402  /* retry counter for PSM entries */
404 
405  /* in dBm */
407 
410 
411  /* save the current encryption type for auto-arp config */
414 
415  /* RX BA constraint value */
418 
419  /* Rx Streaming */
423 
424  /*
425  * This struct must be last!
426  * data that has to be saved acrossed reconfigs (e.g. recovery)
427  * should be declared in this struct.
428  */
429  struct {
431  /*
432  * Security sequence number
433  * bits 0-15: lower 16 bits part of sequence number
434  * bits 16-47: higher 32 bits part of sequence number
435  * bits 48-63: not in use
436  */
438 
439  /* 8 bits of the last sequence number in use */
441  };
442 };
443 
444 static inline struct wl12xx_vif *wl12xx_vif_to_data(struct ieee80211_vif *vif)
445 {
446  return (struct wl12xx_vif *)vif->drv_priv;
447 }
448 
449 static inline
450 struct ieee80211_vif *wl12xx_wlvif_to_vif(struct wl12xx_vif *wlvif)
451 {
452  return container_of((void *)wlvif, struct ieee80211_vif, drv_priv);
453 }
454 
455 #define wl12xx_for_each_wlvif(wl, wlvif) \
456  list_for_each_entry(wlvif, &wl->wlvif_list, list)
457 
458 #define wl12xx_for_each_wlvif_continue(wl, wlvif) \
459  list_for_each_entry_continue(wlvif, &wl->wlvif_list, list)
460 
461 #define wl12xx_for_each_wlvif_bss_type(wl, wlvif, _bss_type) \
462  wl12xx_for_each_wlvif(wl, wlvif) \
463  if (wlvif->bss_type == _bss_type)
464 
465 #define wl12xx_for_each_wlvif_sta(wl, wlvif) \
466  wl12xx_for_each_wlvif_bss_type(wl, wlvif, BSS_TYPE_STA_BSS)
467 
468 #define wl12xx_for_each_wlvif_ap(wl, wlvif) \
469  wl12xx_for_each_wlvif_bss_type(wl, wlvif, BSS_TYPE_AP_BSS)
470 
471 int wl1271_plt_start(struct wl1271 *wl, const enum plt_mode plt_mode);
472 int wl1271_plt_stop(struct wl1271 *wl);
473 int wl1271_recalc_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif);
474 void wl12xx_queue_recovery_work(struct wl1271 *wl);
475 size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen);
477  u16 offset, u8 flags,
478  u8 *pattern, u8 len);
483  u8 *buf);
484 
485 #define JOIN_TIMEOUT 5000 /* 5000 milliseconds to join */
486 
487 #define SESSION_COUNTER_MAX 6 /* maximum value for the session counter */
488 #define SESSION_COUNTER_INVALID 7 /* used with dummy_packet */
489 
490 #define WL1271_DEFAULT_POWER_LEVEL 0
491 
492 #define WL1271_TX_QUEUE_LOW_WATERMARK 32
493 #define WL1271_TX_QUEUE_HIGH_WATERMARK 256
494 
495 #define WL1271_DEFERRED_QUEUE_LIMIT 64
496 
497 /* WL1271 needs a 200ms sleep after power on, and a 20ms sleep before power
498  on in case is has been shut down shortly before */
499 #define WL1271_PRE_POWER_ON_SLEEP 20 /* in milliseconds */
500 #define WL1271_POWER_ON_SLEEP 200 /* in milliseconds */
501 
502 /* Macros to handle wl1271.sta_rate_set */
503 #define HW_BG_RATES_MASK 0xffff
504 #define HW_HT_RATES_OFFSET 16
505 #define HW_MIMO_RATES_OFFSET 24
506 
507 #define WL12XX_HW_BLOCK_SIZE 256
508 
509 #endif /* __WLCORE_I_H__ */