Bluetooth: hci_conn: Fix running bis_cleanup for hci_conn->type PA_LINK
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 28 Jul 2025 17:51:01 +0000 (13:51 -0400)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 15 Aug 2025 13:44:49 +0000 (09:44 -0400)
Connections with type of PA_LINK shall be considered temporary just to
track the lifetime of PA Sync setup, once the BIG Sync is established
and connection are created with BIS_LINK the existing PA_LINK
connection shall not longer use bis_cleanup otherwise it terminates the
PA Sync when that shall be left to BIS_LINK connection to do it.

Fixes: a7bcffc673de ("Bluetooth: Add PA_LINK to distinguish BIG sync and PA sync connections")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/hci_conn.c
net/bluetooth/hci_event.c

index 7d1e79f69cd1cb13066935835b546fa84fae5f1e..f8b20b609a03941d6065fa1d96ed2ee343cb7857 100644 (file)
@@ -830,7 +830,17 @@ static void bis_cleanup(struct hci_conn *conn)
                /* Check if ISO connection is a BIS and terminate advertising
                 * set and BIG if there are no other connections using it.
                 */
-               bis = hci_conn_hash_lookup_big(hdev, conn->iso_qos.bcast.big);
+               bis = hci_conn_hash_lookup_big_state(hdev,
+                                                    conn->iso_qos.bcast.big,
+                                                    BT_CONNECTED,
+                                                    HCI_ROLE_MASTER);
+               if (bis)
+                       return;
+
+               bis = hci_conn_hash_lookup_big_state(hdev,
+                                                    conn->iso_qos.bcast.big,
+                                                    BT_CONNECT,
+                                                    HCI_ROLE_MASTER);
                if (bis)
                        return;
 
index 8aa5039b975a28237408e3780fbe51c59facf560..4f0a6116291ef67d3149f33572f3e4e31d1a9b15 100644 (file)
@@ -6957,9 +6957,14 @@ static void hci_le_big_sync_established_evt(struct hci_dev *hdev, void *data,
                                continue;
                }
 
-               if (ev->status != 0x42)
+               if (ev->status != 0x42) {
                        /* Mark PA sync as established */
                        set_bit(HCI_CONN_PA_SYNC, &bis->flags);
+                       /* Reset cleanup callback of PA Sync so it doesn't
+                        * terminate the sync when deleting the connection.
+                        */
+                       conn->cleanup = NULL;
+               }
 
                bis->sync_handle = conn->sync_handle;
                bis->iso_qos.bcast.big = ev->handle;