Bluetooth: hci_conn: Fix not restoring ISO buffer count on disconnect
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 17 Oct 2022 22:36:23 +0000 (15:36 -0700)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 2 Nov 2022 21:16:09 +0000 (14:16 -0700)
When disconnecting an ISO link the controller may not generate
HCI_EV_NUM_COMP_PKTS for unacked packets which needs to be restored in
hci_conn_del otherwise the host would assume they are still in use and
would not be able to use all the buffers available.

Fixes: 26afbd826ee3 ("Bluetooth: Add initial implementation of CIS connections")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tested-by: Frédéric Danis <frederic.danis@collabora.com>
net/bluetooth/hci_conn.c

index 1176bad..a6c1286 100644 (file)
@@ -1067,10 +1067,21 @@ int hci_conn_del(struct hci_conn *conn)
                        hdev->acl_cnt += conn->sent;
        } else {
                struct hci_conn *acl = conn->link;
+
                if (acl) {
                        acl->link = NULL;
                        hci_conn_drop(acl);
                }
+
+               /* Unacked ISO frames */
+               if (conn->type == ISO_LINK) {
+                       if (hdev->iso_pkts)
+                               hdev->iso_cnt += conn->sent;
+                       else if (hdev->le_pkts)
+                               hdev->le_cnt += conn->sent;
+                       else
+                               hdev->acl_cnt += conn->sent;
+               }
        }
 
        if (conn->amp_mgr)