blob: 74f17ec885dbf7c32d9a695237c06b65afacba38 [file] [log] [blame]
// Copyright (c) 2012 GCT Semiconductor, Inc. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef HCI_H_20080718
#define HCI_H_20080718
#include "global.h"
#include "wimax.h"
#include "msg.h"
#include "msg_thread.h"
#define HCI_HEADER_SIZE 4
#define HCI_VALUE_OFFS (HCI_HEADER_SIZE)
#define HCI_MAX_PACKET 2048
#define HCI_MAX_PARAM (HCI_MAX_PACKET-HCI_HEADER_SIZE)
#define HCI_MAX_TLV 32
#define W_ERR_NOTI_CATE_EAP 0
#define W_ERR_NOTI_TYPE_CODE 0
#define W_ERR_NOTI_TYPE_TEXT 1
/* CMD-EVT */
/* Category 0 */
#define WIMAX_RESET 0x0000
#define WIMAX_SET_INFO 0x0001
#define WIMAX_GET_INFO 0x0002
#define WIMAX_GET_INFO_RESULT 0x8003
#define WIMAX_RADIO_OFF 0x0004
#define WIMAX_RADIO_ON 0x0006
#define WIMAX_WIMAX_RESET 0x0007 /* Is this still here */
/* Category 1 */
#define WIMAX_NET_ENTRY 0x0100
#define WIMAX_NET_DISCONN 0x0102
#define WIMAX_ENTER_SLEEP 0x0103
#define WIMAX_EXIT_SLEEP 0x0104
#define WIMAX_ENTER_IDLE 0x0105
#define WIMAX_EXIT_IDLE 0x0106
#define WIMAX_MODE_CHANGE 0x8108
#define MODE_W_NULL 0x00
#define MODE_W_STANDBY 0x01
#define MODE_W_OUT_OF_ZONE 0x02
#define MODE_W_AWAKE 0x03
#define MODE_W_IDLE 0x04
#define MODE_W_SLEEP 0x05
#define MODE_W_WAIT 0x06
#define WIMAX_HANDOVER 0x8109 /* obsolete */
#define WIMAX_SCAN 0x010d
#define WIMAX_SCAN_COMPLETE 0x810e
#define WIMAX_SCAN_RESULT 0x810f
#define WIMAX_CONNECT 0x0110
#define WIMAX_CONNECT_START 0x8111
#define WIMAX_CONNECT_COMPLETE 0x8112
#define WIMAX_ASSOC_START 0x8113
#define WIMAX_ASSOC_COMPLETE 0x8114
#define WIMAX_DISCONN_IND 0x8115
#define WIMAX_ENTRY_IND 0x8116
#define WIMAX_HO_START 0x8117
#define WIMAX_HO_COMPLETE 0x8118
#define WIMAX_RADIO_STATE_IND 0x8119
#define WIMAX_IP_RENEW_IND 0x811a
#define WIMAX_DISCOVER_NSP 0x011d
#define WIMAX_DISCOVER_NSP_RESULT 0x811e
#define WIMAX_SCAN_CANCEL 0x0122
#define WIMAX_AIRPLANE_MODE_IND 0x8123
#define WIMAX_GET_AIRPLANE_MODE 0x0124
#define WIMAX_FULL_REENTRY 0x8126
/* Category 2 */
#define WIMAX_TX_EAP 0x0200
#define WIMAX_RX_EAP 0x8201
#define WIMAX_TX_SDU 0x0202
#define WIMAX_RX_SDU 0x8203
/* Category 3 */
#define WIMAX_DM_CMD 0x030a
#define WIMAX_DM_RSP 0x830b
#define WIMAX_CLI_CMD 0x030c
#define WIMAX_CLI_RSP 0x830d
#define WIMAX_DL_IMAGE 0x0310
#define WIMAX_DL_IMAGE_STATUS 0x8311
#define WIMAX_UL_IMAGE 0x0312
#define WIMAX_UL_IMAGE_RESULT 0x8313
#define WIMAX_UL_IMAGE_STATUS 0x0314
#define WIMAX_NIC_CMD 0x0315
#define WIMAX_IMAGE_CMD 0x0316
#define WIMAX_IMAGE_CMD_STATUS 0x8317
#define WIMAX_UICC_STATUS_IND 0x8318
#define WIMAX_UICC_EAP_IND 0x8319
#define WIMAX_UICC_CMD 0x031A
#define UICC_CMD_PIN_ENABLE 0x00
#define UICC_CMD_PIN_DISABLE 0x01
#define UICC_CMD_PIN_CHANGE 0x02
#define UICC_CMD_PIN_VERIFY 0x03
#define UICC_CMD_PUK_INPUT 0x04
#define UICC_CMD_UICC_STATUS 0x05
#define UICC_CMD_SUBSCRIBERID 0x06
#define UICC_CMD_ICCID 0x07
#define UICC_CMD_POWER_DOWN 0x08
#define UICC_CMD_POWER_UP 0x09
#define WIMAX_UICC_CMD_RESULT 0x831B
#define UICC_CMD_RESULT_SUCCESS 0x00
#define UICC_CMD_RESULT_FAIL 0x01
#define WIMAX_NOTIFICATION 0x831F
#define WIMAX_ARM_CAPABILITY 0x0320
#define WIMAX_ARM_CAPABILITY_RESULT 0x8321
#define W_CAPABILITY_ENC_XML (1<<0)
#define W_CAPABILITY_E_EAP_TLS (1<<1)
#define W_CAPABILITY_ODM (1<<2)
#define W_CAPABILITY_E_EAP_AKA (1<<3)
#define W_CAPABILITY_CAPL_INFO (1<<4)
#define WIMAX_DSX_REQUEST 0x0322
#define WIMAX_DSX_COMPLETE 0x8323
#define WIMAX_MODEM_REQUEST 0x0324
#define MODE_MODEM_REPORT 0
#define MODE_MODEM_REQUEST 1
#define W_PDU_STATISTIC 0x50
#define W_PHY_MAC_BASIC 0x51
#define W_POWER_CONTROL 0x52
#define W_PHY_BURST 0x53
#define W_PHY_MSC 0x54
#define W_PHY_ZONE 0x55
#define W_PHY_CINR_RSSI 0x56
#define W_TEMP_ADC 0x57
#define W_PHY_CTRL_CHANNEL 0x58
#define W_DL_SF_STATISTICS 0x59
#define W_UL_SF_STATISTICS 0x5a
#define W_HANDOVER 0x5b
#define W_NEIGHBOR_LIST 0x5c
#define W_HARQ_STATISTICS 0x5d
#define W_NETENTRY_STATISTICS 0x5e
#define WIMAX_MODEM_REPORT 0x8325
#define WIMAX_START_TRANSPORT_TEST 0x8330
#define WIMAX_DL_TRANSPORT_TEST 0x8331
#define WIMAX_UL_TRANSPORT_TEST 0x0332
#define WIMAX_NOTIFICATION 0x831F
#define WIMAX_MANAGER_MSG 0x8333
#define WIMAX_SF_IND 0x8334
#define WIMAX_SF_ENABLE 1
#define WIMAX_SF_DISABLE 0
#define WIMAX_SET_EAP_INFO 0x0340
#define W_NO_EAP 0
#define W_EAP_TLS 1
#define W_EAP_TTLS_MD5 2
#define W_EAP_TTLS_MSCHAPV2 3
#define W_EAP_TTLS_CHAP 4
#define W_EAP_AKA 5
#define IS_EAP_TLS(type) ((type)>=W_EAP_TLS && (type)<=W_EAP_TTLS_CHAP)
#define T_USER_ID (1 | ( 1 << 16 ))
#define T_USER_PASSWD (2 | ( 1 << 16 ))
#define T_ANONYMOUS_ID (3 | ( 1 << 16 ))
#define T_PRIV_KEY_PASSWD (4 | ( 1 << 16 ))
#define T_EAP_FORCE(x) ((x)+100)
#define T_CR801_MODE (5 | ( 1 << 16 ))
#define T_DEV_CERT_NULL (6 | ( 1 << 16 ))
#define T_CA_CERT_NULL (7 | ( 1 << 16 ))
#define T_EAP_PARAM (8 | ( 1 << 16 ))
#define V_PARAM_NV 0
#define V_PARAM_XML 1
#define V_PARAM_USER 2
#define T_EAP_DEBUG_ON (9 | ( 1 << 16 ))
#define T_EAP_RESUMPTION_OFF (10 | ( 1 << 16 ))
#define T_EAP_CW_DEV_CATEGORY (11 | ( 1 << 16 ))
#define T_EAP_DECORATION (12 | ( 0 << 16 ))
#define T_EAP_RAND_SEED (13 | ( 4 << 16 ))
#define T_EAP_SESSIONTICKET_OFF (14 | ( 1 << 16 ))
#define WIMAX_SET_EAP_INFO_RESULT 0x8341
#define WIMAX_GET_CERT_INFO 0x0342
#define WIMAX_GET_CERT_INFO_RESULT 0x8343
#define LEVEL_CA_CERT (1<<0)
#define LEVEL_CLIENT_CERT (1<<1)
#define LEVEL_SERVER_CERT (1<<2)
#define T_SUBJECT_CN 1
#define T_ISSUER_CN 2
#define T_EXPIRE_DATE 3
#define WIMAX_DELETE_CERT 0x0344
#define WIMAX_DELETE_CERT_RESULT 0x8345
#define WIMAX_READ_FILE 0x0350
#define WIMAX_WRITE_FILE 0x0351
#define WIMAX_DELETE_FILE 0x0352
#define WIMAX_FILE_RESULT 0x8354
/* Download image type */
#define DLIMG_KERNEL 0
#define DLIMG_FS 1
#define DLIMG_CFG 2
#define DLIMG_CFG_RAM 3
#define DLIMG_FS2 4
#define DLIMG_CLR_CFG 5
#define DLIMG_EAP_PARM 6
#define DLIMG_BL_EEPROM 7
#define DLIMG_BL_FLASH 8
#define DLIMG_OMA_XML 0x100
#define DLIMG_DEV_CERT 0x101
#define DLIMG_CERT1_U 0x102
#define DLIMG_CERT1_L 0x103
#define DLIMG_CERT2_U 0x104
#define DLIMG_EAP_PARAM 0x105
#define DLIMG_CERT_BIG 0x106
#define DLIMG_TLS_PCAP 0x200
#define DLIMG_TLS_DEC 0x201
#define DLIMG_TLS_DEV_CERT 0x202
#define DLIMG_TLS_CA_CERT 0x203
/* Category 0xF */
#define WIMAX_FSM_UPDATE 0x8F01
#define WIMAX_IF_UPDOWN 0x8F02
#define WIMAX_IF_UP 1
#define WIMAX_IF_DOWN 2
/* WIMAX mode */
#define W_NULL 0
#define W_STANDBY 1
#define W_OOZ 2
#define W_AWAKE 3
#define W_IDLE 4
#define W_SLEEP 5
#define W_WAIT 6
#define W_NET_ENTRY_RNG 0x80
#define W_NET_ENTRY_SBC 0x81
#define W_NET_ENTRY_PKM 0x82
#define W_NET_ENTRY_REG 0x83
#define W_NET_ENTRY_DSX 0x84
#define W_NET_ENTRY_RNG_FAIL 0x1100100
#define W_NET_ENTRY_SBC_FAIL 0x1100200
#define W_NET_ENTRY_PKM_FAIL 0x1102000
#define W_NET_ENTRY_REG_FAIL 0x1103000
#define W_NET_ENTRY_DSX_FAIL 0x1104000
/* Scan Type */
#define W_SCAN_ALL_CHANNEL 0
#define W_SCAN_ALL_SUBSCRIPTION 1
#define W_SCAN_SPECIFIED_SUBSCRIPTION 2
/*
* TLV
*
* [31:31] indicates the type is composite.
* [30:16] is the length of the type. 0 length means length is variable.
* [15:0] is the actual type.
*
*/
#define TLV_L(x) (((x) >> 16) & 0xff)
#define TLV_T(x) ((x) & 0xff)
#define TLV_COMPOSITE(x) ((x) >> 31)
/* GENERAL */
#define T_MAC_ADDRESS (0x00 | ( 6 << 16 ))
#define T_BSID (0x01 | ( 6 << 16 ))
#define T_MSK (0x02 | ( 64 << 16 ))
#define T_RSSI_THRSHLD (0x03 | ( 1 << 16 ))
#define T_FREQUENCY (0x04 | ( 4 << 16 ))
#define T_CONN_CS_TYPE (0x05 | ( 1 << 16 ))
#define T_HOST_IP_VER (0x06 | ( 1 << 16 ))
#define T_STBY_SCAN_INTERVAL (0x07 | ( 4 << 16 ))
#define T_OOZ_SCAN_INTERVAL (0x08 | ( 4 << 16 ))
#define T_IMEI (0x09 | ( 8 << 16 ))
#define T_PID (0x0a | ( 12 << 16 ))
#define T_BOOTLOAD_VER (0x19 | ( 4 << 16 ))
#define T_CAPABILITY (0x1a | ( 4 << 16 ))
#define T_RELEASE_NUMBER (0x1b | ( 4 << 16 ))
#define T_DRIVER_REVISION (0x1c | ( 4 << 16 ))
#define T_FW_REVISION (0x1d | ( 4 << 16 ))
#define T_MAC_HW_REVISION (0x1e | ( 4 << 16 ))
#define T_PHY_HW_REVISION (0x1f | ( 4 << 16 ))
/* HANDOVER */
#define T_SCAN_INTERVAL (0x20 | ( 1 << 16 ))
#define T_RSC_RETAIN_TIME (0x2f | ( 2 << 16 ))
/* SLEEP */
#define T_TYPE1_ISW (0x40 | ( 1 << 16 ))
#define T_SLP_START_TO (0x4a | ( 2 << 16 ))
/* IDLE */
#define T_IDLE_MODE_TO (0x50 | ( 2 << 16 ))
#define T_IDLE_START_TO (0x54 | ( 2 << 16 ))
/* MONITOR */
#define T_RSSI (0x60 | ( 1 << 16 ))
#define T_CINR (0x61 | ( 1 << 16 ))
#define T_TX_POWER (0x6a | ( 1 << 16 ))
#define T_PER (0x6b | ( 1 << 16 ))
#define T_UL_PERM_BASE (0x6c | ( 1 << 16 ))
#define T_DL_PERM_BASE (0x6d | ( 1 << 16 ))
#define T_CURR_PREAMBLE_IDX (0x6e | ( 1 << 16 ))
#define T_PREV_PREAMBLE_IDX (0x6f | ( 1 << 16 ))
#define T_HO_SIGNAL_LATENCY (0x70 | ( 2 << 16 ))
#define T_RSSI_2 (0x71 | ( 1 << 16 ))
#define T_CINR_2 (0x72 | ( 1 << 16 ))
#define T_POWER_CONTROL_MODE (0x73 | ( 1 << 16 ))
#define T_PER_RECEIVE_COUNT (0x74 | ( 4 << 16 ))
#define T_PER_ERROR_COUNT (0x75 | ( 4 << 16 ))
#define T_UL_BURST_DATA_FEC_SCHEME (0x76 | ( 1 << 16 ))
#define T_DL_BURST_DATA_FEC_SCHEME (0x77 | ( 1 << 16 ))
#define T_UL_BURST_DATA_UIUC (0x78 | ( 1 << 16 ))
#define T_DL_BURST_DATA_UIUC (0x79 | ( 1 << 16 ))
#define T_TX_POWER_MAX (0x7a | ( 1 << 16 ))
#define T_HO_CNT (0x7c | ( 2 << 16 ))
#define T_HO_FAIL_CNT (0x7d | ( 2 << 16 ))
#define T_RESYNC_CNT (0x7e | ( 2 << 16 ))
#define T_CUR_FREQ (0x7f | ( 4 << 16 ))
/* WIMAX */
#define T_MAX_SUBSCRIPTION (0xa1 | ( 1 << 16 ))
#define T_MAX_SF (0xa2 | ( 1 << 16 ))
#define T_PHY_TYPE (0xa3 | ( 1 << 16 ))
#define T_PKM (0xa4 | ( 1 << 16 ))
#define T_AUTH_POLICY (0xa5 | ( 1 << 16 ))
#define T_CS_TYPE (0xa6 | ( 2 << 16 ))
#define T_VENDOR_NAME (0xa7 | ( 0 << 16 ))
#define T_MOD_NAME (0xa8 | ( 0 << 16 ))
#define T_PACKET_FILTER (0xa9 | ( 1 << 16 ))
#define T_NSP_CHANGE_COUNT (0xaa | ( 4 << 16 ))
#define T_RADIO_STATE (0xab | ( 1 << 16 ))
#define T_URI_CONTACT_TYPE (0xac | ( 1 << 16 ))
#define T_URI_TEXT (0xad | ( 0 << 16 ))
#define T_URI (0xae | ( 0 << 16 ))
#define T_ENABLE_AUTH (0xaf | ( 1 << 16 ))
#define T_TIMEOUT (0xb0 | ( 2 << 16 ))
#define T_RUN_MODE (0xb1 | ( 1 << 16 ))
#define T_NORMAL_MODE 0
#define T_ENGINEERING_MODE 1
#define T_OMADMT_VER (0xb2 | ( 4 << 16 ))
#define T_RTC_TIME (0xb3 | ( 4 << 16 )) /*This is measured in seconds from 00:00:00 GMT January 1, 1970.*/
#define T_CERT_STATUS (0xb4 | ( 4 << 16 ))
#define T_CERT_MASK (0xb5 | ( 4 << 16 ))
#define T_EMSK (0xb6 | ( 64 << 16 ))
/* Subscription TLV */
#define T_SUBSCRIPTION_LIST (0xd1 | ( 0 << 16 ) | (1 << 31))
#define T_H_NSPID (0xd2 | ( 3 << 16 ))
#define T_NSP_NAME (0xd3 | ( 0 << 16 ))
#define T_SUBSCRIPTION_NAME (0xd4 | ( 0 << 16 ))
#define T_SUBSCRIPTION_FLAG (0xd5 | ( 2 << 16 ))
#define T_V_NSPID (0xd6 | ( 3 << 16 ))
#define T_NAP_ID (0xd7 | ( 3 << 16 ))
#define T_PREAMBLES (0xd8 | ( 15 << 16 ))
#define T_BW (0xd9 | ( 4 << 16 ))
#define T_FFTSIZE (0xda | ( 4 << 16 ))
#define T_DUPLEX_MODE (0xdb | ( 4 << 16 ))
#define T_REALM (0xdc | ( 0 << 16 ))
#define T_MO_REALM (0xdd | ( 0 << 16 ))
typedef struct hci {
u16 cmd_evt;
u16 length;
u8 data[0];
} __attribute__((packed)) hci_t;
typedef struct hci_image_payload {
u16 type;
u32 offset;
u8 data[0];
} __attribute__((packed)) hci_image_payload_t;
typedef struct hci_image_response {
u16 type;
u32 offset;
s32 result;
} __attribute__((packed)) hci_image_response_t;
typedef struct hci_file_write {
u32 offset;
u16 path_len; /*Include null char*/
u8 path[0];
u8 data[0];
} __attribute__((packed)) hci_file_write_t;
#define hci_file_data(p) (p->path+p->path_len)
typedef struct hci_file_delete {
u8 path[0];
u8 data[0];
} __attribute__((packed)) hci_file_delete_t;
typedef struct hci_file_read {
u32 offset;
u8 path[0];
u8 data[0];
} __attribute__((packed)) hci_file_read_t;
typedef struct hci_file_response {
s32 result;
u16 path_len;
u8 path[0];
u8 data[0];
} __attribute__((packed)) hci_file_response_t;
#define file_response_data(r) \
(((hci_file_response_t*)(r))->path+B2H(((hci_file_response_t*)(r))->path_len))
typedef struct hci_notification {
u8 category;
u8 type;
u8 value[0];
} __attribute__((packed)) hci_notification_t;
typedef struct hci_set_eap_info
{
u8 type;
u16 frag_size;
u8 use_delimiter;
u8 tlv[0];
} __attribute__((packed)) hci_set_eap_info_t;
typedef struct hci_set_eap_info_result
{
u32 code;
} __attribute__((packed)) hci_set_eap_info_result_t;
typedef struct hci_get_cert_info
{
u8 index;
} __attribute__((packed)) hci_get_cert_info_t;
typedef struct hci_get_cert_info_result
{
s32 result;
u16 source;
u8 level;
u8 tlv[0];
} __attribute__((packed)) hci_get_cert_info_result_t;
typedef struct hci_delete_cert
{
u8 index;
} __attribute__((packed)) hci_delete_cert_t;
typedef struct hci_delete_cert_result
{
u32 result;
} __attribute__((packed)) hci_delete_cert_result_t;
typedef struct hci_set_arm_capability_s
{
u32 capability;
} __attribute__((packed)) hci_set_arm_capability_t;
typedef struct hci_set_arm_capability_result_s
{
u32 capability;
} __attribute__((packed)) hci_set_arm_capability_result_t;
typedef struct hci_mode_change_s
{
u8 status[3];
u8 power_state;
} __attribute__((packed)) hci_mode_change_t;
typedef struct tlv_s {
u8 T;
u16 L;
u8 *V;
} tlv_t;
#define HCI_INDICATION (1<<0)
typedef struct hci_req_s {
struct list_head list;
u16 cmd_evt;
void *buf; /*this buffer is shared with data to check.*/
int len;
int chk_len; /*length of data to check*/
u32 flag;
pthread_cond_t cond;
} hci_req_t;
typedef struct hci_msg_s {
char buf[HCI_MAX_PACKET];
int len;
} hci_msg_t;
int hci_get_tlv(u8 *buf, u8 *T, u16 *L, u8 **V);
int hci_set_tlv(u8 *buf, u8 T, u16 L, u8 *V);
int hci_send(int dev_idx, u16 cmd, u8 *data, int len);
int hci_send_wait(int dev_idx, u16 s_cmd, u8 *data, int plen,
u16 w_cmd, void *buf, int len, int chk_len, u32 flag, int timeout);
int hci_wait(int dev_idx, u16 cmd_evt,
void *buf, int len, int chk_len, u32 flag, int timeout);
int hci_destroy_resp(int dev_idx);
int hci_req_getinfo(int dev_idx, u8 *buf, tlv_t *tlv, int cnt);
int hci_req_getinfo32(int dev_idx, u8 type, u32 *val);
int hci_req_setinfo32(int dev_idx, u8 type, u32 val);
int hci_send_msg(int dev_idx, hci_msg_t *msg);
int hci_receiver_create(msg_thr_t *hci_recvr);
int hci_receiver_delete(msg_thr_t *hci_recvr);
#endif /* __HCI_H__ */