Re: [PATCH] Bluetooth: hci_event: Fix vendor (unknown) opcode status handling

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

 



Hi Hans,

On Mon, Aug 8, 2022 at 12:58 PM Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
>
> Hi Hans,
>
> On Sun, Aug 7, 2022 at 1:57 PM Hans de Goede <hdegoede@xxxxxxxxxx> wrote:
> >
> > Commit c8992cffbe74 ("Bluetooth: hci_event: Use of a function table to
> > handle Command Complete") was (presumably) meant to only refactor things
> > without any functional changes.
> >
> > But it does have one undesirable side-effect, before *status would always
> > be set to skb->data[0] and it might be overridden by some of the opcode
> > specific handling. While now it always set by the opcode specific handlers.
> > This means that if the opcode is not known *status does not get set any
> > more at all!
> >
> > This behavior change has broken bluetooth support for BCM4343A0 HCIs,
> > the hci_bcm.c code tries to configure UART attached HCIs at a higher
> > baudraute using vendor specific opcodes. The BCM4343A0 does not
> > support this and this used to simply fail:
> >
> > [   25.646442] Bluetooth: hci0: BCM: failed to write clock (-56)
> > [   25.646481] Bluetooth: hci0: Failed to set baudrate
> >
> > After which things would continue with the initial baudraute. But now
> > that hci_cmd_complete_evt() no longer sets status for unknown opcodes
> > *status is left at 0. This causes the hci_bcm.c code to think the baudraute
> > has been changed on the HCI side and to also adjust the UART baudrate,
> > after which communication with the HCI is broken, leading to:
> >
> > [   28.579042] Bluetooth: hci0: command 0x0c03 tx timeout
> > [   36.961601] Bluetooth: hci0: BCM: Reset failed (-110)
> >
> > And non working bluetooth. Fix this by restoring the previous
> > default "*status = skb->data[0]" handling for unknown opcodes.
> >
> > Fixes: c8992cffbe74 ("Bluetooth: hci_event: Use of a function table to handle Command Complete")
> > Cc: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
> > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> > ---
> >  net/bluetooth/hci_event.c | 7 +++++++
> >  1 file changed, 7 insertions(+)
> >
> > diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> > index af17dfb20e01..fda31d558ded 100644
> > --- a/net/bluetooth/hci_event.c
> > +++ b/net/bluetooth/hci_event.c
> > @@ -3996,6 +3996,13 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, void *data,
> >                         break;
> >                 }
> >         }
> > +       if (i == ARRAY_SIZE(hci_cc_table)) {
> > +               /* Unknown opcode, assume byte 0 contains the status, so
> > +                * that e.g. __hci_cmd_sync() properly returns errors
> > +                * for vendor specific commands send by HCI drivers.
> > +                */
> > +               *status = skb->data[0];
> > +       }
>
> The format of return parameters in command is not defined by the spec:
>
> BLUETOOTH CORE SPECIFICATION Version 5.3 | Vol 4, Part E
> page 2189:
>
> Return_Parameters:
> Size: Depends on command
>
> This is the return parameter(s) for the command specified in the
> Command_Opcode event parameter. See each command’s definition for
> the list of return parameters associated with that command.
>
> So assuming the status is the first by is not quite right, although
> for the standard ones that seems to be valid, I think the best way to
> resolve this would have been to check if it a vendor command and then
> have the driver handle it or perhaps have some means for the driver to
> register it vendor_cc_table, we can perhaps have this as a workaround
> for now and only really change how we parse the cc for vendor commands
> if a vendor decide not to have a status as first parameter but Id
> probably leave a comment that quoting the spec that reminds us this
> code may need changing.

Are you still planning to send updates for this, I consider this quite
urgent given that it can break support with some vendors.

> >         handle_cmd_cnt_and_timer(hdev, ev->ncmd);
> >
> > --
> > 2.37.1
> >
>
>
> --
> Luiz Augusto von Dentz



-- 
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