13877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/*
23877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * Copyright 2012 The Android Open Source Project
33877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * Copyright (c) 2013, The Linux Foundation. All rights reserved.
43877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * Not a Contribution.
53877697852db58569e9fab3aad46494bca561a9aMekala Natarajan *
63877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * Licensed under the Apache License, Version 2.0 (the "License");
73877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * you may not use this file except in compliance with the License.
83877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * You may obtain a copy of the License at
93877697852db58569e9fab3aad46494bca561a9aMekala Natarajan *
103877697852db58569e9fab3aad46494bca561a9aMekala Natarajan *      http://www.apache.org/licenses/LICENSE-2.0
113877697852db58569e9fab3aad46494bca561a9aMekala Natarajan *
123877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * Unless required by applicable law or agreed to in writing, software
133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * distributed under the License is distributed on an "AS IS" BASIS,
143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * See the License for the specific language governing permissions and
163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan * limitations under the License.
173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan */
183877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
193877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/******************************************************************************
203877697852db58569e9fab3aad46494bca561a9aMekala Natarajan *
213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan *  Filename:      bt_vendor_qcom.c
223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan *
233877697852db58569e9fab3aad46494bca561a9aMekala Natarajan *  Description:   vendor specific library implementation
243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan *
253877697852db58569e9fab3aad46494bca561a9aMekala Natarajan ******************************************************************************/
263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#define LOG_TAG "bt_vendor"
283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#define BLUETOOTH_MAC_ADDR_BOOT_PROPERTY "ro.boot.btmacaddr"
293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
303877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include <utils/Log.h>
313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include <cutils/properties.h>
323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include <fcntl.h>
333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include <termios.h>
343877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include "bt_vendor_qcom.h"
353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include "hci_uart.h"
363877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include "hci_smd.h"
373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include <sys/socket.h>
383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include <cutils/sockets.h>
393877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include <linux/un.h>
40f2169748daa2d42d833831d240dfad98161f3c32Sunny Kapdi#ifdef BT_NV_SUPPORT
413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include "bt_vendor_persist.h"
42f2169748daa2d42d833831d240dfad98161f3c32Sunny Kapdi#endif
433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include "hw_rome.h"
443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
453877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#define WAIT_TIMEOUT 200000
463877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#define BT_VND_OP_GET_LINESPEED 12
473877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
483877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/******************************************************************************
493877697852db58569e9fab3aad46494bca561a9aMekala Natarajan**  Externs
503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan******************************************************************************/
513877697852db58569e9fab3aad46494bca561a9aMekala Natarajanextern int hw_config(int nState);
523877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
533877697852db58569e9fab3aad46494bca561a9aMekala Natarajanextern int is_hw_ready();
543877697852db58569e9fab3aad46494bca561a9aMekala Natarajanextern int rome_soc_init(int fd, char *bdaddr);
553877697852db58569e9fab3aad46494bca561a9aMekala Natarajanextern int check_embedded_mode(int fd);
563877697852db58569e9fab3aad46494bca561a9aMekala Natarajanextern int rome_get_addon_feature_list(int fd);
573877697852db58569e9fab3aad46494bca561a9aMekala Natarajanextern int rome_ver;
584e2674baaa2e59740c76698385beb3497adb4fdbBen YoungTae Kimextern int enable_controller_log(int fd);
593877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/******************************************************************************
603877697852db58569e9fab3aad46494bca561a9aMekala Natarajan**  Variables
613877697852db58569e9fab3aad46494bca561a9aMekala Natarajan******************************************************************************/
623877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint pFd[2] = {0,};
633877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef BT_SOC_TYPE_ROME
643877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint ant_fd;
653877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
663877697852db58569e9fab3aad46494bca561a9aMekala Natarajanbt_vendor_callbacks_t *bt_vendor_cbacks = NULL;
673877697852db58569e9fab3aad46494bca561a9aMekala Natarajanuint8_t vnd_local_bd_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
683877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic int btSocType = BT_SOC_DEFAULT;
693877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic int rfkill_id = -1;
703877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic char *rfkill_state = NULL;
713877697852db58569e9fab3aad46494bca561a9aMekala Natarajanbool enable_extldo = FALSE;
723877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
733877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic const tUSERIAL_CFG userial_init_cfg =
743877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1),
763877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    USERIAL_BAUD_115200
773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan};
783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#if (HW_NEED_END_WITH_HCI_RESET == TRUE)
803877697852db58569e9fab3aad46494bca561a9aMekala Natarajanvoid hw_epilog_process(void);
813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include <string.h>
853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include <errno.h>
863877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include <dlfcn.h>
873877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#include "cutils/properties.h"
883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
893877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic const char WIFI_PROP_NAME[]    = "wlan.driver.status";
903877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic const char SERVICE_PROP_NAME[]    = "bluetooth.hsic_ctrl";
913877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic const char BT_STATUS_NAME[]    = "bluetooth.enabled";
923877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic const char WIFI_SERVICE_PROP[] = "wlan.hsic_ctrl";
933877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
943877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#define WIFI_BT_STATUS_LOCK    "/data/connectivity/wifi_bt_lock"
953877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint isInit=0;
963877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif /* WIFI_BT_STATUS_SYNC */
973877697852db58569e9fab3aad46494bca561a9aMekala Natarajanbool is_soc_initialized(void);
983877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
993877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/******************************************************************************
1003877697852db58569e9fab3aad46494bca561a9aMekala Natarajan**  Local type definitions
1013877697852db58569e9fab3aad46494bca561a9aMekala Natarajan******************************************************************************/
1023877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1033877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/******************************************************************************
1043877697852db58569e9fab3aad46494bca561a9aMekala Natarajan**  TODO: Cleanup to use header file. Declare externally used functions.
1053877697852db58569e9fab3aad46494bca561a9aMekala Natarajan******************************************************************************/
1063877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint readTrpState();
1073877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint ath3k_init(int fd, int speed, int init_speed, char *bdaddr, struct termios *ti);
1083877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint userial_clock_operation(int fd, int cmd);
1093877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint rome_soc_init(int fd, char *bdaddr);
1103877697852db58569e9fab3aad46494bca561a9aMekala Natarajanvoid lpm_set_ar3k(uint8_t pio, uint8_t action, uint8_t polarity);
1113877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint userial_vendor_get_baud(void);
1123877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/******************************************************************************
1153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan**  Functions
1163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan******************************************************************************/
1173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
1183877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint bt_semaphore_create(void)
1193877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
1203877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int fd;
1213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    fd = open(WIFI_BT_STATUS_LOCK, O_RDONLY);
1233877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (fd < 0)
1253877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("can't create file\n");
1263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return fd;
1283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
1293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1303877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint bt_semaphore_get(int fd)
1313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
1323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int ret;
1333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1343877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (fd < 0)
1353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
1363877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ret = flock(fd, LOCK_EX);
1383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (ret != 0) {
1393877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("can't hold lock: %s\n", strerror(errno));
1403877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
1413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
1423877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return ret;
1443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
1453877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1463877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint bt_semaphore_release(int fd)
1473877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
1483877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int ret;
1493877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (fd < 0)
1513877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
1523877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1533877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ret = flock(fd, LOCK_UN);
1543877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (ret != 0) {
1553877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("can't release lock: %s\n", strerror(errno));
1563877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
1573877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
1583877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1593877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return ret;
1603877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
1613877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1623877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint bt_semaphore_destroy(int fd)
1633877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
1643877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (fd < 0)
1653877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
1663877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1673877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return close (fd);
1683877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
1693877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1703877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint bt_wait_for_service_done(void)
1713877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
1723877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char service_status[PROPERTY_VALUE_MAX];
1733877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int count = 30;
1743877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGE("%s: check\n", __func__);
1763877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /* wait for service done */
1783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    while (count-- > 0) {
1793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        property_get(WIFI_SERVICE_PROP, service_status, NULL);
1803877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if (strcmp(service_status, "") != 0) {
1823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            usleep(200000);
1833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        } else {
1843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
1853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
1863877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
1873877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return 0;
1893877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
1903877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1913877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif /* WIFI_BT_STATUS_SYNC */
1923877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1933877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/** Get Bluetooth SoC type from system setting */
1943877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic int get_bt_soc_type()
1953877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
1963877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int ret = 0;
1973877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char bt_soc_type[PROPERTY_VALUE_MAX];
1983877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
1993877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGI("bt-vendor : get_bt_soc_type");
2003877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2013877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ret = property_get("qcom.bluetooth.soc", bt_soc_type, NULL);
2023877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (ret != 0) {
2033877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGI("qcom.bluetooth.soc set to %s\n", bt_soc_type);
2043877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if (!strncasecmp(bt_soc_type, "rome", sizeof("rome"))) {
2053877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            return BT_SOC_ROME;
2063877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
2073877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        else if (!strncasecmp(bt_soc_type, "ath3k", sizeof("ath3k"))) {
2083877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            return BT_SOC_AR3K;
2093877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
2103877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        else {
2113877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            ALOGI("qcom.bluetooth.soc not set, so using default.\n");
2123877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            return BT_SOC_DEFAULT;
2133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
2143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
2153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    else {
2163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("%s: Failed to get soc type", __FUNCTION__);
2173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ret = BT_SOC_DEFAULT;
2183877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
2193877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2203877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return ret;
2213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
2223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2233877697852db58569e9fab3aad46494bca561a9aMekala Natarajanbool can_perform_action(char action) {
2243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bool can_perform = false;
2253877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char ref_count[PROPERTY_VALUE_MAX];
2263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int value, ret;
2273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    property_get("wc_transport.ref_count", ref_count, "0");
2293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2303877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    value = atoi(ref_count);
2313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGV("%s: ref_count: %s\n",__func__,  ref_count);
2323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if(action == '1') {
2343877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGV("%s: on : value is: %d", __func__, value);
2353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if(value == 1)
2363877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        {
2373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan          if(is_soc_initialized() == true)
2383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan          {
2393877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            value++;
2403877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            ALOGV("%s: on : value is incremented to : %d", __func__, value);
2413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan          }
2423877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
2433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        else
2443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        {
2453877697852db58569e9fab3aad46494bca561a9aMekala Natarajan             value++;
2463877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
2473877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if (value == 1)
2483877697852db58569e9fab3aad46494bca561a9aMekala Natarajan           can_perform = true;
2493877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        else if (value > 2) return false;
2503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    } else  {
2513877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGV("%s: off : value is: %d", __func__, value);
2523877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        value--;
2533877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if (value == 0)
2543877697852db58569e9fab3aad46494bca561a9aMekala Natarajan           can_perform = true;
2553877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        else if (value < 0) return false;
2563877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
2573877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2583877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    snprintf(ref_count, 3, "%d", value);
2593877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGV("%s: updated ref_count is: %s", __func__, ref_count);
2603877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2613877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ret  = property_set("wc_transport.ref_count", ref_count);
2623877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (ret < 0) {
2633877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("%s: Error while updating property: %d\n", __func__, ret);
2643877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return false;
2653877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
2663877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGV("%s returning %d", __func__, can_perform);
2673877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return can_perform;
2683877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
2693877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2703877697852db58569e9fab3aad46494bca561a9aMekala Natarajanvoid stop_hci_filter() {
2713877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       char value[PROPERTY_VALUE_MAX] = {'\0'};
2723877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       ALOGV("%s: Entry ", __func__);
2733877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2743877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       property_get("wc_transport.start_hci", value, "false");
2753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2763877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       if (strcmp(value, "false") == 0) {
2773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan           ALOGV("%s: hci_filter has been stopped already", __func__);
2783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan           return;
2793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       }
2803877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       property_set("wc_transport.start_hci", "false");
2823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       property_set("wc_transport.hci_filter_status", "0");
2833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       ALOGV("%s: Exit ", __func__);
2843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
2853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2863877697852db58569e9fab3aad46494bca561a9aMekala Natarajanvoid start_hci_filter() {
2873877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       ALOGV("%s: Entry ", __func__);
2883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       int i, init_success = 0;
2893877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       char value[PROPERTY_VALUE_MAX] = {'\0'};
2903877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2913877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2923877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       property_get("wc_transport.start_hci", value, false);
2933877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2943877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       if (strcmp(value, "true") == 0) {
2953877697852db58569e9fab3aad46494bca561a9aMekala Natarajan           ALOGV("%s: hci_filter has been started already", __func__);
2963877697852db58569e9fab3aad46494bca561a9aMekala Natarajan           return;
2973877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       }
2983877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
2993877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       property_set("wc_transport.hci_filter_status", "0");
3003877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3013877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       property_set("wc_transport.start_hci", "true");
3023877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       //sched_yield();
3033877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       for(i=0; i<45; i++) {
3043877697852db58569e9fab3aad46494bca561a9aMekala Natarajan          property_get("wc_transport.hci_filter_status", value, "0");
3053877697852db58569e9fab3aad46494bca561a9aMekala Natarajan          if (strcmp(value, "1") == 0) {
3063877697852db58569e9fab3aad46494bca561a9aMekala Natarajan               init_success = 1;
3073877697852db58569e9fab3aad46494bca561a9aMekala Natarajan               break;
3083877697852db58569e9fab3aad46494bca561a9aMekala Natarajan           } else {
3093877697852db58569e9fab3aad46494bca561a9aMekala Natarajan               usleep(WAIT_TIMEOUT);
3103877697852db58569e9fab3aad46494bca561a9aMekala Natarajan           }
3113877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
3123877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGV("start_hcifilter status:%d after %f seconds \n", init_success, 0.2*i);
3133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGV("%s: Exit ", __func__);
3153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
3163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/** Bluetooth Controller power up or shutdown */
3183877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic int bt_powerup(int en )
3193877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
3203877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char rfkill_type[64], *enable_ldo_path = NULL;
3213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char type[16], enable_ldo[6];
3223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int fd, size, i, ret, fd_ldo;
3233877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char disable[PROPERTY_VALUE_MAX];
3253877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char state;
3263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char on = (en)?'1':'0';
3273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
3293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char wifi_status[PROPERTY_VALUE_MAX];
3303877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int lock_fd;
3313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif /*WIFI_BT_STATUS_SYNC*/
3323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGI("bt_powerup: %c", on);
3343877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /* Check if rfkill has been disabled */
3363877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ret = property_get("ro.rfkilldisabled", disable, "0");
3373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (!ret ){
3383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("Couldn't get ro.rfkilldisabled (%d)", ret);
3393877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
3403877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
3413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /* In case rfkill disabled, then no control power*/
3423877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (strcmp(disable, "1") == 0) {
3433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGI("ro.rfkilldisabled : %s", disable);
3443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
3453877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
3463877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3473877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
3483877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    lock_fd = bt_semaphore_create();
3493877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bt_semaphore_get(lock_fd);
3503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bt_wait_for_service_done();
3513877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
3523877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3533877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /* Assign rfkill_id and find bluetooth rfkill state path*/
3543877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    for(i=0;(rfkill_id == -1) && (rfkill_state == NULL);i++)
3553877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    {
3563877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        snprintf(rfkill_type, sizeof(rfkill_type), "/sys/class/rfkill/rfkill%d/type", i);
3573877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if ((fd = open(rfkill_type, O_RDONLY)) < 0)
3583877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        {
3593877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            ALOGE("open(%s) failed: %s (%d)\n", rfkill_type, strerror(errno), errno);
3603877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3613877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
3623877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            bt_semaphore_release(lock_fd);
3633877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            bt_semaphore_destroy(lock_fd);
3643877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
3653877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            return -1;
3663877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
3673877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3683877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        size = read(fd, &type, sizeof(type));
3693877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        close(fd);
3703877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3713877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if ((size >= 9) && !memcmp(type, "bluetooth", 9))
3723877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        {
3733877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            asprintf(&rfkill_state, "/sys/class/rfkill/rfkill%d/state", rfkill_id = i);
3743877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
3753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
3763877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
3773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /* Get rfkill State to control */
3793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (rfkill_state != NULL)
3803877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    {
3813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if ((fd = open(rfkill_state, O_RDWR)) < 0)
3823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        {
3833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            ALOGE("open(%s) for write failed: %s (%d)",rfkill_state, strerror(errno), errno);
3843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
3853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            bt_semaphore_release(lock_fd);
3863877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            bt_semaphore_destroy(lock_fd);
3873877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
3883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
3893877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            return -1;
3903877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
3913877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
3923877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef BT_SOC_TYPE_ROME
3933877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if(can_perform_action(on) == false) {
3943877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("%s:can't perform action as it is being used by other clients", __func__);
3953877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
3963877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        bt_semaphore_release(lock_fd);
3973877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        bt_semaphore_destroy(lock_fd);
3983877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
3993877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        goto done;
4003877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
4013877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
4023877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ret = asprintf(&enable_ldo_path, "/sys/class/rfkill/rfkill%d/device/extldo", rfkill_id);
4033877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if( (ret < 0 ) || (enable_ldo_path == NULL) )
4043877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    {
4053877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("Memory Allocation failure");
4063877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
4073877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
4083877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if ((fd_ldo = open(enable_ldo_path, O_RDWR)) < 0) {
4093877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("open(%s) failed: %s (%d)", enable_ldo_path, strerror(errno), errno);
4103877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
4113877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
4123877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    size = read(fd_ldo, &enable_ldo, sizeof(enable_ldo));
4133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    close(fd_ldo);
4143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (size <= 0) {
4153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("read(%s) failed: %s (%d)", enable_ldo_path, strerror(errno), errno);
4163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
4173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
4183877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (!memcmp(enable_ldo, "true", 4)) {
4193877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGI("External LDO has been configured");
4203877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        enable_extldo = TRUE;
4213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
4223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4233877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGE("Write %c to rfkill\n", on);
4243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4253877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /* Write value to control rfkill */
4263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if ((size = write(fd, &on, 1)) < 0) {
4273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("write(%s) failed: %s (%d)",rfkill_state, strerror(errno),errno);
4283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
4293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        bt_semaphore_release(lock_fd);
4303877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        bt_semaphore_destroy(lock_fd);
4313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
4323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
4333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
4343877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef BT_SOC_TYPE_ROME
4353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if(on == '0'){
4363877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("Stopping HCI filter as part of CTRL:OFF");
4373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        stop_hci_filter();
4383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        property_set("wc_transport.soc_initialized", "0");
4393877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
4403877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
4413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
4423877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /* query wifi status */
4433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    property_get(WIFI_PROP_NAME, wifi_status, "");
4443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4453877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGE("bt get wifi status: %s, isInit: %d\n",  wifi_status, isInit);
4463877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4473877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /* If wlan driver is not loaded, and bt is changed from off => on */
4483877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (strncmp(wifi_status, "unloaded", strlen("unloaded")) == 0 || strlen(wifi_status) == 0) {
4493877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if (on == '1') {
4503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            ALOGI("%s: BT_VND_PWR_ON\n", __func__);
4513877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            if(property_set(SERVICE_PROP_NAME, "load_wlan") < 0) {
4523877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ALOGE("%s Property setting failed", SERVICE_PROP_NAME);
4533877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                close(fd);
4543877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                bt_semaphore_release(lock_fd);
4553877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                bt_semaphore_destroy(lock_fd);
4563877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                return -1;
4573877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
4583877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
4593877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        else if (isInit == 0 && on == '0') {
4603877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            ALOGI("%s: BT_VND_PWR_OFF\n", __func__);
4613877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            if(property_set(SERVICE_PROP_NAME, "unbind_hsic") < 0) {
4623877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ALOGE("%s Property setting failed", SERVICE_PROP_NAME);
4633877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                close(fd);
4643877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                bt_semaphore_release(lock_fd);
4653877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                bt_semaphore_destroy(lock_fd);
4663877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                return -1;
4673877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
4683877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       }
4693877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
4703877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4713877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (isInit == 0 && on == '0')
4723877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        property_set(BT_STATUS_NAME, "false");
4733877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    else if (on == '1')
4743877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        property_set(BT_STATUS_NAME, "true");
4753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4763877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bt_semaphore_release(lock_fd);
4773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bt_semaphore_destroy(lock_fd);
4783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif /* WIFI_BT_STATUS_SYNC */
4793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4803877697852db58569e9fab3aad46494bca561a9aMekala Natarajandone:
4813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (fd >= 0)
4823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        close(fd);
4833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return 0;
4853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
4863877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4873877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/*****************************************************************************
4883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan**
4893877697852db58569e9fab3aad46494bca561a9aMekala Natarajan**   BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS
4903877697852db58569e9fab3aad46494bca561a9aMekala Natarajan**
4913877697852db58569e9fab3aad46494bca561a9aMekala Natarajan*****************************************************************************/
4923877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4933877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr)
4943877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
4953877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int i;
4963877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4973877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGI("bt-vendor : init");
4983877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
4993877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (p_cb == NULL)
5003877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    {
5013877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("init failed with no user callbacks!");
5023877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
5033877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
5043877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5053877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if ((btSocType = get_bt_soc_type()) < 0) {
5063877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("%s: Failed to detect BT SOC Type", __FUNCTION__);
5073877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return -1;
5083877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
5093877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5103877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    switch(btSocType)
5113877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    {
5123877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_SOC_ROME:
5133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_SOC_AR3K:
5143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            ALOGI("bt-vendor : Initializing UART transport layer");
5153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            userial_vendor_init();
5163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
5173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_SOC_DEFAULT:
5183877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
5193877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        default:
5203877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            ALOGE("Unknown btSocType: 0x%x", btSocType);
5213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
5223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
5233877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /* store reference to user callbacks */
5253877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb;
5263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /* Copy BD Address as little-endian byte order */
5283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if(local_bdaddr)
5293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        for(i=0;i<6;i++)
5303877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            vnd_local_bd_addr[i] = *(local_bdaddr + (5-i));
5313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGI("%s: Local BD Address : %.2x:%.2x:%.2x:%.2x:%.2x:%.2x", __FUNCTION__,
5333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                vnd_local_bd_addr[0],
5343877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                vnd_local_bd_addr[1],
5353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                vnd_local_bd_addr[2],
5363877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                vnd_local_bd_addr[3],
5373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                vnd_local_bd_addr[4],
5383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                vnd_local_bd_addr[5]);
5393877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5403877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
5413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    isInit = 1;
5423877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif /* WIFI_BT_STATUS_SYNC */
5433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return 0;
5453877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
5463877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5473877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef READ_BT_ADDR_FROM_PROP
5483877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic bool validate_tok(char* bdaddr_tok) {
5493877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int i = 0;
5503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bool ret;
5513877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5523877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (strlen(bdaddr_tok) != 2) {
5533877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ret = FALSE;
5543877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("Invalid token length");
5553877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    } else {
5563877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ret = TRUE;
5573877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        for (i=0; i<2; i++) {
5583877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            if ((bdaddr_tok[i] >= '0' && bdaddr_tok[i] <= '9') ||
5593877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                (bdaddr_tok[i] >= 'A' && bdaddr_tok[i] <= 'F') ||
5603877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                (bdaddr_tok[i] >= 'a' && bdaddr_tok[i] <= 'f')) {
5613877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ret = TRUE;
5623877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ALOGV("%s: tok %s @ %d is good", __func__, bdaddr_tok, i);
5633877697852db58569e9fab3aad46494bca561a9aMekala Natarajan             } else {
5643877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ret = FALSE;
5653877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ALOGE("invalid character in tok: %s at ind: %d", bdaddr_tok, i);
5663877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                break;
5673877697852db58569e9fab3aad46494bca561a9aMekala Natarajan             }
5683877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
5693877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
5703877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return ret;
5713877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
5723877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif /*READ_BT_ADDR_FROM_PROP*/
5733877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5743877697852db58569e9fab3aad46494bca561a9aMekala Natarajanint connect_to_local_socket(char* name) {
5753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       socklen_t len; int sk = -1;
5763877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       ALOGE("%s: ACCEPT ", __func__);
5783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       sk  = socket(AF_LOCAL, SOCK_STREAM, 0);
5793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       if (sk < 0) {
5803877697852db58569e9fab3aad46494bca561a9aMekala Natarajan           ALOGE("Socket creation failure");
5813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan           return -1;
5823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan       }
5833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if(socket_local_client_connect(sk, name,
5853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM) < 0)
5863877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        {
5873877697852db58569e9fab3aad46494bca561a9aMekala Natarajan             ALOGE("failed to connect (%s)", strerror(errno));
5883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan             close(sk);
5893877697852db58569e9fab3aad46494bca561a9aMekala Natarajan             sk = -1;
5903877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        } else {
5913877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ALOGE("%s: Connection succeeded\n", __func__);
5923877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
5933877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        return sk;
5943877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
5953877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
5963877697852db58569e9fab3aad46494bca561a9aMekala Natarajanbool is_soc_initialized() {
5973877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bool init = false;
5983877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char init_value[PROPERTY_VALUE_MAX];
5993877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int ret;
6003877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
6013877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGI("bt-vendor : is_soc_initialized");
6023877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
6033877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ret = property_get("wc_transport.soc_initialized", init_value, NULL);
6043877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (ret != 0) {
6053877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGI("wc_transport.soc_initialized set to %s\n", init_value);
6063877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        if (!strncasecmp(init_value, "1", sizeof("1"))) {
6073877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            init = true;
6083877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        }
6093877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
6103877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    else {
6113877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("%s: Failed to get wc_transport.soc_initialized", __FUNCTION__);
6123877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
6133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
6143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return init;
6153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
6163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
6173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
6183877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/** Requested operations */
6193877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic int op(bt_vendor_opcode_t opcode, void *param)
6203877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
6213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int retval = 0;
6223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int nCnt = 0;
6233877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int nState = -1;
6243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bool is_ant_req = false;
6253877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char wipower_status[PROPERTY_VALUE_MAX];
6263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char bt_version[PROPERTY_VALUE_MAX];
6273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bool ignore_boot_prop = TRUE;
6283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef READ_BT_ADDR_FROM_PROP
6293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int i = 0;
6303877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    static char bd_addr[PROPERTY_VALUE_MAX];
6313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    uint8_t local_bd_addr_from_prop[6];
6323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    char* tok;
6333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
634d7ed5bb817da0b50b4c1be13dbd77d5aea25653cBen YoungTae Kim    bool skip_init = true;
6353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
6363877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGV("bt-vendor : op for %d", opcode);
6373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
6383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    switch(opcode)
6393877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    {
6403877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_POWER_CTRL:
6413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            {
6423877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                nState = *(int *) param;
6433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ALOGI("bt-vendor : BT_VND_OP_POWER_CTRL: %s",
6443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        (nState == BT_VND_PWR_ON)? "On" : "Off" );
6453877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
6463877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                switch(btSocType)
6473877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                {
6483877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_DEFAULT:
6493877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        if (readTrpState())
6503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        {
6513877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           ALOGI("bt-vendor : resetting BT status");
6523877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           hw_config(BT_VND_PWR_OFF);
6533877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        }
6543877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        retval = hw_config(nState);
6553877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        if(nState == BT_VND_PWR_ON
6563877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           && retval == 0
6573877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           && is_hw_ready() == TRUE){
6583877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            retval = 0;
6593877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        }
6603877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        else {
6613877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            retval = -1;
6623877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        }
6633877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
6643877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_ROME:
6653877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_AR3K:
6663877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        /* BT Chipset Power Control through Device Tree Node */
66764f6d43e93303b84c8885f7e697ec822ceb70667Sunny Kapdi                        if(nState == BT_VND_PWR_ON && property_get_bool("wc_transport.vnd_power", 0)) {
66864f6d43e93303b84c8885f7e697ec822ceb70667Sunny Kapdi                                bt_powerup(BT_VND_PWR_OFF);
66964f6d43e93303b84c8885f7e697ec822ceb70667Sunny Kapdi                        }
6703877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        retval = bt_powerup(nState);
67164f6d43e93303b84c8885f7e697ec822ceb70667Sunny Kapdi                        if(retval == 0)
67264f6d43e93303b84c8885f7e697ec822ceb70667Sunny Kapdi                            property_set("wc_transport.vnd_power", nState == BT_VND_PWR_ON ? "1" : "0");
6733877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    default:
6743877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
6753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                }
6763877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
6773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
6783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
6793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_FW_CFG:
6803877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            {
6813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                // call hciattach to initalize the stack
6823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                if(bt_vendor_cbacks){
6833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                   ALOGI("Bluetooth Firmware and transport layer are initialized");
6843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                   bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS);
6853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                }
6863877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                else{
6873877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                   ALOGE("bt_vendor_cbacks is null");
6883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                   ALOGE("Error : hci, smd initialization Error");
6893877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                   retval = -1;
6903877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                }
6913877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
6923877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
6933877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
6943877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_SCO_CFG:
6953877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            {
6963877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                if (bt_vendor_cbacks)
6973877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    bt_vendor_cbacks->scocfg_cb(BT_VND_OP_RESULT_SUCCESS); //dummy
6983877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
6993877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
7003877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef BT_SOC_TYPE_ROME
7013877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef ENABLE_ANT
7023877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_ANT_USERIAL_OPEN:
7033877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ALOGI("bt-vendor : BT_VND_OP_ANT_USERIAL_OPEN");
7043877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                is_ant_req = true;
7053877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                //fall through
7063877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
7073877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
7083877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_USERIAL_OPEN:
7093877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            {
7103877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                int (*fd_array)[] = (int (*)[]) param;
71162a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                int fd = -1, fd_filter = -1;
7123877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ALOGI("bt-vendor : BT_VND_OP_USERIAL_OPEN");
7133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                switch(btSocType)
7143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                {
7153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_DEFAULT:
7163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        {
7173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            if(bt_hci_init_transport(pFd) != -1){
7183877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                int (*fd_array)[] = (int (*) []) param;
7193877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
7203877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    (*fd_array)[CH_CMD] = pFd[0];
7213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    (*fd_array)[CH_EVT] = pFd[0];
7223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    (*fd_array)[CH_ACL_OUT] = pFd[1];
7233877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    (*fd_array)[CH_ACL_IN] = pFd[1];
7243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            }
7253877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            else {
7263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                retval = -1;
7273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                break;
7283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            }
7293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            retval = 2;
7303877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        }
7313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
7323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_AR3K:
7333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        {
73462a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                            int idx;
7353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg);
7363877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            if (fd != -1) {
7373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                for (idx=0; idx < CH_MAX; idx++)
7383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    (*fd_array)[idx] = fd;
73962a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                retval = 1;
7403877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            }
7413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            else {
7423877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                retval = -1;
7433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                break;
7443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            }
7453877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
7463877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            /* Vendor Specific Process should happened during userial_open process
7473877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                After userial_open, rx read thread is running immediately,
7483877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                so it will affect VS event read process.
7493877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            */
7503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            if(ath3k_init(fd,3000000,115200,NULL,&vnd_userial.termios)<0)
7513877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                retval = -1;
7523877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        }
7533877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
7543877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_ROME:
7553877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        {
75662a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                            int idx;
7573877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            property_get("persist.BT3_2.version", bt_version, false);
7583877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            if (!is_soc_initialized()) {
7593877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg);
7603877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                if (fd < 0) {
7613877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    ALOGE("userial_vendor_open returns err");
7623877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    retval = -1;
7633877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                } else {
7643877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    /* Clock on */
7653877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    userial_clock_operation(fd, USERIAL_OP_CLK_ON);
7663877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    ALOGD("userial clock on");
7673877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    if(strcmp(bt_version, "true") == 0) {
7683877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        property_get("ro.bluetooth.wipower", wipower_status, false);
7693877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        if(strcmp(wipower_status, "true") == 0) {
7703877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            check_embedded_mode(fd);
7713877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        } else {
7723877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            ALOGI("Wipower not enabled");
7733877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        }
7743877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    }
7753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    ALOGV("rome_soc_init is started");
7763877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    property_set("wc_transport.soc_initialized", "0");
7773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef READ_BT_ADDR_FROM_PROP
7783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    /*Give priority to read BD address from boot property*/
7793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    ignore_boot_prop = FALSE;
7803877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    if (property_get(BLUETOOTH_MAC_ADDR_BOOT_PROPERTY, bd_addr, NULL)) {
7813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        ALOGV("BD address read from Boot property: %s\n", bd_addr);
7823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        tok =  strtok(bd_addr, ":");
7833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        while (tok != NULL) {
7843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            ALOGV("bd add [%d]: %d ", i, strtol(tok, NULL, 16));
7853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            if (i>=6) {
7863877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                ALOGE("bd property of invalid length");
7873877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                ignore_boot_prop = TRUE;
7883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                break;
7893877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            }
7903877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            if (!validate_tok(tok)) {
7913877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                ALOGE("Invalid token in BD address");
7923877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                ignore_boot_prop = TRUE;
7933877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                break;
7943877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            }
7953877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            local_bd_addr_from_prop[5-i] = strtol(tok, NULL, 16);
7963877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            tok = strtok(NULL, ":");
7973877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            i++;
7983877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        }
7993877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        if (i == 6 && !ignore_boot_prop) {
8003877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            ALOGV("Valid BD address read from prop");
8013877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            memcpy(vnd_local_bd_addr, local_bd_addr_from_prop, sizeof(vnd_local_bd_addr));
8023877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            ignore_boot_prop = FALSE;
8033877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        } else {
8043877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            ALOGE("There are not enough tokens in BD addr");
8053877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                            ignore_boot_prop = TRUE;
8063877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        }
8073877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    } else {
8083877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        ALOGE("BD address boot property not set");
8093877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        ignore_boot_prop = TRUE;
8103877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    }
8113877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif //READ_BT_ADDR_FROM_PROP
812f2169748daa2d42d833831d240dfad98161f3c32Sunny Kapdi#ifdef BT_NV_SUPPORT
8133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    /* Always read BD address from NV file */
8143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    if(ignore_boot_prop && !bt_vendor_nv_read(1, vnd_local_bd_addr))
8153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    {
8163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                       /* Since the BD address is configured in boot time We should not be here */
8173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                       ALOGI("Failed to read BD address. Use the one from bluedroid stack/ftm");
8183877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    }
819f2169748daa2d42d833831d240dfad98161f3c32Sunny Kapdi#endif //BT_NV_SUPPORT
8203877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    if(rome_soc_init(fd,vnd_local_bd_addr)<0) {
8213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        retval = -1;
8223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    } else {
8233877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        ALOGV("rome_soc_init is completed");
8243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                        property_set("wc_transport.soc_initialized", "1");
825d7ed5bb817da0b50b4c1be13dbd77d5aea25653cBen YoungTae Kim                                        skip_init = false;
8263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                    }
8273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                }
8283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            }
8293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
8303877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            property_set("wc_transport.clean_up","0");
8313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            if (retval != -1) {
8323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef BT_SOC_TYPE_ROME
8333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                 start_hci_filter();
8343877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                 if (is_ant_req) {
8353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                     ALOGV("connect to ant channel");
83662a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                     ant_fd = fd_filter = connect_to_local_socket("ant_sock");
8373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                 }
8383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                 else
8393877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
8403877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                 {
8413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                     ALOGV("connect to bt channel");
84262a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                     vnd_userial.fd = fd_filter = connect_to_local_socket("bt_sock");
8433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                 }
8443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
84562a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                 if (fd_filter != -1) {
8463877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                     ALOGV("%s: received the socket fd: %d is_ant_req: %d\n",
84762a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                                                 __func__, fd_filter, is_ant_req);
8483877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                     if((strcmp(bt_version, "true") == 0) && !is_ant_req) {
8493877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                         if (rome_ver >= ROME_VER_3_0) {
8503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                             /*  get rome supported feature request */
8513877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                             ALOGE("%s: %x08 %0x", __FUNCTION__,rome_ver, ROME_VER_3_0);
85262a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                             rome_get_addon_feature_list(fd_filter);
8533877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                         }
8543877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                     }
8554e2674baaa2e59740c76698385beb3497adb4fdbBen YoungTae Kim
856d7ed5bb817da0b50b4c1be13dbd77d5aea25653cBen YoungTae Kim                                     if (!skip_init) {
857d7ed5bb817da0b50b4c1be13dbd77d5aea25653cBen YoungTae Kim                                         /* skip if already sent */
858d7ed5bb817da0b50b4c1be13dbd77d5aea25653cBen YoungTae Kim                                         enable_controller_log(fd_filter);
859d7ed5bb817da0b50b4c1be13dbd77d5aea25653cBen YoungTae Kim                                         skip_init = true;
860d7ed5bb817da0b50b4c1be13dbd77d5aea25653cBen YoungTae Kim                                     }
8614e2674baaa2e59740c76698385beb3497adb4fdbBen YoungTae Kim
8623877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                     for (idx=0; idx < CH_MAX; idx++)
86362a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                         (*fd_array)[idx] = fd_filter;
86462a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                     retval = 1;
86562a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                 }
8663877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                 else {
8673877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                     retval = -1;
8683877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                 }
86962a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                             }
87062a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi
87162a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                             if (fd >= 0) {
87262a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                 userial_clock_operation(fd, USERIAL_OP_CLK_OFF);
87362a4057b65f11c31e209a06e735986de01d14be3Sunny Kapdi                                 close(fd);
8743877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                             }
8753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        }
8763877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
8773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    default:
8783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        ALOGE("Unknown btSocType: 0x%x", btSocType);
8793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
8803877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                }
8813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
8823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
8833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef BT_SOC_TYPE_ROME
8843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef ENABLE_ANT
8853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_ANT_USERIAL_CLOSE:
8863877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            {
8873877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ALOGI("bt-vendor : BT_VND_OP_ANT_USERIAL_CLOSE");
8883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                property_set("wc_transport.clean_up","1");
8893877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                if (ant_fd != -1) {
8903877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    ALOGE("closing ant_fd");
8913877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    close(ant_fd);
8923877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    ant_fd = -1;
8933877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                }
8943877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
8953877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
8963877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
8973877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
8983877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_USERIAL_CLOSE:
8993877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            {
9003877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                ALOGI("bt-vendor : BT_VND_OP_USERIAL_CLOSE btSocType: %d", btSocType);
9013877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                switch(btSocType)
9023877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                {
9033877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_DEFAULT:
9043877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                         bt_hci_deinit_transport(pFd);
9053877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                         break;
9063877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
9073877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                     case BT_SOC_ROME:
9083877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                     case BT_SOC_AR3K:
9093877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        property_set("wc_transport.clean_up","1");
9103877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        userial_vendor_close();
9113877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
9123877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    default:
9133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        ALOGE("Unknown btSocType: 0x%x", btSocType);
9143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
9153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                }
9163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
9173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
9183877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
9193877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_GET_LPM_IDLE_TIMEOUT:
92017d195806bb4e43d2978358ac79d56e5fd740e1dSunny Kapdi            {
9213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                uint32_t *timeout_ms = (uint32_t *) param;
9223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                *timeout_ms = 1000;
9233877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
9243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
9253877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
9263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_LPM_SET_MODE:
9273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            if(btSocType ==  BT_SOC_AR3K) {
9283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                uint8_t *mode = (uint8_t *) param;
9293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
9303877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                if (*mode) {
9313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    lpm_set_ar3k(UPIO_LPM_MODE, UPIO_ASSERT, 0);
9323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                }
9333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                else {
9343877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    lpm_set_ar3k(UPIO_LPM_MODE, UPIO_DEASSERT, 0);
9353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                }
9363877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                if (bt_vendor_cbacks )
9373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    bt_vendor_cbacks->lpm_cb(BT_VND_OP_RESULT_SUCCESS);
9383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
9393877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            else {
9403877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                if (bt_vendor_cbacks)
9413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    bt_vendor_cbacks->lpm_cb(BT_VND_OP_RESULT_SUCCESS); //dummy
9423877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
9433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
9443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
9453877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_LPM_WAKE_SET_STATE:
9463877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            {
9473877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                switch(btSocType)
9483877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                {
9493877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_ROME:
9503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        {
9513877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            uint8_t *state = (uint8_t *) param;
9523877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            uint8_t wake_assert = (*state == BT_VND_LPM_WAKE_ASSERT) ? \
9533877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                BT_VND_LPM_WAKE_ASSERT : BT_VND_LPM_WAKE_DEASSERT;
9543877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
9553877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            if (wake_assert == 0)
9563877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                ALOGV("ASSERT: Waking up BT-Device");
9573877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            else if (wake_assert == 1)
9583877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                ALOGV("DEASSERT: Allowing BT-Device to Sleep");
9593877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
9603877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef QCOM_BT_SIBS_ENABLE
9613877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            if(bt_vendor_cbacks){
9623877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                ALOGI("Invoking HCI H4 callback function");
9633877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                               bt_vendor_cbacks->lpm_set_state_cb(wake_assert);
9643877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            }
9653877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
9663877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        }
9673877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
9683877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_AR3K:
9693877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        {
9703877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            uint8_t *state = (uint8_t *) param;
9713877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            uint8_t wake_assert = (*state == BT_VND_LPM_WAKE_ASSERT) ? \
9723877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                                        UPIO_ASSERT : UPIO_DEASSERT;
9733877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            lpm_set_ar3k(UPIO_BT_WAKE, wake_assert, 0);
9743877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        }
9753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_DEFAULT:
9763877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
9773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    default:
9783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        ALOGE("Unknown btSocType: 0x%x", btSocType);
9793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
9803877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    }
9813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
9823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
9833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_EPILOG:
9843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            {
9853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#if (HW_NEED_END_WITH_HCI_RESET == FALSE)
9863877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                if (bt_vendor_cbacks)
9873877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                {
9883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    bt_vendor_cbacks->epilog_cb(BT_VND_OP_RESULT_SUCCESS);
9893877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                }
9903877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#else
9913877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                switch(btSocType)
9923877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                {
9933877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                  case BT_SOC_ROME:
9943877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                       {
9953877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           char value[PROPERTY_VALUE_MAX] = {'\0'};
9963877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           property_get("wc_transport.hci_filter_status", value, "0");
9973877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           if(is_soc_initialized()&& (strcmp(value,"1") == 0))
9983877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           {
9993877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                              hw_epilog_process();
10003877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           }
10013877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           else
10023877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           {
10033877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                             if (bt_vendor_cbacks)
10043877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                               {
10053877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                 ALOGE("vendor lib epilog process aborted");
10063877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                                 bt_vendor_cbacks->epilog_cb(BT_VND_OP_RESULT_SUCCESS);
10073877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                               }
10083877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                           }
10093877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                       }
10103877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                       break;
10113877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                  default:
10123877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                       hw_epilog_process();
10133877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                       break;
10143877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                }
10153877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
10163877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
10173877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            break;
10183877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        case BT_VND_OP_GET_LINESPEED:
10193877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            {
10203877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                retval = -1;
10213877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                switch(btSocType)
10223877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                {
10233877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    case BT_SOC_ROME:
10243877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        if(!is_soc_initialized()) {
10253877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            ALOGE("BT_VND_OP_GET_LINESPEED: error"
10263877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            " - transport driver not initialized!");
10273877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        }else {
10283877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                            retval = 3000000;
10293877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        }
10303877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
10313877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                    default:
10323877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        retval = userial_vendor_get_baud();
10333877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                        break;
10343877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                 }
10353877697852db58569e9fab3aad46494bca561a9aMekala Natarajan                break;
10363877697852db58569e9fab3aad46494bca561a9aMekala Natarajan            }
10373877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
10383877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10393877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    return retval;
10403877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
10413877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10423877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic void ssr_cleanup(void) {
10433877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    int pwr_state=BT_VND_PWR_OFF;
10443877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10453877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGI("ssr_cleanup");
10463877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10473877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if ((btSocType = get_bt_soc_type()) < 0) {
10483877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        ALOGE("%s: Failed to detect BT SOC Type", __FUNCTION__);
104902a07fc80aabb0b81bf69b9f8d32f76a4baa276fSunny Kapdi        return;
10503877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
10513877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10523877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    if (btSocType == BT_SOC_ROME) {
10533877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef BT_SOC_TYPE_ROME
10543877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef ENABLE_ANT
10553877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        /*Close both ANT channel*/
10563877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        op(BT_VND_OP_ANT_USERIAL_CLOSE, NULL);
10573877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
10583877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
10593877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        /*Close both ANT channel*/
10603877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        op(BT_VND_OP_USERIAL_CLOSE, NULL);
10613877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        /*CTRL OFF twice to make sure hw
10623877697852db58569e9fab3aad46494bca561a9aMekala Natarajan         * turns off*/
10633877697852db58569e9fab3aad46494bca561a9aMekala Natarajan        op(BT_VND_OP_POWER_CTRL, &pwr_state);
10643877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10653877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    }
10663877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10673877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef BT_SOC_TYPE_ROME
10683877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    /*Generally switching of chip should be enough*/
10693877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    op(BT_VND_OP_POWER_CTRL, &pwr_state);
10703877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif
10713877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bt_vendor_cbacks = NULL;
10723877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
10733877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10743877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10753877697852db58569e9fab3aad46494bca561a9aMekala Natarajan/** Closes the interface */
10763877697852db58569e9fab3aad46494bca561a9aMekala Natarajanstatic void cleanup( void )
10773877697852db58569e9fab3aad46494bca561a9aMekala Natarajan{
10783877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ALOGI("cleanup");
10793877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    bt_vendor_cbacks = NULL;
10803877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10813877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#ifdef WIFI_BT_STATUS_SYNC
10823877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    isInit = 0;
10833877697852db58569e9fab3aad46494bca561a9aMekala Natarajan#endif /* WIFI_BT_STATUS_SYNC */
10843877697852db58569e9fab3aad46494bca561a9aMekala Natarajan}
10853877697852db58569e9fab3aad46494bca561a9aMekala Natarajan
10863877697852db58569e9fab3aad46494bca561a9aMekala Natarajan// Entry point of DLib
10873877697852db58569e9fab3aad46494bca561a9aMekala Natarajanconst bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {
10883877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    sizeof(bt_vendor_interface_t),
10893877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    init,
10903877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    op,
10913877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    cleanup,
10923877697852db58569e9fab3aad46494bca561a9aMekala Natarajan    ssr_cleanup
10933877697852db58569e9fab3aad46494bca561a9aMekala Natarajan};
1094