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>
30ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "bt_vendor_brcm.h"
31ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "upio.h"
32ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "userial_vendor.h"
33ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
34ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#ifndef BTVND_DBG
35ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define BTVND_DBG FALSE
36ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
37ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
38ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (BTVND_DBG == TRUE)
39ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define BTVNDDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);}
40ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#else
41ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define BTVNDDBG(param, ...) {}
42ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
43ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
44ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
45ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Externs
46ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
47ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
48ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid hw_config_start(void);
49ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleuint8_t hw_lpm_enable(uint8_t turn_on);
50ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleuint32_t hw_lpm_get_idle_timeout(void);
51ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid hw_lpm_set_wake_state(uint8_t wake_assert);
52ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (SCO_CFG_INCLUDED == TRUE)
53ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid hw_sco_config(void);
54ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
55ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid vnd_load_conf(const char *p_path);
56f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#if (HW_END_WITH_HCI_RESET == TRUE)
57f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chaovoid hw_epilog_process(void);
58f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#endif
59ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
60ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
61ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Variables
62ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
63ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
64ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillebt_vendor_callbacks_t *bt_vendor_cbacks = NULL;
65ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleuint8_t vnd_local_bd_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
66ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
67ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
68ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Local type definitions
69ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
70ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
71ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
72ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Static Variables
73ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
74ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
75ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic const tUSERIAL_CFG userial_init_cfg =
76ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
77ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1),
78ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    USERIAL_BAUD_115200
79ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville};
80ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
81ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
82ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Functions
83ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
84ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
85ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*****************************************************************************
86ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
87ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**   BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS
88ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
89ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*****************************************************************************/
90ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
91ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr)
92ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
93ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGI("init");
94ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
95ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if (p_cb == NULL)
96ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
97ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ALOGE("init failed with no user callbacks!");
98ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        return -1;
99ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
100ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
101ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE)
102ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGW("*****************************************************************");
103ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGW("*****************************************************************");
104ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGW("** Warning - BT Vendor Lib is loaded in debug tuning mode!");
105ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGW("**");
106ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGW("** If this is not intentional, rebuild libbt-vendor.so ");
107ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGW("** with VENDOR_LIB_RUNTIME_TUNING_ENABLED=FALSE and ");
108ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGW("** check if any run-time tuning parameters needed to be");
109ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGW("** carried to the build-time configuration accordingly.");
110ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGW("*****************************************************************");
111ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGW("*****************************************************************");
112ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
113ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
114ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    userial_vendor_init();
115ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    upio_init();
116ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
117ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    vnd_load_conf(VENDOR_LIB_CONF_FILE);
118ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
119ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    /* store reference to user callbacks */
120ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb;
121ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
122ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    /* This is handed over from the stack */
123ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    memcpy(vnd_local_bd_addr, local_bdaddr, 6);
124ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
125ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    return 0;
126ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
127ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
128ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
129ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/** Requested operations */
130ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic int op(bt_vendor_opcode_t opcode, void *param)
131ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
132ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    int retval = 0;
133ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
134ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    BTVNDDBG("op for %d", opcode);
135ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
136ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    switch(opcode)
137ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
138ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case BT_VND_OP_POWER_CTRL:
139ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
140ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                int *state = (int *) param;
141ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                if (*state == BT_VND_PWR_OFF)
142ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                    upio_set_bluetooth_power(UPIO_BT_POWER_OFF);
143ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                else if (*state == BT_VND_PWR_ON)
144ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                    upio_set_bluetooth_power(UPIO_BT_POWER_ON);
145ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
146ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
147ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
148ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case BT_VND_OP_FW_CFG:
149ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
150ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                hw_config_start();
151ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
152ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
153ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
154ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case BT_VND_OP_SCO_CFG:
155ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
156ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (SCO_CFG_INCLUDED == TRUE)
157ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                hw_sco_config();
158ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#else
159ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                retval = -1;
160ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
161ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
162ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
163ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
164ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case BT_VND_OP_USERIAL_OPEN:
165ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
166ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                int (*fd_array)[] = (int (*)[]) param;
167ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                int fd, idx;
168ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg);
169ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                if (fd != -1)
170ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                {
171ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                    for (idx=0; idx < CH_MAX; idx++)
172ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                        (*fd_array)[idx] = fd;
173ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
174ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                    retval = 1;
175ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                }
176ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                /* retval contains numbers of open fd of HCI channels */
177ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
178ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
179ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
180ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case BT_VND_OP_USERIAL_CLOSE:
181ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
182ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                userial_vendor_close();
183ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
184ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
185ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
186ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case BT_VND_OP_GET_LPM_IDLE_TIMEOUT:
187ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
188ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                uint32_t *timeout_ms = (uint32_t *) param;
189ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                *timeout_ms = hw_lpm_get_idle_timeout();
190ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
191ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
192ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
193ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case BT_VND_OP_LPM_SET_MODE:
194ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
195ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                uint8_t *mode = (uint8_t *) param;
196ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                retval = hw_lpm_enable(*mode);
197ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
198ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
199ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
200ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        case BT_VND_OP_LPM_WAKE_SET_STATE:
201ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
202ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                uint8_t *state = (uint8_t *) param;
20378e7dccc08db81cc95810dc928d956ecf7199853YK Jeffrey Chao                uint8_t wake_assert = (*state == BT_VND_LPM_WAKE_ASSERT) ? \
204ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                                        TRUE : FALSE;
205ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
206ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                hw_lpm_set_wake_state(wake_assert);
207ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
208ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            break;
209f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao
210f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao        case BT_VND_OP_EPILOG:
211f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao            {
212f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#if (HW_END_WITH_HCI_RESET == FALSE)
213f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao                if (bt_vendor_cbacks)
214f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao                {
215f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao                    bt_vendor_cbacks->epilog_cb(BT_VND_OP_RESULT_SUCCESS);
216f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao                }
217f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#else
218f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao                hw_epilog_process();
219f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao#endif
220f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao            }
221f219785e8a4e011abe5488d22f3d72b6698ce45aYK Jeffrey Chao            break;
222ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
223ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
224ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    return retval;
225ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
226ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
227ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/** Closes the interface */
228ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic void cleanup( void )
229ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
230ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    BTVNDDBG("cleanup");
231ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
232ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    upio_cleanup();
233ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
234ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    bt_vendor_cbacks = NULL;
235ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
236ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
237ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville// Entry point of DLib
238ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleconst bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {
239ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    sizeof(bt_vendor_interface_t),
240ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    init,
241ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    op,
242ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    cleanup
243ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville};
244