aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/csr/unifiio.h
blob: b9de0cb94e9a8725549f8f24dfa0f10c1c47bcbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
/*
 * ---------------------------------------------------------------------------
 *
 *  FILE: unifiio.h
 *
 *      Public definitions for the UniFi linux driver.
 *      This is mostly ioctl command values and structs.
 *
 *      Include <sys/ioctl.h> or similar before this file
 *
 * Copyright (C) 2005-2009 by Cambridge Silicon Radio Ltd.
 *
 * Refer to LICENSE.txt included with this source code for details on
 * the license terms.
 *
 * ---------------------------------------------------------------------------
 */
#ifndef __UNIFIIO_H__
#define __UNIFIIO_H__

#include <linux/types.h>

#define UNIFI_GET_UDI_ENABLE    _IOR('u',  1, int)
#define UNIFI_SET_UDI_ENABLE    _IOW('u',  2, int)
/* Values for UDI_ENABLE */
#define UDI_ENABLE_DATA         0x1
#define UDI_ENABLE_CONTROL      0x2

/* MIB set/get. Arg is a pointer to a varbind */
#define UNIFI_GET_MIB           _IOWR('u',  3, unsigned char *)
#define UNIFI_SET_MIB           _IOW ('u',  4, unsigned char *)
#define MAX_VARBIND_LENGTH 127

/* Private IOCTLs */
#define SIOCIWS80211POWERSAVEPRIV           SIOCIWFIRSTPRIV
#define SIOCIWG80211POWERSAVEPRIV           SIOCIWFIRSTPRIV + 1
#define SIOCIWS80211RELOADDEFAULTSPRIV      SIOCIWFIRSTPRIV + 2
#define SIOCIWSCONFWAPIPRIV                 SIOCIWFIRSTPRIV + 4
#define SIOCIWSWAPIKEYPRIV                  SIOCIWFIRSTPRIV + 6
#define SIOCIWSSMEDEBUGPRIV                 SIOCIWFIRSTPRIV + 8
#define SIOCIWSAPCFGPRIV                    SIOCIWFIRSTPRIV + 10
#define SIOCIWSAPSTARTPRIV                  SIOCIWFIRSTPRIV + 12
#define SIOCIWSAPSTOPPRIV                   SIOCIWFIRSTPRIV + 14
#define SIOCIWSFWRELOADPRIV                 SIOCIWFIRSTPRIV + 16
#define SIOCIWSSTACKSTART                   SIOCIWFIRSTPRIV + 18
#define SIOCIWSSTACKSTOP                    SIOCIWFIRSTPRIV + 20



#define IWPRIV_POWER_SAVE_MAX_STRING 32
#define IWPRIV_SME_DEBUG_MAX_STRING 32
#define IWPRIV_SME_MAX_STRING 120


/* Private configuration commands */
#define UNIFI_CFG               _IOWR('u',  5, unsigned char *)
/*
 * <------------------  Read/Write Buffer  -------------------->
 * _____________________________________________________________
 * |    Cmd    |    Arg    |   ...  Buffer (opt)  ...          |
 * -------------------------------------------------------------
 * <-- uint --><-- uint --><-----  unsigned char buffer  ------>
 *
 * Cmd:    A unifi_cfg_command_t command.
 * Arg:    Out:Length     if Cmd==UNIFI_CFG_GET
 *         In:PowerOnOff  if Cmd==UNIFI_CFG_POWER
 *         In:PowerMode   if Cmd==UNIFI_CFG_POWERSAVE
 *         In:Length      if Cmd==UNIFI_CFG_FILTER
 *         In:WMM Qos Info if Cmd==UNIFI_CFG_WMM_QOS_INFO
 * Buffer: Out:Data       if Cmd==UNIFI_CFG_GET
 *         NULL           if Cmd==UNIFI_CFG_POWER
 *         NULL           if Cmd==UNIFI_CFG_POWERSAVE
 *         In:Filters     if Cmd==UNIFI_CFG_FILTER
 *
 * where Filters is a uf_cfg_bcast_packet_filter_t structure
 * followed by 0 - n tclas_t structures. The length of the tclas_t
 * structures is obtained by uf_cfg_bcast_packet_filter_t::tclas_ies_length.
 */


#define UNIFI_PUTEST            _IOWR('u',  6, unsigned char *)
/*
 * <------------------  Read/Write Buffer  -------------------->
 * _____________________________________________________________
 * |    Cmd    |    Arg    |   ...  Buffer (opt)  ...          |
 * -------------------------------------------------------------
 * <-- uint --><-- uint --><-----  unsigned char buffer  ------>
 *
 * Cmd:    A unifi_putest_command_t command.
 * Arg:    N/A                           if Cmd==UNIFI_PUTEST_START
 *         N/A                           if Cmd==UNIFI_PUTEST_STOP
 *         In:int (Clock Speed)          if Cmd==UNIFI_PUTEST_SET_SDIO_CLOCK
 *         In/Out:sizeof(unifi_putest_cmd52) if Cmd==UNIFI_PUTEST_CMD52_READ
 *         In:sizeof(unifi_putest_cmd52) if Cmd==UNIFI_PUTEST_CMD52_WRITE
 *         In:uint (f/w file name length) if Cmd==UNIFI_PUTEST_DL_FW
 * Buffer: NULL                          if Cmd==UNIFI_PUTEST_START
 *         NULL                          if Cmd==UNIFI_PUTEST_STOP
 *         NULL                          if Cmd==UNIFI_PUTEST_SET_SDIO_CLOCK
 *         In/Out:unifi_putest_cmd52     if Cmd==UNIFI_PUTEST_CMD52_READ
 *         In:unifi_putest_cmd52         if Cmd==UNIFI_PUTEST_CMD52_WRITE
 *         In:f/w file name              if Cmd==UNIFI_PUTEST_DL_FW
 */

#define UNIFI_BUILD_TYPE _IOWR('u', 7, unsigned char)
#define UNIFI_BUILD_NME 1
#define UNIFI_BUILD_WEXT 2
#define UNIFI_BUILD_AP 3

/* debugging */
#define UNIFI_KICK              _IO ('u',  0x10)
#define UNIFI_SET_DEBUG         _IO ('u',  0x11)
#define UNIFI_SET_TRACE         _IO ('u',  0x12)

#define UNIFI_GET_INIT_STATUS   _IOR ('u', 0x15, int)
#define UNIFI_SET_UDI_LOG_MASK  _IOR('u',  0x18, unifiio_filter_t)
#define UNIFI_SET_UDI_SNAP_MASK _IOW('u',  0x1a, unifiio_snap_filter_t)
#define UNIFI_SET_AMP_ENABLE    _IOWR('u',  0x1b, int)

#define UNIFI_INIT_HW           _IOR ('u', 0x13, unsigned char)
#define UNIFI_INIT_NETDEV       _IOW ('u', 0x14, unsigned char[6])
#define UNIFI_SME_PRESENT       _IOW ('u', 0x19, int)

#define UNIFI_CFG_PERIOD_TRAFFIC _IOW ('u', 0x21, unsigned char *)
#define UNIFI_CFG_UAPSD_TRAFFIC _IOW ('u', 0x22, unsigned char)

#define UNIFI_COREDUMP_GET_REG  _IOWR('u', 0x23, unifiio_coredump_req_t)


/*
 * Following reset, f/w may only be downloaded using CMD52.
 * This is slow, so there is a facility to download a secondary
 * loader first which supports CMD53.
 * If loader_len is > 0, then loader_data is assumed to point to
 * a suitable secondary loader that can be used to download the
 * main image.
 *
 * The driver will run the host protocol initialisation sequence
 * after downloading the image.
 *
 * If both lengths are zero, then the f/w is assumed to have been
 * booted from Flash and the host protocol initialisation sequence
 * is run.
 */
typedef struct {

    /* Number of bytes in the image */
    int img_len;

    /* Pointer to image data. */
    unsigned char *img_data;


    /* Number of bytes in the loader image */
    int loader_len;

    /* Pointer to loader image data. */
    unsigned char *loader_data;

} unifiio_img_t;


/* Structure of data read from the unifi device. */
typedef struct
{
    /* Length (in bytes) of entire structure including appended bulk data */
    int length;

    /* System time (in milliseconds) that signal was transferred */
    int timestamp;

    /* Direction in which signal was transferred. */
    int direction;
#define UDI_FROM_HOST   0
#define UDI_TO_HOST     1
#define UDI_CONFIG_IND  2

    /* The length of the signal (in bytes) not including bulk data */
    int signal_length;

    /* Signal body follows, then any bulk data */

} udi_msg_t;


typedef enum
{
    UfSigFil_AllOn = 0,         /* Log all signal IDs */
    UfSigFil_AllOff = 1,        /* Don't log any signal IDs */
    UfSigFil_SelectOn = 2,      /* Log these signal IDs */
    UfSigFil_SelectOff = 3      /* Don't log these signal IDs */
} uf_sigfilter_action_t;

typedef struct {

    /* Number of 16-bit ints in the sig_ids array */
    int num_sig_ids;
    /* The action to perform */
    uf_sigfilter_action_t action;
    /* List of signal IDs to pass or block */
    unsigned short *sig_ids;

} unifiio_filter_t;


typedef struct {
    /* Number of 16-bit ints in the protocols array */
    u16 count;
    /* List of protocol ids to pass */
    u16 *protocols;
} unifiio_snap_filter_t;



typedef u8 unifi_putest_command_t;

#define UNIFI_PUTEST_START 0
#define UNIFI_PUTEST_STOP 1
#define UNIFI_PUTEST_SET_SDIO_CLOCK 2
#define UNIFI_PUTEST_CMD52_READ 3
#define UNIFI_PUTEST_CMD52_WRITE 4
#define UNIFI_PUTEST_DL_FW 5
#define UNIFI_PUTEST_DL_FW_BUFF 6
#define UNIFI_PUTEST_CMD52_BLOCK_READ 7
#define UNIFI_PUTEST_COREDUMP_PREPARE 8
#define UNIFI_PUTEST_GP_READ16 9
#define UNIFI_PUTEST_GP_WRITE16 10


struct unifi_putest_cmd52 {
    int funcnum;
    unsigned long addr;
    unsigned char data;
};


struct unifi_putest_block_cmd52_r {
    int           funcnum;
    unsigned long addr;
    unsigned int  length;
    unsigned char *data;
};

struct unifi_putest_gp_rw16 {
    unsigned long addr;        /* generic address */
    unsigned short data;
};

typedef enum unifi_cfg_command {
    UNIFI_CFG_GET,
    UNIFI_CFG_POWER,
    UNIFI_CFG_POWERSAVE,
    UNIFI_CFG_FILTER,
    UNIFI_CFG_POWERSUPPLY,
    UNIFI_CFG_WMM_QOSINFO,
    UNIFI_CFG_WMM_ADDTS,
    UNIFI_CFG_WMM_DELTS,
    UNIFI_CFG_STRICT_DRAFT_N,
    UNIFI_CFG_ENABLE_OKC,
    UNIFI_CFG_SET_AP_CONFIG,
    UNIFI_CFG_CORE_DUMP /* request to take a fw core dump */
} unifi_cfg_command_t;

typedef enum unifi_cfg_power {
    UNIFI_CFG_POWER_UNSPECIFIED,
    UNIFI_CFG_POWER_OFF,
    UNIFI_CFG_POWER_ON
} unifi_cfg_power_t;

typedef enum unifi_cfg_powersupply {
    UNIFI_CFG_POWERSUPPLY_UNSPECIFIED,
    UNIFI_CFG_POWERSUPPLY_MAINS,
    UNIFI_CFG_POWERSUPPLY_BATTERIES
} unifi_cfg_powersupply_t;

typedef enum unifi_cfg_powersave {
    UNIFI_CFG_POWERSAVE_UNSPECIFIED,
    UNIFI_CFG_POWERSAVE_NONE,
    UNIFI_CFG_POWERSAVE_FAST,
    UNIFI_CFG_POWERSAVE_FULL,
    UNIFI_CFG_POWERSAVE_AUTO
} unifi_cfg_powersave_t;

typedef enum unifi_cfg_get {
    UNIFI_CFG_GET_COEX,
    UNIFI_CFG_GET_POWER_MODE,
    UNIFI_CFG_GET_VERSIONS,
    UNIFI_CFG_GET_POWER_SUPPLY,
    UNIFI_CFG_GET_INSTANCE,
    UNIFI_CFG_GET_AP_CONFIG
} unifi_cfg_get_t;

#define UNIFI_CFG_FILTER_NONE            0x0000
#define UNIFI_CFG_FILTER_DHCP            0x0001
#define UNIFI_CFG_FILTER_ARP             0x0002
#define UNIFI_CFG_FILTER_NBNS            0x0004
#define UNIFI_CFG_FILTER_NBDS            0x0008
#define UNIFI_CFG_FILTER_CUPS            0x0010
#define UNIFI_CFG_FILTER_ALL             0xFFFF


typedef struct uf_cfg_bcast_packet_filter
{
    unsigned long filter_mode;     //as defined by HIP protocol
    unsigned char arp_filter;
    unsigned char dhcp_filter;
    unsigned long tclas_ies_length; // length of tclas_ies in bytes
    unsigned char tclas_ies[1];    // variable length depending on above field
} uf_cfg_bcast_packet_filter_t;

typedef struct uf_cfg_ap_config
{
    u8    phySupportedBitmap;
    u8    channel;
    u16   beaconInterval;
    u8    dtimPeriod;
    u8     wmmEnabled;
    u8    shortSlotTimeEnabled;
    u16   groupkeyTimeout;
    u8     strictGtkRekeyEnabled;
    u16   gmkTimeout;
    u16   responseTimeout;
    u8    retransLimit;
    u8    rxStbc;
    u8     rifsModeAllowed;
    u8    dualCtsProtection;
    u8    ctsProtectionType;
    u16   maxListenInterval;
}uf_cfg_ap_config_t;

typedef struct tcpic_clsfr
{
    __u8 cls_fr_type;
    __u8 cls_fr_mask;
    __u8 version;
    __u8 source_ip_addr[4];
    __u8 dest_ip_addr[4];
    __u16 source_port;
    __u16 dest_port;
    __u8 dscp;
    __u8 protocol;
    __u8 reserved;
} __attribute__ ((packed)) tcpip_clsfr_t;

typedef struct tclas {
    __u8 element_id;
    __u8 length;
    __u8 user_priority;
    tcpip_clsfr_t tcp_ip_cls_fr;
} __attribute__ ((packed)) tclas_t;


#define CONFIG_IND_ERROR            0x01
#define CONFIG_IND_EXIT             0x02
#define CONFIG_SME_NOT_PRESENT      0x10
#define CONFIG_SME_PRESENT          0x20

/* WAPI Key */
typedef struct
{
    u8                          unicastKey;
    /* If non zero, then unicast key otherwise group key */
    u8                          keyIndex;
    u8                          keyRsc[16];
    u8                          authenticator;
    /* If non zero, then authenticator otherwise supplicant */
    u8                          address[6];
    u8                          key[32];
} unifiio_wapi_key_t;

/* Values describing XAP memory regions captured by the mini-coredump system */
typedef enum unifiio_coredump_space {
    UNIFIIO_COREDUMP_MAC_REG,
    UNIFIIO_COREDUMP_PHY_REG,
    UNIFIIO_COREDUMP_SH_DMEM,
    UNIFIIO_COREDUMP_MAC_DMEM,
    UNIFIIO_COREDUMP_PHY_DMEM,
    UNIFIIO_COREDUMP_TRIGGER_MAGIC = 0xFEED
} unifiio_coredump_space_t;

/* Userspace tool uses this structure to retrieve a register value from a
 * mini-coredump buffer previously saved by the HIP
 */
typedef struct unifiio_coredump_req {
    /* From user */
    int index;                      /* 0=newest, -1=oldest */
    unsigned int offset;            /* register offset in space */
    unifiio_coredump_space_t space; /* memory space */
    /* Filled by driver */
    unsigned int drv_build;         /* driver build id */
    unsigned int chip_ver;          /* chip version */
    unsigned int fw_ver;            /* firmware version */
    int requestor;                  /* requestor: 0=auto dump, 1=manual */
    unsigned int timestamp;         /* time of capture by driver */
    unsigned int serial;            /* capture serial number */
    int value;                      /* 16 bit register value, -ve for error */
} unifiio_coredump_req_t;           /* Core-dumped register value request */

#endif /* __UNIFIIO_H__ */