1 /* 2 * 3 * Bluetooth support for Intel devices 4 * 5 * Copyright (C) 2015 Intel Corporation 6 * 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 * 22 */ 23 24 struct intel_version { 25 u8 status; 26 u8 hw_platform; 27 u8 hw_variant; 28 u8 hw_revision; 29 u8 fw_variant; 30 u8 fw_revision; 31 u8 fw_build_num; 32 u8 fw_build_ww; 33 u8 fw_build_yy; 34 u8 fw_patch_num; 35 } __packed; 36 37 struct intel_boot_params { 38 __u8 status; 39 __u8 otp_format; 40 __u8 otp_content; 41 __u8 otp_patch; 42 __le16 dev_revid; 43 __u8 secure_boot; 44 __u8 key_from_hdr; 45 __u8 key_type; 46 __u8 otp_lock; 47 __u8 api_lock; 48 __u8 debug_lock; 49 bdaddr_t otp_bdaddr; 50 __u8 min_fw_build_nn; 51 __u8 min_fw_build_cw; 52 __u8 min_fw_build_yy; 53 __u8 limited_cce; 54 __u8 unlocked_state; 55 } __packed; 56 57 struct intel_bootup { 58 __u8 zero; 59 __u8 num_cmds; 60 __u8 source; 61 __u8 reset_type; 62 __u8 reset_reason; 63 __u8 ddc_status; 64 } __packed; 65 66 struct intel_secure_send_result { 67 __u8 result; 68 __le16 opcode; 69 __u8 status; 70 } __packed; 71 72 struct intel_reset { 73 __u8 reset_type; 74 __u8 patch_enable; 75 __u8 ddc_reload; 76 __u8 boot_option; 77 __le32 boot_param; 78 } __packed; 79 80 #if IS_ENABLED(CONFIG_BT_INTEL) 81 82 int btintel_check_bdaddr(struct hci_dev *hdev); 83 int btintel_enter_mfg(struct hci_dev *hdev); 84 int btintel_exit_mfg(struct hci_dev *hdev, bool reset, bool patched); 85 int btintel_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr); 86 int btintel_set_diag(struct hci_dev *hdev, bool enable); 87 int btintel_set_diag_mfg(struct hci_dev *hdev, bool enable); 88 void btintel_hw_error(struct hci_dev *hdev, u8 code); 89 90 void btintel_version_info(struct hci_dev *hdev, struct intel_version *ver); 91 int btintel_secure_send(struct hci_dev *hdev, u8 fragment_type, u32 plen, 92 const void *param); 93 int btintel_load_ddc_config(struct hci_dev *hdev, const char *ddc_name); 94 int btintel_set_event_mask(struct hci_dev *hdev, bool debug); 95 int btintel_set_event_mask_mfg(struct hci_dev *hdev, bool debug); 96 int btintel_read_version(struct hci_dev *hdev, struct intel_version *ver); 97 98 struct regmap *btintel_regmap_init(struct hci_dev *hdev, u16 opcode_read, 99 u16 opcode_write); 100 int btintel_send_intel_reset(struct hci_dev *hdev, u32 boot_param); 101 int btintel_read_boot_params(struct hci_dev *hdev, 102 struct intel_boot_params *params); 103 int btintel_download_firmware(struct hci_dev *dev, const struct firmware *fw, 104 u32 *boot_param); 105 #else 106 107 static inline int btintel_check_bdaddr(struct hci_dev *hdev) 108 { 109 return -EOPNOTSUPP; 110 } 111 112 static inline int btintel_enter_mfg(struct hci_dev *hdev) 113 { 114 return -EOPNOTSUPP; 115 } 116 117 static inline int btintel_exit_mfg(struct hci_dev *hdev, bool reset, bool patched) 118 { 119 return -EOPNOTSUPP; 120 } 121 122 static inline int btintel_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr) 123 { 124 return -EOPNOTSUPP; 125 } 126 127 static inline int btintel_set_diag(struct hci_dev *hdev, bool enable) 128 { 129 return -EOPNOTSUPP; 130 } 131 132 static inline int btintel_set_diag_mfg(struct hci_dev *hdev, bool enable) 133 { 134 return -EOPNOTSUPP; 135 } 136 137 static inline void btintel_hw_error(struct hci_dev *hdev, u8 code) 138 { 139 } 140 141 static inline void btintel_version_info(struct hci_dev *hdev, 142 struct intel_version *ver) 143 { 144 } 145 146 static inline int btintel_secure_send(struct hci_dev *hdev, u8 fragment_type, 147 u32 plen, const void *param) 148 { 149 return -EOPNOTSUPP; 150 } 151 152 static inline int btintel_load_ddc_config(struct hci_dev *hdev, 153 const char *ddc_name) 154 { 155 return -EOPNOTSUPP; 156 } 157 158 static inline int btintel_set_event_mask(struct hci_dev *hdev, bool debug) 159 { 160 return -EOPNOTSUPP; 161 } 162 163 static inline int btintel_set_event_mask_mfg(struct hci_dev *hdev, bool debug) 164 { 165 return -EOPNOTSUPP; 166 } 167 168 static inline int btintel_read_version(struct hci_dev *hdev, 169 struct intel_version *ver) 170 { 171 return -EOPNOTSUPP; 172 } 173 174 static inline struct regmap *btintel_regmap_init(struct hci_dev *hdev, 175 u16 opcode_read, 176 u16 opcode_write) 177 { 178 return ERR_PTR(-EINVAL); 179 } 180 181 static inline int btintel_send_intel_reset(struct hci_dev *hdev, 182 u32 reset_param) 183 { 184 return -EOPNOTSUPP; 185 } 186 187 static inline int btintel_read_boot_params(struct hci_dev *hdev, 188 struct intel_boot_params *params) 189 { 190 return -EOPNOTSUPP; 191 } 192 193 static inline int btintel_download_firmware(struct hci_dev *dev, 194 const struct firmware *fw, 195 u32 *boot_param) 196 { 197 return -EOPNOTSUPP; 198 } 199 #endif 200