root/netbt/hci.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. hci_cmd_hdr_t
  2. hci_acldata_hdr_t
  3. hci_scodata_hdr_t
  4. hci_event_hdr_t
  5. hci_status_rp
  6. hci_inquiry_cp
  7. hci_periodic_inquiry_cp
  8. hci_create_con_cp
  9. hci_discon_cp
  10. hci_add_sco_con_cp
  11. hci_create_con_cancel_cp
  12. hci_create_con_cancel_rp
  13. hci_accept_con_cp
  14. hci_reject_con_cp
  15. hci_link_key_rep_cp
  16. hci_link_key_rep_rp
  17. hci_link_key_neg_rep_cp
  18. hci_link_key_neg_rep_rp
  19. hci_pin_code_rep_cp
  20. hci_pin_code_rep_rp
  21. hci_pin_code_neg_rep_cp
  22. hci_pin_code_neg_rep_rp
  23. hci_change_con_pkt_type_cp
  24. hci_auth_req_cp
  25. hci_set_con_encryption_cp
  26. hci_change_con_link_key_cp
  27. hci_master_link_key_cp
  28. hci_remote_name_req_cp
  29. hci_remote_name_req_cancel_cp
  30. hci_remote_name_req_cancel_rp
  31. hci_read_remote_features_cp
  32. hci_read_remote_extended_features_cp
  33. hci_read_remote_ver_info_cp
  34. hci_read_clock_offset_cp
  35. hci_read_lmp_handle_cp
  36. hci_read_lmp_handle_rp
  37. hci_setup_sco_con_cp
  38. hci_accept_sco_con_req_cp
  39. hci_reject_sco_con_req_cp
  40. hci_hold_mode_cp
  41. hci_sniff_mode_cp
  42. hci_exit_sniff_mode_cp
  43. hci_park_mode_cp
  44. hci_exit_park_mode_cp
  45. hci_qos_setup_cp
  46. hci_role_discovery_cp
  47. hci_role_discovery_rp
  48. hci_switch_role_cp
  49. hci_read_link_policy_settings_cp
  50. hci_read_link_policy_settings_rp
  51. hci_write_link_policy_settings_cp
  52. hci_write_link_policy_settings_rp
  53. hci_read_default_link_policy_settings_rp
  54. hci_write_default_link_policy_settings_cp
  55. hci_flow_specification_cp
  56. hci_set_event_mask_cp
  57. hci_set_event_filter_cp
  58. hci_flush_cp
  59. hci_flush_rp
  60. hci_read_pin_type_rp
  61. hci_write_pin_type_cp
  62. hci_read_stored_link_key_cp
  63. hci_read_stored_link_key_rp
  64. hci_write_stored_link_key_cp
  65. hci_write_stored_link_key_rp
  66. hci_delete_stored_link_key_cp
  67. hci_delete_stored_link_key_rp
  68. hci_write_local_name_cp
  69. hci_read_local_name_rp
  70. hci_read_con_accept_timeout_rp
  71. hci_write_con_accept_timeout_cp
  72. hci_read_page_timeout_rp
  73. hci_write_page_timeout_cp
  74. hci_read_scan_enable_rp
  75. hci_write_scan_enable_cp
  76. hci_read_page_scan_activity_rp
  77. hci_write_page_scan_activity_cp
  78. hci_read_inquiry_scan_activity_rp
  79. hci_write_inquiry_scan_activity_cp
  80. hci_read_auth_enable_rp
  81. hci_write_auth_enable_cp
  82. hci_read_encryption_mode_rp
  83. hci_write_encryption_mode_cp
  84. hci_read_unit_class_rp
  85. hci_write_unit_class_cp
  86. hci_read_voice_setting_rp
  87. hci_write_voice_setting_cp
  88. hci_read_auto_flush_timeout_cp
  89. hci_read_auto_flush_timeout_rp
  90. hci_write_auto_flush_timeout_cp
  91. hci_write_auto_flush_timeout_rp
  92. hci_read_num_broadcast_retrans_rp
  93. hci_write_num_broadcast_retrans_cp
  94. hci_read_hold_mode_activity_rp
  95. hci_write_hold_mode_activity_cp
  96. hci_read_xmit_level_cp
  97. hci_read_xmit_level_rp
  98. hci_read_sco_flow_control_rp
  99. hci_write_sco_flow_control_cp
  100. hci_hc2h_flow_control_cp
  101. hci_host_buffer_size_cp
  102. hci_host_num_compl_pkts_cp
  103. hci_read_link_supervision_timeout_cp
  104. hci_read_link_supervision_timeout_rp
  105. hci_write_link_supervision_timeout_cp
  106. hci_write_link_supervision_timeout_rp
  107. hci_read_num_supported_iac_rp
  108. hci_read_iac_lap_rp
  109. hci_write_iac_lap_cp
  110. hci_read_page_scan_period_rp
  111. hci_write_page_scan_period_cp
  112. hci_read_page_scan_rp
  113. hci_write_page_scan_cp
  114. hci_set_afh_classification_cp
  115. hci_read_inquiry_scan_type_rp
  116. hci_write_inquiry_scan_type_cp
  117. hci_read_inquiry_mode_rp
  118. hci_write_inquiry_mode_cp
  119. hci_read_page_scan_type_rp
  120. hci_write_page_scan_type_cp
  121. hci_read_afh_assessment_rp
  122. hci_write_afh_assessment_cp
  123. hci_read_local_ver_rp
  124. hci_read_local_commands_rp
  125. hci_read_local_features_rp
  126. hci_read_local_extended_features_cp
  127. hci_read_local_extended_features_rp
  128. hci_read_buffer_size_rp
  129. hci_read_country_code_rp
  130. hci_read_bdaddr_rp
  131. hci_read_failed_contact_cntr_cp
  132. hci_read_failed_contact_cntr_rp
  133. hci_reset_failed_contact_cntr_cp
  134. hci_reset_failed_contact_cntr_rp
  135. hci_read_link_quality_cp
  136. hci_read_link_quality_rp
  137. hci_read_rssi_cp
  138. hci_read_rssi_rp
  139. hci_read_afh_channel_map_cp
  140. hci_read_afh_channel_map_rp
  141. hci_read_clock_cp
  142. hci_read_clock_rp
  143. hci_read_loopback_mode_rp
  144. hci_write_loopback_mode_cp
  145. hci_inquiry_compl_ep
  146. hci_inquiry_result_ep
  147. hci_inquiry_response
  148. hci_con_compl_ep
  149. hci_con_req_ep
  150. hci_discon_compl_ep
  151. hci_auth_compl_ep
  152. hci_remote_name_req_compl_ep
  153. hci_encryption_change_ep
  154. hci_change_con_link_key_compl_ep
  155. hci_master_link_key_compl_ep
  156. hci_read_remote_features_compl_ep
  157. hci_read_remote_ver_info_compl_ep
  158. hci_qos_setup_compl_ep
  159. hci_command_compl_ep
  160. hci_command_status_ep
  161. hci_hardware_error_ep
  162. hci_flush_occur_ep
  163. hci_role_change_ep
  164. hci_num_compl_pkts_ep
  165. hci_mode_change_ep
  166. hci_return_link_keys_ep
  167. hci_pin_code_req_ep
  168. hci_link_key_req_ep
  169. hci_link_key_notification_ep
  170. hci_data_buffer_overflow_ep
  171. hci_max_slot_change_ep
  172. hci_read_clock_offset_compl_ep
  173. hci_con_pkt_type_changed_ep
  174. hci_qos_violation_ep
  175. hci_page_scan_mode_change_ep
  176. hci_page_scan_rep_mode_change_ep
  177. hci_flow_specification_compl_ep
  178. hci_rssi_result_ep
  179. hci_rssi_response_ep
  180. hci_read_remote_extended_features_ep
  181. hci_sco_con_compl_ep
  182. hci_sco_con_changed_ep
  183. hci_filter_set
  184. hci_filter_clr
  185. hci_filter_test

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

/* [<][>][^][v][top][bottom][index][help] */