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