for (i = 0; i < key_count; i++) {
                struct mgmt_link_key_info *key = &cp->keys[i];
 
-               if (key->addr.type != BDADDR_BREDR || key->type > 0x08)
+               /* Considering SMP over BREDR/LE, there is no need to check addr_type */
+               if (key->type > 0x08)
                        return mgmt_cmd_status(sk, hdev->id,
                                               MGMT_OP_LOAD_LINK_KEYS,
                                               MGMT_STATUS_INVALID_PARAMS);
 
        for (i = 0; i < irk_count; i++) {
                struct mgmt_irk_info *irk = &cp->irks[i];
+               u8 addr_type = le_addr_type(irk->addr.type);
 
                if (hci_is_blocked_key(hdev,
                                       HCI_BLOCKED_KEY_TYPE_IRK,
                        continue;
                }
 
+               /* When using SMP over BR/EDR, the addr type should be set to BREDR */
+               if (irk->addr.type == BDADDR_BREDR)
+                       addr_type = BDADDR_BREDR;
+
                hci_add_irk(hdev, &irk->addr.bdaddr,
-                           le_addr_type(irk->addr.type), irk->val,
+                           addr_type, irk->val,
                            BDADDR_ANY);
        }
 
        for (i = 0; i < key_count; i++) {
                struct mgmt_ltk_info *key = &cp->keys[i];
                u8 type, authenticated;
+               u8 addr_type = le_addr_type(key->addr.type);
 
                if (hci_is_blocked_key(hdev,
                                       HCI_BLOCKED_KEY_TYPE_LTK,
                        continue;
                }
 
+               /* When using SMP over BR/EDR, the addr type should be set to BREDR */
+               if (key->addr.type == BDADDR_BREDR)
+                       addr_type = BDADDR_BREDR;
+
                hci_add_ltk(hdev, &key->addr.bdaddr,
-                           le_addr_type(key->addr.type), type, authenticated,
+                           addr_type, type, authenticated,
                            key->val, key->enc_size, key->ediv, key->rand);
        }
 
 
        ev.store_hint = persistent;
        bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
-       ev.key.addr.type = BDADDR_BREDR;
+       ev.key.addr.type = link_to_bdaddr(key->link_type, key->bdaddr_type);
        ev.key.type = key->type;
        memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
        ev.key.pin_len = key->pin_len;
                ev.store_hint = persistent;
 
        bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
-       ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
+       ev.key.addr.type = link_to_bdaddr(key->link_type, key->bdaddr_type);
        ev.key.type = mgmt_ltk_type(key);
        ev.key.enc_size = key->enc_size;
        ev.key.ediv = key->ediv;
 
        bacpy(&ev.rpa, &irk->rpa);
        bacpy(&ev.irk.addr.bdaddr, &irk->bdaddr);
-       ev.irk.addr.type = link_to_bdaddr(LE_LINK, irk->addr_type);
+       ev.irk.addr.type = link_to_bdaddr(irk->link_type, irk->addr_type);
        memcpy(ev.irk.val, irk->val, sizeof(irk->val));
 
        mgmt_event(MGMT_EV_NEW_IRK, hdev, &ev, sizeof(ev), NULL);
                ev.store_hint = persistent;
 
        bacpy(&ev.key.addr.bdaddr, &csrk->bdaddr);
-       ev.key.addr.type = link_to_bdaddr(LE_LINK, csrk->bdaddr_type);
+       ev.key.addr.type = link_to_bdaddr(csrk->link_type, csrk->bdaddr_type);
        ev.key.type = csrk->type;
        memcpy(ev.key.val, csrk->val, sizeof(csrk->val));
 
 
        }
 
        if (smp->remote_irk) {
+               smp->remote_irk->link_type = hcon->type;
                mgmt_new_irk(hdev, smp->remote_irk, persistent);
 
                /* Now that user space can be considered to know the
        }
 
        if (smp->csrk) {
+               smp->csrk->link_type = hcon->type;
                smp->csrk->bdaddr_type = hcon->dst_type;
                bacpy(&smp->csrk->bdaddr, &hcon->dst);
                mgmt_new_csrk(hdev, smp->csrk, persistent);
        }
 
        if (smp->responder_csrk) {
+               smp->responder_csrk->link_type = hcon->type;
                smp->responder_csrk->bdaddr_type = hcon->dst_type;
                bacpy(&smp->responder_csrk->bdaddr, &hcon->dst);
                mgmt_new_csrk(hdev, smp->responder_csrk, persistent);
        }
 
        if (smp->ltk) {
+               smp->ltk->link_type = hcon->type;
                smp->ltk->bdaddr_type = hcon->dst_type;
                bacpy(&smp->ltk->bdaddr, &hcon->dst);
                mgmt_new_ltk(hdev, smp->ltk, persistent);
        }
 
        if (smp->responder_ltk) {
+               smp->responder_ltk->link_type = hcon->type;
                smp->responder_ltk->bdaddr_type = hcon->dst_type;
                bacpy(&smp->responder_ltk->bdaddr, &hcon->dst);
                mgmt_new_ltk(hdev, smp->responder_ltk, persistent);
                key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
                                       smp->link_key, type, 0, &persistent);
                if (key) {
+                       key->link_type = hcon->type;
+                       key->bdaddr_type = hcon->dst_type;
                        mgmt_new_link_key(hdev, key, persistent);
 
                        /* Don't keep debug keys around if the relevant