Blame SOURCES/0002-try-to-load-DUP-firmware-first.patch

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, &params, 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, &params, 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, &params, 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
 	}