Clean-up stale/unused hci_request.c code
Subsystems (2)
v5 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.
Brian Gix (10):
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: Convert Interleave Scanning timeout to hci_sync
Bluetooth: Move Adv Instance timer to hci_sync
Bluetooth: Delete unreference 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 | 86 +- net/bluetooth/hci_core.c | 4 +- net/bluetooth/hci_event.c | 2 +- net/bluetooth/hci_request.c | 2002 +----------------------------- net/bluetooth/hci_request.h | 61 - net/bluetooth/hci_sync.c | 564 ++++++++- net/bluetooth/mgmt.c | 5 +- 8 files changed, 639 insertions(+), 2095 deletions(-)
Signature · 1 line
2.37.1
PATCH v5 1/10 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=664189
---Test result---
Test Summary:
CheckPatch FAIL 17.42 seconds GitLint PASS 7.18 seconds SubjectPrefix PASS 5.78 seconds BuildKernel PASS 42.11 seconds BuildKernel32 PASS 37.61 seconds Incremental Build with patchesPASS 262.87 seconds TestRunner: Setup PASS 632.55 seconds TestRunner: l2cap-tester FAIL 24.55 seconds TestRunner: bnep-tester PASS 8.21 seconds TestRunner: mgmt-tester PASS 128.42 seconds TestRunner: rfcomm-tester PASS 12.49 seconds TestRunner: sco-tester PASS 14.04 seconds TestRunner: smp-tester PASS 11.82 seconds TestRunner: userchan-tester PASS 8.42 seconds
Details
##############################
Test: CheckPatch - FAIL - 17.42 seconds
Run checkpatch.pl script with rule in .checkpatch.conf
[v5,06/10] Bluetooth: Move Adv Instance timer to hci_sync\CHECK:SPACING: No space is necessary after a cast #363: FILE: net/bluetooth/hci_sync.c:603:
+ u8 instance = *(u8 *) data;
total: 0 errors, 0 warnings, 1 checks, 328 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/12932846.patch has style problems, please review.
NOTE: Ignored message types: UNKNOWN_COMMIT_ID
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[v5,08/10] Bluetooth: move hci_get_random_address() to hci_sync\WARNING:TYPO_SPELLING: 'dependancies' may be misspelled - perhaps 'dependencies'? #66:
This function has no dependancies on the deprecated hci_request
^^^^^^^^^^^^
total: 0 errors, 1 warnings, 0 checks, 180 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/12932849.patch has style problems, please review.
NOTE: Ignored message types: UNKNOWN_COMMIT_ID
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[v5,09/10] Bluetooth: convert hci_update_adv_data to hci_sync\CHECK:SPACING: No space is necessary after a cast #216: FILE: net/bluetooth/hci_sync.c:6126:
+ u8 instance = *(u8 *) data;
total: 0 errors, 0 warnings, 1 checks, 123 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/12932848.patch has style problems, please review.
NOTE: Ignored message types: UNKNOWN_COMMIT_ID
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[v5,10/10] Bluetooth: Convert hci_abort_conn to hci_sync\CHECK:ALLOC_SIZEOF_STRUCT: Prefer kmalloc(sizeof(*conn_reason)...) over kmalloc(sizeof(struct conn_reason)...) #308: FILE: net/bluetooth/hci_sync.c:6246:
+ struct conn_reason *conn_reason = kmalloc(sizeof(struct conn_reason),
CHECK:LINE_SPACING: Please don't use multiple blank lines #312: FILE: net/bluetooth/hci_sync.c:6250:
+
+
ERROR:SPACING: space prohibited after that open parenthesis '(' #313: FILE: net/bluetooth/hci_sync.c:6251:
+ if ( !conn_reason)
total: 1 errors, 0 warnings, 2 checks, 140 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/12932850.patch has style problems, please review.
NOTE: Ignored message types: UNKNOWN_COMMIT_ID
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
##############################
Test: TestRunner: l2cap-tester - FAIL - 24.55 seconds Run test-runner with l2cap-tester
Total: 40, Passed: 39 (97.5%), Failed: 1, Not Run: 0
Failed Test Cases
L2CAP LE Client - Close socket 2 Timed out 4.469 seconds
---
Regards,
Linux Bluetooth
PATCH v5 2/10 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 v5 3/10 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 v5 4/10 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 v5 5/10 Bluetooth: Convert Interleave Scanning timeout to hci_sync
In reply to Brian GixThe interleave sacanning timer was running using the deprecated hci_request method instead of the new hci_sync methodology.
--- net/bluetooth/hci_request.c | 472 ------------------------------------ net/bluetooth/hci_request.h | 12 - net/bluetooth/hci_sync.c | 65 ++++- 3 files changed, 60 insertions(+), 489 deletions(-)
net/bluetooth/hci_request.c +0 -472
@@ -306,58 +306,6 @@ void __hci_req_write_fast_connectable(struct hci_request *req, bool enable)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 ; -queue_delayed_work (hdev->req_workqueue, - &hdev->interleave_scan,0 ); -} - -static bool is_interleave_scanning (struct hci_dev *hdev) -{ -return hdev->interleave_scan_state !=INTERLEAVE_SCAN_NONE ; -} - -static void cancel_interleave_scan (struct hci_dev *hdev) -{ -bt_dev_dbg (hdev,"cancelling interleave scan" ); - -cancel_delayed_work_sync (&hdev->interleave_scan); - - hdev->interleave_scan_state =INTERLEAVE_SCAN_NONE ; -} - -/* Return true if interleave_scan wasn't started until exiting this function, -* otherwise, return false -*/ -static bool __hci_update_interleaved_scan (struct hci_dev *hdev) -{ -/* Do interleaved scan only if all of the following are true: -* - There is at least one ADV monitor -* - At least one pending LE connection or one device to be scanned for -* - Monitor offloading is not supported -* If so, we should alternate between allowlist scan and one without -* any filters to save power. -*/ -bool use_interleaving =hci_is_adv_monitoring (hdev) && - !(list_empty (&hdev->pend_le_conns) && -list_empty (&hdev->pend_le_reports)) && -hci_get_adv_monitor_offload_ext (hdev) == -HCI_ADV_MONITOR_EXT_NONE ; -bool is_interleaving =is_interleave_scanning (hdev); - -if (use_interleaving && !is_interleaving) { -start_interleave_scan (hdev); -bt_dev_dbg (hdev,"starting interleave scan" ); -return true; - } - -if (!use_interleaving && is_interleaving) -cancel_interleave_scan (hdev); - -return false; -} -void __hci_req_update_name (struct hci_request *req) {struct hci_dev *hdev = req->hdev;
@@ -429,278 +377,6 @@ void hci_req_add_le_scan_disable(struct hci_request *req, bool rpa_le_conn) } } -static void del_from_accept_list (struct hci_request *req,bdaddr_t *bdaddr, -u8 bdaddr_type) -{ -struct hci_cp_le_del_from_accept_list cp; - - cp.bdaddr_type = bdaddr_type; -bacpy (&cp.bdaddr, bdaddr); - -bt_dev_dbg (req->hdev,"Remove %pMR (0x%x) from accept list" , &cp.bdaddr, - cp.bdaddr_type); -hci_req_add (req,HCI_OP_LE_DEL_FROM_ACCEPT_LIST ,sizeof (cp), &cp); - -if (use_ll_privacy (req->hdev)) { -struct smp_irk *irk; - - irk =hci_find_irk_by_addr (req->hdev, bdaddr, bdaddr_type); -if (irk) { -struct hci_cp_le_del_from_resolv_list cp; - - cp.bdaddr_type = bdaddr_type; -bacpy (&cp.bdaddr, bdaddr); - -hci_req_add (req,HCI_OP_LE_DEL_FROM_RESOLV_LIST , -sizeof (cp), &cp); - } - } -} - -/* Adds connection to accept list if needed. On error, returns -1. */ -static int add_to_accept_list (struct hci_request *req, -struct hci_conn_params *params,u8 *num_entries, -bool allow_rpa) -{ -struct hci_cp_le_add_to_accept_list cp; -struct hci_dev *hdev = req->hdev; - -/* Already in accept list */ -if (hci_bdaddr_list_lookup (&hdev->le_accept_list, ¶ms->addr, - params->addr_type)) -return 0 ; - -/* Select filter policy to accept all advertising */ -if (*num_entries >= hdev->le_accept_list_size) -return -1 ; - -/* Accept list can not be used with RPAs */ -if (!allow_rpa && - !hci_dev_test_flag (hdev,HCI_ENABLE_LL_PRIVACY ) && -hci_find_irk_by_addr (hdev, ¶ms->addr, params->addr_type)) { -return -1 ; - } - -/* During suspend, only wakeable devices can be in accept list */ -if (hdev->suspended && - !(params->flags &HCI_CONN_FLAG_REMOTE_WAKEUP )) -return 0 ; - - *num_entries +=1 ; - cp.bdaddr_type = params->addr_type; -bacpy (&cp.bdaddr, ¶ms->addr); - -bt_dev_dbg (hdev,"Add %pMR (0x%x) to accept list" , &cp.bdaddr, - cp.bdaddr_type); -hci_req_add (req,HCI_OP_LE_ADD_TO_ACCEPT_LIST ,sizeof (cp), &cp); - -if (use_ll_privacy (hdev)) { -struct smp_irk *irk; - - irk =hci_find_irk_by_addr (hdev, ¶ms->addr, - params->addr_type); -if (irk) { -struct hci_cp_le_add_to_resolv_list cp; - - cp.bdaddr_type = params->addr_type; -bacpy (&cp.bdaddr, ¶ms->addr); -memcpy (cp.peer_irk, irk->val,16 ); - -if (hci_dev_test_flag (hdev,HCI_PRIVACY )) -memcpy (cp.local_irk, hdev->irk,16 ); -else -memset (cp.local_irk,0 ,16 ); - -hci_req_add (req,HCI_OP_LE_ADD_TO_RESOLV_LIST , -sizeof (cp), &cp); - } - } - -return 0 ; -} - -static u8 update_accept_list (struct hci_request *req) -{ -struct hci_dev *hdev = req->hdev; -struct hci_conn_params *params; -struct bdaddr_list *b; -u8 num_entries =0 ; -bool pend_conn, pend_report; -/* We allow usage of accept list even with RPAs in suspend. In the worst -* case, we won't be able to wake from devices that use the privacy1.2 -* features. Additionally, once we support privacy1.2 and IRK -* offloading, we can update this to also check for those conditions. -*/ -bool allow_rpa = hdev->suspended; - -if (use_ll_privacy (hdev)) - allow_rpa = true; - -/* Go through the current accept list programmed into the -* controller one by one and check if that address is still -* in the list of pending connections or list of devices to -* report. If not present in either list, then queue the -* command to remove it from the controller. -*/ -list_for_each_entry (b, &hdev->le_accept_list, list) { - pend_conn =hci_pend_le_action_lookup (&hdev->pend_le_conns, - &b->bdaddr, - b->bdaddr_type); - pend_report =hci_pend_le_action_lookup (&hdev->pend_le_reports, - &b->bdaddr, - b->bdaddr_type); - -/* If the device is not likely to connect or report, -* remove it from the accept list. -*/ -if (!pend_conn && !pend_report) { -del_from_accept_list (req, &b->bdaddr, b->bdaddr_type); -continue ; - } - -/* Accept list can not be used with RPAs */ -if (!allow_rpa && - !hci_dev_test_flag (hdev,HCI_ENABLE_LL_PRIVACY ) && -hci_find_irk_by_addr (hdev, &b->bdaddr, b->bdaddr_type)) { -return 0x00 ; - } - - num_entries++; - } - -/* Since all no longer valid accept list entries have been -* removed, walk through the list of pending connections -* and ensure that any new device gets programmed into -* the controller. -* -* If the list of the devices is larger than the list of -* available accept list entries in the controller, then -* just abort and return filer policy value to not use the -* accept list. -*/ -list_for_each_entry (params, &hdev->pend_le_conns, action) { -if (add_to_accept_list (req, params, &num_entries, allow_rpa)) -return 0x00 ; - } - -/* After adding all new pending connections, walk through -* the list of pending reports and also add these to the -* accept list if there is still space. Abort if space runs out. -*/ -list_for_each_entry (params, &hdev->pend_le_reports, action) { -if (add_to_accept_list (req, params, &num_entries, allow_rpa)) -return 0x00 ; - } - -/* Use the allowlist unless the following conditions are all true: -* - We are not currently suspending -* - There are 1 or more ADV monitors registered and it's not offloaded -* - Interleaved scanning is not currently using the allowlist -*/ -if (!idr_is_empty (&hdev->adv_monitors_idr) && !hdev->suspended && -hci_get_adv_monitor_offload_ext (hdev) ==HCI_ADV_MONITOR_EXT_NONE && - hdev->interleave_scan_state !=INTERLEAVE_SCAN_ALLOWLIST ) -return 0x00 ; - -/* Select filter policy to use accept list */ -return 0x01 ; -} - -static bool scan_use_rpa (struct hci_dev *hdev) -{ -return hci_dev_test_flag (hdev,HCI_PRIVACY ); -} - -static void hci_req_start_scan (struct hci_request *req,u8 type,u16 interval, -u16 window,u8 own_addr_type,u8 filter_policy, -bool filter_dup,bool addr_resolv) -{ -struct hci_dev *hdev = req->hdev; - -if (hdev->scanning_paused) { -bt_dev_dbg (hdev,"Scanning is paused for suspend" ); -return ; - } - -if (use_ll_privacy (hdev) && addr_resolv) { -u8 enable =0x01 ; - -hci_req_add (req,HCI_OP_LE_SET_ADDR_RESOLV_ENABLE ,1 , &enable); - } - -/* Use ext scanning if set ext scan param and ext scan enable is -* supported -*/ -if (use_ext_scan (hdev)) { -struct hci_cp_le_set_ext_scan_params *ext_param_cp; -struct hci_cp_le_set_ext_scan_enable ext_enable_cp; -struct hci_cp_le_scan_phy_params *phy_params; -u8 data[sizeof (*ext_param_cp) +sizeof (*phy_params) *2 ]; -u32 plen; - - ext_param_cp = (void *)data; - phy_params = (void *)ext_param_cp->data; - -memset (ext_param_cp,0 ,sizeof (*ext_param_cp)); - ext_param_cp->own_addr_type = own_addr_type; - ext_param_cp->filter_policy = filter_policy; - - plen =sizeof (*ext_param_cp); - -if (scan_1m (hdev) ||scan_2m (hdev)) { - ext_param_cp->scanning_phys |=LE_SCAN_PHY_1M ; - -memset (phy_params,0 ,sizeof (*phy_params)); - phy_params->type = type; - phy_params->interval =cpu_to_le16 (interval); - phy_params->window =cpu_to_le16 (window); - - plen +=sizeof (*phy_params); - phy_params++; - } - -if (scan_coded (hdev)) { - ext_param_cp->scanning_phys |=LE_SCAN_PHY_CODED ; - -memset (phy_params,0 ,sizeof (*phy_params)); - phy_params->type = type; - phy_params->interval =cpu_to_le16 (interval); - phy_params->window =cpu_to_le16 (window); - - plen +=sizeof (*phy_params); - phy_params++; - } - -hci_req_add (req,HCI_OP_LE_SET_EXT_SCAN_PARAMS , - plen, ext_param_cp); - -memset (&ext_enable_cp,0 ,sizeof (ext_enable_cp)); - ext_enable_cp.enable =LE_SCAN_ENABLE ; - ext_enable_cp.filter_dup = filter_dup; - -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_param param_cp; -struct hci_cp_le_set_scan_enable enable_cp; - -memset (¶m_cp,0 ,sizeof (param_cp)); - param_cp.type = type; - param_cp.interval =cpu_to_le16 (interval); - param_cp.window =cpu_to_le16 (window); - param_cp.own_address_type = own_addr_type; - param_cp.filter_policy = filter_policy; -hci_req_add (req,HCI_OP_LE_SET_SCAN_PARAM ,sizeof (param_cp), - ¶m_cp); - -memset (&enable_cp,0 ,sizeof (enable_cp)); - enable_cp.enable =LE_SCAN_ENABLE ; - enable_cp.filter_dup = filter_dup; -hci_req_add (req,HCI_OP_LE_SET_SCAN_ENABLE ,sizeof (enable_cp), - &enable_cp); - } -} -/* Returns true if an le connection is in the scanning state */ static inline bool hci_is_le_conn_scanning (struct hci_dev *hdev) {
@@ -722,95 +398,6 @@ static inline bool hci_is_le_conn_scanning(struct hci_dev *hdev)return false; } -/* Ensure to call hci_req_add_le_scan_disable() first to disable the -* controller based address resolution to be able to reconfigure -* resolving list. -*/ -void hci_req_add_le_passive_scan (struct hci_request *req) -{ -struct hci_dev *hdev = req->hdev; -u8 own_addr_type; -u8 filter_policy; -u16 window, interval; -/* Default is to enable duplicates filter */ -u8 filter_dup =LE_SCAN_FILTER_DUP_ENABLE ; -/* Background scanning should run with address resolution */ -bool addr_resolv = true; - -if (hdev->scanning_paused) { -bt_dev_dbg (hdev,"Scanning is paused for suspend" ); -return ; - } - -/* Set require_privacy to false since no SCAN_REQ are send -* during passive scanning. Not using an non-resolvable address -* here is important so that peer devices using direct -* advertising with our address will be correctly reported -* by the controller. -*/ -if (hci_update_random_address (req, false,scan_use_rpa (hdev), - &own_addr_type)) -return ; - -if (hdev->enable_advmon_interleave_scan && -__hci_update_interleaved_scan (hdev)) -return ; - -bt_dev_dbg (hdev,"interleave state %d" , hdev->interleave_scan_state); -/* Adding or removing entries from the accept list must -* happen before enabling scanning. The controller does -* not allow accept list modification while scanning. -*/ - filter_policy =update_accept_list (req); - -/* When the controller is using random resolvable addresses and -* with that having LE privacy enabled, then controllers with -* Extended Scanner Filter Policies support can now enable support -* for handling directed advertising. -* -* So instead of using filter polices 0x00 (no accept list) -* and 0x01 (accept list enabled) use the new filter policies -* 0x02 (no accept list) and 0x03 (accept list enabled). -*/ -if (hci_dev_test_flag (hdev,HCI_PRIVACY ) && - (hdev->le_features[0 ] &HCI_LE_EXT_SCAN_POLICY )) - filter_policy |=0x02 ; - -if (hdev->suspended) { - window = hdev->le_scan_window_suspend; - interval = hdev->le_scan_int_suspend; - }else if (hci_is_le_conn_scanning (hdev)) { - window = hdev->le_scan_window_connect; - interval = hdev->le_scan_int_connect; - }else if (hci_is_adv_monitoring (hdev)) { - window = hdev->le_scan_window_adv_monitor; - interval = hdev->le_scan_int_adv_monitor; - -/* Disable duplicates filter when scanning for advertisement -* monitor for the following reasons. -* -* For HW pattern filtering (ex. MSFT), Realtek and Qualcomm -* controllers ignore RSSI_Sampling_Period when the duplicates -* filter is enabled. -* -* For SW pattern filtering, when we're not doing interleaved -* scanning, it is necessary to disable duplicates filter, -* otherwise hosts can only receive one advertisement and it's -* impossible to know if a peer is still in range. -*/ - filter_dup =LE_SCAN_FILTER_DUP_DISABLE ; - }else { - window = hdev->le_scan_window; - interval = hdev->le_scan_interval; - } - -bt_dev_dbg (hdev,"LE passive scan with accept list = %d" , - filter_policy); -hci_req_start_scan (req,LE_SCAN_PASSIVE , interval, window, - own_addr_type, filter_policy, filter_dup, - addr_resolv); -} -static void cancel_adv_timeout (struct hci_dev *hdev) {if (hdev->adv_instance_timeout) {
@@ -1171,62 +758,6 @@ static void adv_timeout_expire(struct work_struct *work)hci_dev_unlock (hdev); } -static int hci_req_add_le_interleaved_scan (struct hci_request *req, -unsigned long opt) -{ -struct hci_dev *hdev = req->hdev; -int ret =0 ; - -hci_dev_lock (hdev); - -if (hci_dev_test_flag (hdev,HCI_LE_SCAN )) -hci_req_add_le_scan_disable (req, false); -hci_req_add_le_passive_scan (req); - -switch (hdev->interleave_scan_state) { -case INTERLEAVE_SCAN_ALLOWLIST : -bt_dev_dbg (hdev,"next state: allowlist" ); - hdev->interleave_scan_state =INTERLEAVE_SCAN_NO_FILTER ; -break ; -case INTERLEAVE_SCAN_NO_FILTER : -bt_dev_dbg (hdev,"next state: no filter" ); - hdev->interleave_scan_state =INTERLEAVE_SCAN_ALLOWLIST ; -break ; -case INTERLEAVE_SCAN_NONE : -BT_ERR ("unexpected error" ); - ret =-1 ; - } - -hci_dev_unlock (hdev); - -return ret; -} - -static void interleave_scan_work (struct work_struct *work) -{ - struct hci_dev *hdev = container_of(work, struct hci_dev, - interleave_scan.work); -u8 status; -unsigned long timeout; - -if (hdev->interleave_scan_state ==INTERLEAVE_SCAN_ALLOWLIST ) { - timeout =msecs_to_jiffies (hdev->advmon_allowlist_duration); - }else if (hdev->interleave_scan_state ==INTERLEAVE_SCAN_NO_FILTER ) { - timeout =msecs_to_jiffies (hdev->advmon_no_filter_duration); - }else { -bt_dev_err (hdev,"unexpected error" ); -return ; - } - -hci_req_sync (hdev, hci_req_add_le_interleaved_scan,0 , -HCI_CMD_TIMEOUT , &status); - -/* Don't continue interleaving if it was canceled */ -if (is_interleave_scanning (hdev)) -queue_delayed_work (hdev->req_workqueue, - &hdev->interleave_scan, timeout); -} -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)
@@ -1978,7 +1509,6 @@ int hci_abort_conn(struct hci_conn *conn, u8 reason)void hci_request_setup (struct hci_dev *hdev) {INIT_DELAYED_WORK (&hdev->adv_instance_expire, adv_timeout_expire); -INIT_DELAYED_WORK (&hdev->interleave_scan, interleave_scan_work); }void hci_request_cancel_all (struct hci_dev *hdev)
@@ -1989,6 +1519,4 @@ void hci_request_cancel_all(struct hci_dev *hdev)cancel_delayed_work_sync (&hdev->adv_instance_expire); hdev->adv_instance_timeout =0 ; } - -cancel_interleave_scan (hdev); }
net/bluetooth/hci_request.h +0 -12
@@ -73,9 +73,6 @@ 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);
@@ -83,9 +80,6 @@ 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,
@@ -95,14 +89,8 @@ void hci_req_clear_adv_instance(struct hci_dev *hdev, struct sock *sk, 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);
net/bluetooth/hci_sync.c +60 -5
89 lines not on this page · raw message
Signature · 1 line
2.37.1
PATCH v5 6/10 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_core.c | 2 - net/bluetooth/hci_request.c | 120 ---------------------------- net/bluetooth/hci_request.h | 7 -- net/bluetooth/hci_sync.c | 131 ++++++++++++++++++++++++++++--- net/bluetooth/mgmt.c | 5 +- 6 files changed, 126 insertions(+), 142 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_core.c +0 -2
@@ -2524,8 +2524,6 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv)INIT_DELAYED_WORK (&hdev->cmd_timer, hci_cmd_timeout);INIT_DELAYED_WORK (&hdev->ncmd_timer, hci_ncmd_timeout); -hci_request_setup (hdev); -hci_init_sysfs (hdev);discovery_init (hdev);
net/bluetooth/hci_request.c +0 -120
141 lines not on this page · raw message
net/bluetooth/hci_request.h +0 -7
@@ -84,10 +84,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_start_ext_adv (struct hci_request *req,u8 instance);int __hci_req_enable_ext_advertising (struct hci_request *req,u8 instance);
@@ -109,6 +105,3 @@ int hci_update_random_address(struct hci_request *req, bool require_privacy,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 +122 -9
155 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 v5 7/10 Bluetooth: Delete unreference 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 | 902 +----------------------------------- net/bluetooth/hci_request.h | 29 -- 2 files changed, 2 insertions(+), 929 deletions(-)
net/bluetooth/hci_request.c +2 -900
@@ -273,336 +273,6 @@ void hci_req_add(struct hci_request *req, u16 opcode, u32 plen,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); -} - -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; - -if (hdev->scanning_paused) { -bt_dev_dbg (hdev,"Scanning is paused for suspend" ); -return ; - } - -if (use_ext_scan (hdev)) { -struct hci_cp_le_set_ext_scan_enable cp; - -memset (&cp,0 ,sizeof (cp)); - cp.enable =LE_SCAN_DISABLE ; -hci_req_add (req,HCI_OP_LE_SET_EXT_SCAN_ENABLE ,sizeof (cp), - &cp); - }else { -struct hci_cp_le_set_scan_enable cp; - -memset (&cp,0 ,sizeof (cp)); - cp.enable =LE_SCAN_DISABLE ; -hci_req_add (req,HCI_OP_LE_SET_SCAN_ENABLE ,sizeof (cp), &cp); - } - -/* Disable address resolution */ -if (hci_dev_test_flag (hdev,HCI_LL_RPA_RESOLUTION ) && !rpa_le_conn) { -__u8 enable =0x00 ; - -hci_req_add (req,HCI_OP_LE_SET_ADDR_RESOLV_ENABLE ,1 , &enable); - } -} - -/* Returns true if an le connection is in the scanning state */ -static inline bool hci_is_le_conn_scanning (struct hci_dev *hdev) -{ -struct hci_conn_hash *h = &hdev->conn_hash; -struct hci_conn *c; - -rcu_read_lock (); - -list_for_each_entry_rcu (c, &h->list, list) { -if (c->type ==LE_LINK && c->state ==BT_CONNECT && -test_bit (HCI_CONN_SCANNING , &c->flags)) { -rcu_read_unlock (); -return true; - } - } - -rcu_read_unlock (); - -return false; -} - -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) {struct hci_dev *hdev = req->hdev;
@@ -667,58 +337,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); -} -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)
@@ -792,524 +410,8 @@ 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; - -/* If we're advertising or initiating an LE connection we can't -* go ahead and change the random address at this time. This is -* because the eventual initiator address used for the -* subsequently created connection will be undefined (some -* controllers use the new address and others the one we had -* when the operation started). -* -* In this kind of scenario skip the update and let the random -* address be updated at the next cycle. -*/ -if (hci_dev_test_flag (hdev,HCI_LE_ADV ) || -hci_lookup_le_connect (hdev)) { -bt_dev_dbg (hdev,"Deferring random address update" ); -hci_dev_set_flag (hdev,HCI_RPA_EXPIRED ); -return ; - } - -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) -{ -struct hci_dev *hdev = req->hdev; -int err; - -/* If privacy is enabled use a resolvable private address. If -* current RPA has expired or there is something else than -* the current RPA in use, then generate a new one. -*/ -if (use_rpa) { -/* If Controller supports LL Privacy use own address type is -* 0x03 -*/ -if (use_ll_privacy (hdev)) - *own_addr_type =ADDR_LE_DEV_RANDOM_RESOLVED ; -else - *own_addr_type =ADDR_LE_DEV_RANDOM ; - -if (rpa_valid (hdev)) -return 0 ; - - err =smp_generate_rpa (hdev, hdev->irk, &hdev->rpa); -if (err <0 ) { -bt_dev_err (hdev,"failed to generate new RPA" ); -return err; - } - -set_random_addr (req, &hdev->rpa); - -return 0 ; - } - -/* In case of required privacy without resolvable private address, -* use an non-resolvable private address. This is useful for active -* scanning and non-connectable advertising. -*/ -if (require_privacy) { -bdaddr_t nrpa; - -while (true) { -/* The non-resolvable private address is generated -* from random six bytes with the two most significant -* bits cleared. -*/ -get_random_bytes (&nrpa,6 ); - nrpa.b[5 ] &=0x3f ; - -/* The non-resolvable private address shall not be -* equal to the public address. -*/ -if (bacmp (&hdev->bdaddr, &nrpa)) -break ; - } - - *own_addr_type =ADDR_LE_DEV_RANDOM ; -set_random_addr (req, &nrpa); -return 0 ; - } - -/* If forcing static address is in use or there is no public -* address use the static address as random address (but skip -* the HCI command if the current random address is already the -* static one. -* -* In case BR/EDR has been disabled on a dual-mode controller -* and a static address has been configured, then use that -* address instead of the public BR/EDR address. -*/ -if (hci_dev_test_flag (hdev,HCI_FORCE_STATIC_ADDR ) || - !bacmp (&hdev->bdaddr,BDADDR_ANY ) || - (!hci_dev_test_flag (hdev,HCI_BREDR_ENABLED ) && -bacmp (&hdev->static_addr,BDADDR_ANY ))) { - *own_addr_type =ADDR_LE_DEV_RANDOM ; -if (bacmp (&hdev->static_addr, &hdev->random_addr)) -hci_req_add (req,HCI_OP_LE_SET_RANDOM_ADDR ,6 , - &hdev->static_addr); -return 0 ; - } - -/* Neither privacy nor static address is being used so use a -* public address. -*/ - *own_addr_type =ADDR_LE_DEV_PUBLIC ; - -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) +static void __hci_abort_conn (struct hci_request *req,struct hci_conn *conn, +u8 reason) {switch (conn->state) {case BT_CONNECTED :
net/bluetooth/hci_request.h +0 -29
@@ -68,40 +68,11 @@ 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_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); -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_start_ext_adv (struct hci_request *req,u8 instance); -int __hci_req_enable_ext_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); -int hci_abort_conn (struct hci_conn *conn,u8 reason); -void __hci_abort_conn (struct hci_request *req,struct hci_conn *conn, -u8 reason);
Signature · 1 line
2.37.1
PATCH v5 8/10 Bluetooth: move hci_get_random_address() to hci_sync
In reply to Brian GixThis function has no dependancies 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 | 73 -------------------------------- net/bluetooth/hci_request.h | 4 -- net/bluetooth/hci_sync.c | 73 ++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 77 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 +0 -73
79 lines not on this page · raw message
net/bluetooth/hci_request.h +0 -4
@@ -71,8 +71,4 @@ struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode, u32 plen,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_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_abort_conn (struct hci_conn *conn,u8 reason);
net/bluetooth/hci_sync.c +73 -0
76 lines not on this page · raw message
Signature · 1 line
2.37.1
PATCH v5 9/10 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 | 3 -- net/bluetooth/hci_sync.c | 20 ++++++++++ 6 files changed, 23 insertions(+), 69 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 -3
@@ -68,7 +68,4 @@ 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_update_adv_data (struct hci_request *req,u8 instance); -int hci_req_update_adv_data (struct hci_dev *hdev,u8 instance); -int hci_abort_conn (struct hci_conn *conn,u8 reason);
net/bluetooth/hci_sync.c +20 -0
@@ -6120,3 +6120,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 v5 10/10 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_request.c | 93 ---------------------- net/bluetooth/hci_request.h | 2 - net/bluetooth/hci_sync.c | 127 +++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 95 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);
net/bluetooth/hci_request.c +0 -93
96 lines not on this page · raw message
net/bluetooth/hci_request.h +0 -2
@@ -67,5 +67,3 @@ 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); - -int hci_abort_conn (struct hci_conn *conn,u8 reason);
net/bluetooth/hci_sync.c +127 -0
130 lines not on this page · raw message
Signature · 1 line
2.37.1