|
@@ -741,10 +741,11 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
- if (test_bit(HCI_UP, &hdev->flags) ||
|
|
|
- test_bit(HCI_INIT, &hdev->flags) ||
|
|
|
+ if (test_bit(HCI_INIT, &hdev->flags) ||
|
|
|
hci_dev_test_flag(hdev, HCI_SETUP) ||
|
|
|
- hci_dev_test_flag(hdev, HCI_CONFIG)) {
|
|
|
+ hci_dev_test_flag(hdev, HCI_CONFIG) ||
|
|
|
+ (!hci_dev_test_flag(hdev, HCI_AUTO_OFF) &&
|
|
|
+ test_bit(HCI_UP, &hdev->flags))) {
|
|
|
err = -EBUSY;
|
|
|
hci_dev_put(hdev);
|
|
|
goto done;
|
|
@@ -760,10 +761,21 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
|
|
|
|
|
|
err = hci_dev_open(hdev->id);
|
|
|
if (err) {
|
|
|
- hci_dev_clear_flag(hdev, HCI_USER_CHANNEL);
|
|
|
- mgmt_index_added(hdev);
|
|
|
- hci_dev_put(hdev);
|
|
|
- goto done;
|
|
|
+ if (err == -EALREADY) {
|
|
|
+ /* In case the transport is already up and
|
|
|
+ * running, clear the error here.
|
|
|
+ *
|
|
|
+ * This can happen when opening an user
|
|
|
+ * channel and HCI_AUTO_OFF grace period
|
|
|
+ * is still active.
|
|
|
+ */
|
|
|
+ err = 0;
|
|
|
+ } else {
|
|
|
+ hci_dev_clear_flag(hdev, HCI_USER_CHANNEL);
|
|
|
+ mgmt_index_added(hdev);
|
|
|
+ hci_dev_put(hdev);
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
atomic_inc(&hdev->promisc);
|