Patch "Bluetooth: hci_event: Fix vendor (unknown) opcode status handling" has been added to the 5.19-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    Bluetooth: hci_event: Fix vendor (unknown) opcode status handling

to the 5.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     bluetooth-hci_event-fix-vendor-unknown-opcode-status.patch
and it can be found in the queue-5.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit ffdbd7535888af8bf865b5db8d070057b7579aab
Author: Hans de Goede <hdegoede@xxxxxxxxxx>
Date:   Sun Aug 7 22:57:40 2022 +0200

    Bluetooth: hci_event: Fix vendor (unknown) opcode status handling
    
    [ Upstream commit b82a26d8633cc89367fac75beb3ec33061bea44a ]
    
    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")
    Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 7cb956d3abb26..67c61f5240596 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -3998,6 +3998,17 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, void *data,
 		}
 	}
 
+	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.
+		 * If a vendor doesn't actually follow this convention we may
+		 * need to introduce a vendor CC table in order to properly set
+		 * the status.
+		 */
+		*status = skb->data[0];
+	}
+
 	handle_cmd_cnt_and_timer(hdev, ev->ncmd);
 
 	hci_req_cmd_complete(hdev, *opcode, *status, req_complete,



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux