Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
csr_wifi_hip_unifi.h
Go to the documentation of this file.
1 /*****************************************************************************
2 
3  (c) Cambridge Silicon Radio Limited 2012
4  All rights reserved and confidential information of CSR
5 
6  Refer to LICENSE.txt included with this source for details
7  on the license terms.
8 
9 *****************************************************************************/
10 
11 /*
12  * ---------------------------------------------------------------------------
13  *
14  * FILE : csr_wifi_hip_unifi.h
15  *
16  * PURPOSE : Public API for the UniFi HIP core library.
17  *
18  * ---------------------------------------------------------------------------
19  */
20 #ifndef __CSR_WIFI_HIP_UNIFI_H__
21 #define __CSR_WIFI_HIP_UNIFI_H__ 1
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #ifndef CSR_WIFI_HIP_TA_DISABLE
29 #include "csr_wifi_router_prim.h"
30 #else
31 #include "csr_time.h"
32 #endif
33 
34 /* SDIO chip ID numbers */
35 
36 /* Manufacturer id */
37 #define SDIO_MANF_ID_CSR 0x032a
38 
39 /* Device id */
40 #define SDIO_CARD_ID_UNIFI_1 0x0001
41 #define SDIO_CARD_ID_UNIFI_2 0x0002
42 #define SDIO_CARD_ID_UNIFI_3 0x0007
43 #define SDIO_CARD_ID_UNIFI_4 0x0008
44 
45 /* Function number for WLAN */
46 #define SDIO_WLAN_FUNC_ID_UNIFI_1 0x0001
47 #define SDIO_WLAN_FUNC_ID_UNIFI_2 0x0001
48 #define SDIO_WLAN_FUNC_ID_UNIFI_3 0x0001
49 #define SDIO_WLAN_FUNC_ID_UNIFI_4 0x0002
50 
51 /* Maximum SDIO bus clock supported. */
52 #define UNIFI_SDIO_CLOCK_MAX_HZ 50000000 /* Hz */
53 
54 /*
55  * Initialisation SDIO bus clock.
56  *
57  * The initialisation clock speed should be used from when the chip has been
58  * reset until the first MLME-reset has been received (i.e. during firmware
59  * initialisation), unless UNIFI_SDIO_CLOCK_SAFE_HZ applies.
60  */
61 #define UNIFI_SDIO_CLOCK_INIT_HZ 12500000 /* Hz */
62 
63 /*
64  * Safe SDIO bus clock.
65  *
66  * The safe speed should be used when the chip is in deep sleep or
67  * it's state is unknown (just after reset / power on).
68  */
69 #define UNIFI_SDIO_CLOCK_SAFE_HZ 1000000 /* Hz */
70 
71 /* I/O default block size to use for UniFi. */
72 #define UNIFI_IO_BLOCK_SIZE 64
73 
74 #define UNIFI_WOL_OFF 0
75 #define UNIFI_WOL_SDIO 1
76 #define UNIFI_WOL_PIO 2
77 
78 /* The number of Tx traffic queues */
79 #define UNIFI_NO_OF_TX_QS 4
80 
81 #define CSR_WIFI_HIP_RESERVED_HOST_TAG 0xFFFFFFFF
82 
83 /*
84  * The number of slots in the from-host queues.
85  *
86  * UNIFI_SOFT_TRAFFIC_Q_LENGTH is the number of slots in the traffic queues
87  * and there will be UNIFI_NO_OF_TX_QS of them.
88  * Traffic queues are used for data packets.
89  *
90  * UNIFI_SOFT_COMMAND_Q_LENGTH is the number of slots in the command queue.
91  * The command queue is used for MLME management requests.
92  *
93  * Queues are ring buffers and so must always have 1 unused slot.
94  */
95 #define UNIFI_SOFT_TRAFFIC_Q_LENGTH (20 + 1)
96 #define UNIFI_SOFT_COMMAND_Q_LENGTH (16 + 1)
97 
98 #include "csr_framework_ext.h" /* from the synergy porting folder */
99 #include "csr_sdio.h" /* from the synergy porting folder */
100 #include "csr_macro.h" /* from the synergy porting folder */
101 #include "csr_wifi_result.h"
102 
103 /* Utility MACROS. Note that UNIFI_MAC_ADDRESS_CMP returns TRUE on success */
104 #define UNIFI_MAC_ADDRESS_COPY(dst, src) \
105  do { (dst)[0] = (src)[0]; (dst)[1] = (src)[1]; \
106  (dst)[2] = (src)[2]; (dst)[3] = (src)[3]; \
107  (dst)[4] = (src)[4]; (dst)[5] = (src)[5]; \
108  } while (0)
109 
110 #define UNIFI_MAC_ADDRESS_CMP(addr1, addr2) \
111  (((addr1)[0] == (addr2)[0]) && ((addr1)[1] == (addr2)[1]) && \
112  ((addr1)[2] == (addr2)[2]) && ((addr1)[3] == (addr2)[3]) && \
113  ((addr1)[4] == (addr2)[4]) && ((addr1)[5] == (addr2)[5]))
114 
115 /* Traffic queue ordered according to priority
116  * EAPOL/Uncontrolled port Queue should be the last
117  */
118 typedef enum
119 {
124  UNIFI_TRAFFIC_Q_EAPOL, /* Non existant in HIP */
125  UNIFI_TRAFFIC_Q_MAX, /* Non existant */
126  UNIFI_TRAFFIC_Q_MLME /* Non existant */
128 
129 /*
130  * Structure describing a bulk data slot.
131  * This structure is shared between the HIP core library and the OS
132  * layer. See the definition of unifi_net_data_malloc() for more details.
133  *
134  * The data_length field is used to indicate empty/occupied state.
135  * Needs to be defined before #include "unifi_os.h".
136  */
137 typedef struct _bulk_data_desc
138 {
139  const u8 *os_data_ptr;
141  const void *os_net_buf_ptr;
144 
145 /* Structure of an entry in the Symbol Look Up Table (SLUT). */
146 typedef struct _symbol
147 {
150 } symbol_t;
151 
152 /*
153  * Header files need to be included from the current directory,
154  * the SME library, the synergy framework and the OS layer.
155  * A thin OS layer needs to be implemented in the porting exercise.
156  *
157  * Note that unifi_os.h should be included only in unifi.h
158  */
159 
160 #include "unifi_os.h"
161 
162 /*
163  * Contains the HIP core definitions selected in the porting exercise, such as
164  * UNIFI_PAD_BULK_DATA_TO_BLOCK_SIZE and UNIFI_PAD_SIGNALS_TO_BLOCK_SIZE.
165  * Implemented in the OS layer, as part of the porting exersice.
166  */
167 #include "unifi_config.h"
168 
169 #include "csr_wifi_hip_signals.h" /* from this dir */
170 
171 /*
172  * The card structure is an opaque pointer that is used to pass context
173  * to the upper-edge API functions.
174  */
175 typedef struct card card_t;
176 
177 
178 /*
179  * This structure describes all of the bulk data that 'might' be
180  * associated with a signal.
181  */
182 typedef struct _bulk_data_param
183 {
186 
187 
188 /*
189  * This structure describes the chip and HIP core lib
190  * information that exposed to the OS layer.
191  */
192 typedef struct _card_info
193 {
199 } card_info_t;
200 
201 
202 /*
203  * Mini-coredump definitions
204  */
205 /* Definition of XAP memory ranges used by the mini-coredump system.
206  * Note that, these values are NOT the same as UNIFI_REGISTERS, etc
207  * in unifihw.h which don't allow selection of register areas for each XAP.
208  */
210 {
218 
219 /* Structure used to request a register value from a mini-coredump buffer */
220 typedef struct unifi_coredump_req
221 {
222  /* From user */
223  s32 index; /* 0=newest, -1=oldest */
224  unifi_coredump_space_t space; /* memory space */
225  u32 offset; /* register offset in space */
226  /* From driver */
227  u32 drv_build; /* Driver build id */
228  u32 chip_ver; /* Chip version */
229  u32 fw_ver; /* Firmware version */
230  s32 requestor; /* Requestor: 0=auto dump, 1=manual */
231  CsrTime timestamp; /* time of capture by driver */
232  u32 serial; /* capture serial number */
233  s32 value; /* register value */
234 } unifi_coredump_req_t; /* mini-coredumped reg value request */
235 
236 
257 card_t* unifi_alloc_card(CsrSdioFunction *sdiopriv, void *ospriv);
258 
259 
277 
287 
298 
324 CsrResult unifi_send_signal(card_t *card, const u8 *sigptr,
325  u32 siglen,
326  const bulk_data_param_t *bulkdata);
327 
344 
356 
375 
376 
398 CsrResult unifi_bh(card_t *card, u32 *remaining);
399 
400 
409 {
412 };
413 
422 {
425 };
426 
453  enum unifi_low_power_mode low_power_mode,
454  enum unifi_periodic_wake_mode periodic_wake_mode);
455 
474 
475 #ifndef CSR_WIFI_HIP_TA_DISABLE
476 
495 
510  const bulk_data_desc_t *data,
511  const u8 *saddr,
512  const u8 *sta_macaddr,
513  u32 timestamp,
514  u16 rate);
515 
530  u16 period);
531 
532 #endif
533 
543 
544 
545 CsrResult unifi_card_readn(card_t *card, u32 unifi_addr, void *pdata, u16 len);
548 
549 
551 {
557 };
558 
560 
579 
593 
605 void unifi_pause_xmit(void *ospriv, unifi_TrafficQueue queue);
606 void unifi_restart_xmit(void *ospriv, unifi_TrafficQueue queue);
607 
621 CsrResult unifi_run_bh(void *ospriv);
622 
642 void unifi_receive_event(void *ospriv,
643  u8 *sigdata, u32 siglen,
644  const bulk_data_param_t *bulkdata);
645 
646 #ifdef CSR_WIFI_REQUEUE_PACKET_TO_HAL
647 
659 CsrResult unifi_reque_ma_packet_request(void *ospriv, u32 host_tag,
660  u16 status,
661  bulk_data_desc_t *bulkDataDesc);
662 
663 #endif
664 typedef struct
665 {
666  u16 free_fh_sig_queue_slots[UNIFI_NO_OF_TX_QS];
670 
672 
673 
681 #define UNIFI_FW_STA 1 /* Identify STA firmware file */
682 
701 void* unifi_fw_read_start(void *ospriv, s8 is_fw, const card_info_t *info);
702 
719 s32 unifi_fw_read(void *ospriv, void *arg, u32 offset, void *buf, u32 len);
720 
731 void unifi_fw_read_stop(void *ospriv, void *dlpriv);
732 
746 void* unifi_fw_open_buffer(void *ospriv, void *fwbuf, u32 len);
747 
759 void unifi_fw_close_buffer(void *ospriv, void *fwbuf);
760 
761 #ifndef CSR_WIFI_HIP_TA_DISABLE
762 /*
763  * Driver must provide these.
764  *
765  * A simple implementation will just call
766  * unifi_sys_traffic_protocol_ind() or unifi_sys_traffic_classification_ind()
767  * respectively. See sme_csr_userspace/sme_userspace.c.
768  */
786 void unifi_ta_indicate_protocol(void *ospriv,
789  const CsrWifiMacAddress *src_addr);
790 
805 void unifi_ta_indicate_l4stats(void *ospriv,
806  u32 rxTcpThroughput,
807  u32 txTcpThroughput,
808  u32 rxUdpThroughput,
809  u32 txUdpThroughput);
810 #endif
811 
812 void unifi_rx_queue_flush(void *ospriv);
813 
825 
826 
827 /* HELPER FUNCTIONS */
828 
829 /*
830  * unifi_init() and unifi_download() implement a subset of unifi_init_card functionality
831  * that excludes HIP initialization.
832  */
835 
836 /*
837  * unifi_start_processors() ensures both on-chip processors are running
838  */
840 
842 
843 /*
844  * Configure HIP interrupt processing mode
845  */
846 #define CSR_WIFI_INTMODE_DEFAULT 0
847 #define CSR_WIFI_INTMODE_RUN_BH_ONCE 1 /* Run BH once per interrupt */
848 
850 
851 /*
852  * unifi_request_max_clock() requests that max SDIO clock speed is set at the
853  * next suitable opportunity.
854  */
856 
857 
858 /* Functions to lookup bulk data command names. */
859 const char* lookup_bulkcmd_name(u16 id);
860 
861 /* Function to log HIP's global debug buffer */
862 #ifdef CSR_WIFI_HIP_DEBUG_OFFLINE
863 void unifi_debug_buf_dump(void);
864 void unifi_debug_log_to_buf(const char *fmt, ...);
865 void unifi_debug_hex_to_buf(const char *buff, u16 length);
866 #endif
867 
868 /* Mini-coredump utility functions */
872 CsrResult unifi_coredump_init(card_t *card, u16 num_dump_buffers);
874 
875 #ifdef __cplusplus
876 }
877 #endif
878 
879 #endif /* __CSR_WIFI_HIP_UNIFI_H__ */