aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2013-10-06 06:17:56 -0400
committerJohan Hedberg <johan.hedberg@intel.com>2013-10-06 08:59:25 -0400
commitb4faf30096c3deb618392a88feaa7674cd55c257 (patch)
tree73601c41ba3c871d7bf05ed42fd3164b9be82d43 /net
parentc2f5ebd2148860537762c8d0d687efed73c2c2d0 (diff)
Bluetooth: Set LE advertising parameters before enabling it
The LE advertising parameters can only be modified when advertising is disabled. So before enabling it, make sure the controller has all the right parameters. Right now all default values are used and thus this does no change any existing behavior. One minor exception is that in case of single mode LE-only controllers without a public address, now the random address is used for advertising. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Diffstat (limited to 'net')
-rw-r--r--net/bluetooth/mgmt.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 83866848a215..b78a0eefe03e 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -1413,16 +1413,30 @@ unlock:
1413 1413
1414static void enable_advertising(struct hci_request *req) 1414static void enable_advertising(struct hci_request *req)
1415{ 1415{
1416 u8 adv = 0x01; 1416 struct hci_dev *hdev = req->hdev;
1417 struct hci_cp_le_set_adv_param cp;
1418 u8 enable = 0x01;
1419
1420 memset(&cp, 0, sizeof(cp));
1421 cp.min_interval = __constant_cpu_to_le16(0x0800);
1422 cp.max_interval = __constant_cpu_to_le16(0x0800);
1423 cp.type = LE_ADV_IND;
1424 if (bacmp(&hdev->bdaddr, BDADDR_ANY))
1425 cp.own_address_type = ADDR_LE_DEV_PUBLIC;
1426 else
1427 cp.own_address_type = ADDR_LE_DEV_RANDOM;
1428 cp.channel_map = 0x07;
1429
1430 hci_req_add(req, HCI_OP_LE_SET_ADV_PARAM, sizeof(cp), &cp);
1417 1431
1418 hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(adv), &adv); 1432 hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
1419} 1433}
1420 1434
1421static void disable_advertising(struct hci_request *req) 1435static void disable_advertising(struct hci_request *req)
1422{ 1436{
1423 u8 adv = 0x00; 1437 u8 enable = 0x00;
1424 1438
1425 hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(adv), &adv); 1439 hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
1426} 1440}
1427 1441
1428static void le_enable_complete(struct hci_dev *hdev, u8 status) 1442static void le_enable_complete(struct hci_dev *hdev, u8 status)