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