HCI_QUALITY_REPORT,
        HCI_OFFLOAD_CODECS_ENABLED,
        HCI_LE_SIMULTANEOUS_ROLES,
+       HCI_CMD_DRAIN_WORKQUEUE,
 
        __HCI_NUM_FLAGS,
 };
 
        skb_queue_purge(&hdev->rx_q);
        skb_queue_purge(&hdev->cmd_q);
 
+       /* Cancel these to avoid queueing non-chained pending work */
+       hci_dev_set_flag(hdev, HCI_CMD_DRAIN_WORKQUEUE);
+       cancel_delayed_work(&hdev->cmd_timer);
+       cancel_delayed_work(&hdev->ncmd_timer);
+
        /* Avoid potential lockdep warnings from the *_flush() calls by
         * ensuring the workqueue is empty up front.
         */
        if (hdev->flush)
                hdev->flush(hdev);
 
+       hci_dev_clear_flag(hdev, HCI_CMD_DRAIN_WORKQUEUE);
+
        atomic_set(&hdev->cmd_cnt, 1);
        hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0;
 
                        if (res < 0)
                                __hci_cmd_sync_cancel(hdev, -res);
 
-                       if (test_bit(HCI_RESET, &hdev->flags))
+                       if (test_bit(HCI_RESET, &hdev->flags) ||
+                           hci_dev_test_flag(hdev, HCI_CMD_DRAIN_WORKQUEUE))
                                cancel_delayed_work(&hdev->cmd_timer);
                        else
                                schedule_delayed_work(&hdev->cmd_timer,
 
                        cancel_delayed_work(&hdev->ncmd_timer);
                        atomic_set(&hdev->cmd_cnt, 1);
                } else {
-                       schedule_delayed_work(&hdev->ncmd_timer,
-                                             HCI_NCMD_TIMEOUT);
+                       if (!hci_dev_test_flag(hdev, HCI_CMD_DRAIN_WORKQUEUE))
+                               schedule_delayed_work(&hdev->ncmd_timer,
+                                                     HCI_NCMD_TIMEOUT);
                }
        }
 }