Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e87b0b4 authored by Sharvil Nanavati's avatar Sharvil Nanavati
Browse files

Clean up interaction with libbt-vendor library.

1. Fix resource leak: dlclose was never called on libbt-vendor.
2. Eliminate global variable bt_vnd_if.
3. Provide a header file instead of randomly importing functions.

Change-Id: I16d8a6d68324fb44a033705c4f4dbd31ebd52b58
parent f91839c6
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -4,11 +4,11 @@ include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
	src/bt_hci_bdroid.c \
	src/bt_hw.c \
	src/btsnoop.c \
	src/btsnoop_net.c \
	src/lpm.c \
	src/utils.c
	src/utils.c \
	src/vendor.c

ifeq ($(BLUETOOTH_HCI_USE_MCT),true)

+35 −0
Original line number Diff line number Diff line
/******************************************************************************
 *
 *  Copyright (C) 2014 Google, Inc.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

#pragma once

#include <stdbool.h>
#include <stdint.h>

#include "bt_vendor_lib.h"

// Opens the vendor-specific library and sets the Bluetooth
// address of the adapter to |local_bdaddr|.
bool vendor_open(const uint8_t *local_bdaddr);

// Closes the vendor-specific library and frees all associated resources.
// Only |vendor_open| may be called after |vendor_close|.
void vendor_close(void);

// Sends a vendor-specific command to the library.
int vendor_send_command(bt_vendor_opcode_t opcode, void *param);
+8 −31
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#include "utils.h"
#include "hci.h"
#include "userial.h"
#include "vendor.h"
#include "bt_utils.h"
#include "btsnoop.h"
#include <sys/prctl.h>
@@ -58,7 +59,6 @@
**  Externs
******************************************************************************/

extern bt_vendor_interface_t *bt_vnd_if;
extern int num_hci_cmd_pkts;
void lpm_init(void);
void lpm_cleanup(void);
@@ -198,7 +198,7 @@ static int init(const bt_hc_callbacks_t* p_cb, unsigned char *local_bdaddr)
    /* store reference to user callbacks */
    bt_hc_cbacks = (bt_hc_callbacks_t *) p_cb;

    init_vnd_if(local_bdaddr);
    vendor_open(local_bdaddr);

    utils_init();
#ifdef HCI_USE_MCT
@@ -265,10 +265,7 @@ static void set_power(bt_hc_chip_power_state_t state)
    /* Calling vendor-specific part */
    pwr_state = (state == BT_HC_CHIP_PWR_ON) ? BT_VND_PWR_ON : BT_VND_PWR_OFF;

    if (bt_vnd_if)
        bt_vnd_if->op(BT_VND_OP_POWER_CTRL, &pwr_state);
    else
        ALOGE("vendor lib is missing!");
    vendor_send_command(BT_VND_OP_POWER_CTRL, &pwr_state);
}


@@ -406,9 +403,8 @@ static void cleanup( void )
    p_hci_if->cleanup();
    utils_cleanup();

    /* Calling vendor-specific part */
    if (bt_vnd_if)
        bt_vnd_if->cleanup();
    set_power(BT_VND_PWR_OFF);
    vendor_close();

    fwcfg_acked = FALSE;
    bt_hc_cbacks = NULL;
@@ -480,17 +476,7 @@ static void *bt_hc_worker_thread(void *arg)
        if (events & HC_EVENT_PRELOAD)
        {
            userial_open(USERIAL_PORT_1);

            /* Calling vendor-specific part */
            if (bt_vnd_if)
            {
                bt_vnd_if->op(BT_VND_OP_FW_CFG, NULL);
            }
            else
            {
                if (bt_hc_cbacks)
                    bt_hc_cbacks->preload_cb(NULL, BT_HC_PRELOAD_FAIL);
            }
            vendor_send_command(BT_VND_OP_FW_CFG, NULL);
        }

        if (events & HC_EVENT_POSTLOAD)
@@ -499,12 +485,7 @@ static void *bt_hc_worker_thread(void *arg)
             * is required. Then, follow with reading requests of getting
             * ACL data length for both BR/EDR and LE.
             */
            int result = -1;

            /* Calling vendor-specific part */
            if (bt_vnd_if)
                result = bt_vnd_if->op(BT_VND_OP_SCO_CFG, NULL);

            int result = vendor_send_command(BT_VND_OP_SCO_CFG, NULL);
            if (result == -1)
                p_hci_if->get_acl_max_len();
        }
@@ -585,11 +566,7 @@ static void *bt_hc_worker_thread(void *arg)

        if (events & HC_EVENT_EPILOG)
        {
            /* Calling vendor-specific part */
            if (bt_vnd_if)
                bt_vnd_if->op(BT_VND_OP_EPILOG, NULL);
            else
                break;  // equivalent to HC_EVENT_EXIT
            vendor_send_command(BT_VND_OP_EPILOG, NULL);
        }

        if (events & HC_EVENT_EXIT)

system/hci/src/bt_hw.c

deleted100644 → 0
+0 −230
Original line number Diff line number Diff line
/******************************************************************************
 *
 *  Copyright (C) 2009-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  Filename:      bt_hw.c
 *
 *  Description:   Bluedroid libbt-vendor callback functions
 *
 ******************************************************************************/

#define LOG_TAG "bt_hw"

#include <dlfcn.h>
#include <utils/Log.h>
#include <pthread.h>
#include "bt_vendor_lib.h"
#include "bt_hci_bdroid.h"
#include "hci.h"
#include "userial.h"
#include "bt_utils.h"

/******************************************************************************
**  Externs
******************************************************************************/

extern tHCI_IF *p_hci_if;
extern uint8_t fwcfg_acked;
void lpm_vnd_cback(uint8_t vnd_result);

/******************************************************************************
**  Variables
******************************************************************************/

bt_vendor_interface_t *bt_vnd_if=NULL;

/******************************************************************************
**  Functions
******************************************************************************/

/******************************************************************************
**
** Function         fwcfg_cb
**
** Description      HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
**                  called when the libbt-vendor completed firmware
**                  configuration process
**
** Returns          None
**
******************************************************************************/
static void fwcfg_cb(bt_vendor_op_result_t result)
{
    bt_hc_postload_result_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? \
                                     BT_HC_PRELOAD_SUCCESS : BT_HC_PRELOAD_FAIL;

    fwcfg_acked = TRUE;

    if (bt_hc_cbacks)
        bt_hc_cbacks->preload_cb(NULL, status);
}

/******************************************************************************
**
** Function         scocfg_cb
**
** Description      HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
**                  called when the libbt-vendor completed vendor specific SCO
**                  configuration process
**
** Returns          None
**
******************************************************************************/
static void scocfg_cb(bt_vendor_op_result_t result)
{
    UNUSED(result);
    /* Continue rest of postload process*/
    p_hci_if->get_acl_max_len();
}

/******************************************************************************
**
** Function         lpm_vnd_cb
**
** Description      HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
**                  called back from the libbt-vendor to indicate the result of
**                  previous LPM enable/disable request
**
** Returns          None
**
******************************************************************************/
static void lpm_vnd_cb(bt_vendor_op_result_t result)
{
    uint8_t status = (result == BT_VND_OP_RESULT_SUCCESS) ? 0 : 1;

    lpm_vnd_cback(status);
}

/******************************************************************************
**
** Function         alloc
**
** Description      HOST/CONTROLLER VENDOR LIB CALLOUT API - This function is
**                  called from the libbt-vendor to request for data buffer
**                  allocation
**
** Returns          NULL / pointer to allocated buffer
**
******************************************************************************/
static void *alloc(int size)
{
    HC_BT_HDR *p_hdr = NULL;

    if (bt_hc_cbacks)
        p_hdr = (HC_BT_HDR *) bt_hc_cbacks->alloc(size);

    return (p_hdr);
}

/******************************************************************************
**
** Function         dealloc
**
** Description      HOST/CONTROLLER VENDOR LIB CALLOUT API - This function is
**                  called from the libbt-vendor to release the data buffer
**                  allocated through the alloc call earlier
**
** Returns          None
**
******************************************************************************/
static void dealloc(void *p_buf)
{
    HC_BT_HDR *p_hdr = (HC_BT_HDR *) p_buf;

    if (bt_hc_cbacks)
        bt_hc_cbacks->dealloc((TRANSAC) p_buf, (char *) (p_hdr+1));
}

/******************************************************************************
**
** Function         xmit_cb
**
** Description      HOST/CONTROLLER VEDNOR LIB CALLOUT API - This function is
**                  called from the libbt-vendor in order to send a prepared
**                  HCI command packet through HCI transport TX function.
**
** Returns          TRUE/FALSE
**
******************************************************************************/
static uint8_t xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback)
{
    return p_hci_if->send_int_cmd(opcode, (HC_BT_HDR *)p_buf, p_cback);
}

/******************************************************************************
**
** Function         epilog_cb
**
** Description      HOST/CONTROLLER VENDOR LIB CALLBACK API - This function is
**                  called back from the libbt-vendor to indicate the result of
**                  previous epilog call.
**
** Returns          None
**
******************************************************************************/
static void epilog_cb(bt_vendor_op_result_t result)
{
    UNUSED(result);
    bthc_signal_event(HC_EVENT_EXIT);
}

/*****************************************************************************
**   The libbt-vendor Callback Functions Table
*****************************************************************************/
static const bt_vendor_callbacks_t vnd_callbacks = {
    sizeof(bt_vendor_callbacks_t),
    fwcfg_cb,
    scocfg_cb,
    lpm_vnd_cb,
    alloc,
    dealloc,
    xmit_cb,
    epilog_cb
};

/******************************************************************************
**
** Function         init_vnd_if
**
** Description      Initialize vendor lib interface
**
** Returns          None
**
******************************************************************************/
void init_vnd_if(unsigned char *local_bdaddr)
{
    void *dlhandle;

    dlhandle = dlopen("libbt-vendor.so", RTLD_NOW);
    if (!dlhandle)
    {
        ALOGE("!!! Failed to load libbt-vendor.so !!!");
        return;
    }

    bt_vnd_if = (bt_vendor_interface_t *) dlsym(dlhandle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
    if (!bt_vnd_if)
    {
        ALOGE("!!! Failed to get bt vendor interface !!!");
        return;
    }

    bt_vnd_if->init(&vnd_callbacks, local_bdaddr);
}
+1 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@
#include "hci.h"
#include "userial.h"
#include "utils.h"
#include "vendor.h"

/******************************************************************************
**  Constants & Macros
Loading