Home | History | Annotate | Download | only in main
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2009-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  Filename:      bte_main.c
     22  *
     23  *  Description:   Contains BTE core stack initialization and shutdown code
     24  *
     25  ******************************************************************************/
     26 #include <fcntl.h>
     27 #include <stdlib.h>
     28 #include <assert.h>
     29 #include <signal.h>
     30 #include <time.h>
     31 #include <hardware/bluetooth.h>
     32 
     33 #include "gki.h"
     34 #include "bd.h"
     35 #include "btu.h"
     36 #include "bte.h"
     37 #include "bta_api.h"
     38 #include "bt_hci_lib.h"
     39 
     40 /*******************************************************************************
     41 **  Constants & Macros
     42 *******************************************************************************/
     43 
     44 /* Run-time configuration file */
     45 #ifndef BTE_STACK_CONF_FILE
     46 #define BTE_STACK_CONF_FILE "/etc/bluetooth/bt_stack.conf"
     47 #endif
     48 
     49 /* if not specified in .txt file then use this as default  */
     50 #ifndef HCI_LOGGING_FILENAME
     51 #define HCI_LOGGING_FILENAME  "/data/misc/bluedroid/btsnoop_hci.log"
     52 #endif
     53 
     54 /* Stack preload process timeout period  */
     55 #ifndef PRELOAD_START_TIMEOUT_MS
     56 #define PRELOAD_START_TIMEOUT_MS 3000  // 3 seconds
     57 #endif
     58 
     59 /* Stack preload process maximum retry attempts  */
     60 #ifndef PRELOAD_MAX_RETRY_ATTEMPTS
     61 #define PRELOAD_MAX_RETRY_ATTEMPTS 0
     62 #endif
     63 
     64 /*******************************************************************************
     65 **  Local type definitions
     66 *******************************************************************************/
     67 /* Preload retry control block */
     68 typedef struct
     69 {
     70     int     retry_counts;
     71     BOOLEAN timer_created;
     72     timer_t timer_id;
     73 } bt_preload_retry_cb_t;
     74 
     75 /******************************************************************************
     76 **  Variables
     77 ******************************************************************************/
     78 BOOLEAN hci_logging_enabled = FALSE;    /* by default, turn hci log off */
     79 BOOLEAN hci_logging_config = FALSE;    /* configured from bluetooth framework */
     80 char hci_logfile[256] = HCI_LOGGING_FILENAME;
     81 
     82 
     83 /*******************************************************************************
     84 **  Static variables
     85 *******************************************************************************/
     86 static bt_hc_interface_t *bt_hc_if=NULL;
     87 static const bt_hc_callbacks_t hc_callbacks;
     88 static BOOLEAN lpm_enabled = FALSE;
     89 static bt_preload_retry_cb_t preload_retry_cb;
     90 
     91 /*******************************************************************************
     92 **  Static functions
     93 *******************************************************************************/
     94 static void bte_main_in_hw_init(void);
     95 static void bte_hci_enable(void);
     96 static void bte_hci_disable(void);
     97 static void preload_start_wait_timer(void);
     98 static void preload_stop_wait_timer(void);
     99 
    100 /*******************************************************************************
    101 **  Externs
    102 *******************************************************************************/
    103 BTU_API extern UINT32 btu_task (UINT32 param);
    104 BTU_API extern void BTE_Init (void);
    105 BT_API extern void BTE_LoadStack(void);
    106 BT_API void BTE_UnloadStack(void);
    107 extern void scru_flip_bda (BD_ADDR dst, const BD_ADDR src);
    108 extern void bte_load_conf(const char *p_path);
    109 extern bt_bdaddr_t btif_local_bd_addr;
    110 
    111 
    112 /*******************************************************************************
    113 **                        System Task Configuration
    114 *******************************************************************************/
    115 
    116 /* bluetooth protocol stack (BTU) task */
    117 #ifndef BTE_BTU_STACK_SIZE
    118 #define BTE_BTU_STACK_SIZE       0//0x2000         /* In bytes */
    119 #endif
    120 #define BTE_BTU_TASK_STR        ((INT8 *) "BTU")
    121 UINT32 bte_btu_stack[(BTE_BTU_STACK_SIZE + 3) / 4];
    122 
    123 /******************************************************************************
    124 **
    125 ** Function         bte_main_in_hw_init
    126 **
    127 ** Description      Internal helper function for chip hardware init
    128 **
    129 ** Returns          None
    130 **
    131 ******************************************************************************/
    132 static void bte_main_in_hw_init(void)
    133 {
    134     if ( (bt_hc_if = (bt_hc_interface_t *) bt_hc_get_interface()) \
    135          == NULL)
    136     {
    137         APPL_TRACE_ERROR0("!!! Failed to get BtHostControllerInterface !!!");
    138     }
    139 
    140     memset(&preload_retry_cb, 0, sizeof(bt_preload_retry_cb_t));
    141 }
    142 
    143 /******************************************************************************
    144 **
    145 ** Function         bte_main_boot_entry
    146 **
    147 ** Description      BTE MAIN API - Entry point for BTE chip/stack initialization
    148 **
    149 ** Returns          None
    150 **
    151 ******************************************************************************/
    152 void bte_main_boot_entry(void)
    153 {
    154     /* initialize OS */
    155     GKI_init();
    156 
    157     bte_main_in_hw_init();
    158 
    159     bte_load_conf(BTE_STACK_CONF_FILE);
    160 
    161 #if (BTTRC_INCLUDED == TRUE)
    162     /* Initialize trace feature */
    163     BTTRC_TraceInit(MAX_TRACE_RAM_SIZE, &BTE_TraceLogBuf[0], BTTRC_METHOD_RAM);
    164 #endif
    165 }
    166 
    167 /******************************************************************************
    168 **
    169 ** Function         bte_main_shutdown
    170 **
    171 ** Description      BTE MAIN API - Shutdown code for BTE chip/stack
    172 **
    173 ** Returns          None
    174 **
    175 ******************************************************************************/
    176 void bte_main_shutdown()
    177 {
    178     GKI_shutdown();
    179 }
    180 
    181 /******************************************************************************
    182 **
    183 ** Function         bte_main_enable
    184 **
    185 ** Description      BTE MAIN API - Creates all the BTE tasks. Should be called
    186 **                  part of the Bluetooth stack enable sequence
    187 **
    188 ** Returns          None
    189 **
    190 ******************************************************************************/
    191 void bte_main_enable()
    192 {
    193     APPL_TRACE_DEBUG1("%s", __FUNCTION__);
    194 
    195     /* Initialize BTE control block */
    196     BTE_Init();
    197 
    198     lpm_enabled = FALSE;
    199 
    200     bte_hci_enable();
    201 
    202     GKI_create_task((TASKPTR)btu_task, BTU_TASK, BTE_BTU_TASK_STR,
    203                     (UINT16 *) ((UINT8 *)bte_btu_stack + BTE_BTU_STACK_SIZE),
    204                     sizeof(bte_btu_stack));
    205 
    206     GKI_run(0);
    207 }
    208 
    209 /******************************************************************************
    210 **
    211 ** Function         bte_main_disable
    212 **
    213 ** Description      BTE MAIN API - Destroys all the BTE tasks. Should be called
    214 **                  part of the Bluetooth stack disable sequence
    215 **
    216 ** Returns          None
    217 **
    218 ******************************************************************************/
    219 void bte_main_disable(void)
    220 {
    221     APPL_TRACE_DEBUG1("%s", __FUNCTION__);
    222 
    223     preload_stop_wait_timer();
    224     bte_hci_disable();
    225     GKI_destroy_task(BTU_TASK);
    226     GKI_freeze();
    227 }
    228 
    229 /******************************************************************************
    230 **
    231 ** Function         bte_main_config_hci_logging
    232 **
    233 ** Description      enable or disable HIC snoop logging
    234 **
    235 ** Returns          None
    236 **
    237 ******************************************************************************/
    238 void bte_main_config_hci_logging(BOOLEAN enable, BOOLEAN bt_disabled)
    239 {
    240     int old = (hci_logging_enabled == TRUE) || (hci_logging_config == TRUE);
    241     int new;
    242 
    243     if (enable) {
    244         hci_logging_config = TRUE;
    245     } else {
    246         hci_logging_config = FALSE;
    247     }
    248 
    249     new = (hci_logging_enabled == TRUE) || (hci_logging_config == TRUE);
    250 
    251     if ((old == new) || bt_disabled || (bt_hc_if == NULL)) {
    252         return;
    253     }
    254 
    255     bt_hc_if->logging(new ? BT_HC_LOGGING_ON : BT_HC_LOGGING_OFF, hci_logfile);
    256 }
    257 
    258 /******************************************************************************
    259 **
    260 ** Function         bte_hci_enable
    261 **
    262 ** Description      Enable HCI & Vendor modules
    263 **
    264 ** Returns          None
    265 **
    266 ******************************************************************************/
    267 static void bte_hci_enable(void)
    268 {
    269     APPL_TRACE_DEBUG1("%s", __FUNCTION__);
    270 
    271     preload_start_wait_timer();
    272 
    273     if (bt_hc_if)
    274     {
    275         int result = bt_hc_if->init(&hc_callbacks, btif_local_bd_addr.address);
    276         APPL_TRACE_EVENT1("libbt-hci init returns %d", result);
    277 
    278         assert(result == BT_HC_STATUS_SUCCESS);
    279 
    280         if (hci_logging_enabled == TRUE || hci_logging_config == TRUE)
    281             bt_hc_if->logging(BT_HC_LOGGING_ON, hci_logfile);
    282 
    283 #if (defined (BT_CLEAN_TURN_ON_DISABLED) && BT_CLEAN_TURN_ON_DISABLED == TRUE)
    284         APPL_TRACE_DEBUG1("%s  Not Turninig Off the BT before Turninig ON", __FUNCTION__);
    285 
    286         /* Do not power off the chip before powering on  if BT_CLEAN_TURN_ON_DISABLED flag
    287          is defined and set to TRUE to avoid below mentioned issue.
    288 
    289          Wingray kernel driver maintains a combined  counter to keep track of
    290          BT-Wifi state. Invoking  set_power(BT_HC_CHIP_PWR_OFF) when the BT is already
    291          in OFF state causes this counter to be incorrectly decremented and results in undesired
    292          behavior of the chip.
    293 
    294          This is only a workaround and when the issue is fixed in the kernel this work around
    295          should be removed. */
    296 #else
    297         /* toggle chip power to ensure we will reset chip in case
    298            a previous stack shutdown wasn't completed gracefully */
    299         bt_hc_if->set_power(BT_HC_CHIP_PWR_OFF);
    300 #endif
    301         bt_hc_if->set_power(BT_HC_CHIP_PWR_ON);
    302 
    303         bt_hc_if->preload(NULL);
    304     }
    305 }
    306 
    307 /******************************************************************************
    308 **
    309 ** Function         bte_hci_disable
    310 **
    311 ** Description      Disable HCI & Vendor modules
    312 **
    313 ** Returns          None
    314 **
    315 ******************************************************************************/
    316 static void bte_hci_disable(void)
    317 {
    318     APPL_TRACE_DEBUG1("%s", __FUNCTION__);
    319 
    320     if (bt_hc_if)
    321     {
    322         bt_hc_if->cleanup();
    323         bt_hc_if->set_power(BT_HC_CHIP_PWR_OFF);
    324         if (hci_logging_enabled == TRUE ||  hci_logging_config == TRUE)
    325             bt_hc_if->logging(BT_HC_LOGGING_OFF, hci_logfile);
    326     }
    327 }
    328 
    329 /*******************************************************************************
    330 **
    331 ** Function        preload_wait_timeout
    332 **
    333 ** Description     Timeout thread of preload watchdog timer
    334 **
    335 ** Returns         None
    336 **
    337 *******************************************************************************/
    338 static void preload_wait_timeout(union sigval arg)
    339 {
    340     APPL_TRACE_ERROR2("...preload_wait_timeout (retried:%d/max-retry:%d)...",
    341                         preload_retry_cb.retry_counts,
    342                         PRELOAD_MAX_RETRY_ATTEMPTS);
    343 
    344     if (preload_retry_cb.retry_counts++ < PRELOAD_MAX_RETRY_ATTEMPTS)
    345     {
    346         bte_hci_disable();
    347         GKI_delay(100);
    348         bte_hci_enable();
    349     }
    350     else
    351     {
    352         /* Notify BTIF_TASK that the init procedure had failed*/
    353         GKI_send_event(BTIF_TASK, BT_EVT_HARDWARE_INIT_FAIL);
    354     }
    355 }
    356 
    357 /*******************************************************************************
    358 **
    359 ** Function        preload_start_wait_timer
    360 **
    361 ** Description     Launch startup watchdog timer
    362 **
    363 ** Returns         None
    364 **
    365 *******************************************************************************/
    366 static void preload_start_wait_timer(void)
    367 {
    368     int status;
    369     struct itimerspec ts;
    370     struct sigevent se;
    371     UINT32 timeout_ms = PRELOAD_START_TIMEOUT_MS;
    372 
    373     if (preload_retry_cb.timer_created == FALSE)
    374     {
    375         se.sigev_notify = SIGEV_THREAD;
    376         se.sigev_value.sival_ptr = &preload_retry_cb.timer_id;
    377         se.sigev_notify_function = preload_wait_timeout;
    378         se.sigev_notify_attributes = NULL;
    379 
    380         status = timer_create(CLOCK_MONOTONIC, &se, &preload_retry_cb.timer_id);
    381 
    382         if (status == 0)
    383             preload_retry_cb.timer_created = TRUE;
    384     }
    385 
    386     if (preload_retry_cb.timer_created == TRUE)
    387     {
    388         ts.it_value.tv_sec = timeout_ms/1000;
    389         ts.it_value.tv_nsec = 1000000*(timeout_ms%1000);
    390         ts.it_interval.tv_sec = 0;
    391         ts.it_interval.tv_nsec = 0;
    392 
    393         status = timer_settime(preload_retry_cb.timer_id, 0, &ts, 0);
    394         if (status == -1)
    395             APPL_TRACE_ERROR0("Failed to fire preload watchdog timer");
    396     }
    397 }
    398 
    399 /*******************************************************************************
    400 **
    401 ** Function        preload_stop_wait_timer
    402 **
    403 ** Description     Stop preload watchdog timer
    404 **
    405 ** Returns         None
    406 **
    407 *******************************************************************************/
    408 static void preload_stop_wait_timer(void)
    409 {
    410     if (preload_retry_cb.timer_created == TRUE)
    411     {
    412         timer_delete(preload_retry_cb.timer_id);
    413         preload_retry_cb.timer_created = FALSE;
    414     }
    415 }
    416 
    417 /******************************************************************************
    418 **
    419 ** Function         bte_main_postload_cfg
    420 **
    421 ** Description      BTE MAIN API - Stack postload configuration
    422 **
    423 ** Returns          None
    424 **
    425 ******************************************************************************/
    426 void bte_main_postload_cfg(void)
    427 {
    428     if (bt_hc_if)
    429         bt_hc_if->postload(NULL);
    430 }
    431 
    432 #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
    433 /******************************************************************************
    434 **
    435 ** Function         bte_main_enable_lpm
    436 **
    437 ** Description      BTE MAIN API - Enable/Disable low power mode operation
    438 **
    439 ** Returns          None
    440 **
    441 ******************************************************************************/
    442 void bte_main_enable_lpm(BOOLEAN enable)
    443 {
    444     int result = -1;
    445 
    446     if (bt_hc_if)
    447         result = bt_hc_if->lpm( \
    448         (enable == TRUE) ? BT_HC_LPM_ENABLE : BT_HC_LPM_DISABLE \
    449         );
    450 
    451     APPL_TRACE_EVENT2("HC lib lpm enable=%d return %d", enable, result);
    452 }
    453 
    454 /******************************************************************************
    455 **
    456 ** Function         bte_main_lpm_allow_bt_device_sleep
    457 **
    458 ** Description      BTE MAIN API - Allow BT controller goest to sleep
    459 **
    460 ** Returns          None
    461 **
    462 ******************************************************************************/
    463 void bte_main_lpm_allow_bt_device_sleep()
    464 {
    465     int result = -1;
    466 
    467     if ((bt_hc_if) && (lpm_enabled == TRUE))
    468         result = bt_hc_if->lpm(BT_HC_LPM_WAKE_DEASSERT);
    469 
    470     APPL_TRACE_DEBUG1("HC lib lpm deassertion return %d", result);
    471 }
    472 
    473 /******************************************************************************
    474 **
    475 ** Function         bte_main_lpm_wake_bt_device
    476 **
    477 ** Description      BTE MAIN API - Wake BT controller up if it is in sleep mode
    478 **
    479 ** Returns          None
    480 **
    481 ******************************************************************************/
    482 void bte_main_lpm_wake_bt_device()
    483 {
    484     int result = -1;
    485 
    486     if ((bt_hc_if) && (lpm_enabled == TRUE))
    487         result = bt_hc_if->lpm(BT_HC_LPM_WAKE_ASSERT);
    488 
    489     APPL_TRACE_DEBUG1("HC lib lpm assertion return %d", result);
    490 }
    491 #endif  // HCILP_INCLUDED
    492 
    493 /******************************************************************************
    494 **
    495 ** Function         bte_main_hci_send
    496 **
    497 ** Description      BTE MAIN API - This function is called by the upper stack to
    498 **                  send an HCI message. The function displays a protocol trace
    499 **                  message (if enabled), and then calls the 'transmit' function
    500 **                  associated with the currently selected HCI transport
    501 **
    502 ** Returns          None
    503 **
    504 ******************************************************************************/
    505 void bte_main_hci_send (BT_HDR *p_msg, UINT16 event)
    506 {
    507     UINT16 sub_event = event & BT_SUB_EVT_MASK;  /* local controller ID */
    508 
    509     p_msg->event = event;
    510 
    511 
    512     if((sub_event == LOCAL_BR_EDR_CONTROLLER_ID) || \
    513        (sub_event == LOCAL_BLE_CONTROLLER_ID))
    514     {
    515         if (bt_hc_if)
    516             bt_hc_if->transmit_buf((TRANSAC)p_msg, \
    517                                        (char *) (p_msg + 1), \
    518                                         p_msg->len);
    519         else
    520             GKI_freebuf(p_msg);
    521     }
    522     else
    523     {
    524         APPL_TRACE_ERROR0("Invalid Controller ID. Discarding message.");
    525         GKI_freebuf(p_msg);
    526     }
    527 }
    528 
    529 /******************************************************************************
    530 **
    531 ** Function         bte_main_post_reset_init
    532 **
    533 ** Description      BTE MAIN API - This function is mapped to BTM_APP_DEV_INIT
    534 **                  and shall be automatically called from BTE after HCI_Reset
    535 **
    536 ** Returns          None
    537 **
    538 ******************************************************************************/
    539 void bte_main_post_reset_init()
    540 {
    541     BTM_ContinueReset();
    542 }
    543 
    544 /*****************************************************************************
    545 **
    546 **   libbt-hci Callback Functions
    547 **
    548 *****************************************************************************/
    549 
    550 /******************************************************************************
    551 **
    552 ** Function         preload_cb
    553 **
    554 ** Description      HOST/CONTROLLER LIB CALLBACK API - This function is called
    555 **                  when the libbt-hci completed stack preload process
    556 **
    557 ** Returns          None
    558 **
    559 ******************************************************************************/
    560 static void preload_cb(TRANSAC transac, bt_hc_preload_result_t result)
    561 {
    562     APPL_TRACE_EVENT1("HC preload_cb %d [0:SUCCESS 1:FAIL]", result);
    563 
    564 
    565     if (result == BT_HC_PRELOAD_SUCCESS)
    566     {
    567         preload_stop_wait_timer();
    568 
    569         /* notify BTU task that libbt-hci is ready */
    570         GKI_send_event(BTU_TASK, BT_EVT_PRELOAD_CMPL);
    571     }
    572 }
    573 
    574 /******************************************************************************
    575 **
    576 ** Function         postload_cb
    577 **
    578 ** Description      HOST/CONTROLLER LIB CALLBACK API - This function is called
    579 **                  when the libbt-hci lib completed stack postload process
    580 **
    581 ** Returns          None
    582 **
    583 ******************************************************************************/
    584 static void postload_cb(TRANSAC transac, bt_hc_postload_result_t result)
    585 {
    586     APPL_TRACE_EVENT1("HC postload_cb %d", result);
    587 }
    588 
    589 /******************************************************************************
    590 **
    591 ** Function         lpm_cb
    592 **
    593 ** Description      HOST/CONTROLLER LIB CALLBACK API - This function is called
    594 **                  back from the libbt-hci to indicate the current LPM state
    595 **
    596 ** Returns          None
    597 **
    598 ******************************************************************************/
    599 static void lpm_cb(bt_hc_lpm_request_result_t result)
    600 {
    601     APPL_TRACE_EVENT1("HC lpm_result_cb %d", result);
    602     lpm_enabled = (result == BT_HC_LPM_ENABLED) ? TRUE : FALSE;
    603 }
    604 
    605 /******************************************************************************
    606 **
    607 ** Function         hostwake_ind
    608 **
    609 ** Description      HOST/CONTROLLER LIB CALLOUT API - This function is called
    610 **                  from the libbt-hci to indicate the HostWake event
    611 **
    612 ** Returns          None
    613 **
    614 ******************************************************************************/
    615 static void hostwake_ind(bt_hc_low_power_event_t event)
    616 {
    617     APPL_TRACE_EVENT1("HC hostwake_ind %d", event);
    618 }
    619 
    620 /******************************************************************************
    621 **
    622 ** Function         alloc
    623 **
    624 ** Description      HOST/CONTROLLER LIB CALLOUT API - This function is called
    625 **                  from the libbt-hci to request for data buffer allocation
    626 **
    627 ** Returns          NULL / pointer to allocated buffer
    628 **
    629 ******************************************************************************/
    630 static char *alloc(int size)
    631 {
    632     BT_HDR *p_hdr = NULL;
    633 
    634     /*
    635     APPL_TRACE_DEBUG1("HC alloc size=%d", size);
    636     */
    637 
    638     p_hdr = (BT_HDR *) GKI_getbuf ((UINT16) size);
    639 
    640     if (p_hdr == NULL)
    641     {
    642         APPL_TRACE_WARNING0("alloc returns NO BUFFER!");
    643     }
    644 
    645     return ((char *) p_hdr);
    646 }
    647 
    648 /******************************************************************************
    649 **
    650 ** Function         dealloc
    651 **
    652 ** Description      HOST/CONTROLLER LIB CALLOUT API - This function is called
    653 **                  from the libbt-hci to release the data buffer allocated
    654 **                  through the alloc call earlier
    655 **
    656 **                  Bluedroid libbt-hci library uses 'transac' parameter to
    657 **                  pass data-path buffer/packet across bt_hci_lib interface
    658 **                  boundary. The 'p_buf' is not intended to be used here
    659 **                  but might point to data portion of data-path buffer.
    660 **
    661 ** Returns          bt_hc_status_t
    662 **
    663 ******************************************************************************/
    664 static int dealloc(TRANSAC transac, char *p_buf)
    665 {
    666     GKI_freebuf(transac);
    667     return BT_HC_STATUS_SUCCESS;
    668 }
    669 
    670 /******************************************************************************
    671 **
    672 ** Function         data_ind
    673 **
    674 ** Description      HOST/CONTROLLER LIB CALLOUT API - This function is called
    675 **                  from the libbt-hci to pass in the received HCI packets
    676 **
    677 **                  The core stack is responsible for releasing the data buffer
    678 **                  passed in from the libbt-hci once the core stack has done
    679 **                  with it.
    680 **
    681 **                  Bluedroid libbt-hci library uses 'transac' parameter to
    682 **                  pass data-path buffer/packet across bt_hci_lib interface
    683 **                  boundary. The 'p_buf' and 'len' parameters are not intended
    684 **                  to be used here but might point to data portion in data-
    685 **                  path buffer and length of valid data respectively.
    686 **
    687 ** Returns          bt_hc_status_t
    688 **
    689 ******************************************************************************/
    690 static int data_ind(TRANSAC transac, char *p_buf, int len)
    691 {
    692     BT_HDR *p_msg = (BT_HDR *) transac;
    693 
    694     /*
    695     APPL_TRACE_DEBUG2("HC data_ind event=0x%04X (len=%d)", p_msg->event, len);
    696     */
    697 
    698     GKI_send_msg (BTU_TASK, BTU_HCI_RCV_MBOX, transac);
    699     return BT_HC_STATUS_SUCCESS;
    700 }
    701 
    702 /******************************************************************************
    703 **
    704 ** Function         tx_result
    705 **
    706 ** Description      HOST/CONTROLLER LIB CALLBACK API - This function is called
    707 **                  from the libbt-hci once it has processed/sent the prior data
    708 **                  buffer which core stack passed to it through transmit_buf
    709 **                  call earlier.
    710 **
    711 **                  The core stack is responsible for releasing the data buffer
    712 **                  if it has been completedly processed.
    713 **
    714 **                  Bluedroid libbt-hci library uses 'transac' parameter to
    715 **                  pass data-path buffer/packet across bt_hci_lib interface
    716 **                  boundary. The 'p_buf' is not intended to be used here
    717 **                  but might point to data portion in data-path buffer.
    718 **
    719 ** Returns          bt_hc_status_t
    720 **
    721 ******************************************************************************/
    722 static int tx_result(TRANSAC transac, char *p_buf, \
    723                       bt_hc_transmit_result_t result)
    724 {
    725     /*
    726     APPL_TRACE_DEBUG2("HC tx_result %d (event=%04X)", result, \
    727                       ((BT_HDR *)transac)->event);
    728     */
    729 
    730     if (result == BT_HC_TX_FRAGMENT)
    731     {
    732         GKI_send_msg (BTU_TASK, BTU_HCI_RCV_MBOX, transac);
    733     }
    734     else
    735     {
    736         GKI_freebuf(transac);
    737     }
    738 
    739     return BT_HC_STATUS_SUCCESS;
    740 }
    741 
    742 /*****************************************************************************
    743 **   The libbt-hci Callback Functions Table
    744 *****************************************************************************/
    745 static const bt_hc_callbacks_t hc_callbacks = {
    746     sizeof(bt_hc_callbacks_t),
    747     preload_cb,
    748     postload_cb,
    749     lpm_cb,
    750     hostwake_ind,
    751     alloc,
    752     dealloc,
    753     data_ind,
    754     tx_result
    755 };
    756 
    757