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