Home | History | Annotate | Download | only in btm
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 1999-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  *  This file contains functions that handle BTM interface functions for the
     22  *  Bluetooth device including Rest, HCI buffer size and others
     23  *
     24  ******************************************************************************/
     25 
     26 #include <stdlib.h>
     27 #include <string.h>
     28 #include <stdio.h>
     29 #include <stddef.h>
     30 
     31 #include "bt_types.h"
     32 #include "hcimsgs.h"
     33 #include "btu.h"
     34 #include "btm_int.h"
     35 #include "l2c_int.h"
     36 
     37 #if BLE_INCLUDED == TRUE
     38 #include "gatt_int.h"
     39 
     40 #endif /* BLE_INCLUDED */
     41 
     42 /* BTM_APP_DEV_INIT should be defined if additional controller initialization is
     43 **      needed by the application to be performed after the HCI reset
     44 */
     45 #ifdef BTM_APP_DEV_INIT
     46 extern void BTM_APP_DEV_INIT(void);
     47 #endif
     48 
     49 #ifdef BTA_PRM_CHECK_FW_VER
     50 extern BOOLEAN BTA_PRM_CHECK_FW_VER(UINT8 *p);
     51 #endif
     52 
     53 #ifndef TT_DEV_RESET_MASK
     54 #define TT_DEV_RESET_MASK 0xff
     55 #endif
     56 
     57 /********************************************************************************/
     58 /*                 L O C A L    D A T A    D E F I N I T I O N S                */
     59 /********************************************************************************/
     60 
     61 /* The default class of device. */
     62 #ifndef BTM_INIT_CLASS_OF_DEVICE
     63 #define BTM_INIT_CLASS_OF_DEVICE    "\x00\x1F\x00"
     64 #endif
     65 
     66 #ifndef BTM_DEV_RESET_TIMEOUT
     67 #define BTM_DEV_RESET_TIMEOUT   4
     68 #endif
     69 
     70 #define BTM_DEV_REPLY_TIMEOUT   2    /* 1 second expiration time is not good. Timer may start between 0 and 1 second. */
     71                                      /* if it starts at the very end of the 0 second, timer will expire really easily. */
     72 
     73 #define BTM_INFO_TIMEOUT        5   /* 5 seconds for info response */
     74 
     75 /* After Reset a timeout can be specified in the target.h for specific targets
     76  * that may require additional time to reset
     77  * otherwise no timeout is required
     78 */
     79 #ifndef BTM_AFTER_RESET_TIMEOUT
     80 #define BTM_AFTER_RESET_TIMEOUT 0
     81 #endif
     82 
     83 /* Internal baseband so the parameters such as local features, version etc. are known
     84 so there is no need to issue HCI commands and wait for responses at BTM initialization */
     85 #ifndef BTM_INTERNAL_BB
     86 #define BTM_INTERNAL_BB FALSE
     87 #endif
     88 
     89 /* The local version information in the format specified in the HCI read local version
     90 response message */
     91 #ifndef BTM_INTERNAL_LOCAL_VER
     92 #define BTM_INTERNAL_LOCAL_VER {0x00, 0x01, 0x05, 0x81, 0x01, 0x30, 0x00, 0x40, 0x8D}
     93 #endif
     94 
     95 /* The local features information in the format specified in the HCI read local features
     96 response message */
     97 #ifndef BTM_INTERNAL_LOCAL_FEA
     98 #define BTM_INTERNAL_LOCAL_FEA {0x00, 0xFF, 0xF9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}
     99 #endif
    100 
    101 #ifndef BTM_SET_DEV_NAME_UPON_RESET
    102 #define BTM_SET_DEV_NAME_UPON_RESET TRUE
    103 #endif
    104 
    105 /* host SCO buffer size */
    106 #ifndef BTM_SCO_HOST_BUF_SIZE
    107 #define BTM_SCO_HOST_BUF_SIZE       0xff
    108 #endif
    109 
    110 /********************************************************************************/
    111 /*              L O C A L    F U N C T I O N     P R O T O T Y P E S            */
    112 /********************************************************************************/
    113 static void btm_dev_reset (void);
    114 static void btm_after_reset_hold_complete (void);
    115 static void btm_continue_reset (void);
    116 
    117 static void btm_get_local_ext_features (UINT8 page_number);
    118 static void btm_decode_ext_features_page (UINT8 page_number, const BD_FEATURES p_features);
    119 static void btm_read_all_lmp_features_complete (UINT8 max_page_number);
    120 static void btm_set_lmp_features_host_may_support (UINT8 max_page_number);
    121 static void btm_get_local_features (void);
    122 static void btm_issue_host_support_for_lmp_features (void);
    123 static void btm_read_local_supported_cmds (UINT8 local_controller_id);
    124 
    125 #if BLE_INCLUDED == TRUE
    126 static void btm_read_ble_local_supported_features (void);
    127 #endif
    128 
    129 /*******************************************************************************
    130 **
    131 ** Function         btm_dev_init
    132 **
    133 ** Description      This function is on the BTM startup
    134 **
    135 ** Returns          void
    136 **
    137 *******************************************************************************/
    138 void btm_dev_init (void)
    139 {
    140 #if 0  /* cleared in btm_init; put back in if called from anywhere else! */
    141     memset (&btm_cb.devcb, 0, sizeof (tBTM_DEVCB));
    142 #endif
    143 
    144     /* Initialize nonzero defaults */
    145 #if (BTM_MAX_LOC_BD_NAME_LEN > 0)
    146     memset(btm_cb.cfg.bd_name, 0, sizeof(tBTM_LOC_BD_NAME));
    147 #if (BTM_USE_DEF_LOCAL_NAME == TRUE)
    148     BCM_STRNCPY_S(btm_cb.cfg.bd_name, sizeof(btm_cb.cfg.bd_name), BTM_DEF_LOCAL_NAME, BTM_MAX_LOC_BD_NAME_LEN);
    149 #endif
    150 #endif
    151 
    152     btm_cb.devcb.reset_timer.param  = (TIMER_PARAM_TYPE)TT_DEV_RESET;
    153     btm_cb.devcb.rln_timer.param    = (TIMER_PARAM_TYPE)TT_DEV_RLN;
    154     btm_cb.devcb.rlinkp_timer.param = (TIMER_PARAM_TYPE)TT_DEV_RLNKP;
    155 
    156     btm_cb.btm_acl_pkt_types_supported = BTM_ACL_PKT_TYPES_MASK_DH1 + BTM_ACL_PKT_TYPES_MASK_DM1 +
    157                                          BTM_ACL_PKT_TYPES_MASK_DH3 + BTM_ACL_PKT_TYPES_MASK_DM3 +
    158                                          BTM_ACL_PKT_TYPES_MASK_DH5 + BTM_ACL_PKT_TYPES_MASK_DM5;
    159 
    160     btm_cb.btm_sco_pkt_types_supported = BTM_SCO_PKT_TYPES_MASK_HV1 +
    161                                          BTM_SCO_PKT_TYPES_MASK_HV2 +
    162                                          BTM_SCO_PKT_TYPES_MASK_HV3 +
    163                                          BTM_SCO_PKT_TYPES_MASK_EV3 +
    164                                          BTM_SCO_PKT_TYPES_MASK_EV4 +
    165                                          BTM_SCO_PKT_TYPES_MASK_EV5;
    166 
    167     btm_cb.first_disabled_channel = 0xff; /* To allow disabling 0th channel alone */
    168     btm_cb.last_disabled_channel = 0xff; /* To allow disabling 0th channel alone */
    169 
    170 #if (BTM_AUTOMATIC_HCI_RESET == TRUE)
    171 
    172 #if (BTM_FIRST_RESET_DELAY > 0)
    173     btm_cb.devcb.state = BTM_DEV_STATE_WAIT_RESET_CMPLT;
    174     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_FIRST_RESET_DELAY);
    175 #else
    176     btm_dev_reset();
    177 #endif
    178 
    179 #else
    180    BTM_TRACE_EVENT0 ("BTM_AUTOMATIC_HCI_RESET is FALSE, so skip btm reset for now");
    181 #endif
    182 
    183 }
    184 
    185 
    186 /*******************************************************************************
    187 **
    188 ** Function         btm_db_reset
    189 **
    190 ** Description      This function is called by BTM_DeviceReset and clears out any
    191 **                  pending callbacks for inquiries, discoveries, other pending
    192 **                  functions that may be in progress.
    193 **
    194 ** Returns          void
    195 **
    196 *******************************************************************************/
    197 static void btm_db_reset (void)
    198 {
    199     tBTM_CMPL_CB    *p_cb;
    200     tBTM_STATUS      status = BTM_DEV_RESET;
    201 
    202     btm_inq_db_reset();
    203 
    204     if (btm_cb.devcb.p_rln_cmpl_cb)
    205     {
    206         p_cb = btm_cb.devcb.p_rln_cmpl_cb;
    207         btm_cb.devcb.p_rln_cmpl_cb = NULL;
    208 
    209         if (p_cb)
    210             (*p_cb)((void *) NULL);
    211     }
    212 
    213     if (btm_cb.devcb.p_rlinkp_cmpl_cb)
    214     {
    215         p_cb = btm_cb.devcb.p_rlinkp_cmpl_cb;
    216         btm_cb.devcb.p_rlinkp_cmpl_cb = NULL;
    217 
    218         if (p_cb)
    219             (*p_cb)((void *) &status);
    220     }
    221 
    222     if (btm_cb.devcb.p_rssi_cmpl_cb)
    223     {
    224         p_cb = btm_cb.devcb.p_rssi_cmpl_cb;
    225         btm_cb.devcb.p_rssi_cmpl_cb = NULL;
    226 
    227         if (p_cb)
    228             (*p_cb)((tBTM_RSSI_RESULTS *) &status);
    229     }
    230 }
    231 
    232 
    233 
    234 /*******************************************************************************
    235 **
    236 ** Function         btm_dev_absent
    237 **
    238 ** Description      This function is called by when it is detected that the
    239 **                  device is not connected any more.
    240 **
    241 ** Returns          void
    242 **
    243 *******************************************************************************/
    244 void btm_dev_absent (void)
    245 {
    246     btm_cb.devcb.state = BTM_DEV_STATE_WAIT_RESET_CMPLT;
    247 
    248     btm_db_reset ();
    249     btm_inq_db_reset();
    250 
    251     /* If anyone wants device status notifications, give him one */
    252     btm_report_device_status (BTM_DEV_STATUS_DOWN);
    253 
    254     btu_stop_timer (&btm_cb.devcb.reset_timer);
    255 }
    256 
    257 
    258 /*******************************************************************************
    259 **
    260 ** Function         BTM_DeviceReset
    261 **
    262 ** Description      This function is called to reset the HCI.  Callback function
    263 **                  if provided is called when startup of the device is
    264 **                  completed.
    265 **
    266 ** Returns          void
    267 **
    268 *******************************************************************************/
    269 void BTM_DeviceReset (tBTM_CMPL_CB *p_cb)
    270 {
    271     tBTM_STATUS status;
    272 
    273     /* If device is already resetting, do not allow another */
    274     if ((!btm_cb.devcb.p_reset_cmpl_cb) || (btm_cb.devcb.p_reset_cmpl_cb == p_cb))
    275     {
    276         /* Flush all ACL connections */
    277         btm_acl_device_down();
    278 
    279         /* Clear the callback, so application would not hang on reset */
    280         btm_db_reset();
    281 
    282         /* Save address of the completion routine, if provided */
    283         btm_cb.devcb.p_reset_cmpl_cb = p_cb;
    284 
    285         btm_dev_reset ();
    286     }
    287     else
    288     {
    289         /* pass an error to the bad callback, another one was already provided */
    290         if (p_cb)
    291         {
    292             status = BTM_ILLEGAL_VALUE;
    293             p_cb (&status);
    294         }
    295     }
    296 }
    297 
    298 
    299 /*******************************************************************************
    300 **
    301 ** Function         BTM_IsDeviceUp
    302 **
    303 ** Description      This function is called to check if the device is up.
    304 **
    305 ** Returns          TRUE if device is up, else FALSE
    306 **
    307 *******************************************************************************/
    308 BOOLEAN BTM_IsDeviceUp (void)
    309 {
    310     return ((BOOLEAN) (btm_cb.devcb.state == BTM_DEV_STATE_READY));
    311 }
    312 
    313 /*******************************************************************************
    314 **
    315 ** Function         BTM_SetAfhChannels
    316 **
    317 ** Description      This function is called disable channels
    318 **
    319 ** Returns          tBTM_STATUS
    320 **
    321 *******************************************************************************/
    322 tBTM_STATUS BTM_SetAfhChannels (UINT8 first, UINT8 last)
    323 {
    324     BTM_TRACE_API4 ("BTM_SetAfhChannels first: %d (%d) last: %d (%d)",
    325                        first, btm_cb.first_disabled_channel, last,
    326                        btm_cb.last_disabled_channel);
    327 
    328     /* Make sure the local device supports the feature before sending */
    329     if ((!HCI_LMP_AFH_CAP_MASTR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))   &&
    330         (!HCI_LMP_AFH_CLASS_SLAVE_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) &&
    331         (!HCI_LMP_AFH_CLASS_MASTR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0])))
    332         return (BTM_MODE_UNSUPPORTED);
    333 
    334     if (!BTM_IsDeviceUp())
    335         return (BTM_WRONG_MODE);
    336 
    337     if ((btm_cb.first_disabled_channel != first)
    338      || (btm_cb.last_disabled_channel  != last))
    339     {
    340         if (btsnd_hcic_set_afh_channels (first, last))
    341         {
    342             btm_cb.first_disabled_channel = first;
    343             btm_cb.last_disabled_channel  = last;
    344         }
    345         else
    346             return (BTM_NO_RESOURCES);
    347     }
    348     return (BTM_SUCCESS);
    349 }
    350 
    351 /*******************************************************************************
    352 **
    353 ** Function         BTM_SetAfhChannelAssessment
    354 **
    355 ** Description      This function is called to set the channel assessment mode on or off
    356 **
    357 ** Returns          none
    358 **
    359 *******************************************************************************/
    360 tBTM_STATUS BTM_SetAfhChannelAssessment (BOOLEAN enable_or_disable)
    361 {
    362     /* whatever app wants if device is not 1.2 scan type should be STANDARD */
    363     if (!HCI_LMP_AFH_CAP_SLAVE_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
    364      return (BTM_MODE_UNSUPPORTED);
    365 
    366     if (!btsnd_hcic_write_afh_channel_assessment_mode (enable_or_disable))
    367         return (BTM_NO_RESOURCES);
    368 
    369     return (BTM_SUCCESS);
    370 }
    371 
    372 /*******************************************************************************
    373 **
    374 ** Function         BTM_ContinueReset
    375 **
    376 ** Description      This function is called by the application to continue
    377 **                  initialization after the application has completed its
    378 **                  vendor specific sequence.  It is only used when
    379 **                  BTM_APP_DEV_INIT is defined in target.h.
    380 **
    381 ** Returns          void
    382 **
    383 *******************************************************************************/
    384 void BTM_ContinueReset (void)
    385 {
    386 #ifdef BTM_APP_DEV_INIT
    387     btm_continue_reset();
    388 #endif
    389 }
    390 
    391 /*******************************************************************************
    392 **
    393 ** Function         btm_dev_reset
    394 **
    395 ** Description      Local function called to send a reset command
    396 **
    397 ** Returns          void
    398 **
    399 *******************************************************************************/
    400 static void btm_dev_reset (void)
    401 {
    402     btm_cb.devcb.state = BTM_DEV_STATE_WAIT_RESET_CMPLT;
    403 
    404     /* flush out the command complete queue and command transmit queue */
    405     btu_hcif_flush_cmd_queue();
    406 
    407     /* Start reset timer.  When timer expires we will send first command */
    408     /* from the setup sequence */
    409 
    410     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL,
    411                      BTM_DEV_RESET_TIMEOUT);
    412     btsnd_hcic_reset (LOCAL_BR_EDR_CONTROLLER_ID);
    413 }
    414 
    415 
    416 /*******************************************************************************
    417 **
    418 ** Function         btm_get_hci_buf_size
    419 **
    420 ** Description      Local function called to send a read buffer size command
    421 **
    422 ** Returns          void
    423 **
    424 *******************************************************************************/
    425 void btm_get_hci_buf_size (void)
    426 {
    427 
    428     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
    429 
    430     /* Send a Read Buffer Size message to the Host Controller. */
    431     btsnd_hcic_read_buffer_size ();
    432 
    433 }
    434 #if BLE_INCLUDED == TRUE
    435 /*******************************************************************************
    436 **
    437 ** Function         btm_read_ble_wl_size
    438 **
    439 ** Description      Local function called to send a read BLE buffer size command
    440 **
    441 ** Returns          void
    442 **
    443 *******************************************************************************/
    444 void btm_read_ble_wl_size(void)
    445 {
    446     BTM_TRACE_DEBUG0("btm_read_ble_wl_size ");
    447     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
    448 
    449     /* Send a Read Buffer Size message to the Host Controller. */
    450     btsnd_hcic_ble_read_white_list_size();
    451 }
    452 /*******************************************************************************
    453 **
    454 ** Function         btm_get_ble_buffer_size
    455 **
    456 ** Description      Local function called to send a read BLE buffer size command
    457 **
    458 ** Returns          void
    459 **
    460 *******************************************************************************/
    461 void btm_get_ble_buffer_size(void)
    462 {
    463     BTM_TRACE_DEBUG0("btm_get_ble_buffer_size ");
    464     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
    465 
    466     /* Send a Read Buffer Size message to the Host Controller. */
    467     btsnd_hcic_ble_read_buffer_size ();
    468 }
    469 
    470 /*******************************************************************************
    471 **
    472 ** Function         btm_read_ble_local_supported_features
    473 **
    474 ** Description      Local function called to send a read BLE local supported
    475 **                  features command
    476 **
    477 ** Returns          void
    478 **
    479 *******************************************************************************/
    480 static void btm_read_ble_local_supported_features(void)
    481 {
    482     BTM_TRACE_DEBUG0("btm_read_ble_local_supported_features ");
    483     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
    484 
    485     /* Send a Read Local Supported Features message to the Host Controller. */
    486     btsnd_hcic_ble_read_local_spt_feat ();
    487 }
    488 #endif
    489 /*******************************************************************************
    490 **
    491 ** Function         btm_get_local_version
    492 **
    493 ** Description      Local function called to send a read local version to controller
    494 **
    495 ** Returns          void
    496 **
    497 *******************************************************************************/
    498 void btm_get_local_version (void)
    499 {
    500 
    501     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
    502 
    503     /* Send a Read Local Version message to the Host Controller. */
    504     btsnd_hcic_read_local_ver (LOCAL_BR_EDR_CONTROLLER_ID);
    505     btsnd_hcic_read_bd_addr ();
    506 
    507 #if BTM_PWR_MGR_INCLUDED == TRUE
    508         btm_pm_reset();
    509 #endif
    510 
    511 }
    512 
    513 /*******************************************************************************
    514 **
    515 ** Function         btm_read_local_supported_cmds
    516 **
    517 ** Description      Local function called to send a read local supported commands
    518 **
    519 ** Returns          void
    520 **
    521 *******************************************************************************/
    522 static void btm_read_local_supported_cmds (UINT8 local_controller_id)
    523 {
    524     BTM_TRACE_DEBUG0("Start reading local supported commands");
    525 
    526     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
    527 
    528     btsnd_hcic_read_local_supported_cmds(local_controller_id);
    529 }
    530 
    531 /*******************************************************************************
    532 **
    533 ** Function         btm_get_local_features
    534 **
    535 ** Description      Local function called to send a read local features
    536 **
    537 ** Returns          void
    538 **
    539 *******************************************************************************/
    540 static void btm_get_local_features (void)
    541 {
    542     /* If this BT controller supports Read Extended Feature */
    543     if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0)
    544     {
    545         btm_get_local_ext_features(HCI_EXT_FEATURES_PAGE_0);
    546     }
    547     /* else, if this is a very old BT controller */
    548     else
    549 {
    550     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
    551 
    552         /* Just read the basic features (legacy HCI command) */
    553     btsnd_hcic_read_local_features ();
    554 }
    555 }
    556 
    557 /*******************************************************************************
    558 **
    559 ** Function         btm_get_local_ext_features
    560 **
    561 ** Description      Local function called to send a read local extended features
    562 **
    563 ** Returns          void
    564 **
    565 *******************************************************************************/
    566 static void btm_get_local_ext_features (UINT8 page_number)
    567 {
    568     btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
    569 
    570     btsnd_hcic_read_local_ext_features(page_number);
    571 }
    572 
    573 /*******************************************************************************
    574 **
    575 ** Function         btm_dev_timeout
    576 **
    577 ** Description      This function is called when a timer list entry expires.
    578 **
    579 ** Returns          void
    580 **
    581 *******************************************************************************/
    582 void btm_dev_timeout (TIMER_LIST_ENT  *p_tle)
    583 {
    584     TIMER_PARAM_TYPE timer_type = (TIMER_PARAM_TYPE)p_tle->param;
    585 
    586     if ((timer_type & TT_DEV_RESET_MASK) == TT_DEV_RESET)
    587     {
    588         /* Call device reset as long as there is timeout*/
    589         btm_dev_reset();
    590     }
    591     else if (timer_type == (TIMER_PARAM_TYPE)TT_DEV_RLN)
    592     {
    593         tBTM_CMPL_CB  *p_cb = btm_cb.devcb.p_rln_cmpl_cb;
    594 
    595         btm_cb.devcb.p_rln_cmpl_cb = NULL;
    596 
    597         if (p_cb)
    598             (*p_cb)((void *) NULL);
    599     }
    600 }
    601 
    602 /*******************************************************************************
    603 **
    604 ** Function         btm_reset_complete
    605 **
    606 ** Description      This function is called when command complete for HCI_Reset
    607 **                  is received.  It does not make sense to send next command
    608 **                  because device is resetting after command complete is
    609 **                  received.  Just start timer and set required state.
    610 **
    611 ** Returns          void
    612 **
    613 *******************************************************************************/
    614 void btm_reset_complete (void)
    615 {
    616     int devinx;
    617 
    618     BTM_TRACE_EVENT0 ("btm_reset_complete");
    619 
    620     /* Handle if btm initiated the reset */
    621     if (btm_cb.devcb.state == BTM_DEV_STATE_WAIT_RESET_CMPLT)
    622     {
    623         /* Tell L2CAP that all connections are gone */
    624         l2cu_device_reset ();
    625 
    626         /* Clear current security state */
    627         for (devinx = 0; devinx < BTM_SEC_MAX_DEVICE_RECORDS; devinx++)
    628         {
    629             btm_cb.sec_dev_rec[devinx].sec_state = BTM_SEC_STATE_IDLE;
    630         }
    631 
    632         /* After the reset controller should restore all parameters to defaults. */
    633         btm_cb.btm_inq_vars.inq_counter       = 1;
    634         btm_cb.btm_inq_vars.inq_scan_window   = HCI_DEF_INQUIRYSCAN_WINDOW;
    635         btm_cb.btm_inq_vars.inq_scan_period   = HCI_DEF_INQUIRYSCAN_INTERVAL;
    636         btm_cb.btm_inq_vars.inq_scan_type     = HCI_DEF_SCAN_TYPE;
    637 
    638         btm_cb.btm_inq_vars.page_scan_window  = HCI_DEF_PAGESCAN_WINDOW;
    639         btm_cb.btm_inq_vars.page_scan_period  = HCI_DEF_PAGESCAN_INTERVAL;
    640         btm_cb.btm_inq_vars.page_scan_type    = HCI_DEF_SCAN_TYPE;
    641 
    642 #if (BTM_AFTER_RESET_TIMEOUT > 0)
    643         btu_start_timer (&btm_cb.devcb.reset_timer, BTU_TTYPE_BTM_DEV_CTL,
    644                          BTM_AFTER_RESET_TIMEOUT);
    645 #else
    646         btm_cb.devcb.state = BTM_DEV_STATE_WAIT_AFTER_RESET;
    647         btm_after_reset_hold_complete();
    648 #endif
    649 
    650 #if (BLE_INCLUDED == TRUE)
    651      btm_cb.ble_ctr_cb.conn_state = BLE_CONN_IDLE;
    652      btm_cb.ble_ctr_cb.bg_dev_num = 0;
    653      btm_cb.ble_ctr_cb.bg_conn_type = BTM_BLE_CONN_NONE;
    654      btm_cb.ble_ctr_cb.p_select_cback = NULL;
    655      memset(&btm_cb.ble_ctr_cb.bg_dev_list, 0, (sizeof(tBTM_LE_BG_CONN_DEV)*BTM_BLE_MAX_BG_CONN_DEV_NUM));
    656      gatt_reset_bgdev_list();
    657 #endif
    658     }
    659 }
    660 
    661 /*******************************************************************************
    662 **
    663 ** Function         btm_continue_reset
    664 **
    665 ** Description      This function is called when wait period expired after
    666 **                  device reset or called by the application to continue
    667 **                  initialization after the application has completed its
    668 **                  vendor specific sequence.
    669 **
    670 ** Returns          void
    671 **
    672 *******************************************************************************/
    673 void btm_continue_reset (void)
    674 {
    675 
    676     /* Reinitialize the default class of device */
    677 #if BTM_INTERNAL_BB == TRUE
    678     btsnd_hcic_read_bd_addr ();
    679 #if BTM_PWR_MGR_INCLUDED == TRUE
    680     btm_pm_reset();
    681 #endif
    682 #endif
    683 
    684     btm_get_hci_buf_size ();
    685 
    686     /* default device class */
    687     BTM_SetDeviceClass((UINT8 *) BTM_INIT_CLASS_OF_DEVICE);
    688 
    689 #if (BTM_MAX_LOC_BD_NAME_LEN > 0) && (BTM_SET_DEV_NAME_UPON_RESET == TRUE)
    690     BTM_SetLocalDeviceName(btm_cb.cfg.bd_name);
    691 #elif BTM_USE_DEF_LOCAL_NAME == TRUE
    692     BTM_SetLocalDeviceName(BTM_DEF_LOCAL_NAME);
    693 #endif
    694 
    695     BTM_SetPinType (btm_cb.cfg.pin_type, btm_cb.cfg.pin_code, btm_cb.cfg.pin_code_len);
    696 }
    697 
    698 /*******************************************************************************
    699 **
    700 ** Function         btm_after_reset_hold_complete
    701 **
    702 ** Description      This function is called when wait period expired after
    703 **                  device reset.  Continue intitialization
    704 **
    705 ** Returns          void
    706 **
    707 *******************************************************************************/
    708 void btm_after_reset_hold_complete (void)
    709 {
    710 #ifdef BTM_APP_DEV_INIT
    711     btu_stop_timer(&btm_cb.devcb.reset_timer);
    712     BTM_APP_DEV_INIT();
    713 #else
    714     btm_continue_reset();
    715 #endif
    716 }
    717 
    718 
    719 /*******************************************************************************
    720 **
    721 ** Function         btm_read_hci_buf_size_complete
    722 **
    723 ** Description      This function is called when command complete for
    724 **                  get HCI buffer size is received.  Start timer and send
    725 **                  read local features request
    726 **
    727 ** Returns          void
    728 **
    729 *******************************************************************************/
    730 void btm_read_hci_buf_size_complete (UINT8 *p, UINT16 evt_len)
    731 {
    732     UINT8       status;
    733     UINT8       lm_sco_buf_size;
    734     UINT16      lm_num_acl_bufs;
    735     UINT16      lm_num_sco_bufs;
    736     UINT16      acl_buf_size;
    737 
    738     STREAM_TO_UINT8  (status, p);
    739     if (status == HCI_SUCCESS)
    740     {
    741         STREAM_TO_UINT16 (btu_cb.hcit_acl_data_size, p);
    742         STREAM_TO_UINT8  (lm_sco_buf_size,   p);
    743         STREAM_TO_UINT16 (lm_num_acl_bufs,   p);
    744         STREAM_TO_UINT16 (lm_num_sco_bufs,   p);
    745 
    746         btu_cb.hcit_acl_pkt_size = btu_cb.hcit_acl_data_size + HCI_DATA_PREAMBLE_SIZE;
    747 
    748         l2c_link_processs_num_bufs (lm_num_acl_bufs);
    749 
    750 #if BTM_ACL_BUF_SIZE > 0
    751         acl_buf_size = (BTM_ACL_BUF_SIZE < L2CAP_MTU_SIZE) ? BTM_ACL_BUF_SIZE : L2CAP_MTU_SIZE;
    752 #else
    753         acl_buf_size = L2CAP_MTU_SIZE;
    754 #endif
    755         /* Tell the controller what our buffer sizes are. ?? Need SCO info */
    756         btsnd_hcic_set_host_buf_size (acl_buf_size, BTM_SCO_HOST_BUF_SIZE, L2CAP_HOST_FC_ACL_BUFS, 10);
    757 
    758 #if L2CAP_HOST_FLOW_CTRL == TRUE
    759         btsnd_hcic_set_host_flow_ctrl (HCI_HOST_FLOW_CTRL_ACL_ON);
    760 #endif
    761     }
    762 
    763     /* Set the device into connectable and/or discoverable mode (if configured to do so) */
    764 #if BTM_IS_CONNECTABLE == TRUE
    765     (void) BTM_SetConnectability (BTM_CONNECTABLE, BTM_DEFAULT_CONN_WINDOW, BTM_DEFAULT_CONN_INTERVAL);
    766 #endif
    767 
    768 #if BTM_IS_DISCOVERABLE == TRUE
    769     (void) BTM_SetDiscoverability (BTM_DEFAULT_DISC_MODE, BTM_DEFAULT_DISC_WINDOW, BTM_DEFAULT_DISC_INTERVAL);
    770 #endif
    771 
    772 #if BTM_INTERNAL_BB == TRUE
    773     {
    774         UINT8 buf[9] = BTM_INTERNAL_LOCAL_VER;
    775         btm_read_local_version_complete( buf, 9 );
    776     }
    777 #else
    778     btm_get_local_version ();
    779 #endif
    780 }
    781 
    782 #if (BLE_INCLUDED == TRUE)
    783 /*******************************************************************************
    784 **
    785 ** Function         btm_read_ble_buf_size_complete
    786 **
    787 ** Description      This function is called when command complete for
    788 **                  get HCI buffer size is received.  Start timer and send
    789 **                  read local supported features request
    790 **
    791 ** Returns          void
    792 **
    793 *******************************************************************************/
    794 void btm_read_ble_buf_size_complete (UINT8 *p, UINT16 evt_len)
    795 {
    796     UINT8       status;
    797     UINT16      lm_num_le_bufs;
    798 
    799      BTM_TRACE_DEBUG0("btm_read_ble_buf_size_complete ");
    800     STREAM_TO_UINT8  (status, p);
    801     if (status == HCI_SUCCESS)
    802     {
    803         STREAM_TO_UINT16 (btu_cb.hcit_ble_acl_data_size, p);
    804         STREAM_TO_UINT8 (lm_num_le_bufs,   p);
    805 
    806         if (btu_cb.hcit_ble_acl_data_size == 0)
    807             btu_cb.hcit_ble_acl_data_size = btu_cb.hcit_acl_data_size;
    808 
    809         btu_cb.hcit_ble_acl_pkt_size = btu_cb.hcit_ble_acl_data_size + HCI_DATA_PREAMBLE_SIZE;
    810 
    811         l2c_link_processs_ble_num_bufs (lm_num_le_bufs);
    812     }
    813 
    814     btm_read_ble_local_supported_features();
    815 }
    816 
    817 /*******************************************************************************
    818 **
    819 ** Function         btm_read_ble_local_supported_features_complete
    820 **
    821 ** Description      This function is called when command complete for
    822 **                  Read LE Local Supported Features is received.  Start timer and send
    823 **                  read LMP local features request
    824 **
    825 ** Returns          void
    826 **
    827 *******************************************************************************/
    828 void btm_read_ble_local_supported_features_complete (UINT8 *p, UINT16 evt_len)
    829 {
    830     UINT8       status;
    831 
    832     BTM_TRACE_DEBUG0("btm_read_ble_local_supported_features_complete ");
    833 
    834     btu_stop_timer (&btm_cb.devcb.reset_timer);
    835 
    836     STREAM_TO_UINT8  (status, p);
    837     if (status == HCI_SUCCESS)
    838     {
    839         STREAM_TO_ARRAY(&btm_cb.devcb.local_le_features, p, HCI_FEATURE_BYTES_PER_PAGE);
    840     }
    841     else
    842     {
    843         BTM_TRACE_WARNING1 ("btm_read_ble_local_supported_features_complete status = %d", status);
    844     }
    845 
    846 #if BTM_INTERNAL_BB == TRUE
    847     {
    848         UINT8 buf[9] = BTM_INTERNAL_LOCAL_FEA;
    849         btm_read_local_features_complete( buf, 9 );
    850     }
    851 #else
    852 
    853     /* get local feature if BRCM specific feature is not included  */
    854     btm_reset_ctrlr_complete();
    855 #endif
    856 
    857 }
    858 
    859 /*******************************************************************************
    860 **
    861 ** Function         btm_read_white_list_size_complete
    862 **
    863 ** Description      This function read the current white list size.
    864 *******************************************************************************/
    865 void btm_read_white_list_size_complete(UINT8 *p, UINT16 evt_len)
    866 {
    867     UINT8       status;
    868 
    869      BTM_TRACE_DEBUG0("btm_read_white_list_size_complete ");
    870     STREAM_TO_UINT8  (status, p);
    871 
    872     if (status == HCI_SUCCESS)
    873     {
    874         STREAM_TO_UINT8(btm_cb.ble_ctr_cb.max_filter_entries, p);
    875         btm_cb.ble_ctr_cb.num_empty_filter = btm_cb.ble_ctr_cb.max_filter_entries;
    876     }
    877 
    878     btm_get_ble_buffer_size();
    879 }
    880 
    881 #endif
    882 /*******************************************************************************
    883 **
    884 ** Function         btm_read_local_version_complete
    885 **
    886 ** Description      This function is called when local BD Addr read complete
    887 **                  message is received from the HCI.
    888 **
    889 ** Returns          void
    890 **
    891 *******************************************************************************/
    892 void btm_read_local_version_complete (UINT8 *p, UINT16 evt_len)
    893 {
    894     tBTM_VERSION_INFO   *p_vi = &btm_cb.devcb.local_version;
    895     UINT8                status;
    896 
    897 #ifdef BTA_PRM_CHECK_FW_VER
    898     if(BTA_PRM_CHECK_FW_VER(p))
    899         return;
    900 #endif
    901 
    902     STREAM_TO_UINT8  (status, p);
    903     if (status == HCI_SUCCESS)
    904     {
    905 
    906         STREAM_TO_UINT8  (p_vi->hci_version, p);
    907         STREAM_TO_UINT16 (p_vi->hci_revision, p);
    908         STREAM_TO_UINT8  (p_vi->lmp_version, p);
    909         STREAM_TO_UINT16 (p_vi->manufacturer, p);
    910         STREAM_TO_UINT16 (p_vi->lmp_subversion, p);
    911     }
    912 
    913     if (p_vi->hci_version >= HCI_PROTO_VERSION_1_2)
    914     {
    915         btm_read_local_supported_cmds(LOCAL_BR_EDR_CONTROLLER_ID);
    916     }
    917     else
    918     {
    919         btm_get_local_features ();
    920     }
    921 }
    922 
    923 /*******************************************************************************
    924 **
    925 ** Function         btm_decode_ext_features_page
    926 **
    927 ** Description      This function is decodes a features page.
    928 **
    929 ** Returns          void
    930 **
    931 *******************************************************************************/
    932 static void btm_decode_ext_features_page (UINT8 page_number, const UINT8 *p_features)
    933 {
    934     UINT8 last;
    935     UINT8 first;
    936 
    937     BTM_TRACE_DEBUG1 ("btm_decode_ext_features_page page: %d", page_number);
    938     switch (page_number)
    939     {
    940     /* Extended (Legacy) Page 0 */
    941     case HCI_EXT_FEATURES_PAGE_0:
    942 
    943         /* Create ACL supported packet types mask */
    944         btm_cb.btm_acl_pkt_types_supported = (BTM_ACL_PKT_TYPES_MASK_DH1 +
    945                                               BTM_ACL_PKT_TYPES_MASK_DM1);
    946 
    947         if (HCI_3_SLOT_PACKETS_SUPPORTED(p_features))
    948             btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_DH3 +
    949                                                    BTM_ACL_PKT_TYPES_MASK_DM3);
    950 
    951         if (HCI_5_SLOT_PACKETS_SUPPORTED(p_features))
    952             btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_DH5 +
    953                                                    BTM_ACL_PKT_TYPES_MASK_DM5);
    954 
    955         /* _NO_X_DXX masks are reserved before ver 2.0.
    956            Set them only for later versions of controller */
    957         if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0)
    958         {
    959             /* Add in EDR related ACL types */
    960             if (!HCI_EDR_ACL_2MPS_SUPPORTED(p_features))
    961             {
    962                 btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH1 +
    963                                                        BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 +
    964                                                        BTM_ACL_PKT_TYPES_MASK_NO_2_DH5);
    965             }
    966 
    967             if (!HCI_EDR_ACL_3MPS_SUPPORTED(p_features))
    968             {
    969                 btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_3_DH1 +
    970                                                        BTM_ACL_PKT_TYPES_MASK_NO_3_DH3 +
    971                                                        BTM_ACL_PKT_TYPES_MASK_NO_3_DH5);
    972             }
    973 
    974             /* Check to see if 3 and 5 slot packets are available */
    975             if (HCI_EDR_ACL_2MPS_SUPPORTED(p_features) ||
    976                 HCI_EDR_ACL_3MPS_SUPPORTED(p_features))
    977             {
    978                 if (!HCI_3_SLOT_EDR_ACL_SUPPORTED(p_features))
    979                     btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 +
    980                                                            BTM_ACL_PKT_TYPES_MASK_NO_3_DH3);
    981 
    982                 if (!HCI_5_SLOT_EDR_ACL_SUPPORTED(p_features))
    983                     btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH5 +
    984                                                            BTM_ACL_PKT_TYPES_MASK_NO_3_DH5);
    985             }
    986         }
    987 
    988         BTM_TRACE_DEBUG1("Local supported ACL packet types: 0x%04x",
    989                          btm_cb.btm_acl_pkt_types_supported);
    990 
    991         /* Create (e)SCO supported packet types mask */
    992         btm_cb.btm_sco_pkt_types_supported = 0;
    993 #if BTM_SCO_INCLUDED == TRUE
    994         btm_cb.sco_cb.esco_supported = FALSE;
    995 #endif
    996         if (HCI_SCO_LINK_SUPPORTED(p_features))
    997         {
    998             btm_cb.btm_sco_pkt_types_supported = BTM_SCO_PKT_TYPES_MASK_HV1;
    999 
   1000             if (HCI_HV2_PACKETS_SUPPORTED(p_features))
   1001                 btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV2;
   1002 
   1003             if (HCI_HV3_PACKETS_SUPPORTED(p_features))
   1004                 btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV3;
   1005         }
   1006 
   1007         if (HCI_ESCO_EV3_SUPPORTED(p_features))
   1008             btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV3;
   1009 
   1010         if (HCI_ESCO_EV4_SUPPORTED(p_features))
   1011             btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV4;
   1012 
   1013         if (HCI_ESCO_EV5_SUPPORTED(p_features))
   1014             btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV5;
   1015 #if BTM_SCO_INCLUDED == TRUE
   1016         if (btm_cb.btm_sco_pkt_types_supported & BTM_ESCO_LINK_ONLY_MASK)
   1017         {
   1018             btm_cb.sco_cb.esco_supported = TRUE;
   1019 
   1020             /* Add in EDR related eSCO types */
   1021             if (HCI_EDR_ESCO_2MPS_SUPPORTED(p_features))
   1022             {
   1023                 if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features))
   1024                     btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_NO_2_EV5;
   1025             }
   1026             else
   1027             {
   1028                 btm_cb.btm_sco_pkt_types_supported |= (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 +
   1029                                                        BTM_SCO_PKT_TYPES_MASK_NO_2_EV5);
   1030             }
   1031 
   1032             if (HCI_EDR_ESCO_3MPS_SUPPORTED(p_features))
   1033             {
   1034                 if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features))
   1035                     btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_NO_3_EV5;
   1036             }
   1037             else
   1038             {
   1039                 btm_cb.btm_sco_pkt_types_supported |= (BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 +
   1040                                                        BTM_SCO_PKT_TYPES_MASK_NO_3_EV5);
   1041             }
   1042         }
   1043 #endif
   1044 
   1045         BTM_TRACE_DEBUG1("Local supported SCO packet types: 0x%04x",
   1046                          btm_cb.btm_sco_pkt_types_supported);
   1047 
   1048         /* Create Default Policy Settings */
   1049         if (HCI_SWITCH_SUPPORTED(p_features))
   1050             btm_cb.btm_def_link_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
   1051         else
   1052             btm_cb.btm_def_link_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
   1053 
   1054         if (HCI_HOLD_MODE_SUPPORTED(p_features))
   1055             btm_cb.btm_def_link_policy |= HCI_ENABLE_HOLD_MODE;
   1056         else
   1057             btm_cb.btm_def_link_policy &= ~HCI_ENABLE_HOLD_MODE;
   1058 
   1059         if (HCI_SNIFF_MODE_SUPPORTED(p_features))
   1060             btm_cb.btm_def_link_policy |= HCI_ENABLE_SNIFF_MODE;
   1061         else
   1062             btm_cb.btm_def_link_policy &= ~HCI_ENABLE_SNIFF_MODE;
   1063 
   1064         if (HCI_PARK_MODE_SUPPORTED(p_features))
   1065             btm_cb.btm_def_link_policy |= HCI_ENABLE_PARK_MODE;
   1066         else
   1067             btm_cb.btm_def_link_policy &= ~HCI_ENABLE_PARK_MODE;
   1068 
   1069         btm_sec_dev_reset ();
   1070 #if ((BTM_EIR_SERVER_INCLUDED == TRUE)||(BTM_EIR_CLIENT_INCLUDED == TRUE))
   1071         if (HCI_LMP_INQ_RSSI_SUPPORTED(p_features))
   1072         {
   1073             if (HCI_EXT_INQ_RSP_SUPPORTED(p_features))
   1074                 BTM_SetInquiryMode (BTM_INQ_RESULT_EXTENDED);
   1075             else
   1076                 BTM_SetInquiryMode (BTM_INQ_RESULT_WITH_RSSI);
   1077         }
   1078 #else
   1079         if (HCI_LMP_INQ_RSSI_SUPPORTED(p_features))
   1080             BTM_SetInquiryMode (BTM_INQ_RESULT_WITH_RSSI);
   1081 #endif
   1082 #if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE
   1083         if( HCI_NON_FLUSHABLE_PB_SUPPORTED(p_features))
   1084             l2cu_set_non_flushable_pbf(TRUE);
   1085         else
   1086             l2cu_set_non_flushable_pbf(FALSE);
   1087 #endif
   1088         BTM_SetPageScanType (BTM_DEFAULT_SCAN_TYPE);
   1089         BTM_SetInquiryScanType (BTM_DEFAULT_SCAN_TYPE);
   1090 
   1091         break;
   1092 
   1093     /* Extended Page 1 */
   1094     case HCI_EXT_FEATURES_PAGE_1:
   1095         /* Nothing to do for page 1 */
   1096         break;
   1097 
   1098     /* Extended Page 2 */
   1099     case HCI_EXT_FEATURES_PAGE_2:
   1100         /* Nothing to do for page 2 */
   1101         break;
   1102 
   1103     default:
   1104         BTM_TRACE_ERROR1("btm_decode_ext_features_page page=%d unknown", page_number);
   1105         break;
   1106     }
   1107 }
   1108 
   1109 /*******************************************************************************
   1110 **
   1111 ** Function         btm_reset_ctrlr_complete
   1112 **
   1113 ** Description      This is the last step of BR/EDR controller startup sequence.
   1114 **
   1115 ** Returns          void
   1116 **
   1117 *******************************************************************************/
   1118 void btm_reset_ctrlr_complete ()
   1119 {
   1120     tBTM_DEVCB     *p_devcb = &btm_cb.devcb;
   1121     tBTM_CMPL_CB   *p_cb = p_devcb->p_reset_cmpl_cb;
   1122     BOOLEAN         found = FALSE;
   1123     UINT8           i, j, max_page_number;
   1124 
   1125     btu_stop_timer (&btm_cb.devcb.reset_timer);
   1126 
   1127     /* find the highest feature page number which contains non-zero bits */
   1128     for (i = HCI_EXT_FEATURES_PAGE_MAX; i >= 0; i--)
   1129     {
   1130         for (j = 0; j < HCI_FEATURE_BYTES_PER_PAGE; j++)
   1131         {
   1132             if (p_devcb->local_lmp_features[i][j] != 0)
   1133             {
   1134                 found = TRUE;
   1135                 break;
   1136             }
   1137         }
   1138         if (found || !i)
   1139         {
   1140              break;
   1141         }
   1142     }
   1143 
   1144     if (!found)
   1145         BTM_TRACE_WARNING0 ("btm_reset_ctrlr_complete: NONE of local controller features is set");
   1146 
   1147     max_page_number = i;
   1148 
   1149     BTM_TRACE_DEBUG1 ("btm_reset_ctrlr_complete: max_page_number: %d", max_page_number);
   1150 
   1151     /*
   1152     * Set State to Ready (needs to be done before btm_decode_ext_features_page
   1153     * to allow it to send some HCI configuration commands)
   1154     */
   1155     p_devcb->state = BTM_DEV_STATE_READY;
   1156 
   1157     /* For every received/saved feature page */
   1158     for (i = 0; i <= max_page_number; i++)
   1159     {
   1160         /* Decode the saved Feature Page */
   1161         btm_decode_ext_features_page(i, p_devcb->local_lmp_features[i]);
   1162     }
   1163 
   1164     /* If there was a callback address for reset complete, reset it */
   1165     p_devcb->p_reset_cmpl_cb = NULL;
   1166 
   1167     /* If anyone wants device status notifications, give him one */
   1168     btm_report_device_status(BTM_DEV_STATUS_UP);
   1169 
   1170     /* Reset sequence is complete. If this was an application originated */
   1171     /* reset, tell him its done.                                         */
   1172     if (p_cb)
   1173         (*p_cb)((void *) NULL);
   1174 }
   1175 
   1176 /*******************************************************************************
   1177 **
   1178 ** Function         btm_issue_host_support_for_lmp_features
   1179 **
   1180 ** Description      This function:
   1181 **                  - issues commands to set host supported LMP features (one at
   1182 **                    a time);
   1183 **                  - after this is done it issues command to re-read LMP features
   1184 **                    page 1;
   1185 **                  - after this is done it calls the last step of BR/EDR
   1186 **                    controller startup sequence.
   1187 **
   1188 ** Returns          void
   1189 **
   1190 *******************************************************************************/
   1191 static void btm_issue_host_support_for_lmp_features (void)
   1192 {
   1193     BTM_TRACE_DEBUG1("btm_issue_host_support_for_lmp_features lmp_features_host_may_support: 0x%02x", btm_cb.devcb.lmp_features_host_may_support);
   1194 
   1195     if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SSP)
   1196     {
   1197         btsnd_hcic_write_simple_pairing_mode(HCI_SP_MODE_ENABLED);
   1198         return;
   1199     }
   1200 
   1201 #if (BLE_INCLUDED == TRUE)
   1202     if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_LE)
   1203     {
   1204         if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SIMULT_BR_LE)
   1205         {
   1206             /* At the moment the host can't work simultaneously with BR/EDR and LE */
   1207             btsnd_hcic_ble_write_host_supported(BTM_BLE_HOST_SUPPORT, 0);
   1208         }
   1209         else
   1210         {
   1211             btsnd_hcic_ble_write_host_supported(BTM_BLE_HOST_SUPPORT, 0);
   1212         }
   1213         return;
   1214     }
   1215 #endif
   1216 
   1217     if (btm_cb.devcb.lmp_features_host_may_support & BTM_RE_READ_1ST_PAGE)
   1218     {
   1219         btm_get_local_ext_features(HCI_EXT_FEATURES_PAGE_1);
   1220         return;
   1221     }
   1222 
   1223     if (!btm_cb.devcb.lmp_features_host_may_support)
   1224     {
   1225 #if BLE_INCLUDED == TRUE
   1226         if (HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
   1227         {
   1228             btm_read_ble_wl_size();
   1229         }
   1230         else
   1231 #elif BTM_INTERNAL_BB == TRUE
   1232         {
   1233             UINT8 buf[9] = BTM_INTERNAL_LOCAL_FEA;
   1234             btm_read_local_features_complete( buf, 9 );
   1235         }
   1236 #endif
   1237         {
   1238             btm_reset_ctrlr_complete();
   1239         }
   1240         return;
   1241     }
   1242 
   1243     BTM_TRACE_ERROR2("%s lmp_features_host_may_support: 0x%02x. This is unexpected.",__FUNCTION__,
   1244                       btm_cb.devcb.lmp_features_host_may_support);
   1245 }
   1246 
   1247 /*******************************************************************************
   1248 **
   1249 ** Function         btm_set_lmp_features_host_may_support
   1250 **
   1251 ** Description      This function is called after all LMP features provided by
   1252 **                  controller are read. It sets the mask that indicates LMP
   1253 **                  features the host may support based on LMP features supported
   1254 **                  by controller.
   1255 **                  Example:
   1256 **                  Host may set SSP (host support) bit only if SSP (controller
   1257 **                  support) bit is set by controller.
   1258 **
   1259 ** Returns          void
   1260 **
   1261 *******************************************************************************/
   1262 static void btm_set_lmp_features_host_may_support (UINT8 max_page_number)
   1263 {
   1264     btm_cb.devcb.lmp_features_host_may_support = 0;
   1265 
   1266     /* LMP page 0 is always read */
   1267     if (HCI_SIMPLE_PAIRING_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   1268     {
   1269         /* host may support SSP */
   1270         btm_cb.devcb.lmp_features_host_may_support |= BTM_HOST_MAY_SUPP_SSP;
   1271     }
   1272 
   1273 #if (BLE_INCLUDED == TRUE)
   1274     if (HCI_LE_SPT_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   1275     {
   1276         /* host may support LE */
   1277         btm_cb.devcb.lmp_features_host_may_support |= BTM_HOST_MAY_SUPP_LE;
   1278 
   1279         if (HCI_SIMUL_LE_BREDR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
   1280         {
   1281             /* host may support BR/EDR and LE simultaneously */
   1282             btm_cb.devcb.lmp_features_host_may_support |= BTM_HOST_MAY_SUPP_SIMULT_BR_LE;
   1283         }
   1284     }
   1285 #endif
   1286 
   1287     if (max_page_number >= HCI_EXT_FEATURES_PAGE_1)
   1288     {
   1289         /* nothing yet for HCI_EXT_FEATURES_PAGE_1 */
   1290     }
   1291 
   1292     if (max_page_number >= HCI_EXT_FEATURES_PAGE_1)
   1293     {
   1294         /* nothing yet for HCI_EXT_FEATURES_PAGE_2 */
   1295     }
   1296 
   1297     if (btm_cb.devcb.lmp_features_host_may_support)
   1298         btm_cb.devcb.lmp_features_host_may_support |= BTM_RE_READ_1ST_PAGE;
   1299 }
   1300 
   1301 /*******************************************************************************
   1302 **
   1303 ** Function         btm_read_all_lmp_features_complete
   1304 **
   1305 ** Description      This function is called after all LMP features provided by
   1306 **                  controller are read.
   1307 **                  It works with controller supported LMP features which host
   1308 **                  may support too.
   1309 **
   1310 ** Returns          void
   1311 **
   1312 *******************************************************************************/
   1313 static void btm_read_all_lmp_features_complete (UINT8 max_page_number)
   1314 {
   1315     btm_set_lmp_features_host_may_support(max_page_number);
   1316 
   1317     btm_issue_host_support_for_lmp_features();
   1318 }
   1319 
   1320 /*******************************************************************************
   1321 **
   1322 ** Function         btm_read_local_features_complete
   1323 **
   1324 ** Description      This function is called when local supported features read
   1325 **                  is complete.
   1326 **
   1327 ** Returns          void
   1328 **
   1329 *******************************************************************************/
   1330 void btm_read_local_features_complete (UINT8 *p, UINT16 evt_len)
   1331 {
   1332     tBTM_DEVCB     *p_devcb = &btm_cb.devcb;
   1333     UINT8           status;
   1334 
   1335     btu_stop_timer (&p_devcb->reset_timer);
   1336 
   1337     STREAM_TO_UINT8  (status, p);
   1338     if (status == HCI_SUCCESS)
   1339     {
   1340         /* Save the Feature Page 0 */
   1341         STREAM_TO_ARRAY(p_devcb->local_lmp_features[0],
   1342                 p, HCI_FEATURE_BYTES_PER_PAGE);
   1343 
   1344         if ((HCI_LMP_EXTENDED_SUPPORTED(p_devcb->local_lmp_features[HCI_EXT_FEATURES_PAGE_0])) &&
   1345             (HCI_READ_LOCAL_EXT_FEATURES_SUPPORTED(p_devcb->supported_cmds)))
   1346         {
   1347             /* if local controller has extended features and supports
   1348             **HCI_Read_Local_Extended_Features command,
   1349             ** then start reading these feature starting with extended features page 1 */
   1350             BTM_TRACE_DEBUG0 ("Start reading local extended features");
   1351             btm_get_local_ext_features(HCI_EXT_FEATURES_PAGE_1);
   1352         }
   1353         else
   1354         {
   1355             btm_read_all_lmp_features_complete (HCI_EXT_FEATURES_PAGE_0);
   1356         }
   1357     }
   1358 }
   1359 
   1360 /*******************************************************************************
   1361 **
   1362 ** Function         btm_read_local_ext_features_complete
   1363 **
   1364 ** Description      This function is called when read local extended features
   1365 **                  command complete message is received from the HCI.
   1366 **
   1367 ** Returns          void
   1368 **
   1369 *******************************************************************************/
   1370 void btm_read_local_ext_features_complete (UINT8 *p, UINT16 evt_len)
   1371 {
   1372     tBTM_DEVCB     *p_devcb = &btm_cb.devcb;
   1373     tBTM_CMPL_CB   *p_cb = p_devcb->p_reset_cmpl_cb;
   1374     UINT8           status;
   1375     UINT8           page_number;
   1376     UINT8           page_number_max;
   1377 
   1378     btu_stop_timer (&btm_cb.devcb.reset_timer);
   1379 
   1380     STREAM_TO_UINT8 (status, p);
   1381 
   1382     if (status != HCI_SUCCESS)
   1383     {
   1384         BTM_TRACE_WARNING1("btm_read_local_ext_features_complete status = 0x%02X", status);
   1385         btm_read_all_lmp_features_complete (HCI_EXT_FEATURES_PAGE_0);
   1386         return;
   1387     }
   1388 
   1389     /* Extract Page number */
   1390     STREAM_TO_UINT8  (page_number, p);
   1391 
   1392     /* Extract Page number Max */
   1393     STREAM_TO_UINT8  (page_number_max, p);
   1394 
   1395     if (page_number > HCI_EXT_FEATURES_PAGE_MAX)
   1396     {
   1397         BTM_TRACE_ERROR1("btm_read_local_ext_features_complete page=%d unknown",
   1398                 page_number);
   1399         return;
   1400     }
   1401 
   1402     /* Save the extended features Page received */
   1403     STREAM_TO_ARRAY(btm_cb.devcb.local_lmp_features[page_number],
   1404             p, HCI_FEATURE_BYTES_PER_PAGE);
   1405 
   1406     /* If this is re-read of the 1-st extended page after host supported LMP features are set */
   1407     if ((page_number == HCI_EXT_FEATURES_PAGE_1) &&
   1408         (btm_cb.devcb.lmp_features_host_may_support == BTM_RE_READ_1ST_PAGE))
   1409     {
   1410         btm_cb.devcb.lmp_features_host_may_support &= ~BTM_RE_READ_1ST_PAGE;
   1411         btm_issue_host_support_for_lmp_features();
   1412         return;
   1413     }
   1414 
   1415     /* If this is the last page supported by the local BT controller OR */
   1416     /* if this is the last page supported by the Host */
   1417     if ((page_number == page_number_max) ||
   1418         (page_number == HCI_EXT_FEATURES_PAGE_MAX))
   1419     {
   1420         BTM_TRACE_DEBUG1("BTM reached last extended features page (%d)", page_number);
   1421         btm_read_all_lmp_features_complete(page_number);
   1422     }
   1423     /* Else (another page must be read) */
   1424     else
   1425     {
   1426         /* Read the next features page */
   1427         page_number++;
   1428         BTM_TRACE_DEBUG1("BTM reads next extended features page (%d)", page_number);
   1429         btm_get_local_ext_features(page_number);
   1430     }
   1431 }
   1432 
   1433 /*******************************************************************************
   1434 **
   1435 ** Function         btm_read_local_supported_cmds_complete
   1436 **
   1437 ** Description      This function is called when local supported commands read
   1438 **                  is complete.
   1439 **
   1440 ** Returns          void
   1441 **
   1442 *******************************************************************************/
   1443 void btm_read_local_supported_cmds_complete (UINT8 *p)
   1444 {
   1445     tBTM_DEVCB     *p_devcb = &btm_cb.devcb;
   1446     UINT8           status;
   1447 
   1448     btu_stop_timer (&(p_devcb->reset_timer));
   1449 
   1450     STREAM_TO_UINT8  (status, p);
   1451     BTM_TRACE_DEBUG1("btm_read_local_supported_cmds_complete status (0x%02x)", status);
   1452 
   1453     if (status == HCI_SUCCESS)
   1454     {
   1455         /* Save the supported commands bit mask */
   1456         STREAM_TO_ARRAY(p_devcb->supported_cmds, p, HCI_NUM_SUPP_COMMANDS_BYTES);
   1457     }
   1458 
   1459     btm_get_local_features();
   1460 }
   1461 
   1462 /*******************************************************************************
   1463 **
   1464 ** Function         btm_write_simple_paring_mode_complete
   1465 **
   1466 ** Description      This function is called when the command complete message
   1467 **                  is received from the HCI for the write simple pairing mode
   1468 **                  command.
   1469 **
   1470 ** Returns          void
   1471 **
   1472 *******************************************************************************/
   1473 void btm_write_simple_paring_mode_complete (UINT8 *p)
   1474 {
   1475     UINT8   status;
   1476 
   1477     STREAM_TO_UINT8 (status, p);
   1478 
   1479     if (status != HCI_SUCCESS)
   1480     {
   1481         BTM_TRACE_WARNING1("btm_write_simple_paring_mode_complete status: 0x%02x", status);
   1482     }
   1483 
   1484     if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SSP)
   1485     {
   1486         btm_cb.devcb.lmp_features_host_may_support &= ~BTM_HOST_MAY_SUPP_SSP;
   1487         btm_issue_host_support_for_lmp_features();
   1488     }
   1489 }
   1490 
   1491 /*******************************************************************************
   1492 **
   1493 ** Function         btm_write_le_host_supported_complete
   1494 **
   1495 ** Description      This function is called when the command complete message
   1496 **                  is received from the HCI for the write LE host supported
   1497 **                  command.
   1498 **
   1499 ** Returns          void
   1500 **
   1501 *******************************************************************************/
   1502 void btm_write_le_host_supported_complete (UINT8 *p)
   1503 {
   1504     UINT8   status;
   1505 
   1506     STREAM_TO_UINT8 (status, p);
   1507 
   1508     if (status != HCI_SUCCESS)
   1509     {
   1510         BTM_TRACE_WARNING1("btm_write_le_host_supported_complete status: 0x%02x", status);
   1511     }
   1512 
   1513     if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_LE)
   1514     {
   1515         btm_cb.devcb.lmp_features_host_may_support &= ~BTM_HOST_MAY_SUPP_LE;
   1516         if (btm_cb.devcb.lmp_features_host_may_support & BTM_HOST_MAY_SUPP_SIMULT_BR_LE)
   1517         {
   1518             btm_cb.devcb.lmp_features_host_may_support &= ~BTM_HOST_MAY_SUPP_SIMULT_BR_LE;
   1519         }
   1520         btm_issue_host_support_for_lmp_features();
   1521     }
   1522 }
   1523 
   1524 /*******************************************************************************
   1525 **
   1526 ** Function         btm_get_voice_coding_support
   1527 **
   1528 ** Description      This function is provides a way to get the voice coding schemes
   1529 **                  supported the device.
   1530 **
   1531 ** Returns          A bit mask - Bit 0 if set indicates CVSD support
   1532 **                               Bit 1 if set indicates PCM A-law support
   1533 **                               Bit 2 if set indicates PCM Mu-law support
   1534 **
   1535 *******************************************************************************/
   1536 
   1537 UINT8 btm_get_voice_coding_support( void )
   1538 {
   1539     UINT8 code = 0;
   1540 
   1541     if( HCI_LMP_CVSD_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]) ) code |= 0x01 ;
   1542     if( HCI_LMP_A_LAW_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]) ) code |= 0x02 ;
   1543     if( HCI_LMP_U_LAW_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]) )  code |= 0x04 ;
   1544 
   1545     return code ;
   1546 }
   1547 
   1548 /*******************************************************************************
   1549 **
   1550 ** Function         BTM_SetLocalDeviceName
   1551 **
   1552 ** Description      This function is called to set the local device name.
   1553 **
   1554 ** Returns          status of the operation
   1555 **
   1556 *******************************************************************************/
   1557 tBTM_STATUS BTM_SetLocalDeviceName (char *p_name)
   1558 {
   1559     UINT8    *p;
   1560 
   1561     if (!p_name || !p_name[0] || (strlen ((char *)p_name) > BD_NAME_LEN))
   1562         return (BTM_ILLEGAL_VALUE);
   1563 
   1564     if (btm_cb.devcb.state == BTM_DEV_STATE_WAIT_RESET_CMPLT ||
   1565         btm_cb.devcb.state == BTM_DEV_STATE_WAIT_AFTER_RESET)
   1566         return (BTM_DEV_RESET);
   1567 
   1568 #if BTM_MAX_LOC_BD_NAME_LEN > 0
   1569     /* Save the device name if local storage is enabled */
   1570     p = (UINT8 *)btm_cb.cfg.bd_name;
   1571     if (p != (UINT8 *)p_name)
   1572     {
   1573         BCM_STRNCPY_S(btm_cb.cfg.bd_name, sizeof(btm_cb.cfg.bd_name), p_name, BTM_MAX_LOC_BD_NAME_LEN);
   1574         btm_cb.cfg.bd_name[BTM_MAX_LOC_BD_NAME_LEN] = '\0';
   1575     }
   1576 #else
   1577     p = (UINT8 *)p_name;
   1578 #endif
   1579 
   1580     if (btsnd_hcic_change_name(p))
   1581         return (BTM_CMD_STARTED);
   1582     else
   1583         return (BTM_NO_RESOURCES);
   1584 }
   1585 
   1586 
   1587 
   1588 /*******************************************************************************
   1589 **
   1590 ** Function         BTM_ReadLocalDeviceName
   1591 **
   1592 ** Description      This function is called to read the local device name.
   1593 **
   1594 ** Returns          status of the operation
   1595 **                  If success, BTM_SUCCESS is returned and p_name points stored
   1596 **                              local device name
   1597 **                  If BTM doesn't store local device name, BTM_NO_RESOURCES is
   1598 **                              is returned and p_name is set to NULL
   1599 **
   1600 *******************************************************************************/
   1601 tBTM_STATUS BTM_ReadLocalDeviceName (char **p_name)
   1602 {
   1603 #if BTM_MAX_LOC_BD_NAME_LEN > 0
   1604     *p_name = btm_cb.cfg.bd_name;
   1605     return(BTM_SUCCESS);
   1606 #else
   1607     *p_name = NULL;
   1608     return(BTM_NO_RESOURCES);
   1609 #endif
   1610 }
   1611 
   1612 
   1613 /*******************************************************************************
   1614 **
   1615 ** Function         BTM_ReadLocalDeviceNameFromController
   1616 **
   1617 ** Description      Get local device name from controller. Do not use cached
   1618 **                  name (used to get chip-id prior to btm reset complete).
   1619 **
   1620 ** Returns          BTM_CMD_STARTED if successful, otherwise an error
   1621 **
   1622 *******************************************************************************/
   1623 tBTM_STATUS BTM_ReadLocalDeviceNameFromController (tBTM_CMPL_CB *p_rln_cmpl_cback)
   1624 {
   1625     /* Check if rln already in progress */
   1626     if (btm_cb.devcb.p_rln_cmpl_cb)
   1627         return(BTM_NO_RESOURCES);
   1628 
   1629     /* Save callback */
   1630     btm_cb.devcb.p_rln_cmpl_cb = p_rln_cmpl_cback;
   1631 
   1632     btsnd_hcic_read_name();
   1633     btu_start_timer (&btm_cb.devcb.rln_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT);
   1634 
   1635     return BTM_CMD_STARTED;
   1636 }
   1637 
   1638 /*******************************************************************************
   1639 **
   1640 ** Function         btm_read_local_name_complete
   1641 **
   1642 ** Description      This function is called when local name read complete.
   1643 **                  message is received from the HCI.
   1644 **
   1645 ** Returns          void
   1646 **
   1647 *******************************************************************************/
   1648 void btm_read_local_name_complete (UINT8 *p, UINT16 evt_len)
   1649 {
   1650     tBTM_CMPL_CB   *p_cb = btm_cb.devcb.p_rln_cmpl_cb;
   1651     UINT8           status;
   1652 
   1653     btu_stop_timer (&btm_cb.devcb.rln_timer);
   1654 
   1655     /* If there was a callback address for read local name, call it */
   1656     btm_cb.devcb.p_rln_cmpl_cb = NULL;
   1657 
   1658     if (p_cb)
   1659     {
   1660         STREAM_TO_UINT8  (status, p);
   1661 
   1662         if (status == HCI_SUCCESS)
   1663             (*p_cb)(p);
   1664         else
   1665             (*p_cb)(NULL);
   1666     }
   1667 }
   1668 
   1669 
   1670 /*******************************************************************************
   1671 **
   1672 ** Function         BTM_GetLocalDeviceAddr
   1673 **
   1674 ** Description      This function is called to read the local device address
   1675 **
   1676 ** Returns          void
   1677 **                  the local device address is copied into bd_addr
   1678 **
   1679 *******************************************************************************/
   1680 void BTM_GetLocalDeviceAddr (BD_ADDR bd_addr)
   1681 {
   1682     memcpy (bd_addr, btm_cb.devcb.local_addr, BD_ADDR_LEN);
   1683 }
   1684 
   1685 /*******************************************************************************
   1686 **
   1687 ** Function         BTM_ReadLocalDeviceAddr
   1688 **
   1689 ** Description      This function is called to read the local device address
   1690 **
   1691 ** Returns          status of the operation
   1692 **
   1693 *******************************************************************************/
   1694 tBTM_STATUS BTM_ReadLocalDeviceAddr (tBTM_CMPL_CB *p_cb)
   1695 {
   1696     if(p_cb)
   1697         (*p_cb)(btm_cb.devcb.local_addr);
   1698 
   1699     return (BTM_SUCCESS);
   1700 }
   1701 
   1702 
   1703 /*******************************************************************************
   1704 **
   1705 ** Function         btm_read_local_addr_complete
   1706 **
   1707 ** Description      This function is called when local BD Addr read complete
   1708 **                  message is received from the HCI.
   1709 **
   1710 ** Returns          void
   1711 **
   1712 *******************************************************************************/
   1713 void btm_read_local_addr_complete (UINT8 *p, UINT16 evt_len)
   1714 {
   1715     UINT8           status;
   1716 
   1717     STREAM_TO_UINT8  (status, p);
   1718 
   1719     if (status == HCI_SUCCESS)
   1720     {
   1721         STREAM_TO_BDADDR (btm_cb.devcb.local_addr, p);
   1722     }
   1723 }
   1724 
   1725 
   1726 /*******************************************************************************
   1727 **
   1728 ** Function         BTM_ReadLocalVersion
   1729 **
   1730 ** Description      This function is called to read the local device version
   1731 **
   1732 ** Returns          status of the operation
   1733 **
   1734 *******************************************************************************/
   1735 tBTM_STATUS BTM_ReadLocalVersion (tBTM_VERSION_INFO *p_vers)
   1736 {
   1737     /* Make sure the device has retrieved the info (not being reset) */
   1738     if (btm_cb.devcb.state < BTM_DEV_STATE_READY)
   1739         return (BTM_DEV_RESET);
   1740 
   1741     *p_vers = btm_cb.devcb.local_version;
   1742 
   1743     return (BTM_SUCCESS);
   1744 }
   1745 
   1746 
   1747 
   1748 
   1749 /*******************************************************************************
   1750 **
   1751 ** Function         BTM_SetDeviceClass
   1752 **
   1753 ** Description      This function is called to set the local device class
   1754 **
   1755 ** Returns          status of the operation
   1756 **
   1757 *******************************************************************************/
   1758 tBTM_STATUS BTM_SetDeviceClass (DEV_CLASS dev_class)
   1759 {
   1760     if(!memcmp (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN))
   1761         return(BTM_SUCCESS);
   1762 
   1763     memcpy (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN);
   1764 
   1765     if (btm_cb.devcb.state == BTM_DEV_STATE_WAIT_RESET_CMPLT ||
   1766         btm_cb.devcb.state == BTM_DEV_STATE_WAIT_AFTER_RESET)
   1767         return (BTM_DEV_RESET);
   1768 
   1769     if (!btsnd_hcic_write_dev_class (dev_class))
   1770         return (BTM_NO_RESOURCES);
   1771 
   1772     return (BTM_SUCCESS);
   1773 }
   1774 
   1775 
   1776 /*******************************************************************************
   1777 **
   1778 ** Function         BTM_ReadDeviceClass
   1779 **
   1780 ** Description      This function is called to read the local device class
   1781 **
   1782 ** Returns          pointer to the device class
   1783 **
   1784 *******************************************************************************/
   1785 UINT8 *BTM_ReadDeviceClass (void)
   1786 {
   1787     return ((UINT8 *)btm_cb.devcb.dev_class);
   1788 }
   1789 
   1790 
   1791 /*******************************************************************************
   1792 **
   1793 ** Function         BTM_ReadLocalFeatures
   1794 **
   1795 ** Description      This function is called to read the local features
   1796 **
   1797 ** Returns          pointer to the local features string
   1798 **
   1799 *******************************************************************************/
   1800 UINT8 *BTM_ReadLocalFeatures (void)
   1801 {
   1802     return (btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]);
   1803 }
   1804 
   1805 /*******************************************************************************
   1806 **
   1807 ** Function         BTM_ReadLocalExtendedFeatures
   1808 **
   1809 ** Description      This function is called to read the local extended features
   1810 **
   1811 ** Returns          pointer to the local extended features mask or NULL if bad
   1812 **                  page
   1813 **
   1814 *******************************************************************************/
   1815 UINT8 *BTM_ReadLocalExtendedFeatures (UINT8 page_number)
   1816 {
   1817     if (page_number <= HCI_EXT_FEATURES_PAGE_MAX)
   1818         return (btm_cb.devcb.local_lmp_features[page_number]);
   1819 
   1820     BTM_TRACE_ERROR1("Warning: BTM_ReadLocalExtendedFeatures page %d unknown",
   1821             page_number);
   1822     return NULL;
   1823 }
   1824 
   1825 /*******************************************************************************
   1826 **
   1827 ** Function         BTM_ReadBrcmFeatures
   1828 **
   1829 ** Description      This function is called to read the Broadcom specific features
   1830 **
   1831 ** Returns          pointer to the Broadcom features string
   1832 **
   1833 *******************************************************************************/
   1834 UINT8 *BTM_ReadBrcmFeatures (void)
   1835 {
   1836     return (btm_cb.devcb.brcm_features);
   1837 }
   1838 
   1839 /*******************************************************************************
   1840 **
   1841 ** Function         BTM_RegisterForDeviceStatusNotif
   1842 **
   1843 ** Description      This function is called to register for device status
   1844 **                  change notifications.
   1845 **
   1846 **                  If one registration is already there calling function should
   1847 **                  save the pointer to the function that is return and
   1848 **                  call it when processing of the event is complete
   1849 **
   1850 ** Returns          status of the operation
   1851 **
   1852 *******************************************************************************/
   1853 tBTM_DEV_STATUS_CB *BTM_RegisterForDeviceStatusNotif (tBTM_DEV_STATUS_CB *p_cb)
   1854 {
   1855     tBTM_DEV_STATUS_CB *p_prev = btm_cb.devcb.p_dev_status_cb;
   1856 
   1857     btm_cb.devcb.p_dev_status_cb = p_cb;
   1858     return (p_prev);
   1859 }
   1860 
   1861 /*******************************************************************************
   1862 **
   1863 ** Function         BTM_VendorSpecificCommand
   1864 **
   1865 ** Description      Send a vendor specific HCI command to the controller.
   1866 **
   1867 ** Returns
   1868 **      BTM_SUCCESS         Command sent. Does not expect command complete
   1869 **                              event. (command cmpl callback param is NULL)
   1870 **      BTM_CMD_STARTED     Command sent. Waiting for command cmpl event.
   1871 **
   1872 ** Notes
   1873 **      Opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC.
   1874 **
   1875 *******************************************************************************/
   1876 tBTM_STATUS BTM_VendorSpecificCommand(UINT16 opcode, UINT8 param_len,
   1877                                       UINT8 *p_param_buf, tBTM_VSC_CMPL_CB *p_cb)
   1878 {
   1879     void *p_buf;
   1880 
   1881     BTM_TRACE_EVENT2 ("BTM: BTM_VendorSpecificCommand: Opcode: 0x%04X, ParamLen: %i.",
   1882                       opcode, param_len);
   1883 
   1884     /* Allocate a buffer to hold HCI command plus the callback function */
   1885     if ((p_buf = GKI_getbuf((UINT16)(sizeof(BT_HDR) + sizeof (tBTM_CMPL_CB *) +
   1886                             param_len + HCIC_PREAMBLE_SIZE))) != NULL)
   1887     {
   1888         /* Send the HCI command (opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC) */
   1889         btsnd_hcic_vendor_spec_cmd (p_buf, opcode, param_len, p_param_buf, (void *)p_cb);
   1890 
   1891         /* Return value */
   1892         if (p_cb != NULL)
   1893             return (BTM_CMD_STARTED);
   1894         else
   1895             return (BTM_SUCCESS);
   1896     }
   1897     else
   1898         return (BTM_NO_RESOURCES);
   1899 
   1900 }
   1901 
   1902 
   1903 /*******************************************************************************
   1904 **
   1905 ** Function         btm_vsc_complete
   1906 **
   1907 ** Description      This function is called when local HCI Vendor Specific
   1908 **                  Command complete message is received from the HCI.
   1909 **
   1910 ** Returns          void
   1911 **
   1912 *******************************************************************************/
   1913 void btm_vsc_complete (UINT8 *p, UINT16 opcode, UINT16 evt_len,
   1914                        tBTM_CMPL_CB *p_vsc_cplt_cback)
   1915 {
   1916     tBTM_VSC_CMPL   vcs_cplt_params;
   1917 
   1918     /* If there was a callback address for vcs complete, call it */
   1919     if (p_vsc_cplt_cback)
   1920     {
   1921         /* Pass paramters to the callback function */
   1922         vcs_cplt_params.opcode = opcode;        /* Number of bytes in return info */
   1923         vcs_cplt_params.param_len = evt_len;    /* Number of bytes in return info */
   1924         vcs_cplt_params.p_param_buf = p;
   1925         (*p_vsc_cplt_cback)(&vcs_cplt_params);  /* Call the VSC complete callback function */
   1926     }
   1927 }
   1928 
   1929 /*******************************************************************************
   1930 **
   1931 ** Function         BTM_RegisterForVSEvents
   1932 **
   1933 ** Description      This function is called to register/deregister for vendor
   1934 **                  specific HCI events.
   1935 **
   1936 **                  If is_register=TRUE, then the function will be registered;
   1937 **                  if is_register=FALSE, then the function will be deregistered.
   1938 **
   1939 ** Returns          BTM_SUCCESS if successful,
   1940 **                  BTM_BUSY if maximum number of callbacks have already been
   1941 **                           registered.
   1942 **
   1943 *******************************************************************************/
   1944 tBTM_STATUS BTM_RegisterForVSEvents (tBTM_VS_EVT_CB *p_cb, BOOLEAN is_register)
   1945 {
   1946     tBTM_STATUS retval = BTM_SUCCESS;
   1947     UINT8 i, free_idx = BTM_MAX_VSE_CALLBACKS;
   1948 
   1949     /* See if callback is already registered */
   1950     for (i=0; i<BTM_MAX_VSE_CALLBACKS; i++)
   1951     {
   1952         if (btm_cb.devcb.p_vend_spec_cb[i] == NULL)
   1953         {
   1954             /* Found a free slot. Store index */
   1955             free_idx = i;
   1956         }
   1957         else if (btm_cb.devcb.p_vend_spec_cb[i] == p_cb)
   1958         {
   1959             /* Found callback in lookup table. If deregistering, clear the entry. */
   1960             if (is_register == FALSE)
   1961             {
   1962                 btm_cb.devcb.p_vend_spec_cb[i] = NULL;
   1963                 BTM_TRACE_EVENT0("BTM Deregister For VSEvents is successfully");
   1964             }
   1965             return (BTM_SUCCESS);
   1966         }
   1967     }
   1968 
   1969     /* Didn't find callback. Add callback to free slot if registering */
   1970     if (is_register)
   1971     {
   1972         if (free_idx < BTM_MAX_VSE_CALLBACKS)
   1973         {
   1974             btm_cb.devcb.p_vend_spec_cb[free_idx] = p_cb;
   1975             BTM_TRACE_EVENT0("BTM Register For VSEvents is successfully");
   1976         }
   1977         else
   1978         {
   1979             /* No free entries available */
   1980             BTM_TRACE_ERROR0 ("BTM_RegisterForVSEvents: too many callbacks registered");
   1981 
   1982             retval = BTM_NO_RESOURCES;
   1983         }
   1984     }
   1985 
   1986     return (retval);
   1987 }
   1988 
   1989 /*******************************************************************************
   1990 **
   1991 ** Function         btm_vendor_specific_evt
   1992 **
   1993 ** Description      Process event HCI_VENDOR_SPECIFIC_EVT
   1994 **
   1995 **                  Note: Some controllers do not send command complete, so
   1996 **                  the callback and busy flag are cleared here also.
   1997 **
   1998 ** Returns          void
   1999 **
   2000 *******************************************************************************/
   2001 void btm_vendor_specific_evt (UINT8 *p, UINT8 evt_len)
   2002 {
   2003     UINT8 i;
   2004 
   2005     BTM_TRACE_DEBUG0 ("BTM Event: Vendor Specific event from controller");
   2006 
   2007     for (i=0; i<BTM_MAX_VSE_CALLBACKS; i++)
   2008     {
   2009         if (btm_cb.devcb.p_vend_spec_cb[i])
   2010             (*btm_cb.devcb.p_vend_spec_cb[i])(evt_len, p);
   2011     }
   2012 }
   2013 
   2014 
   2015 /*******************************************************************************
   2016 **
   2017 ** Function         BTM_WritePageTimeout
   2018 **
   2019 ** Description      Send HCI Write Page Timeout.
   2020 **
   2021 ** Returns
   2022 **      BTM_SUCCESS         Command sent.
   2023 **      BTM_NO_RESOURCES     If out of resources to send the command.
   2024 **
   2025 **
   2026 *******************************************************************************/
   2027 tBTM_STATUS BTM_WritePageTimeout(UINT16 timeout)
   2028 {
   2029     BTM_TRACE_EVENT1 ("BTM: BTM_WritePageTimeout: Timeout: %d.", timeout);
   2030 
   2031     /* Send the HCI command */
   2032     if (btsnd_hcic_write_page_tout (timeout))
   2033         return (BTM_SUCCESS);
   2034     else
   2035         return (BTM_NO_RESOURCES);
   2036 }
   2037 
   2038 /*******************************************************************************
   2039 **
   2040 ** Function         BTM_WriteVoiceSettings
   2041 **
   2042 ** Description      Send HCI Write Voice Settings command.
   2043 **                  See hcidefs.h for settings bitmask values.
   2044 **
   2045 ** Returns
   2046 **      BTM_SUCCESS         Command sent.
   2047 **      BTM_NO_RESOURCES     If out of resources to send the command.
   2048 **
   2049 **
   2050 *******************************************************************************/
   2051 tBTM_STATUS BTM_WriteVoiceSettings(UINT16 settings)
   2052 {
   2053     BTM_TRACE_EVENT1 ("BTM: BTM_WriteVoiceSettings: Settings: 0x%04x.", settings);
   2054 
   2055     /* Send the HCI command */
   2056     if (btsnd_hcic_write_voice_settings ((UINT16)(settings & 0x03ff)))
   2057         return (BTM_SUCCESS);
   2058 
   2059     return (BTM_NO_RESOURCES);
   2060 }
   2061 
   2062 /*******************************************************************************
   2063 **
   2064 ** Function         BTM_EnableTestMode
   2065 **
   2066 ** Description      Send HCI the enable device under test command.
   2067 **
   2068 **                  Note: Controller can only be taken out of this mode by
   2069 **                      resetting the controller.
   2070 **
   2071 ** Returns
   2072 **      BTM_SUCCESS         Command sent.
   2073 **      BTM_NO_RESOURCES    If out of resources to send the command.
   2074 **
   2075 **
   2076 *******************************************************************************/
   2077 tBTM_STATUS BTM_EnableTestMode(void)
   2078 {
   2079     UINT8   cond;
   2080 
   2081     BTM_TRACE_EVENT0 ("BTM: BTM_EnableTestMode");
   2082 
   2083     /* set auto accept connection as this is needed during test mode */
   2084     /* Allocate a buffer to hold HCI command */
   2085     cond = HCI_DO_AUTO_ACCEPT_CONNECT;
   2086     if (!btsnd_hcic_set_event_filter(HCI_FILTER_CONNECTION_SETUP,
   2087                                      HCI_FILTER_COND_NEW_DEVICE,
   2088                                      &cond, sizeof(cond)))
   2089     {
   2090         return (BTM_NO_RESOURCES);
   2091     }
   2092 
   2093     /* put device to connectable mode */
   2094     if (!BTM_SetConnectability(BTM_CONNECTABLE, BTM_DEFAULT_CONN_WINDOW,
   2095                                BTM_DEFAULT_CONN_INTERVAL) == BTM_SUCCESS)
   2096     {
   2097         return BTM_NO_RESOURCES;
   2098     }
   2099 
   2100     /* put device to discoverable mode */
   2101     if (!BTM_SetDiscoverability(BTM_GENERAL_DISCOVERABLE, BTM_DEFAULT_DISC_WINDOW,
   2102                                 BTM_DEFAULT_DISC_INTERVAL) == BTM_SUCCESS)
   2103     {
   2104         return BTM_NO_RESOURCES;
   2105     }
   2106 
   2107     /* mask off all of event from controller */
   2108     if (!btsnd_hcic_set_event_mask(LOCAL_BR_EDR_CONTROLLER_ID,
   2109                                    (UINT8 *)"\x00\x00\x00\x00\x00\x00\x00\x00"))
   2110     {
   2111         return BTM_NO_RESOURCES;
   2112     }
   2113 
   2114     /* Send the HCI command */
   2115     if (btsnd_hcic_enable_test_mode ())
   2116         return (BTM_SUCCESS);
   2117     else
   2118         return (BTM_NO_RESOURCES);
   2119 }
   2120 
   2121 /*******************************************************************************
   2122 **
   2123 ** Function         btm_get_hci_version
   2124 **
   2125 ** Description      Local function called to retrieve the current HCI version
   2126 **
   2127 ** Returns          Bluetooth HCI Version returned by the controller
   2128 **
   2129 *******************************************************************************/
   2130 UINT8 btm_get_hci_version (void)
   2131 {
   2132     return (btm_cb.devcb.local_version.hci_version);
   2133 }
   2134 
   2135 
   2136 
   2137 /*******************************************************************************
   2138 **
   2139 ** Function         BTM_ReadStoredLinkKey
   2140 **
   2141 ** Description      This function is called to obtain link key for the specified
   2142 **                  device from the NVRAM storage attached to the Bluetooth
   2143 **                  controller.
   2144 **
   2145 ** Parameters:      bd_addr      - Address of the device
   2146 **                  p_cb         - Call back function to be called to return
   2147 **                                 the results
   2148 **
   2149 *******************************************************************************/
   2150 tBTM_STATUS BTM_ReadStoredLinkKey (BD_ADDR bd_addr,	tBTM_CMPL_CB *p_cb)
   2151 {
   2152     BD_ADDR local_bd_addr;
   2153     BOOLEAN read_all_flag = FALSE;
   2154 
   2155     /* Check if the previous command is completed */
   2156     if (btm_cb.devcb.p_stored_link_key_cmpl_cb)
   2157         return (BTM_BUSY);
   2158 
   2159     if (!bd_addr)
   2160     {
   2161         /* This is to read all the link keys */
   2162         read_all_flag = TRUE;
   2163 
   2164         /* We don't care the BD address. Just pass a non zero pointer */
   2165         bd_addr = local_bd_addr;
   2166     }
   2167 
   2168     BTM_TRACE_EVENT1 ("BTM: BTM_ReadStoredLinkKey: Read_All: %s",
   2169                         read_all_flag ? "TRUE" : "FALSE");
   2170 
   2171     /* Send the HCI command */
   2172     btm_cb.devcb.p_stored_link_key_cmpl_cb = p_cb;
   2173     if (btsnd_hcic_read_stored_key (bd_addr, read_all_flag))
   2174         return (BTM_SUCCESS);
   2175     else
   2176         return (BTM_NO_RESOURCES);
   2177 
   2178 }
   2179 
   2180 
   2181 /*******************************************************************************
   2182 **
   2183 ** Function         BTM_WriteStoredLinkKey
   2184 **
   2185 ** Description      This function is called to write link keys for the specified
   2186 **                  device addresses to the NVRAM storage attached to the Bluetooth
   2187 **                  controller.
   2188 **
   2189 ** Parameters:      num_keys     - Number of link keys
   2190 **                  bd_addr      - Addresses of the devices
   2191 **                  link_key     - Link Keys to be stored
   2192 **                  p_cb         - Call back function to be called to return
   2193 **                                 the results
   2194 **
   2195 *******************************************************************************/
   2196 tBTM_STATUS BTM_WriteStoredLinkKey (UINT8 num_keys,
   2197                                     BD_ADDR *bd_addr,
   2198                                     LINK_KEY *link_key,
   2199                                     tBTM_CMPL_CB *p_cb)
   2200 {
   2201     /* Check if the previous command is completed */
   2202     if (btm_cb.devcb.p_stored_link_key_cmpl_cb)
   2203         return (BTM_BUSY);
   2204 
   2205     BTM_TRACE_EVENT1 ("BTM: BTM_WriteStoredLinkKey: num_keys: %d", num_keys);
   2206 
   2207     /* Check the maximum number of link keys */
   2208     if(num_keys > HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD)
   2209         num_keys = HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD;
   2210 
   2211     /* Send the HCI command */
   2212     btm_cb.devcb.p_stored_link_key_cmpl_cb = p_cb;
   2213     if (btsnd_hcic_write_stored_key (num_keys, bd_addr, link_key))
   2214         return (BTM_SUCCESS);
   2215     else
   2216         return (BTM_NO_RESOURCES);
   2217 
   2218 }
   2219 
   2220 
   2221 /*******************************************************************************
   2222 **
   2223 ** Function         BTM_DeleteStoredLinkKey
   2224 **
   2225 ** Description      This function is called to delete link key for the specified
   2226 **                  device addresses from the NVRAM storage attached to the Bluetooth
   2227 **                  controller.
   2228 **
   2229 ** Parameters:      bd_addr      - Addresses of the devices
   2230 **                  p_cb         - Call back function to be called to return
   2231 **                                 the results
   2232 **
   2233 *******************************************************************************/
   2234 tBTM_STATUS BTM_DeleteStoredLinkKey(BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb)
   2235 {
   2236     BD_ADDR local_bd_addr;
   2237     BOOLEAN delete_all_flag = FALSE;
   2238 
   2239     /* Check if the previous command is completed */
   2240     if (btm_cb.devcb.p_stored_link_key_cmpl_cb)
   2241         return (BTM_BUSY);
   2242 
   2243     if (!bd_addr)
   2244     {
   2245         /* This is to delete all link keys */
   2246         delete_all_flag = TRUE;
   2247 
   2248         /* We don't care the BD address. Just pass a non zero pointer */
   2249         bd_addr = local_bd_addr;
   2250     }
   2251 
   2252     BTM_TRACE_EVENT1 ("BTM: BTM_DeleteStoredLinkKey: delete_all_flag: %s",
   2253                         delete_all_flag ? "TRUE" : "FALSE");
   2254 
   2255     /* Send the HCI command */
   2256     btm_cb.devcb.p_stored_link_key_cmpl_cb = p_cb;
   2257     if (!btsnd_hcic_delete_stored_key (bd_addr, delete_all_flag))
   2258     {
   2259         return (BTM_NO_RESOURCES);
   2260     }
   2261     else
   2262         return (BTM_SUCCESS);
   2263 }
   2264 
   2265 
   2266 /*******************************************************************************
   2267 **
   2268 ** Function         btm_read_stored_link_key_complete
   2269 **
   2270 ** Description      This function is called when the command complete message
   2271 **                  is received from the HCI for the read stored link key command.
   2272 **
   2273 ** Returns          void
   2274 **
   2275 *******************************************************************************/
   2276 void btm_read_stored_link_key_complete (UINT8 *p)
   2277 {
   2278     tBTM_CMPL_CB      *p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb;
   2279     tBTM_READ_STORED_LINK_KEY_COMPLETE  result;
   2280 
   2281     /* If there was a callback registered for read stored link key, call it */
   2282     btm_cb.devcb.p_stored_link_key_cmpl_cb = NULL;
   2283 
   2284     if (p_cb)
   2285     {
   2286         /* Set the call back event to indicate command complete */
   2287         result.event = BTM_CB_EVT_READ_STORED_LINK_KEYS;
   2288 
   2289         /* Extract the result fields from the HCI event if status is success */
   2290         STREAM_TO_UINT8  (result.status, p);
   2291         if (result.status == HCI_SUCCESS)
   2292         {
   2293             STREAM_TO_UINT16 (result.max_keys, p);
   2294             STREAM_TO_UINT16 (result.read_keys, p);
   2295         }
   2296         else
   2297         {
   2298             BTM_TRACE_WARNING1("Read stored link key status %d", result.status);
   2299             result.max_keys = 0;
   2300             result.read_keys = 0;
   2301         }
   2302         /* Call the call back and pass the result */
   2303         (*p_cb)(&result);
   2304     }
   2305 }
   2306 
   2307 
   2308 /*******************************************************************************
   2309 **
   2310 ** Function         btm_write_stored_link_key_complete
   2311 **
   2312 ** Description      This function is called when the command complete message
   2313 **                  is received from the HCI for the write stored link key command.
   2314 **
   2315 ** Returns          void
   2316 **
   2317 *******************************************************************************/
   2318 void btm_write_stored_link_key_complete (UINT8 *p)
   2319 {
   2320     tBTM_CMPL_CB       *p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb;
   2321     tBTM_WRITE_STORED_LINK_KEY_COMPLETE  result;
   2322 
   2323     /* If there was a callback registered for read stored link key, call it */
   2324     btm_cb.devcb.p_stored_link_key_cmpl_cb = NULL;
   2325 
   2326     if (p_cb)
   2327     {
   2328         /* Set the call back event to indicate command complete */
   2329         result.event = BTM_CB_EVT_WRITE_STORED_LINK_KEYS;
   2330 
   2331         /* Extract the result fields from the HCI event */
   2332         STREAM_TO_UINT8 (result.status, p);
   2333         STREAM_TO_UINT8 (result.num_keys, p);
   2334 
   2335         /* Call the call back and pass the result */
   2336         (*p_cb)(&result);
   2337     }
   2338 }
   2339 
   2340 
   2341 /*******************************************************************************
   2342 **
   2343 ** Function         btm_delete_stored_link_key_complete
   2344 **
   2345 ** Description      This function is called when the command complete message
   2346 **                  is received from the HCI for the delete stored link key command.
   2347 **
   2348 ** Returns          void
   2349 **
   2350 *******************************************************************************/
   2351 void btm_delete_stored_link_key_complete (UINT8 *p)
   2352 {
   2353     tBTM_CMPL_CB         *p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb;
   2354     tBTM_DELETE_STORED_LINK_KEY_COMPLETE  result;
   2355 
   2356     /* If there was a callback registered for read stored link key, call it */
   2357     btm_cb.devcb.p_stored_link_key_cmpl_cb = NULL;
   2358 
   2359     if (p_cb)
   2360     {
   2361         /* Set the call back event to indicate command complete */
   2362         result.event = BTM_CB_EVT_DELETE_STORED_LINK_KEYS;
   2363 
   2364         /* Extract the result fields from the HCI event */
   2365         STREAM_TO_UINT8  (result.status, p);
   2366         STREAM_TO_UINT16 (result.num_keys, p);
   2367 
   2368         /* Call the call back and pass the result */
   2369         (*p_cb)(&result);
   2370     }
   2371 }
   2372 
   2373 
   2374 /*******************************************************************************
   2375 **
   2376 ** Function         btm_return_link_keys_evt
   2377 **
   2378 ** Description      This function is called when the return link keys event
   2379 **                  is received from the HCI for the read stored link key command.
   2380 **
   2381 ** Returns          void
   2382 **
   2383 *******************************************************************************/
   2384 void btm_return_link_keys_evt (tBTM_RETURN_LINK_KEYS_EVT *result)
   2385 {
   2386     tBTM_CMPL_CB  *p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb;
   2387     UINT8          i, *p, *p1;
   2388     UINT8          bd_addr[BD_ADDR_LEN];
   2389     UINT8          link_key[LINK_KEY_LEN];
   2390 
   2391     /* Call the call back to pass the link keys to application */
   2392     if (p_cb)
   2393     {
   2394         /* Change the BD addr and Link key in to big endian order */
   2395         p = (UINT8 *)(result + 1);
   2396         for (i=0; i<result->num_keys; i++)
   2397         {
   2398             /* Initialize the backup pointer */
   2399             p1 = p;
   2400 
   2401             /* Extract the BD Addr and Link Key */
   2402             REVERSE_STREAM_TO_ARRAY(bd_addr, p1, BD_ADDR_LEN);
   2403             REVERSE_STREAM_TO_ARRAY(link_key, p1, LINK_KEY_LEN);
   2404 
   2405             /* Write the BD Addr and Link Key back in big endian format */
   2406             ARRAY_TO_STREAM(p, bd_addr, BD_ADDR_LEN);
   2407             ARRAY_TO_STREAM(p, link_key, LINK_KEY_LEN);
   2408         }
   2409 
   2410         (*p_cb)(result);
   2411     }
   2412 }
   2413 
   2414 
   2415 
   2416 /*******************************************************************************
   2417 **
   2418 ** Function         btm_report_device_status
   2419 **
   2420 ** Description      This function is called when there is a change in the device
   2421 **                  status. This function will report the new device status to
   2422 **                  the application
   2423 **
   2424 ** Returns          void
   2425 **
   2426 *******************************************************************************/
   2427 void btm_report_device_status (tBTM_DEV_STATUS status)
   2428 {
   2429     tBTM_DEV_STATUS_CB *p_cb = btm_cb.devcb.p_dev_status_cb;
   2430 
   2431     /* Call the call back to pass the device status to application */
   2432     if (p_cb)
   2433         (*p_cb)(status);
   2434 }
   2435 
   2436 
   2437