ACK: [SRU][Bionic][PATCH 1/1] Bluetooth: btusb: Apply QCA Rome patches for some ATH3012 models
Stefan Bader
stefan.bader at canonical.com
Fri Jun 15 14:57:39 UTC 2018
On 13.06.2018 18:53, Joseph Salisbury wrote:
> From: Takashi Iwai <tiwai at suse.de>
>
> BugLink: http://bugs.launchpad.net/bugs/1764645
>
> 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 at microfocus.com>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> Signed-off-by: Marcel Holtmann <marcel at holtmann.org>
> (cherry picked from commit 803cdb8ce584198cd45825822910cac7de6378cb)
> Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
Acked-by: Stefan Bader <stefan.bader at canonical.com>
> ---
> drivers/bluetooth/btusb.c | 32 +++++++++++++++++++++++++-------
> 1 file changed, 25 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> index e6e66dd..41dd5b1 100644
> --- a/drivers/bluetooth/btusb.c
> +++ b/drivers/bluetooth/btusb.c
> @@ -2565,11 +2565,9 @@ static const struct qca_device_info qca_devices_table[] = {
> { 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;
>
> @@ -2584,7 +2582,7 @@ static int btusb_qca_send_vendor_req(struct hci_dev *hdev, u8 request,
> 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_dev_err(hdev, "Failed to access otp area (%d)", err);
> + dev_err(&udev->dev, "Failed to access otp area (%d)", err);
> goto done;
> }
>
> @@ -2734,20 +2732,38 @@ static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
> 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];
> @@ -2757,7 +2773,7 @@ static int btusb_setup_qca(struct hci_dev *hdev)
> 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;
> @@ -2965,7 +2981,8 @@ static int btusb_probe(struct usb_interface *intf,
> /* 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;
> }
>
> @@ -3130,6 +3147,7 @@ static int btusb_probe(struct usb_interface *intf,
> }
>
> 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);
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20180615/4c784d81/attachment.sig>
More information about the kernel-team
mailing list