/* * --------------------------------------------------------------------------- * * 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__ */