Received: by 2002:a05:6a10:eb17:0:0:0:0 with SMTP id hx23csp1415508pxb; Fri, 10 Sep 2021 05:34:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw61R0+16UaQxtSsE8ktz6t4JsOBGoRHT7ACl5u9doXFvCja1/VecnxhM9+el0mOf6IzZ/J X-Received: by 2002:a6b:8bcf:: with SMTP id n198mr7003463iod.178.1631277257401; Fri, 10 Sep 2021 05:34:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631277257; cv=none; d=google.com; s=arc-20160816; b=UP1Nl1ON67DMkxi3mKxcGz0ryNTj0R1MK/AFm8Y7ROg3Ngn+gzqi69pQfE40I7hDuy OY9lAsRjMP0/LyvFVjxF0cv+exkgfR6BS3umCeqSuEZV7iRxBh4Jp/kUUGwIViLB7V8L iNe9gKfn7tg3khOWnsFc2epzG8Ip5FOUPdC2WHPejF3aHOvoMsETGk0YJ+fpibVf21jC SUZ+aqHMBZ+qIXu+N0Nomhkze7ns8lqULdqDDs5hj7Khr7DMG87x8E5Yz36HCOIdH87D vfzGzRTr4m6Ucf8vV3Xh5lv+dDQxe1IrM75ZmRP9KzpX/orgYtigQh1fM++Gr1VqKEZp uDPQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=jJU00bzrcbY2EW44HxK/XT1RSUUJhoMcgoi3WExqbzY=; b=dcJlHx00CQd72jcrpmcbxphI2oMEz1wAM5qN59wxy7WuWFC4TZAkkjrZvP/gW0pQbU 7N7ZGkypmYzzIf8LWKkXhXdx6W9eVvgurncB5gMob4FiUB+1do5jy3lBi0D0YC1L1LnY 7EM2Pg63RhbIji7B+Vqn0i/Yie7ZL9nSx6qGT6u3wRz1q4HobHbnowP9RlsAFfe9lEZ/ NsNS0Sb6DO/PHCZpKLWGVwFGpIUuz59HBvBOlYjXb4bJgw/Gz+7Q8fU3WrsFD/lf4U9W hI8eXjB5sDz7fmDzdwbqmyuIp/LDQT0P+24AvFfYFP/ALLEm07qDHY2FmOCTdcGGq7mM cDjw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=m4G5qpjB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m1si4695919jaa.128.2021.09.10.05.34.05; Fri, 10 Sep 2021 05:34:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=m4G5qpjB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233538AbhIJMdE (ORCPT + 99 others); Fri, 10 Sep 2021 08:33:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:50500 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233530AbhIJMcz (ORCPT ); Fri, 10 Sep 2021 08:32:55 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 2F69C600CC; Fri, 10 Sep 2021 12:31:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1631277104; bh=GLcMsC3AQA7e/6HQrAVY/mkPJHGUW8yHq8VRphwlg7M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=m4G5qpjBp0pc5hzzswCvn63EdLmU1f8M2gshbXvaWohC59RE83jzEFF9YS9zU6Mur r/5gBcK9qIvgU5Hj5YfLgV6XfLWsWT28lThbrY+OD/S3JfTN0Ys7hWyl8tMwr309K3 t4OrOU58Q3EUogdDWcrEsBIVITxeLViJX3DM6jMg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Hans de Goede , Ismael Ferreras Morezuelas , Marcel Holtmann Subject: [PATCH 5.14 07/23] Bluetooth: btusb: Make the CSR clone chip force-suspend workaround more generic Date: Fri, 10 Sep 2021 14:29:57 +0200 Message-Id: <20210910122916.253761280@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210910122916.022815161@linuxfoundation.org> References: <20210910122916.022815161@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ismael Ferreras Morezuelas commit f4292e2faf522f899b642d2040a2edbcbd455b9f upstream. Turns out Hans de Goede completed the work I started last year trying to improve Chinese-clone detection of CSR controller chips. Quirk after quirk these Bluetooth dongles are more usable now. Even after a few BlueZ regressions; these clones are so fickle that some days they stop working altogether. Except on Windows, they work fine. But this force-suspend initialization quirk seems to mostly do the trick, after a lot of testing Bluetooth now seems to work *all* the time. The only problem is that the solution ended up being masked under a very stringent check; when there are probably hundreds of fake dongle models out there that benefit from a good reset. Make it so. Fixes: 81cac64ba258a ("Bluetooth: Deal with USB devices that are faking CSR vendor") Fixes: cde1a8a992875 ("Bluetooth: btusb: Fix and detect most of the Chinese Bluetooth controllers") Fixes: d74e0ae7e0303 ("Bluetooth: btusb: Fix detection of some fake CSR controllers with a bcdDevice val of 0x0134") Fixes: 0671c0662383e ("Bluetooth: btusb: Add workaround for remote-wakeup issues with Barrot 8041a02 fake CSR controllers") Cc: stable@vger.kernel.org Cc: Hans de Goede Tested-by: Ismael Ferreras Morezuelas Signed-off-by: Ismael Ferreras Morezuelas Reviewed-by: Hans de Goede Signed-off-by: Marcel Holtmann Signed-off-by: Greg Kroah-Hartman --- drivers/bluetooth/btusb.c | 63 ++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 29 deletions(-) --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -1899,7 +1899,7 @@ static int btusb_setup_csr(struct hci_de is_fake = true; if (is_fake) { - bt_dev_warn(hdev, "CSR: Unbranded CSR clone detected; adding workarounds..."); + bt_dev_warn(hdev, "CSR: Unbranded CSR clone detected; adding workarounds and force-suspending once..."); /* Generally these clones have big discrepancies between * advertised features and what's actually supported. @@ -1916,41 +1916,46 @@ static int btusb_setup_csr(struct hci_de clear_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); /* - * Special workaround for clones with a Barrot 8041a02 chip, - * these clones are really messed-up: - * 1. Their bulk rx endpoint will never report any data unless - * the device was suspended at least once (yes really). + * Special workaround for these BT 4.0 chip clones, and potentially more: + * + * - 0x0134: a Barrot 8041a02 (HCI rev: 0x1012 sub: 0x0810) + * - 0x7558: IC markings FR3191AHAL 749H15143 (HCI rev/sub-version: 0x0709) + * + * These controllers are really messed-up. + * + * 1. Their bulk RX endpoint will never report any data unless + * the device was suspended at least once (yes, really). * 2. They will not wakeup when autosuspended and receiving data - * on their bulk rx endpoint from e.g. a keyboard or mouse + * on their bulk RX endpoint from e.g. a keyboard or mouse * (IOW remote-wakeup support is broken for the bulk endpoint). * * To fix 1. enable runtime-suspend, force-suspend the - * hci and then wake-it up by disabling runtime-suspend. + * HCI and then wake-it up by disabling runtime-suspend. * - * To fix 2. clear the hci's can_wake flag, this way the hci + * To fix 2. clear the HCI's can_wake flag, this way the HCI * will still be autosuspended when it is not open. + * + * -- + * + * Because these are widespread problems we prefer generic solutions; so + * apply this initialization quirk to every controller that gets here, + * it should be harmless. The alternative is to not work at all. */ - if (bcdDevice == 0x8891 && - le16_to_cpu(rp->lmp_subver) == 0x1012 && - le16_to_cpu(rp->hci_rev) == 0x0810 && - le16_to_cpu(rp->hci_ver) == BLUETOOTH_VER_4_0) { - bt_dev_warn(hdev, "CSR: detected a fake CSR dongle using a Barrot 8041a02 chip, this chip is very buggy and may have issues"); - - pm_runtime_allow(&data->udev->dev); - - ret = pm_runtime_suspend(&data->udev->dev); - if (ret >= 0) - msleep(200); - else - bt_dev_err(hdev, "Failed to suspend the device for Barrot 8041a02 receive-issue workaround"); - - pm_runtime_forbid(&data->udev->dev); - - device_set_wakeup_capable(&data->udev->dev, false); - /* Re-enable autosuspend if this was requested */ - if (enable_autosuspend) - usb_enable_autosuspend(data->udev); - } + pm_runtime_allow(&data->udev->dev); + + ret = pm_runtime_suspend(&data->udev->dev); + if (ret >= 0) + msleep(200); + else + bt_dev_err(hdev, "CSR: Failed to suspend the device for our Barrot 8041a02 receive-issue workaround"); + + pm_runtime_forbid(&data->udev->dev); + + device_set_wakeup_capable(&data->udev->dev, false); + + /* Re-enable autosuspend if this was requested */ + if (enable_autosuspend) + usb_enable_autosuspend(data->udev); } kfree_skb(skb);