aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth/btintel.c
diff options
context:
space:
mode:
authorLoic Poulain <loic.poulain@intel.com>2015-09-04 11:54:34 -0400
committerMarcel Holtmann <marcel@holtmann.org>2015-09-17 07:20:05 -0400
commit145f2368c5fd7962e37315ccc092670743019d08 (patch)
tree8da5f5be3f49f6a2a68cebfb67df221c4b11f958 /drivers/bluetooth/btintel.c
parenta9cb0fe4895cae95b49934af6fdcc54aa04e723d (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.c46
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}
170EXPORT_SYMBOL_GPL(btintel_secure_send); 171EXPORT_SYMBOL_GPL(btintel_secure_send);
171 172
173int 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}
216EXPORT_SYMBOL_GPL(btintel_load_ddc_config);
217
172MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); 218MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
173MODULE_DESCRIPTION("Bluetooth support for Intel devices ver " VERSION); 219MODULE_DESCRIPTION("Bluetooth support for Intel devices ver " VERSION);
174MODULE_VERSION(VERSION); 220MODULE_VERSION(VERSION);