mirror of https://github.com/torvalds/linux.git
When a Bluetooth controller encounters a coredump, it triggers the
Subsystem Restart (SSR) mechanism. The controller first reports the
coredump data and, once the upload is complete, sends a hw_error
event. The host relies on this event to proceed with subsequent
recovery actions.
If the host has not finished processing the coredump data when the
hw_error event is received, it waits until either the processing is
complete or the 8-second timeout expires before handling the event.
The current implementation clears QCA_MEMDUMP_COLLECTION using
clear_bit(), which does not wake up waiters sleeping in
wait_on_bit_timeout(). As a result, the waiting thread may remain
blocked until the timeout expires even if the coredump collection
has already completed.
Fix this by clearing QCA_MEMDUMP_COLLECTION with
clear_and_wake_up_bit(), which also wakes up the waiting thread and
allows the hw_error handling to proceed immediately.
Test case:
- Trigger a controller coredump using:
hcitool cmd 0x3f 0c 26
- Tested on QCA6390.
- Capture HCI logs using btmon.
- Verify that the delay between receiving the hw_error event and
initiating the power-off sequence is reduced compared to the
timeout-based behavior.
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de>
Signed-off-by: Shuai Zhang <shuai.zhang@oss.qualcomm.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
|
||
|---|---|---|
| .. | ||
| Kconfig | ||
| Makefile | ||
| ath3k.c | ||
| bcm203x.c | ||
| bfusb.c | ||
| bluecard_cs.c | ||
| bpa10x.c | ||
| bt3c_cs.c | ||
| btbcm.c | ||
| btbcm.h | ||
| btintel.c | ||
| btintel.h | ||
| btintel_pcie.c | ||
| btintel_pcie.h | ||
| btmrvl_debugfs.c | ||
| btmrvl_drv.h | ||
| btmrvl_main.c | ||
| btmrvl_sdio.c | ||
| btmrvl_sdio.h | ||
| btmtk.c | ||
| btmtk.h | ||
| btmtksdio.c | ||
| btmtkuart.c | ||
| btnxpuart.c | ||
| btqca.c | ||
| btqca.h | ||
| btqcomsmd.c | ||
| btrsi.c | ||
| btrtl.c | ||
| btrtl.h | ||
| btsdio.c | ||
| btusb.c | ||
| dtl1_cs.c | ||
| hci_ag6xx.c | ||
| hci_aml.c | ||
| hci_ath.c | ||
| hci_bcm.c | ||
| hci_bcm4377.c | ||
| hci_bcsp.c | ||
| hci_h4.c | ||
| hci_h5.c | ||
| hci_intel.c | ||
| hci_ldisc.c | ||
| hci_ll.c | ||
| hci_mrvl.c | ||
| hci_nokia.c | ||
| hci_qca.c | ||
| hci_serdev.c | ||
| hci_uart.h | ||
| hci_vhci.c | ||
| virtio_bt.c | ||