From: Greg Kroah-Hartman Date: Thu, 6 Jan 2022 16:58:50 +0000 (+0100) Subject: 4.4-stable patches X-Git-Tag: v4.4.299~48 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2d3020df9f9a0a00dfb1056eadbf4cf44be7e5f0;p=thirdparty%2Fkernel%2Fstable-queue.git 4.4-stable patches added patches: bluetooth-btusb-apply-qca-rome-patches-for-some-ath3012-models.patch --- diff --git a/queue-4.4/bluetooth-btusb-apply-qca-rome-patches-for-some-ath3012-models.patch b/queue-4.4/bluetooth-btusb-apply-qca-rome-patches-for-some-ath3012-models.patch new file mode 100644 index 00000000000..9f4d6c116cc --- /dev/null +++ b/queue-4.4/bluetooth-btusb-apply-qca-rome-patches-for-some-ath3012-models.patch @@ -0,0 +1,138 @@ +From 803cdb8ce584198cd45825822910cac7de6378cb Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 21 May 2018 22:34:52 +0200 +Subject: Bluetooth: btusb: Apply QCA Rome patches for some ATH3012 models + +From: Takashi Iwai + +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 +Signed-off-by: Takashi Iwai +Signed-off-by: Marcel Holtmann +Signed-off-by: Greg Kroah-Hartman +--- + 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); diff --git a/queue-4.4/series b/queue-4.4/series index e9a17531249..168b9dbaacc 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -1 +1,2 @@ bpf-test-fix-ld_abs-vlan-push-pop-stress-test.patch +bluetooth-btusb-apply-qca-rome-patches-for-some-ath3012-models.patch