* [PATCH v4 1/4] Bluetooth: Move discovery state check inside hci_dev_lock()
@ 2013-01-21 14:13 Jaganath Kanakkassery
2013-01-21 14:13 ` [PATCH v4 2/4] Bluetooth: Add mgmt_start_discovery_cancelled() Jaganath Kanakkassery
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Jaganath Kanakkassery @ 2013-01-21 14:13 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jaganath Kanakkassery
After checking the discovery state, if other thread modifies it
then it will be overwritten by the assignment in the first thread.
Signed-off-by: Jaganath Kanakkassery <jaganath.k@samsung.com>
---
net/bluetooth/hci_event.c | 9 ++++-----
net/bluetooth/mgmt.c | 4 ----
2 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 705078a..97b4828 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -1273,14 +1273,13 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
+ hci_dev_lock(hdev);
if (hdev->discovery.type == DISCOV_TYPE_INTERLEAVED &&
- hdev->discovery.state == DISCOVERY_FINDING) {
+ hdev->discovery.state == DISCOVERY_FINDING)
mgmt_interleaved_discovery(hdev);
- } else {
- hci_dev_lock(hdev);
+ else
hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
- hci_dev_unlock(hdev);
- }
+ hci_dev_unlock(hdev);
break;
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 37add53..a7865ad 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -2333,14 +2333,10 @@ int mgmt_interleaved_discovery(struct hci_dev *hdev)
BT_DBG("%s", hdev->name);
- hci_dev_lock(hdev);
-
err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR_LE);
if (err < 0)
hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
- hci_dev_unlock(hdev);
-
return err;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4 2/4] Bluetooth: Add mgmt_start_discovery_cancelled()
2013-01-21 14:13 [PATCH v4 1/4] Bluetooth: Move discovery state check inside hci_dev_lock() Jaganath Kanakkassery
@ 2013-01-21 14:13 ` Jaganath Kanakkassery
2013-01-21 14:13 ` [PATCH v4 3/4] Bluetooth: Change type of "discovering" from u8 to bool Jaganath Kanakkassery
2013-01-21 14:13 ` [PATCH v4 4/4] Bluetooth: Fix stop discovery while in STARTING state Jaganath Kanakkassery
2 siblings, 0 replies; 4+ messages in thread
From: Jaganath Kanakkassery @ 2013-01-21 14:13 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jaganath Kanakkassery
This function can be used to inform userspace that start discovery
is cancelled
Signed-off-by: Jaganath Kanakkassery <jaganath.k@samsung.com>
---
include/net/bluetooth/hci_core.h | 1 +
net/bluetooth/mgmt.c | 19 +++++++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 014a2ea..d8f68c7 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -1112,6 +1112,7 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
u8 addr_type, s8 rssi, u8 *name, u8 name_len);
int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status);
+int mgmt_start_discovery_cancelled(struct hci_dev *hdev);
int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status);
int mgmt_discovering(struct hci_dev *hdev, u8 discovering);
int mgmt_interleaved_discovery(struct hci_dev *hdev);
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index a7865ad..3527095 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -3722,6 +3722,25 @@ int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
return err;
}
+int mgmt_start_discovery_cancelled(struct hci_dev *hdev)
+{
+ struct pending_cmd *cmd;
+ u8 type;
+ int err;
+
+ cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
+ if (!cmd)
+ return -ENOENT;
+
+ type = hdev->discovery.type;
+
+ err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, MGMT_STATUS_CANCELLED,
+ &type, sizeof(type));
+ mgmt_pending_remove(cmd);
+
+ return err;
+}
+
int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
{
struct pending_cmd *cmd;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4 3/4] Bluetooth: Change type of "discovering" from u8 to bool
2013-01-21 14:13 [PATCH v4 1/4] Bluetooth: Move discovery state check inside hci_dev_lock() Jaganath Kanakkassery
2013-01-21 14:13 ` [PATCH v4 2/4] Bluetooth: Add mgmt_start_discovery_cancelled() Jaganath Kanakkassery
@ 2013-01-21 14:13 ` Jaganath Kanakkassery
2013-01-21 14:13 ` [PATCH v4 4/4] Bluetooth: Fix stop discovery while in STARTING state Jaganath Kanakkassery
2 siblings, 0 replies; 4+ messages in thread
From: Jaganath Kanakkassery @ 2013-01-21 14:13 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jaganath Kanakkassery
Since the only possible values of discovering is 0 and 1, bool is
more appropriate
Signed-off-by: Jaganath Kanakkassery <jaganath.k@samsung.com>
---
include/net/bluetooth/hci_core.h | 2 +-
net/bluetooth/hci_core.c | 4 ++--
net/bluetooth/mgmt.c | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index d8f68c7..f20da05 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -1114,7 +1114,7 @@ int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status);
int mgmt_start_discovery_cancelled(struct hci_dev *hdev);
int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status);
-int mgmt_discovering(struct hci_dev *hdev, u8 discovering);
+int mgmt_discovering(struct hci_dev *hdev, bool discovering);
int mgmt_interleaved_discovery(struct hci_dev *hdev);
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 596660d..ce6a696 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -326,12 +326,12 @@ void hci_discovery_set_state(struct hci_dev *hdev, int state)
switch (state) {
case DISCOVERY_STOPPED:
if (hdev->discovery.state != DISCOVERY_STARTING)
- mgmt_discovering(hdev, 0);
+ mgmt_discovering(hdev, false);
break;
case DISCOVERY_STARTING:
break;
case DISCOVERY_FINDING:
- mgmt_discovering(hdev, 1);
+ mgmt_discovering(hdev, true);
break;
case DISCOVERY_RESOLVING:
break;
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 3527095..ba5ca81 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -3757,7 +3757,7 @@ int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
return err;
}
-int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
+int mgmt_discovering(struct hci_dev *hdev, bool discovering)
{
struct mgmt_ev_discovering ev;
struct pending_cmd *cmd;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4 4/4] Bluetooth: Fix stop discovery while in STARTING state
2013-01-21 14:13 [PATCH v4 1/4] Bluetooth: Move discovery state check inside hci_dev_lock() Jaganath Kanakkassery
2013-01-21 14:13 ` [PATCH v4 2/4] Bluetooth: Add mgmt_start_discovery_cancelled() Jaganath Kanakkassery
2013-01-21 14:13 ` [PATCH v4 3/4] Bluetooth: Change type of "discovering" from u8 to bool Jaganath Kanakkassery
@ 2013-01-21 14:13 ` Jaganath Kanakkassery
2 siblings, 0 replies; 4+ messages in thread
From: Jaganath Kanakkassery @ 2013-01-21 14:13 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jaganath Kanakkassery
If stop_discovery() is called when discovery state is STARTING, it
will be failed currently. This patch fixes this.
Signed-off-by: Jaganath Kanakkassery <jaganath.k@samsung.com>
---
include/net/bluetooth/hci_core.h | 1 +
net/bluetooth/hci_event.c | 14 ++++++++++++--
net/bluetooth/mgmt.c | 12 +++++++++++-
3 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index f20da05..0a7aa1f 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -64,6 +64,7 @@ struct discovery_state {
DISCOVERY_RESOLVING,
DISCOVERY_STOPPING,
} state;
+ bool discovering;
struct list_head all; /* All devices found during inquiry */
struct list_head unknown; /* Name state not known */
struct list_head resolve; /* Name needs to be resolved */
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 97b4828..c616cbf 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -1259,7 +1259,12 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
set_bit(HCI_LE_SCAN, &hdev->dev_flags);
hci_dev_lock(hdev);
- hci_discovery_set_state(hdev, DISCOVERY_FINDING);
+ if (hdev->discovery.state == DISCOVERY_STOPPING) {
+ hci_cancel_le_scan(hdev);
+ mgmt_start_discovery_cancelled(hdev);
+ } else {
+ hci_discovery_set_state(hdev, DISCOVERY_FINDING);
+ }
hci_dev_unlock(hdev);
break;
@@ -1375,7 +1380,12 @@ static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
set_bit(HCI_INQUIRY, &hdev->flags);
hci_dev_lock(hdev);
- hci_discovery_set_state(hdev, DISCOVERY_FINDING);
+ if (hdev->discovery.state == DISCOVERY_STOPPING) {
+ hci_cancel_inquiry(hdev);
+ mgmt_start_discovery_cancelled(hdev);
+ } else {
+ hci_discovery_set_state(hdev, DISCOVERY_FINDING);
+ }
hci_dev_unlock(hdev);
}
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index ba5ca81..d9b1aa1 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -2443,7 +2443,8 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
hci_dev_lock(hdev);
- if (!hci_discovery_active(hdev)) {
+ if (hdev->discovery.state != DISCOVERY_STARTING &&
+ !hci_discovery_active(hdev)) {
err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
MGMT_STATUS_REJECTED, &mgmt_cp->type,
sizeof(mgmt_cp->type));
@@ -2491,6 +2492,10 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
break;
+ case DISCOVERY_STARTING:
+ err = 0;
+ break;
+
default:
BT_DBG("unknown discovery state %u", hdev->discovery.state);
err = -EFAULT;
@@ -3777,6 +3782,11 @@ int mgmt_discovering(struct hci_dev *hdev, bool discovering)
mgmt_pending_remove(cmd);
}
+ if (hdev->discovery.discovering == discovering)
+ return 0;
+
+ hdev->discovery.discovering = discovering;
+
memset(&ev, 0, sizeof(ev));
ev.type = hdev->discovery.type;
ev.discovering = discovering;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-01-21 14:13 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-01-21 14:13 [PATCH v4 1/4] Bluetooth: Move discovery state check inside hci_dev_lock() Jaganath Kanakkassery
2013-01-21 14:13 ` [PATCH v4 2/4] Bluetooth: Add mgmt_start_discovery_cancelled() Jaganath Kanakkassery
2013-01-21 14:13 ` [PATCH v4 3/4] Bluetooth: Change type of "discovering" from u8 to bool Jaganath Kanakkassery
2013-01-21 14:13 ` [PATCH v4 4/4] Bluetooth: Fix stop discovery while in STARTING state Jaganath Kanakkassery
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.