]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Bluetooth: hci_event: Disconnect device when BIG sync is lost
authorYang Li <yang.li@amlogic.com>
Wed, 20 Aug 2025 02:16:17 +0000 (10:16 +0800)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 22 Aug 2025 17:57:14 +0000 (13:57 -0400)
When a BIG sync is lost, the device should be set to "disconnected".
This ensures symmetry with the ISO path setup, where the device is
marked as "connected" once the path is established. Without this
change, the device state remains inconsistent and may lead to a
memory leak.

Fixes: b2a5f2e1c127 ("Bluetooth: hci_event: Add support for handling LE BIG Sync Lost event")
Signed-off-by: Yang Li <yang.li@amlogic.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/hci_event.c
net/bluetooth/mgmt.c

index 904bcff4f4cac5f3ffb672eacae605b51657d063..7a217485185741eec4f07fe187e3d4024f60a4e4 100644 (file)
@@ -7024,6 +7024,7 @@ static void hci_le_big_sync_lost_evt(struct hci_dev *hdev, void *data,
 {
        struct hci_evt_le_big_sync_lost *ev = data;
        struct hci_conn *bis, *conn;
+       bool mgmt_conn;
 
        bt_dev_dbg(hdev, "big handle 0x%2.2x", ev->handle);
 
@@ -7042,6 +7043,10 @@ static void hci_le_big_sync_lost_evt(struct hci_dev *hdev, void *data,
        while ((bis = hci_conn_hash_lookup_big_state(hdev, ev->handle,
                                                     BT_CONNECTED,
                                                     HCI_ROLE_SLAVE))) {
+               mgmt_conn = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &bis->flags);
+               mgmt_device_disconnected(hdev, &bis->dst, bis->type, bis->dst_type,
+                                        ev->reason, mgmt_conn);
+
                clear_bit(HCI_CONN_BIG_SYNC, &bis->flags);
                hci_disconn_cfm(bis, ev->reason);
                hci_conn_del(bis);
index 3166f5fb876b11843330e45e4ad997eb99b13d12..90e37ff2c85db239c8864d910c6708f3154506e0 100644 (file)
@@ -9705,7 +9705,9 @@ void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
        if (!mgmt_connected)
                return;
 
-       if (link_type != ACL_LINK && link_type != LE_LINK)
+       if (link_type != ACL_LINK &&
+           link_type != LE_LINK  &&
+           link_type != BIS_LINK)
                return;
 
        bacpy(&ev.addr.bdaddr, bdaddr);