2015-05-18 22:52:23

by An, Tedd

[permalink] [raw]
Subject: [PATCH v2] Bluetooth: btusb: Add routine for applying Intel DDC parameters

From: Tedd Ho-Jeong An <[email protected]>

This patch adds the routine to apply the DDC parameter from device
specific ddc file.

Once the device is rest to operational mode, optionally, it can
download the device specific configration (DDC) parameters before
the BlueZ starts the stack initialization.

It opens the DDC file based on HW_VARIANT and send ID/Value with
HCI_Intel_Write_DDC command.

Format of DDC file
DDC file consists of one or more number of DDC structure that has a
'Length' field of one octet, DDC 'ID' field of two octets followed by
the array of DDC 'Value' that gives the value of parameters itself.
'Length' contains the length of DDC 'ID' and DDC 'Value'.

+------------+----------+
| Size(byte) | Name |
+------------+----------+
| 1 | Length |
+------------+----------+
| 2 | ID |
+------------+----------+
| Length - 2 | Value |
+------------+----------+

In case of command failure, it returns the command complete with
parameter that contains the ID that failed to apply.

Signed-off-by: Tedd Ho-Jeong An <[email protected]>
---
drivers/bluetooth/btintel.h | 5 ++++
drivers/bluetooth/btusb.c | 70 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 75 insertions(+)

diff --git a/drivers/bluetooth/btintel.h b/drivers/bluetooth/btintel.h
index 4bda6ab..affb216 100644
--- a/drivers/bluetooth/btintel.h
+++ b/drivers/bluetooth/btintel.h
@@ -69,6 +69,11 @@ struct intel_secure_send_result {
__u8 status;
} __packed;

+struct intel_write_ddc {
+ __u8 status;
+ __le16 failed_id;
+} __packed;
+
#if IS_ENABLED(CONFIG_BT_INTEL)

int btintel_check_bdaddr(struct hci_dev *hdev);
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 13b9969..a80b8f3 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2318,6 +2318,66 @@ static void btusb_intel_version_info(struct hci_dev *hdev,
ver->fw_build_num, ver->fw_build_ww, 2000 + ver->fw_build_yy);
}

+static int btusb_apply_ddc_intel(struct hci_dev *hdev, u8 hw_var)
+{
+ const struct firmware *fw;
+ const u8 *fw_ptr;
+ char fwname[64];
+ struct sk_buff *skb;
+ int err;
+
+ snprintf(fwname, sizeof(fwname), "intel/ibt-%d.ddc", hw_var);
+
+ /* Device can work without DDC parameters so even if it fails to load
+ * the file, no need to fail the device setup.
+ */
+ err = request_firmware_direct(&fw, fwname, &hdev->dev);
+ if (err < 0) {
+ BT_INFO("%s: WARNING: unable to load Intel DDC file (%d)",
+ hdev->name, err);
+ return 0;
+ }
+
+ BT_INFO("%s: Intel DDC file opened: %s", hdev->name, fwname);
+
+ fw_ptr = fw->data;
+ while (fw->size > fw_ptr - fw->data) {
+ struct intel_write_ddc *wr_ddc;
+ u8 cmd_len = fw_ptr[0] + sizeof(u8);
+
+ skb = __hci_cmd_sync(hdev, 0xfc8b, cmd_len, fw_ptr,
+ HCI_INIT_TIMEOUT);
+ if (IS_ERR(skb)) {
+ BT_ERR("%s: Failed to send Intel_Write_DDC (%ld)",
+ hdev->name, PTR_ERR(skb));
+ release_firmware(fw);
+ return PTR_ERR(skb);
+ }
+
+ wr_ddc = (struct intel_write_ddc *)skb->data;
+ if (wr_ddc->status) {
+ BT_ERR("%s: Intel write ddc command failure (%02x)",
+ hdev->name, wr_ddc->status);
+ BT_ERR("%s: Last failed DDC ID: %04x",
+ hdev->name, wr_ddc->failed_id);
+ err = -bt_to_errno(wr_ddc->status);
+ release_firmware(fw);
+ kfree_skb(skb);
+ return err;
+ }
+
+ fw_ptr += cmd_len;
+
+ kfree_skb(skb);
+ }
+
+ release_firmware(fw);
+
+ BT_INFO("%s: Completed to apply Intel DDC parameters", hdev->name);
+
+ return 0;
+}
+
static int btusb_setup_intel_new(struct hci_dev *hdev)
{
static const u8 reset_param[] = { 0x00, 0x01, 0x00, 0x01,
@@ -2660,6 +2720,16 @@ done:

clear_bit(BTUSB_BOOTLOADER, &data->flags);

+ /* Once the device is running in operational mode, it needs to apply
+ * the device configuration(DDC) parameters to the device.
+ */
+ err = btusb_apply_ddc_intel(hdev, ver->hw_variant);
+ if (err < 0) {
+ BT_ERR("%s: Failed to apply DDC parameters (%d)",
+ hdev->name, err);
+ return err;
+ }
+
return 0;
}

--
2.1.0



2015-05-20 20:11:24

by An, Tedd

[permalink] [raw]
Subject: Re: [PATCH v2] Bluetooth: btusb: Add routine for applying Intel DDC parameters

SGkNCg0KDQpPbiA1LzE4LzE1LCAzOjUyIFBNLCAiQW4sIFRlZGQiIDx0ZWRkLmFuQGludGVsLmNv
bT4gd3JvdGU6DQoNCj5Gcm9tOiBUZWRkIEhvLUplb25nIEFuIDx0ZWRkLmFuQGludGVsLmNvbT4N
Cj4NCj5UaGlzIHBhdGNoIGFkZHMgdGhlIHJvdXRpbmUgdG8gYXBwbHkgdGhlIEREQyBwYXJhbWV0
ZXIgZnJvbSBkZXZpY2UNCj5zcGVjaWZpYyBkZGMgZmlsZS4NCj4NCj4NCj4gc3RhdGljIGludCBi
dHVzYl9zZXR1cF9pbnRlbF9uZXcoc3RydWN0IGhjaV9kZXYgKmhkZXYpDQo+IHsNCj4gCXN0YXRp
YyBjb25zdCB1OCByZXNldF9wYXJhbVtdID0geyAweDAwLCAweDAxLCAweDAwLCAweDAxLA0KPkBA
IC0yNjYwLDYgKzI3MjAsMTYgQEAgZG9uZToNCj4gDQo+IAljbGVhcl9iaXQoQlRVU0JfQk9PVExP
QURFUiwgJmRhdGEtPmZsYWdzKTsNCj4gDQo+KwkvKiBPbmNlIHRoZSBkZXZpY2UgaXMgcnVubmlu
ZyBpbiBvcGVyYXRpb25hbCBtb2RlLCBpdCBuZWVkcyB0byBhcHBseQ0KPisJICogdGhlIGRldmlj
ZSBjb25maWd1cmF0aW9uKEREQykgcGFyYW1ldGVycyB0byB0aGUgZGV2aWNlLg0KPisJICovDQo+
KwllcnIgPSBidHVzYl9hcHBseV9kZGNfaW50ZWwoaGRldiwgdmVyLT5od192YXJpYW50KTsNCj4r
CWlmIChlcnIgPCAwKSB7DQo+KwkJQlRfRVJSKCIlczogRmFpbGVkIHRvIGFwcGx5IEREQyBwYXJh
bWV0ZXJzICglZCkiLA0KPisJCSAgICAgICBoZGV2LT5uYW1lLCBlcnIpOw0KPisJCXJldHVybiBl
cnI7DQo+Kwl9DQo+Kw0KPiAJcmV0dXJuIDA7DQo+IH0NCj4gDQo+LS0gDQo+Mi4xLjANCj4NCg0K
SSBmb3VuZCB0aGUgYnVnIGluIHRoaXMgcGF0Y2ggYW5kIEkgd2lsbCBzZW5kIG91dCBuZXcgb25l
IGxhdGVyLg0KDQpSZWdhcmRzLA0KVGVkZA0K