Clean-up stale/unused hci_request.c code
Subsystems (2)
v7 cover Clean-up stale/unused hci_request.c code
This will be a growing patch-set of conversions and dead-code removal towards the goal of retiring hci_request.c
The patch sets will be split amoung the work queues and delayed work queues as initialized in hci_request_setup(), with the ultimate goal of eliminating hci_request.c entirely.
v2: Published
v3: Continuing work. This does include one conversion (SCO configure_datapath) that has been tested with mgmt-tester and sco-tester, but has not been tested with a controller with an off-loadable codec.
v4: Clean-up checkpatch warnings.
v5: Remove remaining procedures from hci_request.c/h. Not that other entities (notably amp.c, hci_event.c and hci_core.c) are still using the hci_request mechanism, however, the mgmt-tester unit test only currently execute opcode 0x1408 - HCI_OP_READ_ENC_KEY_SIZE during normal testing.
v6: Fix CI reported errors, and recoded hci_abort_conn for optional sync queue usage to fix some L2CAP test cases.
v7: Delete and rebase to remove conflicting interleave scan clean-up. Will be done using work Luiz has been working on.
Brian Gix (9):
Bluetooth: Convert le_scan_disable timeout to hci_sync
Bluetooth: Rework le_scan_restart for hci_sync
Bluetooth: Delete unused hci_req_stop_discovery()
Bluetooth: Convert SCO configure_datapath to hci_sync
Bluetooth: Move Adv Instance timer to hci_sync
Bluetooth: Delete unreferenced hci_request code
Bluetooth: move hci_get_random_address() to hci_sync
Bluetooth: convert hci_update_adv_data to hci_sync
Bluetooth: Convert hci_abort_conn to hci_sync
include/net/bluetooth/hci_sync.h | 10 +- net/bluetooth/hci_conn.c | 92 +- net/bluetooth/hci_core.c | 2 +- net/bluetooth/hci_event.c | 2 +- net/bluetooth/hci_request.c | 1650 +++--------------------------- net/bluetooth/hci_request.h | 53 - net/bluetooth/hci_sync.c | 500 ++++++++- net/bluetooth/mgmt.c | 7 +- 8 files changed, 733 insertions(+), 1583 deletions(-)
Signature · 1 line
2.37.1
PATCH v7 1/9 Bluetooth: Convert le_scan_disable timeout to hci_sync
The le_scan_disable timeout was being performed on the deprecated hci_request.c mechanism. This timeout is performed in hci_sync.c
--- net/bluetooth/hci_request.c | 98 +------------------------------------ net/bluetooth/hci_sync.c | 73 +++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 97 deletions(-)
net/bluetooth/hci_request.c +1 -97
@@ -269,6 +269,7 @@ void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,void hci_req_add (struct hci_request *req,u16 opcode,u32 plen,const void *param) { +bt_dev_dbg (req->hdev,"HCI_REQ-0x%4.4x" , opcode);hci_req_add_ev (req, opcode, plen, param,0 ); }
@@ -1974,101 +1975,6 @@ int hci_abort_conn(struct hci_conn *conn, u8 reason)return 0 ; } -static int le_scan_disable (struct hci_request *req,unsigned long opt) -{ -hci_req_add_le_scan_disable (req, false); -return 0 ; -} - -static int bredr_inquiry (struct hci_request *req,unsigned long opt) -{ -u8 length = opt; -const u8 giac[3 ] = {0x33 ,0x8b ,0x9e }; -const u8 liac[3 ] = {0x00 ,0x8b ,0x9e }; -struct hci_cp_inquiry cp; - -if (test_bit (HCI_INQUIRY , &req->hdev->flags)) -return 0 ; - -bt_dev_dbg (req->hdev,"" ); - -hci_dev_lock (req->hdev); -hci_inquiry_cache_flush (req->hdev); -hci_dev_unlock (req->hdev); - -memset (&cp,0 ,sizeof (cp)); - -if (req->hdev->discovery.limited) -memcpy (&cp.lap, liac,sizeof (cp.lap)); -else -memcpy (&cp.lap, giac,sizeof (cp.lap)); - - cp.length = length; - -hci_req_add (req,HCI_OP_INQUIRY ,sizeof (cp), &cp); - -return 0 ; -} - -static void le_scan_disable_work (struct work_struct *work) -{ - struct hci_dev *hdev = container_of(work, struct hci_dev, - le_scan_disable.work); -u8 status; - -bt_dev_dbg (hdev,"" ); - -if (!hci_dev_test_flag (hdev,HCI_LE_SCAN )) -return ; - -cancel_delayed_work (&hdev->le_scan_restart); - -hci_req_sync (hdev, le_scan_disable,0 ,HCI_CMD_TIMEOUT , &status); -if (status) { -bt_dev_err (hdev,"failed to disable LE scan: status 0x%02x" , - status); -return ; - } - - hdev->discovery.scan_start =0 ; - -/* If we were running LE only scan, change discovery state. If -* we were running both LE and BR/EDR inquiry simultaneously, -* and BR/EDR inquiry is already finished, stop discovery, -* otherwise BR/EDR inquiry will stop discovery when finished. -* If we will resolve remote device name, do not change -* discovery state. -*/ - -if (hdev->discovery.type ==DISCOV_TYPE_LE ) - goto discov_stopped; - -if (hdev->discovery.type !=DISCOV_TYPE_INTERLEAVED ) -return ; - -if (test_bit (HCI_QUIRK_SIMULTANEOUS_DISCOVERY , &hdev->quirks)) { -if (!test_bit (HCI_INQUIRY , &hdev->flags) && - hdev->discovery.state !=DISCOVERY_RESOLVING ) - goto discov_stopped; - -return ; - } - -hci_req_sync (hdev, bredr_inquiry,DISCOV_INTERLEAVED_INQUIRY_LEN , -HCI_CMD_TIMEOUT , &status); -if (status) { -bt_dev_err (hdev,"inquiry failed: status 0x%02x" , status); - goto discov_stopped; - } - -return ; - -discov_stopped: -hci_dev_lock (hdev); -hci_discovery_set_state (hdev,DISCOVERY_STOPPED ); -hci_dev_unlock (hdev); -} -static int le_scan_restart (struct hci_request *req,unsigned long opt) {struct hci_dev *hdev = req->hdev;
@@ -2252,7 +2158,6 @@ int hci_req_configure_datapath(struct hci_dev *hdev, struct bt_codec *codec)void hci_request_setup (struct hci_dev *hdev) { -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);INIT_DELAYED_WORK (&hdev->interleave_scan, interleave_scan_work);
@@ -2262,7 +2167,6 @@ void hci_request_cancel_all(struct hci_dev *hdev) {__hci_cmd_sync_cancel (hdev,ENODEV ); -cancel_delayed_work_sync (&hdev->le_scan_disable);cancel_delayed_work_sync (&hdev->le_scan_restart);if (hdev->adv_instance_timeout) {
net/bluetooth/hci_sync.c +73 -0
91 lines not on this page · raw message
Signature · 1 line
2.37.1
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list. This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=665790
---Test result---
Test Summary:
CheckPatch PASS 12.16 seconds GitLint PASS 4.20 seconds SubjectPrefix PASS 2.69 seconds BuildKernel PASS 45.26 seconds BuildKernel32 PASS 39.57 seconds Incremental Build with patchesPASS 251.29 seconds TestRunner: Setup PASS 639.25 seconds TestRunner: l2cap-tester PASS 23.50 seconds TestRunner: bnep-tester PASS 8.06 seconds TestRunner: mgmt-tester PASS 123.87 seconds TestRunner: rfcomm-tester PASS 11.97 seconds TestRunner: sco-tester PASS 11.82 seconds TestRunner: smp-tester PASS 11.50 seconds TestRunner: userchan-tester PASS 7.89 seconds
---
Regards,
Linux Bluetooth
PATCH v7 2/9 Bluetooth: Rework le_scan_restart for hci_sync
In reply to Brian Gixle_scan_restart delayed work queue was running as a deprecated hci_request instead of on the newer thread-safe hci_sync mechanism.
--- net/bluetooth/hci_request.c | 89 ------------------------------------- net/bluetooth/hci_sync.c | 75 +++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 89 deletions(-)
net/bluetooth/hci_request.c +0 -89
@@ -1975,92 +1975,6 @@ int hci_abort_conn(struct hci_conn *conn, u8 reason)return 0 ; } -static int le_scan_restart (struct hci_request *req,unsigned long opt) -{ -struct hci_dev *hdev = req->hdev; - -/* If controller is not scanning we are done. */ -if (!hci_dev_test_flag (hdev,HCI_LE_SCAN )) -return 0 ; - -if (hdev->scanning_paused) { -bt_dev_dbg (hdev,"Scanning is paused for suspend" ); -return 0 ; - } - -hci_req_add_le_scan_disable (req, false); - -if (use_ext_scan (hdev)) { -struct hci_cp_le_set_ext_scan_enable ext_enable_cp; - -memset (&ext_enable_cp,0 ,sizeof (ext_enable_cp)); - ext_enable_cp.enable =LE_SCAN_ENABLE ; - ext_enable_cp.filter_dup =LE_SCAN_FILTER_DUP_ENABLE ; - -hci_req_add (req,HCI_OP_LE_SET_EXT_SCAN_ENABLE , -sizeof (ext_enable_cp), &ext_enable_cp); - }else { -struct hci_cp_le_set_scan_enable cp; - -memset (&cp,0 ,sizeof (cp)); - cp.enable =LE_SCAN_ENABLE ; - cp.filter_dup =LE_SCAN_FILTER_DUP_ENABLE ; -hci_req_add (req,HCI_OP_LE_SET_SCAN_ENABLE ,sizeof (cp), &cp); - } - -return 0 ; -} - -static void le_scan_restart_work (struct work_struct *work) -{ - struct hci_dev *hdev = container_of(work, struct hci_dev, - le_scan_restart.work); -unsigned long timeout, duration, scan_start, now; -u8 status; - -bt_dev_dbg (hdev,"" ); - -hci_req_sync (hdev, le_scan_restart,0 ,HCI_CMD_TIMEOUT , &status); -if (status) { -bt_dev_err (hdev,"failed to restart LE scan: status %d" , - status); -return ; - } - -hci_dev_lock (hdev); - -if (!test_bit (HCI_QUIRK_STRICT_DUPLICATE_FILTER , &hdev->quirks) || - !hdev->discovery.scan_start) - goto unlock; - -/* When the scan was started, hdev->le_scan_disable has been queued -* after duration from scan_start. During scan restart this job -* has been canceled, and we need to queue it again after proper -* timeout, to make sure that scan does not run indefinitely. -*/ - duration = hdev->discovery.scan_duration; - scan_start = hdev->discovery.scan_start; - now = jiffies; -if (now - scan_start <= duration) { -int elapsed; - -if (now >= scan_start) - elapsed = now - scan_start; -else - elapsed =ULONG_MAX - scan_start + now; - - timeout = duration - elapsed; - }else { - timeout =0 ; - } - -queue_delayed_work (hdev->req_workqueue, - &hdev->le_scan_disable, timeout); - -unlock: -hci_dev_unlock (hdev); -} -bool hci_req_stop_discovery (struct hci_request *req) {struct hci_dev *hdev = req->hdev;
@@ -2158,7 +2072,6 @@ int hci_req_configure_datapath(struct hci_dev *hdev, struct bt_codec *codec)void hci_request_setup (struct hci_dev *hdev) { -INIT_DELAYED_WORK (&hdev->le_scan_restart, le_scan_restart_work);INIT_DELAYED_WORK (&hdev->adv_instance_expire, adv_timeout_expire);INIT_DELAYED_WORK (&hdev->interleave_scan, interleave_scan_work); }
@@ -2167,8 +2080,6 @@ void hci_request_cancel_all(struct hci_dev *hdev) {__hci_cmd_sync_cancel (hdev,ENODEV ); -cancel_delayed_work_sync (&hdev->le_scan_restart); -if (hdev->adv_instance_timeout) {cancel_delayed_work_sync (&hdev->adv_instance_expire); hdev->adv_instance_timeout =0 ;
net/bluetooth/hci_sync.c +75 -0
93 lines not on this page · raw message
Signature · 1 line
2.37.1
PATCH v7 3/9 Bluetooth: Delete unused hci_req_stop_discovery()
In reply to Brian Gixhci_req_stop_discovery has been deprecated in favor of hci_stop_discovery_sync() as part of transition to hci_sync.c
--- net/bluetooth/hci_request.c | 48 ------------------------------------- net/bluetooth/hci_request.h | 2 -- 2 files changed, 50 deletions(-)
net/bluetooth/hci_request.c +0 -48
@@ -1975,54 +1975,6 @@ int hci_abort_conn(struct hci_conn *conn, u8 reason)return 0 ; } -bool hci_req_stop_discovery (struct hci_request *req) -{ -struct hci_dev *hdev = req->hdev; -struct discovery_state *d = &hdev->discovery; -struct hci_cp_remote_name_req_cancel cp; -struct inquiry_entry *e; -bool ret = false; - -bt_dev_dbg (hdev,"state %u" , hdev->discovery.state); - -if (d->state ==DISCOVERY_FINDING || d->state ==DISCOVERY_STOPPING ) { -if (test_bit (HCI_INQUIRY , &hdev->flags)) -hci_req_add (req,HCI_OP_INQUIRY_CANCEL ,0 ,NULL ); - -if (hci_dev_test_flag (hdev,HCI_LE_SCAN )) { -cancel_delayed_work (&hdev->le_scan_disable); -cancel_delayed_work (&hdev->le_scan_restart); -hci_req_add_le_scan_disable (req, false); - } - - ret = true; - }else { -/* Passive scanning */ -if (hci_dev_test_flag (hdev,HCI_LE_SCAN )) { -hci_req_add_le_scan_disable (req, false); - ret = true; - } - } - -/* No further actions needed for LE-only discovery */ -if (d->type ==DISCOV_TYPE_LE ) -return ret; - -if (d->state ==DISCOVERY_RESOLVING || d->state ==DISCOVERY_STOPPING ) { - e =hci_inquiry_cache_lookup_resolve (hdev,BDADDR_ANY , -NAME_PENDING ); -if (!e) -return ret; - -bacpy (&cp.bdaddr, &e->data.bdaddr); -hci_req_add (req,HCI_OP_REMOTE_NAME_REQ_CANCEL ,sizeof (cp), - &cp); - ret = true; - } - -return ret; -} -static void config_data_path_complete (struct hci_dev *hdev,u8 status,u16 opcode) {
net/bluetooth/hci_request.h +0 -2
@@ -113,8 +113,6 @@ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy,void __hci_req_update_class (struct hci_request *req);/* Returns true if HCI commands were queued */ -bool hci_req_stop_discovery (struct hci_request *req); -int hci_req_configure_datapath (struct hci_dev *hdev,struct bt_codec *codec);void __hci_req_update_scan (struct hci_request *req);
Signature · 1 line
2.37.1
PATCH v7 4/9 Bluetooth: Convert SCO configure_datapath to hci_sync
In reply to Brian GixRecoding HCI cmds to offload SCO codec to use hci_sync mechanism rather than deprecated hci_request mechanism.
--- net/bluetooth/hci_conn.c | 86 ++++++++++++++++++++++++++++++++----- net/bluetooth/hci_request.c | 47 -------------------- net/bluetooth/hci_request.h | 2 - 3 files changed, 75 insertions(+), 60 deletions(-)
net/bluetooth/hci_conn.c +75 -11
@@ -44,6 +44,11 @@ struct sco_param {u8 retrans_effort; }; +struct conn_handle_t { +struct hci_conn *conn; +__u16 handle; +}; +static const struct sco_param esco_param_cvsd[] = { {EDR_ESCO_MASK & ~ESCO_2EV3 ,0x000a ,0x01 },/* S3 */ {EDR_ESCO_MASK & ~ESCO_2EV3 ,0x0007 ,0x01 },/* S2 */
@@ -316,17 +321,60 @@ static bool find_next_esco_param(struct hci_conn *conn,return conn->attempt <= size; } -static bool hci_enhanced_setup_sync_conn (struct hci_conn *conn,__u16 handle) +static int configure_datapath_sync (struct hci_dev *hdev,struct bt_codec *codec) { -struct hci_dev *hdev = conn->hdev; +int err; +__u8 vnd_len, *vnd_data =NULL ; +struct hci_op_configure_data_path *cmd =NULL ; + + err = hdev->get_codec_config_data (hdev,ESCO_LINK , codec, &vnd_len, + &vnd_data); +if (err <0 ) + goto error; + + cmd =kzalloc (sizeof (*cmd) + vnd_len,GFP_KERNEL ); +if (!cmd) { + err = -ENOMEM ; + goto error; + } + + err = hdev->get_data_path_id (hdev, &cmd->data_path_id); +if (err <0 ) + goto error; + + cmd->vnd_len = vnd_len; +memcpy (cmd->vnd_data, vnd_data, vnd_len); + + cmd->direction =0x00 ; +__hci_cmd_sync_status (hdev,HCI_CONFIGURE_DATA_PATH , +sizeof (*cmd) + vnd_len, cmd,HCI_CMD_TIMEOUT ); + + cmd->direction =0x01 ; + err =__hci_cmd_sync_status (hdev,HCI_CONFIGURE_DATA_PATH , +sizeof (*cmd) + vnd_len, cmd, +HCI_CMD_TIMEOUT ); +error: + +kfree (cmd); +kfree (vnd_data); +return err; +} + +static int hci_enhanced_setup_sync (struct hci_dev *hdev,void *data) +{ +struct conn_handle_t *conn_handle = data; +struct hci_conn *conn = conn_handle->conn; +__u16 handle = conn_handle->handle;struct hci_cp_enhanced_setup_sync_conn cp;const struct sco_param *param; +kfree (conn_handle); +bt_dev_dbg (hdev,"hcon %p" , conn);/* for offload use case, codec needs to configured before opening SCO */ if (conn->codec.data_path) -hci_req_configure_datapath (hdev, &conn->codec); +configure_datapath_sync (hdev, &conn->codec); conn->state =BT_CONNECT ; conn->out = true;
@@ -344,7 +392,7 @@ static bool hci_enhanced_setup_sync_conn(struct hci_conn *conn, __u16 handle)case BT_CODEC_MSBC :if (!find_next_esco_param (conn, esco_param_msbc,ARRAY_SIZE (esco_param_msbc))) -return false; +return -EINVAL ; param = &esco_param_msbc[conn->attempt -1 ]; cp.tx_coding_format.id =0x05 ;
@@ -396,11 +444,11 @@ static bool hci_enhanced_setup_sync_conn(struct hci_conn *conn, __u16 handle)if (lmp_esco_capable (conn->link)) {if (!find_next_esco_param (conn, esco_param_cvsd,ARRAY_SIZE (esco_param_cvsd))) -return false; +return -EINVAL ; param = &esco_param_cvsd[conn->attempt -1 ]; }else {if (conn->attempt >ARRAY_SIZE (sco_param_cvsd)) -return false; +return -EINVAL ; param = &sco_param_cvsd[conn->attempt -1 ]; } cp.tx_coding_format.id =2 ;
@@ -423,7 +471,7 @@ static bool hci_enhanced_setup_sync_conn(struct hci_conn *conn, __u16 handle) cp.out_transport_unit_size =16 ;break ;default : -return false; +return -EINVAL ; } cp.retrans_effort = param->retrans_effort;
@@ -431,9 +479,9 @@ static bool hci_enhanced_setup_sync_conn(struct hci_conn *conn, __u16 handle) cp.max_latency =__cpu_to_le16 (param->max_latency);if (hci_send_cmd (hdev,HCI_OP_ENHANCED_SETUP_SYNC_CONN ,sizeof (cp), &cp) <0 ) -return false; +return -EIO ; -return true; +return 0 ; }static bool hci_setup_sync_conn (struct hci_conn *conn,__u16 handle)
@@ -490,8 +538,24 @@ static bool hci_setup_sync_conn(struct hci_conn *conn, __u16 handle)bool hci_setup_sync (struct hci_conn *conn,__u16 handle) { -if (enhanced_sync_conn_capable (conn->hdev)) -return hci_enhanced_setup_sync_conn (conn, handle); +int result; +struct conn_handle_t *conn_handle; + +if (enhanced_sync_conn_capable (conn->hdev)) { + conn_handle =kzalloc (sizeof (*conn_handle),GFP_KERNEL ); + +if (!conn_handle) +return false; + + conn_handle->conn = conn; + conn_handle->handle = handle; + result =hci_cmd_sync_queue (conn->hdev, hci_enhanced_setup_sync, + conn_handle,NULL ); +if (result <0 ) +kfree (conn_handle); + +return result ==0 ; + }return hci_setup_sync_conn (conn, handle); }
net/bluetooth/hci_request.c +0 -47
53 lines not on this page · raw message
net/bluetooth/hci_request.h +0 -2
@@ -113,8 +113,6 @@ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy,void __hci_req_update_class (struct hci_request *req);/* Returns true if HCI commands were queued */ -int hci_req_configure_datapath (struct hci_dev *hdev,struct bt_codec *codec); -void __hci_req_update_scan (struct hci_request *req); int hci_update_random_address(struct hci_request *req, bool require_privacy,
Signature · 1 line
2.37.1
PATCH v7 5/9 Bluetooth: Move Adv Instance timer to hci_sync
In reply to Brian GixThe Advertising Instance expiration timer adv_instance_expire was handled with the deprecated hci_request mechanism, rather than it's
replacement: hci_sync.
--- include/net/bluetooth/hci_sync.h | 3 +- net/bluetooth/hci_request.c | 111 -------------------------- net/bluetooth/hci_request.h | 4 - net/bluetooth/hci_sync.c | 129 +++++++++++++++++++++++++++++-- net/bluetooth/mgmt.c | 5 +- 5 files changed, 125 insertions(+), 127 deletions(-)
include/net/bluetooth/hci_sync.h +2 -1
@@ -72,7 +72,8 @@ int hci_start_per_adv_sync(struct hci_dev *hdev, u8 instance, u8 data_len,int hci_remove_advertising_sync (struct hci_dev *hdev,struct sock *sk,u8 instance,bool force);int hci_disable_advertising_sync (struct hci_dev *hdev); - +int hci_clear_adv_instance_sync (struct hci_dev *hdev,struct sock *sk, +u8 instance,bool force);int hci_update_passive_scan_sync (struct hci_dev *hdev);int hci_update_passive_scan (struct hci_dev *hdev);int hci_read_rssi_sync (struct hci_dev *hdev,__le16 handle);
net/bluetooth/hci_request.c +0 -111
140 lines not on this page · raw message
net/bluetooth/hci_request.h +0 -4
@@ -90,10 +90,6 @@ void __hci_req_update_scan_rsp_data(struct hci_request *req, u8 instance);int __hci_req_schedule_adv_instance (struct hci_request *req,u8 instance,bool force); -void hci_req_clear_adv_instance (struct hci_dev *hdev,struct sock *sk, -struct hci_request *req,u8 instance, -bool force); -int __hci_req_setup_ext_adv_instance (struct hci_request *req,u8 instance);int __hci_req_setup_per_adv_instance (struct hci_request *req,u8 instance,u16 min_interval,u16 max_interval);
net/bluetooth/hci_sync.c +121 -8
153 lines not on this page · raw message
net/bluetooth/mgmt.c +2 -3
@@ -2058,6 +2058,8 @@ static int set_le_sync(struct hci_dev *hdev, void *data)int err;if (!val) { +hci_clear_adv_instance_sync (hdev,NULL ,0x00 , true); +if (hci_dev_test_flag (hdev,HCI_LE_ADV ))hci_disable_advertising_sync (hdev);
@@ -2131,9 +2133,6 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) val = !!cp->val; enabled =lmp_host_le_capable (hdev); -if (!val) -hci_req_clear_adv_instance (hdev,NULL ,NULL ,0x00 , true); -if (!hdev_is_powered (hdev) || val == enabled) {bool changed = false;
Signature · 1 line
2.37.1
PATCH v7 6/9 Bluetooth: Delete unreferenced hci_request code
In reply to Brian GixThis patch deletes a whole bunch of code no longer reached because the functionality was recoded using hci_sync.c
--- net/bluetooth/hci_request.c | 737 +----------------------------------- net/bluetooth/hci_request.h | 33 -- 2 files changed, 2 insertions(+), 768 deletions(-)
net/bluetooth/hci_request.c +2 -735
@@ -269,43 +269,10 @@ void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,void hci_req_add (struct hci_request *req,u16 opcode,u32 plen,const void *param) { -bt_dev_dbg (req->hdev,"HCI_REQ-0x%4.4x" , opcode); +bt_dev_err (req->hdev,"HCI_REQ-0x%4.4x" , opcode);hci_req_add_ev (req, opcode, plen, param,0 ); } -void __hci_req_write_fast_connectable (struct hci_request *req,bool enable) -{ -struct hci_dev *hdev = req->hdev; -struct hci_cp_write_page_scan_activity acp; -u8 type; - -if (!hci_dev_test_flag (hdev,HCI_BREDR_ENABLED )) -return ; - -if (hdev->hci_ver <BLUETOOTH_VER_1_2 ) -return ; - -if (enable) { - type =PAGE_SCAN_TYPE_INTERLACED ; - -/* 160 msec page scan interval */ - acp.interval =cpu_to_le16 (0x0100 ); - }else { - type = hdev->def_page_scan_type; - acp.interval =cpu_to_le16 (hdev->def_page_scan_int); - } - - acp.window =cpu_to_le16 (hdev->def_page_scan_window); - -if (__cpu_to_le16 (hdev->page_scan_interval) != acp.interval || -__cpu_to_le16 (hdev->page_scan_window) != acp.window) -hci_req_add (req,HCI_OP_WRITE_PAGE_SCAN_ACTIVITY , -sizeof (acp), &acp); - -if (hdev->page_scan_type != type) -hci_req_add (req,HCI_OP_WRITE_PAGE_SCAN_TYPE ,1 , &type); -} -static void start_interleave_scan (struct hci_dev *hdev) { hdev->interleave_scan_state =INTERLEAVE_SCAN_NO_FILTER ;
@@ -358,45 +325,6 @@ static bool __hci_update_interleaved_scan(struct hci_dev *hdev)return false; } -void __hci_req_update_name (struct hci_request *req) -{ -struct hci_dev *hdev = req->hdev; -struct hci_cp_write_local_name cp; - -memcpy (cp.name, hdev->dev_name,sizeof (cp.name)); - -hci_req_add (req,HCI_OP_WRITE_LOCAL_NAME ,sizeof (cp), &cp); -} - -void __hci_req_update_eir (struct hci_request *req) -{ -struct hci_dev *hdev = req->hdev; -struct hci_cp_write_eir cp; - -if (!hdev_is_powered (hdev)) -return ; - -if (!lmp_ext_inq_capable (hdev)) -return ; - -if (!hci_dev_test_flag (hdev,HCI_SSP_ENABLED )) -return ; - -if (hci_dev_test_flag (hdev,HCI_SERVICE_CACHE )) -return ; - -memset (&cp,0 ,sizeof (cp)); - -eir_create (hdev, cp.data); - -if (memcmp (cp.data, hdev->eir,sizeof (cp.data)) ==0 ) -return ; - -memcpy (hdev->eir, cp.data,sizeof (cp.data)); - -hci_req_add (req,HCI_OP_WRITE_EIR ,sizeof (cp), &cp); -} -void hci_req_add_le_scan_disable (struct hci_request *req,bool rpa_le_conn) {struct hci_dev *hdev = req->hdev;
@@ -811,212 +739,7 @@ void hci_req_add_le_passive_scan(struct hci_request *req) addr_resolv); } -static bool adv_cur_instance_is_scannable (struct hci_dev *hdev) -{ -return hci_adv_instance_is_scannable (hdev, hdev->cur_adv_instance); -} - -void __hci_req_disable_advertising (struct hci_request *req) -{ -if (ext_adv_capable (req->hdev)) { -__hci_req_disable_ext_adv_instance (req,0x00 ); - }else { -u8 enable =0x00 ; - -hci_req_add (req,HCI_OP_LE_SET_ADV_ENABLE ,sizeof (enable), &enable); - } -} - -static bool adv_use_rpa (struct hci_dev *hdev,uint32_t flags) -{ -/* If privacy is not enabled don't use RPA */ -if (!hci_dev_test_flag (hdev,HCI_PRIVACY )) -return false; - -/* If basic privacy mode is enabled use RPA */ -if (!hci_dev_test_flag (hdev,HCI_LIMITED_PRIVACY )) -return true; - -/* If limited privacy mode is enabled don't use RPA if we're -* both discoverable and bondable. -*/ -if ((flags &MGMT_ADV_FLAG_DISCOV ) && -hci_dev_test_flag (hdev,HCI_BONDABLE )) -return false; - -/* We're neither bondable nor discoverable in the limited -* privacy mode, therefore use RPA. -*/ -return true; -} - -static bool is_advertising_allowed (struct hci_dev *hdev,bool connectable) -{ -/* If there is no connection we are OK to advertise. */ -if (hci_conn_num (hdev,LE_LINK ) ==0 ) -return true; - -/* Check le_states if there is any connection in peripheral role. */ -if (hdev->conn_hash.le_num_peripheral >0 ) { -/* Peripheral connection state and non connectable mode bit 20. -*/ -if (!connectable && !(hdev->le_states[2 ] &0x10 )) -return false; - -/* Peripheral connection state and connectable mode bit 38 -* and scannable bit 21. -*/ -if (connectable && (!(hdev->le_states[4 ] &0x40 ) || - !(hdev->le_states[2 ] &0x20 ))) -return false; - } - -/* Check le_states if there is any connection in central role. */ -if (hci_conn_num (hdev,LE_LINK ) != hdev->conn_hash.le_num_peripheral) { -/* Central connection state and non connectable mode bit 18. */ -if (!connectable && !(hdev->le_states[2 ] &0x02 )) -return false; - -/* Central connection state and connectable mode bit 35 and -* scannable 19. -*/ -if (connectable && (!(hdev->le_states[4 ] &0x08 ) || - !(hdev->le_states[2 ] &0x08 ))) -return false; - } - -return true; -} - -void __hci_req_enable_advertising (struct hci_request *req) -{ -struct hci_dev *hdev = req->hdev; -struct adv_info *adv; -struct hci_cp_le_set_adv_param cp; -u8 own_addr_type, enable =0x01 ; -bool connectable; -u16 adv_min_interval, adv_max_interval; -u32 flags; - - flags =hci_adv_instance_flags (hdev, hdev->cur_adv_instance); - adv =hci_find_adv_instance (hdev, hdev->cur_adv_instance); - -/* If the "connectable" instance flag was not set, then choose between -* ADV_IND and ADV_NONCONN_IND based on the global connectable setting. -*/ - connectable = (flags &MGMT_ADV_FLAG_CONNECTABLE ) || -mgmt_get_connectable (hdev); - -if (!is_advertising_allowed (hdev, connectable)) -return ; - -if (hci_dev_test_flag (hdev,HCI_LE_ADV )) -__hci_req_disable_advertising (req); - -/* Clear the HCI_LE_ADV bit temporarily so that the -* hci_update_random_address knows that it's safe to go ahead -* and write a new random address. The flag will be set back on -* as soon as the SET_ADV_ENABLE HCI command completes. -*/ -hci_dev_clear_flag (hdev,HCI_LE_ADV ); - -/* Set require_privacy to true only when non-connectable -* advertising is used. In that case it is fine to use a -* non-resolvable private address. -*/ -if (hci_update_random_address (req, !connectable, -adv_use_rpa (hdev, flags), - &own_addr_type) <0 ) -return ; - -memset (&cp,0 ,sizeof (cp)); - -if (adv) { - adv_min_interval = adv->min_interval; - adv_max_interval = adv->max_interval; - }else { - adv_min_interval = hdev->le_adv_min_interval; - adv_max_interval = hdev->le_adv_max_interval; - } - -if (connectable) { - cp.type =LE_ADV_IND ; - }else { -if (adv_cur_instance_is_scannable (hdev)) - cp.type =LE_ADV_SCAN_IND ; -else - cp.type =LE_ADV_NONCONN_IND ; - -if (!hci_dev_test_flag (hdev,HCI_DISCOVERABLE ) || -hci_dev_test_flag (hdev,HCI_LIMITED_DISCOVERABLE )) { - adv_min_interval =DISCOV_LE_FAST_ADV_INT_MIN ; - adv_max_interval =DISCOV_LE_FAST_ADV_INT_MAX ; - } - } - - cp.min_interval =cpu_to_le16 (adv_min_interval); - cp.max_interval =cpu_to_le16 (adv_max_interval); - cp.own_address_type = own_addr_type; - cp.channel_map = hdev->le_adv_channel_map; - -hci_req_add (req,HCI_OP_LE_SET_ADV_PARAM ,sizeof (cp), &cp); - -hci_req_add (req,HCI_OP_LE_SET_ADV_ENABLE ,sizeof (enable), &enable); -} - -void __hci_req_update_scan_rsp_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_scan_rsp_data cp; -u8 data[HCI_MAX_EXT_AD_LENGTH ]; - } pdu; - -memset (&pdu,0 ,sizeof (pdu)); - - len =eir_create_scan_rsp (hdev, instance, pdu.data); - -if (hdev->scan_rsp_data_len == len && - !memcmp (pdu.data, hdev->scan_rsp_data, len)) -return ; - -memcpy (hdev->scan_rsp_data, pdu.data, len); - hdev->scan_rsp_data_len = len; - - pdu.cp.handle = instance; - pdu.cp.length = len; - 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_SCAN_RSP_DATA , -sizeof (pdu.cp) + len, &pdu.cp); - }else { -struct hci_cp_le_set_scan_rsp_data cp; - -memset (&cp,0 ,sizeof (cp)); - - len =eir_create_scan_rsp (hdev, instance, cp.data); - -if (hdev->scan_rsp_data_len == len && - !memcmp (cp.data, hdev->scan_rsp_data, len)) -return ; - -memcpy (hdev->scan_rsp_data, cp.data,sizeof (cp.data)); - hdev->scan_rsp_data_len = len; - - cp.length = len; - -hci_req_add (req,HCI_OP_LE_SET_SCAN_RSP_DATA ,sizeof (cp), &cp); - } -} - -void __hci_req_update_adv_data (struct hci_request *req,u8 instance) +static void __hci_req_update_adv_data (struct hci_request *req,u8 instance) {struct hci_dev *hdev = req->hdev;u8 len;
@@ -1080,58 +803,6 @@ int hci_req_update_adv_data(struct hci_dev *hdev, u8 instance)return hci_req_run (&req,NULL ); } -static void enable_addr_resolution_complete (struct hci_dev *hdev,u8 status, -u16 opcode) -{ -BT_DBG ("%s status %u" , hdev->name, status); -} - -void hci_req_disable_address_resolution (struct hci_dev *hdev) -{ -struct hci_request req; -__u8 enable =0x00 ; - -if (!hci_dev_test_flag (hdev,HCI_LL_RPA_RESOLUTION )) -return ; - -hci_req_init (&req, hdev); - -hci_req_add (&req,HCI_OP_LE_SET_ADDR_RESOLV_ENABLE ,1 , &enable); - -hci_req_run (&req, enable_addr_resolution_complete); -} - -static void adv_enable_complete (struct hci_dev *hdev,u8 status,u16 opcode) -{ -bt_dev_dbg (hdev,"status %u" , status); -} - -void hci_req_reenable_advertising (struct hci_dev *hdev) -{ -struct hci_request req; - -if (!hci_dev_test_flag (hdev,HCI_ADVERTISING ) && -list_empty (&hdev->adv_instances)) -return ; - -hci_req_init (&req, hdev); - -if (hdev->cur_adv_instance) { -__hci_req_schedule_adv_instance (&req, hdev->cur_adv_instance, - true); - }else { -if (ext_adv_capable (hdev)) { -__hci_req_start_ext_adv (&req,0x00 ); - }else { -__hci_req_update_adv_data (&req,0x00 ); -__hci_req_update_scan_rsp_data (&req,0x00 ); -__hci_req_enable_advertising (&req); - } - } - -hci_req_run (&req, adv_enable_complete); -} -static int hci_req_add_le_interleaved_scan (struct hci_request *req,unsigned long opt) {
@@ -1261,11 +932,6 @@ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy,return 0 ; } -void __hci_req_clear_ext_adv_sets (struct hci_request *req) -{ -hci_req_add (req,HCI_OP_LE_CLEAR_ADV_SETS ,0 ,NULL ); -} -static void set_random_addr (struct hci_request *req,bdaddr_t *rpa) {struct hci_dev *hdev = req->hdev;
@@ -1290,314 +956,6 @@ static void set_random_addr(struct hci_request *req, bdaddr_t *rpa)hci_req_add (req,HCI_OP_LE_SET_RANDOM_ADDR ,6 , rpa); } -int __hci_req_setup_ext_adv_instance (struct hci_request *req,u8 instance) -{ -struct hci_cp_le_set_ext_adv_params cp; -struct hci_dev *hdev = req->hdev; -bool connectable; -u32 flags; -bdaddr_t random_addr; -u8 own_addr_type; -int err; -struct adv_info *adv; -bool secondary_adv, require_privacy; - -if (instance >0 ) { - adv =hci_find_adv_instance (hdev, instance); -if (!adv) -return -EINVAL ; - }else { - adv =NULL ; - } - - flags =hci_adv_instance_flags (hdev, instance); - -/* If the "connectable" instance flag was not set, then choose between -* ADV_IND and ADV_NONCONN_IND based on the global connectable setting. -*/ - connectable = (flags &MGMT_ADV_FLAG_CONNECTABLE ) || -mgmt_get_connectable (hdev); - -if (!is_advertising_allowed (hdev, connectable)) -return -EPERM ; - -/* Set require_privacy to true only when non-connectable -* advertising is used. In that case it is fine to use a -* non-resolvable private address. -*/ - require_privacy = !connectable; - -/* Don't require privacy for periodic adv? */ -if (adv && adv->periodic) - require_privacy = false; - - err =hci_get_random_address (hdev, require_privacy, -adv_use_rpa (hdev, flags), adv, - &own_addr_type, &random_addr); -if (err <0 ) -return err; - -memset (&cp,0 ,sizeof (cp)); - -if (adv) { -hci_cpu_to_le24 (adv->min_interval, cp.min_interval); -hci_cpu_to_le24 (adv->max_interval, cp.max_interval); - cp.tx_power = adv->tx_power; - }else { -hci_cpu_to_le24 (hdev->le_adv_min_interval, cp.min_interval); -hci_cpu_to_le24 (hdev->le_adv_max_interval, cp.max_interval); - cp.tx_power =HCI_ADV_TX_POWER_NO_PREFERENCE ; - } - - secondary_adv = (flags &MGMT_ADV_FLAG_SEC_MASK ); - -if (connectable) { -if (secondary_adv) - cp.evt_properties =cpu_to_le16 (LE_EXT_ADV_CONN_IND ); -else - cp.evt_properties =cpu_to_le16 (LE_LEGACY_ADV_IND ); - }else if (hci_adv_instance_is_scannable (hdev, instance) || - (flags &MGMT_ADV_PARAM_SCAN_RSP )) { -if (secondary_adv) - cp.evt_properties =cpu_to_le16 (LE_EXT_ADV_SCAN_IND ); -else - cp.evt_properties =cpu_to_le16 (LE_LEGACY_ADV_SCAN_IND ); - }else { -/* Secondary and periodic cannot use legacy PDUs */ -if (secondary_adv || (adv && adv->periodic)) - cp.evt_properties =cpu_to_le16 (LE_EXT_ADV_NON_CONN_IND ); -else - cp.evt_properties =cpu_to_le16 (LE_LEGACY_NONCONN_IND ); - } - - cp.own_addr_type = own_addr_type; - cp.channel_map = hdev->le_adv_channel_map; - cp.handle = instance; - -if (flags &MGMT_ADV_FLAG_SEC_2M ) { - cp.primary_phy =HCI_ADV_PHY_1M ; - cp.secondary_phy =HCI_ADV_PHY_2M ; - }else if (flags &MGMT_ADV_FLAG_SEC_CODED ) { - cp.primary_phy =HCI_ADV_PHY_CODED ; - cp.secondary_phy =HCI_ADV_PHY_CODED ; - }else { -/* In all other cases use 1M */ - cp.primary_phy =HCI_ADV_PHY_1M ; - cp.secondary_phy =HCI_ADV_PHY_1M ; - } - -hci_req_add (req,HCI_OP_LE_SET_EXT_ADV_PARAMS ,sizeof (cp), &cp); - -if ((own_addr_type ==ADDR_LE_DEV_RANDOM || - own_addr_type ==ADDR_LE_DEV_RANDOM_RESOLVED ) && -bacmp (&random_addr,BDADDR_ANY )) { -struct hci_cp_le_set_adv_set_rand_addr cp; - -/* Check if random address need to be updated */ -if (adv) { -if (!bacmp (&random_addr, &adv->random_addr)) -return 0 ; - }else { -if (!bacmp (&random_addr, &hdev->random_addr)) -return 0 ; -/* Instance 0x00 doesn't have an adv_info, instead it -* uses hdev->random_addr to track its address so -* whenever it needs to be updated this also set the -* random address since hdev->random_addr is shared with -* scan state machine. -*/ -set_random_addr (req, &random_addr); - } - -memset (&cp,0 ,sizeof (cp)); - - cp.handle = instance; -bacpy (&cp.bdaddr, &random_addr); - -hci_req_add (req, -HCI_OP_LE_SET_ADV_SET_RAND_ADDR , -sizeof (cp), &cp); - } - -return 0 ; -} - -int __hci_req_enable_ext_advertising (struct hci_request *req,u8 instance) -{ -struct hci_dev *hdev = req->hdev; -struct hci_cp_le_set_ext_adv_enable *cp; -struct hci_cp_ext_adv_set *adv_set; -u8 data[sizeof (*cp) +sizeof (*adv_set) *1 ]; -struct adv_info *adv_instance; - -if (instance >0 ) { - adv_instance =hci_find_adv_instance (hdev, instance); -if (!adv_instance) -return -EINVAL ; - }else { - adv_instance =NULL ; - } - - cp = (void *) data; - adv_set = (void *) cp->data; - -memset (cp,0 ,sizeof (*cp)); - - cp->enable =0x01 ; - cp->num_of_sets =0x01 ; - -memset (adv_set,0 ,sizeof (*adv_set)); - - adv_set->handle = instance; - -/* Set duration per instance since controller is responsible for -* scheduling it. -*/ -if (adv_instance && adv_instance->duration) { -u16 duration = adv_instance->timeout *MSEC_PER_SEC ; - -/* Time = N * 10 ms */ - adv_set->duration =cpu_to_le16 (duration /10 ); - } - -hci_req_add (req,HCI_OP_LE_SET_EXT_ADV_ENABLE , -sizeof (*cp) +sizeof (*adv_set) * cp->num_of_sets, - data); - -return 0 ; -} - -int __hci_req_disable_ext_adv_instance (struct hci_request *req,u8 instance) -{ -struct hci_dev *hdev = req->hdev; -struct hci_cp_le_set_ext_adv_enable *cp; -struct hci_cp_ext_adv_set *adv_set; -u8 data[sizeof (*cp) +sizeof (*adv_set) *1 ]; -u8 req_size; - -/* If request specifies an instance that doesn't exist, fail */ -if (instance >0 && !hci_find_adv_instance (hdev, instance)) -return -EINVAL ; - -memset (data,0 ,sizeof (data)); - - cp = (void *)data; - adv_set = (void *)cp->data; - -/* Instance 0x00 indicates all advertising instances will be disabled */ - cp->num_of_sets = !!instance; - cp->enable =0x00 ; - - adv_set->handle = instance; - - req_size =sizeof (*cp) +sizeof (*adv_set) * cp->num_of_sets; -hci_req_add (req,HCI_OP_LE_SET_EXT_ADV_ENABLE , req_size, data); - -return 0 ; -} - -int __hci_req_remove_ext_adv_instance (struct hci_request *req,u8 instance) -{ -struct hci_dev *hdev = req->hdev; - -/* If request specifies an instance that doesn't exist, fail */ -if (instance >0 && !hci_find_adv_instance (hdev, instance)) -return -EINVAL ; - -hci_req_add (req,HCI_OP_LE_REMOVE_ADV_SET ,sizeof (instance), &instance); - -return 0 ; -} - -int __hci_req_start_ext_adv (struct hci_request *req,u8 instance) -{ -struct hci_dev *hdev = req->hdev; -struct adv_info *adv_instance =hci_find_adv_instance (hdev, instance); -int err; - -/* If instance isn't pending, the chip knows about it, and it's safe to -* disable -*/ -if (adv_instance && !adv_instance->pending) -__hci_req_disable_ext_adv_instance (req, instance); - - err =__hci_req_setup_ext_adv_instance (req, instance); -if (err <0 ) -return err; - -__hci_req_update_scan_rsp_data (req, instance); -__hci_req_enable_ext_advertising (req, instance); - -return 0 ; -} - -int __hci_req_schedule_adv_instance (struct hci_request *req,u8 instance, -bool force) -{ -struct hci_dev *hdev = req->hdev; -struct adv_info *adv_instance =NULL ; -u16 timeout; - -if (hci_dev_test_flag (hdev,HCI_ADVERTISING ) || -list_empty (&hdev->adv_instances)) -return -EPERM ; - -if (hdev->adv_instance_timeout) -return -EBUSY ; - - adv_instance =hci_find_adv_instance (hdev, instance); -if (!adv_instance) -return -ENOENT ; - -/* A zero timeout means unlimited advertising. As long as there is -* only one instance, duration should be ignored. We still set a timeout -* in case further instances are being added later on. -* -* If the remaining lifetime of the instance is more than the duration -* then the timeout corresponds to the duration, otherwise it will be -* reduced to the remaining instance lifetime. -*/ -if (adv_instance->timeout ==0 || - adv_instance->duration <= adv_instance->remaining_time) - timeout = adv_instance->duration; -else - timeout = adv_instance->remaining_time; - -/* The remaining time is being reduced unless the instance is being -* advertised without time limit. -*/ -if (adv_instance->timeout) - adv_instance->remaining_time = - adv_instance->remaining_time - timeout; - -/* Only use work for scheduling instances with legacy advertising */ -if (!ext_adv_capable (hdev)) { - hdev->adv_instance_timeout = timeout; -queue_delayed_work (hdev->req_workqueue, - &hdev->adv_instance_expire, -msecs_to_jiffies (timeout *1000 )); - } - -/* If we're just re-scheduling the same instance again then do not -* execute any HCI commands. This happens when a single instance is -* being advertised. -*/ -if (!force && hdev->cur_adv_instance == instance && -hci_dev_test_flag (hdev,HCI_LE_ADV )) -return 0 ; - - hdev->cur_adv_instance = instance; -if (ext_adv_capable (hdev)) { -__hci_req_start_ext_adv (req, instance); - }else { -__hci_req_update_adv_data (req, instance); -__hci_req_update_scan_rsp_data (req, instance); -__hci_req_enable_advertising (req); - } - -return 0 ; -} -int hci_update_random_address (struct hci_request *req,bool require_privacy,bool use_rpa,u8 *own_addr_type) {
@@ -1686,97 +1044,6 @@ int hci_update_random_address(struct hci_request *req, bool require_privacy,return 0 ; } -static bool disconnected_accept_list_entries (struct hci_dev *hdev) -{ -struct bdaddr_list *b; - -list_for_each_entry (b, &hdev->accept_list, list) { -struct hci_conn *conn; - - conn =hci_conn_hash_lookup_ba (hdev,ACL_LINK , &b->bdaddr); -if (!conn) -return true; - -if (conn->state !=BT_CONNECTED && conn->state !=BT_CONFIG ) -return true; - } - -return false; -} - -void __hci_req_update_scan (struct hci_request *req) -{ -struct hci_dev *hdev = req->hdev; -u8 scan; - -if (!hci_dev_test_flag (hdev,HCI_BREDR_ENABLED )) -return ; - -if (!hdev_is_powered (hdev)) -return ; - -if (mgmt_powering_down (hdev)) -return ; - -if (hdev->scanning_paused) -return ; - -if (hci_dev_test_flag (hdev,HCI_CONNECTABLE ) || -disconnected_accept_list_entries (hdev)) - scan =SCAN_PAGE ; -else - scan =SCAN_DISABLED ; - -if (hci_dev_test_flag (hdev,HCI_DISCOVERABLE )) - scan |=SCAN_INQUIRY ; - -if (test_bit (HCI_PSCAN , &hdev->flags) == !!(scan &SCAN_PAGE ) && -test_bit (HCI_ISCAN , &hdev->flags) == !!(scan &SCAN_INQUIRY )) -return ; - -hci_req_add (req,HCI_OP_WRITE_SCAN_ENABLE ,1 , &scan); -} - -static u8 get_service_classes (struct hci_dev *hdev) -{ -struct bt_uuid *uuid; -u8 val =0 ; - -list_for_each_entry (uuid, &hdev->uuids, list) - val |= uuid->svc_hint; - -return val; -} - -void __hci_req_update_class (struct hci_request *req) -{ -struct hci_dev *hdev = req->hdev; -u8 cod[3 ]; - -bt_dev_dbg (hdev,"" ); - -if (!hdev_is_powered (hdev)) -return ; - -if (!hci_dev_test_flag (hdev,HCI_BREDR_ENABLED )) -return ; - -if (hci_dev_test_flag (hdev,HCI_SERVICE_CACHE )) -return ; - - cod[0 ] = hdev->minor_class; - cod[1 ] = hdev->major_class; - cod[2 ] =get_service_classes (hdev); - -if (hci_dev_test_flag (hdev,HCI_LIMITED_DISCOVERABLE )) - cod[1 ] |=0x20 ; - -if (memcmp (cod, hdev->dev_class,3 ) ==0 ) -return ; - -hci_req_add (req,HCI_OP_WRITE_CLASS_OF_DEV ,sizeof (cod), cod); -} -void __hci_abort_conn (struct hci_request *req,struct hci_conn *conn,u8 reason) {
net/bluetooth/hci_request.h +0 -33
@@ -68,49 +68,16 @@ int __hci_req_sync(struct hci_dev *hdev, int (*func)(struct hci_request *req,struct sk_buff *hci_prepare_cmd (struct hci_dev *hdev,u16 opcode,u32 plen,const void *param); -void __hci_req_write_fast_connectable (struct hci_request *req,bool enable); -void __hci_req_update_name (struct hci_request *req); -void __hci_req_update_eir (struct hci_request *req); -void hci_req_add_le_scan_disable (struct hci_request *req,bool rpa_le_conn);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_disable_address_resolution (struct hci_dev *hdev); -void hci_req_reenable_advertising (struct hci_dev *hdev); -void __hci_req_enable_advertising (struct hci_request *req); -void __hci_req_disable_advertising (struct hci_request *req); -void __hci_req_update_adv_data (struct hci_request *req,u8 instance);int hci_req_update_adv_data (struct hci_dev *hdev,u8 instance); -int hci_req_start_per_adv (struct hci_dev *hdev,u8 instance,u32 flags, -u16 min_interval,u16 max_interval, -u16 sync_interval); -void __hci_req_update_scan_rsp_data (struct hci_request *req,u8 instance); - -int __hci_req_schedule_adv_instance (struct hci_request *req,u8 instance, -bool force); -int __hci_req_setup_ext_adv_instance (struct hci_request *req,u8 instance); -int __hci_req_setup_per_adv_instance (struct hci_request *req,u8 instance, -u16 min_interval,u16 max_interval); -int __hci_req_start_ext_adv (struct hci_request *req,u8 instance); -int __hci_req_start_per_adv (struct hci_request *req,u8 instance,u32 flags, -u16 min_interval,u16 max_interval, -u16 sync_interval); -int __hci_req_enable_ext_advertising (struct hci_request *req,u8 instance); -int __hci_req_enable_per_advertising (struct hci_request *req,u8 instance); -int __hci_req_disable_ext_adv_instance (struct hci_request *req,u8 instance); -int __hci_req_remove_ext_adv_instance (struct hci_request *req,u8 instance); -void __hci_req_clear_ext_adv_sets (struct hci_request *req);int hci_get_random_address (struct hci_dev *hdev,bool require_privacy,bool use_rpa,struct adv_info *adv_instance,u8 *own_addr_type,bdaddr_t *rand_addr); -void __hci_req_update_class (struct hci_request *req); - -/* Returns true if HCI commands were queued */ -void __hci_req_update_scan (struct hci_request *req); -int hci_update_random_address (struct hci_request *req,bool require_privacy,bool use_rpa,u8 *own_addr_type);
Signature · 1 line
2.37.1
PATCH v7 7/9 Bluetooth: move hci_get_random_address() to hci_sync
In reply to Brian GixThis function has no dependencies on the deprecated hci_request mechanism, so has been moved unchanged to hci_sync.c
--- include/net/bluetooth/hci_sync.h | 5 + net/bluetooth/hci_request.c | 255 +++++++++++-------------------- net/bluetooth/hci_request.h | 9 -- net/bluetooth/hci_sync.c | 73 +++++++++ 4 files changed, 170 insertions(+), 172 deletions(-)
include/net/bluetooth/hci_sync.h +5 -0
@@ -16,6 +16,7 @@ struct hci_cmd_sync_work_entry {hci_cmd_sync_work_destroy_t destroy; }; +struct adv_info ;/* Function with sync suffix shall not be called with hdev->lock held as they * wait the command to complete and in the meantime an event could be received * which could attempt to acquire hdev->lock causing a deadlock.
@@ -51,6 +52,10 @@ int hci_update_class_sync(struct hci_dev *hdev);int hci_update_name_sync (struct hci_dev *hdev);int hci_write_ssp_mode_sync (struct hci_dev *hdev,u8 mode); +int hci_get_random_address (struct hci_dev *hdev,bool require_privacy, +bool use_rpa,struct adv_info *adv_instance, +u8 *own_addr_type,bdaddr_t *rand_addr); +int hci_update_random_address_sync (struct hci_dev *hdev,bool require_privacy,bool rpa,u8 *own_addr_type);
net/bluetooth/hci_request.c +92 -163
273 lines not on this page · raw message
net/bluetooth/hci_request.h +0 -9
@@ -74,16 +74,7 @@ void hci_req_add_le_passive_scan(struct hci_request *req);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_get_random_address (struct hci_dev *hdev,bool require_privacy, -bool use_rpa,struct adv_info *adv_instance, -u8 *own_addr_type,bdaddr_t *rand_addr); - -int hci_update_random_address (struct hci_request *req,bool require_privacy, -bool use_rpa,u8 *own_addr_type);int hci_abort_conn (struct hci_conn *conn,u8 reason); -void __hci_abort_conn (struct hci_request *req,struct hci_conn *conn, -u8 reason); -void hci_request_setup (struct hci_dev *hdev);void hci_request_cancel_all (struct hci_dev *hdev);
net/bluetooth/hci_sync.c +73 -0
76 lines not on this page · raw message
Signature · 1 line
2.37.1
PATCH v7 8/9 Bluetooth: convert hci_update_adv_data to hci_sync
In reply to Brian Gixhci_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
--- include/net/bluetooth/hci_sync.h | 1 + net/bluetooth/hci_core.c | 2 +- net/bluetooth/hci_event.c | 2 +- net/bluetooth/hci_request.c | 64 -------------------------------- net/bluetooth/hci_request.h | 2 - net/bluetooth/hci_sync.c | 20 ++++++++++ 6 files changed, 23 insertions(+), 68 deletions(-)
include/net/bluetooth/hci_sync.h +1 -0
@@ -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_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,bool force);
net/bluetooth/hci_core.c +1 -1
@@ -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 );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); }
net/bluetooth/hci_event.c +1 -1
@@ -2149,7 +2149,7 @@ static u8 hci_cc_set_ext_adv_param(struct hci_dev *hdev, void *data, adv_instance->tx_power = rp->tx_power; }/* 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);
net/bluetooth/hci_request.c +0 -64
70 lines not on this page · raw message
net/bluetooth/hci_request.h +0 -2
@@ -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); -int hci_req_update_adv_data (struct hci_dev *hdev,u8 instance); -int hci_abort_conn (struct hci_conn *conn,u8 reason);void hci_request_setup (struct hci_dev *hdev);void hci_request_cancel_all (struct hci_dev *hdev);
net/bluetooth/hci_sync.c +20 -0
@@ -6065,3 +6065,23 @@ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy,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 ); +}
Signature · 1 line
2.37.1
PATCH v7 9/9 Bluetooth: Convert hci_abort_conn to hci_sync
In reply to Brian GixThe prior hci_abort_conn() used the deprecated hci_request mechanism. This version has been rewritten to use hci_sync.c
--- include/net/bluetooth/hci_sync.h | 1 + net/bluetooth/hci_conn.c | 6 +- net/bluetooth/hci_request.c | 93 ---------------------- net/bluetooth/hci_request.h | 1 - net/bluetooth/hci_sync.c | 130 +++++++++++++++++++++++++++++++ net/bluetooth/mgmt.c | 2 +- 6 files changed, 135 insertions(+), 98 deletions(-)
include/net/bluetooth/hci_sync.h +1 -0
@@ -129,3 +129,4 @@ int hci_le_terminate_big_sync(struct hci_dev *hdev, u8 handle, u8 reason);int hci_le_big_terminate_sync (struct hci_dev *hdev,u8 handle);int hci_le_pa_terminate_sync (struct hci_dev *hdev,u16 handle); +int hci_abort_conn (struct hci_conn *conn,u8 reason,bool async);
net/bluetooth/hci_conn.c +3 -3
@@ -286,7 +286,7 @@ int hci_disconnect(struct hci_conn *conn, __u8 reason) &clkoff_cp); } -return hci_abort_conn (conn, reason); +return hci_abort_conn (conn, reason, true); }static void hci_add_sco (struct hci_conn *conn,__u16 handle)
@@ -662,7 +662,7 @@ static void hci_conn_timeout(struct work_struct *work)return ; } -hci_abort_conn (conn,hci_proto_disconn_ind (conn)); +hci_abort_conn (conn,hci_proto_disconn_ind (conn), false); }/* Enter sniff mode */
@@ -748,7 +748,7 @@ static void le_conn_timeout(struct work_struct *work)return ; } -hci_abort_conn (conn,HCI_ERROR_REMOTE_USER_TERM ); +hci_abort_conn (conn,HCI_ERROR_REMOTE_USER_TERM , false); }struct iso_list_data {
net/bluetooth/hci_request.c +0 -93
99 lines not on this page · raw message
net/bluetooth/hci_request.h +0 -1
@@ -73,6 +73,5 @@ void hci_req_add_le_passive_scan(struct hci_request *req);void hci_req_prepare_suspend (struct hci_dev *hdev,enum suspended_state next); -int hci_abort_conn (struct hci_conn *conn,u8 reason);void hci_request_setup (struct hci_dev *hdev);void hci_request_cancel_all (struct hci_dev *hdev);
net/bluetooth/hci_sync.c +130 -0
133 lines not on this page · raw message
net/bluetooth/mgmt.c +1 -1
@@ -3235,7 +3235,7 @@ static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data, le_addr_type(addr->type));if (conn->conn_reason ==CONN_REASON_PAIR_DEVICE ) -hci_abort_conn (conn,HCI_ERROR_REMOTE_USER_TERM ); +hci_abort_conn (conn,HCI_ERROR_REMOTE_USER_TERM , true); unlock:hci_dev_unlock (hdev);
Signature · 1 line
2.37.1
This series was applied to bluetooth/bluetooth-next.git (master) by Luiz Augusto von Dentz <[email protected]>:
Hello:
This series was applied to bluetooth/bluetooth-next.git (master) by Luiz Augusto von Dentz <[email protected]>:
Quoted 8 lines · On Fri, 5 Aug 2022 16:42:27 -0700 you wrote:
This will be a growing patch-set of conversions and dead-code removal towards the goal of retiring
hci_request.cThe patch sets will be split amoung the work queues and delayed work queues as initialized in
hci_request_setup(), with the ultimate goal of eliminatinghci_request.centirely.[...]
Here is the summary with links:
- [v7,1/9] Bluetooth: Convert le_scan_disable timeout to hci_sync
https://git.kernel.org/bluetooth/bluetooth-next/c/2bf8edacd155
- [v7,2/9] Bluetooth: Rework le_scan_restart for hci_sync
https://git.kernel.org/bluetooth/bluetooth-next/c/89f043b2c6d5 - [v7,3/9] Bluetooth: Delete unused hci_req_stop_discovery() https://git.kernel.org/bluetooth/bluetooth-next/c/eed7aab6c517 - [v7,4/9] Bluetooth: Convert SCO configure_datapath to hci_sync https://git.kernel.org/bluetooth/bluetooth-next/c/71172654bff2 - [v7,5/9] Bluetooth: Move Adv Instance timer to hci_sync https://git.kernel.org/bluetooth/bluetooth-next/c/8c59889a6b5c - [v7,6/9] Bluetooth: Delete unreferenced hci_request code https://git.kernel.org/bluetooth/bluetooth-next/c/3edf244f8c71 - [v7,7/9] Bluetooth: move hci_get_random_address() to hci_sync https://git.kernel.org/bluetooth/bluetooth-next/c/c7eb26d1285c - [v7,8/9] Bluetooth: convert hci_update_adv_data to hci_sync https://git.kernel.org/bluetooth/bluetooth-next/c/9ec46ac996f5
- [v7,9/9] Bluetooth: Convert hci_abort_conn to hci_sync (no matching commit)
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html