Re: [PATCH v3] Bluetooth: btusb: Add workaround for remote-wakeup issues with Barrot 8041a02 fake CSR controllers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hans,

I love your patch! Yet something to improve:

[auto build test ERROR on bluetooth-next/master]
[also build test ERROR on v5.10-rc6 next-20201203]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Hans-de-Goede/Bluetooth-btusb-Add-workaround-for-remote-wakeup-issues-with-Barrot-8041a02-fake-CSR-controllers/20201203-191712
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master
config: arm-randconfig-r032-20201203 (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/8dd4bd66a9bd4a811d7389743b7495719c6e4de3
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Hans-de-Goede/Bluetooth-btusb-Add-workaround-for-remote-wakeup-issues-with-Barrot-8041a02-fake-CSR-controllers/20201203-191712
        git checkout 8dd4bd66a9bd4a811d7389743b7495719c6e4de3
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All errors (new ones prefixed by >>):

   drivers/bluetooth/btusb.c: In function 'btusb_setup_csr':
>> drivers/bluetooth/btusb.c:1893:7: error: 'bcdDevice' undeclared (first use in this function); did you mean 'device'?
    1893 |   if (bcdDevice == 0x8891 &&
         |       ^~~~~~~~~
         |       device
   drivers/bluetooth/btusb.c:1893:7: note: each undeclared identifier is reported only once for each function it appears in
>> drivers/bluetooth/btusb.c:1899:22: error: 'data' undeclared (first use in this function); did you mean '_data'?
    1899 |    pm_runtime_allow(&data->udev->dev);
         |                      ^~~~
         |                      _data

vim +1893 drivers/bluetooth/btusb.c

  1788	
  1789	static int btusb_setup_csr(struct hci_dev *hdev)
  1790	{
  1791		struct hci_rp_read_local_version *rp;
  1792		struct sk_buff *skb;
  1793		bool is_fake = false;
  1794		int ret;
  1795	
  1796		BT_DBG("%s", hdev->name);
  1797	
  1798		skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
  1799				     HCI_INIT_TIMEOUT);
  1800		if (IS_ERR(skb)) {
  1801			int err = PTR_ERR(skb);
  1802			bt_dev_err(hdev, "CSR: Local version failed (%d)", err);
  1803			return err;
  1804		}
  1805	
  1806		if (skb->len != sizeof(struct hci_rp_read_local_version)) {
  1807			bt_dev_err(hdev, "CSR: Local version length mismatch");
  1808			kfree_skb(skb);
  1809			return -EIO;
  1810		}
  1811	
  1812		rp = (struct hci_rp_read_local_version *)skb->data;
  1813	
  1814		/* Detect a wide host of Chinese controllers that aren't CSR.
  1815		 *
  1816		 * Known fake bcdDevices: 0x0100, 0x0134, 0x1915, 0x2520, 0x7558, 0x8891
  1817		 *
  1818		 * The main thing they have in common is that these are really popular low-cost
  1819		 * options that support newer Bluetooth versions but rely on heavy VID/PID
  1820		 * squatting of this poor old Bluetooth 1.1 device. Even sold as such.
  1821		 *
  1822		 * We detect actual CSR devices by checking that the HCI manufacturer code
  1823		 * is Cambridge Silicon Radio (10) and ensuring that LMP sub-version and
  1824		 * HCI rev values always match. As they both store the firmware number.
  1825		 */
  1826		if (le16_to_cpu(rp->manufacturer) != 10 ||
  1827		    le16_to_cpu(rp->hci_rev) != le16_to_cpu(rp->lmp_subver))
  1828			is_fake = true;
  1829	
  1830		/* Known legit CSR firmware build numbers and their supported BT versions:
  1831		 * - 1.1 (0x1) -> 0x0073, 0x020d, 0x033c, 0x034e
  1832		 * - 1.2 (0x2) ->                 0x04d9, 0x0529
  1833		 * - 2.0 (0x3) ->         0x07a6, 0x07ad, 0x0c5c
  1834		 * - 2.1 (0x4) ->         0x149c, 0x1735, 0x1899 (0x1899 is a BlueCore4-External)
  1835		 * - 4.0 (0x6) ->         0x1d86, 0x2031, 0x22bb
  1836		 *
  1837		 * e.g. Real CSR dongles with LMP subversion 0x73 are old enough that
  1838		 *      support BT 1.1 only; so it's a dead giveaway when some
  1839		 *      third-party BT 4.0 dongle reuses it.
  1840		 */
  1841		else if (le16_to_cpu(rp->lmp_subver) <= 0x034e &&
  1842			 le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_1_1)
  1843			is_fake = true;
  1844	
  1845		else if (le16_to_cpu(rp->lmp_subver) <= 0x0529 &&
  1846			 le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_1_2)
  1847			is_fake = true;
  1848	
  1849		else if (le16_to_cpu(rp->lmp_subver) <= 0x0c5c &&
  1850			 le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_2_0)
  1851			is_fake = true;
  1852	
  1853		else if (le16_to_cpu(rp->lmp_subver) <= 0x1899 &&
  1854			 le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_2_1)
  1855			is_fake = true;
  1856	
  1857		else if (le16_to_cpu(rp->lmp_subver) <= 0x22bb &&
  1858			 le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_4_0)
  1859			is_fake = true;
  1860	
  1861		if (is_fake) {
  1862			bt_dev_warn(hdev, "CSR: Unbranded CSR clone detected; adding workarounds...");
  1863	
  1864			/* Generally these clones have big discrepancies between
  1865			 * advertised features and what's actually supported.
  1866			 * Probably will need to be expanded in the future;
  1867			 * without these the controller will lock up.
  1868			 */
  1869			set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
  1870			set_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks);
  1871	
  1872			/* Clear the reset quirk since this is not an actual
  1873			 * early Bluetooth 1.1 device from CSR.
  1874			 */
  1875			clear_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
  1876			clear_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
  1877	
  1878			/*
  1879			 * Special workaround for clones with a Barrot 8041a02 chip,
  1880			 * these clones are really messed-up:
  1881			 * 1. Their bulk rx endpoint will never report any data unless
  1882			 * the device was suspended at least once (yes really).
  1883			 * 2. They will not wakeup when autosuspended and receiving data
  1884			 * on their bulk rx endpoint from e.g. a keyboard or mouse
  1885			 * (IOW remote-wakeup support is broken for the bulk endpoint).
  1886			 *
  1887			 * To fix 1. enable runtime-suspend, force-suspend the
  1888			 * hci and then wake-it up by disabling runtime-suspend.
  1889			 *
  1890			 * To fix 2. clear the hci's can_wake flag, this way the hci
  1891			 * will still be autosuspended when it is not open.
  1892			 */
> 1893			if (bcdDevice == 0x8891 &&
  1894			    le16_to_cpu(rp->lmp_subver) == 0x1012 &&
  1895			    le16_to_cpu(rp->hci_rev) == 0x0810 &&
  1896			    le16_to_cpu(rp->hci_ver) == BLUETOOTH_VER_4_0) {
  1897				bt_dev_warn(hdev, "CSR: detected a fake CSR dongle using a Barrot 8041a02 chip, this chip is very buggy and may have issues\n");
  1898	
> 1899				pm_runtime_allow(&data->udev->dev);
  1900	
  1901				ret = pm_runtime_suspend(&data->udev->dev);
  1902				if (ret >= 0)
  1903					msleep(200);
  1904				else
  1905					bt_dev_err(hdev, "Failed to suspend the device for Barrot 8041a02 receive-issue workaround\n");
  1906	
  1907				pm_runtime_forbid(&data->udev->dev);
  1908	
  1909				device_set_wakeup_capable(&data->udev->dev, false);
  1910				/* Re-enable autosuspend if this was requested */
  1911				if (enable_autosuspend)
  1912					usb_enable_autosuspend(data->udev);
  1913			}
  1914		}
  1915	
  1916		kfree_skb(skb);
  1917	
  1918		return 0;
  1919	}
  1920	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux