Commit 651cd3d6 authored by Brian Gix's avatar Brian Gix Committed by Luiz Augusto von Dentz

Bluetooth: convert hci_update_adv_data to hci_sync

hci_update_adv_data() is called from hci_event and hci_core due to
events from the controller. The prior function used the deprecated
hci_request method, and the new one uses hci_sync.c
Signed-off-by: default avatarBrian Gix <brian.gix@intel.com>
Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
parent 3fe318ee
...@@ -61,6 +61,7 @@ int hci_update_random_address_sync(struct hci_dev *hdev, bool require_privacy, ...@@ -61,6 +61,7 @@ int hci_update_random_address_sync(struct hci_dev *hdev, bool require_privacy,
int hci_update_scan_rsp_data_sync(struct hci_dev *hdev, u8 instance); int hci_update_scan_rsp_data_sync(struct hci_dev *hdev, u8 instance);
int hci_update_adv_data_sync(struct hci_dev *hdev, u8 instance); int hci_update_adv_data_sync(struct hci_dev *hdev, u8 instance);
int hci_update_adv_data(struct hci_dev *hdev, u8 instance);
int hci_schedule_adv_instance_sync(struct hci_dev *hdev, u8 instance, int hci_schedule_adv_instance_sync(struct hci_dev *hdev, u8 instance,
bool force); bool force);
......
...@@ -714,7 +714,7 @@ static void hci_update_passive_scan_state(struct hci_dev *hdev, u8 scan) ...@@ -714,7 +714,7 @@ static void hci_update_passive_scan_state(struct hci_dev *hdev, u8 scan)
hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); hci_dev_set_flag(hdev, HCI_BREDR_ENABLED);
if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) if (hci_dev_test_flag(hdev, HCI_LE_ENABLED))
hci_req_update_adv_data(hdev, hdev->cur_adv_instance); hci_update_adv_data(hdev, hdev->cur_adv_instance);
mgmt_new_settings(hdev); mgmt_new_settings(hdev);
} }
......
...@@ -2152,7 +2152,7 @@ static u8 hci_cc_set_ext_adv_param(struct hci_dev *hdev, void *data, ...@@ -2152,7 +2152,7 @@ static u8 hci_cc_set_ext_adv_param(struct hci_dev *hdev, void *data,
adv_instance->tx_power = rp->tx_power; adv_instance->tx_power = rp->tx_power;
} }
/* Update adv data as tx power is known now */ /* Update adv data as tx power is known now */
hci_req_update_adv_data(hdev, cp->handle); hci_update_adv_data(hdev, cp->handle);
hci_dev_unlock(hdev); hci_dev_unlock(hdev);
......
...@@ -829,70 +829,6 @@ void hci_req_add_le_passive_scan(struct hci_request *req) ...@@ -829,70 +829,6 @@ void hci_req_add_le_passive_scan(struct hci_request *req)
addr_resolv); addr_resolv);
} }
static void __hci_req_update_adv_data(struct hci_request *req, u8 instance)
{
struct hci_dev *hdev = req->hdev;
u8 len;
if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
return;
if (ext_adv_capable(hdev)) {
struct {
struct hci_cp_le_set_ext_adv_data cp;
u8 data[HCI_MAX_EXT_AD_LENGTH];
} pdu;
memset(&pdu, 0, sizeof(pdu));
len = eir_create_adv_data(hdev, instance, pdu.data);
/* There's nothing to do if the data hasn't changed */
if (hdev->adv_data_len == len &&
memcmp(pdu.data, hdev->adv_data, len) == 0)
return;
memcpy(hdev->adv_data, pdu.data, len);
hdev->adv_data_len = len;
pdu.cp.length = len;
pdu.cp.handle = instance;
pdu.cp.operation = LE_SET_ADV_DATA_OP_COMPLETE;
pdu.cp.frag_pref = LE_SET_ADV_DATA_NO_FRAG;
hci_req_add(req, HCI_OP_LE_SET_EXT_ADV_DATA,
sizeof(pdu.cp) + len, &pdu.cp);
} else {
struct hci_cp_le_set_adv_data cp;
memset(&cp, 0, sizeof(cp));
len = eir_create_adv_data(hdev, instance, cp.data);
/* There's nothing to do if the data hasn't changed */
if (hdev->adv_data_len == len &&
memcmp(cp.data, hdev->adv_data, len) == 0)
return;
memcpy(hdev->adv_data, cp.data, sizeof(cp.data));
hdev->adv_data_len = len;
cp.length = len;
hci_req_add(req, HCI_OP_LE_SET_ADV_DATA, sizeof(cp), &cp);
}
}
int hci_req_update_adv_data(struct hci_dev *hdev, u8 instance)
{
struct hci_request req;
hci_req_init(&req, hdev);
__hci_req_update_adv_data(&req, instance);
return hci_req_run(&req, NULL);
}
static int hci_req_add_le_interleaved_scan(struct hci_request *req, static int hci_req_add_le_interleaved_scan(struct hci_request *req,
unsigned long opt) unsigned long opt)
{ {
......
...@@ -73,8 +73,6 @@ void hci_req_add_le_passive_scan(struct hci_request *req); ...@@ -73,8 +73,6 @@ void hci_req_add_le_passive_scan(struct hci_request *req);
void hci_req_prepare_suspend(struct hci_dev *hdev, enum suspended_state next); void hci_req_prepare_suspend(struct hci_dev *hdev, enum suspended_state next);
int hci_req_update_adv_data(struct hci_dev *hdev, u8 instance);
int hci_abort_conn(struct hci_conn *conn, u8 reason); int hci_abort_conn(struct hci_conn *conn, u8 reason);
void hci_request_setup(struct hci_dev *hdev); void hci_request_setup(struct hci_dev *hdev);
void hci_request_cancel_all(struct hci_dev *hdev); void hci_request_cancel_all(struct hci_dev *hdev);
...@@ -6065,3 +6065,23 @@ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy, ...@@ -6065,3 +6065,23 @@ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy,
return 0; return 0;
} }
static int _update_adv_data_sync(struct hci_dev *hdev, void *data)
{
u8 instance = *(u8 *)data;
kfree(data);
return hci_update_adv_data_sync(hdev, instance);
}
int hci_update_adv_data(struct hci_dev *hdev, u8 instance)
{
u8 *inst_ptr = kmalloc(1, GFP_KERNEL);
if (!inst_ptr)
return -ENOMEM;
*inst_ptr = instance;
return hci_cmd_sync_queue(hdev, _update_adv_data_sync, inst_ptr, NULL);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment