1d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist/****************************************************************************** 2d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * 3d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * Copyright (C) 2015 Motorola Corporation 4d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * 5d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * Licensed under the Apache License, Version 2.0 (the "License"); 6d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * you may not use this file except in compliance with the License. 7d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * You may obtain a copy of the License at: 8d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * 9d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * http://www.apache.org/licenses/LICENSE-2.0 10d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * 11d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * Unless required by applicable law or agreed to in writing, software 12d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * distributed under the License is distributed on an "AS IS" BASIS, 13d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * See the License for the specific language governing permissions and 15d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * limitations under the License. 16d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * 17d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ******************************************************************************/ 18d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 19d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist/****************************************************************************** 20d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * 21d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * This is the stream state machine for the BRCM offloaded advanced audio. 22d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist * 23d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ******************************************************************************/ 24d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 25d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#define LOG_TAG "bt_vnd_a2dp" 26d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#define LOG_NDEBUG 0 27d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 28d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <string.h> 29d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <pthread.h> 30d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <utils/Log.h> 31d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <sys/types.h> 32d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <sys/stat.h> 33d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <signal.h> 34d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <time.h> 35d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <errno.h> 36d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <fcntl.h> 37d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <dirent.h> 38d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <ctype.h> 39d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <cutils/properties.h> 40d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include <stdlib.h> 41d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include "bt_hci_bdroid.h" 42d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include "bt_vendor_brcm_a2dp.h" 43d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include "a2d_api.h" 44d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#include "a2d_sbc.h" 45d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 46d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#if (BTA2DP_DEBUG == TRUE) 47d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#define BTA2DPDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);} 48d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#else 49d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#define BTA2DPDBG(param, ...) {} 50d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#endif 51d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 52d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist/***************************************************************************** 53d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** Constants and types 54d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist*****************************************************************************/ 55d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 56d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashisttypedef void (*hci_cback)(void *); 57d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 58d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashisttypedef enum 59d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 60d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_OFFLOAD_INIT_REQ, 61d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_OFFLOAD_START_REQ, 62d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_OFFLOAD_STOP_REQ, 63d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_UIPC_OPEN_RSP, 64d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_L2C_SYNC_TO_LITE_RSP, 65d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_SYNC_TO_BTC_LITE_RSP, 66d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_AUDIO_CODEC_CONFIG_RSP, 67d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_AUDIO_ROUTE_CONFIG_RSP, 68d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_UIPC_CLOSE_RSP, 69d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_L2C_REMOVE_TO_LITE_RSP, 70d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_START_RSP, 71d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_SUSPEND_RSP, 72d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_STREAM_STOP_RSP, 73d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_CLEANUP_RSP, 74d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_OFFLOAD_FAILED_ABORT, 75d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} tBRCM_VND_A2DP_EVENT; 76d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 77d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist/* state machine states */ 78d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashisttypedef enum 79d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 80d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_INVALID_SST = -1, 81d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_IDLE_SST, 82d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_STARTING_SST, 83d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_STREAM_SST, 84d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 85d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar VashisttBRCM_VND_A2DP_SST_STATES; 86d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 876708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashiststatic uint8_t brcm_vnd_a2dp_offload_configure(); 88d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic uint8_t brcm_vnd_a2dp_offload_cleanup(); 89d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic uint8_t brcm_vnd_a2dp_offload_suspend(); 90d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic tBRCM_VND_A2DP_SST_STATES brcm_vnd_a2dp_sm_idle_process_ev(tBRCM_VND_A2DP_EVENT event, void *ev_data); 91d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic tBRCM_VND_A2DP_SST_STATES brcm_vnd_a2dp_sm_starting_process_ev(tBRCM_VND_A2DP_EVENT event, void *ev_data); 92d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic tBRCM_VND_A2DP_SST_STATES brcm_vnd_a2dp_sm_stream_process_ev(tBRCM_VND_A2DP_EVENT event, void *ev_data); 93d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic void brcm_vnd_a2dp_hci_uipc_cback(void *pmem); 94d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 95d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashisttypedef struct { 966708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist uint8_t fcn; 97d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint32_t pad_conf; 98d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 99d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar VashisttBRCM_VND_PCM_CONF; 100d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 101d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashisttypedef struct { 102d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_A2DP_SST_STATES state; 103d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tCODEC_INFO_SBC codec_info; 104d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_PCM_CONF pcmi2s_pinmux; 105d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_op_a2dp_offload_t offload_params; 106d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 107d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar VashisttBRCM_VND_A2DP_PDATA; 108d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 109d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashisttypedef struct { 110d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_A2DP_SST_STATES (*enter)(tBRCM_VND_A2DP_EVENT event); 111d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_A2DP_SST_STATES (*process_event)(tBRCM_VND_A2DP_EVENT event, void *ev_data); 112d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 113d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar VashisttBRCM_VND_A2DP_SST_STATE; 114d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 115d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist/* state table */ 116d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic tBRCM_VND_A2DP_SST_STATE brcm_vnd_a2dp_sst_tbl[] = 117d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 1186708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist {NULL, brcm_vnd_a2dp_sm_idle_process_ev}, 1196708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist {NULL, brcm_vnd_a2dp_sm_starting_process_ev}, 1206708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist {NULL, brcm_vnd_a2dp_sm_stream_process_ev}, 121d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist}; 122d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 123d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; 124d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic tBRCM_VND_A2DP_PDATA brcm_vnd_a2dp_pdata = { .state = BRCM_VND_A2DP_INVALID_SST }; 125d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 126d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 127d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist/******************************************************************************* 128d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** Local Utility Functions 129d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist*******************************************************************************/ 130d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 131d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic void log_bin_to_hexstr(uint8_t *bin, uint8_t binsz, const char *log_tag) 132d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 133d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#if (BTA2DP_DEBUG == TRUE) 134d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist char *str, hex_str[]= "0123456789abcdef"; 135d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint8_t i; 136d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 137d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist str = (char *)malloc(binsz * 3); 138d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (!binsz) { 139d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s alloc failed", __FUNCTION__); 140d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return; 141d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 142d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 143d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist for (i = 0; i < binsz; i++) { 144d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist str[(i * 3) + 0] = hex_str[(bin[i] >> 4) & 0x0F]; 145d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist str[(i * 3) + 1] = hex_str[(bin[i] ) & 0x0F]; 146d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist str[(i * 3) + 2] = ' '; 147d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 148d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist str[(binsz * 3) - 1] = 0x00; 149d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BTA2DPDBG("%s %s", log_tag, str); 150d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist#endif 151d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 152d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 153d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic uint8_t brcm_vnd_a2dp_send_hci_vsc(uint16_t cmd, uint8_t *payload, uint8_t len, hci_cback cback) 154d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 155d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist HC_BT_HDR *p_buf; 156d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint8_t *p, status; 157d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint16_t opcode; 158d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 159d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist // Perform Opening configure cmds. // 160d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (bt_vendor_cbacks) { 161d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p_buf = (HC_BT_HDR *)bt_vendor_cbacks->alloc( 162d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BT_HC_HDR_SIZE + HCI_CMD_PREAMBLE_SIZE + len); 163d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (p_buf) 164d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist { 165d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p_buf->event = MSG_STACK_TO_HC_HCI_CMD; 166d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p_buf->offset = 0; 167d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p_buf->layer_specific = 0; 168d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p_buf->len = HCI_CMD_PREAMBLE_SIZE + len; 169d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p = (uint8_t *)(p_buf + 1); 170d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 171d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT16_TO_STREAM(p, cmd); 172d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist *p++ = len; 173d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist memcpy(p, payload, len); 174d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 175d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist //BTA2DPDBG("%s Cmd %04x UIPC Event %02x%02x UIPC Op %02x Len %d", __FUNCTION__, cmd, event, payload[1], payload[0], payload[2], len); 176d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist log_bin_to_hexstr((uint8_t *)(p_buf + 1), HCI_CMD_PREAMBLE_SIZE + len, __FUNCTION__); 177d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 178d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (bt_vendor_cbacks->xmit_cb(cmd, p_buf, cback)) 179d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist { 180d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return BT_VND_OP_RESULT_SUCCESS; 181d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 182d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_cbacks->dealloc(p_buf); 183d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 184d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 185d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return BT_VND_OP_RESULT_FAIL; 186d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 187d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 188d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic void brcm_vnd_map_a2d_uipc_codec_info(tCODEC_INFO_SBC *codec_info) 189d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 190d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch(codec_info->sampling_freq) { 191d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_SAMP_FREQ_16: 192d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->sampling_freq = CODEC_INFO_SBC_SF_16K; break; 193d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_SAMP_FREQ_32: 194d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->sampling_freq = CODEC_INFO_SBC_SF_32K; break; 195d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_SAMP_FREQ_44: 196d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->sampling_freq = CODEC_INFO_SBC_SF_44K; break; 197d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_SAMP_FREQ_48: 198d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->sampling_freq = CODEC_INFO_SBC_SF_48K; break; 199d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 200d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 201d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch(codec_info->channel_mode) { 202d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_CH_MD_MONO: 203d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->channel_mode = CODEC_INFO_SBC_CH_MONO; break; 204d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_CH_MD_DUAL: 205d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->channel_mode = CODEC_INFO_SBC_CH_DUAL; break; 206d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_CH_MD_STEREO: 207d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->channel_mode = CODEC_INFO_SBC_CH_STEREO; break; 208d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_CH_MD_JOINT: 209d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->channel_mode = CODEC_INFO_SBC_CH_JS; break; 210d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 211d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch(codec_info->block_length) { 212d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_BLOCKS_4: 213d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->block_length = CODEC_INFO_SBC_BLOCK_4; break; 214d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_BLOCKS_8: 215d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->block_length = CODEC_INFO_SBC_BLOCK_8; break; 216d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_BLOCKS_12: 217d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->block_length = CODEC_INFO_SBC_BLOCK_12; break; 218d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_BLOCKS_16: 219d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->block_length = CODEC_INFO_SBC_BLOCK_16; break; 220d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 221d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch(codec_info->alloc_method) { 222d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_ALLOC_MD_S: 223d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->alloc_method = CODEC_INFO_SBC_ALLOC_SNR; break; 224d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_ALLOC_MD_L: 225d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->alloc_method = CODEC_INFO_SBC_ALLOC_LOUDNESS; break; 226d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 227d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch(codec_info->num_subbands) { 228d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_SUBBAND_4: 229d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->num_subbands = CODEC_INFO_SBC_SUBBAND_4; break; 230d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2D_SBC_IE_SUBBAND_8: 231d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info->num_subbands = CODEC_INFO_SBC_SUBBAND_8; break; 232d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 233d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 234d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 235d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic tA2D_STATUS bcrm_vnd_a2dp_parse_codec_info(tCODEC_INFO_SBC *parsed_info, uint8_t *codec_info) 236d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 237d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tA2D_STATUS status = A2D_SUCCESS; 238d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT8 losc; 239d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT8 mt; 240d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 241d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BTA2DPDBG("%s", __FUNCTION__); 242d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 243d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if( parsed_info == NULL || codec_info == NULL) 244d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = A2D_FAIL; 245d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist else 246d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist { 247d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist losc = *codec_info++; 248d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist mt = *codec_info++; 249d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist /* If the function is called for the wrong Media Type or Media Codec Type */ 250d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if(losc != A2D_SBC_INFO_LEN || *codec_info != A2D_MEDIA_CT_SBC) 251d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = A2D_WRONG_CODEC; 252d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist else 253d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist { 254d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info++; 255d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist parsed_info->sampling_freq = *codec_info & A2D_SBC_IE_SAMP_FREQ_MSK; 256d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist parsed_info->channel_mode = *codec_info & A2D_SBC_IE_CH_MD_MSK; 257d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist codec_info++; 258d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist parsed_info->block_length = *codec_info & A2D_SBC_IE_BLOCKS_MSK; 259d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist parsed_info->num_subbands = *codec_info & A2D_SBC_IE_SUBBAND_MSK; 260d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist parsed_info->alloc_method = *codec_info & A2D_SBC_IE_ALLOC_MD_MSK; 26149b5e6f5dfdddd0f875d120f5aebc39d7d9415a5Sridhar Vashist codec_info += 2; /* MAX Bitpool */ 26249b5e6f5dfdddd0f875d120f5aebc39d7d9415a5Sridhar Vashist parsed_info->bitpool_size = (*codec_info > BRCM_A2DP_OFFLOAD_MAX_BITPOOL) ? 26349b5e6f5dfdddd0f875d120f5aebc39d7d9415a5Sridhar Vashist BRCM_A2DP_OFFLOAD_MAX_BITPOOL : (*codec_info); 264d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 265d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if(MULTI_BIT_SET(parsed_info->sampling_freq)) 266d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = A2D_BAD_SAMP_FREQ; 267d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if(MULTI_BIT_SET(parsed_info->channel_mode)) 268d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = A2D_BAD_CH_MODE; 269d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if(MULTI_BIT_SET(parsed_info->block_length)) 270d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = A2D_BAD_BLOCK_LEN; 271d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if(MULTI_BIT_SET(parsed_info->num_subbands)) 272d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = A2D_BAD_SUBBANDS; 273d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if(MULTI_BIT_SET(parsed_info->alloc_method)) 274d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = A2D_BAD_ALLOC_MTHD; 275d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if(parsed_info->bitpool_size < A2D_SBC_IE_MIN_BITPOOL || parsed_info->bitpool_size > A2D_SBC_IE_MAX_BITPOOL ) 276d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = A2D_BAD_MIN_BITPOOL; 277d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 278d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if(status == A2D_SUCCESS) 279d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_map_a2d_uipc_codec_info(parsed_info); 280d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 281d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BTA2DPDBG("%s STATUS %d parsed info : SampF %02x, ChnMode %02x, BlockL %02x, NSubB %02x, alloc %02x, bitpool %02x", 282d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist __FUNCTION__, status, parsed_info->sampling_freq, parsed_info->channel_mode, parsed_info->block_length, 283d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist parsed_info->num_subbands, parsed_info->alloc_method, parsed_info->bitpool_size); 284d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 285d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 286d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 287d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return status; 288d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 289d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 290d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist/******************************************************************************* 291d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** State Machine Functions 292d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist*******************************************************************************/ 293d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 294d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist/******************************************************************************* 295d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** 296d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** Function brcm_vnd_a2dp_ssm_execute 297d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** 298d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** Description Stream state machine event handling function for AV 299d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** 300d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** 301d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** Returns void 302d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist** 303d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist*******************************************************************************/ 304d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashistint brcm_vnd_a2dp_ssm_execute(tBRCM_VND_A2DP_EVENT event, void *ev_data) 305d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 306d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_A2DP_SST_STATE *state_table; 307d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_A2DP_SST_STATES next_state; 308d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 309d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist pthread_mutex_lock(&g_mutex); 310d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 3116708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist BTA2DPDBG("%s ev %d state %d", __FUNCTION__, event, brcm_vnd_a2dp_pdata.state); 3126708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 313d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (brcm_vnd_a2dp_pdata.state != BRCM_VND_A2DP_INVALID_SST) { 314d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist state_table = &brcm_vnd_a2dp_sst_tbl[brcm_vnd_a2dp_pdata.state]; 315d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist /* process event */ 316d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = state_table->process_event(event, ev_data); 317d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } else if (BRCM_VND_A2DP_OFFLOAD_INIT_REQ == event) { 318d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 319d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 320d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist else { 321d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist pthread_mutex_unlock(&g_mutex); 322d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return BT_VND_OP_RESULT_FAIL; 323d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 324d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 325d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist /* transition stae */ 326d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist while (next_state != brcm_vnd_a2dp_pdata.state) { 327d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.state = next_state; 328d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist state_table = &brcm_vnd_a2dp_sst_tbl[next_state]; 329d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (state_table->enter) 330d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = state_table->enter(event); 331d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 332d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 333d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist pthread_mutex_unlock(&g_mutex); 334d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return BT_VND_OP_RESULT_SUCCESS; 335d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 336d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 337d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist/* state machine actions */ 338d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 339d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic tBRCM_VND_A2DP_SST_STATES brcm_vnd_a2dp_sm_idle_process_ev(tBRCM_VND_A2DP_EVENT event, void *ev_data) 340d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 341d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_A2DP_SST_STATES next_state = brcm_vnd_a2dp_pdata.state; 342d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 343d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch (event) { 344d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_A2DP_OFFLOAD_START_REQ: 345d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.offload_params = *(bt_vendor_op_a2dp_offload_t*)ev_data; 346d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (A2D_SUCCESS != bcrm_vnd_a2dp_parse_codec_info( &brcm_vnd_a2dp_pdata.codec_info, 347d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist (uint8_t *)brcm_vnd_a2dp_pdata.offload_params.codec_info)) { 348d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s CodecConfig BT_VND_OP_A2DP_OFFLOAD_START FAILED", __FUNCTION__); 3496708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist bt_vendor_cbacks->a2dp_offload_cb(BT_VND_OP_RESULT_FAIL, BT_VND_OP_A2DP_OFFLOAD_START, 3506708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_pdata.offload_params.bta_av_handle); 3516708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist } else { 3526708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_offload_configure(); 3536708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist next_state = BRCM_VND_A2DP_STARTING_SST; 354d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 355d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 356d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 357d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist default: 358d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGV("%s Unexpected Event %d in State %d, IGNORE", __FUNCTION__, event, brcm_vnd_a2dp_pdata.state); 359d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 360d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 361d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return next_state; 362d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 363d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 364d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic tBRCM_VND_A2DP_SST_STATES brcm_vnd_a2dp_sm_starting_process_ev(tBRCM_VND_A2DP_EVENT event, void *ev_data) 365d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 366d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_A2DP_SST_STATES next_state = brcm_vnd_a2dp_pdata.state; 367d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint8_t status, *p; 3686708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 369d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch (event) { 370d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_A2DP_OFFLOAD_START_REQ: 371d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_offload_cleanup(); 372d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.offload_params = *(bt_vendor_op_a2dp_offload_t*)ev_data; 373d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (A2D_SUCCESS != bcrm_vnd_a2dp_parse_codec_info( 374d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist &brcm_vnd_a2dp_pdata.codec_info, (uint8_t *)brcm_vnd_a2dp_pdata.offload_params.codec_info)) { 375d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s CodecConfig BT_VND_OP_A2DP_OFFLOAD_START FAILED", __FUNCTION__); 3766708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist bt_vendor_cbacks->a2dp_offload_cb(BT_VND_OP_RESULT_FAIL, BT_VND_OP_A2DP_OFFLOAD_START, 3776708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_pdata.offload_params.bta_av_handle); 3786708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 3796708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist } else { 3806708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_offload_configure(); 381d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 382d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 383d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 384d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_A2DP_OFFLOAD_STOP_REQ: 385d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_offload_cleanup(); 386d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 387d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 388d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 389d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_UIPC_OPEN_RSP: { 390d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint8_t num_streams; 391d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint16_t maj_ver, min_ver; 392d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p = (uint8_t*)ev_data + offsetof(tUIPC_OPEN_RSP, status); 393d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist STREAM_TO_UINT8(status,p); 394d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist STREAM_TO_UINT16(maj_ver,p); 395d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist STREAM_TO_UINT16(min_ver,p); 396d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist STREAM_TO_UINT8(num_streams,p); 397d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist // TODO Verify Params // 398d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (status) { 399d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s BRCM_VND_UIPC_OPEN_RSP %02x FAILED", __FUNCTION__, status); 400d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_offload_cleanup(); 401d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_cbacks->a2dp_offload_cb(BT_VND_OP_RESULT_FAIL, BT_VND_OP_A2DP_OFFLOAD_START, 402d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.offload_params.bta_av_handle); 403d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 404d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 405d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 406d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 407d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 408d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_L2C_SYNC_TO_LITE_RSP: 409d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = *((uint8_t*)ev_data + offsetof(tL2C_SYNC_TO_LITE_RESP, stream.status)); 410d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (status) { 411d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s L2C_SYNC_TO_LITE_RESP %02x FAILED", __FUNCTION__, status); 412d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_offload_cleanup(); 413d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_cbacks->a2dp_offload_cb(BT_VND_OP_RESULT_FAIL, BT_VND_OP_A2DP_OFFLOAD_START, 414d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.offload_params.bta_av_handle); 415d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 416d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 417d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 418d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 419d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_SYNC_TO_BTC_LITE_RSP: 420d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = *((uint8_t*)ev_data + offsetof(tAVDT_SYNC_TO_BTC_LITE_RESP, status)); 421d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (status) { 422d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s AVDT_SYNC_TO_BTC_LITE_RESP %02x FAILED", __FUNCTION__, status); 423d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_offload_cleanup(); 424d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_cbacks->a2dp_offload_cb(BT_VND_OP_RESULT_FAIL, BT_VND_OP_A2DP_OFFLOAD_START, 425d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.offload_params.bta_av_handle); 426d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 427d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 428d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 429d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 430d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_AUDIO_ROUTE_CONFIG_RSP: 431d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = *((uint8_t*)ev_data + offsetof(tAUDIO_ROUTE_CONFIG_RESP, status)); 432d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (status) { 433d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s AUDIO_ROUTE_CONFIG_RESP %02x FAILED", __FUNCTION__, status); 434d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_offload_cleanup(); 435d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_cbacks->a2dp_offload_cb(BT_VND_OP_RESULT_FAIL, BT_VND_OP_A2DP_OFFLOAD_START, 436d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.offload_params.bta_av_handle); 437d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 438d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 439d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 440d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 441d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_AUDIO_CODEC_CONFIG_RSP: 442d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = *((uint8_t*)ev_data + offsetof(tAUDIO_CODEC_CONFIG_RESP, status)); 443d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (status) { 444d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s BRCM_VND_AUDIO_CODEC_CONFIG_RSP %02x FAILED", __FUNCTION__, status); 445d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_offload_cleanup(); 446d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_cbacks->a2dp_offload_cb(BT_VND_OP_RESULT_FAIL, BT_VND_OP_A2DP_OFFLOAD_START, 447d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.offload_params.bta_av_handle); 448d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 449d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 450d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 451d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 452d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_A2DP_START_RSP: 453d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist /* status = *((uint8_t*)ev_data + offsetof(tA2DP_GENERIC_RESP, status)); */ 454d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_cbacks->a2dp_offload_cb(BT_VND_OP_RESULT_SUCCESS, BT_VND_OP_A2DP_OFFLOAD_START, 455d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.offload_params.bta_av_handle); 456d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = BRCM_VND_A2DP_STREAM_SST; 457d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 458d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 459d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_A2DP_OFFLOAD_FAILED_ABORT: 460d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s BRCM_VND_A2DP_OFFLOAD_FAILED_ABORT", __FUNCTION__); 461d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_offload_cleanup(); 462d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_cbacks->a2dp_offload_cb(BT_VND_OP_RESULT_FAIL, BT_VND_OP_A2DP_OFFLOAD_START, 463d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.offload_params.bta_av_handle); 464d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 465d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 466d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 467d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist default: 468d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s Unexpected Event %d in State %d, IGNORE", __FUNCTION__, event, brcm_vnd_a2dp_pdata.state); 469d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 470d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 471d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return next_state; 472d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 473d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 474d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic tBRCM_VND_A2DP_SST_STATES brcm_vnd_a2dp_sm_stream_process_ev(tBRCM_VND_A2DP_EVENT event, void *ev_data) 475d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 476d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_A2DP_SST_STATES next_state = brcm_vnd_a2dp_pdata.state; 477d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch (event) { 478d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_A2DP_OFFLOAD_START_REQ: 479d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_offload_cleanup(); 480d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.offload_params = *(bt_vendor_op_a2dp_offload_t*)ev_data; 481d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (A2D_SUCCESS != bcrm_vnd_a2dp_parse_codec_info( 482d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist &brcm_vnd_a2dp_pdata.codec_info, (uint8_t *)brcm_vnd_a2dp_pdata.offload_params.codec_info)) { 483d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s CodecConfig BT_VND_OP_A2DP_OFFLOAD_START FAILED", __FUNCTION__); 4846708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist bt_vendor_cbacks->a2dp_offload_cb(BT_VND_OP_RESULT_FAIL, BT_VND_OP_A2DP_OFFLOAD_START, 4856708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_pdata.offload_params.bta_av_handle); 4866708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 4876708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist } else { 4886708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_offload_configure(); 4896708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist next_state = BRCM_VND_A2DP_STARTING_SST; 490d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 491d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 492d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 493d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_A2DP_OFFLOAD_STOP_REQ: 494d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BRCM_VND_A2DP_OFFLOAD_FAILED_ABORT: 495d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s BRCM_VND_A2DP_OFFLOAD_STOP ABORT %d.", __FUNCTION__, 496d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist (event == BRCM_VND_A2DP_OFFLOAD_FAILED_ABORT)); 497d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_offload_cleanup(); 498d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist next_state = BRCM_VND_A2DP_IDLE_SST; 499d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 500d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 501d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist default: 502d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s Unexpected Event %d in State %d, IGNORE", __FUNCTION__, event, brcm_vnd_a2dp_pdata.state); 503d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 504d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 505d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return next_state; 506d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 507d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 5086708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashiststatic uint8_t brcm_vnd_a2dp_offload_configure() 5096708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist{ 5106708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist uint8_t *p, msg_req[HCI_CMD_MAX_LEN]; 5116708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 5126708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist BTA2DPDBG("%s", __FUNCTION__); 5136708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 5146708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist p = msg_req; 5156708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_READ_PCM_PINS, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 5166708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 5176708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist p = msg_req; 5186708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, BRCM_A2DP_OFFLOAD_PCM_PIN_FCN); 5196708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT32_TO_STREAM(p, BRCM_A2DP_OFFLOAD_PCM_PIN_PADCNF); 5206708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_WRITE_PCM_PINS, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 5216708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 5226708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist p = msg_req; 5236708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, BT_EVT_BTU_IPC_MGMT_EVT); 5246708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, UIPC_OPEN_REQ); 5256708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_UIPC_OVER_HCI, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 5266708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 5276708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist p = msg_req; 5286708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, BT_EVT_BTU_IPC_L2C_EVT); 5296708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, L2C_SYNC_TO_LITE_REQ); 5306708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.xmit_quota); 5316708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.acl_data_size); 5326708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, !(brcm_vnd_a2dp_pdata.offload_params.is_flushable)); 5336708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, 0x02); //multi_av_data_cong_start 5346708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, 0x00); //multi_av_data_cong_end 5356708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, 0x04); //multi_av_data_cong_discard 5366708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, 1); //num_stream 5376708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.local_cid); 5386708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.remote_cid); 5396708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.stream_mtu); 5406708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.lm_handle); 5416708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.xmit_quota); 5426708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.is_flushable); 5436708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_UIPC_OVER_HCI, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 5446708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 5456708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist p = msg_req; 5466708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, BT_EVT_BTU_IPC_AVDT_EVT); 5476708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, AVDT_SYNC_TO_BTC_LITE_REQ); 5486708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, 1); //num_stream 5496708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.local_cid); 5506708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT32_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.stream_source); 5516708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_UIPC_OVER_HCI, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 5526708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 5536708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist p = msg_req; 5546708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, BT_EVT_BTU_IPC_BTM_EVT); 5556708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, AUDIO_ROUTE_CONFIG_REQ); 5566708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, BRCM_A2DP_OFFLOAD_SRC); 5576708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, BRCM_A2DP_OFFLOAD_SRC_SF); 5586708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, AUDIO_ROUTE_OUT_BTA2DP); 5596708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, BRCM_A2DP_OFFLOAD_SRC_SF); 5606708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, AUDIO_ROUTE_SF_NA); 5616708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, AUDIO_ROUTE_EQ_BYPASS); 5626708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_UIPC_OVER_HCI, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 5636708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 5646708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist p = msg_req; 5656708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, BT_EVT_BTU_IPC_BTM_EVT); 5666708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, AUDIO_CODEC_CONFIG_REQ); 5676708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, AUDIO_CODEC_SBC_ENC); 5686708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, brcm_vnd_a2dp_pdata.codec_info.sampling_freq); 5696708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, brcm_vnd_a2dp_pdata.codec_info.channel_mode); 5706708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, brcm_vnd_a2dp_pdata.codec_info.block_length); 5716708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, brcm_vnd_a2dp_pdata.codec_info.num_subbands); 5726708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, brcm_vnd_a2dp_pdata.codec_info.alloc_method); 5736708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, brcm_vnd_a2dp_pdata.codec_info.bitpool_size); 5746708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_UIPC_OVER_HCI, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 5756708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 5766708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist p = msg_req; 5776708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, BT_EVT_BTU_IPC_BTM_EVT); 5786708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT8_TO_STREAM(p, A2DP_START_REQ); 5796708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.local_cid); 5806708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.stream_mtu); 5816708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_UIPC_OVER_HCI, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 5826708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 5836708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist return 0; 5846708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist} 5856708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist 586d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic uint8_t brcm_vnd_a2dp_offload_cleanup() 587d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 588d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint8_t *p, msg_req[HCI_CMD_MAX_LEN]; 589d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 590d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BTA2DPDBG("%s", __FUNCTION__); 591d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 592d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p = msg_req; 593d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT16_TO_STREAM(p, BT_EVT_BTU_IPC_BTM_EVT); 594d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT8_TO_STREAM(p, A2DP_CLEANUP_REQ); 595d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.local_cid); 596d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.stream_mtu); 597d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_UIPC_OVER_HCI, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 598d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 599d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p = msg_req; 600d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT16_TO_STREAM(p, BT_EVT_BTU_IPC_L2C_EVT); 601d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT8_TO_STREAM(p, L2C_REMOVE_TO_LITE_REQ); 602d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.xmit_quota); 603d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT8_TO_STREAM(p, 1); //num_stream 604d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.local_cid); 605d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_UIPC_OVER_HCI, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 606d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 607d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p = msg_req; 608d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT16_TO_STREAM(p, BT_EVT_BTU_IPC_MGMT_EVT); 609d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT8_TO_STREAM(p, UIPC_CLOSE_REQ); 610d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_UIPC_OVER_HCI, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 611d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 612d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (PCM_PIN_FCN_INVALID != brcm_vnd_a2dp_pdata.pcmi2s_pinmux.fcn) { 613d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p = msg_req; 614d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT8_TO_STREAM(p, brcm_vnd_a2dp_pdata.pcmi2s_pinmux.fcn); 615d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT32_TO_STREAM(p, brcm_vnd_a2dp_pdata.pcmi2s_pinmux.pad_conf); 616d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_WRITE_PCM_PINS, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 6176708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist brcm_vnd_a2dp_pdata.pcmi2s_pinmux.fcn = PCM_PIN_FCN_INVALID; 618d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 619d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 620d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return 0; 621d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 622d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 623d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashiststatic uint8_t brcm_vnd_a2dp_offload_suspend() 624d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 625d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint8_t *p, msg_req[HCI_CMD_MAX_LEN]; 626d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 627d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BTA2DPDBG("%s", __FUNCTION__); 628d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 629d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p = msg_req; 630d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT16_TO_STREAM(p, BT_EVT_BTU_IPC_BTM_EVT); 631d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT8_TO_STREAM(p, A2DP_SUSPEND_REQ); 632d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist UINT16_TO_STREAM(p, brcm_vnd_a2dp_pdata.offload_params.local_cid); 633d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_send_hci_vsc(HCI_VSC_UIPC_OVER_HCI, msg_req, (uint8_t)(p - msg_req), brcm_vnd_a2dp_hci_uipc_cback); 634d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 635d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return 0; 636d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 637d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 638d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashistvoid brcm_vnd_a2dp_hci_uipc_cback(void *pmem) 639d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 640d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist HC_BT_HDR *p_evt_buf = (HC_BT_HDR *)pmem; 641d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint8_t *p, len, vsc_result, uipc_opcode; 642d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uint16_t vsc_opcode, uipc_event; 643d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist HC_BT_HDR *p_buf = NULL; 644d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_op_result_t status = BT_VND_OP_RESULT_SUCCESS; 645d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_A2DP_EVENT ssm_event; 646d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 647d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_LEN; 648d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist len = *p; 649d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_VSC; 650d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist STREAM_TO_UINT16(vsc_opcode,p); 651d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist vsc_result = *p++; 652d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 653d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist log_bin_to_hexstr(((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_VSC), len-1, __FUNCTION__); 654d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 655d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (vsc_result != 0) { 656d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGE("%s Failed VSC Op %04x", __FUNCTION__, vsc_opcode); 657d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = BT_VND_OP_RESULT_FAIL; 658d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 659d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist else if (vsc_opcode == HCI_VSC_UIPC_OVER_HCI) { 660d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist STREAM_TO_UINT16(uipc_event,p); 661d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist uipc_opcode = *p; 662d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BTA2DPDBG("%s UIPC Event %04x UIPC Op %02x", __FUNCTION__, uipc_event, uipc_opcode); 663d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 664d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch (uipc_event) { 665d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BT_EVT_BTU_IPC_MGMT_EVT : 666d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch (uipc_opcode) { 667d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case UIPC_OPEN_RSP : ssm_event = BRCM_VND_UIPC_OPEN_RSP; break; 668d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case UIPC_CLOSE_RSP : ssm_event = BRCM_VND_UIPC_CLOSE_RSP; break; 669d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist default: status = BT_VND_OP_RESULT_FAIL; 670d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 671d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 672d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 673d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BT_EVT_BTU_IPC_BTM_EVT : 674d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch (uipc_opcode) { 675d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2DP_START_RESP: ssm_event = BRCM_VND_A2DP_START_RSP; break; 676d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2DP_SUSPEND_RESP: ssm_event = BRCM_VND_A2DP_SUSPEND_RSP; break; 677d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case A2DP_CLEANUP_RESP: ssm_event = BRCM_VND_A2DP_CLEANUP_RSP; break; 678d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case AUDIO_CODEC_CONFIG_RESP: ssm_event = BRCM_VND_AUDIO_CODEC_CONFIG_RSP; break; 679d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case AUDIO_ROUTE_CONFIG_RESP: ssm_event = BRCM_VND_AUDIO_ROUTE_CONFIG_RSP; break; 680d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist default: status = BT_VND_OP_RESULT_FAIL; 681d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 682d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 683d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 684d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BT_EVT_BTU_IPC_L2C_EVT : 685d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist switch (uipc_opcode) { 686d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case L2C_REMOVE_TO_LITE_RESP: ssm_event = BRCM_VND_L2C_REMOVE_TO_LITE_RSP; break; 687d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case L2C_SYNC_TO_LITE_RESP: ssm_event = BRCM_VND_L2C_SYNC_TO_LITE_RSP; break; 688d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist default: status = BT_VND_OP_RESULT_FAIL; 689d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 690d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 691d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 692d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist case BT_EVT_BTU_IPC_AVDT_EVT : 693d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (uipc_opcode == AVDT_SYNC_TO_BTC_LITE_RESP) { 694d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ssm_event = BRCM_VND_SYNC_TO_BTC_LITE_RSP; 695d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 696d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 697d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 698d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist default: 699d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist status = BT_VND_OP_RESULT_FAIL; 700d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist break; 701d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 702d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (status == BT_VND_OP_RESULT_SUCCESS) 703d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_ssm_execute(ssm_event, p); 704d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 705d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist else if (vsc_opcode == HCI_VSC_READ_PCM_PINS) { 706d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist STREAM_TO_UINT8(brcm_vnd_a2dp_pdata.pcmi2s_pinmux.fcn, p); 707d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist STREAM_TO_UINT32(brcm_vnd_a2dp_pdata.pcmi2s_pinmux.pad_conf, p); 708d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BTA2DPDBG("%s HCI_VSC_READ_PCM_PINS %02x %08x", __FUNCTION__, 709d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_pdata.pcmi2s_pinmux.fcn, brcm_vnd_a2dp_pdata.pcmi2s_pinmux.pad_conf); 710d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist } 711d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 712d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (status != BT_VND_OP_RESULT_SUCCESS) 713d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_ssm_execute(BRCM_VND_A2DP_OFFLOAD_FAILED_ABORT, NULL); 714d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 715d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist /* Free the RX event buffer */ 716d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist bt_vendor_cbacks->dealloc(p_evt_buf); 717d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 718d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 719d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashistvoid brcm_vnd_a2dp_init() 720d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 721d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist if (!bt_vendor_cbacks) 722d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return; 723d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 724d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist ALOGD("%s ", __FUNCTION__); 725d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist brcm_vnd_a2dp_ssm_execute(BRCM_VND_A2DP_OFFLOAD_INIT_REQ, NULL); 726d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 727d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 728d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashistint brcm_vnd_a2dp_execute(bt_vendor_opcode_t opcode, void *ev_data) 729d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist{ 730d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist tBRCM_VND_A2DP_EVENT ssm_event = (opcode == BT_VND_OP_A2DP_OFFLOAD_START)? 731d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist BRCM_VND_A2DP_OFFLOAD_START_REQ:BRCM_VND_A2DP_OFFLOAD_STOP_REQ; 732d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 7336708688fef36253ffe63bbca37db40d96a9748fdSridhar Vashist ALOGD("%s opcode %d , state %d", __FUNCTION__, opcode, brcm_vnd_a2dp_pdata.state); 734d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 735d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist return brcm_vnd_a2dp_ssm_execute(ssm_event, ev_data); 736d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist} 737d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 738d51ab12cc1e7b02279b45f91c2f2f9a9b4a1404eSridhar Vashist 739