1 /*
2  * Copyright 2012 The Android Open Source Project
3  * Copyright (c) 2013, The Linux Foundation. All rights reserved.
4  * Not a Contribution.
5  *
6  *  Licensed under the Apache License, Version 2.0 (the "License");
7  *  you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *  http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  */
18 #ifndef HW_AR3K_H
19 #define HW_AR3K_H
20 
21 /******************************************************************************
22 **  Constants & Macros
23 ******************************************************************************/
24 #define MAX_CNT_RETRY 100
25 
26 #define HCI_MAX_CMD_SIZE   260
27 #define HCI_MAX_EVENT_SIZE  260
28 #define HCI_CHG_BAUD_CMD_OCF 0x0C
29 #define HCI_VENDOR_CMD_OGF 0x3F
30 #define WRITE_BDADDR_CMD_LEN 14
31 #define WRITE_BAUD_CMD_LEN   6
32 #define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN
33 #define GET_VERSION_OCF 0x1E
34 /* Byte order conversions */
35 #if __BYTE_ORDER == __LITTLE_ENDIAN
36 #define htobs(d)  (d)
37 #define htobl(d)  (d)
38 #define btohs(d)  (d)
39 #define btohl(d)  (d)
40 #elif __BYTE_ORDER == __BIG_ENDIAN
41 #define htobs(d)  bswap_16(d)
42 #define htobl(d)  bswap_32(d)
43 #define btohs(d)  bswap_16(d)
44 #define btohl(d)  bswap_32(d)
45 #else
46 #error "Unknown byte order"
47 #endif
48 
49 #define FW_PATH "/system/etc/firmware/ar3k/"
50 
51 #define STREAM_TO_UINT16(u16, p) \
52     {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2;}
53 #define UINT16_TO_STREAM(p, u16) \
54     {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8);}
55 #define UINT32_TO_STREAM(p, u32) \
56     {*(p)++ = (uint8_t)(u32); *(p)++ = (uint8_t)((u32) >> 8);\
57     *(p)++ = (uint8_t)((u32) >> 16); *(p)++ = (uint8_t)((u32) >> 24);}
58 
59 #define MAX_TAGS              50
60 #define PS_HDR_LEN            4
61 #define HCI_VENDOR_CMD_OGF    0x3F
62 #define HCI_PS_CMD_OCF        0x0B
63 
64 #define VERIFY_CRC   9
65 #define PS_REGION    1
66 #define PATCH_REGION 2
67 #define BDADDR_FILE "ar3kbdaddr.pst"
68 
69 
70 #define MAX_PATCH_CMD 244
71 struct patch_entry {
72     int16_t len;
73     uint8_t data[MAX_PATCH_CMD];
74 };
75 #define HCI_UART_RAW_DEVICE    0
76 #define HCI_COMMAND_HDR_SIZE 3
77 #define PS_WRITE           1
78 #define PS_RESET           2
79 #define WRITE_PATCH        8
80 #define ENABLE_PATCH       11
81 
82 #define HCI_PS_CMD_HDR_LEN 7
83 #define HCI_CMD_MAX_LEN             258
84 #define PS_RESET_PARAM_LEN 6
85 #define PS_RESET_CMD_LEN   (HCI_PS_CMD_HDR_LEN + PS_RESET_PARAM_LEN)
86 
87 #define PS_ID_MASK         0xFF
88 
89 
90 #define LOCAL_NAME_BUFFER_LEN                   32
91 #define DEV_REGISTER      0x4FFC
92 #define GET_DEV_TYPE_OCF  0x05
93 
94 #define HCIDEVUP            _IOW('H', 201, int)
95 #define OGF_VENDOR_CMD                  0x3f
96 #define EVT_CMD_COMPLETE_SIZE     3
97 #define EVT_CMD_STATUS                   0x0F
98 #define EVT_CMD_STATUS_SIZE         4
99 #define HCI_COMMAND_HDR_SIZE      3
100 #define HCI_EVENT_HDR_SIZE            2
101 #define HCI_EV_SUCCESS                    0x00
102 /* HCI Socket options */
103 #define HCI_DATA_DIR        1
104 #define HCI_FILTER              2
105 #define HCI_TIME_STAMP    3
106 
107 /* HCI CMSG flags */
108 #define HCI_CMSG_DIR            0x0001
109 #define HCI_CMSG_TSTAMP     0x0002
110 
111 #ifndef VENDOR_LPM_PROC_NODE
112 #define VENDOR_LPM_PROC_NODE "/sys/module/hci_uart/parameters/ath_lpm"
113 #endif
114 
115 /* proc fs node for notifying write request */
116 #ifndef VENDOR_BTWRITE_PROC_NODE
117 #define VENDOR_BTWRITE_PROC_NODE "/sys/module/hci_uart/parameters/ath_btwrite"
118 #endif
119 
120 /******************************************************************************
121 **  Local type definitions
122 ******************************************************************************/
123 typedef struct {
124     uint8_t b[6];
125 } __attribute__((packed)) bdaddr_t;
126 
127 struct sockaddr_hci {
128     sa_family_t hci_family;
129     unsigned short  hci_dev;
130     unsigned short  hci_channel;
131 };
132 
133 struct tag_info {
134     unsigned section;
135     unsigned line_count;
136     unsigned char_cnt;
137     unsigned byte_count;
138 };
139 
140 struct ps_cfg_entry {
141     uint32_t id;
142     uint32_t len;
143     uint8_t *data;
144 };
145 
146 struct ps_entry_type {
147     unsigned char type;
148     unsigned char array;
149 };
150 
151 struct uart_t {
152     char *type;
153     int  m_id;
154     int  p_id;
155     int  proto;
156     int  init_speed;
157     int  speed;
158     int  flags;
159     int  pm;
160     char *bdaddr;
161     int  (*init) (int fd, struct uart_t *u, struct termios *ti);
162     int  (*post) (int fd, struct uart_t *u, struct termios *ti);
163 };
164 #endif /* HW_AR3K_H */
165