Remove the code which disables port status change interrupts for 1 second
[dragonfly.git] / sys / netbt / hci.h
1 /* $DragonFly: src/sys/netbt/hci.h,v 1.2 2008/03/18 13:41:42 hasso Exp $ */
2 /* $OpenBSD: src/sys/netbt/hci.h,v 1.10 2008/02/24 21:34:48 uwe Exp $ */
3 /* $NetBSD: hci.h,v 1.22 2008/02/10 17:40:54 plunky Exp $ */
4
5 /*-
6  * Copyright (c) 2005 Iain Hibbert.
7  * Copyright (c) 2006 Itronix Inc.
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. The name of Itronix Inc. may not be used to endorse
19  *    or promote products derived from this software without specific
20  *    prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
26  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29  * ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  */
34 /*-
35  * Copyright (c) 2001 Maksim Yevmenkin <m_evmenkin@yahoo.com>
36  * All rights reserved.
37  *
38  * Redistribution and use in source and binary forms, with or without
39  * modification, are permitted provided that the following conditions
40  * are met:
41  * 1. Redistributions of source code must retain the above copyright
42  *    notice, this list of conditions and the following disclaimer.
43  * 2. Redistributions in binary form must reproduce the above copyright
44  *    notice, this list of conditions and the following disclaimer in the
45  *    documentation and/or other materials provided with the distribution.
46  *
47  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
48  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
51  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57  * SUCH DAMAGE.
58  *
59  * $Id: hci.h,v 1.22 2008/02/10 17:40:54 plunky Exp $
60  * $FreeBSD: src/sys/netgraph/bluetooth/include/ng_hci.h,v 1.6 2005/01/07 01:45:43 imp Exp $
61  */
62
63 /*
64  * This file contains everything that applications need to know from
65  * Host Controller Interface (HCI). Information taken from Bluetooth
66  * Core Specifications (v1.1, v2.0 and v2.1)
67  *
68  * This file can be included by both kernel and userland applications.
69  *
70  * NOTE: Here and after Bluetooth device is called a "unit". Bluetooth
71  *       specification refers to both devices and units. They are the
72  *       same thing (I think), so to be consistent word "unit" will be
73  *       used.
74  */
75
76 #ifndef _NETBT_HCI_H_
77 #define _NETBT_HCI_H_
78
79 #include <netbt/bluetooth.h>
80
81 #include <sys/lock.h>
82
83 /**************************************************************************
84  **************************************************************************
85  **                   Common defines and types (HCI)
86  **************************************************************************
87  **************************************************************************/
88
89 #define HCI_LAP_SIZE                    3   /* unit LAP */
90 #define HCI_KEY_SIZE                    16  /* link key */
91 #define HCI_PIN_SIZE                    16  /* link PIN */
92 #define HCI_EVENT_MASK_SIZE             8   /* event mask */
93 #define HCI_CLASS_SIZE                  3   /* unit class */
94 #define HCI_FEATURES_SIZE               8   /* LMP features */
95 #define HCI_UNIT_NAME_SIZE              248 /* unit name size */
96 #define HCI_DEVNAME_SIZE                16  /* same as dv_xname */
97 #define HCI_COMMANDS_SIZE               64  /* supported commands mask */
98
99 /* HCI specification */
100 #define HCI_SPEC_V10                    0x00 /* v1.0 */
101 #define HCI_SPEC_V11                    0x01 /* v1.1 */
102 #define HCI_SPEC_V12                    0x02 /* v1.2 */
103 #define HCI_SPEC_V20                    0x03 /* v2.0 */
104 #define HCI_SPEC_V21                    0x04 /* v2.1 */
105 /* 0x05 - 0xFF - reserved for future use */
106
107 /* LMP features (and page 0 of extended features) */
108 /* ------------------- byte 0 --------------------*/
109 #define HCI_LMP_3SLOT                   0x01
110 #define HCI_LMP_5SLOT                   0x02
111 #define HCI_LMP_ENCRYPTION              0x04
112 #define HCI_LMP_SLOT_OFFSET             0x08
113 #define HCI_LMP_TIMIACCURACY            0x10
114 #define HCI_LMP_ROLE_SWITCH             0x20
115 #define HCI_LMP_HOLD_MODE               0x40
116 #define HCI_LMP_SNIFF_MODE              0x80
117 /* ------------------- byte 1 --------------------*/
118 #define HCI_LMP_PARK_MODE               0x01
119 #define HCI_LMP_RSSI                    0x02
120 #define HCI_LMP_CHANNEL_QUALITY         0x04
121 #define HCI_LMP_SCO_LINK                0x08
122 #define HCI_LMP_HV2_PKT                 0x10
123 #define HCI_LMP_HV3_PKT                 0x20
124 #define HCI_LMP_ULAW_LOG                0x40
125 #define HCI_LMP_ALAW_LOG                0x80
126 /* ------------------- byte 2 --------------------*/
127 #define HCI_LMP_CVSD                    0x01
128 #define HCI_LMP_PAGISCHEME              0x02
129 #define HCI_LMP_POWER_CONTROL           0x04
130 #define HCI_LMP_TRANSPARENT_SCO         0x08
131 #define HCI_LMP_FLOW_CONTROL_LAG0       0x10
132 #define HCI_LMP_FLOW_CONTROL_LAG1       0x20
133 #define HCI_LMP_FLOW_CONTROL_LAG2       0x40
134 #define HCI_LMP_BC_ENCRYPTION           0x80
135 /* ------------------- byte 3 --------------------*/
136 /* reserved                             0x01 */
137 #define HCI_LMP_EDR_ACL_2MBPS           0x02
138 #define HCI_LMP_EDR_ACL_3MBPS           0x04
139 #define HCI_LMP_ENHANCED_ISCAN          0x08
140 #define HCI_LMP_INTERLACED_ISCAN        0x10
141 #define HCI_LMP_INTERLACED_PSCAN        0x20
142 #define HCI_LMP_RSSI_INQUIRY            0x40
143 #define HCI_LMP_EV3_PKT                 0x80
144 /* ------------------- byte 4 --------------------*/
145 #define HCI_LMP_EV4_PKT                 0x01
146 #define HCI_LMP_EV5_PKT                 0x02
147 /* reserved                             0x04 */
148 #define HCI_LMP_AFH_CAPABLE_SLAVE       0x08
149 #define HCI_LMP_AFH_CLASS_SLAVE         0x10
150 /* reserved                             0x20 */
151 /* reserved                             0x40 */
152 #define HCI_LMP_3SLOT_EDR_ACL           0x80
153 /* ------------------- byte 5 --------------------*/
154 #define HCI_LMP_5SLOT_EDR_ACL           0x01
155 #define HCI_LMP_SNIFF_SUBRATING         0x02
156 #define HCI_LMP_PAUSE_ENCRYPTION        0x04
157 #define HCI_LMP_AFH_CAPABLE_MASTER      0x08
158 #define HCI_LMP_AFH_CLASS_MASTER        0x10
159 #define HCI_LMP_EDR_eSCO_2MBPS          0x20
160 #define HCI_LMP_EDR_eSCO_3MBPS          0x40
161 #define HCI_LMP_3SLOT_EDR_eSCO          0x80
162 /* ------------------- byte 6 --------------------*/
163 #define HCI_LMP_EXTENDED_INQUIRY        0x01
164 /* reserved                             0x02 */
165 /* reserved                             0x04 */
166 #define HCI_LMP_SIMPLE_PAIRING          0x08
167 #define HCI_LMP_ENCAPSULATED_PDU        0x10
168 #define HCI_LMP_ERRDATA_REPORTING       0x20
169 #define HCI_LMP_NOFLUSH_PB_FLAG         0x40
170 /* reserved                             0x80 */
171 /* ------------------- byte 7 --------------------*/
172 #define HCI_LMP_LINK_SUPERVISION_TO     0x01
173 #define HCI_LMP_INQ_RSP_TX_POWER        0x02
174 #define HCI_LMP_EXTENDED_FEATURES       0x80
175
176 /* Link types */
177 #define HCI_LINK_SCO                    0x00 /* Voice */
178 #define HCI_LINK_ACL                    0x01 /* Data */
179 #define HCI_LINK_eSCO                   0x02 /* eSCO */
180 /* 0x03 - 0xFF - reserved for future use */
181
182 /*
183  * ACL/SCO packet type bits are set to enable the
184  * packet type, except for 2MBPS and 3MBPS when they
185  * are unset to enable the packet type.
186  */
187 /* ACL Packet types for "Create Connection" */
188 #define HCI_PKT_2MBPS_DH1       0x0002
189 #define HCI_PKT_3MBPS_DH1       0x0004
190 #define HCI_PKT_DM1             0x0008
191 #define HCI_PKT_DH1             0x0010
192 #define HCI_PKT_2MBPS_DH3       0x0100
193 #define HCI_PKT_3MBPS_DH3       0x0200
194 #define HCI_PKT_DM3             0x0400
195 #define HCI_PKT_DH3             0x0800
196 #define HCI_PKT_2MBPS_DH5       0x1000
197 #define HCI_PKT_3MBPS_DH5       0x2000
198 #define HCI_PKT_DM5             0x4000
199 #define HCI_PKT_DH5             0x8000
200
201 /* SCO Packet types for "Setup Synchronous Connection" */
202 #define HCI_PKT_HV1             0x0001
203 #define HCI_PKT_HV2             0x0002
204 #define HCI_PKT_HV3             0x0004
205 #define HCI_PKT_EV3             0x0008
206 #define HCI_PKT_EV4             0x0010
207 #define HCI_PKT_EV5             0x0020
208 #define HCI_PKT_2MBPS_EV3       0x0040
209 #define HCI_PKT_3MBPS_EV3       0x0080
210 #define HCI_PKT_2MBPS_EV5       0x0100
211 #define HCI_PKT_3MBPS_EV5       0x0200
212
213 /*
214  * Connection modes/Unit modes
215  *
216  * This is confusing. It means that one of the units change its mode
217  * for the specific connection. For example one connection was put on
218  * hold (but i could be wrong :)
219  */
220
221 /* Page scan modes (are deprecated) */
222 #define HCI_MANDATORY_PAGE_SCAN_MODE            0x00
223 #define HCI_OPTIONAL_PAGE_SCAN_MODE1            0x01
224 #define HCI_OPTIONAL_PAGE_SCAN_MODE2            0x02
225 #define HCI_OPTIONAL_PAGE_SCAN_MODE3            0x03
226 /* 0x04 - 0xFF - reserved for future use */
227
228 /* Page scan repetition modes */
229 #define HCI_SCAN_REP_MODE0                      0x00
230 #define HCI_SCAN_REP_MODE1                      0x01
231 #define HCI_SCAN_REP_MODE2                      0x02
232 /* 0x03 - 0xFF - reserved for future use */
233
234 /* Page scan period modes */
235 #define HCI_PAGE_SCAN_PERIOD_MODE0              0x00
236 #define HCI_PAGE_SCAN_PERIOD_MODE1              0x01
237 #define HCI_PAGE_SCAN_PERIOD_MODE2              0x02
238 /* 0x03 - 0xFF - reserved for future use */
239
240 /* Scan enable */
241 #define HCI_NO_SCAN_ENABLE                      0x00
242 #define HCI_INQUIRY_SCAN_ENABLE                 0x01
243 #define HCI_PAGE_SCAN_ENABLE                    0x02
244 /* 0x04 - 0xFF - reserved for future use */
245
246 /* Hold mode activities */
247 #define HCI_HOLD_MODE_NO_CHANGE                 0x00
248 #define HCI_HOLD_MODE_SUSPEND_PAGE_SCAN         0x01
249 #define HCI_HOLD_MODE_SUSPEND_INQUIRY_SCAN      0x02
250 #define HCI_HOLD_MODE_SUSPEND_PERIOD_INQUIRY    0x04
251 /* 0x08 - 0x80 - reserved for future use */
252
253 /* Connection roles */
254 #define HCI_ROLE_MASTER                         0x00
255 #define HCI_ROLE_SLAVE                          0x01
256 /* 0x02 - 0xFF - reserved for future use */
257
258 /* Key flags */
259 #define HCI_USE_SEMI_PERMANENT_LINK_KEYS        0x00
260 #define HCI_USE_TEMPORARY_LINK_KEY              0x01
261 /* 0x02 - 0xFF - reserved for future use */
262
263 /* Pin types */
264 #define HCI_PIN_TYPE_VARIABLE                   0x00
265 #define HCI_PIN_TYPE_FIXED                      0x01
266
267 /* Link key types */
268 #define HCI_LINK_KEY_TYPE_COMBINATION_KEY       0x00
269 #define HCI_LINK_KEY_TYPE_LOCAL_UNIT_KEY        0x01
270 #define HCI_LINK_KEY_TYPE_REMOTE_UNIT_KEY       0x02
271 /* 0x03 - 0xFF - reserved for future use */
272
273 /* Encryption modes */
274 #define HCI_ENCRYPTION_MODE_NONE                0x00
275 #define HCI_ENCRYPTION_MODE_P2P                 0x01
276 #define HCI_ENCRYPTION_MODE_ALL                 0x02
277 /* 0x03 - 0xFF - reserved for future use */
278
279 /* Quality of service types */
280 #define HCI_SERVICE_TYPE_NO_TRAFFIC             0x00
281 #define HCI_SERVICE_TYPE_BEST_EFFORT            0x01
282 #define HCI_SERVICE_TYPE_GUARANTEED             0x02
283 /* 0x03 - 0xFF - reserved for future use */
284
285 /* Link policy settings */
286 #define HCI_LINK_POLICY_DISABLE_ALL_LM_MODES    0x0000
287 #define HCI_LINK_POLICY_ENABLE_ROLE_SWITCH      0x0001 /* Master/Slave switch */
288 #define HCI_LINK_POLICY_ENABLE_HOLD_MODE        0x0002
289 #define HCI_LINK_POLICY_ENABLE_SNIFF_MODE       0x0004
290 #define HCI_LINK_POLICY_ENABLE_PARK_MODE        0x0008
291 /* 0x0010 - 0x8000 - reserved for future use */
292
293 /* Event masks */
294 #define HCI_EVMSK_ALL                           0x00000000ffffffff
295 #define HCI_EVMSK_NONE                          0x0000000000000000
296 #define HCI_EVMSK_INQUIRY_COMPL                 0x0000000000000001
297 #define HCI_EVMSK_INQUIRY_RESULT                0x0000000000000002
298 #define HCI_EVMSK_CON_COMPL                     0x0000000000000004
299 #define HCI_EVMSK_CON_REQ                       0x0000000000000008
300 #define HCI_EVMSK_DISCON_COMPL                  0x0000000000000010
301 #define HCI_EVMSK_AUTH_COMPL                    0x0000000000000020
302 #define HCI_EVMSK_REMOTE_NAME_REQ_COMPL         0x0000000000000040
303 #define HCI_EVMSK_ENCRYPTION_CHANGE             0x0000000000000080
304 #define HCI_EVMSK_CHANGE_CON_LINK_KEY_COMPL     0x0000000000000100
305 #define HCI_EVMSK_MASTER_LINK_KEY_COMPL         0x0000000000000200
306 #define HCI_EVMSK_READ_REMOTE_FEATURES_COMPL    0x0000000000000400
307 #define HCI_EVMSK_READ_REMOTE_VER_INFO_COMPL    0x0000000000000800
308 #define HCI_EVMSK_QOS_SETUP_COMPL               0x0000000000001000
309 #define HCI_EVMSK_COMMAND_COMPL                 0x0000000000002000
310 #define HCI_EVMSK_COMMAND_STATUS                0x0000000000004000
311 #define HCI_EVMSK_HARDWARE_ERROR                0x0000000000008000
312 #define HCI_EVMSK_FLUSH_OCCUR                   0x0000000000010000
313 #define HCI_EVMSK_ROLE_CHANGE                   0x0000000000020000
314 #define HCI_EVMSK_NUM_COMPL_PKTS                0x0000000000040000
315 #define HCI_EVMSK_MODE_CHANGE                   0x0000000000080000
316 #define HCI_EVMSK_RETURN_LINK_KEYS              0x0000000000100000
317 #define HCI_EVMSK_PIN_CODE_REQ                  0x0000000000200000
318 #define HCI_EVMSK_LINK_KEY_REQ                  0x0000000000400000
319 #define HCI_EVMSK_LINK_KEY_NOTIFICATION         0x0000000000800000
320 #define HCI_EVMSK_LOOPBACK_COMMAND              0x0000000001000000
321 #define HCI_EVMSK_DATA_BUFFER_OVERFLOW          0x0000000002000000
322 #define HCI_EVMSK_MAX_SLOT_CHANGE               0x0000000004000000
323 #define HCI_EVMSK_READ_CLOCK_OFFSET_COMLETE     0x0000000008000000
324 #define HCI_EVMSK_CON_PKT_TYPE_CHANGED          0x0000000010000000
325 #define HCI_EVMSK_QOS_VIOLATION                 0x0000000020000000
326 #define HCI_EVMSK_PAGE_SCAN_MODE_CHANGE         0x0000000040000000
327 #define HCI_EVMSK_PAGE_SCAN_REP_MODE_CHANGE     0x0000000080000000
328 /* 0x0000000100000000 - 0x8000000000000000 - reserved for future use */
329
330 /* Filter types */
331 #define HCI_FILTER_TYPE_NONE                    0x00
332 #define HCI_FILTER_TYPE_INQUIRY_RESULT          0x01
333 #define HCI_FILTER_TYPE_CON_SETUP               0x02
334 /* 0x03 - 0xFF - reserved for future use */
335
336 /* Filter condition types for HCI_FILTER_TYPE_INQUIRY_RESULT */
337 #define HCI_FILTER_COND_INQUIRY_NEW_UNIT        0x00
338 #define HCI_FILTER_COND_INQUIRY_UNIT_CLASS      0x01
339 #define HCI_FILTER_COND_INQUIRY_BDADDR          0x02
340 /* 0x03 - 0xFF - reserved for future use */
341
342 /* Filter condition types for HCI_FILTER_TYPE_CON_SETUP */
343 #define HCI_FILTER_COND_CON_ANY_UNIT            0x00
344 #define HCI_FILTER_COND_CON_UNIT_CLASS          0x01
345 #define HCI_FILTER_COND_CON_BDADDR              0x02
346 /* 0x03 - 0xFF - reserved for future use */
347
348 /* Xmit level types */
349 #define HCI_XMIT_LEVEL_CURRENT                  0x00
350 #define HCI_XMIT_LEVEL_MAXIMUM                  0x01
351 /* 0x02 - 0xFF - reserved for future use */
352
353 /* Host Controller to Host flow control */
354 #define HCI_HC2H_FLOW_CONTROL_NONE              0x00
355 #define HCI_HC2H_FLOW_CONTROL_ACL               0x01
356 #define HCI_HC2H_FLOW_CONTROL_SCO               0x02
357 #define HCI_HC2H_FLOW_CONTROL_BOTH              0x03
358 /* 0x04 - 0xFF - reserved future use */
359
360 /* Loopback modes */
361 #define HCI_LOOPBACK_NONE                       0x00
362 #define HCI_LOOPBACK_LOCAL                      0x01
363 #define HCI_LOOPBACK_REMOTE                     0x02
364 /* 0x03 - 0xFF - reserved future use */
365
366 /**************************************************************************
367  **************************************************************************
368  **                 Link level defines, headers and types
369  **************************************************************************
370  **************************************************************************/
371
372 /*
373  * Macro(s) to combine OpCode and extract OGF (OpCode Group Field)
374  * and OCF (OpCode Command Field) from OpCode.
375  */
376
377 #define HCI_OPCODE(gf,cf)               ((((gf) & 0x3f) << 10) | ((cf) & 0x3ff))
378 #define HCI_OCF(op)                     ((op) & 0x3ff)
379 #define HCI_OGF(op)                     (((op) >> 10) & 0x3f)
380
381 /*
382  * Macro(s) to extract/combine connection handle, BC (Broadcast) and
383  * PB (Packet boundary) flags.
384  */
385
386 #define HCI_CON_HANDLE(h)               ((h) & 0x0fff)
387 #define HCI_PB_FLAG(h)                  (((h) & 0x3000) >> 12)
388 #define HCI_BC_FLAG(h)                  (((h) & 0xc000) >> 14)
389 #define HCI_MK_CON_HANDLE(h, pb, bc) \
390         (((h) & 0x0fff) | (((pb) & 3) << 12) | (((bc) & 3) << 14))
391
392 /* PB flag values */
393                                         /* 00 - reserved for future use */
394 #define HCI_PACKET_FRAGMENT             0x1
395 #define HCI_PACKET_START                0x2
396                                         /* 11 - reserved for future use */
397
398 /* BC flag values */
399 #define HCI_POINT2POINT                 0x0 /* only Host controller to Host */
400 #define HCI_BROADCAST_ACTIVE            0x1 /* both directions */
401 #define HCI_BROADCAST_PICONET           0x2 /* both directions */
402                                         /* 11 - reserved for future use */
403
404 /* HCI command packet header */
405 typedef struct {
406         uint8_t         type;   /* MUST be 0x01 */
407         uint16_t        opcode; /* OpCode */
408         uint8_t         length; /* parameter(s) length in bytes */
409 } __attribute__ ((__packed__)) hci_cmd_hdr_t;
410
411 #define HCI_CMD_PKT                     0x01
412 #define HCI_CMD_PKT_SIZE                (sizeof(hci_cmd_hdr_t) + 0xff)
413
414 /* ACL data packet header */
415 typedef struct {
416         uint8_t         type;        /* MUST be 0x02 */
417         uint16_t        con_handle;  /* connection handle + PB + BC flags */
418         uint16_t        length;      /* payload length in bytes */
419 } __attribute__ ((__packed__)) hci_acldata_hdr_t;
420
421 #define HCI_ACL_DATA_PKT                0x02
422 #define HCI_ACL_PKT_SIZE                (sizeof(hci_acldata_hdr_t) + 0xffff)
423
424 /* SCO data packet header */
425 typedef struct {
426         uint8_t         type;       /* MUST be 0x03 */
427         uint16_t        con_handle; /* connection handle + reserved bits */
428         uint8_t         length;     /* payload length in bytes */
429 } __attribute__ ((__packed__)) hci_scodata_hdr_t;
430
431 #define HCI_SCO_DATA_PKT                0x03
432 #define HCI_SCO_PKT_SIZE                (sizeof(hci_scodata_hdr_t) + 0xff)
433
434 /* HCI event packet header */
435 typedef struct {
436         uint8_t         type;   /* MUST be 0x04 */
437         uint8_t         event;  /* event */
438         uint8_t         length; /* parameter(s) length in bytes */
439 } __attribute__ ((__packed__)) hci_event_hdr_t;
440
441 #define HCI_EVENT_PKT                   0x04
442 #define HCI_EVENT_PKT_SIZE              (sizeof(hci_event_hdr_t) + 0xff)
443
444 /* HCI status return parameter */
445 typedef struct {
446         uint8_t         status; /* 0x00 - success */
447 } __attribute__ ((__packed__)) hci_status_rp;
448
449 /**************************************************************************
450  **************************************************************************
451  ** OGF 0x01    Link control commands and return parameters
452  **************************************************************************
453  **************************************************************************/
454
455 #define HCI_OGF_LINK_CONTROL                    0x01
456
457 #define HCI_OCF_INQUIRY                                 0x0001
458 #define HCI_CMD_INQUIRY                                 0x0401
459 typedef struct {
460         uint8_t         lap[HCI_LAP_SIZE]; /* LAP */
461         uint8_t         inquiry_length;    /* (N x 1.28) sec */
462         uint8_t         num_responses;     /* Max. # of responses */
463 } __attribute__ ((__packed__)) hci_inquiry_cp;
464 /* No return parameter(s) */
465
466 #define HCI_OCF_INQUIRY_CANCEL                          0x0002
467 #define HCI_CMD_INQUIRY_CANCEL                          0x0402
468 /* No command parameter(s) */
469 typedef hci_status_rp   hci_inquiry_cancel_rp;
470
471 #define HCI_OCF_PERIODIC_INQUIRY                        0x0003
472 #define HCI_CMD_PERIODIC_INQUIRY                        0x0403
473 typedef struct {
474         uint16_t        max_period_length; /* Max. and min. amount of time */
475         uint16_t        min_period_length; /* between consecutive inquiries */
476         uint8_t         lap[HCI_LAP_SIZE]; /* LAP */
477         uint8_t         inquiry_length;    /* (inquiry_length * 1.28) sec */
478         uint8_t         num_responses;     /* Max. # of responses */
479 } __attribute__ ((__packed__)) hci_periodic_inquiry_cp;
480
481 typedef hci_status_rp   hci_periodic_inquiry_rp;
482
483 #define HCI_OCF_EXIT_PERIODIC_INQUIRY                   0x0004
484 #define HCI_CMD_EXIT_PERIODIC_INQUIRY                   0x0404
485 /* No command parameter(s) */
486 typedef hci_status_rp   hci_exit_periodic_inquiry_rp;
487
488 #define HCI_OCF_CREATE_CON                              0x0005
489 #define HCI_CMD_CREATE_CON                              0x0405
490 typedef struct {
491         bdaddr_t        bdaddr;             /* destination address */
492         uint16_t        pkt_type;           /* packet type */
493         uint8_t         page_scan_rep_mode; /* page scan repetition mode */
494         uint8_t         page_scan_mode;     /* reserved - set to 0x00 */
495         uint16_t        clock_offset;       /* clock offset */
496         uint8_t         accept_role_switch; /* accept role switch? 0x00 == No */
497 } __attribute__ ((__packed__)) hci_create_con_cp;
498 /* No return parameter(s) */
499
500 #define HCI_OCF_DISCONNECT                              0x0006
501 #define HCI_CMD_DISCONNECT                              0x0406
502 typedef struct {
503         uint16_t        con_handle; /* connection handle */
504         uint8_t         reason;     /* reason to disconnect */
505 } __attribute__ ((__packed__)) hci_discon_cp;
506 /* No return parameter(s) */
507
508 /* Add SCO Connection is deprecated */
509 #define HCI_OCF_ADD_SCO_CON                             0x0007
510 #define HCI_CMD_ADD_SCO_CON                             0x0407
511 typedef struct {
512         uint16_t        con_handle; /* connection handle */
513         uint16_t        pkt_type;   /* packet type */
514 } __attribute__ ((__packed__)) hci_add_sco_con_cp;
515 /* No return parameter(s) */
516
517 #define HCI_OCF_CREATE_CON_CANCEL                       0x0008
518 #define HCI_CMD_CREATE_CON_CANCEL                       0x0408
519 typedef struct {
520         bdaddr_t        bdaddr;         /* destination address */
521 } __attribute__ ((__packed__)) hci_create_con_cancel_cp;
522
523 typedef struct {
524         uint8_t         status;         /* 0x00 - success */
525         bdaddr_t        bdaddr;         /* destination address */
526 } __attribute__ ((__packed__)) hci_create_con_cancel_rp;
527
528 #define HCI_OCF_ACCEPT_CON                              0x0009
529 #define HCI_CMD_ACCEPT_CON                              0x0409
530 typedef struct {
531         bdaddr_t        bdaddr; /* address of unit to be connected */
532         uint8_t         role;   /* connection role */
533 } __attribute__ ((__packed__)) hci_accept_con_cp;
534 /* No return parameter(s) */
535
536 #define HCI_OCF_REJECT_CON                              0x000a
537 #define HCI_CMD_REJECT_CON                              0x040A
538 typedef struct {
539         bdaddr_t        bdaddr; /* remote address */
540         uint8_t         reason; /* reason to reject */
541 } __attribute__ ((__packed__)) hci_reject_con_cp;
542 /* No return parameter(s) */
543
544 #define HCI_OCF_LINK_KEY_REP                            0x000b
545 #define HCI_CMD_LINK_KEY_REP                            0x040B
546 typedef struct {
547         bdaddr_t        bdaddr;            /* remote address */
548         uint8_t         key[HCI_KEY_SIZE]; /* key */
549 } __attribute__ ((__packed__)) hci_link_key_rep_cp;
550
551 typedef struct {
552         uint8_t         status; /* 0x00 - success */
553         bdaddr_t        bdaddr; /* unit address */
554 } __attribute__ ((__packed__)) hci_link_key_rep_rp;
555
556 #define HCI_OCF_LINK_KEY_NEG_REP                        0x000c
557 #define HCI_CMD_LINK_KEY_NEG_REP                        0x040C
558 typedef struct {
559         bdaddr_t        bdaddr; /* remote address */
560 } __attribute__ ((__packed__)) hci_link_key_neg_rep_cp;
561
562 typedef struct {
563         uint8_t         status; /* 0x00 - success */
564         bdaddr_t        bdaddr; /* unit address */
565 } __attribute__ ((__packed__)) hci_link_key_neg_rep_rp;
566
567 #define HCI_OCF_PIN_CODE_REP                            0x000d
568 #define HCI_CMD_PIN_CODE_REP                            0x040D
569 typedef struct {
570         bdaddr_t        bdaddr;               /* remote address */
571         uint8_t         pin_size;             /* pin code length (in bytes) */
572         uint8_t         pin[HCI_PIN_SIZE];    /* pin code */
573 } __attribute__ ((__packed__)) hci_pin_code_rep_cp;
574
575 typedef struct {
576         uint8_t         status; /* 0x00 - success */
577         bdaddr_t        bdaddr; /* unit address */
578 } __attribute__ ((__packed__)) hci_pin_code_rep_rp;
579
580 #define HCI_OCF_PIN_CODE_NEG_REP                        0x000e
581 #define HCI_CMD_PIN_CODE_NEG_REP                        0x040E
582 typedef struct {
583         bdaddr_t        bdaddr; /* remote address */
584 } __attribute__ ((__packed__)) hci_pin_code_neg_rep_cp;
585
586 typedef struct {
587         uint8_t         status; /* 0x00 - success */
588         bdaddr_t        bdaddr; /* unit address */
589 } __attribute__ ((__packed__)) hci_pin_code_neg_rep_rp;
590
591 #define HCI_OCF_CHANGE_CON_PACKET_TYPE                  0x000f
592 #define HCI_CMD_CHANGE_CON_PACKET_TYPE                  0x040F
593 typedef struct {
594         uint16_t        con_handle; /* connection handle */
595         uint16_t        pkt_type;   /* packet type */
596 } __attribute__ ((__packed__)) hci_change_con_pkt_type_cp;
597 /* No return parameter(s) */
598
599 #define HCI_OCF_AUTH_REQ                                0x0011
600 #define HCI_CMD_AUTH_REQ                                0x0411
601 typedef struct {
602         uint16_t        con_handle; /* connection handle */
603 } __attribute__ ((__packed__)) hci_auth_req_cp;
604 /* No return parameter(s) */
605
606 #define HCI_OCF_SET_CON_ENCRYPTION                      0x0013
607 #define HCI_CMD_SET_CON_ENCRYPTION                      0x0413
608 typedef struct {
609         uint16_t        con_handle;        /* connection handle */
610         uint8_t         encryption_enable; /* 0x00 - disable, 0x01 - enable */
611 } __attribute__ ((__packed__)) hci_set_con_encryption_cp;
612 /* No return parameter(s) */
613
614 #define HCI_OCF_CHANGE_CON_LINK_KEY                     0x0015
615 #define HCI_CMD_CHANGE_CON_LINK_KEY                     0x0415
616 typedef struct {
617         uint16_t        con_handle; /* connection handle */
618 } __attribute__ ((__packed__)) hci_change_con_link_key_cp;
619 /* No return parameter(s) */
620
621 #define HCI_OCF_MASTER_LINK_KEY                         0x0017
622 #define HCI_CMD_MASTER_LINK_KEY                         0x0417
623 typedef struct {
624         uint8_t         key_flag; /* key flag */
625 } __attribute__ ((__packed__)) hci_master_link_key_cp;
626 /* No return parameter(s) */
627
628 #define HCI_OCF_REMOTE_NAME_REQ                         0x0019
629 #define HCI_CMD_REMOTE_NAME_REQ                         0x0419
630 typedef struct {
631         bdaddr_t        bdaddr;             /* remote address */
632         uint8_t         page_scan_rep_mode; /* page scan repetition mode */
633         uint8_t         page_scan_mode;     /* page scan mode */
634         uint16_t        clock_offset;       /* clock offset */
635 } __attribute__ ((__packed__)) hci_remote_name_req_cp;
636 /* No return parameter(s) */
637
638 #define HCI_OCF_REMOTE_NAME_REQ_CANCEL                  0x001a
639 #define HCI_CMD_REMOTE_NAME_REQ_CANCEL                  0x041A
640 typedef struct {
641         bdaddr_t        bdaddr;             /* remote address */
642 } __attribute__ ((__packed__)) hci_remote_name_req_cancel_cp;
643
644 typedef struct {
645         uint8_t         status;         /* 0x00 - success */
646         bdaddr_t        bdaddr;         /* remote address */
647 } __attribute__ ((__packed__)) hci_remote_name_req_cancel_rp;
648
649 #define HCI_OCF_READ_REMOTE_FEATURES                    0x001b
650 #define HCI_CMD_READ_REMOTE_FEATURES                    0x041B
651 typedef struct {
652         uint16_t        con_handle; /* connection handle */
653 } __attribute__ ((__packed__)) hci_read_remote_features_cp;
654 /* No return parameter(s) */
655
656 #define HCI_OCF_READ_REMOTE_EXTENDED_FEATURES           0x001c
657 #define HCI_CMD_READ_REMOTE_EXTENDED_FEATURES           0x041C
658 typedef struct {
659         uint16_t        con_handle;     /* connection handle */
660         uint8_t         page;           /* page number */
661 } __attribute__ ((__packed__)) hci_read_remote_extended_features_cp;
662 /* No return parameter(s) */
663
664 #define HCI_OCF_READ_REMOTE_VER_INFO                    0x001d
665 #define HCI_CMD_READ_REMOTE_VER_INFO                    0x041D
666 typedef struct {
667         uint16_t        con_handle; /* connection handle */
668 } __attribute__ ((__packed__)) hci_read_remote_ver_info_cp;
669 /* No return parameter(s) */
670
671 #define HCI_OCF_READ_CLOCK_OFFSET                       0x001f
672 #define HCI_CMD_READ_CLOCK_OFFSET                       0x041F
673 typedef struct {
674         uint16_t        con_handle; /* connection handle */
675 } __attribute__ ((__packed__)) hci_read_clock_offset_cp;
676 /* No return parameter(s) */
677
678 #define HCI_OCF_READ_LMP_HANDLE                         0x0020
679 #define HCI_CMD_READ_LMP_HANDLE                         0x0420
680 typedef struct {
681         uint16_t        con_handle; /* connection handle */
682 } __attribute__ ((__packed__)) hci_read_lmp_handle_cp;
683
684 typedef struct {
685         uint8_t         status;     /* 0x00 - success */
686         uint16_t        con_handle; /* connection handle */
687         uint8_t         lmp_handle; /* LMP handle */
688         uint32_t        reserved;   /* reserved */
689 } __attribute__ ((__packed__)) hci_read_lmp_handle_rp;
690
691 #define HCI_OCF_SETUP_SCO_CON                           0x0028
692 #define HCI_CMD_SETUP_SCO_CON                           0x0428
693 typedef struct {
694         uint16_t        con_handle;     /* connection handle */
695         uint32_t        tx_bandwidth;   /* transmit bandwidth */
696         uint32_t        rx_bandwidth;   /* receive bandwidth */
697         uint16_t        latency;        /* maximum latency */
698         uint16_t        voice;          /* voice setting */
699         uint8_t         rt_effort;      /* retransmission effort */
700         uint16_t        pkt_type;       /* packet types */
701 } __attribute__ ((__packed__)) hci_setup_sco_con_cp;
702 /* No return parameter(s) */
703
704 #define HCI_OCF_ACCEPT_SCO_CON_REQ                      0x0029
705 #define HCI_CMD_ACCEPT_SCO_CON_REQ                      0x0429
706 typedef struct {
707         bdaddr_t        bdaddr;         /* remote address */
708         uint32_t        tx_bandwidth;   /* transmit bandwidth */
709         uint32_t        rx_bandwidth;   /* receive bandwidth */
710         uint16_t        latency;        /* maximum latency */
711         uint16_t        content;        /* voice setting */
712         uint8_t         rt_effort;      /* retransmission effort */
713         uint16_t        pkt_type;       /* packet types */
714 } __attribute__ ((__packed__)) hci_accept_sco_con_req_cp;
715 /* No return parameter(s) */
716
717 #define HCI_OCF_REJECT_SCO_CON_REQ                      0x002a
718 #define HCI_CMD_REJECT_SCO_CON_REQ                      0x042a
719 typedef struct {
720         bdaddr_t        bdaddr;         /* remote address */
721         uint8_t         reason;         /* reject error code */
722 } __attribute__ ((__packed__)) hci_reject_sco_con_req_cp;
723 /* No return parameter(s) */
724
725 #define HCI_OCF_IO_CAPABILITY_REP                       0x002b
726 #define HCI_CMD_IO_CAPABILITY_REP                       0x042a
727 typedef struct {
728         bdaddr_t        bdaddr;         /* remote address */
729         uint8_t         io_cap;         /* IO capability */
730         uint8_t         oob_data;       /* OOB data present */
731         uint8_t         auth_req;       /* auth requirements */
732 } __attribute__ ((__packed__)) hci_io_capability_rep_cp;
733
734 typedef struct {
735         uint8_t         status;         /* 0x00 - success */
736         bdaddr_t        bdaddr;         /* remote address */
737 } __attribute__ ((__packed__)) hci_io_capability_rep_rp;
738
739 #define HCI_OCF_USER_CONFIRM_REP                        0x002c
740 #define HCI_CMD_USER_CONFIRM_REP                        0x042c
741 typedef struct {
742         bdaddr_t        bdaddr;         /* remote address */
743 } __attribute__ ((__packed__)) hci_user_confirm_rep_cp;
744
745 typedef struct {
746         uint8_t         status;         /* 0x00 - success */
747         bdaddr_t        bdaddr;         /* remote address */
748 } __attribute__ ((__packed__)) hci_user_confirm_rep_rp;
749
750 #define HCI_OCF_USER_CONFIRM_NEG_REP                    0x002d
751 #define HCI_CMD_USER_CONFIRM_NEG_REP                    0x042d
752 typedef struct {
753         bdaddr_t        bdaddr;         /* remote address */
754 } __attribute__ ((__packed__)) hci_user_confirm_neg_rep_cp;
755
756 typedef struct {
757         uint8_t         status;         /* 0x00 - success */
758         bdaddr_t        bdaddr;         /* remote address */
759 } __attribute__ ((__packed__)) hci_user_confirm_neg_rep_rp;
760
761 #define HCI_OCF_USER_PASSKEY_REP                        0x002e
762 #define HCI_CMD_USER_PASSKEY_REP                        0x042e
763 typedef struct {
764         bdaddr_t        bdaddr;         /* remote address */
765         uint32_t        value;          /* 000000 - 999999 */
766 } __attribute__ ((__packed__)) hci_user_passkey_rep_cp;
767
768 typedef struct {
769         uint8_t         status;         /* 0x00 - success */
770         bdaddr_t        bdaddr;         /* remote address */
771 } __attribute__ ((__packed__)) hci_user_passkey_rep_rp;
772
773 #define HCI_OCF_USER_PASSKEY_NEG_REP                    0x002f
774 #define HCI_CMD_USER_PASSKEY_NEG_REP                    0x042f
775 typedef struct {
776         bdaddr_t        bdaddr;         /* remote address */
777 } __attribute__ ((__packed__)) hci_user_passkey_neg_rep_cp;
778
779 typedef struct {
780         uint8_t         status;         /* 0x00 - success */
781         bdaddr_t        bdaddr;         /* remote address */
782 } __attribute__ ((__packed__)) hci_user_passkey_neg_rep_rp;
783
784 #define HCI_OCF_OOB_DATA_REP                            0x0030
785 #define HCI_CMD_OOB_DATA_REP                            0x0430
786 typedef struct {
787         bdaddr_t        bdaddr;         /* remote address */
788         uint8_t         c[16];          /* pairing hash */
789         uint8_t         r[16];          /* pairing randomizer */
790 } __attribute__ ((__packed__)) hci_user_oob_data_rep_cp;
791
792 typedef struct {
793         uint8_t         status;         /* 0x00 - success */
794         bdaddr_t        bdaddr;         /* remote address */
795 } __attribute__ ((__packed__)) hci_user_oob_data_rep_rp;
796
797 #define HCI_OCF_OOB_DATA_NEG_REP                        0x0033
798 #define HCI_CMD_OOB_DATA_NEG_REP                        0x0433
799 typedef struct {
800         bdaddr_t        bdaddr;         /* remote address */
801 } __attribute__ ((__packed__)) hci_user_oob_data_neg_rep_cp;
802
803 typedef struct {
804         uint8_t         status;         /* 0x00 - success */
805         bdaddr_t        bdaddr;         /* remote address */
806 } __attribute__ ((__packed__)) hci_user_oob_data_neg_rep_rp;
807
808 #define HCI_OCF_IO_CAPABILITY_NEG_REP                   0x0034
809 #define HCI_CMD_IO_CAPABILITY_NEG_REP                   0x0434
810 typedef struct {
811         bdaddr_t        bdaddr;         /* remote address */
812         uint8_t         reason;         /* error code */
813 } __attribute__ ((__packed__)) hci_io_capability_neg_rep_cp;
814
815 typedef struct {
816         uint8_t         status;         /* 0x00 - success */
817         bdaddr_t        bdaddr;         /* remote address */
818 } __attribute__ ((__packed__)) hci_io_capability_neg_rep_rp;
819
820 /**************************************************************************
821  **************************************************************************
822  ** OGF 0x02    Link policy commands and return parameters
823  **************************************************************************
824  **************************************************************************/
825
826 #define HCI_OGF_LINK_POLICY                     0x02
827
828 #define HCI_OCF_HOLD_MODE                               0x0001
829 #define HCI_CMD_HOLD_MODE                               0x0801
830 typedef struct {
831         uint16_t        con_handle;   /* connection handle */
832         uint16_t        max_interval; /* (max_interval * 0.625) msec */
833         uint16_t        min_interval; /* (max_interval * 0.625) msec */
834 } __attribute__ ((__packed__)) hci_hold_mode_cp;
835 /* No return parameter(s) */
836
837 #define HCI_OCF_SNIFF_MODE                              0x0003
838 #define HCI_CMD_SNIFF_MODE                              0x0803
839 typedef struct {
840         uint16_t        con_handle;   /* connection handle */
841         uint16_t        max_interval; /* (max_interval * 0.625) msec */
842         uint16_t        min_interval; /* (max_interval * 0.625) msec */
843         uint16_t        attempt;      /* (2 * attempt - 1) * 0.625 msec */
844         uint16_t        timeout;      /* (2 * attempt - 1) * 0.625 msec */
845 } __attribute__ ((__packed__)) hci_sniff_mode_cp;
846 /* No return parameter(s) */
847
848 #define HCI_OCF_EXIT_SNIFF_MODE                         0x0004
849 #define HCI_CMD_EXIT_SNIFF_MODE                         0x0804
850 typedef struct {
851         uint16_t        con_handle; /* connection handle */
852 } __attribute__ ((__packed__)) hci_exit_sniff_mode_cp;
853 /* No return parameter(s) */
854
855 #define HCI_OCF_PARK_MODE                               0x0005
856 #define HCI_CMD_PARK_MODE                               0x0805
857 typedef struct {
858         uint16_t        con_handle;   /* connection handle */
859         uint16_t        max_interval; /* (max_interval * 0.625) msec */
860         uint16_t        min_interval; /* (max_interval * 0.625) msec */
861 } __attribute__ ((__packed__)) hci_park_mode_cp;
862 /* No return parameter(s) */
863
864 #define HCI_OCF_EXIT_PARK_MODE                          0x0006
865 #define HCI_CMD_EXIT_PARK_MODE                          0x0806
866 typedef struct {
867         uint16_t        con_handle; /* connection handle */
868 } __attribute__ ((__packed__)) hci_exit_park_mode_cp;
869 /* No return parameter(s) */
870
871 #define HCI_OCF_QOS_SETUP                               0x0007
872 #define HCI_CMD_QOS_SETUP                               0x0807
873 typedef struct {
874         uint16_t        con_handle;      /* connection handle */
875         uint8_t         flags;           /* reserved for future use */
876         uint8_t         service_type;    /* service type */
877         uint32_t        token_rate;      /* bytes per second */
878         uint32_t        peak_bandwidth;  /* bytes per second */
879         uint32_t        latency;         /* microseconds */
880         uint32_t        delay_variation; /* microseconds */
881 } __attribute__ ((__packed__)) hci_qos_setup_cp;
882 /* No return parameter(s) */
883
884 #define HCI_OCF_ROLE_DISCOVERY                          0x0009
885 #define HCI_CMD_ROLE_DISCOVERY                          0x0809
886 typedef struct {
887         uint16_t        con_handle; /* connection handle */
888 } __attribute__ ((__packed__)) hci_role_discovery_cp;
889
890 typedef struct {
891         uint8_t         status;     /* 0x00 - success */
892         uint16_t        con_handle; /* connection handle */
893         uint8_t         role;       /* role for the connection handle */
894 } __attribute__ ((__packed__)) hci_role_discovery_rp;
895
896 #define HCI_OCF_SWITCH_ROLE                             0x000b
897 #define HCI_CMD_SWITCH_ROLE                             0x080B
898 typedef struct {
899         bdaddr_t        bdaddr; /* remote address */
900         uint8_t         role;   /* new local role */
901 } __attribute__ ((__packed__)) hci_switch_role_cp;
902 /* No return parameter(s) */
903
904 #define HCI_OCF_READ_LINK_POLICY_SETTINGS               0x000c
905 #define HCI_CMD_READ_LINK_POLICY_SETTINGS               0x080C
906 typedef struct {
907         uint16_t        con_handle; /* connection handle */
908 } __attribute__ ((__packed__)) hci_read_link_policy_settings_cp;
909
910 typedef struct {
911         uint8_t         status;     /* 0x00 - success */
912         uint16_t        con_handle; /* connection handle */
913         uint16_t        settings;   /* link policy settings */
914 } __attribute__ ((__packed__)) hci_read_link_policy_settings_rp;
915
916 #define HCI_OCF_WRITE_LINK_POLICY_SETTINGS              0x000d
917 #define HCI_CMD_WRITE_LINK_POLICY_SETTINGS              0x080D
918 typedef struct {
919         uint16_t        con_handle; /* connection handle */
920         uint16_t        settings;   /* link policy settings */
921 } __attribute__ ((__packed__)) hci_write_link_policy_settings_cp;
922
923 typedef struct {
924         uint8_t         status;     /* 0x00 - success */
925         uint16_t        con_handle; /* connection handle */
926 } __attribute__ ((__packed__)) hci_write_link_policy_settings_rp;
927
928 #define HCI_OCF_READ_DEFAULT_LINK_POLICY_SETTINGS       0x000e
929 #define HCI_CMD_READ_DEFAULT_LINK_POLICY_SETTINGS       0x080E
930 /* No command parameter(s) */
931 typedef struct {
932         uint8_t         status;     /* 0x00 - success */
933         uint16_t        settings;   /* link policy settings */
934 } __attribute__ ((__packed__)) hci_read_default_link_policy_settings_rp;
935
936 #define HCI_OCF_WRITE_DEFAULT_LINK_POLICY_SETTINGS      0x000f
937 #define HCI_CMD_WRITE_DEFAULT_LINK_POLICY_SETTINGS      0x080F
938 typedef struct {
939         uint16_t        settings;   /* link policy settings */
940 } __attribute__ ((__packed__)) hci_write_default_link_policy_settings_cp;
941
942 typedef hci_status_rp   hci_write_default_link_policy_settings_rp;
943
944 #define HCI_OCF_FLOW_SPECIFICATION                      0x0010
945 #define HCI_CMD_FLOW_SPECIFICATION                      0x0810
946 typedef struct {
947         uint16_t        con_handle;     /* connection handle */
948         uint8_t         flags;          /* reserved */
949         uint8_t         flow_direction;
950         uint8_t         service_type;
951         uint32_t        token_rate;
952         uint32_t        token_bucket;
953         uint32_t        peak_bandwidth;
954         uint32_t        latency;
955 } __attribute__ ((__packed__)) hci_flow_specification_cp;
956 /* No return parameter(s) */
957
958 #define HCI_OCF_SNIFF_SUBRATING                         0x0011
959 #define HCI_CMD_SNIFF_SUBRATING                         0x0810
960 typedef struct {
961         uint16_t        con_handle;     /* connection handle */
962         uint16_t        max_latency;
963         uint16_t        max_timeout;    /* max remote timeout */
964         uint16_t        min_timeout;    /* min local timeout */
965 } __attribute__ ((__packed__)) hci_sniff_subrating_cp;
966
967 typedef struct {
968         uint8_t         status;         /* 0x00 - success */
969         uint16_t        con_handle;     /* connection handle */
970 } __attribute__ ((__packed__)) hci_sniff_subrating_rp;
971
972 /**************************************************************************
973  **************************************************************************
974  ** OGF 0x03    Host Controller and Baseband commands and return parameters
975  **************************************************************************
976  **************************************************************************/
977
978 #define HCI_OGF_HC_BASEBAND                     0x03
979
980 #define HCI_OCF_SET_EVENT_MASK                          0x0001
981 #define HCI_CMD_SET_EVENT_MASK                          0x0C01
982 typedef struct {
983         uint8_t         event_mask[HCI_EVENT_MASK_SIZE]; /* event_mask */
984 } __attribute__ ((__packed__)) hci_set_event_mask_cp;
985
986 typedef hci_status_rp   hci_set_event_mask_rp;
987
988 #define HCI_OCF_RESET                                   0x0003
989 #define HCI_CMD_RESET                                   0x0C03
990 /* No command parameter(s) */
991 typedef hci_status_rp   hci_reset_rp;
992
993 #define HCI_OCF_SET_EVENT_FILTER                        0x0005
994 #define HCI_CMD_SET_EVENT_FILTER                        0x0C05
995 typedef struct {
996         uint8_t         filter_type;           /* filter type */
997         uint8_t         filter_condition_type; /* filter condition type */
998 /* variable size condition
999         uint8_t         condition[]; -- conditions */
1000 } __attribute__ ((__packed__)) hci_set_event_filter_cp;
1001
1002 typedef hci_status_rp   hci_set_event_filter_rp;
1003
1004 #define HCI_OCF_FLUSH                                   0x0008
1005 #define HCI_CMD_FLUSH                                   0x0C08
1006 typedef struct {
1007         uint16_t        con_handle; /* connection handle */
1008 } __attribute__ ((__packed__)) hci_flush_cp;
1009
1010 typedef struct {
1011         uint8_t         status;     /* 0x00 - success */
1012         uint16_t        con_handle; /* connection handle */
1013 } __attribute__ ((__packed__)) hci_flush_rp;
1014
1015 #define HCI_OCF_READ_PIN_TYPE                           0x0009
1016 #define HCI_CMD_READ_PIN_TYPE                           0x0C09
1017 /* No command parameter(s) */
1018 typedef struct {
1019         uint8_t         status;   /* 0x00 - success */
1020         uint8_t         pin_type; /* PIN type */
1021 } __attribute__ ((__packed__)) hci_read_pin_type_rp;
1022
1023 #define HCI_OCF_WRITE_PIN_TYPE                          0x000a
1024 #define HCI_CMD_WRITE_PIN_TYPE                          0x0C0A
1025 typedef struct {
1026         uint8_t         pin_type; /* PIN type */
1027 } __attribute__ ((__packed__)) hci_write_pin_type_cp;
1028
1029 typedef hci_status_rp   hci_write_pin_type_rp;
1030
1031 #define HCI_OCF_CREATE_NEW_UNIT_KEY                     0x000b
1032 #define HCI_CMD_CREATE_NEW_UNIT_KEY                     0x0C0B
1033 /* No command parameter(s) */
1034 typedef hci_status_rp   hci_create_new_unit_key_rp;
1035
1036 #define HCI_OCF_READ_STORED_LINK_KEY                    0x000d
1037 #define HCI_CMD_READ_STORED_LINK_KEY                    0x0C0D
1038 typedef struct {
1039         bdaddr_t        bdaddr;   /* address */
1040         uint8_t         read_all; /* read all keys? 0x01 - yes */
1041 } __attribute__ ((__packed__)) hci_read_stored_link_key_cp;
1042
1043 typedef struct {
1044         uint8_t         status;        /* 0x00 - success */
1045         uint16_t        max_num_keys;  /* Max. number of keys */
1046         uint16_t        num_keys_read; /* Number of stored keys */
1047 } __attribute__ ((__packed__)) hci_read_stored_link_key_rp;
1048
1049 #define HCI_OCF_WRITE_STORED_LINK_KEY                   0x0011
1050 #define HCI_CMD_WRITE_STORED_LINK_KEY                   0x0C11
1051 typedef struct {
1052         uint8_t         num_keys_write; /* # of keys to write */
1053 /* these are repeated "num_keys_write" times
1054         bdaddr_t        bdaddr;             --- remote address(es)
1055         uint8_t         key[HCI_KEY_SIZE];  --- key(s) */
1056 } __attribute__ ((__packed__)) hci_write_stored_link_key_cp;
1057
1058 typedef struct {
1059         uint8_t         status;           /* 0x00 - success */
1060         uint8_t         num_keys_written; /* # of keys successfully written */
1061 } __attribute__ ((__packed__)) hci_write_stored_link_key_rp;
1062
1063 #define HCI_OCF_DELETE_STORED_LINK_KEY                  0x0012
1064 #define HCI_CMD_DELETE_STORED_LINK_KEY                  0x0C12
1065 typedef struct {
1066         bdaddr_t        bdaddr;     /* address */
1067         uint8_t         delete_all; /* delete all keys? 0x01 - yes */
1068 } __attribute__ ((__packed__)) hci_delete_stored_link_key_cp;
1069
1070 typedef struct {
1071         uint8_t         status;           /* 0x00 - success */
1072         uint16_t        num_keys_deleted; /* Number of keys deleted */
1073 } __attribute__ ((__packed__)) hci_delete_stored_link_key_rp;
1074
1075 #define HCI_OCF_WRITE_LOCAL_NAME                        0x0013
1076 #define HCI_CMD_WRITE_LOCAL_NAME                        0x0C13
1077 typedef struct {
1078         char            name[HCI_UNIT_NAME_SIZE]; /* new unit name */
1079 } __attribute__ ((__packed__)) hci_write_local_name_cp;
1080
1081 typedef hci_status_rp   hci_write_local_name_rp;
1082
1083 #define HCI_OCF_READ_LOCAL_NAME                         0x0014
1084 #define HCI_CMD_READ_LOCAL_NAME                         0x0C14
1085 /* No command parameter(s) */
1086 typedef struct {
1087         uint8_t         status;                   /* 0x00 - success */
1088         char            name[HCI_UNIT_NAME_SIZE]; /* unit name */
1089 } __attribute__ ((__packed__)) hci_read_local_name_rp;
1090
1091 #define HCI_OCF_READ_CON_ACCEPT_TIMEOUT                 0x0015
1092 #define HCI_CMD_READ_CON_ACCEPT_TIMEOUT                 0x0C15
1093 /* No command parameter(s) */
1094 typedef struct {
1095         uint8_t         status;  /* 0x00 - success */
1096         uint16_t        timeout; /* (timeout * 0.625) msec */
1097 } __attribute__ ((__packed__)) hci_read_con_accept_timeout_rp;
1098
1099 #define HCI_OCF_WRITE_CON_ACCEPT_TIMEOUT                0x0016
1100 #define HCI_CMD_WRITE_CON_ACCEPT_TIMEOUT                0x0C16
1101 typedef struct {
1102         uint16_t        timeout; /* (timeout * 0.625) msec */
1103 } __attribute__ ((__packed__)) hci_write_con_accept_timeout_cp;
1104
1105 typedef hci_status_rp   hci_write_con_accept_timeout_rp;
1106
1107 #define HCI_OCF_READ_PAGE_TIMEOUT                       0x0017
1108 #define HCI_CMD_READ_PAGE_TIMEOUT                       0x0C17
1109 /* No command parameter(s) */
1110 typedef struct {
1111         uint8_t         status;  /* 0x00 - success */
1112         uint16_t        timeout; /* (timeout * 0.625) msec */
1113 } __attribute__ ((__packed__)) hci_read_page_timeout_rp;
1114
1115 #define HCI_OCF_WRITE_PAGE_TIMEOUT                      0x0018
1116 #define HCI_CMD_WRITE_PAGE_TIMEOUT                      0x0C18
1117 typedef struct {
1118         uint16_t        timeout; /* (timeout * 0.625) msec */
1119 } __attribute__ ((__packed__)) hci_write_page_timeout_cp;
1120
1121 typedef hci_status_rp   hci_write_page_timeout_rp;
1122
1123 #define HCI_OCF_READ_SCAN_ENABLE                        0x0019
1124 #define HCI_CMD_READ_SCAN_ENABLE                        0x0C19
1125 /* No command parameter(s) */
1126 typedef struct {
1127         uint8_t         status;      /* 0x00 - success */
1128         uint8_t         scan_enable; /* Scan enable */
1129 } __attribute__ ((__packed__)) hci_read_scan_enable_rp;
1130
1131 #define HCI_OCF_WRITE_SCAN_ENABLE                       0x001a
1132 #define HCI_CMD_WRITE_SCAN_ENABLE                       0x0C1A
1133 typedef struct {
1134         uint8_t         scan_enable; /* Scan enable */
1135 } __attribute__ ((__packed__)) hci_write_scan_enable_cp;
1136
1137 typedef hci_status_rp   hci_write_scan_enable_rp;
1138
1139 #define HCI_OCF_READ_PAGE_SCAN_ACTIVITY                 0x001b
1140 #define HCI_CMD_READ_PAGE_SCAN_ACTIVITY                 0x0C1B
1141 /* No command parameter(s) */
1142 typedef struct {
1143         uint8_t         status;             /* 0x00 - success */
1144         uint16_t        page_scan_interval; /* interval * 0.625 msec */
1145         uint16_t        page_scan_window;   /* window * 0.625 msec */
1146 } __attribute__ ((__packed__)) hci_read_page_scan_activity_rp;
1147
1148 #define HCI_OCF_WRITE_PAGE_SCAN_ACTIVITY                0x001c
1149 #define HCI_CMD_WRITE_PAGE_SCAN_ACTIVITY                0x0C1C
1150 typedef struct {
1151         uint16_t        page_scan_interval; /* interval * 0.625 msec */
1152         uint16_t        page_scan_window;   /* window * 0.625 msec */
1153 } __attribute__ ((__packed__)) hci_write_page_scan_activity_cp;
1154
1155 typedef hci_status_rp   hci_write_page_scan_activity_rp;
1156
1157 #define HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY              0x001d
1158 #define HCI_CMD_READ_INQUIRY_SCAN_ACTIVITY              0x0C1D
1159 /* No command parameter(s) */
1160 typedef struct {
1161         uint8_t         status;                /* 0x00 - success */
1162         uint16_t        inquiry_scan_interval; /* interval * 0.625 msec */
1163         uint16_t        inquiry_scan_window;   /* window * 0.625 msec */
1164 } __attribute__ ((__packed__)) hci_read_inquiry_scan_activity_rp;
1165
1166 #define HCI_OCF_WRITE_INQUIRY_SCAN_ACTIVITY             0x001e
1167 #define HCI_CMD_WRITE_INQUIRY_SCAN_ACTIVITY             0x0C1E
1168 typedef struct {
1169         uint16_t        inquiry_scan_interval; /* interval * 0.625 msec */
1170         uint16_t        inquiry_scan_window;   /* window * 0.625 msec */
1171 } __attribute__ ((__packed__)) hci_write_inquiry_scan_activity_cp;
1172
1173 typedef hci_status_rp   hci_write_inquiry_scan_activity_rp;
1174
1175 #define HCI_OCF_READ_AUTH_ENABLE                        0x001f
1176 #define HCI_CMD_READ_AUTH_ENABLE                        0x0C1F
1177 /* No command parameter(s) */
1178 typedef struct {
1179         uint8_t         status;      /* 0x00 - success */
1180         uint8_t         auth_enable; /* 0x01 - enabled */
1181 } __attribute__ ((__packed__)) hci_read_auth_enable_rp;
1182
1183 #define HCI_OCF_WRITE_AUTH_ENABLE                       0x0020
1184 #define HCI_CMD_WRITE_AUTH_ENABLE                       0x0C20
1185 typedef struct {
1186         uint8_t         auth_enable; /* 0x01 - enabled */
1187 } __attribute__ ((__packed__)) hci_write_auth_enable_cp;
1188
1189 typedef hci_status_rp   hci_write_auth_enable_rp;
1190
1191 /* Read Encryption Mode is deprecated */
1192 #define HCI_OCF_READ_ENCRYPTION_MODE                    0x0021
1193 #define HCI_CMD_READ_ENCRYPTION_MODE                    0x0C21
1194 /* No command parameter(s) */
1195 typedef struct {
1196         uint8_t         status;          /* 0x00 - success */
1197         uint8_t         encryption_mode; /* encryption mode */
1198 } __attribute__ ((__packed__)) hci_read_encryption_mode_rp;
1199
1200 /* Write Encryption Mode is deprecated */
1201 #define HCI_OCF_WRITE_ENCRYPTION_MODE                   0x0022
1202 #define HCI_CMD_WRITE_ENCRYPTION_MODE                   0x0C22
1203 typedef struct {
1204         uint8_t         encryption_mode; /* encryption mode */
1205 } __attribute__ ((__packed__)) hci_write_encryption_mode_cp;
1206
1207 typedef hci_status_rp   hci_write_encryption_mode_rp;
1208
1209 #define HCI_OCF_READ_UNIT_CLASS                         0x0023
1210 #define HCI_CMD_READ_UNIT_CLASS                         0x0C23
1211 /* No command parameter(s) */
1212 typedef struct {
1213         uint8_t         status;                 /* 0x00 - success */
1214         uint8_t         uclass[HCI_CLASS_SIZE]; /* unit class */
1215 } __attribute__ ((__packed__)) hci_read_unit_class_rp;
1216
1217 #define HCI_OCF_WRITE_UNIT_CLASS                        0x0024
1218 #define HCI_CMD_WRITE_UNIT_CLASS                        0x0C24
1219 typedef struct {
1220         uint8_t         uclass[HCI_CLASS_SIZE]; /* unit class */
1221 } __attribute__ ((__packed__)) hci_write_unit_class_cp;
1222
1223 typedef hci_status_rp   hci_write_unit_class_rp;
1224
1225 #define HCI_OCF_READ_VOICE_SETTING                      0x0025
1226 #define HCI_CMD_READ_VOICE_SETTING                      0x0C25
1227 /* No command parameter(s) */
1228 typedef struct {
1229         uint8_t         status;   /* 0x00 - success */
1230         uint16_t        settings; /* voice settings */
1231 } __attribute__ ((__packed__)) hci_read_voice_setting_rp;
1232
1233 #define HCI_OCF_WRITE_VOICE_SETTING                     0x0026
1234 #define HCI_CMD_WRITE_VOICE_SETTING                     0x0C26
1235 typedef struct {
1236         uint16_t        settings; /* voice settings */
1237 } __attribute__ ((__packed__)) hci_write_voice_setting_cp;
1238
1239 typedef hci_status_rp   hci_write_voice_setting_rp;
1240
1241 #define HCI_OCF_READ_AUTO_FLUSH_TIMEOUT                 0x0027
1242 #define HCI_CMD_READ_AUTO_FLUSH_TIMEOUT                 0x0C27
1243 typedef struct {
1244         uint16_t        con_handle; /* connection handle */
1245 } __attribute__ ((__packed__)) hci_read_auto_flush_timeout_cp;
1246
1247 typedef struct {
1248         uint8_t         status;     /* 0x00 - success */
1249         uint16_t        con_handle; /* connection handle */
1250         uint16_t        timeout;    /* 0x00 - no flush, timeout * 0.625 msec */
1251 } __attribute__ ((__packed__)) hci_read_auto_flush_timeout_rp;
1252
1253 #define HCI_OCF_WRITE_AUTO_FLUSH_TIMEOUT                0x0028
1254 #define HCI_CMD_WRITE_AUTO_FLUSH_TIMEOUT                0x0C28
1255 typedef struct {
1256         uint16_t        con_handle; /* connection handle */
1257         uint16_t        timeout;    /* 0x00 - no flush, timeout * 0.625 msec */
1258 } __attribute__ ((__packed__)) hci_write_auto_flush_timeout_cp;
1259
1260 typedef struct {
1261         uint8_t         status;     /* 0x00 - success */
1262         uint16_t        con_handle; /* connection handle */
1263 } __attribute__ ((__packed__)) hci_write_auto_flush_timeout_rp;
1264
1265 #define HCI_OCF_READ_NUM_BROADCAST_RETRANS              0x0029
1266 #define HCI_CMD_READ_NUM_BROADCAST_RETRANS              0x0C29
1267 /* No command parameter(s) */
1268 typedef struct {
1269         uint8_t         status;  /* 0x00 - success */
1270         uint8_t         counter; /* number of broadcast retransmissions */
1271 } __attribute__ ((__packed__)) hci_read_num_broadcast_retrans_rp;
1272
1273 #define HCI_OCF_WRITE_NUM_BROADCAST_RETRANS             0x002a
1274 #define HCI_CMD_WRITE_NUM_BROADCAST_RETRANS             0x0C2A
1275 typedef struct {
1276         uint8_t         counter; /* number of broadcast retransmissions */
1277 } __attribute__ ((__packed__)) hci_write_num_broadcast_retrans_cp;
1278
1279 typedef hci_status_rp   hci_write_num_broadcast_retrans_rp;
1280
1281 #define HCI_OCF_READ_HOLD_MODE_ACTIVITY                 0x002b
1282 #define HCI_CMD_READ_HOLD_MODE_ACTIVITY                 0x0C2B
1283 /* No command parameter(s) */
1284 typedef struct {
1285         uint8_t         status;             /* 0x00 - success */
1286         uint8_t         hold_mode_activity; /* Hold mode activities */
1287 } __attribute__ ((__packed__)) hci_read_hold_mode_activity_rp;
1288
1289 #define HCI_OCF_WRITE_HOLD_MODE_ACTIVITY                0x002c
1290 #define HCI_CMD_WRITE_HOLD_MODE_ACTIVITY                0x0C2C
1291 typedef struct {
1292         uint8_t         hold_mode_activity; /* Hold mode activities */
1293 } __attribute__ ((__packed__)) hci_write_hold_mode_activity_cp;
1294
1295 typedef hci_status_rp   hci_write_hold_mode_activity_rp;
1296
1297 #define HCI_OCF_READ_XMIT_LEVEL                         0x002d
1298 #define HCI_CMD_READ_XMIT_LEVEL                         0x0C2D
1299 typedef struct {
1300         uint16_t        con_handle; /* connection handle */
1301         uint8_t         type;       /* Xmit level type */
1302 } __attribute__ ((__packed__)) hci_read_xmit_level_cp;
1303
1304 typedef struct {
1305         uint8_t         status;     /* 0x00 - success */
1306         uint16_t        con_handle; /* connection handle */
1307         char            level;      /* -30 <= level <= 30 dBm */
1308 } __attribute__ ((__packed__)) hci_read_xmit_level_rp;
1309
1310 #define HCI_OCF_READ_SCO_FLOW_CONTROL                   0x002e
1311 #define HCI_CMD_READ_SCO_FLOW_CONTROL                   0x0C2E
1312 /* No command parameter(s) */
1313 typedef struct {
1314         uint8_t         status;       /* 0x00 - success */
1315         uint8_t         flow_control; /* 0x00 - disabled */
1316 } __attribute__ ((__packed__)) hci_read_sco_flow_control_rp;
1317
1318 #define HCI_OCF_WRITE_SCO_FLOW_CONTROL                  0x002f
1319 #define HCI_CMD_WRITE_SCO_FLOW_CONTROL                  0x0C2F
1320 typedef struct {
1321         uint8_t         flow_control; /* 0x00 - disabled */
1322 } __attribute__ ((__packed__)) hci_write_sco_flow_control_cp;
1323
1324 typedef hci_status_rp   hci_write_sco_flow_control_rp;
1325
1326 #define HCI_OCF_HC2H_FLOW_CONTROL                       0x0031
1327 #define HCI_CMD_HC2H_FLOW_CONTROL                       0x0C31
1328 typedef struct {
1329         uint8_t         hc2h_flow; /* Host Controller to Host flow control */
1330 } __attribute__ ((__packed__)) hci_hc2h_flow_control_cp;
1331
1332 typedef hci_status_rp   hci_h2hc_flow_control_rp;
1333
1334 #define HCI_OCF_HOST_BUFFER_SIZE                        0x0033
1335 #define HCI_CMD_HOST_BUFFER_SIZE                        0x0C33
1336 typedef struct {
1337         uint16_t        max_acl_size; /* Max. size of ACL packet (bytes) */
1338         uint8_t         max_sco_size; /* Max. size of SCO packet (bytes) */
1339         uint16_t        num_acl_pkts;  /* Max. number of ACL packets */
1340         uint16_t        num_sco_pkts;  /* Max. number of SCO packets */
1341 } __attribute__ ((__packed__)) hci_host_buffer_size_cp;
1342
1343 typedef hci_status_rp   hci_host_buffer_size_rp;
1344
1345 #define HCI_OCF_HOST_NUM_COMPL_PKTS                     0x0035
1346 #define HCI_CMD_HOST_NUM_COMPL_PKTS                     0x0C35
1347 typedef struct {
1348         uint8_t         nu_con_handles; /* # of connection handles */
1349 /* these are repeated "num_con_handles" times
1350         uint16_t        con_handle;    --- connection handle(s)
1351         uint16_t        compl_pkts;    --- # of completed packets */
1352 } __attribute__ ((__packed__)) hci_host_num_compl_pkts_cp;
1353 /* No return parameter(s) */
1354
1355 #define HCI_OCF_READ_LINK_SUPERVISION_TIMEOUT           0x0036
1356 #define HCI_CMD_READ_LINK_SUPERVISION_TIMEOUT           0x0C36
1357 typedef struct {
1358         uint16_t        con_handle; /* connection handle */
1359 } __attribute__ ((__packed__)) hci_read_link_supervision_timeout_cp;
1360
1361 typedef struct {
1362         uint8_t         status;     /* 0x00 - success */
1363         uint16_t        con_handle; /* connection handle */
1364         uint16_t        timeout;    /* Link supervision timeout * 0.625 msec */
1365 } __attribute__ ((__packed__)) hci_read_link_supervision_timeout_rp;
1366
1367 #define HCI_OCF_WRITE_LINK_SUPERVISION_TIMEOUT          0x0037
1368 #define HCI_CMD_WRITE_LINK_SUPERVISION_TIMEOUT          0x0C37
1369 typedef struct {
1370         uint16_t        con_handle; /* connection handle */
1371         uint16_t        timeout;    /* Link supervision timeout * 0.625 msec */
1372 } __attribute__ ((__packed__)) hci_write_link_supervision_timeout_cp;
1373
1374 typedef struct {
1375         uint8_t         status;     /* 0x00 - success */
1376         uint16_t        con_handle; /* connection handle */
1377 } __attribute__ ((__packed__)) hci_write_link_supervision_timeout_rp;
1378
1379 #define HCI_OCF_READ_NUM_SUPPORTED_IAC                  0x0038
1380 #define HCI_CMD_READ_NUM_SUPPORTED_IAC                  0x0C38
1381 /* No command parameter(s) */
1382 typedef struct {
1383         uint8_t         status;  /* 0x00 - success */
1384         uint8_t         num_iac; /* # of supported IAC during scan */
1385 } __attribute__ ((__packed__)) hci_read_num_supported_iac_rp;
1386
1387 #define HCI_OCF_READ_IAC_LAP                            0x0039
1388 #define HCI_CMD_READ_IAC_LAP                            0x0C39
1389 /* No command parameter(s) */
1390 typedef struct {
1391         uint8_t         status;  /* 0x00 - success */
1392         uint8_t         num_iac; /* # of IAC */
1393 /* these are repeated "num_iac" times
1394         uint8_t         laps[HCI_LAP_SIZE]; --- LAPs */
1395 } __attribute__ ((__packed__)) hci_read_iac_lap_rp;
1396
1397 #define HCI_OCF_WRITE_IAC_LAP                           0x003a
1398 #define HCI_CMD_WRITE_IAC_LAP                           0x0C3A
1399 typedef struct {
1400         uint8_t         num_iac; /* # of IAC */
1401 /* these are repeated "num_iac" times
1402         uint8_t         laps[HCI_LAP_SIZE]; --- LAPs */
1403 } __attribute__ ((__packed__)) hci_write_iac_lap_cp;
1404
1405 typedef hci_status_rp   hci_write_iac_lap_rp;
1406
1407 /* Read Page Scan Period Mode is deprecated */
1408 #define HCI_OCF_READ_PAGE_SCAN_PERIOD                   0x003b
1409 #define HCI_CMD_READ_PAGE_SCAN_PERIOD                   0x0C3B
1410 /* No command parameter(s) */
1411 typedef struct {
1412         uint8_t         status;                /* 0x00 - success */
1413         uint8_t         page_scan_period_mode; /* Page scan period mode */
1414 } __attribute__ ((__packed__)) hci_read_page_scan_period_rp;
1415
1416 /* Write Page Scan Period Mode is deprecated */
1417 #define HCI_OCF_WRITE_PAGE_SCAN_PERIOD                  0x003c
1418 #define HCI_CMD_WRITE_PAGE_SCAN_PERIOD                  0x0C3C
1419 typedef struct {
1420         uint8_t         page_scan_period_mode; /* Page scan period mode */
1421 } __attribute__ ((__packed__)) hci_write_page_scan_period_cp;
1422
1423 typedef hci_status_rp   hci_write_page_scan_period_rp;
1424
1425 /* Read Page Scan Mode is deprecated */
1426 #define HCI_OCF_READ_PAGE_SCAN                          0x003d
1427 #define HCI_CMD_READ_PAGE_SCAN                          0x0C3D
1428 /* No command parameter(s) */
1429 typedef struct {
1430         uint8_t         status;         /* 0x00 - success */
1431         uint8_t         page_scan_mode; /* Page scan mode */
1432 } __attribute__ ((__packed__)) hci_read_page_scan_rp;
1433
1434 /* Write Page Scan Mode is deprecated */
1435 #define HCI_OCF_WRITE_PAGE_SCAN                         0x003e
1436 #define HCI_CMD_WRITE_PAGE_SCAN                         0x0C3E
1437 typedef struct {
1438         uint8_t         page_scan_mode; /* Page scan mode */
1439 } __attribute__ ((__packed__)) hci_write_page_scan_cp;
1440
1441 typedef hci_status_rp   hci_write_page_scan_rp;
1442
1443 #define HCI_OCF_SET_AFH_CLASSIFICATION                  0x003f
1444 #define HCI_CMD_SET_AFH_CLASSIFICATION                  0x0C3F
1445 typedef struct {
1446         uint8_t         classification[10];
1447 } __attribute__ ((__packed__)) hci_set_afh_classification_cp;
1448
1449 typedef hci_status_rp   hci_set_afh_classification_rp;
1450
1451 #define HCI_OCF_READ_INQUIRY_SCAN_TYPE                  0x0042
1452 #define HCI_CMD_READ_INQUIRY_SCAN_TYPE                  0x0C42
1453 /* No command parameter(s) */
1454
1455 typedef struct {
1456         uint8_t         status;         /* 0x00 - success */
1457         uint8_t         type;           /* inquiry scan type */
1458 } __attribute__ ((__packed__)) hci_read_inquiry_scan_type_rp;
1459
1460 #define HCI_OCF_WRITE_INQUIRY_SCAN_TYPE                 0x0043
1461 #define HCI_CMD_WRITE_INQUIRY_SCAN_TYPE                 0x0C43
1462 typedef struct {
1463         uint8_t         type;           /* inquiry scan type */
1464 } __attribute__ ((__packed__)) hci_write_inquiry_scan_type_cp;
1465
1466 typedef hci_status_rp   hci_write_inquiry_scan_type_rp;
1467
1468 #define HCI_OCF_READ_INQUIRY_MODE                       0x0044
1469 #define HCI_CMD_READ_INQUIRY_MODE                       0x0C44
1470 /* No command parameter(s) */
1471
1472 typedef struct {
1473         uint8_t         status;         /* 0x00 - success */
1474         uint8_t         mode;           /* inquiry mode */
1475 } __attribute__ ((__packed__)) hci_read_inquiry_mode_rp;
1476
1477 #define HCI_OCF_WRITE_INQUIRY_MODE                      0x0045
1478 #define HCI_CMD_WRITE_INQUIRY_MODE                      0x0C45
1479 typedef struct {
1480         uint8_t         mode;           /* inquiry mode */
1481 } __attribute__ ((__packed__)) hci_write_inquiry_mode_cp;
1482
1483 typedef hci_status_rp   hci_write_inquiry_mode_rp;
1484
1485 #define HCI_OCF_READ_PAGE_SCAN_TYPE                     0x0046
1486 #define HCI_CMD_READ_PAGE_SCAN_TYPE                     0x0C46
1487 /* No command parameter(s) */
1488
1489 typedef struct {
1490         uint8_t         status;         /* 0x00 - success */
1491         uint8_t         type;           /* page scan type */
1492 } __attribute__ ((__packed__)) hci_read_page_scan_type_rp;
1493
1494 #define HCI_OCF_WRITE_PAGE_SCAN_TYPE                    0x0047
1495 #define HCI_CMD_WRITE_PAGE_SCAN_TYPE                    0x0C47
1496 typedef struct {
1497         uint8_t         type;           /* page scan type */
1498 } __attribute__ ((__packed__)) hci_write_page_scan_type_cp;
1499
1500 typedef hci_status_rp   hci_write_page_scan_type_rp;
1501
1502 #define HCI_OCF_READ_AFH_ASSESSMENT                     0x0048
1503 #define HCI_CMD_READ_AFH_ASSESSMENT                     0x0C48
1504 /* No command parameter(s) */
1505
1506 typedef struct {
1507         uint8_t         status;         /* 0x00 - success */
1508         uint8_t         mode;           /* assessment mode */
1509 } __attribute__ ((__packed__)) hci_read_afh_assessment_rp;
1510
1511 #define HCI_OCF_WRITE_AFH_ASSESSMENT                    0x0049
1512 #define HCI_CMD_WRITE_AFH_ASSESSMENT                    0x0C49
1513 typedef struct {
1514         uint8_t         mode;           /* assessment mode */
1515 } __attribute__ ((__packed__)) hci_write_afh_assessment_cp;
1516
1517 typedef hci_status_rp   hci_write_afh_assessment_rp;
1518
1519 #define HCI_OCF_READ_EXTENDED_INQUIRY_RSP               0x0051
1520 #define HCI_CMD_READ_EXTENDED_INQUIRY_RSP               0x0C51
1521 /* No command parameter(s) */
1522
1523 typedef struct {
1524         uint8_t         status;         /* 0x00 - success */
1525         uint8_t         fec_required;
1526         uint8_t         response[240];
1527 } __attribute__ ((__packed__)) hci_read_extended_inquiry_rsp_rp;
1528
1529 #define HCI_OCF_WRITE_EXTENDED_INQUIRY_RSP              0x0052
1530 #define HCI_CMD_WRITE_EXTENDED_INQUIRY_RSP              0x0C52
1531 typedef struct {
1532         uint8_t         fec_required;
1533         uint8_t         response[240];
1534 } __attribute__ ((__packed__)) hci_write_extended_inquiry_rsp_cp;
1535
1536 typedef hci_status_rp   hci_write_extended_inquiry_rsp_rp;
1537
1538 #define HCI_OCF_REFRESH_ENCRYPTION_KEY                  0x0053
1539 #define HCI_CMD_REFRESH_ENCRYPTION_KEY                  0x0C53
1540 typedef struct {
1541         uint16_t        con_handle;     /* connection handle */
1542 } __attribute__ ((__packed__)) hci_refresh_encryption_key_cp;
1543
1544 typedef hci_status_rp   hci_refresh_encryption_key_rp;
1545
1546 #define HCI_OCF_READ_SIMPLE_PAIRING_MODE                0x0055
1547 #define HCI_CMD_READ_SIMPLE_PAIRING_MODE                0x0C55
1548 /* No command parameter(s) */
1549
1550 typedef struct {
1551         uint8_t         status;         /* 0x00 - success */
1552         uint8_t         mode;           /* simple pairing mode */
1553 } __attribute__ ((__packed__)) hci_read_simple_pairing_mode_rp;
1554
1555 #define HCI_OCF_WRITE_SIMPLE_PAIRING_MODE               0x0056
1556 #define HCI_CMD_WRITE_SIMPLE_PAIRING_MODE               0x0C56
1557 typedef struct {
1558         uint8_t         mode;           /* simple pairing mode */
1559 } __attribute__ ((__packed__)) hci_write_simple_pairing_mode_cp;
1560
1561 typedef hci_status_rp   hci_write_simple_pairing_mode_rp;
1562
1563 #define HCI_OCF_READ_LOCAL_OOB_DATA                     0x0057
1564 #define HCI_CMD_READ_LOCAL_OOB_DATA                     0x0C57
1565 /* No command parameter(s) */
1566
1567 typedef struct {
1568         uint8_t         status;         /* 0x00 - success */
1569         uint8_t         c[16];          /* pairing hash */
1570         uint8_t         r[16];          /* pairing randomizer */
1571 } __attribute__ ((__packed__)) hci_read_local_oob_data_rp;
1572
1573 #define HCI_OCF_READ_INQUIRY_RSP_XMIT_POWER             0x0058
1574 #define HCI_CMD_READ_INQUIRY_RSP_XMIT_POWER             0x0C58
1575 /* No command parameter(s) */
1576
1577 typedef struct {
1578         uint8_t         status;         /* 0x00 - success */
1579         int8_t          power;          /* TX power */
1580 } __attribute__ ((__packed__)) hci_read_inquiry_rsp_xmit_power_rp;
1581
1582 #define HCI_OCF_WRITE_INQUIRY_RSP_XMIT_POWER            0x0059
1583 #define HCI_CMD_WRITE_INQUIRY_RSP_XMIT_POWER            0x0C59
1584 typedef struct {
1585         int8_t          power;          /* TX power */
1586 } __attribute__ ((__packed__)) hci_write_inquiry_rsp_xmit_power_cp;
1587
1588 typedef hci_status_rp   hci_write_inquiry_rsp_xmit_power_rp;
1589
1590 #define HCI_OCF_READ_DEFAULT_ERRDATA_REPORTING          0x005A
1591 #define HCI_CMD_READ_DEFAULT_ERRDATA_REPORTING          0x0C5A
1592 /* No command parameter(s) */
1593
1594 typedef struct {
1595         uint8_t         status;         /* 0x00 - success */
1596         uint8_t         reporting;      /* erroneous data reporting */
1597 } __attribute__ ((__packed__)) hci_read_default_errdata_reporting_rp;
1598
1599 #define HCI_OCF_WRITE_DEFAULT_ERRDATA_REPORTING         0x005B
1600 #define HCI_CMD_WRITE_DEFAULT_ERRDATA_REPORTING         0x0C5B
1601 typedef struct {
1602         uint8_t         reporting;      /* erroneous data reporting */
1603 } __attribute__ ((__packed__)) hci_write_default_errdata_reporting_cp;
1604
1605 typedef hci_status_rp   hci_write_default_errdata_reporting_rp;
1606
1607 #define HCI_OCF_ENHANCED_FLUSH                          0x005F
1608 #define HCI_CMD_ENHANCED_FLUSH                          0x0C5F
1609 typedef struct {
1610         uint16_t        con_handle;     /* connection handle */
1611         uint8_t         packet_type;
1612 } __attribute__ ((__packed__)) hci_enhanced_flush_cp;
1613
1614 /* No response parameter(s) */
1615
1616 #define HCI_OCF_SEND_KEYPRESS_NOTIFICATION              0x0060
1617 #define HCI_CMD_SEND_KEYPRESS_NOTIFICATION              0x0C60
1618 typedef struct {
1619         bdaddr_t        bdaddr;         /* remote address */
1620         uint8_t         type;           /* notification type */
1621 } __attribute__ ((__packed__)) hci_send_keypress_notification_cp;
1622
1623 typedef struct {
1624         uint8_t         status;         /* 0x00 - success */
1625         bdaddr_t        bdaddr;         /* remote address */
1626 } __attribute__ ((__packed__)) hci_send_keypress_notification_rp;
1627
1628 /**************************************************************************
1629  **************************************************************************
1630  ** OGF 0x04    Informational commands and return parameters
1631  **************************************************************************
1632  **************************************************************************/
1633
1634 #define HCI_OGF_INFO                            0x04
1635
1636 #define HCI_OCF_READ_LOCAL_VER                          0x0001
1637 #define HCI_CMD_READ_LOCAL_VER                          0x1001
1638 /* No command parameter(s) */
1639 typedef struct {
1640         uint8_t         status;         /* 0x00 - success */
1641         uint8_t         hci_version;    /* HCI version */
1642         uint16_t        hci_revision;   /* HCI revision */
1643         uint8_t         lmp_version;    /* LMP version */
1644         uint16_t        manufacturer;   /* Hardware manufacturer name */
1645         uint16_t        lmp_subversion; /* LMP sub-version */
1646 } __attribute__ ((__packed__)) hci_read_local_ver_rp;
1647
1648 #define HCI_OCF_READ_LOCAL_COMMANDS                     0x0002
1649 #define HCI_CMD_READ_LOCAL_COMMANDS                     0x1002
1650 /* No command parameter(s) */
1651 typedef struct {
1652         uint8_t         status;         /* 0x00 - success */
1653         uint8_t         commands[HCI_COMMANDS_SIZE];    /* opcode bitmask */
1654 } __attribute__ ((__packed__)) hci_read_local_commands_rp;
1655
1656 #define HCI_OCF_READ_LOCAL_FEATURES                     0x0003
1657 #define HCI_CMD_READ_LOCAL_FEATURES                     0x1003
1658 /* No command parameter(s) */
1659 typedef struct {
1660         uint8_t         status;                      /* 0x00 - success */
1661         uint8_t         features[HCI_FEATURES_SIZE]; /* LMP features bitmsk*/
1662 } __attribute__ ((__packed__)) hci_read_local_features_rp;
1663
1664 #define HCI_OCF_READ_LOCAL_EXTENDED_FEATURES            0x0004
1665 #define HCI_CMD_READ_LOCAL_EXTENDED_FEATURES            0x1004
1666 typedef struct {
1667         uint8_t         page;           /* page number */
1668 } __attribute__ ((__packed__)) hci_read_local_extended_features_cp;
1669
1670 typedef struct {
1671         uint8_t         status;         /* 0x00 - success */
1672         uint8_t         page;           /* page number */
1673         uint8_t         max_page;       /* maximum page number */
1674         uint8_t         features[HCI_FEATURES_SIZE];    /* LMP features */
1675 } __attribute__ ((__packed__)) hci_read_local_extended_features_rp;
1676
1677 #define HCI_OCF_READ_BUFFER_SIZE                        0x0005
1678 #define HCI_CMD_READ_BUFFER_SIZE                        0x1005
1679 /* No command parameter(s) */
1680 typedef struct {
1681         uint8_t         status;       /* 0x00 - success */
1682         uint16_t        max_acl_size; /* Max. size of ACL packet (bytes) */
1683         uint8_t         max_sco_size; /* Max. size of SCO packet (bytes) */
1684         uint16_t        num_acl_pkts;  /* Max. number of ACL packets */
1685         uint16_t        num_sco_pkts;  /* Max. number of SCO packets */
1686 } __attribute__ ((__packed__)) hci_read_buffer_size_rp;
1687
1688 /* Read Country Code is deprecated */
1689 #define HCI_OCF_READ_COUNTRY_CODE                       0x0007
1690 #define HCI_CMD_READ_COUNTRY_CODE                       0x1007
1691 /* No command parameter(s) */
1692 typedef struct {
1693         uint8_t         status;       /* 0x00 - success */
1694         uint8_t         country_code; /* 0x00 - NAM, EUR, JP; 0x01 - France */
1695 } __attribute__ ((__packed__)) hci_read_country_code_rp;
1696
1697 #define HCI_OCF_READ_BDADDR                             0x0009
1698 #define HCI_CMD_READ_BDADDR                             0x1009
1699 /* No command parameter(s) */
1700 typedef struct {
1701         uint8_t         status; /* 0x00 - success */
1702         bdaddr_t        bdaddr; /* unit address */
1703 } __attribute__ ((__packed__)) hci_read_bdaddr_rp;
1704
1705 /**************************************************************************
1706  **************************************************************************
1707  ** OGF 0x05    Status commands and return parameters
1708  **************************************************************************
1709  **************************************************************************/
1710
1711 #define HCI_OGF_STATUS                          0x05
1712
1713 #define HCI_OCF_READ_FAILED_CONTACT_CNTR                0x0001
1714 #define HCI_CMD_READ_FAILED_CONTACT_CNTR                0x1401
1715 typedef struct {
1716         uint16_t        con_handle; /* connection handle */
1717 } __attribute__ ((__packed__)) hci_read_failed_contact_cntr_cp;
1718
1719 typedef struct {
1720         uint8_t         status;     /* 0x00 - success */
1721         uint16_t        con_handle; /* connection handle */
1722         uint16_t        counter;    /* number of consecutive failed contacts */
1723 } __attribute__ ((__packed__)) hci_read_failed_contact_cntr_rp;
1724
1725 #define HCI_OCF_RESET_FAILED_CONTACT_CNTR               0x0002
1726 #define HCI_CMD_RESET_FAILED_CONTACT_CNTR               0x1402
1727 typedef struct {
1728         uint16_t        con_handle; /* connection handle */
1729 } __attribute__ ((__packed__)) hci_reset_failed_contact_cntr_cp;
1730
1731 typedef struct {
1732         uint8_t         status;     /* 0x00 - success */
1733         uint16_t        con_handle; /* connection handle */
1734 } __attribute__ ((__packed__)) hci_reset_failed_contact_cntr_rp;
1735
1736 #define HCI_OCF_READ_LINK_QUALITY                       0x0003
1737 #define HCI_CMD_READ_LINK_QUALITY                       0x1403
1738 typedef struct {
1739         uint16_t        con_handle; /* connection handle */
1740 } __attribute__ ((__packed__)) hci_read_link_quality_cp;
1741
1742 typedef struct {
1743         uint8_t         status;     /* 0x00 - success */
1744         uint16_t        con_handle; /* connection handle */
1745         uint8_t         quality;    /* higher value means better quality */
1746 } __attribute__ ((__packed__)) hci_read_link_quality_rp;
1747
1748 #define HCI_OCF_READ_RSSI                               0x0005
1749 #define HCI_CMD_READ_RSSI                               0x1405
1750 typedef struct {
1751         uint16_t        con_handle; /* connection handle */
1752 } __attribute__ ((__packed__)) hci_read_rssi_cp;
1753
1754 typedef struct {
1755         uint8_t         status;     /* 0x00 - success */
1756         uint16_t        con_handle; /* connection handle */
1757         char            rssi;       /* -127 <= rssi <= 127 dB */
1758 } __attribute__ ((__packed__)) hci_read_rssi_rp;
1759
1760 #define HCI_OCF_READ_AFH_CHANNEL_MAP                    0x0006
1761 #define HCI_CMD_READ_AFH_CHANNEL_MAP                    0x1406
1762 typedef struct {
1763         uint16_t        con_handle; /* connection handle */
1764 } __attribute__ ((__packed__)) hci_read_afh_channel_map_cp;
1765
1766 typedef struct {
1767         uint8_t         status;     /* 0x00 - success */
1768         uint16_t        con_handle; /* connection handle */
1769         uint8_t         mode;       /* AFH mode */
1770         uint8_t         map[10];    /* AFH Channel Map */
1771 } __attribute__ ((__packed__)) hci_read_afh_channel_map_rp;
1772
1773 #define HCI_OCF_READ_CLOCK                              0x0007
1774 #define HCI_CMD_READ_CLOCK                              0x1407
1775 typedef struct {
1776         uint16_t        con_handle;     /* connection handle */
1777         uint8_t         clock;          /* which clock */
1778 } __attribute__ ((__packed__)) hci_read_clock_cp;
1779
1780 typedef struct {
1781         uint8_t         status;         /* 0x00 - success */
1782         uint16_t        con_handle;     /* connection handle */
1783         uint32_t        clock;          /* clock value */
1784         uint16_t        accuracy;       /* clock accuracy */
1785 } __attribute__ ((__packed__)) hci_read_clock_rp;
1786
1787
1788 /**************************************************************************
1789  **************************************************************************
1790  ** OGF 0x06    Testing commands and return parameters
1791  **************************************************************************
1792  **************************************************************************/
1793
1794 #define HCI_OGF_TESTING                         0x06
1795
1796 #define HCI_OCF_READ_LOOPBACK_MODE                      0x0001
1797 #define HCI_CMD_READ_LOOPBACK_MODE                      0x1801
1798 /* No command parameter(s) */
1799 typedef struct {
1800         uint8_t         status; /* 0x00 - success */
1801         uint8_t         lbmode; /* loopback mode */
1802 } __attribute__ ((__packed__)) hci_read_loopback_mode_rp;
1803
1804 #define HCI_OCF_WRITE_LOOPBACK_MODE                     0x0002
1805 #define HCI_CMD_WRITE_LOOPBACK_MODE                     0x1802
1806 typedef struct {
1807         uint8_t         lbmode; /* loopback mode */
1808 } __attribute__ ((__packed__)) hci_write_loopback_mode_cp;
1809
1810 typedef hci_status_rp   hci_write_loopback_mode_rp;
1811
1812 #define HCI_OCF_ENABLE_UNIT_UNDER_TEST                  0x0003
1813 #define HCI_CMD_ENABLE_UNIT_UNDER_TEST                  0x1803
1814 /* No command parameter(s) */
1815 typedef hci_status_rp   hci_enable_unit_under_test_rp;
1816
1817 #define HCI_OCF_WRITE_SIMPLE_PAIRING_DEBUG_MODE         0x0004
1818 #define HCI_CMD_WRITE_SIMPLE_PAIRING_DEBUG_MODE         0x1804
1819 typedef struct {
1820         uint8_t         mode;   /* simple pairing debug mode */
1821 } __attribute__ ((__packed__)) hci_write_simple_pairing_debug_mode_cp;
1822
1823 typedef hci_status_rp   hci_write_simple_pairing_debug_mode_rp;
1824
1825 /**************************************************************************
1826  **************************************************************************
1827  ** OGF 0x3e    Bluetooth Logo Testing
1828  ** OGF 0x3f    Vendor Specific
1829  **************************************************************************
1830  **************************************************************************/
1831
1832 #define HCI_OGF_BT_LOGO                         0x3e
1833 #define HCI_OGF_VENDOR                          0x3f
1834
1835 /* Ericsson specific FC */
1836 #define HCI_CMD_ERICSSON_WRITE_PCM_SETTINGS             0xFC07
1837 #define HCI_CMD_ERICSSON_SET_UART_BAUD_RATE             0xFC09
1838 #define HCI_CMD_ERICSSON_SET_SCO_DATA_PATH              0xFC1D
1839
1840 /* Cambridge Silicon Radio specific FC */
1841 #define HCI_CMD_CSR_EXTN                                0xFC00
1842
1843
1844 /**************************************************************************
1845  **************************************************************************
1846  **                         Events and event parameters
1847  **************************************************************************
1848  **************************************************************************/
1849
1850 #define HCI_EVENT_INQUIRY_COMPL                 0x01
1851 typedef struct {
1852         uint8_t         status; /* 0x00 - success */
1853 } __attribute__ ((__packed__)) hci_inquiry_compl_ep;
1854
1855 #define HCI_EVENT_INQUIRY_RESULT                0x02
1856 typedef struct {
1857         uint8_t         num_responses;      /* number of responses */
1858 /*      hci_inquiry_response[num_responses]   -- see below */
1859 } __attribute__ ((__packed__)) hci_inquiry_result_ep;
1860
1861 typedef struct {
1862         bdaddr_t        bdaddr;                   /* unit address */
1863         uint8_t         page_scan_rep_mode;       /* page scan rep. mode */
1864         uint8_t         page_scan_period_mode;    /* page scan period mode */
1865         uint8_t         page_scan_mode;           /* page scan mode */
1866         uint8_t         uclass[HCI_CLASS_SIZE];   /* unit class */
1867         uint16_t        clock_offset;             /* clock offset */
1868 } __attribute__ ((__packed__)) hci_inquiry_response;
1869
1870 #define HCI_EVENT_CON_COMPL                     0x03
1871 typedef struct {
1872         uint8_t         status;          /* 0x00 - success */
1873         uint16_t        con_handle;      /* Connection handle */
1874         bdaddr_t        bdaddr;          /* remote unit address */
1875         uint8_t         link_type;       /* Link type */
1876         uint8_t         encryption_mode; /* Encryption mode */
1877 } __attribute__ ((__packed__)) hci_con_compl_ep;
1878
1879 #define HCI_EVENT_CON_REQ                       0x04
1880 typedef struct {
1881         bdaddr_t        bdaddr;                 /* remote unit address */
1882         uint8_t         uclass[HCI_CLASS_SIZE]; /* remote unit class */
1883         uint8_t         link_type;              /* link type */
1884 } __attribute__ ((__packed__)) hci_con_req_ep;
1885
1886 #define HCI_EVENT_DISCON_COMPL                  0x05
1887 typedef struct {
1888         uint8_t         status;     /* 0x00 - success */
1889         uint16_t        con_handle; /* connection handle */
1890         uint8_t         reason;     /* reason to disconnect */
1891 } __attribute__ ((__packed__)) hci_discon_compl_ep;
1892
1893 #define HCI_EVENT_AUTH_COMPL                    0x06
1894 typedef struct {
1895         uint8_t         status;     /* 0x00 - success */
1896         uint16_t        con_handle; /* connection handle */
1897 } __attribute__ ((__packed__)) hci_auth_compl_ep;
1898
1899 #define HCI_EVENT_REMOTE_NAME_REQ_COMPL         0x07
1900 typedef struct {
1901         uint8_t         status;                   /* 0x00 - success */
1902         bdaddr_t        bdaddr;                   /* remote unit address */
1903         char            name[HCI_UNIT_NAME_SIZE]; /* remote unit name */
1904 } __attribute__ ((__packed__)) hci_remote_name_req_compl_ep;
1905
1906 #define HCI_EVENT_ENCRYPTION_CHANGE             0x08
1907 typedef struct {
1908         uint8_t         status;            /* 0x00 - success */
1909         uint16_t        con_handle;        /* Connection handle */
1910         uint8_t         encryption_enable; /* 0x00 - disable */
1911 } __attribute__ ((__packed__)) hci_encryption_change_ep;
1912
1913 #define HCI_EVENT_CHANGE_CON_LINK_KEY_COMPL     0x09
1914 typedef struct {
1915         uint8_t         status;     /* 0x00 - success */
1916         uint16_t        con_handle; /* Connection handle */
1917 } __attribute__ ((__packed__)) hci_change_con_link_key_compl_ep;
1918
1919 #define HCI_EVENT_MASTER_LINK_KEY_COMPL         0x0a
1920 typedef struct {
1921         uint8_t         status;     /* 0x00 - success */
1922         uint16_t        con_handle; /* Connection handle */
1923         uint8_t         key_flag;   /* Key flag */
1924 } __attribute__ ((__packed__)) hci_master_link_key_compl_ep;
1925
1926 #define HCI_EVENT_READ_REMOTE_FEATURES_COMPL    0x0b
1927 typedef struct {
1928         uint8_t         status;                      /* 0x00 - success */
1929         uint16_t        con_handle;                  /* Connection handle */
1930         uint8_t         features[HCI_FEATURES_SIZE]; /* LMP features bitmsk*/
1931 } __attribute__ ((__packed__)) hci_read_remote_features_compl_ep;
1932
1933 #define HCI_EVENT_READ_REMOTE_VER_INFO_COMPL    0x0c
1934 typedef struct {
1935         uint8_t         status;         /* 0x00 - success */
1936         uint16_t        con_handle;     /* Connection handle */
1937         uint8_t         lmp_version;    /* LMP version */
1938         uint16_t        manufacturer;   /* Hardware manufacturer name */
1939         uint16_t        lmp_subversion; /* LMP sub-version */
1940 } __attribute__ ((__packed__)) hci_read_remote_ver_info_compl_ep;
1941
1942 #define HCI_EVENT_QOS_SETUP_COMPL               0x0d
1943 typedef struct {
1944         uint8_t         status;          /* 0x00 - success */
1945         uint16_t        con_handle;      /* connection handle */
1946         uint8_t         flags;           /* reserved for future use */
1947         uint8_t         service_type;    /* service type */
1948         uint32_t        token_rate;      /* bytes per second */
1949         uint32_t        peak_bandwidth;  /* bytes per second */
1950         uint32_t        latency;         /* microseconds */
1951         uint32_t        delay_variation; /* microseconds */
1952 } __attribute__ ((__packed__)) hci_qos_setup_compl_ep;
1953
1954 #define HCI_EVENT_COMMAND_COMPL                 0x0e
1955 typedef struct {
1956         uint8_t         num_cmd_pkts; /* # of HCI command packets */
1957         uint16_t        opcode;       /* command OpCode */
1958         /* command return parameters (if any) */
1959 } __attribute__ ((__packed__)) hci_command_compl_ep;
1960
1961 #define HCI_EVENT_COMMAND_STATUS                0x0f
1962 typedef struct {
1963         uint8_t         status;       /* 0x00 - pending */
1964         uint8_t         num_cmd_pkts; /* # of HCI command packets */
1965         uint16_t        opcode;       /* command OpCode */
1966 } __attribute__ ((__packed__)) hci_command_status_ep;
1967
1968 #define HCI_EVENT_HARDWARE_ERROR                0x10
1969 typedef struct {
1970         uint8_t         hardware_code; /* hardware error code */
1971 } __attribute__ ((__packed__)) hci_hardware_error_ep;
1972
1973 #define HCI_EVENT_FLUSH_OCCUR                   0x11
1974 typedef struct {
1975         uint16_t        con_handle; /* connection handle */
1976 } __attribute__ ((__packed__)) hci_flush_occur_ep;
1977
1978 #define HCI_EVENT_ROLE_CHANGE                   0x12
1979 typedef struct {
1980         uint8_t         status; /* 0x00 - success */
1981         bdaddr_t        bdaddr; /* address of remote unit */
1982         uint8_t         role;   /* new connection role */
1983 } __attribute__ ((__packed__)) hci_role_change_ep;
1984
1985 #define HCI_EVENT_NUM_COMPL_PKTS                0x13
1986 typedef struct {
1987         uint8_t         num_con_handles; /* # of connection handles */
1988 /* these are repeated "num_con_handles" times
1989         uint16_t        con_handle; --- connection handle(s)
1990         uint16_t        compl_pkts; --- # of completed packets */
1991 } __attribute__ ((__packed__)) hci_num_compl_pkts_ep;
1992
1993 #define HCI_EVENT_MODE_CHANGE                   0x14
1994 typedef struct {
1995         uint8_t         status;     /* 0x00 - success */
1996         uint16_t        con_handle; /* connection handle */
1997         uint8_t         unit_mode;  /* remote unit mode */
1998         uint16_t        interval;   /* interval * 0.625 msec */
1999 } __attribute__ ((__packed__)) hci_mode_change_ep;
2000
2001 #define HCI_EVENT_RETURN_LINK_KEYS              0x15
2002 typedef struct {
2003         uint8_t         num_keys; /* # of keys */
2004 /* these are repeated "num_keys" times
2005         bdaddr_t        bdaddr;               --- remote address(es)
2006         uint8_t         key[HCI_KEY_SIZE]; --- key(s) */
2007 } __attribute__ ((__packed__)) hci_return_link_keys_ep;
2008
2009 #define HCI_EVENT_PIN_CODE_REQ                  0x16
2010 typedef struct {
2011         bdaddr_t        bdaddr; /* remote unit address */
2012 } __attribute__ ((__packed__)) hci_pin_code_req_ep;
2013
2014 #define HCI_EVENT_LINK_KEY_REQ                  0x17
2015 typedef struct {
2016         bdaddr_t        bdaddr; /* remote unit address */
2017 } __attribute__ ((__packed__)) hci_link_key_req_ep;
2018
2019 #define HCI_EVENT_LINK_KEY_NOTIFICATION         0x18
2020 typedef struct {
2021         bdaddr_t        bdaddr;            /* remote unit address */
2022         uint8_t         key[HCI_KEY_SIZE]; /* link key */
2023         uint8_t         key_type;          /* type of the key */
2024 } __attribute__ ((__packed__)) hci_link_key_notification_ep;
2025
2026 #define HCI_EVENT_LOOPBACK_COMMAND              0x19
2027 typedef hci_cmd_hdr_t   hci_loopback_command_ep;
2028
2029 #define HCI_EVENT_DATA_BUFFER_OVERFLOW          0x1a
2030 typedef struct {
2031         uint8_t         link_type; /* Link type */
2032 } __attribute__ ((__packed__)) hci_data_buffer_overflow_ep;
2033
2034 #define HCI_EVENT_MAX_SLOT_CHANGE               0x1b
2035 typedef struct {
2036         uint16_t        con_handle;    /* connection handle */
2037         uint8_t         lmp_max_slots; /* Max. # of slots allowed */
2038 } __attribute__ ((__packed__)) hci_max_slot_change_ep;
2039
2040 #define HCI_EVENT_READ_CLOCK_OFFSET_COMPL       0x1c
2041 typedef struct {
2042         uint8_t         status;       /* 0x00 - success */
2043         uint16_t        con_handle;   /* Connection handle */
2044         uint16_t        clock_offset; /* Clock offset */
2045 } __attribute__ ((__packed__)) hci_read_clock_offset_compl_ep;
2046
2047 #define HCI_EVENT_CON_PKT_TYPE_CHANGED          0x1d
2048 typedef struct {
2049         uint8_t         status;     /* 0x00 - success */
2050         uint16_t        con_handle; /* connection handle */
2051         uint16_t        pkt_type;   /* packet type */
2052 } __attribute__ ((__packed__)) hci_con_pkt_type_changed_ep;
2053
2054 #define HCI_EVENT_QOS_VIOLATION                 0x1e
2055 typedef struct {
2056         uint16_t        con_handle; /* connection handle */
2057 } __attribute__ ((__packed__)) hci_qos_violation_ep;
2058
2059 /* Page Scan Mode Change Event is deprecated */
2060 #define HCI_EVENT_PAGE_SCAN_MODE_CHANGE         0x1f
2061 typedef struct {
2062         bdaddr_t        bdaddr;         /* destination address */
2063         uint8_t         page_scan_mode; /* page scan mode */
2064 } __attribute__ ((__packed__)) hci_page_scan_mode_change_ep;
2065
2066 #define HCI_EVENT_PAGE_SCAN_REP_MODE_CHANGE     0x20
2067 typedef struct {
2068         bdaddr_t        bdaddr;             /* destination address */
2069         uint8_t         page_scan_rep_mode; /* page scan repetition mode */
2070 } __attribute__ ((__packed__)) hci_page_scan_rep_mode_change_ep;
2071
2072 #define HCI_EVENT_FLOW_SPECIFICATION_COMPL      0x21
2073 typedef struct {
2074         uint8_t         status;         /* 0x00 - success */
2075         uint16_t        con_handle;     /* connection handle */
2076         uint8_t         flags;          /* reserved */
2077         uint8_t         direction;      /* flow direction */
2078         uint8_t         type;           /* service type */
2079         uint32_t        token_rate;     /* token rate */
2080         uint32_t        bucket_size;    /* token bucket size */
2081         uint32_t        peak_bandwidth; /* peak bandwidth */
2082         uint32_t        latency;        /* access latency */
2083 } __attribute__ ((__packed__)) hci_flow_specification_compl_ep;
2084
2085 #define HCI_EVENT_RSSI_RESULT                   0x22
2086 typedef struct {
2087         uint8_t         num_responses;      /* number of responses */
2088 /*      hci_rssi_response[num_responses]   -- see below */
2089 } __attribute__ ((__packed__)) hci_rssi_result_ep;
2090
2091 typedef struct {
2092         bdaddr_t        bdaddr;                 /* unit address */
2093         uint8_t         page_scan_rep_mode;     /* page scan rep. mode */
2094         uint8_t         blank;                  /* reserved */
2095         uint8_t         uclass[HCI_CLASS_SIZE]; /* unit class */
2096         uint16_t        clock_offset;           /* clock offset */
2097         int8_t          rssi;                   /* rssi */
2098 } __attribute__ ((__packed__)) hci_rssi_response;
2099
2100 #define HCI_EVENT_READ_REMOTE_EXTENDED_FEATURES 0x23
2101 typedef struct {
2102         uint8_t         status;         /* 0x00 - success */
2103         uint16_t        con_handle;     /* connection handle */
2104         uint8_t         page;           /* page number */
2105         uint8_t         max;            /* max page number */
2106         uint8_t         features[HCI_FEATURES_SIZE]; /* LMP features bitmsk*/
2107 } __attribute__ ((__packed__)) hci_read_remote_extended_features_ep;
2108
2109 #define HCI_EVENT_SCO_CON_COMPL                 0x2c
2110 typedef struct {
2111         uint8_t         status;         /* 0x00 - success */
2112         uint16_t        con_handle;     /* connection handle */
2113         bdaddr_t        bdaddr;         /* unit address */
2114         uint8_t         link_type;      /* link type */
2115         uint8_t         interval;       /* transmission interval */
2116         uint8_t         window;         /* retransmission window */
2117         uint16_t        rxlen;          /* rx packet length */
2118         uint16_t        txlen;          /* tx packet length */
2119         uint8_t         mode;           /* air mode */
2120 } __attribute__ ((__packed__)) hci_sco_con_compl_ep;
2121
2122 #define HCI_EVENT_SCO_CON_CHANGED               0x2d
2123 typedef struct {
2124         uint8_t         status;         /* 0x00 - success */
2125         uint16_t        con_handle;     /* connection handle */
2126         uint8_t         interval;       /* transmission interval */
2127         uint8_t         window;         /* retransmission window */
2128         uint16_t        rxlen;          /* rx packet length */
2129         uint16_t        txlen;          /* tx packet length */
2130 } __attribute__ ((__packed__)) hci_sco_con_changed_ep;
2131
2132 #define HCI_EVENT_SNIFF_SUBRATING               0x2e
2133 typedef struct {
2134         uint8_t         status;         /* 0x00 - success */
2135         uint16_t        con_handle;     /* connection handle */
2136         uint16_t        tx_latency;     /* max transmit latency */
2137         uint16_t        rx_latency;     /* max receive latency */
2138         uint16_t        remote_timeout; /* remote timeout */
2139         uint16_t        local_timeout;  /* local timeout */
2140 } __attribute__ ((__packed__)) hci_sniff_subrating_ep;
2141
2142 #define HCI_EVENT_EXTENDED_RESULT               0x2f
2143 typedef struct {
2144         uint8_t         num_responses;  /* must be 0x01 */
2145         bdaddr_t        bdaddr;         /* remote device address */
2146         uint8_t         page_scan_rep_mode;
2147         uint8_t         reserved;
2148         uint8_t         uclass[HCI_CLASS_SIZE];
2149         uint16_t        clock_offset;
2150         int8_t          rssi;
2151         uint8_t         response[240];  /* extended inquiry response */
2152 } __attribute__ ((__packed__)) hci_extended_result_ep;
2153
2154 #define HCI_EVENT_ENCRYPTION_KEY_REFRESH        0x30
2155 typedef struct {
2156         uint8_t         status;         /* 0x00 - success */
2157         uint16_t        con_handle;     /* connection handle */
2158 } __attribute__ ((__packed__)) hci_encryption_key_refresh_ep;
2159
2160 #define HCI_EVENT_IO_CAPABILITY_REQ             0x31
2161 typedef struct {
2162         bdaddr_t        bdaddr;         /* remote device address */
2163 } __attribute__ ((__packed__)) hci_io_capability_req_ep;
2164
2165 #define HCI_EVENT_IO_CAPABILITY_RSP             0x32
2166 typedef struct {
2167         bdaddr_t        bdaddr;         /* remote device address */
2168         uint8_t         io_capability;
2169         uint8_t         oob_data_present;
2170         uint8_t         auth_requirement;
2171 } __attribute__ ((__packed__)) hci_io_capability_rsp_ep;
2172
2173 #define HCI_EVENT_USER_CONFIRM_REQ              0x33
2174 typedef struct {
2175         bdaddr_t        bdaddr;         /* remote device address */
2176         uint32_t        value;          /* 000000 - 999999 */
2177 } __attribute__ ((__packed__)) hci_user_confirm_req_ep;
2178
2179 #define HCI_EVENT_USER_PASSKEY_REQ              0x34
2180 typedef struct {
2181         bdaddr_t        bdaddr;         /* remote device address */
2182 } __attribute__ ((__packed__)) hci_user_passkey_req_ep;
2183
2184 #define HCI_EVENT_REMOTE_OOB_DATA_REQ           0x35
2185 typedef struct {
2186         bdaddr_t        bdaddr;         /* remote device address */
2187 } __attribute__ ((__packed__)) hci_remote_oob_data_req_ep;
2188
2189 #define HCI_EVENT_SIMPLE_PAIRING_COMPL          0x36
2190 typedef struct {
2191         uint8_t         status;         /* 0x00 - success */
2192         bdaddr_t        bdaddr;         /* remote device address */
2193 } __attribute__ ((__packed__)) hci_simple_pairing_compl_ep;
2194
2195 #define HCI_EVENT_LINK_SUPERVISION_TO_CHANGED   0x38
2196 typedef struct {
2197         uint16_t        con_handle;     /* connection handle */
2198         uint16_t        timeout;        /* link supervision timeout */
2199 } __attribute__ ((__packed__)) hci_link_supervision_to_changed_ep;
2200
2201 #define HCI_EVENT_ENHANCED_FLUSH_COMPL          0x39
2202 typedef struct {
2203         uint16_t        con_handle;     /* connection handle */
2204 } __attribute__ ((__packed__)) hci_enhanced_flush_compl_ep;
2205
2206 #define HCI_EVENT_USER_PASSKEY_NOTIFICATION     0x3b
2207 typedef struct {
2208         bdaddr_t        bdaddr;         /* remote device address */
2209         uint32_t        value;          /* 000000 - 999999 */
2210 } __attribute__ ((__packed__)) hci_user_passkey_notification_ep;
2211
2212 #define HCI_EVENT_KEYPRESS_NOTIFICATION         0x3c
2213 typedef struct {
2214         bdaddr_t        bdaddr;         /* remote device address */
2215         uint8_t         notification_type;
2216 } __attribute__ ((__packed__)) hci_keypress_notification_ep;
2217
2218 #define HCI_EVENT_REMOTE_FEATURES_NOTIFICATION  0x3d
2219 typedef struct {
2220         bdaddr_t        bdaddr;         /* remote device address */
2221         uint8_t         features[HCI_FEATURES_SIZE]; /* LMP features bitmsk*/
2222 } __attribute__ ((__packed__)) hci_remote_features_notification_ep;
2223
2224 #define HCI_EVENT_BT_LOGO                       0xfe
2225
2226 #define HCI_EVENT_VENDOR                        0xff
2227
2228 /**************************************************************************
2229  **************************************************************************
2230  **                 HCI Socket Definitions
2231  **************************************************************************
2232  **************************************************************************/
2233
2234 /* HCI socket options */
2235 #define SO_HCI_EVT_FILTER               1       /* get/set event filter */
2236 #define SO_HCI_PKT_FILTER               2       /* get/set packet filter */
2237 #define SO_HCI_DIRECTION                3       /* packet direction indicator */
2238
2239 /* Control Messages */
2240 #define SCM_HCI_DIRECTION               SO_HCI_DIRECTION
2241
2242 /*
2243  * HCI socket filter and get/set routines
2244  *
2245  * for ease of use, we filter 256 possible events/packets
2246  */
2247 struct hci_filter {
2248         uint32_t        mask[8];        /* 256 bits */
2249 };
2250
2251 static __inline void
2252 hci_filter_set(uint8_t bit, struct hci_filter *filter)
2253 {
2254         uint8_t off = bit - 1;
2255
2256         off >>= 5;
2257         filter->mask[off] |= (1 << ((bit - 1) & 0x1f));
2258 }
2259
2260 static __inline void
2261 hci_filter_clr(uint8_t bit, struct hci_filter *filter)
2262 {
2263         uint8_t off = bit - 1;
2264
2265         off >>= 5;
2266         filter->mask[off] &= ~(1 << ((bit - 1) & 0x1f));
2267 }
2268
2269 static __inline int
2270 hci_filter_test(uint8_t bit, struct hci_filter *filter)
2271 {
2272         uint8_t off = bit - 1;
2273
2274         off >>= 5;
2275         return (filter->mask[off] & (1 << ((bit - 1) & 0x1f)));
2276 }
2277
2278 /*
2279  * HCI socket ioctl's
2280  *
2281  * Apart from GBTINFOA, these are all indexed on the unit name
2282  */
2283
2284 #define SIOCGBTINFO     _IOWR('b',  5, struct btreq) /* get unit info */
2285 #define SIOCGBTINFOA    _IOWR('b',  6, struct btreq) /* get info by address */
2286 #define SIOCNBTINFO     _IOWR('b',  7, struct btreq) /* next unit info */
2287
2288 #define SIOCSBTFLAGS    _IOWR('b',  8, struct btreq) /* set unit flags */
2289 #define SIOCSBTPOLICY   _IOWR('b',  9, struct btreq) /* set unit link policy */
2290 #define SIOCSBTPTYPE    _IOWR('b', 10, struct btreq) /* set unit packet type */
2291
2292 #define SIOCGBTSTATS    _IOWR('b', 11, struct btreq) /* get unit statistics */
2293 #define SIOCZBTSTATS    _IOWR('b', 12, struct btreq) /* zero unit statistics */
2294
2295 #define SIOCBTDUMP       _IOW('b', 13, struct btreq) /* print debug info */
2296 #define SIOCSBTSCOMTU   _IOWR('b', 17, struct btreq) /* set sco_mtu value */
2297
2298 struct bt_stats {
2299         uint32_t        err_tx;
2300         uint32_t        err_rx;
2301         uint32_t        cmd_tx;
2302         uint32_t        evt_rx;
2303         uint32_t        acl_tx;
2304         uint32_t        acl_rx;
2305         uint32_t        sco_tx;
2306         uint32_t        sco_rx;
2307         uint32_t        byte_tx;
2308         uint32_t        byte_rx;
2309 };
2310
2311 struct btreq {
2312         char    btr_name[HCI_DEVNAME_SIZE];     /* device name */
2313
2314         union {
2315             struct {
2316                 bdaddr_t btri_bdaddr;           /* device bdaddr */
2317                 uint16_t btri_flags;            /* flags */
2318                 uint16_t btri_num_cmd;          /* # of free cmd buffers */
2319                 uint16_t btri_num_acl;          /* # of free ACL buffers */
2320                 uint16_t btri_num_sco;          /* # of free SCO buffers */
2321                 uint16_t btri_acl_mtu;          /* ACL mtu */
2322                 uint16_t btri_sco_mtu;          /* SCO mtu */
2323                 uint16_t btri_link_policy;      /* Link Policy */
2324                 uint16_t btri_packet_type;      /* Packet Type */
2325             } btri;
2326             struct bt_stats btrs;   /* unit stats */
2327         } btru;
2328 };
2329
2330 #define btr_flags       btru.btri.btri_flags
2331 #define btr_bdaddr      btru.btri.btri_bdaddr
2332 #define btr_num_cmd     btru.btri.btri_num_cmd
2333 #define btr_num_acl     btru.btri.btri_num_acl
2334 #define btr_num_sco     btru.btri.btri_num_sco
2335 #define btr_acl_mtu     btru.btri.btri_acl_mtu
2336 #define btr_sco_mtu     btru.btri.btri_sco_mtu
2337 #define btr_link_policy btru.btri.btri_link_policy
2338 #define btr_packet_type btru.btri.btri_packet_type
2339 #define btr_stats       btru.btrs
2340
2341 /* hci_unit & btr_flags */
2342 #define BTF_UP                  (1<<0)  /* unit is up */
2343 #define BTF_RUNNING             (1<<1)  /* unit is running */
2344 #define BTF_XMIT_CMD            (1<<2)  /* unit is transmitting CMD packets */
2345 #define BTF_XMIT_ACL            (1<<3)  /* unit is transmitting ACL packets */
2346 #define BTF_XMIT_SCO            (1<<4)  /* unit is transmitting SCO packets */
2347 #define BTF_XMIT                (BTF_XMIT_CMD | BTF_XMIT_ACL | BTF_XMIT_SCO)
2348 #define BTF_INIT_BDADDR         (1<<5)  /* waiting for bdaddr */
2349 #define BTF_INIT_BUFFER_SIZE    (1<<6)  /* waiting for buffer size */
2350 #define BTF_INIT_FEATURES       (1<<7)  /* waiting for features */
2351 #define BTF_POWER_UP_NOOP       (1<<8)  /* should wait for No-op on power up */
2352 #define BTF_INIT_COMMANDS       (1<<9)  /* waiting for supported commands */
2353
2354 #define BTF_INIT                (BTF_INIT_BDADDR        \
2355                                 | BTF_INIT_BUFFER_SIZE  \
2356                                 | BTF_INIT_FEATURES     \
2357                                 | BTF_INIT_COMMANDS)
2358
2359 /**************************************************************************
2360  **************************************************************************
2361  **                 HCI Kernel Definitions
2362  **************************************************************************
2363  **************************************************************************/
2364
2365 #ifdef _KERNEL
2366
2367 #include <net/if.h>             /* for struct ifqueue */
2368
2369 struct l2cap_channel;
2370 struct mbuf;
2371 struct sco_pcb;
2372 struct socket;
2373
2374 /* global HCI kernel variables */
2375
2376 /* sysctl variables */
2377 extern int hci_memo_expiry;
2378 extern int hci_acl_expiry;
2379 extern int hci_sendspace, hci_recvspace;
2380 extern int hci_eventq_max, hci_aclrxq_max, hci_scorxq_max;
2381
2382 /*
2383  * HCI Connection Information
2384  */
2385 struct hci_link {
2386         struct hci_unit         *hl_unit;       /* our unit */
2387         TAILQ_ENTRY(hci_link)    hl_next;       /* next link on unit */
2388
2389         /* common info */
2390         uint16_t                 hl_state;      /* connection state */
2391         uint16_t                 hl_flags;      /* link flags */
2392         bdaddr_t                 hl_bdaddr;     /* dest address */
2393         uint16_t                 hl_handle;     /* connection handle */
2394         uint8_t                  hl_type;       /* link type */
2395
2396         /* ACL link info */
2397         uint8_t                  hl_lastid;     /* last id used */
2398         uint16_t                 hl_refcnt;     /* reference count */
2399         uint16_t                 hl_mtu;        /* signalling mtu for link */
2400         uint16_t                 hl_flush;      /* flush timeout */
2401         uint16_t                 hl_clock;      /* remote clock offset */
2402
2403         TAILQ_HEAD(,l2cap_pdu)   hl_txq;        /* queue of outgoing PDUs */
2404         int                      hl_txqlen;     /* number of fragments */
2405         struct mbuf             *hl_rxp;        /* incoming PDU (accumulating)*/
2406         struct callout           hl_expire;     /* connection expiry timer */
2407         TAILQ_HEAD(,l2cap_req)   hl_reqs;       /* pending requests */
2408
2409         /* SCO link info */
2410         struct hci_link         *hl_link;       /* SCO ACL link */
2411         struct sco_pcb          *hl_sco;        /* SCO pcb */
2412         struct ifqueue           hl_data;       /* SCO outgoing data */
2413 };
2414
2415 /* hci_link state */
2416 #define HCI_LINK_CLOSED         0  /* closed */
2417 #define HCI_LINK_WAIT_CONNECT   1  /* waiting to connect */
2418 #define HCI_LINK_WAIT_AUTH      2  /* waiting for auth */
2419 #define HCI_LINK_WAIT_ENCRYPT   3  /* waiting for encrypt */
2420 #define HCI_LINK_WAIT_SECURE    4  /* waiting for secure */
2421 #define HCI_LINK_OPEN           5  /* ready and willing */
2422 #define HCI_LINK_BLOCK          6  /* open but blocking (see hci_acl_start) */
2423
2424 /* hci_link flags */
2425 #define HCI_LINK_AUTH_REQ       (1<<0)  /* authentication requested */
2426 #define HCI_LINK_ENCRYPT_REQ    (1<<1)  /* encryption requested */
2427 #define HCI_LINK_SECURE_REQ     (1<<2)  /* secure link requested */
2428 #define HCI_LINK_AUTH           (1<<3)  /* link is authenticated */
2429 #define HCI_LINK_ENCRYPT        (1<<4)  /* link is encrypted */
2430 #define HCI_LINK_SECURE         (1<<5)  /* link is secured */
2431
2432 /*
2433  * Bluetooth Memo
2434  *      cached device information for remote devices that this unit has seen
2435  */
2436 struct hci_memo {
2437         struct timeval          time;           /* time of last response */
2438         bdaddr_t                bdaddr;
2439         uint8_t                 page_scan_rep_mode;
2440         uint8_t                 page_scan_mode;
2441         uint16_t                clock_offset;
2442         LIST_ENTRY(hci_memo)    next;
2443 };
2444
2445 /*
2446  * The Bluetooth HCI interface attachment structure
2447  */
2448 struct hci_if {
2449         int     (*enable)(struct device *);
2450         void    (*disable)(struct device *);
2451         void    (*output_cmd)(struct device *, struct mbuf *);
2452         void    (*output_acl)(struct device *, struct mbuf *);
2453         void    (*output_sco)(struct device *, struct mbuf *);
2454         void    (*get_stats)(struct device *, struct bt_stats *, int);
2455 };
2456
2457 /*
2458  * The Bluetooth HCI device unit structure
2459  */
2460 struct hci_unit {
2461         struct device   *hci_dev;               /* bthci handle */
2462 #if 0 /* not yet */
2463         device_t         hci_bthub;             /* bthub(4) handle */
2464 #endif
2465         const struct hci_if *hci_if;            /* bthci driver interface */
2466
2467         /* device info */
2468         bdaddr_t         hci_bdaddr;            /* device address */
2469         uint16_t         hci_flags;             /* see BTF_ above */
2470
2471         uint16_t         hci_packet_type;       /* packet types */
2472         uint16_t         hci_acl_mask;          /* ACL packet capabilities */
2473         uint16_t         hci_sco_mask;          /* SCO packet capabilities */
2474
2475         uint16_t         hci_link_policy;       /* link policy */
2476         uint16_t         hci_lmp_mask;          /* link policy capabilities */
2477
2478         uint8_t          hci_cmds[HCI_COMMANDS_SIZE]; /* opcode bitmask */
2479
2480         /* flow control */
2481         uint16_t         hci_max_acl_size;      /* ACL payload mtu */
2482         uint16_t         hci_num_acl_pkts;      /* free ACL packet buffers */
2483         uint8_t          hci_num_cmd_pkts;      /* free CMD packet buffers */
2484         uint8_t          hci_max_sco_size;      /* SCO payload mtu */
2485         uint16_t         hci_num_sco_pkts;      /* free SCO packet buffers */
2486
2487         TAILQ_HEAD(,hci_link)   hci_links;      /* list of ACL/SCO links */
2488         LIST_HEAD(,hci_memo)    hci_memos;      /* cached memo list */
2489
2490         /* input queues */
2491         void                    *hci_rxint;     /* receive interrupt cookie */
2492         struct lock              hci_devlock;   /* device queue lock */
2493         struct ifqueue           hci_eventq;    /* Event queue */
2494         struct ifqueue           hci_aclrxq;    /* ACL rx queue */
2495         struct ifqueue           hci_scorxq;    /* SCO rx queue */
2496         uint16_t                 hci_eventqlen; /* Event queue length */
2497         uint16_t                 hci_aclrxqlen; /* ACL rx queue length */
2498         uint16_t                 hci_scorxqlen; /* SCO rx queue length */
2499
2500         /* output queues */
2501         struct ifqueue           hci_cmdwait;   /* pending commands */
2502         struct ifqueue           hci_scodone;   /* SCO done queue */
2503
2504         TAILQ_ENTRY(hci_unit) hci_next;
2505 };
2506
2507 extern TAILQ_HEAD(hci_unit_list, hci_unit) hci_unit_list;
2508
2509 /*
2510  * HCI layer function prototypes
2511  */
2512
2513 /* hci_event.c */
2514 void hci_event(struct mbuf *, struct hci_unit *);
2515
2516 /* hci_ioctl.c */
2517 int hci_ioctl(unsigned long, void *, struct proc *);
2518
2519 /* hci_link.c */
2520 struct hci_link *hci_acl_open(struct hci_unit *, bdaddr_t *);
2521 struct hci_link *hci_acl_newconn(struct hci_unit *, bdaddr_t *);
2522 void hci_acl_close(struct hci_link *, int);
2523 void hci_acl_timeout(void *);
2524 int hci_acl_setmode(struct hci_link *);
2525 void hci_acl_linkmode(struct hci_link *);
2526 void hci_acl_recv(struct mbuf *, struct hci_unit *);
2527 int hci_acl_send(struct mbuf *, struct hci_link *, struct l2cap_channel *);
2528 void hci_acl_start(struct hci_link *);
2529 void hci_acl_complete(struct hci_link *, int);
2530 struct hci_link *hci_sco_newconn(struct hci_unit *, bdaddr_t *);
2531 void hci_sco_recv(struct mbuf *, struct hci_unit *);
2532 void hci_sco_start(struct hci_link *);
2533 void hci_sco_complete(struct hci_link *, int);
2534 struct hci_link *hci_link_alloc(struct hci_unit *);
2535 void hci_link_free(struct hci_link *, int);
2536 struct hci_link *hci_link_lookup_state(struct hci_unit *, uint16_t, uint16_t);
2537 struct hci_link *hci_link_lookup_bdaddr(struct hci_unit *, bdaddr_t *, uint16_t);
2538 struct hci_link *hci_link_lookup_handle(struct hci_unit *, uint16_t);
2539
2540 /* hci_misc.c */
2541 int hci_route_lookup(bdaddr_t *, bdaddr_t *);
2542 struct hci_memo *hci_memo_find(struct hci_unit *, bdaddr_t *);
2543 struct hci_memo *hci_memo_new(struct hci_unit *, bdaddr_t *);
2544 void hci_memo_free(struct hci_memo *);
2545
2546 /* hci_socket.c */
2547 void hci_drop(void *);
2548 int hci_usrreq(struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *);
2549 int hci_ctloutput(struct socket *so, struct sockopt *sopt);
2550 void hci_mtap(struct mbuf *, struct hci_unit *);
2551
2552 /* hci_unit.c */
2553 struct hci_unit *hci_attach(const struct hci_if *, struct device *, uint16_t);
2554 void hci_detach(struct hci_unit *);
2555 int hci_enable(struct hci_unit *);
2556 void hci_disable(struct hci_unit *);
2557 struct hci_unit *hci_unit_lookup(bdaddr_t *);
2558 int hci_send_cmd(struct hci_unit *, uint16_t, void *, uint8_t);
2559 int hci_input_event(struct hci_unit *, struct mbuf *);
2560 int hci_input_acl(struct hci_unit *, struct mbuf *);
2561 int hci_input_sco(struct hci_unit *, struct mbuf *);
2562 int hci_complete_sco(struct hci_unit *, struct mbuf *);
2563 void hci_output_cmd(struct hci_unit *, struct mbuf *);
2564 void hci_output_acl(struct hci_unit *, struct mbuf *);
2565 void hci_output_sco(struct hci_unit *, struct mbuf *);
2566 void hci_intr(void *);
2567 void btintr(struct netmsg *msg);
2568
2569 /* XXX mimic NetBSD for now, although we don't have these interfaces */
2570 #define M_GETCTX(m, t)  ((t)(m)->m_pkthdr.rcvif)
2571 #define M_SETCTX(m, c)  ((m)->m_pkthdr.rcvif = (void *)(c))
2572 #define EPASSTHROUGH ENOTTY     /* XXX */
2573
2574 #endif  /* _KERNEL */
2575
2576 #endif /* _NETBT_HCI_H_ */