diff options
Diffstat (limited to 'net/bluetooth/hci_core.c')
-rw-r--r-- | net/bluetooth/hci_core.c | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 8c54b1d4d41b..420ed6a02337 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -1315,14 +1315,13 @@ static void hci_dev_get_bd_addr_from_property(struct hci_dev *hdev) bacpy(&hdev->public_addr, &ba); } -static int hci_dev_do_open(struct hci_dev *hdev) +/* TODO: Move this function into hci_sync.c */ +int hci_dev_open_sync(struct hci_dev *hdev) { int ret = 0; BT_DBG("%s %p", hdev->name, hdev); - hci_req_sync_lock(hdev); - if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) { ret = -ENODEV; goto done; @@ -1489,8 +1488,7 @@ setup_failed: !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && hci_dev_test_flag(hdev, HCI_MGMT) && hdev->dev_type == HCI_PRIMARY) { - ret = __hci_req_hci_power_on(hdev); - mgmt_power_on(hdev, ret); + ret = hci_powered_update_sync(hdev); } } else { /* Init failed, cleanup */ @@ -1522,6 +1520,19 @@ setup_failed: } done: + return ret; +} + +static int hci_dev_do_open(struct hci_dev *hdev) +{ + int ret = 0; + + BT_DBG("%s %p", hdev->name, hdev); + + hci_req_sync_lock(hdev); + + ret = hci_dev_open_sync(hdev); + hci_req_sync_unlock(hdev); return ret; } @@ -1600,7 +1611,8 @@ static void hci_pend_le_actions_clear(struct hci_dev *hdev) BT_DBG("All LE pending actions cleared"); } -int hci_dev_do_close(struct hci_dev *hdev) +/* TODO: Move this function into hci_sync.c */ +int hci_dev_close_sync(struct hci_dev *hdev) { bool auto_off; int err = 0; @@ -1611,7 +1623,6 @@ int hci_dev_do_close(struct hci_dev *hdev) cancel_delayed_work(&hdev->ncmd_timer); hci_request_cancel_all(hdev); - hci_req_sync_lock(hdev); if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) && !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && @@ -1623,7 +1634,6 @@ int hci_dev_do_close(struct hci_dev *hdev) if (!test_and_clear_bit(HCI_UP, &hdev->flags)) { cancel_delayed_work_sync(&hdev->cmd_timer); - hci_req_sync_unlock(hdev); return err; } @@ -1729,9 +1739,22 @@ int hci_dev_do_close(struct hci_dev *hdev) bacpy(&hdev->random_addr, BDADDR_ANY); hci_codec_list_clear(&hdev->local_codecs); + hci_dev_put(hdev); + return err; +} + +int hci_dev_do_close(struct hci_dev *hdev) +{ + int err; + + BT_DBG("%s %p", hdev->name, hdev); + + hci_req_sync_lock(hdev); + + err = hci_dev_close_sync(hdev); + hci_req_sync_unlock(hdev); - hci_dev_put(hdev); return err; } @@ -2133,9 +2156,7 @@ static void hci_power_on(struct work_struct *work) hci_dev_test_flag(hdev, HCI_MGMT) && hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) { cancel_delayed_work(&hdev->power_off); - hci_req_sync_lock(hdev); - err = __hci_req_hci_power_on(hdev); - hci_req_sync_unlock(hdev); + err = hci_powered_update_sync(hdev); mgmt_power_on(hdev, err); return; } |