Message ID | 20210301120602.1.Ia32a022edc307a4cb0c93dc18d52b6c5f97db23b@changeid (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Bluetooth: Suspend improvements | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Guessed tree name to be net-next |
netdev/subject_prefix | warning | Target tree name not specified in the subject |
netdev/cc_maintainers | success | CCed 7 of 7 maintainers |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 16 lines checked |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/header_inline | success | Link |
netdev/stable | success | Stable not CCed |
Hi Abhishek, > When suspending, Bluetooth disconnects all connected peers devices. If > an LE connection is started but isn't completed, we will see an LE > Create Connection Cancel instead of an HCI disconnect. This just adds > a check to see if an LE cancel was the last disconnected device and wake > the suspend thread when that is the case. > > Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org> > Reviewed-by: Archie Pusaka <apusaka@chromium.org> > --- > Here is an HCI trace when the issue occurred. > > < HCI Command: LE Create Connection (0x08|0x000d) plen 25 #187777 [hci0] 2021-02-03 21:42:35.130208 > Scan interval: 60.000 msec (0x0060) > Scan window: 60.000 msec (0x0060) > Filter policy: White list is not used (0x00) > Peer address type: Random (0x01) > Peer address: D9:DC:6B:61:EB:3A (Static) > Own address type: Public (0x00) > Min connection interval: 15.00 msec (0x000c) > Max connection interval: 30.00 msec (0x0018) > Connection latency: 20 (0x0014) > Supervision timeout: 3000 msec (0x012c) > Min connection length: 0.000 msec (0x0000) > Max connection length: 0.000 msec (0x0000) >> HCI Event: Command Status (0x0f) plen 4 #187778 [hci0] 2021-02-03 21:42:35.131184 > LE Create Connection (0x08|0x000d) ncmd 1 > Status: Success (0x00) > < HCI Command: LE Create Connection Cancel (0x08|0x000e) plen 0 #187805 [hci0] 2021-02-03 21:42:37.183336 >> HCI Event: Command Complete (0x0e) plen 4 #187806 [hci0] 2021-02-03 21:42:37.192394 > LE Create Connection Cancel (0x08|0x000e) ncmd 1 > Status: Success (0x00) >> HCI Event: LE Meta Event (0x3e) plen 19 #187807 [hci0] 2021-02-03 21:42:37.193400 > LE Connection Complete (0x01) > Status: Unknown Connection Identifier (0x02) > Handle: 0 > Role: Master (0x00) > Peer address type: Random (0x01) > Peer address: D9:DC:6B:61:EB:3A (Static) > Connection interval: 0.00 msec (0x0000) > Connection latency: 0 (0x0000) > Supervision timeout: 0 msec (0x0000) > Master clock accuracy: 0x00 > ... <skip a few unrelated events> > @ MGMT Event: Controller Suspended (0x002d) plen 1 {0x0002} [hci0] 2021-02-03 21:42:39.178780 > Suspend state: Controller running (failed to suspend) (0) > @ MGMT Event: Controller Suspended (0x002d) plen 1 {0x0001} [hci0] 2021-02-03 21:42:39.178780 > Suspend state: Controller running (failed to suspend) (0) > ... <actual suspended time> > < HCI Command: Set Event Filter (0x03|0x0005) plen 1 #187808 [hci0] 2021-02-04 09:23:07.313591 > Type: Clear All Filters (0x00) > > net/bluetooth/hci_conn.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) patch has been applied to bluetooth-next tree. Regards Marcel
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 6ffa89e3ba0a85..468d31f3303d7a 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -772,6 +772,16 @@ void hci_le_conn_failed(struct hci_conn *conn, u8 status) hci_conn_del(conn); + /* The suspend notifier is waiting for all devices to disconnect and an + * LE connect cancel will result in an hci_le_conn_failed. Once the last + * connection is deleted, we should also wake the suspend queue to + * complete suspend operations. + */ + if (list_empty(&hdev->conn_hash.list) && + test_and_clear_bit(SUSPEND_DISCONNECTING, hdev->suspend_tasks)) { + wake_up(&hdev->suspend_wait_q); + } + /* Since we may have temporarily stopped the background scanning in * favor of connection establishment, we should restart it. */