mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 06:32:08 +00:00
Bluetooth: Move discoverable changes to hdev->req_workqueue
The discoverable mode is intrinsically linked with the connectable mode e.g. through sharing the same HCI command (Write Scan Enable) for BR/EDR. It makes therefore sense to move it to hci_request.c and run the changes through the same hdev->req_workqueue. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
14bf5eac7a
commit
aed1a8851d
3 changed files with 79 additions and 77 deletions
|
@ -1351,6 +1351,68 @@ void __hci_req_update_class(struct hci_request *req)
|
|||
hci_req_add(req, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
|
||||
}
|
||||
|
||||
static void write_iac(struct hci_request *req)
|
||||
{
|
||||
struct hci_dev *hdev = req->hdev;
|
||||
struct hci_cp_write_current_iac_lap cp;
|
||||
|
||||
if (!hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
|
||||
return;
|
||||
|
||||
if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE)) {
|
||||
/* Limited discoverable mode */
|
||||
cp.num_iac = min_t(u8, hdev->num_iac, 2);
|
||||
cp.iac_lap[0] = 0x00; /* LIAC */
|
||||
cp.iac_lap[1] = 0x8b;
|
||||
cp.iac_lap[2] = 0x9e;
|
||||
cp.iac_lap[3] = 0x33; /* GIAC */
|
||||
cp.iac_lap[4] = 0x8b;
|
||||
cp.iac_lap[5] = 0x9e;
|
||||
} else {
|
||||
/* General discoverable mode */
|
||||
cp.num_iac = 1;
|
||||
cp.iac_lap[0] = 0x33; /* GIAC */
|
||||
cp.iac_lap[1] = 0x8b;
|
||||
cp.iac_lap[2] = 0x9e;
|
||||
}
|
||||
|
||||
hci_req_add(req, HCI_OP_WRITE_CURRENT_IAC_LAP,
|
||||
(cp.num_iac * 3) + 1, &cp);
|
||||
}
|
||||
|
||||
static int discoverable_update(struct hci_request *req, unsigned long opt)
|
||||
{
|
||||
struct hci_dev *hdev = req->hdev;
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
|
||||
if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
|
||||
write_iac(req);
|
||||
__hci_req_update_scan(req);
|
||||
__hci_req_update_class(req);
|
||||
}
|
||||
|
||||
/* Advertising instances don't use the global discoverable setting, so
|
||||
* only update AD if advertising was enabled using Set Advertising.
|
||||
*/
|
||||
if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
|
||||
__hci_req_update_adv_data(req, HCI_ADV_CURRENT);
|
||||
|
||||
hci_dev_unlock(hdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void discoverable_update_work(struct work_struct *work)
|
||||
{
|
||||
struct hci_dev *hdev = container_of(work, struct hci_dev,
|
||||
discoverable_update);
|
||||
u8 status;
|
||||
|
||||
hci_req_sync(hdev, discoverable_update, 0, HCI_CMD_TIMEOUT, &status);
|
||||
mgmt_set_discoverable_complete(hdev, status);
|
||||
}
|
||||
|
||||
void __hci_abort_conn(struct hci_request *req, struct hci_conn *conn,
|
||||
u8 reason)
|
||||
{
|
||||
|
@ -1867,6 +1929,7 @@ void hci_request_setup(struct hci_dev *hdev)
|
|||
INIT_WORK(&hdev->bg_scan_update, bg_scan_update);
|
||||
INIT_WORK(&hdev->scan_update, scan_update_work);
|
||||
INIT_WORK(&hdev->connectable_update, connectable_update_work);
|
||||
INIT_WORK(&hdev->discoverable_update, discoverable_update_work);
|
||||
INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work);
|
||||
INIT_DELAYED_WORK(&hdev->le_scan_restart, le_scan_restart_work);
|
||||
INIT_DELAYED_WORK(&hdev->adv_instance_expire, adv_timeout_expire);
|
||||
|
@ -1880,6 +1943,7 @@ void hci_request_cancel_all(struct hci_dev *hdev)
|
|||
cancel_work_sync(&hdev->bg_scan_update);
|
||||
cancel_work_sync(&hdev->scan_update);
|
||||
cancel_work_sync(&hdev->connectable_update);
|
||||
cancel_work_sync(&hdev->discoverable_update);
|
||||
cancel_delayed_work_sync(&hdev->le_scan_disable);
|
||||
cancel_delayed_work_sync(&hdev->le_scan_restart);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue