|
@@ -185,6 +185,7 @@ static void hci_reset_req(struct hci_dev *hdev, unsigned long opt)
|
|
|
BT_DBG("%s %ld", hdev->name, opt);
|
|
|
|
|
|
/* Reset device */
|
|
|
+ set_bit(HCI_RESET, &hdev->flags);
|
|
|
hci_send_cmd(hdev, HCI_OP_RESET, 0, NULL);
|
|
|
}
|
|
|
|
|
@@ -212,8 +213,10 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt)
|
|
|
/* Mandatory initialization */
|
|
|
|
|
|
/* Reset */
|
|
|
- if (!test_bit(HCI_QUIRK_NO_RESET, &hdev->quirks))
|
|
|
+ if (!test_bit(HCI_QUIRK_NO_RESET, &hdev->quirks)) {
|
|
|
+ set_bit(HCI_RESET, &hdev->flags);
|
|
|
hci_send_cmd(hdev, HCI_OP_RESET, 0, NULL);
|
|
|
+ }
|
|
|
|
|
|
/* Read Local Supported Features */
|
|
|
hci_send_cmd(hdev, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
|
|
@@ -583,6 +586,9 @@ static int hci_dev_do_close(struct hci_dev *hdev)
|
|
|
hci_req_cancel(hdev, ENODEV);
|
|
|
hci_req_lock(hdev);
|
|
|
|
|
|
+ /* Stop timer, it might be running */
|
|
|
+ del_timer_sync(&hdev->cmd_timer);
|
|
|
+
|
|
|
if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
|
|
|
hci_req_unlock(hdev);
|
|
|
return 0;
|
|
@@ -622,7 +628,6 @@ static int hci_dev_do_close(struct hci_dev *hdev)
|
|
|
|
|
|
/* Drop last sent command */
|
|
|
if (hdev->sent_cmd) {
|
|
|
- del_timer_sync(&hdev->cmd_timer);
|
|
|
kfree_skb(hdev->sent_cmd);
|
|
|
hdev->sent_cmd = NULL;
|
|
|
}
|
|
@@ -1073,6 +1078,7 @@ static void hci_cmd_timer(unsigned long arg)
|
|
|
|
|
|
BT_ERR("%s command tx timeout", hdev->name);
|
|
|
atomic_set(&hdev->cmd_cnt, 1);
|
|
|
+ clear_bit(HCI_RESET, &hdev->flags);
|
|
|
tasklet_schedule(&hdev->cmd_task);
|
|
|
}
|
|
|
|