|
|
37499f |
Index: src/drivers/bluetooth/btusb.c
|
|
|
37499f |
===================================================================
|
|
|
37499f |
--- src.orig/drivers/bluetooth/btusb.c 2019-09-12 15:42:08.489226484 +0200
|
|
|
37499f |
+++ src/drivers/bluetooth/btusb.c 2019-09-16 17:49:20.650911909 +0200
|
|
|
37499f |
@@ -1584,33 +1584,48 @@
|
|
|
37499f |
const struct firmware *fw;
|
|
|
37499f |
char fwname[64];
|
|
|
37499f |
int ret;
|
|
|
37499f |
+ u32 ndup;
|
|
|
37499f |
|
|
|
37499f |
- snprintf(fwname, sizeof(fwname),
|
|
|
37499f |
- "intel/ibt-hw-%x.%x.%x-fw-%x.%x.%x.%x.%x.bseq",
|
|
|
37499f |
- ver->hw_platform, ver->hw_variant, ver->hw_revision,
|
|
|
37499f |
- ver->fw_variant, ver->fw_revision, ver->fw_build_num,
|
|
|
37499f |
- ver->fw_build_ww, ver->fw_build_yy);
|
|
|
37499f |
-
|
|
|
37499f |
- ret = request_firmware(&fw, fwname, &hdev->dev);
|
|
|
37499f |
- if (ret < 0) {
|
|
|
37499f |
- if (ret == -EINVAL) {
|
|
|
37499f |
- bt_dev_err(hdev, "Intel firmware file request failed (%d)",
|
|
|
37499f |
- ret);
|
|
|
37499f |
- return NULL;
|
|
|
37499f |
- }
|
|
|
37499f |
+ for (ndup = 0; ndup < 2; ndup++) {
|
|
|
37499f |
+ snprintf(fwname, sizeof(fwname),
|
|
|
37499f |
+ "%sintel/ibt-hw-%x.%x.%x-fw-%x.%x.%x.%x.%x.bseq",
|
|
|
37499f |
+ ndup ? "" : "btusb_dup8.0/",
|
|
|
37499f |
+ ver->hw_platform, ver->hw_variant, ver->hw_revision,
|
|
|
37499f |
+ ver->fw_variant, ver->fw_revision, ver->fw_build_num,
|
|
|
37499f |
+ ver->fw_build_ww, ver->fw_build_yy);
|
|
|
37499f |
+
|
|
|
37499f |
+ ret = request_firmware(&fw, fwname, &hdev->dev);
|
|
|
37499f |
+ if (ret < 0) {
|
|
|
37499f |
+ if (ret == -EINVAL) {
|
|
|
37499f |
+ bt_dev_err(hdev, "Intel firmware file \"%s\""
|
|
|
37499f |
+ "request failed (%d)",
|
|
|
37499f |
+ fwname, ret);
|
|
|
37499f |
+ return NULL;
|
|
|
37499f |
+ }
|
|
|
37499f |
|
|
|
37499f |
- bt_dev_err(hdev, "failed to open Intel firmware file: %s (%d)",
|
|
|
37499f |
- fwname, ret);
|
|
|
37499f |
+ bt_dev_err(hdev, "failed to open Intel firmware file: %s (%d)",
|
|
|
37499f |
+ fwname, ret);
|
|
|
37499f |
|
|
|
37499f |
- /* If the correct firmware patch file is not found, use the
|
|
|
37499f |
- * default firmware patch file instead
|
|
|
37499f |
- */
|
|
|
37499f |
- snprintf(fwname, sizeof(fwname), "intel/ibt-hw-%x.%x.bseq",
|
|
|
37499f |
- ver->hw_platform, ver->hw_variant);
|
|
|
37499f |
- if (request_firmware(&fw, fwname, &hdev->dev) < 0) {
|
|
|
37499f |
- bt_dev_err(hdev, "failed to open default fw file: %s",
|
|
|
37499f |
- fwname);
|
|
|
37499f |
- return NULL;
|
|
|
37499f |
+ /* If the correct firmware patch file is not found, use
|
|
|
37499f |
+ * the default firmware patch file instead
|
|
|
37499f |
+ */
|
|
|
37499f |
+ snprintf(fwname, sizeof(fwname),
|
|
|
37499f |
+ "%sintel/ibt-hw-%x.%x.bseq",
|
|
|
37499f |
+ ndup ? "" : "btusb_dup8.0/",
|
|
|
37499f |
+ ver->hw_platform, ver->hw_variant);
|
|
|
37499f |
+
|
|
|
37499f |
+ ret = request_firmware(&fw, fwname, &hdev->dev);
|
|
|
37499f |
+ if (ret < 0) {
|
|
|
37499f |
+ bt_dev_err(hdev, "failed to open default fw file: %s (%d)",
|
|
|
37499f |
+ fwname, ret);
|
|
|
37499f |
+
|
|
|
37499f |
+ if (ret == -EINVAL)
|
|
|
37499f |
+ return NULL;
|
|
|
37499f |
+ } else {
|
|
|
37499f |
+ break;
|
|
|
37499f |
+ }
|
|
|
37499f |
+ } else {
|
|
|
37499f |
+ break;
|
|
|
37499f |
}
|
|
|
37499f |
}
|
|
|
37499f |
|
|
|
37499f |
@@ -2053,12 +2068,13 @@
|
|
|
37499f |
static bool btusb_setup_intel_new_get_fw_name(struct intel_version *ver,
|
|
|
37499f |
struct intel_boot_params *params,
|
|
|
37499f |
char *fw_name, size_t len,
|
|
|
37499f |
- const char *suffix)
|
|
|
37499f |
+ const char *suffix, u32 dup)
|
|
|
37499f |
{
|
|
|
37499f |
switch (ver->hw_variant) {
|
|
|
37499f |
case 0x0b: /* SfP */
|
|
|
37499f |
case 0x0c: /* WsP */
|
|
|
37499f |
- snprintf(fw_name, len, "intel/ibt-%u-%u.%s",
|
|
|
37499f |
+ snprintf(fw_name, len, "%sintel/ibt-%u-%u.%s",
|
|
|
37499f |
+ dup ? "btusb_dup8.0/" : "",
|
|
|
37499f |
le16_to_cpu(ver->hw_variant),
|
|
|
37499f |
le16_to_cpu(params->dev_revid),
|
|
|
37499f |
suffix);
|
|
|
37499f |
@@ -2067,7 +2083,8 @@
|
|
|
37499f |
case 0x12: /* ThP */
|
|
|
37499f |
case 0x13: /* HrP */
|
|
|
37499f |
case 0x14: /* CcP */
|
|
|
37499f |
- snprintf(fw_name, len, "intel/ibt-%u-%u-%u.%s",
|
|
|
37499f |
+ snprintf(fw_name, len, "%sintel/ibt-%u-%u-%u.%s",
|
|
|
37499f |
+ dup ? "btusb_dup8.0/" : "",
|
|
|
37499f |
le16_to_cpu(ver->hw_variant),
|
|
|
37499f |
le16_to_cpu(ver->hw_revision),
|
|
|
37499f |
le16_to_cpu(ver->fw_revision),
|
|
|
37499f |
@@ -2090,6 +2107,7 @@
|
|
|
37499f |
ktime_t calltime, delta, rettime;
|
|
|
37499f |
unsigned long long duration;
|
|
|
37499f |
int err;
|
|
|
37499f |
+ u32 ndup;
|
|
|
37499f |
|
|
|
37499f |
BT_DBG("%s", hdev->name);
|
|
|
37499f |
|
|
|
37499f |
@@ -2214,34 +2232,49 @@
|
|
|
37499f |
* ibt-<hw_variant>-<hw_revision>-<fw_revision>.sfi.
|
|
|
37499f |
*
|
|
|
37499f |
*/
|
|
|
37499f |
- err = btusb_setup_intel_new_get_fw_name(&ver, ¶ms, fwname,
|
|
|
37499f |
- sizeof(fwname), "sfi");
|
|
|
37499f |
- if (!err) {
|
|
|
37499f |
- bt_dev_err(hdev, "Unsupported Intel firmware naming");
|
|
|
37499f |
- return -EINVAL;
|
|
|
37499f |
+
|
|
|
37499f |
+ /* First, we try to load a firmware from the DUP location, then fall
|
|
|
37499f |
+ * back to the generic location.
|
|
|
37499f |
+ */
|
|
|
37499f |
+ for (ndup = 0; ndup < 2; ndup++) {
|
|
|
37499f |
+ err = btusb_setup_intel_new_get_fw_name(&ver, ¶ms, fwname,
|
|
|
37499f |
+ sizeof(fwname), "sfi",
|
|
|
37499f |
+ !ndup);
|
|
|
37499f |
+ if (!err) {
|
|
|
37499f |
+ bt_dev_err(hdev, "Unsupported Intel firmware naming");
|
|
|
37499f |
+ return -EINVAL;
|
|
|
37499f |
+ }
|
|
|
37499f |
+
|
|
|
37499f |
+ err = request_firmware(&fw, fwname, &hdev->dev);
|
|
|
37499f |
+ if (err < 0)
|
|
|
37499f |
+ bt_dev_err(hdev, "Failed to load Intel firmware file "
|
|
|
37499f |
+ "\"%s\" (%d)", fwname, err);
|
|
|
37499f |
+ else
|
|
|
37499f |
+ break;
|
|
|
37499f |
}
|
|
|
37499f |
|
|
|
37499f |
- err = request_firmware(&fw, fwname, &hdev->dev);
|
|
|
37499f |
- if (err < 0) {
|
|
|
37499f |
- bt_dev_err(hdev, "Failed to load Intel firmware file (%d)", err);
|
|
|
37499f |
+ if (err < 0)
|
|
|
37499f |
return err;
|
|
|
37499f |
- }
|
|
|
37499f |
|
|
|
37499f |
bt_dev_info(hdev, "Found device firmware: %s", fwname);
|
|
|
37499f |
|
|
|
37499f |
/* Save the DDC file name for later use to apply once the firmware
|
|
|
37499f |
* downloading is done.
|
|
|
37499f |
*/
|
|
|
37499f |
+
|
|
|
37499f |
+ /* We assume that the DDC file should be at the same place as the SFI
|
|
|
37499f |
+ * file.
|
|
|
37499f |
+ */
|
|
|
37499f |
err = btusb_setup_intel_new_get_fw_name(&ver, ¶ms, fwname,
|
|
|
37499f |
- sizeof(fwname), "ddc");
|
|
|
37499f |
+ sizeof(fwname), "ddc", !ndup);
|
|
|
37499f |
if (!err) {
|
|
|
37499f |
bt_dev_err(hdev, "Unsupported Intel firmware naming");
|
|
|
37499f |
return -EINVAL;
|
|
|
37499f |
}
|
|
|
37499f |
|
|
|
37499f |
if (fw->size < 644) {
|
|
|
37499f |
- bt_dev_err(hdev, "Invalid size of firmware file (%zu)",
|
|
|
37499f |
- fw->size);
|
|
|
37499f |
+ bt_dev_err(hdev, "Invalid size of firmware file \"%s\" (%zu)",
|
|
|
37499f |
+ fwname, fw->size);
|
|
|
37499f |
err = -EBADF;
|
|
|
37499f |
goto done;
|
|
|
37499f |
}
|