1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2019 Vladimir Kondratyev <wulf@FreeBSD.org> 5 * Copyright (c) 2023 Future Crew LLC. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 #ifndef __IWMBT_HW_H__ 29 #define __IWMBT_HW_H__ 30 31 /* USB control request (HCI command) structure */ 32 struct iwmbt_hci_cmd { 33 uint16_t opcode; 34 uint8_t length; 35 uint8_t data[]; 36 } __attribute__ ((packed)); 37 38 #define IWMBT_HCI_CMD_SIZE(cmd) \ 39 ((cmd)->length + offsetof(struct iwmbt_hci_cmd, data)) 40 41 /* USB interrupt transfer HCI event header structure */ 42 struct iwmbt_hci_evhdr { 43 uint8_t event; 44 uint8_t length; 45 } __attribute__ ((packed)); 46 47 /* USB interrupt transfer (generic HCI event) structure */ 48 struct iwmbt_hci_event { 49 struct iwmbt_hci_evhdr header; 50 uint8_t data[]; 51 } __attribute__ ((packed)); 52 53 /* USB interrupt transfer (HCI command completion event) structure */ 54 struct iwmbt_hci_event_cmd_compl { 55 struct iwmbt_hci_evhdr header; 56 uint8_t numpkt; 57 uint16_t opcode; 58 uint8_t data[]; 59 } __attribute__ ((packed)); 60 61 #define IWMBT_HCI_EVT_COMPL_SIZE(payload) \ 62 (offsetof(struct iwmbt_hci_event_cmd_compl, data) + sizeof(payload)) 63 #define IWMBT_HCI_EVENT_COMPL_HEAD_SIZE \ 64 (offsetof(struct iwmbt_hci_event_cmd_compl, data) - \ 65 offsetof(struct iwmbt_hci_event_cmd_compl, numpkt)) 66 67 #define IWMBT_CONTROL_ENDPOINT_ADDR 0x00 68 #define IWMBT_INTERRUPT_ENDPOINT_ADDR 0x81 69 #define IWMBT_BULK_IN_ENDPOINT_ADDR 0x82 70 #define IWMBT_BULK_OUT_ENDPOINT_ADDR 0x02 71 72 #define IWMBT_HCI_MAX_CMD_SIZE 256 73 #define IWMBT_HCI_MAX_EVENT_SIZE 16 74 75 #define IWMBT_MSEC2TS(msec) \ 76 (struct timespec) { \ 77 .tv_sec = (msec) / 1000, \ 78 .tv_nsec = ((msec) % 1000) * 1000000 \ 79 }; 80 #define IWMBT_TS2MSEC(ts) ((ts).tv_sec * 1000 + (ts).tv_nsec / 1000000) 81 #define IWMBT_HCI_CMD_TIMEOUT 2000 /* ms */ 82 #define IWMBT_LOADCMPL_TIMEOUT 5000 /* ms */ 83 84 extern int iwmbt_patch_fwfile(struct libusb_device_handle *hdl, 85 const struct iwmbt_firmware *fw); 86 extern int iwmbt_load_rsa_header(struct libusb_device_handle *hdl, 87 const struct iwmbt_firmware *fw); 88 extern int iwmbt_load_ecdsa_header(struct libusb_device_handle *hdl, 89 const struct iwmbt_firmware *fw); 90 extern int iwmbt_load_fwfile(struct libusb_device_handle *hdl, 91 const struct iwmbt_firmware *fw, uint32_t *boot_param, int offset); 92 extern int iwmbt_enter_manufacturer(struct libusb_device_handle *hdl); 93 extern int iwmbt_exit_manufacturer(struct libusb_device_handle *hdl, 94 int mode); 95 extern int iwmbt_get_version(struct libusb_device_handle *hdl, 96 struct iwmbt_version *version); 97 extern int iwmbt_get_version_tlv(struct libusb_device_handle *hdl, 98 struct iwmbt_version_tlv *version); 99 extern int iwmbt_get_boot_params(struct libusb_device_handle *hdl, 100 struct iwmbt_boot_params *params); 101 extern int iwmbt_intel_reset(struct libusb_device_handle *hdl, 102 uint32_t boot_param); 103 extern int iwmbt_load_ddc(struct libusb_device_handle *hdl, 104 const struct iwmbt_firmware *ddc); 105 extern int iwmbt_set_event_mask(struct libusb_device_handle *hdl); 106 107 #endif 108