|
@@ -610,8 +610,11 @@ static void service_cache_off(struct work_struct *work)
|
|
hci_dev_unlock(hdev);
|
|
hci_dev_unlock(hdev);
|
|
}
|
|
}
|
|
|
|
|
|
-static void mgmt_init_hdev(struct hci_dev *hdev)
|
|
|
|
|
|
+static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
|
|
{
|
|
{
|
|
|
|
+ if (!test_and_clear_bit(HCI_PI_MGMT_INIT, &hci_pi(sk)->flags))
|
|
|
|
+ return;
|
|
|
|
+
|
|
if (!test_and_set_bit(HCI_MGMT, &hdev->dev_flags)) {
|
|
if (!test_and_set_bit(HCI_MGMT, &hdev->dev_flags)) {
|
|
INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
|
|
INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
|
|
|
|
|
|
@@ -632,9 +635,6 @@ static int read_controller_info(struct sock *sk, struct hci_dev *hdev)
|
|
|
|
|
|
hci_dev_lock(hdev);
|
|
hci_dev_lock(hdev);
|
|
|
|
|
|
- if (test_and_clear_bit(HCI_PI_MGMT_INIT, &hci_pi(sk)->flags))
|
|
|
|
- mgmt_init_hdev(hdev);
|
|
|
|
-
|
|
|
|
memset(&rp, 0, sizeof(rp));
|
|
memset(&rp, 0, sizeof(rp));
|
|
|
|
|
|
bacpy(&rp.bdaddr, &hdev->bdaddr);
|
|
bacpy(&rp.bdaddr, &hdev->bdaddr);
|
|
@@ -2764,6 +2764,8 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
|
|
MGMT_STATUS_INVALID_PARAMS);
|
|
MGMT_STATUS_INVALID_PARAMS);
|
|
goto done;
|
|
goto done;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ mgmt_init_hdev(sk, hdev);
|
|
}
|
|
}
|
|
|
|
|
|
cp = buf + sizeof(*hdr);
|
|
cp = buf + sizeof(*hdr);
|