1982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/*
2982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Copyright 2012 The Android Open Source Project
3982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Copyright (c) 2013, The Linux Foundation. All rights reserved.
4982edd19a092114c479134cb16e0af54730edf1fPrashant Malani * Not a Contribution.
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#ifndef HW_AR3K_H
19982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HW_AR3K_H
20982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
21982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/******************************************************************************
22982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**  Constants & Macros
23982edd19a092114c479134cb16e0af54730edf1fPrashant Malani******************************************************************************/
24982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define MAX_CNT_RETRY 100
25982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
26982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_MAX_CMD_SIZE   260
27982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_MAX_EVENT_SIZE  260
28982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_CHG_BAUD_CMD_OCF 0x0C
29982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_VENDOR_CMD_OGF 0x3F
30982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define WRITE_BDADDR_CMD_LEN 14
31982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define WRITE_BAUD_CMD_LEN   6
32982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN
33982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define GET_VERSION_OCF 0x1E
34982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/* Byte order conversions */
35982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#if __BYTE_ORDER == __LITTLE_ENDIAN
36982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define htobs(d)  (d)
37982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define htobl(d)  (d)
38982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define btohs(d)  (d)
39982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define btohl(d)  (d)
40982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#elif __BYTE_ORDER == __BIG_ENDIAN
41982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define htobs(d)  bswap_16(d)
42982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define htobl(d)  bswap_32(d)
43982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define btohs(d)  bswap_16(d)
44982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define btohl(d)  bswap_32(d)
45982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#else
46982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#error "Unknown byte order"
47982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#endif
48982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
49982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define FW_PATH "/system/etc/firmware/ar3k/"
50982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
51982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define STREAM_TO_UINT16(u16, p) \
52982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2;}
53982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define UINT16_TO_STREAM(p, u16) \
54982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8);}
55982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define UINT32_TO_STREAM(p, u32) \
56982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    {*(p)++ = (uint8_t)(u32); *(p)++ = (uint8_t)((u32) >> 8);\
57982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    *(p)++ = (uint8_t)((u32) >> 16); *(p)++ = (uint8_t)((u32) >> 24);}
58982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
59982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define MAX_TAGS              50
60982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define PS_HDR_LEN            4
61982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_VENDOR_CMD_OGF    0x3F
62982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_PS_CMD_OCF        0x0B
63982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
64982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define VERIFY_CRC   9
65982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define PS_REGION    1
66982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define PATCH_REGION 2
67982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define BDADDR_FILE "ar3kbdaddr.pst"
68982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
69982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
70982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define MAX_PATCH_CMD 244
71982edd19a092114c479134cb16e0af54730edf1fPrashant Malanistruct patch_entry {
72982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int16_t len;
73982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint8_t data[MAX_PATCH_CMD];
74982edd19a092114c479134cb16e0af54730edf1fPrashant Malani};
75982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_UART_RAW_DEVICE    0
76982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_COMMAND_HDR_SIZE 3
77982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define PS_WRITE           1
78982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define PS_RESET           2
79982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define WRITE_PATCH        8
80982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define ENABLE_PATCH       11
81982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
82982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_PS_CMD_HDR_LEN 7
83982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_CMD_MAX_LEN             258
84982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define PS_RESET_PARAM_LEN 6
85982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define PS_RESET_CMD_LEN   (HCI_PS_CMD_HDR_LEN + PS_RESET_PARAM_LEN)
86982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
87982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define PS_ID_MASK         0xFF
88982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
89982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
90982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define LOCAL_NAME_BUFFER_LEN                   32
91982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define DEV_REGISTER      0x4FFC
92982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define GET_DEV_TYPE_OCF  0x05
93982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
94982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCIDEVUP            _IOW('H', 201, int)
95982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define OGF_VENDOR_CMD                  0x3f
96982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define EVT_CMD_COMPLETE_SIZE     3
97982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define EVT_CMD_STATUS                   0x0F
98982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define EVT_CMD_STATUS_SIZE         4
99982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_COMMAND_HDR_SIZE      3
100982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_EVENT_HDR_SIZE            2
101982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_EV_SUCCESS                    0x00
102982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/* HCI Socket options */
103982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_DATA_DIR        1
104982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_FILTER              2
105982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_TIME_STAMP    3
106982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
107982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/* HCI CMSG flags */
108982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_CMSG_DIR            0x0001
109982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define HCI_CMSG_TSTAMP     0x0002
110982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
111982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#ifndef VENDOR_LPM_PROC_NODE
112982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define VENDOR_LPM_PROC_NODE "/sys/module/hci_uart/parameters/ath_lpm"
113982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#endif
114982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
115982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/* proc fs node for notifying write request */
116982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#ifndef VENDOR_BTWRITE_PROC_NODE
117982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#define VENDOR_BTWRITE_PROC_NODE "/sys/module/hci_uart/parameters/ath_btwrite"
118982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#endif
119982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
120982edd19a092114c479134cb16e0af54730edf1fPrashant Malani/******************************************************************************
121982edd19a092114c479134cb16e0af54730edf1fPrashant Malani**  Local type definitions
122982edd19a092114c479134cb16e0af54730edf1fPrashant Malani******************************************************************************/
123982edd19a092114c479134cb16e0af54730edf1fPrashant Malanitypedef struct {
124982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint8_t b[6];
125982edd19a092114c479134cb16e0af54730edf1fPrashant Malani} __attribute__((packed)) bdaddr_t;
126982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
127982edd19a092114c479134cb16e0af54730edf1fPrashant Malanistruct sockaddr_hci {
128982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    sa_family_t hci_family;
129982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    unsigned short  hci_dev;
130982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    unsigned short  hci_channel;
131982edd19a092114c479134cb16e0af54730edf1fPrashant Malani};
132982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
133982edd19a092114c479134cb16e0af54730edf1fPrashant Malanistruct tag_info {
134982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    unsigned section;
135982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    unsigned line_count;
136982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    unsigned char_cnt;
137982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    unsigned byte_count;
138982edd19a092114c479134cb16e0af54730edf1fPrashant Malani};
139982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
140982edd19a092114c479134cb16e0af54730edf1fPrashant Malanistruct ps_cfg_entry {
141982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint32_t id;
142982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint32_t len;
143982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    uint8_t *data;
144982edd19a092114c479134cb16e0af54730edf1fPrashant Malani};
145982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
146982edd19a092114c479134cb16e0af54730edf1fPrashant Malanistruct ps_entry_type {
147982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    unsigned char type;
148982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    unsigned char array;
149982edd19a092114c479134cb16e0af54730edf1fPrashant Malani};
150982edd19a092114c479134cb16e0af54730edf1fPrashant Malani
151982edd19a092114c479134cb16e0af54730edf1fPrashant Malanistruct uart_t {
152982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    char *type;
153982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int  m_id;
154982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int  p_id;
155982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int  proto;
156982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int  init_speed;
157982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int  speed;
158982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int  flags;
159982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int  pm;
160982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    char *bdaddr;
161982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int  (*init) (int fd, struct uart_t *u, struct termios *ti);
162982edd19a092114c479134cb16e0af54730edf1fPrashant Malani    int  (*post) (int fd, struct uart_t *u, struct termios *ti);
163982edd19a092114c479134cb16e0af54730edf1fPrashant Malani};
164982edd19a092114c479134cb16e0af54730edf1fPrashant Malani#endif /* HW_AR3K_H */
165