|
@@ -1719,32 +1719,14 @@ done:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-int hci_dev_reset(__u16 dev)
|
|
|
+static int hci_dev_do_reset(struct hci_dev *hdev)
|
|
|
{
|
|
|
- struct hci_dev *hdev;
|
|
|
- int ret = 0;
|
|
|
+ int ret;
|
|
|
|
|
|
- hdev = hci_dev_get(dev);
|
|
|
- if (!hdev)
|
|
|
- return -ENODEV;
|
|
|
+ BT_DBG("%s %p", hdev->name, hdev);
|
|
|
|
|
|
hci_req_lock(hdev);
|
|
|
|
|
|
- if (!test_bit(HCI_UP, &hdev->flags)) {
|
|
|
- ret = -ENETDOWN;
|
|
|
- goto done;
|
|
|
- }
|
|
|
-
|
|
|
- if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
|
|
|
- ret = -EBUSY;
|
|
|
- goto done;
|
|
|
- }
|
|
|
-
|
|
|
- if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
|
|
|
- ret = -EOPNOTSUPP;
|
|
|
- goto done;
|
|
|
- }
|
|
|
-
|
|
|
/* Drop queues */
|
|
|
skb_queue_purge(&hdev->rx_q);
|
|
|
skb_queue_purge(&hdev->cmd_q);
|
|
@@ -1767,12 +1749,41 @@ int hci_dev_reset(__u16 dev)
|
|
|
|
|
|
ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT);
|
|
|
|
|
|
-done:
|
|
|
hci_req_unlock(hdev);
|
|
|
- hci_dev_put(hdev);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+int hci_dev_reset(__u16 dev)
|
|
|
+{
|
|
|
+ struct hci_dev *hdev;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ hdev = hci_dev_get(dev);
|
|
|
+ if (!hdev)
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
+ if (!test_bit(HCI_UP, &hdev->flags)) {
|
|
|
+ err = -ENETDOWN;
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
|
|
|
+ err = -EBUSY;
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
|
|
|
+ err = -EOPNOTSUPP;
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ err = hci_dev_do_reset(hdev);
|
|
|
+
|
|
|
+done:
|
|
|
+ hci_dev_put(hdev);
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
int hci_dev_reset_stat(__u16 dev)
|
|
|
{
|
|
|
struct hci_dev *hdev;
|