}
 
 static inline struct hci_conn *
-hci_conn_hash_lookup_big_state(struct hci_dev *hdev, __u8 handle,  __u16 state)
+hci_conn_hash_lookup_big_state(struct hci_dev *hdev, __u8 handle, __u16 state,
+                              __u8 role)
 {
        struct hci_conn_hash *h = &hdev->conn_hash;
        struct hci_conn  *c;
        rcu_read_lock();
 
        list_for_each_entry_rcu(c, &h->list, list) {
-               if (c->type != BIS_LINK || c->state != state)
+               if (c->type != BIS_LINK || c->state != state || c->role != role)
                        continue;
 
                if (handle == c->iso_qos.bcast.big) {
 
        struct hci_link *link;
 
        /* Look for any BIS that is open for rebinding */
-       conn = hci_conn_hash_lookup_big_state(hdev, qos->bcast.big, BT_OPEN);
+       conn = hci_conn_hash_lookup_big_state(hdev, qos->bcast.big, BT_OPEN,
+                                             HCI_ROLE_MASTER);
        if (conn) {
                memcpy(qos, &conn->iso_qos, sizeof(*qos));
                conn->state = BT_CONNECTED;
 
 
        /* Connect all BISes that are bound to the BIG */
        while ((conn = hci_conn_hash_lookup_big_state(hdev, ev->handle,
-                                                     BT_BOUND))) {
+                                                     BT_BOUND,
+                                                     HCI_ROLE_MASTER))) {
                if (ev->status) {
                        hci_connect_cfm(conn, ev->status);
                        hci_conn_del(conn);
        hci_dev_unlock(hdev);
 }
 
+static void hci_le_big_sync_lost_evt(struct hci_dev *hdev, void *data,
+                                    struct sk_buff *skb)
+{
+       struct hci_evt_le_big_sync_lost *ev = data;
+       struct hci_conn *bis, *conn;
+
+       bt_dev_dbg(hdev, "big handle 0x%2.2x", ev->handle);
+
+       hci_dev_lock(hdev);
+
+       /* Delete the pa sync connection */
+       bis = hci_conn_hash_lookup_pa_sync_big_handle(hdev, ev->handle);
+       if (bis) {
+               conn = hci_conn_hash_lookup_pa_sync_handle(hdev,
+                                                          bis->sync_handle);
+               if (conn)
+                       hci_conn_del(conn);
+       }
+
+       /* Delete each bis connection */
+       while ((bis = hci_conn_hash_lookup_big_state(hdev, ev->handle,
+                                                    BT_CONNECTED,
+                                                    HCI_ROLE_SLAVE))) {
+               clear_bit(HCI_CONN_BIG_SYNC, &bis->flags);
+               hci_disconn_cfm(bis, ev->reason);
+               hci_conn_del(bis);
+       }
+
+       hci_dev_unlock(hdev);
+}
+
 static void hci_le_big_info_adv_report_evt(struct hci_dev *hdev, void *data,
                                           struct sk_buff *skb)
 {
                     hci_le_big_sync_established_evt,
                     sizeof(struct hci_evt_le_big_sync_estabilished),
                     HCI_MAX_EVENT_SIZE),
+       /* [0x1e = HCI_EVT_LE_BIG_SYNC_LOST] */
+       HCI_LE_EV_VL(HCI_EVT_LE_BIG_SYNC_LOST,
+                    hci_le_big_sync_lost_evt,
+                    sizeof(struct hci_evt_le_big_sync_lost),
+                    HCI_MAX_EVENT_SIZE),
        /* [0x22 = HCI_EVT_LE_BIG_INFO_ADV_REPORT] */
        HCI_LE_EV_VL(HCI_EVT_LE_BIG_INFO_ADV_REPORT,
                     hci_le_big_info_adv_report_evt,