struct sk_buff_head     pending_rx;
        struct work_struct      pending_rx_work;
 
-       struct work_struct      id_addr_update_work;
+       struct delayed_work     id_addr_timer;
 
        __u8                    disc_reason;
 
 
 static void l2cap_conn_update_id_addr(struct work_struct *work)
 {
        struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
-                                              id_addr_update_work);
+                                              id_addr_timer.work);
        struct hci_conn *hcon = conn->hcon;
        struct l2cap_chan *chan;
 
        if (work_pending(&conn->pending_rx_work))
                cancel_work_sync(&conn->pending_rx_work);
 
-       if (work_pending(&conn->id_addr_update_work))
-               cancel_work_sync(&conn->id_addr_update_work);
+       cancel_delayed_work_sync(&conn->id_addr_timer);
 
        l2cap_unregister_all_users(conn);
 
 
        skb_queue_head_init(&conn->pending_rx);
        INIT_WORK(&conn->pending_rx_work, process_pending_rx);
-       INIT_WORK(&conn->id_addr_update_work, l2cap_conn_update_id_addr);
+       INIT_DELAYED_WORK(&conn->id_addr_timer, l2cap_conn_update_id_addr);
 
        conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
 
 
 
 #define SMP_TIMEOUT    msecs_to_jiffies(30000)
 
+#define ID_ADDR_TIMEOUT        msecs_to_jiffies(200)
+
 #define AUTH_REQ_MASK(dev)     (hci_dev_test_flag(dev, HCI_SC_ENABLED) ? \
                                 0x3f : 0x07)
 #define KEY_DIST_MASK          0x07
                if (hcon->type == LE_LINK) {
                        bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
                        hcon->dst_type = smp->remote_irk->addr_type;
-                       queue_work(hdev->workqueue, &conn->id_addr_update_work);
+                       /* Use a short delay to make sure the new address is
+                        * propagated _before_ the channels.
+                        */
+                       queue_delayed_work(hdev->workqueue,
+                                          &conn->id_addr_timer,
+                                          ID_ADDR_TIMEOUT);
                }
        }