1982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*
2982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Copyright (c) 2013, The Linux Foundation. All rights reserved.
3982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Not a Contribution.
4982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Copyright 2012 The Android Open Source Project
5982edd19a092114c479134cb16e0af54730edf1fPrashant Malani *
6982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Licensed under the Apache License, Version 2.0 (the "License");
7982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * you may not use this file except in compliance with the License.
8982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * You may obtain a copy of the License at
9982edd19a092114c479134cb16e0af54730edf1fPrashant Malani *
10982edd19a092114c479134cb16e0af54730edf1fPrashant Malani *      http://www.apache.org/licenses/LICENSE-2.0
11982edd19a092114c479134cb16e0af54730edf1fPrashant Malani *
12982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Unless required by applicable law or agreed to in writing, software
13982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * distributed under the License is distributed on an "AS IS" BASIS,
14982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * See the License for the specific language governing permissions and
16982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * limitations under the License.
17982edd19a092114c479134cb16e0af54730edf1fPrashant Malani */
18982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
19982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/******************************************************************************
20982edd19a092114c479134cb16e0af54730edf1fPrashant Malani *
21982edd19a092114c479134cb16e0af54730edf1fPrashant Malani *  Filename:      userial_vendor.c
22982edd19a092114c479134cb16e0af54730edf1fPrashant Malani *
23982edd19a092114c479134cb16e0af54730edf1fPrashant Malani *  Description:   Contains vendor-specific userial functions
24982edd19a092114c479134cb16e0af54730edf1fPrashant Malani *
25982edd19a092114c479134cb16e0af54730edf1fPrashant Malani ******************************************************************************/
26982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
27982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define LOG_TAG "bt_vendor"
28982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
29982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <utils/Log.h>
30982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <termios.h>
31982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <fcntl.h>
32982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <errno.h>
33982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <stdio.h>
34982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include "bt_vendor_qcom.h"
35982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include "hci_uart.h"
36982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#include <string.h>
37982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
38982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/******************************************************************************
39982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**  Constants & Macros
40982edd19a092114c479134cb16e0af54730edf1fPrashant Malani******************************************************************************/
41982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
42982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#ifndef VNDUSERIAL_DBG
43982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define VNDUSERIAL_DBG TRUE
44982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#endif
45982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
46982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#if (VNDUSERIAL_DBG == TRUE)
47982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define VNDUSERIALDBG(param, ...) {ALOGI(param, ## __VA_ARGS__);}
48982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#else
49982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define VNDUSERIALDBG(param, ...) {}
50982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#endif
51982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
52982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/******************************************************************************
53982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**  Global variables
54982edd19a092114c479134cb16e0af54730edf1fPrashant Malani******************************************************************************/
55982edd19a092114c479134cb16e0af54730edf1fPrashant Malanivnd_userial_cb_t vnd_userial;
56982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
57982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*****************************************************************************
58982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**   Functions
59982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*****************************************************************************/
60982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
61982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
62982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
63982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        userial_to_tcio_baud
64982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
65982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     helper function converts USERIAL baud rates into TCIO
66982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**                  conforming baud rates
67982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
68982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         TRUE/FALSE
69982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
70982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
71982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniuint8_t userial_to_tcio_baud(uint8_t cfg_baud, uint32_t *baud)
72982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
73982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if (cfg_baud == USERIAL_BAUD_115200)
74982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B115200;
75982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_4M)
76982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B4000000;
77982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_3M)
78982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B3000000;
79982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_2M)
80982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B2000000;
81982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_1M)
82982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B1000000;
83982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_921600)
84982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B921600;
85982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_460800)
86982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B460800;
87982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_230400)
88982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B230400;
89982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_57600)
90982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B57600;
91982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_19200)
92982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B19200;
93982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_9600)
94982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B9600;
95982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_1200)
96982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B1200;
97982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if (cfg_baud == USERIAL_BAUD_600)
98982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B600;
99982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else
100982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {
101982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        ALOGE( "userial vendor open: unsupported baud idx %i", cfg_baud);
102982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        *baud = B115200;
103982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        return FALSE;
104982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
105982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
106982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    return TRUE;
107982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
108982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
109982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
110982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
111982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        userial_to_baud_tcio
112982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
113982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     helper function converts TCIO baud rate into integer
114982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
115982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         uint32_t
116982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
117982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
118982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniint userial_tcio_baud_to_int(uint32_t baud)
119982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
120982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int baud_rate =0;
121982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
122982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    switch (baud)
123982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {
124982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B600:
125982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 600;
126982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
127982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B1200:
128982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 1200;
129982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
130982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B9600:
131982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 9600;
132982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
133982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B19200:
134982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 19200;
135982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
136982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B57600:
137982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 57600;
138982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
139982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B115200:
140982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 115200;
141982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
142982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B230400:
143982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 230400;
144982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
145982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B460800:
146982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 460800;
147982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
148982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B921600:
149982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 921600;
150982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
151982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B1000000:
152982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 1000000;
153982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
154982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B2000000:
155982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 2000000;
156982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
157982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B3000000:
158982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 3000000;
159982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
160982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case B4000000:
161982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            baud_rate = 4000000;
162982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
163982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        default:
164982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            ALOGE( "%s: unsupported baud %d", __FUNCTION__, baud);
165982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
166982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
167982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
168982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    ALOGI( "%s: Current Baudrate = %d bps", __FUNCTION__, baud_rate);
169982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    return baud_rate;
170982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
171982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
172982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
173982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
174982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
175982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
176982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        userial_ioctl_init_bt_wake
177982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
178982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     helper function to set the open state of the bt_wake if ioctl
179982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**                  is used. it should not hurt in the rfkill case but it might
180982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**                  be better to compile it out.
181982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
182982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         none
183982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
184982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
185982edd19a092114c479134cb16e0af54730edf1fPrashant Malanivoid userial_ioctl_init_bt_wake(int fd)
186982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
187982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint32_t bt_wake_state;
188982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
189982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    /* assert BT_WAKE through ioctl */
190982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    ioctl(fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL);
191982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    ioctl(fd, USERIAL_IOCTL_BT_WAKE_GET_ST, &bt_wake_state);
192982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    VNDUSERIALDBG("userial_ioctl_init_bt_wake read back BT_WAKE state=%i", \
193982edd19a092114c479134cb16e0af54730edf1fPrashant Malani               bt_wake_state);
194982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
195982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
196982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
197982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
198982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*****************************************************************************
199982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**   Userial Vendor API Functions
200982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*****************************************************************************/
201982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
202982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
203982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
204982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        userial_vendor_init
205982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
206982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     Initialize userial vendor-specific control block
207982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
208982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         None
209982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
210982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
211982edd19a092114c479134cb16e0af54730edf1fPrashant Malanivoid userial_vendor_init(void)
212982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
213982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    vnd_userial.fd = -1;
214982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    snprintf(vnd_userial.port_name, VND_PORT_NAME_MAXLEN, "%s", BT_HS_UART_DEVICE);
215982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
216982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
217982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
218982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
219982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        userial_vendor_open
220982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
221982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     Open the serial port with the given configuration
222982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
223982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         device fd
224982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
225982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
226982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniint userial_vendor_open(tUSERIAL_CFG *p_cfg)
227982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
228982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint32_t baud;
229982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint8_t data_bits;
230982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint16_t parity;
231982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint8_t stop_bits;
232982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
233982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    vnd_userial.fd = -1;
234982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
235982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if (!userial_to_tcio_baud(p_cfg->baud, &baud))
236982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {
237982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        return -1;
238982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
239982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
240982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if(p_cfg->fmt & USERIAL_DATABITS_8)
241982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        data_bits = CS8;
242982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if(p_cfg->fmt & USERIAL_DATABITS_7)
243982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        data_bits = CS7;
244982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if(p_cfg->fmt & USERIAL_DATABITS_6)
245982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        data_bits = CS6;
246982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if(p_cfg->fmt & USERIAL_DATABITS_5)
247982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        data_bits = CS5;
248982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else
249982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {
250982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        ALOGE("userial vendor open: unsupported data bits");
251982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        return -1;
252982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
253982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
254982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if(p_cfg->fmt & USERIAL_PARITY_NONE)
255982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        parity = 0;
256982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if(p_cfg->fmt & USERIAL_PARITY_EVEN)
257982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        parity = PARENB;
258982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if(p_cfg->fmt & USERIAL_PARITY_ODD)
259982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        parity = (PARENB | PARODD);
260982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else
261982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {
262982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        ALOGE("userial vendor open: unsupported parity bit mode");
263982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        return -1;
264982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
265982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
266982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if(p_cfg->fmt & USERIAL_STOPBITS_1)
267982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        stop_bits = 0;
268982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else if(p_cfg->fmt & USERIAL_STOPBITS_2)
269982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        stop_bits = CSTOPB;
270982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else
271982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {
272982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        ALOGE("userial vendor open: unsupported stop bits");
273982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        return -1;
274982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
275982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
276982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    ALOGI("userial vendor open: opening %s", vnd_userial.port_name);
277982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
278982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR|O_NOCTTY)) == -1)
279982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {
280982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        ALOGE("userial vendor open: unable to open %s", vnd_userial.port_name);
281982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        return -1;
282982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
283982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
284982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    tcflush(vnd_userial.fd, TCIOFLUSH);
285982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
286982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    tcgetattr(vnd_userial.fd, &vnd_userial.termios);
287982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    cfmakeraw(&vnd_userial.termios);
288982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
289982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    /* Set UART Control Modes */
290982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    vnd_userial.termios.c_cflag |= CLOCAL;
291982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    vnd_userial.termios.c_cflag |= (CRTSCTS | stop_bits);
292982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
293982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
294982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
295982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    /* set input/output baudrate */
296982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    cfsetospeed(&vnd_userial.termios, baud);
297982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    cfsetispeed(&vnd_userial.termios, baud);
298982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
299982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
300982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    tcflush(vnd_userial.fd, TCIOFLUSH);
301982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
302982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
303982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    userial_ioctl_init_bt_wake(vnd_userial.fd);
304982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#endif
305982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
306982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    ALOGI("device fd = %d open", vnd_userial.fd);
307982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
308982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    return vnd_userial.fd;
309982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
310982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
311982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
312982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
313982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        userial_vendor_close
314982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
315982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     Conduct vendor-specific close work
316982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
317982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         None
318982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
319982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
320982edd19a092114c479134cb16e0af54730edf1fPrashant Malanivoid userial_vendor_close(void)
321982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
322982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int result;
323982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
324982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if (vnd_userial.fd == -1)
325982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        return;
326982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
327982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
328982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    /* de-assert bt_wake BEFORE closing port */
329982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL);
330982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#endif
331982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
332982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    ALOGI("device fd = %d close", vnd_userial.fd);
333982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
334982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if ((result = close(vnd_userial.fd)) < 0)
335982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        ALOGE( "close(fd:%d) FAILED result:%d", vnd_userial.fd, result);
336982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
337982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    vnd_userial.fd = -1;
338982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
339982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
340982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
341982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
342982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        userial_vendor_set_baud
343982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
344982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     Set new baud rate
345982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
346982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         None
347982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
348982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
349982edd19a092114c479134cb16e0af54730edf1fPrashant Malanivoid userial_vendor_set_baud(uint8_t userial_baud)
350982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
351982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint32_t tcio_baud;
352982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
353982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    VNDUSERIALDBG("## userial_vendor_set_baud: %d", userial_baud);
354982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
355982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    userial_to_tcio_baud(userial_baud, &tcio_baud);
356982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
357982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    cfsetospeed(&vnd_userial.termios, tcio_baud);
358982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    cfsetispeed(&vnd_userial.termios, tcio_baud);
359982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    tcsetattr(vnd_userial.fd, TCSADRAIN, &vnd_userial.termios); /* don't change speed until last write done */
360982edd19a092114c479134cb16e0af54730edf1fPrashant Malani//    tcflush(vnd_userial.fd, TCIOFLUSH);
361982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
362982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
363982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
364982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
365982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        userial_vendor_get_baud
366982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
367982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     Get current baud rate
368982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
369982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         int
370982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
371982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
372982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniint userial_vendor_get_baud(void)
373982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
374982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if (vnd_userial.fd == -1)
375982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {
376982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        ALOGE( "%s: uart port(%s) has not been opened", __FUNCTION__, BT_HS_UART_DEVICE );
377982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        return -1;
378982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
379982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
380982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    return userial_tcio_baud_to_int(cfgetispeed(&vnd_userial.termios));
381982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
382982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
383982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
384982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
385982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        userial_vendor_ioctl
386982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
387982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     ioctl inteface
388982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
389982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         None
390982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
391982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
392982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniint userial_vendor_ioctl(userial_vendor_ioctl_op_t op, int *p_data)
393982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
394982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int err;
395982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
396982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    switch(op)
397982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {
398982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
399982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case USERIAL_OP_ASSERT_BT_WAKE:
400982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            VNDUSERIALDBG("## userial_vendor_ioctl: Asserting BT_Wake ##");
401982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            err = ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL);
402982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
403982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
404982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case USERIAL_OP_DEASSERT_BT_WAKE:
405982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            VNDUSERIALDBG("## userial_vendor_ioctl: De-asserting BT_Wake ##");
406982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            err = ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL);
407982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
408982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
409982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case USERIAL_OP_GET_BT_WAKE_STATE:
410982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            err = ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_GET_ST, p_data);
411982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
412982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#endif  //  (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
413982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case USERIAL_OP_FLOW_ON:
414982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            ALOGI("## userial_vendor_ioctl: UART Flow On ");
415982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            *p_data |=TIOCM_RTS;
416982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            err = ioctl(vnd_userial.fd, TIOCMSET, p_data);
417982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
418982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
419982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case USERIAL_OP_FLOW_OFF:
420982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            ALOGI("## userial_vendor_ioctl: UART Flow Off ");
421982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            ioctl(vnd_userial.fd, TIOCMGET, p_data);
422982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            *p_data &= ~TIOCM_RTS;
423982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            err = ioctl(vnd_userial.fd, TIOCMSET, p_data);
424982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
425982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
426982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        default:
427982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            break;
428982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
429982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
430982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    return err;
431982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
432982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
433982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
434982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
435982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        userial_set_port
436982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
437982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     Configure UART port name
438982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
439982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         0 : Success
440982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**                 Otherwise : Fail
441982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
442982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
443982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniint userial_set_port(char *p_conf_name, char *p_conf_value, int param)
444982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
445982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    strlcpy(vnd_userial.port_name, p_conf_value, VND_PORT_NAME_MAXLEN);
446982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
447982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    return 0;
448982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
449982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
450982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*******************************************************************************
451982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
452982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Function        read_hci_event
453982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
454982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Description     Read HCI event during vendor initialization
455982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
456982edd19a092114c479134cb16e0af54730edf1fPrashant Malani** Returns         int: size to read
457982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**
458982edd19a092114c479134cb16e0af54730edf1fPrashant Malani*******************************************************************************/
459982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniint read_hci_event(int fd, unsigned char* buf, int size)
460982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
461982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int remain, r;
462982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int count = 0;
463982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
464982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if (size <= 0) {
465982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        ALOGE("Invalid size arguement!");
466982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        return -1;
467982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
468982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
469982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    ALOGI("%s: Wait for Command Compete Event from SOC", __FUNCTION__);
470982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
471982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    /* The first byte identifies the packet type. For HCI event packets, it
472982edd19a092114c479134cb16e0af54730edf1fPrashant Malani     * should be 0x04, so we read until we get to the 0x04. */
473982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    while (1) {
474982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            r = read(fd, buf, 1);
475982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            if (r <= 0)
476982edd19a092114c479134cb16e0af54730edf1fPrashant Malani                    return -1;
477982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            if (buf[0] == 0x04)
478982edd19a092114c479134cb16e0af54730edf1fPrashant Malani                    break;
479982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
480982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    count++;
481982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
482982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    /* The next two bytes are the event code and parameter total length. */
483982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    while (count < 3) {
484982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            r = read(fd, buf + count, 3 - count);
485982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            if (r <= 0)
486982edd19a092114c479134cb16e0af54730edf1fPrashant Malani                    return -1;
487982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            count += r;
488982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
489982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
490982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    /* Now we read the parameters. */
491982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    if (buf[2] < (size - 3))
492982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            remain = buf[2];
493982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    else
494982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            remain = size - 3;
495982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
496982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    while ((count - 3) < remain) {
497982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            r = read(fd, buf + count, remain - (count - 3));
498982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            if (r <= 0)
499982edd19a092114c479134cb16e0af54730edf1fPrashant Malani                    return -1;
500982edd19a092114c479134cb16e0af54730edf1fPrashant Malani            count += r;
501982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
502982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    return count;
503982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
504982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
505982edd19a092114c479134cb16e0af54730edf1fPrashant Malaniint userial_clock_operation(int fd, int cmd)
506982edd19a092114c479134cb16e0af54730edf1fPrashant Malani{
507982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int ret = 0;
508982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
509982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    switch (cmd)
510982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {
511982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case USERIAL_OP_CLK_ON:
512982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case USERIAL_OP_CLK_OFF:
513982edd19a092114c479134cb16e0af54730edf1fPrashant Malani             ioctl(fd, cmd);
514982edd19a092114c479134cb16e0af54730edf1fPrashant Malani             break;
515982edd19a092114c479134cb16e0af54730edf1fPrashant Malani        case USERIAL_OP_CLK_STATE:
516982edd19a092114c479134cb16e0af54730edf1fPrashant Malani             ret = ioctl(fd, cmd);
517982edd19a092114c479134cb16e0af54730edf1fPrashant Malani             break;
518982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    }
519982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
520982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    return ret;
521982edd19a092114c479134cb16e0af54730edf1fPrashant Malani}
522