Hi Marcel, On Mon, Jan 30, 2012 at 6:44 PM, Marcel Holtmann <marcel@xxxxxxxxxxxx> wrote: > Hi Andre, > >> This patch adds LE-Only discovery procedure support to MGMT Start >> Discovery command. >> >> Signed-off-by: Andre Guedes <andre.guedes@xxxxxxxxxxxxx> >> --- >> net/bluetooth/hci_event.c | 13 ++++++++++++- >> net/bluetooth/mgmt.c | 20 +++++++++++++++++++- >> 2 files changed, 31 insertions(+), 2 deletions(-) >> >> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c >> index 856ab35..fb2497b 100644 >> --- a/net/bluetooth/hci_event.c >> +++ b/net/bluetooth/hci_event.c >> @@ -1033,6 +1033,13 @@ static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb) >> >> hdev->le_scan_result = -bt_to_errno(status); >> wake_up(&hdev->le_scan_wait_q); >> + >> + if (status) { >> + hci_dev_lock(hdev); >> + mgmt_start_discovery_failed(hdev, status); >> + hci_dev_unlock(hdev); >> + return; >> + } >> } >> >> static void hci_cc_le_set_scan_enable(struct hci_dev *hdev, >> @@ -1052,8 +1059,12 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev, >> hdev->le_scan_result = -bt_to_errno(status); >> wake_up(&hdev->le_scan_wait_q); >> >> - if (status) >> + if (status) { >> + hci_dev_lock(hdev); >> + mgmt_start_discovery_failed(hdev, status); >> + hci_dev_unlock(hdev); >> return; >> + } > > are these two related to the other changes or just actual bug fixes? These two are related to MGMT Start Discovery command itself. If LE scan HCI commands fail we have to send mgmt_start_discovery_failed event. >> >> set_bit(HCI_LE_SCAN, &hdev->dev_flags); >> >> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c >> index 8970799..0a1fa4c 100644 >> --- a/net/bluetooth/mgmt.c >> +++ b/net/bluetooth/mgmt.c >> @@ -35,6 +35,15 @@ >> #define MGMT_VERSION 0 >> #define MGMT_REVISION 1 >> >> +/* >> + * These LE scan and inquiry parameters were chosen according to LE General >> + * Discovery Procedure specification. >> + */ >> +#define LE_SCAN_TYPE 0x01 >> +#define LE_SCAN_WIN 0x12 >> +#define LE_SCAN_INT 0x12 >> +#define LE_SCAN_TIMEOUT_LE_ONLY 10240 /* TGAP(gen_disc_scan_min) */ >> + >> #define INQUIRY_LEN_BREDR 0x08 /* TGAP(100) */ >> >> #define SERVICE_CACHE_TIMEOUT (5 * 1000) >> @@ -1897,6 +1906,7 @@ static int start_discovery(struct sock *sk, u16 index, >> unsigned char *data, u16 len) >> { >> struct mgmt_cp_start_discovery *cp = (void *) data; >> + unsigned long discov_type = cp->type; >> struct pending_cmd *cmd; >> struct hci_dev *hdev; >> int err; >> @@ -1932,7 +1942,15 @@ static int start_discovery(struct sock *sk, u16 index, >> goto failed; >> } >> >> - err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR); >> + if (test_bit(MGMT_ADDR_BREDR, &discov_type)) >> + err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR); >> + else if (test_bit(MGMT_ADDR_LE_PUBLIC, &discov_type) && >> + test_bit(MGMT_ADDR_LE_RANDOM, &discov_type)) > > so test_bit can not check for two bits at the same time? AFAIK, no. If anyone knows a helper like that, please let me know. BR, Andre -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html