]> www.infradead.org Git - users/dwmw2/linux.git/commit
Bluetooth: btusb: mediatek: Add locks for usb_driver_claim_interface()
authorDouglas Anderson <dianders@chromium.org>
Thu, 16 Jan 2025 03:36:36 +0000 (19:36 -0800)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 29 Jan 2025 20:19:30 +0000 (15:19 -0500)
commite9087e828827e5a5c85e124ce77503f2b81c3491
treeae735af5c38450cd4ddc91d9b9976b8d351584d0
parent9e6c4e6b605c1fa3e24f74ee0b641e95f090188a
Bluetooth: btusb: mediatek: Add locks for usb_driver_claim_interface()

The documentation for usb_driver_claim_interface() says that "the
device lock" is needed when the function is called from places other
than probe(). This appears to be the lock for the USB interface
device. The Mediatek btusb code gets called via this path:

  Workqueue: hci0 hci_power_on [bluetooth]
  Call trace:
   usb_driver_claim_interface
   btusb_mtk_claim_iso_intf
   btusb_mtk_setup
   hci_dev_open_sync
   hci_power_on
   process_scheduled_works
   worker_thread
   kthread

With the above call trace the device lock hasn't been claimed. Claim
it.

Without this fix, we'd sometimes see the error "Failed to claim iso
interface". Sometimes we'd even see worse errors, like a NULL pointer
dereference (where `intf->dev.driver` was NULL) with a trace like:

  Call trace:
   usb_suspend_both
   usb_runtime_suspend
   __rpm_callback
   rpm_suspend
   pm_runtime_work
   process_scheduled_works

Both errors appear to be fixed with the proper locking.

Fixes: ceac1cb0259d ("Bluetooth: btusb: mediatek: add ISO data transmission functions")
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/btusb.c