diff options
author | Loic Poulain <loic.poulain@intel.com> | 2015-09-04 11:54:34 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2015-09-17 07:20:05 -0400 |
commit | 145f2368c5fd7962e37315ccc092670743019d08 (patch) | |
tree | 8da5f5be3f49f6a2a68cebfb67df221c4b11f958 /drivers/bluetooth/btintel.c | |
parent | a9cb0fe4895cae95b49934af6fdcc54aa04e723d (diff) |
Bluetooth: btintel: Add Device Configuration support
btintel_load_ddc_config retrieves the ddc file and sends its content
via DDC commands (opcode 0xfc8b).
The ddc file should contain one or more DDC structures.
A DDC structure is composed of the folowing fields:
field: | DDC LEN | DDC ID | DDC VALUE |
size: | 1 byte | 2 bytes | DDC LEN - 2 |
Signed-off-by: Loic Poulain <loic.poulain@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth/btintel.c')
-rw-r--r-- | drivers/bluetooth/btintel.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c index 048423fd83bf..9e18988375eb 100644 --- a/drivers/bluetooth/btintel.c +++ b/drivers/bluetooth/btintel.c | |||
@@ -22,6 +22,7 @@ | |||
22 | */ | 22 | */ |
23 | 23 | ||
24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
25 | #include <linux/firmware.h> | ||
25 | 26 | ||
26 | #include <net/bluetooth/bluetooth.h> | 27 | #include <net/bluetooth/bluetooth.h> |
27 | #include <net/bluetooth/hci_core.h> | 28 | #include <net/bluetooth/hci_core.h> |
@@ -169,6 +170,51 @@ int btintel_secure_send(struct hci_dev *hdev, u8 fragment_type, u32 plen, | |||
169 | } | 170 | } |
170 | EXPORT_SYMBOL_GPL(btintel_secure_send); | 171 | EXPORT_SYMBOL_GPL(btintel_secure_send); |
171 | 172 | ||
173 | int btintel_load_ddc_config(struct hci_dev *hdev, const char *ddc_name) | ||
174 | { | ||
175 | const struct firmware *fw; | ||
176 | struct sk_buff *skb; | ||
177 | const u8 *fw_ptr; | ||
178 | int err; | ||
179 | |||
180 | err = request_firmware_direct(&fw, ddc_name, &hdev->dev); | ||
181 | if (err < 0) { | ||
182 | bt_dev_err(hdev, "Failed to load Intel DDC file %s (%d)", | ||
183 | ddc_name, err); | ||
184 | return err; | ||
185 | } | ||
186 | |||
187 | bt_dev_info(hdev, "Found Intel DDC parameters: %s", ddc_name); | ||
188 | |||
189 | fw_ptr = fw->data; | ||
190 | |||
191 | /* DDC file contains one or more DDC structure which has | ||
192 | * Length (1 byte), DDC ID (2 bytes), and DDC value (Length - 2). | ||
193 | */ | ||
194 | while (fw->size > fw_ptr - fw->data) { | ||
195 | u8 cmd_plen = fw_ptr[0] + sizeof(u8); | ||
196 | |||
197 | skb = __hci_cmd_sync(hdev, 0xfc8b, cmd_plen, fw_ptr, | ||
198 | HCI_INIT_TIMEOUT); | ||
199 | if (IS_ERR(skb)) { | ||
200 | bt_dev_err(hdev, "Failed to send Intel_Write_DDC (%ld)", | ||
201 | PTR_ERR(skb)); | ||
202 | release_firmware(fw); | ||
203 | return PTR_ERR(skb); | ||
204 | } | ||
205 | |||
206 | fw_ptr += cmd_plen; | ||
207 | kfree_skb(skb); | ||
208 | } | ||
209 | |||
210 | release_firmware(fw); | ||
211 | |||
212 | bt_dev_info(hdev, "Applying Intel DDC parameters completed"); | ||
213 | |||
214 | return 0; | ||
215 | } | ||
216 | EXPORT_SYMBOL_GPL(btintel_load_ddc_config); | ||
217 | |||
172 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); | 218 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
173 | MODULE_DESCRIPTION("Bluetooth support for Intel devices ver " VERSION); | 219 | MODULE_DESCRIPTION("Bluetooth support for Intel devices ver " VERSION); |
174 | MODULE_VERSION(VERSION); | 220 | MODULE_VERSION(VERSION); |