data->acpi_reset_method = btintel_acpi_reset_method;
 }
 
+#define BTINTEL_ISODATA_HANDLE_BASE 0x900
+
+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) {
+               __u16 handle = __le16_to_cpu(hci_acl_hdr(skb)->handle);
+
+               if (hci_handle(handle) >= BTINTEL_ISODATA_HANDLE_BASE)
+                       return HCI_ISODATA_PKT;
+       }
+
+       return hci_skb_pkt_type(skb);
+}
+
 int btintel_bootloader_setup_tlv(struct hci_dev *hdev,
                                 struct intel_version_tlv *ver)
 {
                err = btintel_bootloader_setup(hdev, &ver);
                btintel_register_devcoredump_support(hdev);
                break;
+       case 0x18: /* GfP2 */
+       case 0x1c: /* GaP */
+               /* Re-classify packet type for controllers with LE audio */
+               hdev->classify_pkt_type = btintel_classify_pkt_type;
+               fallthrough;
        case 0x17:
-       case 0x18:
        case 0x19:
        case 0x1b:
-       case 0x1c:
        case 0x1e:
                /* Display version information of TLV type */
                btintel_version_info_tlv(hdev, &ver_tlv);
 
        int (*get_codec_config_data)(struct hci_dev *hdev, __u8 type,
                                     struct bt_codec *codec, __u8 *vnd_len,
                                     __u8 **vnd_data);
+       u8 (*classify_pkt_type)(struct hci_dev *hdev, struct sk_buff *skb);
 };
 
 #define HCI_PHY_HANDLE(handle) (handle & 0xff)
 
 }
 EXPORT_SYMBOL(hci_reset_dev);
 
+static u8 hci_dev_classify_pkt_type(struct hci_dev *hdev, struct sk_buff *skb)
+{
+       if (hdev->classify_pkt_type)
+               return hdev->classify_pkt_type(hdev, skb);
+
+       return hci_skb_pkt_type(skb);
+}
+
 /* Receive frame from HCI drivers */
 int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
+       u8 dev_pkt_type;
+
        if (!hdev || (!test_bit(HCI_UP, &hdev->flags)
                      && !test_bit(HCI_INIT, &hdev->flags))) {
                kfree_skb(skb);
                return -ENXIO;
        }
 
+       /* Check if the driver agree with packet type classification */
+       dev_pkt_type = hci_dev_classify_pkt_type(hdev, skb);
+       if (hci_skb_pkt_type(skb) != dev_pkt_type) {
+               hci_skb_pkt_type(skb) = dev_pkt_type;
+       }
+
        switch (hci_skb_pkt_type(skb)) {
        case HCI_EVENT_PKT:
                break;