BT_DBG("%s", hdev->name);
 
+       /* The some controllers have a bug with the first HCI command sent to it
+        * returning number of completed commands as zero. This would stall the
+        * command processing in the Bluetooth core.
+        *
+        * As a workaround, send HCI Reset command first which will reset the
+        * number of completed commands and allow normal command processing
+        * from now on.
+        */
+       if (btintel_test_flag(hdev, INTEL_BROKEN_INITIAL_NCMD)) {
+               skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL,
+                                    HCI_INIT_TIMEOUT);
+               if (IS_ERR(skb)) {
+                       bt_dev_err(hdev,
+                                  "sending initial HCI reset failed (%ld)",
+                                  PTR_ERR(skb));
+                       return PTR_ERR(skb);
+               }
+               kfree_skb(skb);
+       }
+
        /* Starting from TyP device, the command parameter and response are
         * changed even though the OCF for HCI_Intel_Read_Version command
         * remains same. The legacy devices can handle even if the
 
 #define BTUSB_VALID_LE_STATES   0x800000
 #define BTUSB_QCA_WCN6855      0x1000000
 #define BTUSB_INTEL_NEWGEN     0x2000000
+#define BTUSB_INTEL_BROKEN_INITIAL_NCMD 0x4000000
 
 static const struct usb_device_id btusb_table[] = {
        /* Generic Bluetooth USB device */
                                                     BTUSB_WIDEBAND_SPEECH |
                                                     BTUSB_VALID_LE_STATES },
        { USB_DEVICE(0x8087, 0x07da), .driver_info = BTUSB_CSR },
-       { USB_DEVICE(0x8087, 0x07dc), .driver_info = BTUSB_INTEL_COMBINED },
+       { USB_DEVICE(0x8087, 0x07dc), .driver_info = BTUSB_INTEL_COMBINED |
+                                                    BTUSB_INTEL_BROKEN_INITIAL_NCMD },
        { USB_DEVICE(0x8087, 0x0a2a), .driver_info = BTUSB_INTEL_COMBINED },
        { USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW |
                                                     BTUSB_WIDEBAND_SPEECH },
                set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
                set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
                set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
+
+               if (id->driver_info & BTUSB_INTEL_BROKEN_INITIAL_NCMD)
+                       btintel_set_flag(hdev, INTEL_BROKEN_INITIAL_NCMD);
        }
 
        if (id->driver_info & BTUSB_INTEL_NEW) {