Re: [PATCH v1 2/2] Bluetooth: btintel_pcie: Fix alive context state handling

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

 



Hi Kiran,

On Sun, Jul 6, 2025 at 11:30 PM Kiran K <kiran.k@xxxxxxxxx> wrote:
>
> Firmware raises alive interrpt on sending 0xfc01 command. Alive context
> maintained in driver needs to be updated before sending 0xfc01 (Intel
> Reset) or 0x03c0 (HCI Reset) to avoid the potential race condition where
> the context is also updated in threaded irq.

This should be a little more specific, like explaining what is alive
interrupt supposed to mean or if we cannot do any communication wheel
these are pending?

> Signed-off-by: Kiran K <kiran.k@xxxxxxxxx>
> Signed-off-by: Sai Teja Aluvala <aluvala.sai.teja@xxxxxxxxx>
> Fixes: 05c200c8f029 ("Bluetooth: btintel_pcie: Add handshake between driver and firmware")
> ---
>  drivers/bluetooth/btintel_pcie.c | 25 ++++++++++++++-----------
>  1 file changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/bluetooth/btintel_pcie.c b/drivers/bluetooth/btintel_pcie.c
> index f893ad6fc87a..d29103b102e4 100644
> --- a/drivers/bluetooth/btintel_pcie.c
> +++ b/drivers/bluetooth/btintel_pcie.c
> @@ -1988,10 +1988,6 @@ static int btintel_pcie_send_frame(struct hci_dev *hdev,
>                                 btintel_pcie_inject_cmd_complete(hdev, opcode);
>                 }
>
> -               /* Firmware raises alive interrupt on HCI_OP_RESET or 0xfc01*/
> -               if (opcode == HCI_OP_RESET || opcode == 0xfc01)
> -                       data->gp0_received = false;
> -
>                 hdev->stat.cmd_tx++;
>                 break;
>         case HCI_ACLDATA_PKT:
> @@ -2012,6 +2008,20 @@ static int btintel_pcie_send_frame(struct hci_dev *hdev,
>         memcpy(skb_push(skb, BTINTEL_PCIE_HCI_TYPE_LEN), &type,
>                BTINTEL_PCIE_HCI_TYPE_LEN);
>
> +       if (type == BTINTEL_PCIE_HCI_CMD_PKT) {
> +               /* Firmware raises alive interrupt on HCI_OP_RESET or 0xfc01*/
> +               if (opcode == HCI_OP_RESET || opcode == 0xfc01) {
> +                       data->gp0_received = false;

This type of flags should really be made into atomic flags so they can
be checked atomically, anyway this shouldn't block these fixes but
something I very much look forward to be changed.

> +                       old_ctxt = data->alive_intr_ctxt;
> +                       data->alive_intr_ctxt =
> +                               (opcode == 0xfc01 ? BTINTEL_PCIE_INTEL_HCI_RESET1 :
> +                                       BTINTEL_PCIE_HCI_RESET);
> +                       bt_dev_dbg(data->hdev, "sending cmd: 0x%4.4x alive context changed: %s  ->  %s",
> +                                  opcode, btintel_pcie_alivectxt_state2str(old_ctxt),
> +                                  btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt));
> +               }
> +       }
> +
>         ret = btintel_pcie_send_sync(data, skb);
>         if (ret) {
>                 hdev->stat.err_tx++;
> @@ -2021,13 +2031,6 @@ static int btintel_pcie_send_frame(struct hci_dev *hdev,
>
>         if (type == BTINTEL_PCIE_HCI_CMD_PKT &&
>             (opcode == HCI_OP_RESET || opcode == 0xfc01)) {
> -               old_ctxt = data->alive_intr_ctxt;
> -               data->alive_intr_ctxt =
> -                       (opcode == 0xfc01 ? BTINTEL_PCIE_INTEL_HCI_RESET1 :
> -                               BTINTEL_PCIE_HCI_RESET);
> -               bt_dev_dbg(data->hdev, "sent cmd: 0x%4.4x alive context changed: %s  ->  %s",
> -                          opcode, btintel_pcie_alivectxt_state2str(old_ctxt),
> -                          btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt));
>                 ret = wait_event_timeout(data->gp0_wait_q,
>                                          data->gp0_received,
>                                          msecs_to_jiffies(BTINTEL_DEFAULT_INTR_TIMEOUT_MS));
> --
> 2.43.0
>
>


-- 
Luiz Augusto von Dentz





[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