]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: btintel: Check if controller is ISO capable on btintel_classify_pkt_type
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 9 Jul 2025 19:02:56 +0000 (15:02 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 24 Jul 2025 06:58:28 +0000 (08:58 +0200)
commit 6ec3185fbc3528f2284c347fb9bd8be6fa672ed4 upstream.

Due to what seem to be a bug with variant version returned by some
firmwares the code may set hdev->classify_pkt_type with
btintel_classify_pkt_type when in fact the controller doesn't even
support ISO channels feature but may use the handle range expected from
a controllers that does causing the packets to be reclassified as ISO
causing several bugs.

To fix the above btintel_classify_pkt_type will attempt to check if the
controller really supports ISO channels and in case it doesn't don't
reclassify even if the handle range is considered to be ISO, this is
considered safer than trying to fix the specific controller/firmware
version as that could change over time and causing similar problems in
the future.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=219553
Link: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2100565
Link: https://github.com/StarLabsLtd/firmware/issues/180
Fixes: f25b7fd36cc3 ("Bluetooth: Add vendor-specific packet classification for ISO data")
Cc: stable@vger.kernel.org
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tested-by: Sean Rhodes <sean@starlabs.systems>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/bluetooth/btintel.c

index 46d9bbd8e411b34969421cc04ddda3763b79caf1..c66bf13c19a5c0ed92e2b43f69af13947723a55d 100644 (file)
@@ -2670,7 +2670,7 @@ static u8 btintel_classify_pkt_type(struct hci_dev *hdev, struct sk_buff *skb)
         * Distinguish ISO data packets form ACL data packets
         * based on their connection handle value range.
         */
-       if (hci_skb_pkt_type(skb) == HCI_ACLDATA_PKT) {
+       if (iso_capable(hdev) && hci_skb_pkt_type(skb) == HCI_ACLDATA_PKT) {
                __u16 handle = __le16_to_cpu(hci_acl_hdr(skb)->handle);
 
                if (hci_handle(handle) >= BTINTEL_ISODATA_HANDLE_BASE)