From: Hans de Goede <hdegoede@redhat.com>
To: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Cc: Marcel Holtmann <marcel@holtmann.org>,
Johan Hedberg <johan.hedberg@gmail.com>,
"linux-bluetooth@vger.kernel.org"
<linux-bluetooth@vger.kernel.org>,
Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Subject: Re: [PATCH] Bluetooth: hci_event: Fix vendor (unknown) opcode status handling
Date: Thu, 11 Aug 2022 13:52:11 +0200 [thread overview]
Message-ID: <065a9f83-e99f-1540-528a-83eb0203e206@redhat.com> (raw)
In-Reply-To: <CABBYNZ+kUVT5K_+jiGn6eU=yOde+3Fmq6KHPmyawgbZMCseh1A@mail.gmail.com>
Hi Luiz,
On 8/11/22 00:26, Luiz Augusto von Dentz wrote:
> Hi Hans,
>
> On Mon, Aug 8, 2022 at 12:58 PM Luiz Augusto von Dentz
> <luiz.dentz@gmail.com> wrote:
>>
>> Hi Hans,
>>
>> On Sun, Aug 7, 2022 at 1:57 PM Hans de Goede <hdegoede@redhat.com> 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@intel.com>
>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>>> ---
>>> 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.
Right, sorry for being a bit slow. I will prepare + email a version 2
adding a comment that byte 0 being the status is not guaranteed with
vendor commands right away.
Regards,
Hans
>
>>> handle_cmd_cnt_and_timer(hdev, ev->ncmd);
>>>
>>> --
>>> 2.37.1
>>>
>>
>>
>> --
>> Luiz Augusto von Dentz
>
>
>
prev parent reply other threads:[~2022-08-11 11:53 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-07 20:57 [PATCH] Bluetooth: hci_event: Fix vendor (unknown) opcode status handling Hans de Goede
2022-08-07 21:59 ` bluez.test.bot
2022-08-08 7:50 ` Hans de Goede
2022-08-08 19:58 ` [PATCH] " Luiz Augusto von Dentz
2022-08-10 22:26 ` Luiz Augusto von Dentz
2022-08-11 11:52 ` Hans de Goede [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=065a9f83-e99f-1540-528a-83eb0203e206@redhat.com \
--to=hdegoede@redhat.com \
--cc=johan.hedberg@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
--cc=luiz.von.dentz@intel.com \
--cc=marcel@holtmann.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox