Bluetooth: ISO: Pass BIG encryption info through QoS
[platform/kernel/linux-starfive.git] / net / bluetooth / hci_event.c
index 1e1c914..9b34c9f 100644 (file)
@@ -6603,7 +6603,7 @@ static void hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data,
        struct hci_ev_le_pa_sync_established *ev = data;
        int mask = hdev->link_mode;
        __u8 flags = 0;
-       struct hci_conn *bis;
+       struct hci_conn *pa_sync;
 
        bt_dev_dbg(hdev, "status 0x%2.2x", ev->status);
 
@@ -6620,20 +6620,19 @@ static void hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data,
        if (!(flags & HCI_PROTO_DEFER))
                goto unlock;
 
-       /* Add connection to indicate the PA sync event */
-       bis = hci_conn_add(hdev, ISO_LINK, BDADDR_ANY,
-                          HCI_ROLE_SLAVE);
+       if (ev->status) {
+               /* Add connection to indicate the failed PA sync event */
+               pa_sync = hci_conn_add(hdev, ISO_LINK, BDADDR_ANY,
+                                      HCI_ROLE_SLAVE);
 
-       if (!bis)
-               goto unlock;
+               if (!pa_sync)
+                       goto unlock;
 
-       if (ev->status)
-               set_bit(HCI_CONN_PA_SYNC_FAILED, &bis->flags);
-       else
-               set_bit(HCI_CONN_PA_SYNC, &bis->flags);
+               set_bit(HCI_CONN_PA_SYNC_FAILED, &pa_sync->flags);
 
-       /* Notify connection to iso layer */
-       hci_connect_cfm(bis, ev->status);
+               /* Notify iso layer */
+               hci_connect_cfm(pa_sync, ev->status);
+       }
 
 unlock:
        hci_dev_unlock(hdev);
@@ -7125,7 +7124,7 @@ static void hci_le_big_sync_established_evt(struct hci_dev *hdev, void *data,
        hci_dev_lock(hdev);
 
        if (!ev->status) {
-               pa_sync = hci_conn_hash_lookup_pa_sync(hdev, ev->handle);
+               pa_sync = hci_conn_hash_lookup_pa_sync_big_handle(hdev, ev->handle);
                if (pa_sync)
                        /* Also mark the BIG sync established event on the
                         * associated PA sync hcon
@@ -7186,15 +7185,42 @@ static void hci_le_big_info_adv_report_evt(struct hci_dev *hdev, void *data,
        struct hci_evt_le_big_info_adv_report *ev = data;
        int mask = hdev->link_mode;
        __u8 flags = 0;
+       struct hci_conn *pa_sync;
 
        bt_dev_dbg(hdev, "sync_handle 0x%4.4x", le16_to_cpu(ev->sync_handle));
 
        hci_dev_lock(hdev);
 
        mask |= hci_proto_connect_ind(hdev, BDADDR_ANY, ISO_LINK, &flags);
-       if (!(mask & HCI_LM_ACCEPT))
+       if (!(mask & HCI_LM_ACCEPT)) {
                hci_le_pa_term_sync(hdev, ev->sync_handle);
+               goto unlock;
+       }
 
+       if (!(flags & HCI_PROTO_DEFER))
+               goto unlock;
+
+       pa_sync = hci_conn_hash_lookup_pa_sync_handle
+                       (hdev,
+                       le16_to_cpu(ev->sync_handle));
+
+       if (pa_sync)
+               goto unlock;
+
+       /* Add connection to indicate the PA sync event */
+       pa_sync = hci_conn_add(hdev, ISO_LINK, BDADDR_ANY,
+                              HCI_ROLE_SLAVE);
+
+       if (!pa_sync)
+               goto unlock;
+
+       pa_sync->sync_handle = le16_to_cpu(ev->sync_handle);
+       set_bit(HCI_CONN_PA_SYNC, &pa_sync->flags);
+
+       /* Notify iso layer */
+       hci_connect_cfm(pa_sync, 0x00);
+
+unlock:
        hci_dev_unlock(hdev);
 }