399 lines
13 KiB
C
399 lines
13 KiB
C
/*
|
|
* ---------------------------------------------------------------------------
|
|
*
|
|
* 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__ */
|