* [PATCH v2 0/2] LE support for MGMT Stop Discovery
@ 2012-03-09 12:57 Andre Guedes
2012-03-09 12:57 ` [PATCH v2 1/2] Bluetooth: Add hci_cancel_le_scan() to hci_core Andre Guedes
2012-03-09 12:57 ` [PATCH v2 2/2] Bluetooth: LE support for MGMT stop discovery Andre Guedes
0 siblings, 2 replies; 8+ messages in thread
From: Andre Guedes @ 2012-03-09 12:57 UTC (permalink / raw)
To: linux-bluetooth
>From the previous cover letter:
This small patch series adds LE support for Stop Discovery MGMT command.
Now, we are able to stop LE discovery procedues (LE-only and interleaved).
A brief word about patch 1/2: due to discovery state machine, we don't need
to worry about canceling hdev->le_scan work since it is never pending or
running when hci_cancel_le_scan is called.
Andre Guedes (2):
Bluetooth: Add hci_cancel_le_scan() to hci_core
Bluetooth: LE support for MGMT stop discovery
include/net/bluetooth/hci_core.h | 1 +
net/bluetooth/hci_core.c | 21 +++++++++++++++++++++
net/bluetooth/hci_event.c | 6 +++++-
net/bluetooth/mgmt.c | 6 +++++-
4 files changed, 32 insertions(+), 2 deletions(-)
--
1.7.9.3
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH v2 1/2] Bluetooth: Add hci_cancel_le_scan() to hci_core 2012-03-09 12:57 [PATCH v2 0/2] LE support for MGMT Stop Discovery Andre Guedes @ 2012-03-09 12:57 ` Andre Guedes 2012-03-15 15:26 ` Marcel Holtmann 2012-03-09 12:57 ` [PATCH v2 2/2] Bluetooth: LE support for MGMT stop discovery Andre Guedes 1 sibling, 1 reply; 8+ messages in thread From: Andre Guedes @ 2012-03-09 12:57 UTC (permalink / raw) To: linux-bluetooth This patch adds to hci_core the hci_cancel_le_scan function which should be used to cancel an ongoing LE scan. Signed-off-by: Andre Guedes <andre.guedes@openbossa.org> --- include/net/bluetooth/hci_core.h | 1 + net/bluetooth/hci_core.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index daefaac..87bca3e 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -1071,5 +1071,6 @@ int hci_do_inquiry(struct hci_dev *hdev, u8 length); int hci_cancel_inquiry(struct hci_dev *hdev); int hci_le_scan(struct hci_dev *hdev, u8 type, u16 interval, u16 window, int timeout); +int hci_cancel_le_scan(struct hci_dev *hdev); #endif /* __HCI_CORE_H */ diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 59ec99e..0320a02 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -1667,6 +1667,27 @@ static int hci_do_le_scan(struct hci_dev *hdev, u8 type, u16 interval, return 0; } +int hci_cancel_le_scan(struct hci_dev *hdev) +{ + bool canceled; + + BT_DBG("%s", hdev->name); + + if (!test_bit(HCI_LE_SCAN, &hdev->dev_flags)) + return -EALREADY; + + canceled = cancel_delayed_work(&hdev->le_scan_disable); + if (canceled) { + struct hci_cp_le_set_scan_enable cp; + + /* Send HCI command to disable LE Scan */ + memset(&cp, 0, sizeof(cp)); + hci_send_cmd(hdev, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp); + } + + return 0; +} + static void le_scan_disable_work(struct work_struct *work) { struct hci_dev *hdev = container_of(work, struct hci_dev, -- 1.7.9.3 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] Bluetooth: Add hci_cancel_le_scan() to hci_core 2012-03-09 12:57 ` [PATCH v2 1/2] Bluetooth: Add hci_cancel_le_scan() to hci_core Andre Guedes @ 2012-03-15 15:26 ` Marcel Holtmann 2012-03-15 18:31 ` Andre Guedes 0 siblings, 1 reply; 8+ messages in thread From: Marcel Holtmann @ 2012-03-15 15:26 UTC (permalink / raw) To: Andre Guedes; +Cc: linux-bluetooth Hi Andre, > This patch adds to hci_core the hci_cancel_le_scan function which > should be used to cancel an ongoing LE scan. > > Signed-off-by: Andre Guedes <andre.guedes@openbossa.org> > --- > include/net/bluetooth/hci_core.h | 1 + > net/bluetooth/hci_core.c | 21 +++++++++++++++++++++ > 2 files changed, 22 insertions(+) > > diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h > index daefaac..87bca3e 100644 > --- a/include/net/bluetooth/hci_core.h > +++ b/include/net/bluetooth/hci_core.h > @@ -1071,5 +1071,6 @@ int hci_do_inquiry(struct hci_dev *hdev, u8 length); > int hci_cancel_inquiry(struct hci_dev *hdev); > int hci_le_scan(struct hci_dev *hdev, u8 type, u16 interval, u16 window, > int timeout); > +int hci_cancel_le_scan(struct hci_dev *hdev); > > #endif /* __HCI_CORE_H */ > diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c > index 59ec99e..0320a02 100644 > --- a/net/bluetooth/hci_core.c > +++ b/net/bluetooth/hci_core.c > @@ -1667,6 +1667,27 @@ static int hci_do_le_scan(struct hci_dev *hdev, u8 type, u16 interval, > return 0; > } > > +int hci_cancel_le_scan(struct hci_dev *hdev) > +{ > + bool canceled; > + > + BT_DBG("%s", hdev->name); > + > + if (!test_bit(HCI_LE_SCAN, &hdev->dev_flags)) > + return -EALREADY; > + > + canceled = cancel_delayed_work(&hdev->le_scan_disable); why are we using the canceled variable here? Seems pointless. > + if (canceled) { > + struct hci_cp_le_set_scan_enable cp; > + > + /* Send HCI command to disable LE Scan */ > + memset(&cp, 0, sizeof(cp)); > + hci_send_cmd(hdev, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp); > + } > + > + return 0; > +} > + Regards Marcel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] Bluetooth: Add hci_cancel_le_scan() to hci_core 2012-03-15 15:26 ` Marcel Holtmann @ 2012-03-15 18:31 ` Andre Guedes 2012-03-15 18:36 ` Marcel Holtmann 0 siblings, 1 reply; 8+ messages in thread From: Andre Guedes @ 2012-03-15 18:31 UTC (permalink / raw) To: Marcel Holtmann; +Cc: linux-bluetooth Hi Marcel, On Thu, Mar 15, 2012 at 12:26 PM, Marcel Holtmann <marcel@holtmann.org> wro= te: > Hi Andre, > >> This patch adds to hci_core the hci_cancel_le_scan function which >> should be used to cancel an ongoing LE scan. >> >> Signed-off-by: Andre Guedes <andre.guedes@openbossa.org> >> --- >> =A0include/net/bluetooth/hci_core.h | =A0 =A01 + >> =A0net/bluetooth/hci_core.c =A0 =A0 =A0 =A0 | =A0 21 +++++++++++++++++++= ++ >> =A02 files changed, 22 insertions(+) >> >> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hc= i_core.h >> index daefaac..87bca3e 100644 >> --- a/include/net/bluetooth/hci_core.h >> +++ b/include/net/bluetooth/hci_core.h >> @@ -1071,5 +1071,6 @@ int hci_do_inquiry(struct hci_dev *hdev, u8 length= ); >> =A0int hci_cancel_inquiry(struct hci_dev *hdev); >> =A0int hci_le_scan(struct hci_dev *hdev, u8 type, u16 interval, u16 wind= ow, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 int timeout); >> +int hci_cancel_le_scan(struct hci_dev *hdev); >> >> =A0#endif /* __HCI_CORE_H */ >> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c >> index 59ec99e..0320a02 100644 >> --- a/net/bluetooth/hci_core.c >> +++ b/net/bluetooth/hci_core.c >> @@ -1667,6 +1667,27 @@ static int hci_do_le_scan(struct hci_dev *hdev, u= 8 type, u16 interval, >> =A0 =A0 =A0 return 0; >> =A0} >> >> +int hci_cancel_le_scan(struct hci_dev *hdev) >> +{ >> + =A0 =A0 bool canceled; >> + >> + =A0 =A0 BT_DBG("%s", hdev->name); >> + >> + =A0 =A0 if (!test_bit(HCI_LE_SCAN, &hdev->dev_flags)) >> + =A0 =A0 =A0 =A0 =A0 =A0 return -EALREADY; >> + >> + =A0 =A0 canceled =3D cancel_delayed_work(&hdev->le_scan_disable); > > why are we using the canceled variable here? Seems pointless. Because le_scan_disable work may be running when cancel_delayed_work returns (canceled =3D=3D 0). If le_scan_disable work is running, we should not send HCI_OP_LE_SET_SCAN_ENABLE command since le_scan_disable work already sends it. This way we avoid sending two HCI_OP_LE_SET_SCAN_ENABLE commands when this race condition occurs. BR, Andre ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] Bluetooth: Add hci_cancel_le_scan() to hci_core 2012-03-15 18:31 ` Andre Guedes @ 2012-03-15 18:36 ` Marcel Holtmann 2012-03-15 19:04 ` Andre Guedes 0 siblings, 1 reply; 8+ messages in thread From: Marcel Holtmann @ 2012-03-15 18:36 UTC (permalink / raw) To: Andre Guedes; +Cc: linux-bluetooth Hi Andre, > >> This patch adds to hci_core the hci_cancel_le_scan function which > >> should be used to cancel an ongoing LE scan. > >> > >> Signed-off-by: Andre Guedes <andre.guedes@openbossa.org> > >> --- > >> include/net/bluetooth/hci_core.h | 1 + > >> net/bluetooth/hci_core.c | 21 +++++++++++++++++++++ > >> 2 files changed, 22 insertions(+) > >> > >> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h > >> index daefaac..87bca3e 100644 > >> --- a/include/net/bluetooth/hci_core.h > >> +++ b/include/net/bluetooth/hci_core.h > >> @@ -1071,5 +1071,6 @@ int hci_do_inquiry(struct hci_dev *hdev, u8 length); > >> int hci_cancel_inquiry(struct hci_dev *hdev); > >> int hci_le_scan(struct hci_dev *hdev, u8 type, u16 interval, u16 window, > >> int timeout); > >> +int hci_cancel_le_scan(struct hci_dev *hdev); > >> > >> #endif /* __HCI_CORE_H */ > >> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c > >> index 59ec99e..0320a02 100644 > >> --- a/net/bluetooth/hci_core.c > >> +++ b/net/bluetooth/hci_core.c > >> @@ -1667,6 +1667,27 @@ static int hci_do_le_scan(struct hci_dev *hdev, u8 type, u16 interval, > >> return 0; > >> } > >> > >> +int hci_cancel_le_scan(struct hci_dev *hdev) > >> +{ > >> + bool canceled; > >> + > >> + BT_DBG("%s", hdev->name); > >> + > >> + if (!test_bit(HCI_LE_SCAN, &hdev->dev_flags)) > >> + return -EALREADY; > >> + > >> + canceled = cancel_delayed_work(&hdev->le_scan_disable); > > > > why are we using the canceled variable here? Seems pointless. > > Because le_scan_disable work may be running when cancel_delayed_work > returns (canceled == 0). If le_scan_disable work is running, we should > not send HCI_OP_LE_SET_SCAN_ENABLE command since le_scan_disable work > already sends it. I got that part, but I meant why using an extra variable here? if (cancel_delayed_work(&hdev->le_scan_disable)) { ... } This is as clean and does exactly the same job. Or do I miss something here? Regards Marcel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] Bluetooth: Add hci_cancel_le_scan() to hci_core 2012-03-15 18:36 ` Marcel Holtmann @ 2012-03-15 19:04 ` Andre Guedes 0 siblings, 0 replies; 8+ messages in thread From: Andre Guedes @ 2012-03-15 19:04 UTC (permalink / raw) To: Marcel Holtmann; +Cc: linux-bluetooth Hi Marcel, On Thu, Mar 15, 2012 at 3:36 PM, Marcel Holtmann <marcel@holtmann.org> wrot= e: > Hi Andre, > >> >> This patch adds to hci_core the hci_cancel_le_scan function which >> >> should be used to cancel an ongoing LE scan. >> >> >> >> Signed-off-by: Andre Guedes <andre.guedes@openbossa.org> >> >> --- >> >> =A0include/net/bluetooth/hci_core.h | =A0 =A01 + >> >> =A0net/bluetooth/hci_core.c =A0 =A0 =A0 =A0 | =A0 21 ++++++++++++++++= +++++ >> >> =A02 files changed, 22 insertions(+) >> >> >> >> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth= /hci_core.h >> >> index daefaac..87bca3e 100644 >> >> --- a/include/net/bluetooth/hci_core.h >> >> +++ b/include/net/bluetooth/hci_core.h >> >> @@ -1071,5 +1071,6 @@ int hci_do_inquiry(struct hci_dev *hdev, u8 len= gth); >> >> =A0int hci_cancel_inquiry(struct hci_dev *hdev); >> >> =A0int hci_le_scan(struct hci_dev *hdev, u8 type, u16 interval, u16 w= indow, >> >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 int timeout); >> >> +int hci_cancel_le_scan(struct hci_dev *hdev); >> >> >> >> =A0#endif /* __HCI_CORE_H */ >> >> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c >> >> index 59ec99e..0320a02 100644 >> >> --- a/net/bluetooth/hci_core.c >> >> +++ b/net/bluetooth/hci_core.c >> >> @@ -1667,6 +1667,27 @@ static int hci_do_le_scan(struct hci_dev *hdev= , u8 type, u16 interval, >> >> =A0 =A0 =A0 return 0; >> >> =A0} >> >> >> >> +int hci_cancel_le_scan(struct hci_dev *hdev) >> >> +{ >> >> + =A0 =A0 bool canceled; >> >> + >> >> + =A0 =A0 BT_DBG("%s", hdev->name); >> >> + >> >> + =A0 =A0 if (!test_bit(HCI_LE_SCAN, &hdev->dev_flags)) >> >> + =A0 =A0 =A0 =A0 =A0 =A0 return -EALREADY; >> >> + >> >> + =A0 =A0 canceled =3D cancel_delayed_work(&hdev->le_scan_disable); >> > >> > why are we using the canceled variable here? Seems pointless. >> >> Because le_scan_disable work may be running when cancel_delayed_work >> returns (canceled =3D=3D 0). If le_scan_disable work is running, we shou= ld >> not send HCI_OP_LE_SET_SCAN_ENABLE command since le_scan_disable work >> already sends it. > > I got that part, but I meant why using an extra variable here? > > =A0 =A0 =A0 =A0if (cancel_delayed_work(&hdev->le_scan_disable)) { > > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0... > > =A0 =A0 =A0 =A0} Oh, sorry, now I see your point. > This is as clean and does exactly the same job. Or do I miss something > here? You're right, I'll remove the variable and send a new version. Thanks, Andre ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 2/2] Bluetooth: LE support for MGMT stop discovery 2012-03-09 12:57 [PATCH v2 0/2] LE support for MGMT Stop Discovery Andre Guedes 2012-03-09 12:57 ` [PATCH v2 1/2] Bluetooth: Add hci_cancel_le_scan() to hci_core Andre Guedes @ 2012-03-09 12:57 ` Andre Guedes 2012-03-15 15:28 ` Marcel Holtmann 1 sibling, 1 reply; 8+ messages in thread From: Andre Guedes @ 2012-03-09 12:57 UTC (permalink / raw) To: linux-bluetooth This patch adds LE support to MGMT stop discovery command. So, now we are able to cancel LE discovery procedures (LE-only and interleaved). Signed-off-by: Andre Guedes <andre.guedes@openbossa.org> --- net/bluetooth/hci_event.c | 6 +++++- net/bluetooth/mgmt.c | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index badb785..b896447 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -1092,8 +1092,12 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev, break; case LE_SCANNING_DISABLED: - if (status) + if (status) { + hci_dev_lock(hdev); + mgmt_stop_discovery_failed(hdev, status); + hci_dev_unlock(hdev); return; + } clear_bit(HCI_LE_SCAN, &hdev->dev_flags); diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 7fcff88..ad4eba0 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -2382,7 +2382,11 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data, } if (hdev->discovery.state == DISCOVERY_FINDING) { - err = hci_cancel_inquiry(hdev); + if (test_bit(HCI_INQUIRY, &hdev->flags)) + err = hci_cancel_inquiry(hdev); + else + err = hci_cancel_le_scan(hdev); + if (err < 0) mgmt_pending_remove(cmd); else -- 1.7.9.3 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/2] Bluetooth: LE support for MGMT stop discovery 2012-03-09 12:57 ` [PATCH v2 2/2] Bluetooth: LE support for MGMT stop discovery Andre Guedes @ 2012-03-15 15:28 ` Marcel Holtmann 0 siblings, 0 replies; 8+ messages in thread From: Marcel Holtmann @ 2012-03-15 15:28 UTC (permalink / raw) To: Andre Guedes; +Cc: linux-bluetooth Hi Andre, > This patch adds LE support to MGMT stop discovery command. So, > now we are able to cancel LE discovery procedures (LE-only and > interleaved). > > Signed-off-by: Andre Guedes <andre.guedes@openbossa.org> > --- > net/bluetooth/hci_event.c | 6 +++++- > net/bluetooth/mgmt.c | 6 +++++- > 2 files changed, 10 insertions(+), 2 deletions(-) Acked-by: Marcel Holtmann <marcel@holtmann.org> Regards Marcel ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2012-03-15 19:04 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-03-09 12:57 [PATCH v2 0/2] LE support for MGMT Stop Discovery Andre Guedes 2012-03-09 12:57 ` [PATCH v2 1/2] Bluetooth: Add hci_cancel_le_scan() to hci_core Andre Guedes 2012-03-15 15:26 ` Marcel Holtmann 2012-03-15 18:31 ` Andre Guedes 2012-03-15 18:36 ` Marcel Holtmann 2012-03-15 19:04 ` Andre Guedes 2012-03-09 12:57 ` [PATCH v2 2/2] Bluetooth: LE support for MGMT stop discovery Andre Guedes 2012-03-15 15:28 ` Marcel Holtmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).