1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2013 - 2017 Realtek Corporation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it 6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as 7*4882a593Smuzhiyun * published by the Free Software Foundation. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT 10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*4882a593Smuzhiyun * more details. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun *****************************************************************************/ 15*4882a593Smuzhiyun #ifdef CONFIG_BT_COEXIST 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef __RTW_BTCOEX_H__ 18*4882a593Smuzhiyun #define __RTW_BTCOEX_H__ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include <drv_types.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* For H2C: H2C_BT_MP_OPER. Return status definition to the user layer */ 23*4882a593Smuzhiyun typedef enum _BT_CTRL_STATUS { 24*4882a593Smuzhiyun BT_STATUS_SUCCESS = 0x00, /* Success */ 25*4882a593Smuzhiyun BT_STATUS_BT_OP_SUCCESS = 0x01, /* bt fw op execution success */ 26*4882a593Smuzhiyun BT_STATUS_H2C_SUCCESS = 0x02, /* H2c success */ 27*4882a593Smuzhiyun BT_STATUS_H2C_FAIL = 0x03, /* H2c fail */ 28*4882a593Smuzhiyun BT_STATUS_H2C_LENGTH_EXCEEDED = 0x04, /* H2c command length exceeded */ 29*4882a593Smuzhiyun BT_STATUS_H2C_TIMTOUT = 0x05, /* H2c timeout */ 30*4882a593Smuzhiyun BT_STATUS_H2C_BT_NO_RSP = 0x06, /* H2c sent, bt no rsp */ 31*4882a593Smuzhiyun BT_STATUS_C2H_SUCCESS = 0x07, /* C2h success */ 32*4882a593Smuzhiyun BT_STATUS_C2H_REQNUM_MISMATCH = 0x08, /* bt fw wrong rsp */ 33*4882a593Smuzhiyun BT_STATUS_OPCODE_U_VERSION_MISMATCH = 0x08, /* Upper layer OP code version mismatch. */ 34*4882a593Smuzhiyun BT_STATUS_OPCODE_L_VERSION_MISMATCH = 0x0a, /* Lower layer OP code version mismatch. */ 35*4882a593Smuzhiyun BT_STATUS_UNKNOWN_OPCODE_U = 0x0b, /* Unknown Upper layer OP code */ 36*4882a593Smuzhiyun BT_STATUS_UNKNOWN_OPCODE_L = 0x0c, /* Unknown Lower layer OP code */ 37*4882a593Smuzhiyun BT_STATUS_PARAMETER_FORMAT_ERROR_U = 0x0d, /* Wrong parameters sent by upper layer. */ 38*4882a593Smuzhiyun BT_STATUS_PARAMETER_FORMAT_ERROR_L = 0x0e, /* bt fw parameter format is not consistency */ 39*4882a593Smuzhiyun BT_STATUS_PARAMETER_OUT_OF_RANGE_U = 0x0f, /* uppery layer parameter value is out of range */ 40*4882a593Smuzhiyun BT_STATUS_PARAMETER_OUT_OF_RANGE_L = 0x10, /* bt fw parameter value is out of range */ 41*4882a593Smuzhiyun BT_STATUS_UNKNOWN_STATUS_L = 0x11, /* bt returned an defined status code */ 42*4882a593Smuzhiyun BT_STATUS_UNKNOWN_STATUS_H = 0x12, /* driver need to do error handle or not handle-well. */ 43*4882a593Smuzhiyun BT_STATUS_WRONG_LEVEL = 0x13, /* should be under passive level */ 44*4882a593Smuzhiyun BT_STATUS_NOT_IMPLEMENT = 0x14, /* op code not implemented yet */ 45*4882a593Smuzhiyun BT_STATUS_BT_STACK_OP_SUCCESS = 0x15, /* bt stack op execution success */ 46*4882a593Smuzhiyun BT_STATUS_BT_STACK_NOT_SUPPORT = 0x16, /* stack version not support this. */ 47*4882a593Smuzhiyun BT_STATUS_BT_STACK_SEND_HCI_EVENT_FAIL = 0x17, /* send hci event fail */ 48*4882a593Smuzhiyun BT_STATUS_BT_STACK_NOT_BIND = 0x18, /* stack not bind wifi driver */ 49*4882a593Smuzhiyun BT_STATUS_BT_STACK_NO_RSP = 0x19, /* stack doesn't have any rsp. */ 50*4882a593Smuzhiyun BT_STATUS_MAX 51*4882a593Smuzhiyun } BT_CTRL_STATUS, *PBT_CTRL_STATUS; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun typedef enum _BTCOEX_SUSPEND_STATE { 54*4882a593Smuzhiyun BTCOEX_SUSPEND_STATE_RESUME = 0x0, 55*4882a593Smuzhiyun BTCOEX_SUSPEND_STATE_SUSPEND = 0x1, 56*4882a593Smuzhiyun BTCOEX_SUSPEND_STATE_SUSPEND_KEEP_ANT = 0x2, 57*4882a593Smuzhiyun BTCOEX_SUSPEND_STATE_MAX 58*4882a593Smuzhiyun } BTCOEX_SUSPEND_STATE, *PBTCOEX_SUSPEND_STATE; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun typedef enum _BTCOEX_POLICY_CONTROL { 61*4882a593Smuzhiyun BTCOEX_POLICY_CONTROL_AUTO, 62*4882a593Smuzhiyun BTCOEX_POLICY_CONTROL_FORCE_FREERUN, 63*4882a593Smuzhiyun BTCOEX_POLICY_CONTROL_FORCE_TDMA 64*4882a593Smuzhiyun } BTCOEX_POLICY_CONTROL, *PBTCOEX_POLICY_CONTROL; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define SET_BT_MP_OPER_RET(OpCode, StatusCode) ((OpCode << 8) | StatusCode) 67*4882a593Smuzhiyun #define GET_OP_CODE_FROM_BT_MP_OPER_RET(RetCode) ((RetCode & 0xF0) >> 8) 68*4882a593Smuzhiyun #define GET_STATUS_CODE_FROM_BT_MP_OPER_RET(RetCode) (RetCode & 0x0F) 69*4882a593Smuzhiyun #define CHECK_STATUS_CODE_FROM_BT_MP_OPER_RET(RetCode, StatusCode) (GET_STATUS_CODE_FROM_BT_MP_OPER_RET(RetCode) == StatusCode) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #ifdef CONFIG_BT_COEXIST_SOCKET_TRX 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #define NETLINK_USER 31 74*4882a593Smuzhiyun #define CONNECT_PORT 30000 75*4882a593Smuzhiyun #define CONNECT_PORT_BT 30001 76*4882a593Smuzhiyun #define KERNEL_SOCKET_OK 0x01 77*4882a593Smuzhiyun #define NETLINK_SOCKET_OK 0x02 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #define OTHER 0 80*4882a593Smuzhiyun #define RX_ATTEND_ACK 1 81*4882a593Smuzhiyun #define RX_LEAVE_ACK 2 82*4882a593Smuzhiyun #define RX_BT_LEAVE 3 83*4882a593Smuzhiyun #define RX_INVITE_REQ 4 84*4882a593Smuzhiyun #define RX_ATTEND_REQ 5 85*4882a593Smuzhiyun #define RX_INVITE_RSP 6 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define invite_req "INVITE_REQ" 88*4882a593Smuzhiyun #define invite_rsp "INVITE_RSP" 89*4882a593Smuzhiyun #define attend_req "ATTEND_REQ" 90*4882a593Smuzhiyun #define attend_ack "ATTEND_ACK" 91*4882a593Smuzhiyun #define wifi_leave "WIFI_LEAVE" 92*4882a593Smuzhiyun #define leave_ack "LEAVE_ACK" 93*4882a593Smuzhiyun #define bt_leave "BT_LEAVE" 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #define BT_INFO_NOTIFY_CMD 0x0106 96*4882a593Smuzhiyun #define BT_INFO_LEN 8 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun typedef struct _HCI_LINK_INFO { 99*4882a593Smuzhiyun u16 ConnectHandle; 100*4882a593Smuzhiyun u8 IncomingTrafficMode; 101*4882a593Smuzhiyun u8 OutgoingTrafficMode; 102*4882a593Smuzhiyun u8 BTProfile; 103*4882a593Smuzhiyun u8 BTCoreSpec; 104*4882a593Smuzhiyun s8 BT_RSSI; 105*4882a593Smuzhiyun u8 TrafficProfile; 106*4882a593Smuzhiyun u8 linkRole; 107*4882a593Smuzhiyun } HCI_LINK_INFO, *PHCI_LINK_INFO; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun #define MAX_BT_ACL_LINK_NUM 8 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun typedef struct _HCI_EXT_CONFIG { 112*4882a593Smuzhiyun HCI_LINK_INFO aclLink[MAX_BT_ACL_LINK_NUM]; 113*4882a593Smuzhiyun u8 btOperationCode; 114*4882a593Smuzhiyun u16 CurrentConnectHandle; 115*4882a593Smuzhiyun u8 CurrentIncomingTrafficMode; 116*4882a593Smuzhiyun u8 CurrentOutgoingTrafficMode; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun u8 NumberOfACL; 119*4882a593Smuzhiyun u8 NumberOfSCO; 120*4882a593Smuzhiyun u8 CurrentBTStatus; 121*4882a593Smuzhiyun u16 HCIExtensionVer; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun BOOLEAN bEnableWifiScanNotify; 124*4882a593Smuzhiyun } HCI_EXT_CONFIG, *PHCI_EXT_CONFIG; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun typedef struct _HCI_PHY_LINK_BSS_INFO { 127*4882a593Smuzhiyun u16 bdCap; /* capability information */ 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* Qos related. Added by Annie, 2005-11-01. */ 130*4882a593Smuzhiyun /* BSS_QOS BssQos; */ 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun } HCI_PHY_LINK_BSS_INFO, *PHCI_PHY_LINK_BSS_INFO; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun typedef enum _BT_CONNECT_TYPE { 135*4882a593Smuzhiyun BT_CONNECT_AUTH_REQ = 0x00, 136*4882a593Smuzhiyun BT_CONNECT_AUTH_RSP = 0x01, 137*4882a593Smuzhiyun BT_CONNECT_ASOC_REQ = 0x02, 138*4882a593Smuzhiyun BT_CONNECT_ASOC_RSP = 0x03, 139*4882a593Smuzhiyun BT_DISCONNECT = 0x04 140*4882a593Smuzhiyun } BT_CONNECT_TYPE, *PBT_CONNECT_TYPE; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun typedef struct _PACKET_IRP_HCIEVENT_DATA { 144*4882a593Smuzhiyun u8 EventCode; 145*4882a593Smuzhiyun u8 Length; /* total cmd length = extension event length+1(extension event code length) */ 146*4882a593Smuzhiyun u8 Data[1]; /* byte1 is extension event code */ 147*4882a593Smuzhiyun } rtw_HCI_event; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun struct btinfo_8761ATV { 151*4882a593Smuzhiyun u8 cid; 152*4882a593Smuzhiyun u8 len; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun u8 bConnection:1; 155*4882a593Smuzhiyun u8 bSCOeSCO:1; 156*4882a593Smuzhiyun u8 bInQPage:1; 157*4882a593Smuzhiyun u8 bACLBusy:1; 158*4882a593Smuzhiyun u8 bSCOBusy:1; 159*4882a593Smuzhiyun u8 bHID:1; 160*4882a593Smuzhiyun u8 bA2DP:1; 161*4882a593Smuzhiyun u8 bFTP:1; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun u8 retry_cnt:4; 164*4882a593Smuzhiyun u8 rsvd_34:1; 165*4882a593Smuzhiyun u8 bPage:1; 166*4882a593Smuzhiyun u8 TRxMask:1; 167*4882a593Smuzhiyun u8 Sniff_attempt:1; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun u8 rssi; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun u8 A2dp_rate:1; 172*4882a593Smuzhiyun u8 ReInit:1; 173*4882a593Smuzhiyun u8 MaxPower:1; 174*4882a593Smuzhiyun u8 bEnIgnoreWlanAct:1; 175*4882a593Smuzhiyun u8 TxPowerLow:1; 176*4882a593Smuzhiyun u8 TxPowerHigh:1; 177*4882a593Smuzhiyun u8 eSCO_SCO:1; 178*4882a593Smuzhiyun u8 Master_Slave:1; 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun u8 ACL_TRx_TP_low; 181*4882a593Smuzhiyun u8 ACL_TRx_TP_high; 182*4882a593Smuzhiyun }; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun #define HCIOPCODE(_OCF, _OGF) ((_OGF)<<10|(_OCF)) 185*4882a593Smuzhiyun #define HCIOPCODELOW(_OCF, _OGF) (u8)(HCIOPCODE(_OCF, _OGF) & 0x00ff) 186*4882a593Smuzhiyun #define HCIOPCODEHIGHT(_OCF, _OGF) (u8)(HCIOPCODE(_OCF, _OGF)>>8) 187*4882a593Smuzhiyun #define HCI_OGF(opCode) (unsigned char)((0xFC00 & (opCode)) >> 10) 188*4882a593Smuzhiyun #define HCI_OCF(opCode) (0x3FF & (opCode)) 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun typedef enum _HCI_STATUS { 192*4882a593Smuzhiyun HCI_STATUS_SUCCESS = 0x00, /* Success */ 193*4882a593Smuzhiyun HCI_STATUS_UNKNOW_HCI_CMD = 0x01, /* Unknown HCI Command */ 194*4882a593Smuzhiyun HCI_STATUS_UNKNOW_CONNECT_ID = 0X02, /* Unknown Connection Identifier */ 195*4882a593Smuzhiyun HCI_STATUS_HW_FAIL = 0X03, /* Hardware Failure */ 196*4882a593Smuzhiyun HCI_STATUS_PAGE_TIMEOUT = 0X04, /* Page Timeout */ 197*4882a593Smuzhiyun HCI_STATUS_AUTH_FAIL = 0X05, /* Authentication Failure */ 198*4882a593Smuzhiyun HCI_STATUS_PIN_OR_KEY_MISSING = 0X06, /* PIN or Key Missing */ 199*4882a593Smuzhiyun HCI_STATUS_MEM_CAP_EXCEED = 0X07, /* Memory Capacity Exceeded */ 200*4882a593Smuzhiyun HCI_STATUS_CONNECT_TIMEOUT = 0X08, /* Connection Timeout */ 201*4882a593Smuzhiyun HCI_STATUS_CONNECT_LIMIT = 0X09, /* Connection Limit Exceeded */ 202*4882a593Smuzhiyun HCI_STATUS_SYN_CONNECT_LIMIT = 0X0a, /* Synchronous Connection Limit To A Device Exceeded */ 203*4882a593Smuzhiyun HCI_STATUS_ACL_CONNECT_EXISTS = 0X0b, /* ACL Connection Already Exists */ 204*4882a593Smuzhiyun HCI_STATUS_CMD_DISALLOW = 0X0c, /* Command Disallowed */ 205*4882a593Smuzhiyun HCI_STATUS_CONNECT_RJT_LIMIT_RESOURCE = 0X0d, /* Connection Rejected due to Limited Resources */ 206*4882a593Smuzhiyun HCI_STATUS_CONNECT_RJT_SEC_REASON = 0X0e, /* Connection Rejected Due To Security Reasons */ 207*4882a593Smuzhiyun HCI_STATUS_CONNECT_RJT_UNACCEPT_BD_ADDR = 0X0f, /* Connection Rejected due to Unacceptable BD_ADDR */ 208*4882a593Smuzhiyun HCI_STATUS_CONNECT_ACCEPT_TIMEOUT = 0X10, /* Connection Accept Timeout Exceeded */ 209*4882a593Smuzhiyun HCI_STATUS_UNSUPPORT_FEATURE_PARA_VALUE = 0X11, /* Unsupported Feature or Parameter Value */ 210*4882a593Smuzhiyun HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE = 0X12, /* Invalid HCI Command Parameters */ 211*4882a593Smuzhiyun HCI_STATUS_REMOTE_USER_TERMINATE_CONNECT = 0X13, /* Remote User Terminated Connection */ 212*4882a593Smuzhiyun HCI_STATUS_REMOTE_DEV_TERMINATE_LOW_RESOURCE = 0X14, /* Remote Device Terminated Connection due to Low Resources */ 213*4882a593Smuzhiyun HCI_STATUS_REMOTE_DEV_TERMINATE_CONNECT_POWER_OFF = 0X15, /* Remote Device Terminated Connection due to Power Off */ 214*4882a593Smuzhiyun HCI_STATUS_CONNECT_TERMINATE_LOCAL_HOST = 0X16, /* Connection Terminated By Local Host */ 215*4882a593Smuzhiyun HCI_STATUS_REPEATE_ATTEMPT = 0X17, /* Repeated Attempts */ 216*4882a593Smuzhiyun HCI_STATUS_PAIR_NOT_ALLOW = 0X18, /* Pairing Not Allowed */ 217*4882a593Smuzhiyun HCI_STATUS_UNKNOW_LMP_PDU = 0X19, /* Unknown LMP PDU */ 218*4882a593Smuzhiyun HCI_STATUS_UNSUPPORT_REMOTE_LMP_FEATURE = 0X1a, /* Unsupported Remote Feature / Unsupported LMP Feature */ 219*4882a593Smuzhiyun HCI_STATUS_SOC_OFFSET_REJECT = 0X1b, /* SCO Offset Rejected */ 220*4882a593Smuzhiyun HCI_STATUS_SOC_INTERVAL_REJECT = 0X1c, /* SCO Interval Rejected */ 221*4882a593Smuzhiyun HCI_STATUS_SOC_AIR_MODE_REJECT = 0X1d, /* SCO Air Mode Rejected */ 222*4882a593Smuzhiyun HCI_STATUS_INVALID_LMP_PARA = 0X1e, /* Invalid LMP Parameters */ 223*4882a593Smuzhiyun HCI_STATUS_UNSPECIFIC_ERROR = 0X1f, /* Unspecified Error */ 224*4882a593Smuzhiyun HCI_STATUS_UNSUPPORT_LMP_PARA_VALUE = 0X20, /* Unsupported LMP Parameter Value */ 225*4882a593Smuzhiyun HCI_STATUS_ROLE_CHANGE_NOT_ALLOW = 0X21, /* Role Change Not Allowed */ 226*4882a593Smuzhiyun HCI_STATUS_LMP_RESPONSE_TIMEOUT = 0X22, /* LMP Response Timeout */ 227*4882a593Smuzhiyun HCI_STATUS_LMP_ERROR_TRANSACTION_COLLISION = 0X23, /* LMP Error Transaction Collision */ 228*4882a593Smuzhiyun HCI_STATUS_LMP_PDU_NOT_ALLOW = 0X24, /* LMP PDU Not Allowed */ 229*4882a593Smuzhiyun HCI_STATUS_ENCRYPTION_MODE_NOT_ALLOW = 0X25, /* Encryption Mode Not Acceptable */ 230*4882a593Smuzhiyun HCI_STATUS_LINK_KEY_CAN_NOT_CHANGE = 0X26, /* Link Key Can Not be Changed */ 231*4882a593Smuzhiyun HCI_STATUS_REQUEST_QOS_NOT_SUPPORT = 0X27, /* Requested QoS Not Supported */ 232*4882a593Smuzhiyun HCI_STATUS_INSTANT_PASSED = 0X28, /* Instant Passed */ 233*4882a593Smuzhiyun HCI_STATUS_PAIRING_UNIT_KEY_NOT_SUPPORT = 0X29, /* Pairing With Unit Key Not Supported */ 234*4882a593Smuzhiyun HCI_STATUS_DIFFERENT_TRANSACTION_COLLISION = 0X2a, /* Different Transaction Collision */ 235*4882a593Smuzhiyun HCI_STATUS_RESERVE_1 = 0X2b, /* Reserved */ 236*4882a593Smuzhiyun HCI_STATUS_QOS_UNACCEPT_PARA = 0X2c, /* QoS Unacceptable Parameter */ 237*4882a593Smuzhiyun HCI_STATUS_QOS_REJECT = 0X2d, /* QoS Rejected */ 238*4882a593Smuzhiyun HCI_STATUS_CHNL_CLASSIFICATION_NOT_SUPPORT = 0X2e, /* Channel Classification Not Supported */ 239*4882a593Smuzhiyun HCI_STATUS_INSUFFICIENT_SECURITY = 0X2f, /* Insufficient Security */ 240*4882a593Smuzhiyun HCI_STATUS_PARA_OUT_OF_RANGE = 0x30, /* Parameter Out Of Mandatory Range */ 241*4882a593Smuzhiyun HCI_STATUS_RESERVE_2 = 0X31, /* Reserved */ 242*4882a593Smuzhiyun HCI_STATUS_ROLE_SWITCH_PENDING = 0X32, /* Role Switch Pending */ 243*4882a593Smuzhiyun HCI_STATUS_RESERVE_3 = 0X33, /* Reserved */ 244*4882a593Smuzhiyun HCI_STATUS_RESERVE_SOLT_VIOLATION = 0X34, /* Reserved Slot Violation */ 245*4882a593Smuzhiyun HCI_STATUS_ROLE_SWITCH_FAIL = 0X35, /* Role Switch Failed */ 246*4882a593Smuzhiyun HCI_STATUS_EXTEND_INQUIRY_RSP_TOO_LARGE = 0X36, /* Extended Inquiry Response Too Large */ 247*4882a593Smuzhiyun HCI_STATUS_SEC_SIMPLE_PAIRING_NOT_SUPPORT = 0X37, /* Secure Simple Pairing Not Supported By Host. */ 248*4882a593Smuzhiyun HCI_STATUS_HOST_BUSY_PAIRING = 0X38, /* Host Busy - Pairing */ 249*4882a593Smuzhiyun HCI_STATUS_CONNECT_REJ_NOT_SUIT_CHNL_FOUND = 0X39, /* Connection Rejected due to No Suitable Channel Found */ 250*4882a593Smuzhiyun HCI_STATUS_CONTROLLER_BUSY = 0X3a /* CONTROLLER BUSY */ 251*4882a593Smuzhiyun } RTW_HCI_STATUS; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun #define HCI_EVENT_COMMAND_COMPLETE 0x0e 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun #define OGF_EXTENSION 0X3f 256*4882a593Smuzhiyun typedef enum HCI_EXTENSION_COMMANDS { 257*4882a593Smuzhiyun HCI_SET_ACL_LINK_DATA_FLOW_MODE = 0x0010, 258*4882a593Smuzhiyun HCI_SET_ACL_LINK_STATUS = 0x0020, 259*4882a593Smuzhiyun HCI_SET_SCO_LINK_STATUS = 0x0030, 260*4882a593Smuzhiyun HCI_SET_RSSI_VALUE = 0x0040, 261*4882a593Smuzhiyun HCI_SET_CURRENT_BLUETOOTH_STATUS = 0x0041, 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun /* The following is for RTK8723 */ 264*4882a593Smuzhiyun HCI_EXTENSION_VERSION_NOTIFY = 0x0100, 265*4882a593Smuzhiyun HCI_LINK_STATUS_NOTIFY = 0x0101, 266*4882a593Smuzhiyun HCI_BT_OPERATION_NOTIFY = 0x0102, 267*4882a593Smuzhiyun HCI_ENABLE_WIFI_SCAN_NOTIFY = 0x0103, 268*4882a593Smuzhiyun HCI_QUERY_RF_STATUS = 0x0104, 269*4882a593Smuzhiyun HCI_BT_ABNORMAL_NOTIFY = 0x0105, 270*4882a593Smuzhiyun HCI_BT_INFO_NOTIFY = 0x0106, 271*4882a593Smuzhiyun HCI_BT_COEX_NOTIFY = 0x0107, 272*4882a593Smuzhiyun HCI_BT_PATCH_VERSION_NOTIFY = 0x0108, 273*4882a593Smuzhiyun HCI_BT_AFH_MAP_NOTIFY = 0x0109, 274*4882a593Smuzhiyun HCI_BT_REGISTER_VALUE_NOTIFY = 0x010a, 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun /* The following is for IVT */ 277*4882a593Smuzhiyun HCI_WIFI_CURRENT_CHANNEL = 0x0300, 278*4882a593Smuzhiyun HCI_WIFI_CURRENT_BANDWIDTH = 0x0301, 279*4882a593Smuzhiyun HCI_WIFI_CONNECTION_STATUS = 0x0302 280*4882a593Smuzhiyun } RTW_HCI_EXT_CMD; 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun #define HCI_EVENT_EXTENSION_RTK 0xfe 283*4882a593Smuzhiyun typedef enum HCI_EXTENSION_EVENT_RTK { 284*4882a593Smuzhiyun HCI_EVENT_EXT_WIFI_SCAN_NOTIFY = 0x01, 285*4882a593Smuzhiyun HCI_EVENT_EXT_WIFI_RF_STATUS_NOTIFY = 0x02, 286*4882a593Smuzhiyun HCI_EVENT_EXT_BT_INFO_CONTROL = 0x03, 287*4882a593Smuzhiyun HCI_EVENT_EXT_BT_COEX_CONTROL = 0x04 288*4882a593Smuzhiyun } RTW_HCI_EXT_EVENT; 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun typedef enum _BT_TRAFFIC_MODE { 291*4882a593Smuzhiyun BT_MOTOR_EXT_BE = 0x00, /* Best Effort. Default. for HCRP, PAN, SDP, RFCOMM-based profiles like FTP,OPP, SPP, DUN, etc. */ 292*4882a593Smuzhiyun BT_MOTOR_EXT_GUL = 0x01, /* Guaranteed Latency. This type of traffic is used e.g. for HID and AVRCP. */ 293*4882a593Smuzhiyun BT_MOTOR_EXT_GUB = 0X02, /* Guaranteed Bandwidth. */ 294*4882a593Smuzhiyun BT_MOTOR_EXT_GULB = 0X03 /* Guaranteed Latency and Bandwidth. for A2DP and VDP. */ 295*4882a593Smuzhiyun } BT_TRAFFIC_MODE; 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun typedef enum _BT_TRAFFIC_MODE_PROFILE { 298*4882a593Smuzhiyun BT_PROFILE_NONE, 299*4882a593Smuzhiyun BT_PROFILE_A2DP, 300*4882a593Smuzhiyun BT_PROFILE_PAN , 301*4882a593Smuzhiyun BT_PROFILE_HID, 302*4882a593Smuzhiyun BT_PROFILE_SCO 303*4882a593Smuzhiyun } BT_TRAFFIC_MODE_PROFILE; 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun typedef enum _HCI_EXT_BT_OPERATION { 306*4882a593Smuzhiyun HCI_BT_OP_NONE = 0x0, 307*4882a593Smuzhiyun HCI_BT_OP_INQUIRY_START = 0x1, 308*4882a593Smuzhiyun HCI_BT_OP_INQUIRY_FINISH = 0x2, 309*4882a593Smuzhiyun HCI_BT_OP_PAGING_START = 0x3, 310*4882a593Smuzhiyun HCI_BT_OP_PAGING_SUCCESS = 0x4, 311*4882a593Smuzhiyun HCI_BT_OP_PAGING_UNSUCCESS = 0x5, 312*4882a593Smuzhiyun HCI_BT_OP_PAIRING_START = 0x6, 313*4882a593Smuzhiyun HCI_BT_OP_PAIRING_FINISH = 0x7, 314*4882a593Smuzhiyun HCI_BT_OP_BT_DEV_ENABLE = 0x8, 315*4882a593Smuzhiyun HCI_BT_OP_BT_DEV_DISABLE = 0x9, 316*4882a593Smuzhiyun HCI_BT_OP_MAX 317*4882a593Smuzhiyun } HCI_EXT_BT_OPERATION, *PHCI_EXT_BT_OPERATION; 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun typedef struct _BT_MGNT { 320*4882a593Smuzhiyun BOOLEAN bBTConnectInProgress; 321*4882a593Smuzhiyun BOOLEAN bLogLinkInProgress; 322*4882a593Smuzhiyun BOOLEAN bPhyLinkInProgress; 323*4882a593Smuzhiyun BOOLEAN bPhyLinkInProgressStartLL; 324*4882a593Smuzhiyun u8 BtCurrentPhyLinkhandle; 325*4882a593Smuzhiyun u16 BtCurrentLogLinkhandle; 326*4882a593Smuzhiyun u8 CurrentConnectEntryNum; 327*4882a593Smuzhiyun u8 DisconnectEntryNum; 328*4882a593Smuzhiyun u8 CurrentBTConnectionCnt; 329*4882a593Smuzhiyun BT_CONNECT_TYPE BTCurrentConnectType; 330*4882a593Smuzhiyun BT_CONNECT_TYPE BTReceiveConnectPkt; 331*4882a593Smuzhiyun u8 BTAuthCount; 332*4882a593Smuzhiyun u8 BTAsocCount; 333*4882a593Smuzhiyun BOOLEAN bStartSendSupervisionPkt; 334*4882a593Smuzhiyun BOOLEAN BtOperationOn; 335*4882a593Smuzhiyun BOOLEAN BTNeedAMPStatusChg; 336*4882a593Smuzhiyun BOOLEAN JoinerNeedSendAuth; 337*4882a593Smuzhiyun HCI_PHY_LINK_BSS_INFO bssDesc; 338*4882a593Smuzhiyun HCI_EXT_CONFIG ExtConfig; 339*4882a593Smuzhiyun BOOLEAN bNeedNotifyAMPNoCap; 340*4882a593Smuzhiyun BOOLEAN bCreateSpportQos; 341*4882a593Smuzhiyun BOOLEAN bSupportProfile; 342*4882a593Smuzhiyun u8 BTChannel; 343*4882a593Smuzhiyun BOOLEAN CheckChnlIsSuit; 344*4882a593Smuzhiyun BOOLEAN bBtScan; 345*4882a593Smuzhiyun BOOLEAN btLogoTest; 346*4882a593Smuzhiyun BOOLEAN bRfStatusNotified; 347*4882a593Smuzhiyun BOOLEAN bBtRsvedPageDownload; 348*4882a593Smuzhiyun } BT_MGNT, *PBT_MGNT; 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun struct bt_coex_info { 351*4882a593Smuzhiyun /* For Kernel Socket */ 352*4882a593Smuzhiyun struct socket *udpsock; 353*4882a593Smuzhiyun struct sockaddr_in wifi_sockaddr; /*wifi socket*/ 354*4882a593Smuzhiyun struct sockaddr_in bt_sockaddr;/* BT socket */ 355*4882a593Smuzhiyun struct sock *sk_store;/*back up socket for UDP RX int*/ 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun /* store which socket is OK */ 358*4882a593Smuzhiyun u8 sock_open; 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun u8 BT_attend; 361*4882a593Smuzhiyun u8 is_exist; /* socket exist */ 362*4882a593Smuzhiyun BT_MGNT BtMgnt; 363*4882a593Smuzhiyun struct workqueue_struct *btcoex_wq; 364*4882a593Smuzhiyun struct delayed_work recvmsg_work; 365*4882a593Smuzhiyun }; 366*4882a593Smuzhiyun #endif /* CONFIG_BT_COEXIST_SOCKET_TRX */ 367*4882a593Smuzhiyun 368*4882a593Smuzhiyun #define PACKET_NORMAL 0 369*4882a593Smuzhiyun #define PACKET_DHCP 1 370*4882a593Smuzhiyun #define PACKET_ARP 2 371*4882a593Smuzhiyun #define PACKET_EAPOL 3 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun void rtw_btcoex_Initialize(PADAPTER); 374*4882a593Smuzhiyun void rtw_btcoex_PowerOnSetting(PADAPTER padapter); 375*4882a593Smuzhiyun void rtw_btcoex_AntInfoSetting(PADAPTER padapter); 376*4882a593Smuzhiyun void rtw_btcoex_PowerOffSetting(PADAPTER padapter); 377*4882a593Smuzhiyun void rtw_btcoex_PreLoadFirmware(PADAPTER padapter); 378*4882a593Smuzhiyun void rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly); 379*4882a593Smuzhiyun void rtw_btcoex_IpsNotify(PADAPTER, u8 type); 380*4882a593Smuzhiyun void rtw_btcoex_LpsNotify(PADAPTER, u8 type); 381*4882a593Smuzhiyun void rtw_btcoex_ScanNotify(PADAPTER, u8 type); 382*4882a593Smuzhiyun void rtw_btcoex_MediaStatusNotify(PADAPTER, u8 mediaStatus); 383*4882a593Smuzhiyun void rtw_btcoex_SpecialPacketNotify(PADAPTER, u8 pktType); 384*4882a593Smuzhiyun void rtw_btcoex_IQKNotify(PADAPTER padapter, u8 state); 385*4882a593Smuzhiyun void rtw_btcoex_WLRFKNotify(PADAPTER padapter, u8 path, u8 type, u8 state); 386*4882a593Smuzhiyun void rtw_btcoex_BtInfoNotify(PADAPTER, u8 length, u8 *tmpBuf); 387*4882a593Smuzhiyun void rtw_btcoex_BtMpRptNotify(PADAPTER, u8 length, u8 *tmpBuf); 388*4882a593Smuzhiyun void rtw_btcoex_SuspendNotify(PADAPTER, u8 state); 389*4882a593Smuzhiyun void rtw_btcoex_HaltNotify(PADAPTER); 390*4882a593Smuzhiyun void rtw_btcoex_switchband_notify(u8 under_scan, u8 band_type); 391*4882a593Smuzhiyun void rtw_btcoex_WlFwDbgInfoNotify(PADAPTER padapter, u8* tmpBuf, u8 length); 392*4882a593Smuzhiyun void rtw_btcoex_rx_rate_change_notify(PADAPTER padapter, u8 is_data_frame, u8 rate_id); 393*4882a593Smuzhiyun void rtw_btcoex_SwitchBtTRxMask(PADAPTER); 394*4882a593Smuzhiyun void rtw_btcoex_Switch(PADAPTER, u8 enable); 395*4882a593Smuzhiyun u8 rtw_btcoex_IsBtDisabled(PADAPTER); 396*4882a593Smuzhiyun void rtw_btcoex_Handler(PADAPTER); 397*4882a593Smuzhiyun s32 rtw_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter); 398*4882a593Smuzhiyun s32 rtw_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER); 399*4882a593Smuzhiyun u32 rtw_btcoex_GetAMPDUSize(PADAPTER); 400*4882a593Smuzhiyun void rtw_btcoex_SetManualControl(PADAPTER, u8 bmanual); 401*4882a593Smuzhiyun void rtw_btcoex_set_policy_control(PADAPTER, u8 btc_policy); 402*4882a593Smuzhiyun u8 rtw_btcoex_1Ant(PADAPTER); 403*4882a593Smuzhiyun u8 rtw_btcoex_IsBtControlLps(PADAPTER); 404*4882a593Smuzhiyun u8 rtw_btcoex_IsLpsOn(PADAPTER); 405*4882a593Smuzhiyun u8 rtw_btcoex_RpwmVal(PADAPTER); 406*4882a593Smuzhiyun u8 rtw_btcoex_LpsVal(PADAPTER); 407*4882a593Smuzhiyun u32 rtw_btcoex_GetRaMask(PADAPTER); 408*4882a593Smuzhiyun u8 rtw_btcoex_query_reduced_wl_pwr_lvl(PADAPTER padapter); 409*4882a593Smuzhiyun void rtw_btcoex_set_reduced_wl_pwr_lvl(PADAPTER padapter, u8 val); 410*4882a593Smuzhiyun void rtw_btcoex_do_reduce_wl_pwr_lvl(PADAPTER padapter); 411*4882a593Smuzhiyun void rtw_btcoex_RecordPwrMode(PADAPTER, u8 *pCmdBuf, u8 cmdLen); 412*4882a593Smuzhiyun void rtw_btcoex_DisplayBtCoexInfo(PADAPTER, u8 *pbuf, u32 bufsize); 413*4882a593Smuzhiyun void rtw_btcoex_SetDBG(PADAPTER, u32 *pDbgModule); 414*4882a593Smuzhiyun u32 rtw_btcoex_GetDBG(PADAPTER, u8 *pStrBuf, u32 bufSize); 415*4882a593Smuzhiyun u8 rtw_btcoex_IncreaseScanDeviceNum(PADAPTER); 416*4882a593Smuzhiyun u8 rtw_btcoex_IsBtLinkExist(PADAPTER); 417*4882a593Smuzhiyun void rtw_btcoex_pta_off_on_notify(PADAPTER padapter, u8 bBTON); 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun #ifdef CONFIG_RF4CE_COEXIST 420*4882a593Smuzhiyun void rtw_btcoex_SetRf4ceLinkState(PADAPTER padapter, u8 state); 421*4882a593Smuzhiyun u8 rtw_btcoex_GetRf4ceLinkState(PADAPTER padapter); 422*4882a593Smuzhiyun #endif 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun #ifdef CONFIG_BT_COEXIST_SOCKET_TRX 425*4882a593Smuzhiyun void rtw_btcoex_SetBtPatchVersion(PADAPTER padapter, u16 btHciVer, u16 btPatchVer); 426*4882a593Smuzhiyun void rtw_btcoex_SetHciVersion(PADAPTER padapter, u16 hciVersion); 427*4882a593Smuzhiyun void rtw_btcoex_StackUpdateProfileInfo(void); 428*4882a593Smuzhiyun void rtw_btcoex_init_socket(_adapter *padapter); 429*4882a593Smuzhiyun void rtw_btcoex_close_socket(_adapter *padapter); 430*4882a593Smuzhiyun void rtw_btcoex_dump_tx_msg(u8 *tx_msg, u8 len, u8 *msg_name); 431*4882a593Smuzhiyun u8 rtw_btcoex_sendmsgbysocket(_adapter *padapter, u8 *msg, u8 msg_size, bool force); 432*4882a593Smuzhiyun u8 rtw_btcoex_create_kernel_socket(_adapter *padapter); 433*4882a593Smuzhiyun void rtw_btcoex_close_kernel_socket(_adapter *padapter); 434*4882a593Smuzhiyun void rtw_btcoex_recvmsgbysocket(void *data); 435*4882a593Smuzhiyun u16 rtw_btcoex_parse_recv_data(u8 *msg, u8 msg_size); 436*4882a593Smuzhiyun u8 rtw_btcoex_btinfo_cmd(PADAPTER padapter, u8 *pbuf, u16 length); 437*4882a593Smuzhiyun void rtw_btcoex_parse_hci_cmd(_adapter *padapter, u8 *cmd, u16 len); 438*4882a593Smuzhiyun void rtw_btcoex_SendEventExtBtCoexControl(PADAPTER Adapter, u8 bNeedDbgRsp, u8 dataLen, void *pData); 439*4882a593Smuzhiyun void rtw_btcoex_SendEventExtBtInfoControl(PADAPTER Adapter, u8 dataLen, void *pData); 440*4882a593Smuzhiyun void rtw_btcoex_SendScanNotify(PADAPTER padapter, u8 scanType); 441*4882a593Smuzhiyun #define BT_SendEventExtBtCoexControl(Adapter, bNeedDbgRsp, dataLen, pData) rtw_btcoex_SendEventExtBtCoexControl(Adapter, bNeedDbgRsp, dataLen, pData) 442*4882a593Smuzhiyun #define BT_SendEventExtBtInfoControl(Adapter, dataLen, pData) rtw_btcoex_SendEventExtBtInfoControl(Adapter, dataLen, pData) 443*4882a593Smuzhiyun #endif /* CONFIG_BT_COEXIST_SOCKET_TRX */ 444*4882a593Smuzhiyun u16 rtw_btcoex_btreg_read(PADAPTER padapter, u8 type, u16 addr, u32 *data); 445*4882a593Smuzhiyun u16 rtw_btcoex_btreg_write(PADAPTER padapter, u8 type, u16 addr, u16 val); 446*4882a593Smuzhiyun u8 rtw_btcoex_get_reduce_wl_txpwr(PADAPTER padapter); 447*4882a593Smuzhiyun u8 rtw_btcoex_get_bt_coexist(PADAPTER padapter); 448*4882a593Smuzhiyun u8 rtw_btcoex_get_chip_type(PADAPTER padapter); 449*4882a593Smuzhiyun u8 rtw_btcoex_get_pg_ant_num(PADAPTER padapter); 450*4882a593Smuzhiyun u8 rtw_btcoex_get_pg_single_ant_path(PADAPTER padapter); 451*4882a593Smuzhiyun u8 rtw_btcoex_get_pg_rfe_type(PADAPTER padapter); 452*4882a593Smuzhiyun u8 rtw_btcoex_is_tfbga_package_type(PADAPTER padapter); 453*4882a593Smuzhiyun u8 rtw_btcoex_get_ant_div_cfg(PADAPTER padapter); 454*4882a593Smuzhiyun u16 rtw_btcoex_btset_testmode(PADAPTER padapter, u8 type); 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun /* ================================================== 457*4882a593Smuzhiyun * Below Functions are called by BT-Coex 458*4882a593Smuzhiyun * ================================================== */ 459*4882a593Smuzhiyun void rtw_btcoex_rx_ampdu_apply(PADAPTER padapter); 460*4882a593Smuzhiyun void rtw_btcoex_LPS_Enter(PADAPTER padapter); 461*4882a593Smuzhiyun u8 rtw_btcoex_LPS_Leave(PADAPTER padapter); 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun #endif /* __RTW_BTCOEX_H__ */ 464*4882a593Smuzhiyun #endif /* CONFIG_BT_COEXIST */ 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun void rtw_btcoex_set_ant_info(PADAPTER padapter); 467*4882a593Smuzhiyun void rtw_btcoex_connect_notify(PADAPTER, u8 join_type); 468*4882a593Smuzhiyun 469