|
@@ -56,7 +56,9 @@ static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
|
|
|
if (status)
|
|
|
return;
|
|
|
|
|
|
- clear_bit(HCI_INQUIRY, &hdev->flags);
|
|
|
+ if (test_bit(HCI_MGMT, &hdev->flags) &&
|
|
|
+ test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
|
|
|
+ mgmt_discovering(hdev->id, 0);
|
|
|
|
|
|
hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status);
|
|
|
|
|
@@ -72,7 +74,9 @@ static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
|
|
|
if (status)
|
|
|
return;
|
|
|
|
|
|
- clear_bit(HCI_INQUIRY, &hdev->flags);
|
|
|
+ if (test_bit(HCI_MGMT, &hdev->flags) &&
|
|
|
+ test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
|
|
|
+ mgmt_discovering(hdev->id, 0);
|
|
|
|
|
|
hci_conn_check_pending(hdev);
|
|
|
}
|
|
@@ -841,10 +845,14 @@ static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
|
|
|
|
|
|
if (status) {
|
|
|
hci_req_complete(hdev, HCI_OP_INQUIRY, status);
|
|
|
-
|
|
|
hci_conn_check_pending(hdev);
|
|
|
- } else
|
|
|
- set_bit(HCI_INQUIRY, &hdev->flags);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (test_bit(HCI_MGMT, &hdev->flags) &&
|
|
|
+ !test_and_set_bit(HCI_INQUIRY,
|
|
|
+ &hdev->flags))
|
|
|
+ mgmt_discovering(hdev->id, 1);
|
|
|
}
|
|
|
|
|
|
static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
|
|
@@ -1208,7 +1216,9 @@ static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff
|
|
|
|
|
|
BT_DBG("%s status %d", hdev->name, status);
|
|
|
|
|
|
- clear_bit(HCI_INQUIRY, &hdev->flags);
|
|
|
+ if (test_bit(HCI_MGMT, &hdev->flags) &&
|
|
|
+ test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
|
|
|
+ mgmt_discovering(hdev->id, 0);
|
|
|
|
|
|
hci_req_complete(hdev, HCI_OP_INQUIRY, status);
|
|
|
|
|
@@ -1228,6 +1238,12 @@ static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *
|
|
|
|
|
|
hci_dev_lock(hdev);
|
|
|
|
|
|
+ if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags)) {
|
|
|
+
|
|
|
+ if (test_bit(HCI_MGMT, &hdev->flags))
|
|
|
+ mgmt_discovering(hdev->id, 1);
|
|
|
+ }
|
|
|
+
|
|
|
for (; num_rsp; num_rsp--, info++) {
|
|
|
bacpy(&data.bdaddr, &info->bdaddr);
|
|
|
data.pscan_rep_mode = info->pscan_rep_mode;
|
|
@@ -2158,6 +2174,12 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct
|
|
|
|
|
|
hci_dev_lock(hdev);
|
|
|
|
|
|
+ if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags)) {
|
|
|
+
|
|
|
+ if (test_bit(HCI_MGMT, &hdev->flags))
|
|
|
+ mgmt_discovering(hdev->id, 1);
|
|
|
+ }
|
|
|
+
|
|
|
if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
|
|
|
struct inquiry_info_with_rssi_and_pscan_mode *info;
|
|
|
info = (void *) (skb->data + 1);
|
|
@@ -2320,6 +2342,12 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct
|
|
|
if (!num_rsp)
|
|
|
return;
|
|
|
|
|
|
+ if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags)) {
|
|
|
+
|
|
|
+ if (test_bit(HCI_MGMT, &hdev->flags))
|
|
|
+ mgmt_discovering(hdev->id, 1);
|
|
|
+ }
|
|
|
+
|
|
|
hci_dev_lock(hdev);
|
|
|
|
|
|
for (; num_rsp; num_rsp--, info++) {
|