1 /* 2 * BT-AMP (BlueTooth Alternate Mac and Phy) HCI (Host/Controller Interface) 3 * 4 * Copyright (C) 1999-2011, Broadcom Corporation 5 * 6 * Permission to use, copy, modify, and/or distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 13 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 15 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 16 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 * 18 * $Id: bt_amp_hci.h,v 9.14.8.2 2010-09-10 18:37:47 Exp $ 19 */ 20 21 #ifndef _bt_amp_hci_h 22 #define _bt_amp_hci_h 23 24 /* This marks the start of a packed structure section. */ 25 #include <packed_section_start.h> 26 27 28 /* AMP HCI CMD packet format */ 29 typedef BWL_PRE_PACKED_STRUCT struct amp_hci_cmd { 30 uint16 opcode; 31 uint8 plen; 32 uint8 parms[1]; 33 } BWL_POST_PACKED_STRUCT amp_hci_cmd_t; 34 35 #define HCI_CMD_PREAMBLE_SIZE OFFSETOF(amp_hci_cmd_t, parms) 36 #define HCI_CMD_DATA_SIZE 255 37 38 /* AMP HCI CMD opcode layout */ 39 #define HCI_CMD_OPCODE(ogf, ocf) ((((ogf) & 0x3F) << 10) | ((ocf) & 0x03FF)) 40 #define HCI_CMD_OGF(opcode) ((uint8)(((opcode) >> 10) & 0x3F)) 41 #define HCI_CMD_OCF(opcode) ((opcode) & 0x03FF) 42 43 /* AMP HCI command opcodes */ 44 #define HCI_Read_Failed_Contact_Counter HCI_CMD_OPCODE(0x05, 0x0001) 45 #define HCI_Reset_Failed_Contact_Counter HCI_CMD_OPCODE(0x05, 0x0002) 46 #define HCI_Read_Link_Quality HCI_CMD_OPCODE(0x05, 0x0003) 47 #define HCI_Read_Local_AMP_Info HCI_CMD_OPCODE(0x05, 0x0009) 48 #define HCI_Read_Local_AMP_ASSOC HCI_CMD_OPCODE(0x05, 0x000A) 49 #define HCI_Write_Remote_AMP_ASSOC HCI_CMD_OPCODE(0x05, 0x000B) 50 #define HCI_Create_Physical_Link HCI_CMD_OPCODE(0x01, 0x0035) 51 #define HCI_Accept_Physical_Link_Request HCI_CMD_OPCODE(0x01, 0x0036) 52 #define HCI_Disconnect_Physical_Link HCI_CMD_OPCODE(0x01, 0x0037) 53 #define HCI_Create_Logical_Link HCI_CMD_OPCODE(0x01, 0x0038) 54 #define HCI_Accept_Logical_Link HCI_CMD_OPCODE(0x01, 0x0039) 55 #define HCI_Disconnect_Logical_Link HCI_CMD_OPCODE(0x01, 0x003A) 56 #define HCI_Logical_Link_Cancel HCI_CMD_OPCODE(0x01, 0x003B) 57 #define HCI_Flow_Spec_Modify HCI_CMD_OPCODE(0x01, 0x003C) 58 #define HCI_Write_Flow_Control_Mode HCI_CMD_OPCODE(0x01, 0x0067) 59 #define HCI_Read_Best_Effort_Flush_Timeout HCI_CMD_OPCODE(0x01, 0x0069) 60 #define HCI_Write_Best_Effort_Flush_Timeout HCI_CMD_OPCODE(0x01, 0x006A) 61 #define HCI_Short_Range_Mode HCI_CMD_OPCODE(0x01, 0x006B) 62 #define HCI_Reset HCI_CMD_OPCODE(0x03, 0x0003) 63 #define HCI_Read_Connection_Accept_Timeout HCI_CMD_OPCODE(0x03, 0x0015) 64 #define HCI_Write_Connection_Accept_Timeout HCI_CMD_OPCODE(0x03, 0x0016) 65 #define HCI_Read_Link_Supervision_Timeout HCI_CMD_OPCODE(0x03, 0x0036) 66 #define HCI_Write_Link_Supervision_Timeout HCI_CMD_OPCODE(0x03, 0x0037) 67 #define HCI_Enhanced_Flush HCI_CMD_OPCODE(0x03, 0x005F) 68 #define HCI_Read_Logical_Link_Accept_Timeout HCI_CMD_OPCODE(0x03, 0x0061) 69 #define HCI_Write_Logical_Link_Accept_Timeout HCI_CMD_OPCODE(0x03, 0x0062) 70 #define HCI_Set_Event_Mask_Page_2 HCI_CMD_OPCODE(0x03, 0x0063) 71 #define HCI_Read_Location_Data_Command HCI_CMD_OPCODE(0x03, 0x0064) 72 #define HCI_Write_Location_Data_Command HCI_CMD_OPCODE(0x03, 0x0065) 73 #define HCI_Read_Local_Version_Info HCI_CMD_OPCODE(0x04, 0x0001) 74 #define HCI_Read_Local_Supported_Commands HCI_CMD_OPCODE(0x04, 0x0002) 75 #define HCI_Read_Buffer_Size HCI_CMD_OPCODE(0x04, 0x0005) 76 #define HCI_Read_Data_Block_Size HCI_CMD_OPCODE(0x04, 0x000A) 77 78 /* AMP HCI command parameters */ 79 typedef BWL_PRE_PACKED_STRUCT struct read_local_cmd_parms { 80 uint8 plh; 81 uint8 offset[2]; /* length so far */ 82 uint8 max_remote[2]; 83 } BWL_POST_PACKED_STRUCT read_local_cmd_parms_t; 84 85 typedef BWL_PRE_PACKED_STRUCT struct write_remote_cmd_parms { 86 uint8 plh; 87 uint8 offset[2]; 88 uint8 len[2]; 89 uint8 frag[1]; 90 } BWL_POST_PACKED_STRUCT write_remote_cmd_parms_t; 91 92 typedef BWL_PRE_PACKED_STRUCT struct phy_link_cmd_parms { 93 uint8 plh; 94 uint8 key_length; 95 uint8 key_type; 96 uint8 key[1]; 97 } BWL_POST_PACKED_STRUCT phy_link_cmd_parms_t; 98 99 typedef BWL_PRE_PACKED_STRUCT struct dis_phy_link_cmd_parms { 100 uint8 plh; 101 uint8 reason; 102 } BWL_POST_PACKED_STRUCT dis_phy_link_cmd_parms_t; 103 104 typedef BWL_PRE_PACKED_STRUCT struct log_link_cmd_parms { 105 uint8 plh; 106 uint8 txflow[16]; 107 uint8 rxflow[16]; 108 } BWL_POST_PACKED_STRUCT log_link_cmd_parms_t; 109 110 typedef BWL_PRE_PACKED_STRUCT struct ext_flow_spec { 111 uint8 id; 112 uint8 service_type; 113 uint8 max_sdu[2]; 114 uint8 sdu_ia_time[4]; 115 uint8 access_latency[4]; 116 uint8 flush_timeout[4]; 117 } BWL_POST_PACKED_STRUCT ext_flow_spec_t; 118 119 typedef BWL_PRE_PACKED_STRUCT struct log_link_cancel_cmd_parms { 120 uint8 plh; 121 uint8 tx_fs_ID; 122 } BWL_POST_PACKED_STRUCT log_link_cancel_cmd_parms_t; 123 124 typedef BWL_PRE_PACKED_STRUCT struct flow_spec_mod_cmd_parms { 125 uint8 llh[2]; 126 uint8 txflow[16]; 127 uint8 rxflow[16]; 128 } BWL_POST_PACKED_STRUCT flow_spec_mod_cmd_parms_t; 129 130 typedef BWL_PRE_PACKED_STRUCT struct plh_pad { 131 uint8 plh; 132 uint8 pad; 133 } BWL_POST_PACKED_STRUCT plh_pad_t; 134 135 typedef BWL_PRE_PACKED_STRUCT union hci_handle { 136 uint16 bredr; 137 plh_pad_t amp; 138 } BWL_POST_PACKED_STRUCT hci_handle_t; 139 140 typedef BWL_PRE_PACKED_STRUCT struct ls_to_cmd_parms { 141 hci_handle_t handle; 142 uint8 timeout[2]; 143 } BWL_POST_PACKED_STRUCT ls_to_cmd_parms_t; 144 145 typedef BWL_PRE_PACKED_STRUCT struct befto_cmd_parms { 146 uint8 llh[2]; 147 uint8 befto[4]; 148 } BWL_POST_PACKED_STRUCT befto_cmd_parms_t; 149 150 typedef BWL_PRE_PACKED_STRUCT struct srm_cmd_parms { 151 uint8 plh; 152 uint8 srm; 153 } BWL_POST_PACKED_STRUCT srm_cmd_parms_t; 154 155 typedef BWL_PRE_PACKED_STRUCT struct ld_cmd_parms { 156 uint8 ld_aware; 157 uint8 ld[2]; 158 uint8 ld_opts; 159 uint8 l_opts; 160 } BWL_POST_PACKED_STRUCT ld_cmd_parms_t; 161 162 typedef BWL_PRE_PACKED_STRUCT struct eflush_cmd_parms { 163 uint8 llh[2]; 164 uint8 packet_type; 165 } BWL_POST_PACKED_STRUCT eflush_cmd_parms_t; 166 167 /* Generic AMP extended flow spec service types */ 168 #define EFS_SVCTYPE_NO_TRAFFIC 0 169 #define EFS_SVCTYPE_BEST_EFFORT 1 170 #define EFS_SVCTYPE_GUARANTEED 2 171 172 /* AMP HCI event packet format */ 173 typedef BWL_PRE_PACKED_STRUCT struct amp_hci_event { 174 uint8 ecode; 175 uint8 plen; 176 uint8 parms[1]; 177 } BWL_POST_PACKED_STRUCT amp_hci_event_t; 178 179 #define HCI_EVT_PREAMBLE_SIZE OFFSETOF(amp_hci_event_t, parms) 180 181 /* AMP HCI event codes */ 182 #define HCI_Command_Complete 0x0E 183 #define HCI_Command_Status 0x0F 184 #define HCI_Flush_Occurred 0x11 185 #define HCI_Enhanced_Flush_Complete 0x39 186 #define HCI_Physical_Link_Complete 0x40 187 #define HCI_Channel_Select 0x41 188 #define HCI_Disconnect_Physical_Link_Complete 0x42 189 #define HCI_Logical_Link_Complete 0x45 190 #define HCI_Disconnect_Logical_Link_Complete 0x46 191 #define HCI_Flow_Spec_Modify_Complete 0x47 192 #define HCI_Number_of_Completed_Data_Blocks 0x48 193 #define HCI_Short_Range_Mode_Change_Complete 0x4C 194 #define HCI_Status_Change_Event 0x4D 195 #define HCI_Vendor_Specific 0xFF 196 197 /* AMP HCI event mask bit positions */ 198 #define HCI_Physical_Link_Complete_Event_Mask 0x0001 199 #define HCI_Channel_Select_Event_Mask 0x0002 200 #define HCI_Disconnect_Physical_Link_Complete_Event_Mask 0x0004 201 #define HCI_Logical_Link_Complete_Event_Mask 0x0020 202 #define HCI_Disconnect_Logical_Link_Complete_Event_Mask 0x0040 203 #define HCI_Flow_Spec_Modify_Complete_Event_Mask 0x0080 204 #define HCI_Number_of_Completed_Data_Blocks_Event_Mask 0x0100 205 #define HCI_Short_Range_Mode_Change_Complete_Event_Mask 0x1000 206 #define HCI_Status_Change_Event_Mask 0x2000 207 #define HCI_All_Event_Mask 0x31e7 208 209 /* AMP HCI event parameters */ 210 typedef BWL_PRE_PACKED_STRUCT struct cmd_status_parms { 211 uint8 status; 212 uint8 cmdpkts; 213 uint16 opcode; 214 } BWL_POST_PACKED_STRUCT cmd_status_parms_t; 215 216 typedef BWL_PRE_PACKED_STRUCT struct cmd_complete_parms { 217 uint8 cmdpkts; 218 uint16 opcode; 219 uint8 parms[1]; 220 } BWL_POST_PACKED_STRUCT cmd_complete_parms_t; 221 222 typedef BWL_PRE_PACKED_STRUCT struct flush_occurred_evt_parms { 223 uint16 handle; 224 } BWL_POST_PACKED_STRUCT flush_occurred_evt_parms_t; 225 226 typedef BWL_PRE_PACKED_STRUCT struct write_remote_evt_parms { 227 uint8 status; 228 uint8 plh; 229 } BWL_POST_PACKED_STRUCT write_remote_evt_parms_t; 230 231 typedef BWL_PRE_PACKED_STRUCT struct read_local_evt_parms { 232 uint8 status; 233 uint8 plh; 234 uint16 len; 235 uint8 frag[1]; 236 } BWL_POST_PACKED_STRUCT read_local_evt_parms_t; 237 238 typedef BWL_PRE_PACKED_STRUCT struct read_local_info_evt_parms { 239 uint8 status; 240 uint8 AMP_status; 241 uint32 bandwidth; 242 uint32 gbandwidth; 243 uint32 latency; 244 uint32 PDU_size; 245 uint8 ctrl_type; 246 uint16 PAL_cap; 247 uint16 AMP_ASSOC_len; 248 uint32 max_flush_timeout; 249 uint32 be_flush_timeout; 250 } BWL_POST_PACKED_STRUCT read_local_info_evt_parms_t; 251 252 typedef BWL_PRE_PACKED_STRUCT struct log_link_evt_parms { 253 uint8 status; 254 uint16 llh; 255 uint8 plh; 256 uint8 tx_fs_ID; 257 } BWL_POST_PACKED_STRUCT log_link_evt_parms_t; 258 259 typedef BWL_PRE_PACKED_STRUCT struct disc_log_link_evt_parms { 260 uint8 status; 261 uint16 llh; 262 uint8 reason; 263 } BWL_POST_PACKED_STRUCT disc_log_link_evt_parms_t; 264 265 typedef BWL_PRE_PACKED_STRUCT struct log_link_cancel_evt_parms { 266 uint8 status; 267 uint8 plh; 268 uint8 tx_fs_ID; 269 } BWL_POST_PACKED_STRUCT log_link_cancel_evt_parms_t; 270 271 typedef BWL_PRE_PACKED_STRUCT struct flow_spec_mod_evt_parms { 272 uint8 status; 273 uint16 llh; 274 } BWL_POST_PACKED_STRUCT flow_spec_mod_evt_parms_t; 275 276 typedef BWL_PRE_PACKED_STRUCT struct phy_link_evt_parms { 277 uint8 status; 278 uint8 plh; 279 } BWL_POST_PACKED_STRUCT phy_link_evt_parms_t; 280 281 typedef BWL_PRE_PACKED_STRUCT struct dis_phy_link_evt_parms { 282 uint8 status; 283 uint8 plh; 284 uint8 reason; 285 } BWL_POST_PACKED_STRUCT dis_phy_link_evt_parms_t; 286 287 typedef BWL_PRE_PACKED_STRUCT struct read_ls_to_evt_parms { 288 uint8 status; 289 hci_handle_t handle; 290 uint16 timeout; 291 } BWL_POST_PACKED_STRUCT read_ls_to_evt_parms_t; 292 293 typedef BWL_PRE_PACKED_STRUCT struct read_lla_ca_to_evt_parms { 294 uint8 status; 295 uint16 timeout; 296 } BWL_POST_PACKED_STRUCT read_lla_ca_to_evt_parms_t; 297 298 typedef BWL_PRE_PACKED_STRUCT struct read_data_block_size_evt_parms { 299 uint8 status; 300 uint16 ACL_pkt_len; 301 uint16 data_block_len; 302 uint16 data_block_num; 303 } BWL_POST_PACKED_STRUCT read_data_block_size_evt_parms_t; 304 305 typedef BWL_PRE_PACKED_STRUCT struct data_blocks { 306 uint16 handle; 307 uint16 pkts; 308 uint16 blocks; 309 } BWL_POST_PACKED_STRUCT data_blocks_t; 310 311 typedef BWL_PRE_PACKED_STRUCT struct num_completed_data_blocks_evt_parms { 312 uint16 num_blocks; 313 uint8 num_handles; 314 data_blocks_t completed[1]; 315 } BWL_POST_PACKED_STRUCT num_completed_data_blocks_evt_parms_t; 316 317 typedef BWL_PRE_PACKED_STRUCT struct befto_evt_parms { 318 uint8 status; 319 uint32 befto; 320 } BWL_POST_PACKED_STRUCT befto_evt_parms_t; 321 322 typedef BWL_PRE_PACKED_STRUCT struct srm_evt_parms { 323 uint8 status; 324 uint8 plh; 325 uint8 srm; 326 } BWL_POST_PACKED_STRUCT srm_evt_parms_t; 327 328 typedef BWL_PRE_PACKED_STRUCT struct contact_counter_evt_parms { 329 uint8 status; 330 uint8 llh[2]; 331 uint16 counter; 332 } BWL_POST_PACKED_STRUCT contact_counter_evt_parms_t; 333 334 typedef BWL_PRE_PACKED_STRUCT struct contact_counter_reset_evt_parms { 335 uint8 status; 336 uint8 llh[2]; 337 } BWL_POST_PACKED_STRUCT contact_counter_reset_evt_parms_t; 338 339 typedef BWL_PRE_PACKED_STRUCT struct read_linkq_evt_parms { 340 uint8 status; 341 hci_handle_t handle; 342 uint8 link_quality; 343 } BWL_POST_PACKED_STRUCT read_linkq_evt_parms_t; 344 345 typedef BWL_PRE_PACKED_STRUCT struct ld_evt_parms { 346 uint8 status; 347 uint8 ld_aware; 348 uint8 ld[2]; 349 uint8 ld_opts; 350 uint8 l_opts; 351 } BWL_POST_PACKED_STRUCT ld_evt_parms_t; 352 353 typedef BWL_PRE_PACKED_STRUCT struct eflush_complete_evt_parms { 354 uint16 handle; 355 } BWL_POST_PACKED_STRUCT eflush_complete_evt_parms_t; 356 357 typedef BWL_PRE_PACKED_STRUCT struct vendor_specific_evt_parms { 358 uint8 len; 359 uint8 parms[1]; 360 } BWL_POST_PACKED_STRUCT vendor_specific_evt_parms_t; 361 362 typedef BWL_PRE_PACKED_STRUCT struct local_version_info_evt_parms { 363 uint8 status; 364 uint8 hci_version; 365 uint16 hci_revision; 366 uint8 pal_version; 367 uint16 mfg_name; 368 uint16 pal_subversion; 369 } BWL_POST_PACKED_STRUCT local_version_info_evt_parms_t; 370 371 #define MAX_SUPPORTED_CMD_BYTE 64 372 typedef BWL_PRE_PACKED_STRUCT struct local_supported_cmd_evt_parms { 373 uint8 status; 374 uint8 cmd[MAX_SUPPORTED_CMD_BYTE]; 375 } BWL_POST_PACKED_STRUCT local_supported_cmd_evt_parms_t; 376 377 typedef BWL_PRE_PACKED_STRUCT struct status_change_evt_parms { 378 uint8 status; 379 uint8 amp_status; 380 } BWL_POST_PACKED_STRUCT status_change_evt_parms_t; 381 382 /* AMP HCI error codes */ 383 #define HCI_SUCCESS 0x00 384 #define HCI_ERR_ILLEGAL_COMMAND 0x01 385 #define HCI_ERR_NO_CONNECTION 0x02 386 #define HCI_ERR_MEMORY_FULL 0x07 387 #define HCI_ERR_CONNECTION_TIMEOUT 0x08 388 #define HCI_ERR_MAX_NUM_OF_CONNECTIONS 0x09 389 #define HCI_ERR_CONNECTION_EXISTS 0x0B 390 #define HCI_ERR_CONNECTION_DISALLOWED 0x0C 391 #define HCI_ERR_CONNECTION_ACCEPT_TIMEOUT 0x10 392 #define HCI_ERR_UNSUPPORTED_VALUE 0x11 393 #define HCI_ERR_ILLEGAL_PARAMETER_FMT 0x12 394 #define HCI_ERR_CONN_TERM_BY_LOCAL_HOST 0x16 395 #define HCI_ERR_UNSPECIFIED 0x1F 396 #define HCI_ERR_UNIT_KEY_USED 0x26 397 #define HCI_ERR_QOS_REJECTED 0x2D 398 #define HCI_ERR_PARAM_OUT_OF_RANGE 0x30 399 #define HCI_ERR_NO_SUITABLE_CHANNEL 0x39 400 #define HCI_ERR_CHANNEL_MOVE 0xFF 401 402 /* AMP HCI ACL Data packet format */ 403 typedef BWL_PRE_PACKED_STRUCT struct amp_hci_ACL_data { 404 uint16 handle; /* 12-bit connection handle + 2-bit PB and 2-bit BC flags */ 405 uint16 dlen; /* data total length */ 406 uint8 data[1]; 407 } BWL_POST_PACKED_STRUCT amp_hci_ACL_data_t; 408 409 #define HCI_ACL_DATA_PREAMBLE_SIZE OFFSETOF(amp_hci_ACL_data_t, data) 410 411 #define HCI_ACL_DATA_BC_FLAGS (0x0 << 14) 412 #define HCI_ACL_DATA_PB_FLAGS (0x3 << 12) 413 414 #define HCI_ACL_DATA_HANDLE(handle) ((handle) & 0x0fff) 415 #define HCI_ACL_DATA_FLAGS(handle) ((handle) >> 12) 416 417 /* AMP Activity Report packet formats */ 418 typedef BWL_PRE_PACKED_STRUCT struct amp_hci_activity_report { 419 uint8 ScheduleKnown; 420 uint8 NumReports; 421 uint8 data[1]; 422 } BWL_POST_PACKED_STRUCT amp_hci_activity_report_t; 423 424 typedef BWL_PRE_PACKED_STRUCT struct amp_hci_activity_report_triple { 425 uint32 StartTime; 426 uint32 Duration; 427 uint32 Periodicity; 428 } BWL_POST_PACKED_STRUCT amp_hci_activity_report_triple_t; 429 430 #define HCI_AR_SCHEDULE_KNOWN 0x01 431 432 433 /* This marks the end of a packed structure section. */ 434 #include <packed_section_end.h> 435 436 #endif /* _bt_amp_hci_h_ */ 437