void hci_cmd_sync_cancel(struct hci_dev *hdev, int err);
 void __hci_cmd_sync_cancel(struct hci_dev *hdev, int err);
 
+int hci_cmd_sync_submit(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                       void *data, hci_cmd_sync_work_destroy_t destroy);
 int hci_cmd_sync_queue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
                       void *data, hci_cmd_sync_work_destroy_t destroy);
 
 
 }
 EXPORT_SYMBOL(hci_cmd_sync_cancel);
 
-int hci_cmd_sync_queue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
-                      void *data, hci_cmd_sync_work_destroy_t destroy)
+/* Submit HCI command to be run in as cmd_sync_work:
+ *
+ * - hdev must _not_ be unregistered
+ */
+int hci_cmd_sync_submit(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                       void *data, hci_cmd_sync_work_destroy_t destroy)
 {
        struct hci_cmd_sync_work_entry *entry;
 
 
        return 0;
 }
+EXPORT_SYMBOL(hci_cmd_sync_submit);
+
+/* Queue HCI command:
+ *
+ * - hdev must be running
+ */
+int hci_cmd_sync_queue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                      void *data, hci_cmd_sync_work_destroy_t destroy)
+{
+       /* Only queue command if hdev is running which means it had been opened
+        * and is either on init phase or is already up.
+        */
+       if (!test_bit(HCI_RUNNING, &hdev->flags))
+               return -ENETDOWN;
+
+       return hci_cmd_sync_submit(hdev, func, data, destroy);
+}
 EXPORT_SYMBOL(hci_cmd_sync_queue);
 
 int hci_update_eir_sync(struct hci_dev *hdev)
 
        }
 
        /* Cancel potentially blocking sync operation before power off */
-       if (cp->val == 0x00)
+       if (cp->val == 0x00) {
                __hci_cmd_sync_cancel(hdev, -EHOSTDOWN);
-
-       err = hci_cmd_sync_queue(hdev, set_powered_sync, cmd,
-                                mgmt_set_powered_complete);
+               err = hci_cmd_sync_queue(hdev, set_powered_sync, cmd,
+                                        mgmt_set_powered_complete);
+       } else {
+               /* Use hci_cmd_sync_submit since hdev might not be running */
+               err = hci_cmd_sync_submit(hdev, set_powered_sync, cmd,
+                                         mgmt_set_powered_complete);
+       }
 
        if (err < 0)
                mgmt_pending_remove(cmd);