Bluetooth: btusb: Move btusb_recv_event_intel to btintel
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 20 Jul 2023 22:16:32 +0000 (15:16 -0700)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 11 Aug 2023 18:51:53 +0000 (11:51 -0700)
btusb_recv_event_intel is specific to Intel controllers therefore it
shall be placed inside btintel.c so btusb don't have a mix of vendor
specific code with the generic parts.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/btintel.c
drivers/bluetooth/btintel.h
drivers/bluetooth/btusb.c

index b32277c..633e8d9 100644 (file)
@@ -2948,6 +2948,80 @@ int btintel_configure_setup(struct hci_dev *hdev, const char *driver_name)
 }
 EXPORT_SYMBOL_GPL(btintel_configure_setup);
 
+static int btintel_diagnostics(struct hci_dev *hdev, struct sk_buff *skb)
+{
+       struct intel_tlv *tlv = (void *)&skb->data[5];
+
+       /* The first event is always an event type TLV */
+       if (tlv->type != INTEL_TLV_TYPE_ID)
+               goto recv_frame;
+
+       switch (tlv->val[0]) {
+       case INTEL_TLV_SYSTEM_EXCEPTION:
+       case INTEL_TLV_FATAL_EXCEPTION:
+       case INTEL_TLV_DEBUG_EXCEPTION:
+       case INTEL_TLV_TEST_EXCEPTION:
+               /* Generate devcoredump from exception */
+               if (!hci_devcd_init(hdev, skb->len)) {
+                       hci_devcd_append(hdev, skb);
+                       hci_devcd_complete(hdev);
+               } else {
+                       bt_dev_err(hdev, "Failed to generate devcoredump");
+                       kfree_skb(skb);
+               }
+               return 0;
+       default:
+               bt_dev_err(hdev, "Invalid exception type %02X", tlv->val[0]);
+       }
+
+recv_frame:
+       return hci_recv_frame(hdev, skb);
+}
+
+int btintel_recv_event(struct hci_dev *hdev, struct sk_buff *skb)
+{
+       struct hci_event_hdr *hdr = (void *)skb->data;
+       const char diagnostics_hdr[] = { 0x87, 0x80, 0x03 };
+
+       if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff &&
+           hdr->plen > 0) {
+               const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1;
+               unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1;
+
+               if (btintel_test_flag(hdev, INTEL_BOOTLOADER)) {
+                       switch (skb->data[2]) {
+                       case 0x02:
+                               /* When switching to the operational firmware
+                                * the device sends a vendor specific event
+                                * indicating that the bootup completed.
+                                */
+                               btintel_bootup(hdev, ptr, len);
+                               break;
+                       case 0x06:
+                               /* When the firmware loading completes the
+                                * device sends out a vendor specific event
+                                * indicating the result of the firmware
+                                * loading.
+                                */
+                               btintel_secure_send_result(hdev, ptr, len);
+                               break;
+                       }
+               }
+
+               /* Handle all diagnostics events separately. May still call
+                * hci_recv_frame.
+                */
+               if (len >= sizeof(diagnostics_hdr) &&
+                   memcmp(&skb->data[2], diagnostics_hdr,
+                          sizeof(diagnostics_hdr)) == 0) {
+                       return btintel_diagnostics(hdev, skb);
+               }
+       }
+
+       return hci_recv_frame(hdev, skb);
+}
+EXPORT_SYMBOL_GPL(btintel_recv_event);
+
 void btintel_bootup(struct hci_dev *hdev, const void *ptr, unsigned int len)
 {
        const struct intel_bootup *evt = ptr;
index 7fd29ef..2ed6466 100644 (file)
@@ -222,6 +222,7 @@ int btintel_read_boot_params(struct hci_dev *hdev,
 int btintel_download_firmware(struct hci_dev *dev, struct intel_version *ver,
                              const struct firmware *fw, u32 *boot_param);
 int btintel_configure_setup(struct hci_dev *hdev, const char *driver_name);
+int btintel_recv_event(struct hci_dev *hdev, struct sk_buff *skb);
 void btintel_bootup(struct hci_dev *hdev, const void *ptr, unsigned int len);
 void btintel_secure_send_result(struct hci_dev *hdev,
                                const void *ptr, unsigned int len);
index 48dd18c..1bb3b09 100644 (file)
@@ -2492,79 +2492,6 @@ static int btusb_recv_bulk_intel(struct btusb_data *data, void *buffer,
        return btusb_recv_bulk(data, buffer, count);
 }
 
-static int btusb_intel_diagnostics(struct hci_dev *hdev, struct sk_buff *skb)
-{
-       struct intel_tlv *tlv = (void *)&skb->data[5];
-
-       /* The first event is always an event type TLV */
-       if (tlv->type != INTEL_TLV_TYPE_ID)
-               goto recv_frame;
-
-       switch (tlv->val[0]) {
-       case INTEL_TLV_SYSTEM_EXCEPTION:
-       case INTEL_TLV_FATAL_EXCEPTION:
-       case INTEL_TLV_DEBUG_EXCEPTION:
-       case INTEL_TLV_TEST_EXCEPTION:
-               /* Generate devcoredump from exception */
-               if (!hci_devcd_init(hdev, skb->len)) {
-                       hci_devcd_append(hdev, skb);
-                       hci_devcd_complete(hdev);
-               } else {
-                       bt_dev_err(hdev, "Failed to generate devcoredump");
-                       kfree_skb(skb);
-               }
-               return 0;
-       default:
-               bt_dev_err(hdev, "Invalid exception type %02X", tlv->val[0]);
-       }
-
-recv_frame:
-       return hci_recv_frame(hdev, skb);
-}
-
-static int btusb_recv_event_intel(struct hci_dev *hdev, struct sk_buff *skb)
-{
-       struct hci_event_hdr *hdr = (void *)skb->data;
-       const char diagnostics_hdr[] = { 0x87, 0x80, 0x03 };
-
-       if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff &&
-           hdr->plen > 0) {
-               const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1;
-               unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1;
-
-               if (btintel_test_flag(hdev, INTEL_BOOTLOADER)) {
-                       switch (skb->data[2]) {
-                       case 0x02:
-                               /* When switching to the operational firmware
-                                * the device sends a vendor specific event
-                                * indicating that the bootup completed.
-                                */
-                               btintel_bootup(hdev, ptr, len);
-                               break;
-                       case 0x06:
-                               /* When the firmware loading completes the
-                                * device sends out a vendor specific event
-                                * indicating the result of the firmware
-                                * loading.
-                                */
-                               btintel_secure_send_result(hdev, ptr, len);
-                               break;
-                       }
-               }
-
-               /* Handle all diagnostics events separately. May still call
-                * hci_recv_frame.
-                */
-               if (len >= sizeof(diagnostics_hdr) &&
-                   memcmp(&skb->data[2], diagnostics_hdr,
-                          sizeof(diagnostics_hdr)) == 0) {
-                       return btusb_intel_diagnostics(hdev, skb);
-               }
-       }
-
-       return hci_recv_frame(hdev, skb);
-}
-
 static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb)
 {
        struct urb *urb;
@@ -4350,7 +4277,7 @@ static int btusb_probe(struct usb_interface *intf,
                priv_size += sizeof(struct btintel_data);
 
                /* Override the rx handlers */
-               data->recv_event = btusb_recv_event_intel;
+               data->recv_event = btintel_recv_event;
                data->recv_bulk = btusb_recv_bulk_intel;
        } else if (id->driver_info & BTUSB_REALTEK) {
                /* Allocate extra space for Realtek device */