--- /dev/null
+From 803cdb8ce584198cd45825822910cac7de6378cb Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 21 May 2018 22:34:52 +0200
+Subject: Bluetooth: btusb: Apply QCA Rome patches for some ATH3012 models
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 803cdb8ce584198cd45825822910cac7de6378cb upstream.
+
+In commit f44cb4b19ed4 ("Bluetooth: btusb: Fix quirk for Atheros
+1525/QCA6174") we tried to address the non-working Atheros BT devices
+by changing the quirk from BTUSB_ATH3012 to BTUSB_QCA_ROME. This made
+such devices working while it turned out to break other existing chips
+with the very same USB ID, hence it was reverted afterwards.
+
+This is another attempt to tackle the issue. The essential point to
+use BTUSB_QCA_ROME is to apply the btusb_setup_qca() and do RAM-
+patching. And the previous attempt failed because btusb_setup_qca()
+returns -ENODEV if the ROM version doesn't match with the expected
+ones. For some devices that have already the "correct" ROM versions,
+we may just skip the setup procedure and continue the rest.
+
+So, the first fix we'll need is to add a check of the ROM version in
+the function to skip the setup if the ROM version looks already sane,
+so that it can be applied for all ath devices.
+
+However, the world is a bit more complex than that simple solution.
+Since BTUSB_ATH3012 quirk checks the bcdDevice and bails out when it's
+0x0001 at the beginning of probing, so the device probe always aborts
+here.
+
+In this patch, we add another check of ROM version again, and if the
+device needs patching, the probe continues. For that, a slight
+refactoring of btusb_qca_send_vendor_req() was required so that the
+probe function can pass usb_device pointer directly before allocating
+hci_dev stuff.
+
+Fixes: commit f44cb4b19ed4 ("Bluetooth: btusb: Fix quirk for Atheros 1525/QCA6174")
+Bugzilla: http://bugzilla.opensuse.org/show_bug.cgi?id=1082504
+Tested-by: Ivan Levshin <ivan.levshin@microfocus.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/bluetooth/btusb.c | 32 +++++++++++++++++++++++++-------
+ 1 file changed, 25 insertions(+), 7 deletions(-)
+
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -2489,11 +2489,9 @@ static const struct qca_device_info qca_
+ { 0x00000302, 28, 4, 18 }, /* Rome 3.2 */
+ };
+
+-static int btusb_qca_send_vendor_req(struct hci_dev *hdev, u8 request,
++static int btusb_qca_send_vendor_req(struct usb_device *udev, u8 request,
+ void *data, u16 size)
+ {
+- struct btusb_data *btdata = hci_get_drvdata(hdev);
+- struct usb_device *udev = btdata->udev;
+ int pipe, err;
+ u8 *buf;
+
+@@ -2508,7 +2506,7 @@ static int btusb_qca_send_vendor_req(str
+ err = usb_control_msg(udev, pipe, request, USB_TYPE_VENDOR | USB_DIR_IN,
+ 0, 0, buf, size, USB_CTRL_SET_TIMEOUT);
+ if (err < 0) {
+- BT_ERR("%s: Failed to access otp area (%d)", hdev->name, err);
++ dev_err(&udev->dev, "Failed to access otp area (%d)", err);
+ goto done;
+ }
+
+@@ -2664,20 +2662,38 @@ static int btusb_setup_qca_load_nvm(stru
+ return err;
+ }
+
++/* identify the ROM version and check whether patches are needed */
++static bool btusb_qca_need_patch(struct usb_device *udev)
++{
++ struct qca_version ver;
++
++ if (btusb_qca_send_vendor_req(udev, QCA_GET_TARGET_VERSION, &ver,
++ sizeof(ver)) < 0)
++ return false;
++ /* only low ROM versions need patches */
++ return !(le32_to_cpu(ver.rom_version) & ~0xffffU);
++}
++
+ static int btusb_setup_qca(struct hci_dev *hdev)
+ {
++ struct btusb_data *btdata = hci_get_drvdata(hdev);
++ struct usb_device *udev = btdata->udev;
+ const struct qca_device_info *info = NULL;
+ struct qca_version ver;
+ u32 ver_rom;
+ u8 status;
+ int i, err;
+
+- err = btusb_qca_send_vendor_req(hdev, QCA_GET_TARGET_VERSION, &ver,
++ err = btusb_qca_send_vendor_req(udev, QCA_GET_TARGET_VERSION, &ver,
+ sizeof(ver));
+ if (err < 0)
+ return err;
+
+ ver_rom = le32_to_cpu(ver.rom_version);
++ /* Don't care about high ROM versions */
++ if (ver_rom & ~0xffffU)
++ return 0;
++
+ for (i = 0; i < ARRAY_SIZE(qca_devices_table); i++) {
+ if (ver_rom == qca_devices_table[i].rom_version)
+ info = &qca_devices_table[i];
+@@ -2688,7 +2704,7 @@ static int btusb_setup_qca(struct hci_de
+ return -ENODEV;
+ }
+
+- err = btusb_qca_send_vendor_req(hdev, QCA_CHECK_STATUS, &status,
++ err = btusb_qca_send_vendor_req(udev, QCA_CHECK_STATUS, &status,
+ sizeof(status));
+ if (err < 0)
+ return err;
+@@ -2834,7 +2850,8 @@ static int btusb_probe(struct usb_interf
+
+ /* Old firmware would otherwise let ath3k driver load
+ * patch and sysconfig files */
+- if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001)
++ if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001 &&
++ !btusb_qca_need_patch(udev))
+ return -ENODEV;
+ }
+
+@@ -2981,6 +2998,7 @@ static int btusb_probe(struct usb_interf
+ }
+
+ if (id->driver_info & BTUSB_ATH3012) {
++ data->setup_on_usb = btusb_setup_qca;
+ hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
+ set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
+ set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);