]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Bluetooth: btintel_pcie: Fix event packet loss issue
authorKiran K <kiran.k@intel.com>
Thu, 16 Oct 2025 04:30:43 +0000 (10:00 +0530)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 24 Oct 2025 14:31:06 +0000 (10:31 -0400)
In the current btintel_pcie driver implementation, when an interrupt is
received, the driver checks for the alive cause before the TX/RX cause.
Handling the alive cause involves resetting the TX/RX queue indices.
This flow works correctly when the causes are mutually exclusive.
However, if both cause bits are set simultaneously, the alive cause
resets the queue indices, resulting in an event packet drop and a
command timeout. To fix this issue, the driver is modified to handle all
other causes before checking for the alive cause.

Test case:
Issue is seen with stress reboot scenario - 50x run

[20.337589] Bluetooth: hci0: Device revision is 0
[20.346750] Bluetooth: hci0: Secure boot is enabled
[20.346752] Bluetooth: hci0: OTP lock is disabled
[20.346752] Bluetooth: hci0: API lock is enabled
[20.346752] Bluetooth: hci0: Debug lock is disabled
[20.346753] Bluetooth: hci0: Minimum firmware build 1 week 10 2014
[20.346754] Bluetooth: hci0: Bootloader timestamp 2023.43 buildtype 1 build 11631
[20.359070] Bluetooth: hci0: Found device firmware: intel/ibt-00a0-00a1-iml.sfi
[20.371499] Bluetooth: hci0: Boot Address: 0xb02ff800
[20.385769] Bluetooth: hci0: Firmware Version: 166-34.25
[20.538257] Bluetooth: hci0: Waiting for firmware download to complete
[20.554424] Bluetooth: hci0: Firmware loaded in 178651 usecs
[21.081588] Bluetooth: hci0: Timeout (500 ms) on tx completion
[21.096541] Bluetooth: hci0: Failed to send frame (-62)
[21.110240] Bluetooth: hci0: sending frame failed (-62)
[21.138551] Bluetooth: hci0: Failed to send Intel Reset command
[21.170153] Bluetooth: hci0: Intel Soft Reset failed (-62)

Signed-off-by: Kiran K <kiran.k@intel.com>
Signed-off-by: Sai Teja Aluvala <aluvala.sai.teja@intel.com>
Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de>
Fixes: c2b636b3f788 ("Bluetooth: btintel_pcie: Add support for PCIe transport")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/btintel_pcie.c

index 6d3963bd56a9c686d071f828e3c8b10630c36bf4..a075d8ec467738acc741e46c53acd4b4cdb61c0d 100644 (file)
@@ -1467,11 +1467,6 @@ static irqreturn_t btintel_pcie_irq_msix_handler(int irq, void *dev_id)
        if (intr_hw & BTINTEL_PCIE_MSIX_HW_INT_CAUSES_GP1)
                btintel_pcie_msix_gp1_handler(data);
 
-       /* This interrupt is triggered by the firmware after updating
-        * boot_stage register and image_response register
-        */
-       if (intr_hw & BTINTEL_PCIE_MSIX_HW_INT_CAUSES_GP0)
-               btintel_pcie_msix_gp0_handler(data);
 
        /* For TX */
        if (intr_fh & BTINTEL_PCIE_MSIX_FH_INT_CAUSES_0) {
@@ -1487,6 +1482,12 @@ static irqreturn_t btintel_pcie_irq_msix_handler(int irq, void *dev_id)
                        btintel_pcie_msix_tx_handle(data);
        }
 
+       /* This interrupt is triggered by the firmware after updating
+        * boot_stage register and image_response register
+        */
+       if (intr_hw & BTINTEL_PCIE_MSIX_HW_INT_CAUSES_GP0)
+               btintel_pcie_msix_gp0_handler(data);
+
        /*
         * Before sending the interrupt the HW disables it to prevent a nested
         * interrupt. This is done by writing 1 to the corresponding bit in