Home | History | Annotate | Download | only in src
      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:      hci_h4.c
     22  *
     23  *  Description:   Contains HCI transport send/receive functions
     24  *
     25  ******************************************************************************/
     26 
     27 #define LOG_TAG "bt_h4"
     28 
     29 #include <utils/Log.h>
     30 #include <stdlib.h>
     31 #include <fcntl.h>
     32 #include "bt_hci_bdroid.h"
     33 #include "hci.h"
     34 #include "userial.h"
     35 #include "utils.h"
     36 
     37 /******************************************************************************
     38 **  Constants & Macros
     39 ******************************************************************************/
     40 
     41 #ifndef HCI_DBG
     42 #define HCI_DBG FALSE
     43 #endif
     44 
     45 #if (HCI_DBG == TRUE)
     46 #define HCIDBG(param, ...) {LOGD(param, ## __VA_ARGS__);}
     47 #else
     48 #define HCIDBG(param, ...) {}
     49 #endif
     50 
     51 /* Preamble length for HCI Commands:
     52 **      2-bytes for opcode and 1 byte for length
     53 */
     54 #define HCI_CMD_PREAMBLE_SIZE   3
     55 
     56 /* Preamble length for HCI Events:
     57 **      1-byte for opcode and 1 byte for length
     58 */
     59 #define HCI_EVT_PREAMBLE_SIZE   2
     60 
     61 /* Preamble length for SCO Data:
     62 **      2-byte for Handle and 1 byte for length
     63 */
     64 #define HCI_SCO_PREAMBLE_SIZE   3
     65 
     66 /* Preamble length for ACL Data:
     67 **      2-byte for Handle and 2 byte for length
     68 */
     69 #define HCI_ACL_PREAMBLE_SIZE   4
     70 
     71 /* Table of HCI preamble sizes for the different HCI message types */
     72 static const uint8_t hci_preamble_table[] =
     73 {
     74     HCI_CMD_PREAMBLE_SIZE,
     75     HCI_ACL_PREAMBLE_SIZE,
     76     HCI_SCO_PREAMBLE_SIZE,
     77     HCI_EVT_PREAMBLE_SIZE
     78 };
     79 
     80 /* HCI H4 message type definitions */
     81 #define H4_TYPE_COMMAND         1
     82 #define H4_TYPE_ACL_DATA        2
     83 #define H4_TYPE_SCO_DATA        3
     84 #define H4_TYPE_EVENT           4
     85 
     86 static const uint16_t msg_evt_table[] =
     87 {
     88     MSG_HC_TO_STACK_HCI_ERR,       /* H4_TYPE_COMMAND */
     89     MSG_HC_TO_STACK_HCI_ACL,       /* H4_TYPE_ACL_DATA */
     90     MSG_HC_TO_STACK_HCI_SCO,       /* H4_TYPE_SCO_DATA */
     91     MSG_HC_TO_STACK_HCI_EVT        /* H4_TYPE_EVENT */
     92 };
     93 
     94 #define ACL_RX_PKT_START        2
     95 #define ACL_RX_PKT_CONTINUE     1
     96 #define L2CAP_HEADER_SIZE       4
     97 
     98 /* Maximum numbers of allowed internal
     99 ** outstanding command packets at any time
    100 */
    101 #define INT_CMD_PKT_MAX_COUNT       8
    102 #define INT_CMD_PKT_IDX_MASK        0x07
    103 
    104 #define HCI_COMMAND_COMPLETE_EVT    0x0E
    105 #define HCI_COMMAND_STATUS_EVT      0x0F
    106 #define HCI_READ_BUFFER_SIZE        0x1005
    107 #define HCI_LE_READ_BUFFER_SIZE     0x2002
    108 
    109 /******************************************************************************
    110 **  Local type definitions
    111 ******************************************************************************/
    112 
    113 /* H4 Rx States */
    114 typedef enum {
    115     H4_RX_MSGTYPE_ST,
    116     H4_RX_LEN_ST,
    117     H4_RX_DATA_ST,
    118     H4_RX_IGNORE_ST
    119 } tHCI_H4_RCV_STATE;
    120 
    121 /* Callback function for the returned event of internal issued command */
    122 typedef void (*tINT_CMD_CBACK)(void *p_mem);
    123 
    124 typedef struct
    125 {
    126     uint16_t opcode;        /* OPCODE of outstanding internal commands */
    127     tINT_CMD_CBACK cback;   /* Callback function when return of internal
    128                              * command is received */
    129 } tINT_CMD_Q;
    130 
    131 /* Control block for HCISU_H4 */
    132 typedef struct
    133 {
    134     HC_BT_HDR *p_rcv_msg;          /* Buffer to hold current rx HCI message */
    135     uint16_t rcv_len;               /* Size of current incoming message */
    136     uint8_t rcv_msg_type;           /* Current incoming message type */
    137     tHCI_H4_RCV_STATE rcv_state;    /* Receive state of current rx message */
    138     uint16_t hc_acl_data_size;      /* Controller's max ACL data length */
    139     uint16_t hc_ble_acl_data_size;  /* Controller's max BLE ACL data length */
    140     BUFFER_Q acl_rx_q;      /* Queue of base buffers for fragmented ACL pkts */
    141     uint8_t preload_count;          /* Count numbers of preload bytes */
    142     uint8_t preload_buffer[6];      /* HCI_ACL_PREAMBLE_SIZE + 2 */
    143     int int_cmd_rsp_pending;        /* Num of internal cmds pending for ack */
    144     uint8_t int_cmd_rd_idx;         /* Read index of int_cmd_opcode queue */
    145     uint8_t int_cmd_wrt_idx;        /* Write index of int_cmd_opcode queue */
    146     tINT_CMD_Q int_cmd[INT_CMD_PKT_MAX_COUNT]; /* FIFO queue */
    147 } tHCI_H4_CB;
    148 
    149 /******************************************************************************
    150 **  Externs
    151 ******************************************************************************/
    152 
    153 extern BUFFER_Q tx_q;
    154 
    155 void btsnoop_init(void);
    156 void btsnoop_close(void);
    157 void btsnoop_cleanup (void);
    158 void btsnoop_capture(HC_BT_HDR *p_buf, uint8_t is_rcvd);
    159 uint8_t hci_h4_send_int_cmd(uint16_t opcode, HC_BT_HDR *p_buf, \
    160                                   tINT_CMD_CBACK p_cback);
    161 void lpm_wake_assert(void);
    162 void lpm_tx_done(uint8_t is_tx_done);
    163 
    164 /******************************************************************************
    165 **  Variables
    166 ******************************************************************************/
    167 
    168 /* Num of allowed outstanding HCI CMD packets */
    169 volatile int num_hci_cmd_pkts = 1;
    170 
    171 /******************************************************************************
    172 **  Static variables
    173 ******************************************************************************/
    174 
    175 static tHCI_H4_CB       h4_cb;
    176 
    177 /******************************************************************************
    178 **  Static functions
    179 ******************************************************************************/
    180 
    181 /*******************************************************************************
    182 **
    183 ** Function         get_acl_data_length_cback
    184 **
    185 ** Description      Callback function for HCI_READ_BUFFER_SIZE and
    186 **                  HCI_LE_READ_BUFFER_SIZE commands if they were sent because
    187 **                  of internal request.
    188 **
    189 ** Returns          None
    190 **
    191 *******************************************************************************/
    192 void get_acl_data_length_cback(void *p_mem)
    193 {
    194     uint8_t     *p, status;
    195     uint16_t    opcode, len=0;
    196     HC_BT_HDR   *p_buf = (HC_BT_HDR *) p_mem;
    197 
    198     p = (uint8_t *)(p_buf + 1) + 3;
    199     STREAM_TO_UINT16(opcode, p)
    200     status = *p++;
    201     if (status == 0) /* Success */
    202         STREAM_TO_UINT16(len, p)
    203 
    204     if (opcode == HCI_READ_BUFFER_SIZE)
    205     {
    206         if (status == 0)
    207             h4_cb.hc_acl_data_size = len;
    208 
    209         /* reuse the rx buffer for sending HCI_LE_READ_BUFFER_SIZE command */
    210         p_buf->event = MSG_STACK_TO_HC_HCI_CMD;
    211         p_buf->offset = 0;
    212         p_buf->layer_specific = 0;
    213         p_buf->len = 3;
    214 
    215         p = (uint8_t *) (p_buf + 1);
    216         UINT16_TO_STREAM(p, HCI_LE_READ_BUFFER_SIZE);
    217         *p = 0;
    218 
    219         if ((status = hci_h4_send_int_cmd(HCI_LE_READ_BUFFER_SIZE, p_buf, \
    220                                            get_acl_data_length_cback)) == FALSE)
    221         {
    222             bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
    223             bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_SUCCESS);
    224         }
    225     }
    226     else if (opcode == HCI_LE_READ_BUFFER_SIZE)
    227     {
    228         if (status == 0)
    229             h4_cb.hc_ble_acl_data_size = (len) ? len : h4_cb.hc_acl_data_size;
    230 
    231         if (bt_hc_cbacks)
    232         {
    233             bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
    234             ALOGE("vendor lib postload completed");
    235             bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_SUCCESS);
    236         }
    237     }
    238 }
    239 
    240 
    241 /*******************************************************************************
    242 **
    243 ** Function         internal_event_intercept
    244 **
    245 ** Description      This function is called to parse received HCI event and
    246 **                  - update the Num_HCI_Command_Packets
    247 **                  - intercept the event if it is the result of an early
    248 **                    issued internal command.
    249 **
    250 ** Returns          TRUE : if the event had been intercepted for internal process
    251 **                  FALSE : send this event to core stack
    252 **
    253 *******************************************************************************/
    254 uint8_t internal_event_intercept(void)
    255 {
    256     uint8_t     *p;
    257     uint8_t     event_code;
    258     uint16_t    opcode, len;
    259     tHCI_H4_CB  *p_cb = &h4_cb;
    260 
    261     p = (uint8_t *)(p_cb->p_rcv_msg + 1);
    262 
    263     event_code = *p++;
    264     len = *p++;
    265 
    266     if (event_code == HCI_COMMAND_COMPLETE_EVT)
    267     {
    268         num_hci_cmd_pkts = *p++;
    269 
    270         if (p_cb->int_cmd_rsp_pending > 0)
    271         {
    272             STREAM_TO_UINT16(opcode, p)
    273 
    274             if (opcode == p_cb->int_cmd[p_cb->int_cmd_rd_idx].opcode)
    275             {
    276                 HCIDBG( \
    277                 "Intercept CommandCompleteEvent for internal command (0x%04X)",\
    278                           opcode);
    279                 if (p_cb->int_cmd[p_cb->int_cmd_rd_idx].cback != NULL)
    280                 {
    281                     p_cb->int_cmd[p_cb->int_cmd_rd_idx].cback(p_cb->p_rcv_msg);
    282                 }
    283                 else
    284                 {
    285                     // Missing cback function!
    286                     // Release the p_rcv_msg buffer.
    287                     if (bt_hc_cbacks)
    288                     {
    289                         bt_hc_cbacks->dealloc((TRANSAC) p_cb->p_rcv_msg, \
    290                                               (char *) (p_cb->p_rcv_msg + 1));
    291                     }
    292                 }
    293                 p_cb->int_cmd_rd_idx = ((p_cb->int_cmd_rd_idx+1) & \
    294                                         INT_CMD_PKT_IDX_MASK);
    295                 p_cb->int_cmd_rsp_pending--;
    296                 return TRUE;
    297             }
    298         }
    299     }
    300     else if (event_code == HCI_COMMAND_STATUS_EVT)
    301     {
    302         num_hci_cmd_pkts = *(++p);
    303     }
    304 
    305     return FALSE;
    306 }
    307 
    308 /*******************************************************************************
    309 **
    310 ** Function         acl_rx_frame_buffer_alloc
    311 **
    312 ** Description      This function is called from the HCI transport when the
    313 **                  first 4 or 6 bytes of an HCI ACL packet have been received:
    314 **                  - Allocate a new buffer if it is a start pakcet of L2CAP
    315 **                    message.
    316 **                  - Return the buffer address of the starting L2CAP message
    317 **                    frame if the packet is the next segment of a fragmented
    318 **                    L2CAP message.
    319 **
    320 ** Returns          the address of the receive buffer H4 RX should use
    321 **                  (CR419: Modified to return NULL in case of error.)
    322 **
    323 ** NOTE             This assumes that the L2CAP MTU size is less than the size
    324 **                  of an HCI ACL buffer, so the maximum L2CAP message will fit
    325 **                  into one buffer.
    326 **
    327 *******************************************************************************/
    328 static HC_BT_HDR *acl_rx_frame_buffer_alloc (void)
    329 {
    330     uint8_t     *p;
    331     uint16_t    handle;
    332     uint16_t    hci_len;
    333     uint16_t    total_len;
    334     uint8_t     pkt_type;
    335     HC_BT_HDR  *p_return_buf = NULL;
    336     tHCI_H4_CB  *p_cb = &h4_cb;
    337 
    338 
    339     p = p_cb->preload_buffer;
    340 
    341     STREAM_TO_UINT16 (handle, p);
    342     STREAM_TO_UINT16 (hci_len, p);
    343     STREAM_TO_UINT16 (total_len, p);
    344 
    345     pkt_type = (uint8_t)(((handle) >> 12) & 0x0003);
    346     handle   = (uint16_t)((handle) & 0x0FFF);
    347 
    348     if (p_cb->acl_rx_q.count)
    349     {
    350         uint16_t save_handle;
    351         HC_BT_HDR *p_hdr = p_cb->acl_rx_q.p_first;
    352 
    353         while (p_hdr != NULL)
    354         {
    355             p = (uint8_t *)(p_hdr + 1);
    356             STREAM_TO_UINT16 (save_handle, p);
    357             save_handle   = (uint16_t)((save_handle) & 0x0FFF);
    358             if (save_handle == handle)
    359             {
    360                 p_return_buf = p_hdr;
    361                 break;
    362             }
    363             p_hdr = utils_getnext(p_hdr);
    364         }
    365     }
    366 
    367     if (pkt_type == ACL_RX_PKT_START)       /*** START PACKET ***/
    368     {
    369         /* Might have read 2 bytes for the L2CAP payload length */
    370         p_cb->rcv_len = (hci_len) ? (hci_len - 2) : 0;
    371 
    372         /* Start of packet. If we were in the middle of receiving */
    373         /* a packet on the same ACL handle, the original packet is incomplete.
    374          * Drop it. */
    375         if (p_return_buf)
    376         {
    377             ALOGW("H4 - dropping incomplete ACL frame");
    378 
    379             utils_remove_from_queue(&(p_cb->acl_rx_q), p_return_buf);
    380 
    381             if (bt_hc_cbacks)
    382             {
    383                 bt_hc_cbacks->dealloc((TRANSAC) p_return_buf, \
    384                                           (char *) (p_return_buf + 1));
    385             }
    386             p_return_buf = NULL;
    387         }
    388 
    389         /* Allocate a buffer for message */
    390         if (bt_hc_cbacks)
    391         {
    392             int len = total_len + HCI_ACL_PREAMBLE_SIZE + L2CAP_HEADER_SIZE + \
    393                       BT_HC_HDR_SIZE;
    394             p_return_buf = (HC_BT_HDR *) bt_hc_cbacks->alloc(len);
    395         }
    396 
    397         if (p_return_buf)
    398         {
    399             /* Initialize buffer with preloaded data */
    400             p_return_buf->offset = 0;
    401             p_return_buf->layer_specific = 0;
    402             p_return_buf->event = MSG_HC_TO_STACK_HCI_ACL;
    403             p_return_buf->len = p_cb->preload_count;
    404             memcpy((uint8_t *)(p_return_buf + 1), p_cb->preload_buffer, \
    405                    p_cb->preload_count);
    406 
    407             if (hci_len && ((total_len + L2CAP_HEADER_SIZE) > hci_len))
    408             {
    409                 /* Will expect to see fragmented ACL packets */
    410                 /* Keep the base buffer address in the watching queue */
    411                 utils_enqueue(&(p_cb->acl_rx_q), p_return_buf);
    412             }
    413         }
    414     }
    415     else                                    /*** CONTINUATION PACKET ***/
    416     {
    417         p_cb->rcv_len = hci_len;
    418 
    419         if (p_return_buf)
    420         {
    421             /* Packet continuation and found the original rx buffer */
    422             uint8_t *p_f = p = (uint8_t *)(p_return_buf + 1) + 2;
    423 
    424             STREAM_TO_UINT16 (total_len, p);
    425 
    426             /* Update HCI header of first segment (base buffer) with new len */
    427             total_len += hci_len;
    428             UINT16_TO_STREAM (p_f, total_len);
    429         }
    430     }
    431 
    432     return (p_return_buf);
    433 }
    434 
    435 /*******************************************************************************
    436 **
    437 ** Function         acl_rx_frame_end_chk
    438 **
    439 ** Description      This function is called from the HCI transport when the last
    440 **                  byte of an HCI ACL packet has been received. It checks if
    441 **                  the L2CAP message is complete, i.e. no more continuation
    442 **                  packets are expected.
    443 **
    444 ** Returns          TRUE if message complete, FALSE if continuation expected
    445 **
    446 *******************************************************************************/
    447 static uint8_t acl_rx_frame_end_chk (void)
    448 {
    449     uint8_t     *p;
    450     uint16_t    handle, hci_len, l2cap_len;
    451     HC_BT_HDR  *p_buf;
    452     tHCI_H4_CB  *p_cb = &h4_cb;
    453     uint8_t     frame_end=TRUE;
    454 
    455     p_buf = p_cb->p_rcv_msg;
    456     p = (uint8_t *)(p_buf + 1);
    457 
    458     STREAM_TO_UINT16 (handle, p);
    459     STREAM_TO_UINT16 (hci_len, p);
    460     STREAM_TO_UINT16 (l2cap_len, p);
    461 
    462     if (hci_len > 0)
    463     {
    464         if (l2cap_len > (p_buf->len-(HCI_ACL_PREAMBLE_SIZE+L2CAP_HEADER_SIZE)) )
    465         {
    466             /* If the L2CAP length has not been reached, tell H4 not to send
    467              * this buffer to stack */
    468             frame_end = FALSE;
    469         }
    470         else
    471         {
    472             /*
    473              * The current buffer coulb be in the watching list.
    474              * Remove it from the list if it is in.
    475              */
    476             if (p_cb->acl_rx_q.count)
    477                 utils_remove_from_queue(&(p_cb->acl_rx_q), p_buf);
    478         }
    479     }
    480 
    481     /****
    482      ** Print snoop trace
    483      ****/
    484     if (p_buf->offset)
    485     {
    486         /* CONTINUATION PACKET */
    487 
    488         /* save original p_buf->len content */
    489         uint16_t tmp_u16 = p_buf->len;
    490 
    491         /* borrow HCI_ACL_PREAMBLE_SIZE bytes from the payload section */
    492         p = (uint8_t *)(p_buf + 1) + p_buf->offset - HCI_ACL_PREAMBLE_SIZE;
    493 
    494         /* save contents */
    495         memcpy(p_cb->preload_buffer, p, HCI_ACL_PREAMBLE_SIZE);
    496 
    497         /* Set packet boundary flags to "continuation packet" */
    498         handle = (handle & 0xCFFF) | 0x1000;
    499 
    500         /* write handl & length info */
    501         UINT16_TO_STREAM (p, handle);
    502         UINT16_TO_STREAM (p, (p_buf->len - p_buf->offset));
    503 
    504         /* roll pointer back */
    505         p = p - HCI_ACL_PREAMBLE_SIZE;
    506 
    507         /* adjust `p_buf->offset` & `p_buf->len`
    508          * before calling btsnoop_capture() */
    509         p_buf->offset = p_buf->offset - HCI_ACL_PREAMBLE_SIZE;
    510         p_buf->len = p_buf->len - p_buf->offset;
    511 
    512         btsnoop_capture(p_buf, TRUE);
    513 
    514         /* restore contents */
    515         memcpy(p, p_cb->preload_buffer, HCI_ACL_PREAMBLE_SIZE);
    516 
    517         /* restore p_buf->len */
    518         p_buf->len = tmp_u16;
    519     }
    520     else
    521     {
    522         /* START PACKET */
    523         btsnoop_capture(p_buf, TRUE);
    524     }
    525 
    526     if (frame_end == TRUE)
    527         p_buf->offset = 0;
    528     else
    529         p_buf->offset = p_buf->len; /* save current buffer-end position */
    530 
    531     return frame_end;
    532 }
    533 
    534 /*****************************************************************************
    535 **   HCI H4 INTERFACE FUNCTIONS
    536 *****************************************************************************/
    537 
    538 /*******************************************************************************
    539 **
    540 ** Function        hci_h4_init
    541 **
    542 ** Description     Initialize H4 module
    543 **
    544 ** Returns         None
    545 **
    546 *******************************************************************************/
    547 void hci_h4_init(void)
    548 {
    549     HCIDBG("hci_h4_init");
    550 
    551     memset(&h4_cb, 0, sizeof(tHCI_H4_CB));
    552     utils_queue_init(&(h4_cb.acl_rx_q));
    553 
    554     /* Per HCI spec., always starts with 1 */
    555     num_hci_cmd_pkts = 1;
    556 
    557     /* Give an initial values of Host Controller's ACL data packet length
    558      * Will update with an internal HCI(_LE)_Read_Buffer_Size request
    559      */
    560     h4_cb.hc_acl_data_size = 1021;
    561     h4_cb.hc_ble_acl_data_size = 27;
    562 
    563     btsnoop_init();
    564 }
    565 
    566 /*******************************************************************************
    567 **
    568 ** Function        hci_h4_cleanup
    569 **
    570 ** Description     Clean H4 module
    571 **
    572 ** Returns         None
    573 **
    574 *******************************************************************************/
    575 void hci_h4_cleanup(void)
    576 {
    577     HCIDBG("hci_h4_cleanup");
    578 
    579     btsnoop_close();
    580     btsnoop_cleanup();
    581 }
    582 
    583 /*******************************************************************************
    584 **
    585 ** Function        hci_h4_send_msg
    586 **
    587 ** Description     Determine message type, set HCI H4 packet indicator, and
    588 **                 send message through USERIAL driver
    589 **
    590 ** Returns         None
    591 **
    592 *******************************************************************************/
    593 void hci_h4_send_msg(HC_BT_HDR *p_msg)
    594 {
    595     uint8_t type = 0;
    596     uint16_t handle;
    597     uint16_t bytes_to_send, lay_spec;
    598     uint8_t *p = ((uint8_t *)(p_msg + 1)) + p_msg->offset;
    599     uint16_t event = p_msg->event & MSG_EVT_MASK;
    600     uint16_t sub_event = p_msg->event & MSG_SUB_EVT_MASK;
    601     uint16_t acl_pkt_size = 0, acl_data_size = 0;
    602     uint16_t bytes_sent;
    603 
    604     /* wake up BT device if its in sleep mode */
    605     lpm_wake_assert();
    606 
    607     if (event == MSG_STACK_TO_HC_HCI_ACL)
    608         type = H4_TYPE_ACL_DATA;
    609     else if (event == MSG_STACK_TO_HC_HCI_SCO)
    610         type = H4_TYPE_SCO_DATA;
    611     else if (event == MSG_STACK_TO_HC_HCI_CMD)
    612         type = H4_TYPE_COMMAND;
    613 
    614     if (sub_event == LOCAL_BR_EDR_CONTROLLER_ID)
    615     {
    616         acl_data_size = h4_cb.hc_acl_data_size;
    617         acl_pkt_size = h4_cb.hc_acl_data_size + HCI_ACL_PREAMBLE_SIZE;
    618     }
    619     else
    620     {
    621         acl_data_size = h4_cb.hc_ble_acl_data_size;
    622         acl_pkt_size = h4_cb.hc_ble_acl_data_size + HCI_ACL_PREAMBLE_SIZE;
    623     }
    624 
    625     /* Check if sending ACL data that needs fragmenting */
    626     if ((event == MSG_STACK_TO_HC_HCI_ACL) && (p_msg->len > acl_pkt_size))
    627     {
    628         /* Get the handle from the packet */
    629         STREAM_TO_UINT16 (handle, p);
    630 
    631         /* Set packet boundary flags to "continuation packet" */
    632         handle = (handle & 0xCFFF) | 0x1000;
    633 
    634         /* Do all the first chunks */
    635         while (p_msg->len > acl_pkt_size)
    636         {
    637             /* remember layer_specific because uart borrow
    638                one byte from layer_specific for packet type */
    639             lay_spec = p_msg->layer_specific;
    640 
    641             p = ((uint8_t *)(p_msg + 1)) + p_msg->offset - 1;
    642             *p = type;
    643             bytes_to_send = acl_pkt_size + 1; /* packet_size + message type */
    644 
    645             bytes_sent = userial_write(event,(uint8_t *) p,bytes_to_send);
    646 
    647             /* generate snoop trace message */
    648             btsnoop_capture(p_msg, FALSE);
    649 
    650             p_msg->layer_specific = lay_spec;
    651             /* Adjust offset and length for what we just sent */
    652             p_msg->offset += acl_data_size;
    653             p_msg->len    -= acl_data_size;
    654 
    655             p = ((uint8_t *)(p_msg + 1)) + p_msg->offset;
    656 
    657             UINT16_TO_STREAM (p, handle);
    658 
    659             if (p_msg->len > acl_pkt_size)
    660             {
    661                 UINT16_TO_STREAM (p, acl_data_size);
    662             }
    663             else
    664             {
    665                 UINT16_TO_STREAM (p, p_msg->len - HCI_ACL_PREAMBLE_SIZE);
    666             }
    667 
    668             /* If we were only to send partial buffer, stop when done.    */
    669             /* Send the buffer back to L2CAP to send the rest of it later */
    670             if (p_msg->layer_specific)
    671             {
    672                 if (--p_msg->layer_specific == 0)
    673                 {
    674                     p_msg->event = MSG_HC_TO_STACK_L2C_SEG_XMIT;
    675 
    676                     if (bt_hc_cbacks)
    677                     {
    678                         bt_hc_cbacks->tx_result((TRANSAC) p_msg, \
    679                                                     (char *) (p_msg + 1), \
    680                                                     BT_HC_TX_FRAGMENT);
    681                     }
    682 
    683                     return;
    684                 }
    685             }
    686         }
    687     }
    688 
    689 
    690     /* remember layer_specific because uart borrow
    691        one byte from layer_specific for packet type */
    692     lay_spec = p_msg->layer_specific;
    693 
    694     /* Put the HCI Transport packet type 1 byte before the message */
    695     p = ((uint8_t *)(p_msg + 1)) + p_msg->offset - 1;
    696     *p = type;
    697     bytes_to_send = p_msg->len + 1;     /* message_size + message type */
    698 
    699     bytes_sent = userial_write(event,(uint8_t *) p, bytes_to_send);
    700 
    701     p_msg->layer_specific = lay_spec;
    702 
    703     if (event == MSG_STACK_TO_HC_HCI_CMD)
    704     {
    705         num_hci_cmd_pkts--;
    706 
    707         /* If this is an internal Cmd packet, the layer_specific field would
    708          * have stored with the opcode of HCI command.
    709          * Retrieve the opcode from the Cmd packet.
    710          */
    711          p++;
    712         STREAM_TO_UINT16(lay_spec, p);
    713     }
    714 
    715     /* generate snoop trace message */
    716     btsnoop_capture(p_msg, FALSE);
    717 
    718     if (bt_hc_cbacks)
    719     {
    720         if ((event == MSG_STACK_TO_HC_HCI_CMD) && \
    721             (h4_cb.int_cmd_rsp_pending > 0) && \
    722             (p_msg->layer_specific == lay_spec))
    723         {
    724             /* dealloc buffer of internal command */
    725             bt_hc_cbacks->dealloc((TRANSAC) p_msg, (char *) (p_msg + 1));
    726         }
    727         else
    728         {
    729             bt_hc_cbacks->tx_result((TRANSAC) p_msg, (char *) (p_msg + 1), \
    730                                         BT_HC_TX_SUCCESS);
    731         }
    732     }
    733 
    734     lpm_tx_done(TRUE);
    735 
    736     return;
    737 }
    738 
    739 
    740 /*******************************************************************************
    741 **
    742 ** Function        hci_h4_receive_msg
    743 **
    744 ** Description     Construct HCI EVENT/ACL packets and send them to stack once
    745 **                 complete packet has been received.
    746 **
    747 ** Returns         Number of read bytes
    748 **
    749 *******************************************************************************/
    750 uint16_t hci_h4_receive_msg(void)
    751 {
    752     uint16_t    bytes_read = 0;
    753     uint8_t     byte;
    754     uint16_t    msg_len, len;
    755     uint8_t     msg_received;
    756     tHCI_H4_CB  *p_cb=&h4_cb;
    757 
    758     while (TRUE)
    759     {
    760         /* Read one byte to see if there is anything waiting to be read */
    761         if (userial_read(0 /*dummy*/, &byte, 1) == 0)
    762         {
    763             break;
    764         }
    765 
    766         bytes_read++;
    767         msg_received = FALSE;
    768 
    769         switch (p_cb->rcv_state)
    770         {
    771         case H4_RX_MSGTYPE_ST:
    772             /* Start of new message */
    773             if ((byte < H4_TYPE_ACL_DATA) || (byte > H4_TYPE_EVENT))
    774             {
    775                 /* Unknown HCI message type */
    776                 /* Drop this byte */
    777                 ALOGE("[h4] Unknown HCI message type drop this byte 0x%x", byte);
    778                 break;
    779             }
    780 
    781             /* Initialize rx parameters */
    782             p_cb->rcv_msg_type = byte;
    783             p_cb->rcv_len = hci_preamble_table[byte-1];
    784             memset(p_cb->preload_buffer, 0 , 6);
    785             p_cb->preload_count = 0;
    786             // p_cb->p_rcv_msg = NULL;
    787             p_cb->rcv_state = H4_RX_LEN_ST; /* Next, wait for length to come */
    788             break;
    789 
    790         case H4_RX_LEN_ST:
    791             /* Receiving preamble */
    792             p_cb->preload_buffer[p_cb->preload_count++] = byte;
    793             p_cb->rcv_len--;
    794 
    795             /* Check if we received entire preamble yet */
    796             if (p_cb->rcv_len == 0)
    797             {
    798                 if (p_cb->rcv_msg_type == H4_TYPE_ACL_DATA)
    799                 {
    800                     /* ACL data lengths are 16-bits */
    801                     msg_len = p_cb->preload_buffer[3];
    802                     msg_len = (msg_len << 8) + p_cb->preload_buffer[2];
    803 
    804                     if (msg_len && (p_cb->preload_count == 4))
    805                     {
    806                         /* Check if this is a start packet */
    807                         byte = ((p_cb->preload_buffer[1] >> 4) & 0x03);
    808 
    809                         if (byte == ACL_RX_PKT_START)
    810                         {
    811                            /*
    812                             * A start packet & with non-zero data payload length.
    813                             * We want to read 2 more bytes to get L2CAP payload
    814                             * length.
    815                             */
    816                             p_cb->rcv_len = 2;
    817 
    818                             break;
    819                         }
    820                     }
    821 
    822                     /*
    823                      * Check for segmented packets. If this is a continuation
    824                      * packet, then we will continue appending data to the
    825                      * original rcv buffer.
    826                      */
    827                     p_cb->p_rcv_msg = acl_rx_frame_buffer_alloc();
    828                 }
    829                 else
    830                 {
    831                     /* Received entire preamble.
    832                      * Length is in the last received byte */
    833                     msg_len = byte;
    834                     p_cb->rcv_len = msg_len;
    835 
    836                     /* Allocate a buffer for message */
    837                     if (bt_hc_cbacks)
    838                     {
    839                         len = msg_len + p_cb->preload_count + BT_HC_HDR_SIZE;
    840                         p_cb->p_rcv_msg = \
    841                             (HC_BT_HDR *) bt_hc_cbacks->alloc(len);
    842                     }
    843 
    844                     if (p_cb->p_rcv_msg)
    845                     {
    846                         /* Initialize buffer with preloaded data */
    847                         p_cb->p_rcv_msg->offset = 0;
    848                         p_cb->p_rcv_msg->layer_specific = 0;
    849                         p_cb->p_rcv_msg->event = \
    850                             msg_evt_table[p_cb->rcv_msg_type-1];
    851                         p_cb->p_rcv_msg->len = p_cb->preload_count;
    852                         memcpy((uint8_t *)(p_cb->p_rcv_msg + 1), \
    853                                p_cb->preload_buffer, p_cb->preload_count);
    854                     }
    855                 }
    856 
    857                 if (p_cb->p_rcv_msg == NULL)
    858                 {
    859                     /* Unable to acquire message buffer. */
    860                     ALOGE( \
    861                      "H4: Unable to acquire buffer for incoming HCI message." \
    862                     );
    863 
    864                     if (msg_len == 0)
    865                     {
    866                         /* Wait for next message */
    867                         p_cb->rcv_state = H4_RX_MSGTYPE_ST;
    868                     }
    869                     else
    870                     {
    871                         /* Ignore rest of the packet */
    872                         p_cb->rcv_state = H4_RX_IGNORE_ST;
    873                     }
    874 
    875                     break;
    876                 }
    877 
    878                 /* Message length is valid */
    879                 if (msg_len)
    880                 {
    881                     /* Read rest of message */
    882                     p_cb->rcv_state = H4_RX_DATA_ST;
    883                 }
    884                 else
    885                 {
    886                     /* Message has no additional parameters.
    887                      * (Entire message has been received) */
    888                     if (p_cb->rcv_msg_type == H4_TYPE_ACL_DATA)
    889                         acl_rx_frame_end_chk(); /* to print snoop trace */
    890 
    891                     msg_received = TRUE;
    892 
    893                     /* Next, wait for next message */
    894                     p_cb->rcv_state = H4_RX_MSGTYPE_ST;
    895                 }
    896             }
    897             break;
    898 
    899         case H4_RX_DATA_ST:
    900             *((uint8_t *)(p_cb->p_rcv_msg + 1) + p_cb->p_rcv_msg->len++) = byte;
    901             p_cb->rcv_len--;
    902 
    903             if (p_cb->rcv_len > 0)
    904             {
    905                 /* Read in the rest of the message */
    906                 len = userial_read(0 /*dummy*/, \
    907                       ((uint8_t *)(p_cb->p_rcv_msg+1) + p_cb->p_rcv_msg->len), \
    908                       p_cb->rcv_len);
    909                 p_cb->p_rcv_msg->len += len;
    910                 p_cb->rcv_len -= len;
    911                 bytes_read += len;
    912             }
    913 
    914             /* Check if we read in entire message yet */
    915             if (p_cb->rcv_len == 0)
    916             {
    917                 /* Received entire packet. */
    918                 /* Check for segmented l2cap packets */
    919                 if ((p_cb->rcv_msg_type == H4_TYPE_ACL_DATA) &&
    920                     !acl_rx_frame_end_chk())
    921                 {
    922                     /* Not the end of packet yet. */
    923                     /* Next, wait for next message */
    924                     p_cb->rcv_state = H4_RX_MSGTYPE_ST;
    925                 }
    926                 else
    927                 {
    928                     msg_received = TRUE;
    929                     /* Next, wait for next message */
    930                     p_cb->rcv_state = H4_RX_MSGTYPE_ST;
    931                 }
    932             }
    933             break;
    934 
    935 
    936         case H4_RX_IGNORE_ST:
    937             /* Ignore reset of packet */
    938             p_cb->rcv_len--;
    939 
    940             /* Check if we read in entire message yet */
    941             if (p_cb->rcv_len == 0)
    942             {
    943                 /* Next, wait for next message */
    944                 p_cb->rcv_state = H4_RX_MSGTYPE_ST;
    945             }
    946             break;
    947         }
    948 
    949 
    950         /* If we received entire message, then send it to the task */
    951         if (msg_received)
    952         {
    953             uint8_t intercepted = FALSE;
    954 
    955             /* generate snoop trace message */
    956             /* ACL packet tracing had done in acl_rx_frame_end_chk() */
    957             if (p_cb->p_rcv_msg->event != MSG_HC_TO_STACK_HCI_ACL)
    958                 btsnoop_capture(p_cb->p_rcv_msg, TRUE);
    959 
    960             if (p_cb->p_rcv_msg->event == MSG_HC_TO_STACK_HCI_EVT)
    961                 intercepted = internal_event_intercept();
    962 
    963             if ((bt_hc_cbacks) && (intercepted == FALSE))
    964             {
    965                 bt_hc_cbacks->data_ind((TRANSAC) p_cb->p_rcv_msg, \
    966                                        (char *) (p_cb->p_rcv_msg + 1), \
    967                                        p_cb->p_rcv_msg->len + BT_HC_HDR_SIZE);
    968             }
    969             p_cb->p_rcv_msg = NULL;
    970         }
    971     }
    972 
    973     return (bytes_read);
    974 }
    975 
    976 
    977 /*******************************************************************************
    978 **
    979 ** Function        hci_h4_send_int_cmd
    980 **
    981 ** Description     Place the internal commands (issued internally by vendor lib)
    982 **                 in the tx_q.
    983 **
    984 ** Returns         TRUE/FALSE
    985 **
    986 *******************************************************************************/
    987 uint8_t hci_h4_send_int_cmd(uint16_t opcode, HC_BT_HDR *p_buf, \
    988                                   tINT_CMD_CBACK p_cback)
    989 {
    990     if (h4_cb.int_cmd_rsp_pending > INT_CMD_PKT_MAX_COUNT)
    991     {
    992         ALOGE( \
    993         "Allow only %d outstanding internal commands at a time [Reject 0x%04X]"\
    994         , INT_CMD_PKT_MAX_COUNT, opcode);
    995         return FALSE;
    996     }
    997 
    998     h4_cb.int_cmd_rsp_pending++;
    999     h4_cb.int_cmd[h4_cb.int_cmd_wrt_idx].opcode = opcode;
   1000     h4_cb.int_cmd[h4_cb.int_cmd_wrt_idx].cback = p_cback;
   1001     h4_cb.int_cmd_wrt_idx = ((h4_cb.int_cmd_wrt_idx+1) & INT_CMD_PKT_IDX_MASK);
   1002 
   1003     /* stamp signature to indicate an internal command */
   1004     p_buf->layer_specific = opcode;
   1005 
   1006     utils_enqueue(&tx_q, (void *) p_buf);
   1007     bthc_signal_event(HC_EVENT_TX);
   1008 
   1009     return TRUE;
   1010 }
   1011 
   1012 
   1013 /*******************************************************************************
   1014 **
   1015 ** Function        hci_h4_get_acl_data_length
   1016 **
   1017 ** Description     Issue HCI_READ_BUFFER_SIZE command to retrieve Controller's
   1018 **                 ACL data length setting
   1019 **
   1020 ** Returns         None
   1021 **
   1022 *******************************************************************************/
   1023 void hci_h4_get_acl_data_length(void)
   1024 {
   1025     HC_BT_HDR  *p_buf = NULL;
   1026     uint8_t     *p, ret;
   1027 
   1028     if (bt_hc_cbacks)
   1029     {
   1030         p_buf = (HC_BT_HDR *) bt_hc_cbacks->alloc(BT_HC_HDR_SIZE + \
   1031                                                        HCI_CMD_PREAMBLE_SIZE);
   1032     }
   1033 
   1034     if (p_buf)
   1035     {
   1036         p_buf->event = MSG_STACK_TO_HC_HCI_CMD;
   1037         p_buf->offset = 0;
   1038         p_buf->layer_specific = 0;
   1039         p_buf->len = HCI_CMD_PREAMBLE_SIZE;
   1040 
   1041         p = (uint8_t *) (p_buf + 1);
   1042         UINT16_TO_STREAM(p, HCI_READ_BUFFER_SIZE);
   1043         *p = 0;
   1044 
   1045         if ((ret = hci_h4_send_int_cmd(HCI_READ_BUFFER_SIZE, p_buf, \
   1046                                        get_acl_data_length_cback)) == FALSE)
   1047         {
   1048             bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_buf + 1));
   1049         }
   1050         else
   1051             return;
   1052     }
   1053 
   1054     if (bt_hc_cbacks)
   1055     {
   1056         ALOGE("vendor lib postload aborted");
   1057         bt_hc_cbacks->postload_cb(NULL, BT_HC_POSTLOAD_FAIL);
   1058     }
   1059 }
   1060 
   1061 
   1062 /******************************************************************************
   1063 **  HCI H4 Services interface table
   1064 ******************************************************************************/
   1065 
   1066 const tHCI_IF hci_h4_func_table =
   1067 {
   1068     hci_h4_init,
   1069     hci_h4_cleanup,
   1070     hci_h4_send_msg,
   1071     hci_h4_send_int_cmd,
   1072     hci_h4_get_acl_data_length,
   1073     hci_h4_receive_msg
   1074 };
   1075 
   1076