From ee636e800894f5db3a7c656544b6a387bfaa7e46 Mon Sep 17 00:00:00 2001 From: Miao-chen Chou Date: Fri, 14 Apr 2017 19:05:14 -0700 Subject: [PATCH] Revert "Revert "CHROMIUM: bluetooth: reset advertising intervals"" This reverts commit f6794e6d752ddd9c183ecd7a3b3f4ef960fe7c99. BUG=chromium:704196 TEST=Deploy v5.44 BlueZ system daemon with v4.9 BlueZ kernel on Nyan_Big and perform automated tests (suite:bluetooth) and manual tests against mouses, keyboards and headphones. Change-Id: I63f79f7d7927faf34bfd7231488c2813f10011e2 Signed-off-by: Miao-chen Chou Reviewed-on: https://chromium-review.googlesource.com/480214 Tested-by: Shyh-In Hwang Reviewed-by: Shyh-In Hwang --- net/bluetooth/mgmt.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 09683977d612aa..0c3c55b2504de6 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -4361,6 +4361,8 @@ static int set_advertising_intervals(struct sock *sk, struct hci_dev *hdev, { struct mgmt_cp_set_advertising_intervals *cp = data; int err; + /* If both min_interval and max_interval are 0, use default values. */ + bool use_default = cp->min_interval == 0 && cp->max_interval == 0; BT_DBG("%s", hdev->name); @@ -4371,9 +4373,9 @@ static int set_advertising_intervals(struct sock *sk, struct hci_dev *hdev, MGMT_STATUS_REJECTED); /* Check the validity of the intervals. */ - if (cp->min_interval < HCI_VALID_LE_ADV_MIN_INTERVAL || - cp->max_interval > HCI_VALID_LE_ADV_MAX_INTERVAL || - cp->min_interval > cp->max_interval) { + if (!use_default && (cp->min_interval < HCI_VALID_LE_ADV_MIN_INTERVAL || + cp->max_interval > HCI_VALID_LE_ADV_MAX_INTERVAL || + cp->min_interval > cp->max_interval)) { return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING_INTERVALS, MGMT_STATUS_INVALID_PARAMS); @@ -4381,9 +4383,15 @@ static int set_advertising_intervals(struct sock *sk, struct hci_dev *hdev, hci_dev_lock(hdev); - hci_dev_set_flag(hdev, HCI_ADVERTISING_INTERVALS); - hdev->le_adv_min_interval = cp->min_interval; - hdev->le_adv_max_interval = cp->max_interval; + if (use_default) { + hci_dev_clear_flag(hdev, HCI_ADVERTISING_INTERVALS); + hdev->le_adv_min_interval = HCI_DEFAULT_LE_ADV_MIN_INTERVAL; + hdev->le_adv_max_interval = HCI_DEFAULT_LE_ADV_MAX_INTERVAL; + } else { + hci_dev_set_flag(hdev, HCI_ADVERTISING_INTERVALS); + hdev->le_adv_min_interval = cp->min_interval; + hdev->le_adv_max_interval = cp->max_interval; + } /* Re-enable advertising only when it is already on. */ if (hci_dev_test_flag(hdev, HCI_LE_ADV)) {