1ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 2ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 3ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Copyright (C) 2009-2012 Broadcom Corporation 4ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 5ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 6ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * you may not use this file except in compliance with the License. 7ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * You may obtain a copy of the License at: 8ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 9ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 10ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 11ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Unless required by applicable law or agreed to in writing, software 12ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 13ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * See the License for the specific language governing permissions and 15ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * limitations under the License. 16ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 17ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ******************************************************************************/ 18ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 19ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 20ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 21ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Filename: bt_vendor_brcm.c 22ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 23ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Description: Broadcom vendor specific library implementation 24ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * 25ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ******************************************************************************/ 26ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 27ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define LOG_TAG "bt_vendor" 28ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 29ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <utils/Log.h> 30ad6bbbd04daa376c541deba75c72d04fea443de1Elliott Hughes#include <string.h> 31ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "bt_vendor_brcm.h" 32ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "upio.h" 33ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "userial_vendor.h" 34ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 35ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#ifndef BTVND_DBG 36ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define BTVND_DBG FALSE 37ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif 38ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 39ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (BTVND_DBG == TRUE) 40ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define BTVNDDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);} 41ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#else 42ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define BTVNDDBG(param, ...) {} 43ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif 44ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 45ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 46ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Externs 47ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/ 48ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 49ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid hw_config_start(void); 50ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleuint8_t hw_lpm_enable(uint8_t turn_on); 51ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleuint32_t hw_lpm_get_idle_timeout(void); 52ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid hw_lpm_set_wake_state(uint8_t wake_assert); 53ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (SCO_CFG_INCLUDED == TRUE) 54ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid hw_sco_config(void); 55ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif 56ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid vnd_load_conf(const char *p_path); 57f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#if (HW_END_WITH_HCI_RESET == TRUE) 58f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chaovoid hw_epilog_process(void); 59f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#endif 60ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 61ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 62ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Variables 63ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/ 64ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 65ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillebt_vendor_callbacks_t *bt_vendor_cbacks = NULL; 66ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleuint8_t vnd_local_bd_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 67ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 68ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 69ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Local type definitions 70ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/ 71ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 72ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 73ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Static Variables 74ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/ 75ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 76ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic const tUSERIAL_CFG userial_init_cfg = 77ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{ 78ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1), 79ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville USERIAL_BAUD_115200 80ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}; 81ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 82ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/****************************************************************************** 83ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Functions 84ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/ 85ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 86ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/***************************************************************************** 87ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** 88ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS 89ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** 90ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*****************************************************************************/ 91ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 92ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr) 93ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{ 94ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGI("init"); 95ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 96ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville if (p_cb == NULL) 97ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 98ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGE("init failed with no user callbacks!"); 99ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville return -1; 100ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 101ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 102ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE) 103ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("*****************************************************************"); 104ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("*****************************************************************"); 105ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("** Warning - BT Vendor Lib is loaded in debug tuning mode!"); 106ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("**"); 107ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("** If this is not intentional, rebuild libbt-vendor.so "); 108ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("** with VENDOR_LIB_RUNTIME_TUNING_ENABLED=FALSE and "); 109ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("** check if any run-time tuning parameters needed to be"); 110ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("** carried to the build-time configuration accordingly."); 111ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("*****************************************************************"); 112ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ALOGW("*****************************************************************"); 113ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif 114ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 115ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville userial_vendor_init(); 116ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville upio_init(); 117ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 118ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville vnd_load_conf(VENDOR_LIB_CONF_FILE); 119ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 120ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville /* store reference to user callbacks */ 121ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb; 122ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 123ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville /* This is handed over from the stack */ 124ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville memcpy(vnd_local_bd_addr, local_bdaddr, 6); 125ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 126ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville return 0; 127ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville} 128ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 129ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 130ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/** Requested operations */ 131ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int op(bt_vendor_opcode_t opcode, void *param) 132ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{ 1333e1fc82009b434a496f920a29023426e4d16fd4fChris Elliott int retval = 0; 134ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 135ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville BTVNDDBG("op for %d", opcode); 136ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 137ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville switch(opcode) 138ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 139ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_POWER_CTRL: 140ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 141ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville int *state = (int *) param; 142ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville if (*state == BT_VND_PWR_OFF) 143ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville upio_set_bluetooth_power(UPIO_BT_POWER_OFF); 144ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville else if (*state == BT_VND_PWR_ON) 145ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville upio_set_bluetooth_power(UPIO_BT_POWER_ON); 146ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 147ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 148ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 149ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_FW_CFG: 150ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 151ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville hw_config_start(); 152ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 153ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 154ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 155ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_SCO_CFG: 156ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 157ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (SCO_CFG_INCLUDED == TRUE) 158ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville hw_sco_config(); 159ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#else 160ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville retval = -1; 161ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif 162ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 163ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 164ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 165ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_USERIAL_OPEN: 166ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 167ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville int (*fd_array)[] = (int (*)[]) param; 168ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville int fd, idx; 169ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg); 170ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville if (fd != -1) 171ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 172ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville for (idx=0; idx < CH_MAX; idx++) 173ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville (*fd_array)[idx] = fd; 174ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 175ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville retval = 1; 176ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 177ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville /* retval contains numbers of open fd of HCI channels */ 178ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 179ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 180ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 181ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_USERIAL_CLOSE: 182ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 183ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville userial_vendor_close(); 184ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 185ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 186ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 187ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_GET_LPM_IDLE_TIMEOUT: 188ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 189ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville uint32_t *timeout_ms = (uint32_t *) param; 190ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *timeout_ms = hw_lpm_get_idle_timeout(); 191ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 192ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 193ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 194ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_LPM_SET_MODE: 195ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 196ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville uint8_t *mode = (uint8_t *) param; 197ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville retval = hw_lpm_enable(*mode); 198ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 199ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 200ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 201ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville case BT_VND_OP_LPM_WAKE_SET_STATE: 202ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville { 203ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville uint8_t *state = (uint8_t *) param; 20478e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao uint8_t wake_assert = (*state == BT_VND_LPM_WAKE_ASSERT) ? \ 205ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville TRUE : FALSE; 206ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 207ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville hw_lpm_set_wake_state(wake_assert); 208ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 209ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville break; 210f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao 21121570bcdeffebb6f9df6e20e2e15bc3a6febb592Mudumba Ananth case BT_VND_OP_SET_AUDIO_STATE: 21221570bcdeffebb6f9df6e20e2e15bc3a6febb592Mudumba Ananth { 21321570bcdeffebb6f9df6e20e2e15bc3a6febb592Mudumba Ananth retval = hw_set_audio_state((bt_vendor_op_audio_state_t *)param); 21421570bcdeffebb6f9df6e20e2e15bc3a6febb592Mudumba Ananth } 21521570bcdeffebb6f9df6e20e2e15bc3a6febb592Mudumba Ananth break; 21621570bcdeffebb6f9df6e20e2e15bc3a6febb592Mudumba Ananth 217f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao case BT_VND_OP_EPILOG: 218f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao { 219f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#if (HW_END_WITH_HCI_RESET == FALSE) 220f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao if (bt_vendor_cbacks) 221f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao { 222f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao bt_vendor_cbacks->epilog_cb(BT_VND_OP_RESULT_SUCCESS); 223f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao } 224f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#else 225f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao hw_epilog_process(); 226f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#endif 227f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao } 228f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao break; 229ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville } 230ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 231ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville return retval; 232ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville} 233ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 234ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/** Closes the interface */ 235ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic void cleanup( void ) 236ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{ 237ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville BTVNDDBG("cleanup"); 238ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 239ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville upio_cleanup(); 240ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 241ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville bt_vendor_cbacks = NULL; 242ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville} 243ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville 244ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville// Entry point of DLib 245ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleconst bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = { 246ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville sizeof(bt_vendor_interface_t), 247ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville init, 248ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville op, 249ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville cleanup 250ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}; 251