Skip to content

Commit 75e10de

Browse files
committed
BACKPORT: driver: bluetooth: hci_qca: Fix SSR (SubSystem Restart) fail when BT_EN is pulled up by hw
On QCS9075 and QCA8275 platforms, the BT_EN pin is always pulled up by hw and cannot be controlled by the host. As a result, in case of a firmware crash, the host cannot trigger a cold reset. Instead, the BT controller performs a warm restart on its own, without reloading the firmware. This leads to the controller remaining in IBS_WAKE state, while the host expects it to be in sleep mode. The mismatch causes HCI reset commands to time out. Additionally, the driver does not clear internal flags QCA_SSR_TRIGGERED and QCA_IBS_DISABLED, which blocks the reset sequence. If the SSR duration exceeds 2 seconds, the host may enter TX sleep mode due to tx_idle_timeout, further preventing recovery. Also, memcoredump_flag is not cleared, so only the first SSR generates a coredump. Tell the driver that BT controller has undergone a proper restart sequence: - Clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED flags after SSR. - Add a 50ms delay to allow the controller to complete its warm reset. - Reset tx_idle_timer to prevent the host from entering TX sleep mode. - Clear memcoredump_flag to allow multiple coredump captures. Apply these steps only when HCI_QUIRK_NON_PERSISTENT_SETUP is not set, which indicates that BT_EN is defined in DTS and cannot be toggled. Refer to the comment in include/net/bluetooth/hci.h for details on HCI_QUIRK_NON_PERSISTENT_SETUP. Signed-off-by: Shuai Zhang <shuai.zhang@oss.qualcomm.com> Link: https://lore.kernel.org/all/20251203033712.446632-1-shuai.zhang@oss.qualcomm.com/
1 parent 89be9a8 commit 75e10de

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

drivers/bluetooth/hci_qca.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,6 +1653,24 @@ static void qca_hw_error(struct hci_dev *hdev, u8 code)
16531653
}
16541654

16551655
clear_bit(QCA_HW_ERROR_EVENT, &qca->flags);
1656+
1657+
/*
1658+
* If the SoC always enables the bt_en pin via hardware and the driver
1659+
* cannot control the bt_en pin of the SoC chip, then during SSR,
1660+
* the QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits cannot be cleared.
1661+
* This leads to a reset command timeout failure.
1662+
*
1663+
* To address this, clear QCA_SSR_TRIGGERED and QCA_IBS_DISABLED bits
1664+
* after the coredump collection is complete.
1665+
* Also, add msleep delay to wait for controller to complete SSR.
1666+
*/
1667+
if (!hci_test_quirk(hu->hdev, HCI_QUIRK_NON_PERSISTENT_SETUP)) {
1668+
clear_bit(QCA_SSR_TRIGGERED, &qca->flags);
1669+
clear_bit(QCA_IBS_DISABLED, &qca->flags);
1670+
qca->tx_ibs_state = HCI_IBS_TX_AWAKE;
1671+
qca->memdump_state = QCA_MEMDUMP_IDLE;
1672+
msleep(50);
1673+
}
16561674
}
16571675

16581676
static void qca_reset(struct hci_dev *hdev)

0 commit comments

Comments
 (0)