1 /* 2 * --------------------------------------------------------------------------- 3 * 4 * FILE: unifiio.h 5 * 6 * Public definitions for the UniFi linux driver. 7 * This is mostly ioctl command values and structs. 8 * 9 * Include <sys/ioctl.h> or similar before this file 10 * 11 * Copyright (C) 2005-2009 by Cambridge Silicon Radio Ltd. 12 * 13 * Refer to LICENSE.txt included with this source code for details on 14 * the license terms. 15 * 16 * --------------------------------------------------------------------------- 17 */ 18 #ifndef __UNIFIIO_H__ 19 #define __UNIFIIO_H__ 20 21 #include <linux/types.h> 22 23 #define UNIFI_GET_UDI_ENABLE _IOR('u', 1, int) 24 #define UNIFI_SET_UDI_ENABLE _IOW('u', 2, int) 25 /* Values for UDI_ENABLE */ 26 #define UDI_ENABLE_DATA 0x1 27 #define UDI_ENABLE_CONTROL 0x2 28 29 /* MIB set/get. Arg is a pointer to a varbind */ 30 #define UNIFI_GET_MIB _IOWR('u', 3, unsigned char *) 31 #define UNIFI_SET_MIB _IOW ('u', 4, unsigned char *) 32 #define MAX_VARBIND_LENGTH 127 33 34 /* Private IOCTLs */ 35 #define SIOCIWS80211POWERSAVEPRIV SIOCIWFIRSTPRIV 36 #define SIOCIWG80211POWERSAVEPRIV SIOCIWFIRSTPRIV + 1 37 #define SIOCIWS80211RELOADDEFAULTSPRIV SIOCIWFIRSTPRIV + 2 38 #define SIOCIWSCONFWAPIPRIV SIOCIWFIRSTPRIV + 4 39 #define SIOCIWSWAPIKEYPRIV SIOCIWFIRSTPRIV + 6 40 #define SIOCIWSSMEDEBUGPRIV SIOCIWFIRSTPRIV + 8 41 #define SIOCIWSAPCFGPRIV SIOCIWFIRSTPRIV + 10 42 #define SIOCIWSAPSTARTPRIV SIOCIWFIRSTPRIV + 12 43 #define SIOCIWSAPSTOPPRIV SIOCIWFIRSTPRIV + 14 44 #define SIOCIWSFWRELOADPRIV SIOCIWFIRSTPRIV + 16 45 #define SIOCIWSSTACKSTART SIOCIWFIRSTPRIV + 18 46 #define SIOCIWSSTACKSTOP SIOCIWFIRSTPRIV + 20 47 48 49 50 #define IWPRIV_POWER_SAVE_MAX_STRING 32 51 #define IWPRIV_SME_DEBUG_MAX_STRING 32 52 #define IWPRIV_SME_MAX_STRING 120 53 54 55 /* Private configuration commands */ 56 #define UNIFI_CFG _IOWR('u', 5, unsigned char *) 57 /* 58 * <------------------ Read/Write Buffer --------------------> 59 * _____________________________________________________________ 60 * | Cmd | Arg | ... Buffer (opt) ... | 61 * ------------------------------------------------------------- 62 * <-- uint --><-- uint --><----- unsigned char buffer ------> 63 * 64 * Cmd: A unifi_cfg_command_t command. 65 * Arg: Out:Length if Cmd==UNIFI_CFG_GET 66 * In:PowerOnOff if Cmd==UNIFI_CFG_POWER 67 * In:PowerMode if Cmd==UNIFI_CFG_POWERSAVE 68 * In:Length if Cmd==UNIFI_CFG_FILTER 69 * In:WMM Qos Info if Cmd==UNIFI_CFG_WMM_QOS_INFO 70 * Buffer: Out:Data if Cmd==UNIFI_CFG_GET 71 * NULL if Cmd==UNIFI_CFG_POWER 72 * NULL if Cmd==UNIFI_CFG_POWERSAVE 73 * In:Filters if Cmd==UNIFI_CFG_FILTER 74 * 75 * where Filters is a uf_cfg_bcast_packet_filter_t structure 76 * followed by 0 - n tclas_t structures. The length of the tclas_t 77 * structures is obtained by uf_cfg_bcast_packet_filter_t::tclas_ies_length. 78 */ 79 80 81 #define UNIFI_PUTEST _IOWR('u', 6, unsigned char *) 82 /* 83 * <------------------ Read/Write Buffer --------------------> 84 * _____________________________________________________________ 85 * | Cmd | Arg | ... Buffer (opt) ... | 86 * ------------------------------------------------------------- 87 * <-- uint --><-- uint --><----- unsigned char buffer ------> 88 * 89 * Cmd: A unifi_putest_command_t command. 90 * Arg: N/A if Cmd==UNIFI_PUTEST_START 91 * N/A if Cmd==UNIFI_PUTEST_STOP 92 * In:int (Clock Speed) if Cmd==UNIFI_PUTEST_SET_SDIO_CLOCK 93 * In/Out:sizeof(unifi_putest_cmd52) if Cmd==UNIFI_PUTEST_CMD52_READ 94 * In:sizeof(unifi_putest_cmd52) if Cmd==UNIFI_PUTEST_CMD52_WRITE 95 * In:uint (f/w file name length) if Cmd==UNIFI_PUTEST_DL_FW 96 * Buffer: NULL if Cmd==UNIFI_PUTEST_START 97 * NULL if Cmd==UNIFI_PUTEST_STOP 98 * NULL if Cmd==UNIFI_PUTEST_SET_SDIO_CLOCK 99 * In/Out:unifi_putest_cmd52 if Cmd==UNIFI_PUTEST_CMD52_READ 100 * In:unifi_putest_cmd52 if Cmd==UNIFI_PUTEST_CMD52_WRITE 101 * In:f/w file name if Cmd==UNIFI_PUTEST_DL_FW 102 */ 103 104 #define UNIFI_BUILD_TYPE _IOWR('u', 7, unsigned char) 105 #define UNIFI_BUILD_NME 1 106 #define UNIFI_BUILD_WEXT 2 107 #define UNIFI_BUILD_AP 3 108 109 /* debugging */ 110 #define UNIFI_KICK _IO ('u', 0x10) 111 #define UNIFI_SET_DEBUG _IO ('u', 0x11) 112 #define UNIFI_SET_TRACE _IO ('u', 0x12) 113 114 #define UNIFI_GET_INIT_STATUS _IOR ('u', 0x15, int) 115 #define UNIFI_SET_UDI_LOG_MASK _IOR('u', 0x18, unifiio_filter_t) 116 #define UNIFI_SET_UDI_SNAP_MASK _IOW('u', 0x1a, unifiio_snap_filter_t) 117 #define UNIFI_SET_AMP_ENABLE _IOWR('u', 0x1b, int) 118 119 #define UNIFI_INIT_HW _IOR ('u', 0x13, unsigned char) 120 #define UNIFI_INIT_NETDEV _IOW ('u', 0x14, unsigned char[6]) 121 #define UNIFI_SME_PRESENT _IOW ('u', 0x19, int) 122 123 #define UNIFI_CFG_PERIOD_TRAFFIC _IOW ('u', 0x21, unsigned char *) 124 #define UNIFI_CFG_UAPSD_TRAFFIC _IOW ('u', 0x22, unsigned char) 125 126 #define UNIFI_COREDUMP_GET_REG _IOWR('u', 0x23, unifiio_coredump_req_t) 127 128 129 /* 130 * Following reset, f/w may only be downloaded using CMD52. 131 * This is slow, so there is a facility to download a secondary 132 * loader first which supports CMD53. 133 * If loader_len is > 0, then loader_data is assumed to point to 134 * a suitable secondary loader that can be used to download the 135 * main image. 136 * 137 * The driver will run the host protocol initialisation sequence 138 * after downloading the image. 139 * 140 * If both lengths are zero, then the f/w is assumed to have been 141 * booted from Flash and the host protocol initialisation sequence 142 * is run. 143 */ 144 typedef struct { 145 146 /* Number of bytes in the image */ 147 int img_len; 148 149 /* Pointer to image data. */ 150 unsigned char *img_data; 151 152 153 /* Number of bytes in the loader image */ 154 int loader_len; 155 156 /* Pointer to loader image data. */ 157 unsigned char *loader_data; 158 159 } unifiio_img_t; 160 161 162 /* Structure of data read from the unifi device. */ 163 typedef struct 164 { 165 /* Length (in bytes) of entire structure including appended bulk data */ 166 int length; 167 168 /* System time (in milliseconds) that signal was transferred */ 169 int timestamp; 170 171 /* Direction in which signal was transferred. */ 172 int direction; 173 #define UDI_FROM_HOST 0 174 #define UDI_TO_HOST 1 175 #define UDI_CONFIG_IND 2 176 177 /* The length of the signal (in bytes) not including bulk data */ 178 int signal_length; 179 180 /* Signal body follows, then any bulk data */ 181 182 } udi_msg_t; 183 184 185 typedef enum 186 { 187 UfSigFil_AllOn = 0, /* Log all signal IDs */ 188 UfSigFil_AllOff = 1, /* Don't log any signal IDs */ 189 UfSigFil_SelectOn = 2, /* Log these signal IDs */ 190 UfSigFil_SelectOff = 3 /* Don't log these signal IDs */ 191 } uf_sigfilter_action_t; 192 193 typedef struct { 194 195 /* Number of 16-bit ints in the sig_ids array */ 196 int num_sig_ids; 197 /* The action to perform */ 198 uf_sigfilter_action_t action; 199 /* List of signal IDs to pass or block */ 200 unsigned short *sig_ids; 201 202 } unifiio_filter_t; 203 204 205 typedef struct { 206 /* Number of 16-bit ints in the protocols array */ 207 u16 count; 208 /* List of protocol ids to pass */ 209 u16 *protocols; 210 } unifiio_snap_filter_t; 211 212 213 214 typedef u8 unifi_putest_command_t; 215 216 #define UNIFI_PUTEST_START 0 217 #define UNIFI_PUTEST_STOP 1 218 #define UNIFI_PUTEST_SET_SDIO_CLOCK 2 219 #define UNIFI_PUTEST_CMD52_READ 3 220 #define UNIFI_PUTEST_CMD52_WRITE 4 221 #define UNIFI_PUTEST_DL_FW 5 222 #define UNIFI_PUTEST_DL_FW_BUFF 6 223 #define UNIFI_PUTEST_CMD52_BLOCK_READ 7 224 #define UNIFI_PUTEST_COREDUMP_PREPARE 8 225 #define UNIFI_PUTEST_GP_READ16 9 226 #define UNIFI_PUTEST_GP_WRITE16 10 227 228 229 struct unifi_putest_cmd52 { 230 int funcnum; 231 unsigned long addr; 232 unsigned char data; 233 }; 234 235 236 struct unifi_putest_block_cmd52_r { 237 int funcnum; 238 unsigned long addr; 239 unsigned int length; 240 unsigned char *data; 241 }; 242 243 struct unifi_putest_gp_rw16 { 244 unsigned long addr; /* generic address */ 245 unsigned short data; 246 }; 247 248 typedef enum unifi_cfg_command { 249 UNIFI_CFG_GET, 250 UNIFI_CFG_POWER, 251 UNIFI_CFG_POWERSAVE, 252 UNIFI_CFG_FILTER, 253 UNIFI_CFG_POWERSUPPLY, 254 UNIFI_CFG_WMM_QOSINFO, 255 UNIFI_CFG_WMM_ADDTS, 256 UNIFI_CFG_WMM_DELTS, 257 UNIFI_CFG_STRICT_DRAFT_N, 258 UNIFI_CFG_ENABLE_OKC, 259 UNIFI_CFG_SET_AP_CONFIG, 260 UNIFI_CFG_CORE_DUMP /* request to take a fw core dump */ 261 } unifi_cfg_command_t; 262 263 typedef enum unifi_cfg_power { 264 UNIFI_CFG_POWER_UNSPECIFIED, 265 UNIFI_CFG_POWER_OFF, 266 UNIFI_CFG_POWER_ON 267 } unifi_cfg_power_t; 268 269 typedef enum unifi_cfg_powersupply { 270 UNIFI_CFG_POWERSUPPLY_UNSPECIFIED, 271 UNIFI_CFG_POWERSUPPLY_MAINS, 272 UNIFI_CFG_POWERSUPPLY_BATTERIES 273 } unifi_cfg_powersupply_t; 274 275 typedef enum unifi_cfg_powersave { 276 UNIFI_CFG_POWERSAVE_UNSPECIFIED, 277 UNIFI_CFG_POWERSAVE_NONE, 278 UNIFI_CFG_POWERSAVE_FAST, 279 UNIFI_CFG_POWERSAVE_FULL, 280 UNIFI_CFG_POWERSAVE_AUTO 281 } unifi_cfg_powersave_t; 282 283 typedef enum unifi_cfg_get { 284 UNIFI_CFG_GET_COEX, 285 UNIFI_CFG_GET_POWER_MODE, 286 UNIFI_CFG_GET_VERSIONS, 287 UNIFI_CFG_GET_POWER_SUPPLY, 288 UNIFI_CFG_GET_INSTANCE, 289 UNIFI_CFG_GET_AP_CONFIG 290 } unifi_cfg_get_t; 291 292 #define UNIFI_CFG_FILTER_NONE 0x0000 293 #define UNIFI_CFG_FILTER_DHCP 0x0001 294 #define UNIFI_CFG_FILTER_ARP 0x0002 295 #define UNIFI_CFG_FILTER_NBNS 0x0004 296 #define UNIFI_CFG_FILTER_NBDS 0x0008 297 #define UNIFI_CFG_FILTER_CUPS 0x0010 298 #define UNIFI_CFG_FILTER_ALL 0xFFFF 299 300 301 typedef struct uf_cfg_bcast_packet_filter 302 { 303 unsigned long filter_mode; //as defined by HIP protocol 304 unsigned char arp_filter; 305 unsigned char dhcp_filter; 306 unsigned long tclas_ies_length; // length of tclas_ies in bytes 307 unsigned char tclas_ies[1]; // variable length depending on above field 308 } uf_cfg_bcast_packet_filter_t; 309 310 typedef struct uf_cfg_ap_config 311 { 312 u8 phySupportedBitmap; 313 u8 channel; 314 u16 beaconInterval; 315 u8 dtimPeriod; 316 u8 wmmEnabled; 317 u8 shortSlotTimeEnabled; 318 u16 groupkeyTimeout; 319 u8 strictGtkRekeyEnabled; 320 u16 gmkTimeout; 321 u16 responseTimeout; 322 u8 retransLimit; 323 u8 rxStbc; 324 u8 rifsModeAllowed; 325 u8 dualCtsProtection; 326 u8 ctsProtectionType; 327 u16 maxListenInterval; 328 }uf_cfg_ap_config_t; 329 330 typedef struct tcpic_clsfr 331 { 332 __u8 cls_fr_type; 333 __u8 cls_fr_mask; 334 __u8 version; 335 __u8 source_ip_addr[4]; 336 __u8 dest_ip_addr[4]; 337 __u16 source_port; 338 __u16 dest_port; 339 __u8 dscp; 340 __u8 protocol; 341 __u8 reserved; 342 } __attribute__ ((packed)) tcpip_clsfr_t; 343 344 typedef struct tclas { 345 __u8 element_id; 346 __u8 length; 347 __u8 user_priority; 348 tcpip_clsfr_t tcp_ip_cls_fr; 349 } __attribute__ ((packed)) tclas_t; 350 351 352 #define CONFIG_IND_ERROR 0x01 353 #define CONFIG_IND_EXIT 0x02 354 #define CONFIG_SME_NOT_PRESENT 0x10 355 #define CONFIG_SME_PRESENT 0x20 356 357 /* WAPI Key */ 358 typedef struct 359 { 360 u8 unicastKey; 361 /* If non zero, then unicast key otherwise group key */ 362 u8 keyIndex; 363 u8 keyRsc[16]; 364 u8 authenticator; 365 /* If non zero, then authenticator otherwise supplicant */ 366 u8 address[6]; 367 u8 key[32]; 368 } unifiio_wapi_key_t; 369 370 /* Values describing XAP memory regions captured by the mini-coredump system */ 371 typedef enum unifiio_coredump_space { 372 UNIFIIO_COREDUMP_MAC_REG, 373 UNIFIIO_COREDUMP_PHY_REG, 374 UNIFIIO_COREDUMP_SH_DMEM, 375 UNIFIIO_COREDUMP_MAC_DMEM, 376 UNIFIIO_COREDUMP_PHY_DMEM, 377 UNIFIIO_COREDUMP_TRIGGER_MAGIC = 0xFEED 378 } unifiio_coredump_space_t; 379 380 /* Userspace tool uses this structure to retrieve a register value from a 381 * mini-coredump buffer previously saved by the HIP 382 */ 383 typedef struct unifiio_coredump_req { 384 /* From user */ 385 int index; /* 0=newest, -1=oldest */ 386 unsigned int offset; /* register offset in space */ 387 unifiio_coredump_space_t space; /* memory space */ 388 /* Filled by driver */ 389 unsigned int drv_build; /* driver build id */ 390 unsigned int chip_ver; /* chip version */ 391 unsigned int fw_ver; /* firmware version */ 392 int requestor; /* requestor: 0=auto dump, 1=manual */ 393 unsigned int timestamp; /* time of capture by driver */ 394 unsigned int serial; /* capture serial number */ 395 int value; /* 16 bit register value, -ve for error */ 396 } unifiio_coredump_req_t; /* Core-dumped register value request */ 397 398 #endif /* __UNIFIIO_H__ */ 399