__u8            sec_level;
        __u8            pending_sec_level;
        __u8            pin_length;
+       __u8            enc_key_size;
        __u8            io_capability;
        __u8            power_save;
        __u16           disc_timeout;
 struct link_key *hci_find_link_key_type(struct hci_dev *hdev,
                                        bdaddr_t *bdaddr, u8 type);
 int hci_add_ltk(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr,
-                                       __le16 ediv, u8 rand[8], u8 ltk[16]);
+                       u8 key_size, __le16 ediv, u8 rand[8], u8 ltk[16]);
 int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
 
 int hci_remote_oob_data_clear(struct hci_dev *hdev);
 
 }
 
 int hci_add_ltk(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr,
-                                       __le16 ediv, u8 rand[8], u8 ltk[16])
+                       u8 key_size, __le16 ediv, u8 rand[8], u8 ltk[16])
 {
        struct link_key *key, *old_key;
        struct key_master_id *id;
        bacpy(&key->bdaddr, bdaddr);
        memcpy(key->val, ltk, sizeof(key->val));
        key->type = HCI_LK_SMP_LTK;
+       key->pin_len = key_size;
 
        id = (void *) &key->data;
        id->ediv = ediv;
 
                        if (key->dlen != sizeof(struct key_master_id))
                                continue;
 
-                       hci_add_ltk(hdev, 0, &key->bdaddr, id->ediv,
-                                                       id->rand, key->val);
+                       hci_add_ltk(hdev, 0, &key->bdaddr, key->pin_len,
+                                               id->ediv, id->rand, key->val);
 
                        continue;
                }
 
                                SMP_MAX_ENC_KEY_SIZE - conn->smp_key_size);
 
                hci_le_start_enc(hcon, ediv, rand, stk);
+               hcon->enc_key_size = conn->smp_key_size;
        } else {
                u8 stk[16], r[16], rand[8];
                __le16 ediv;
                memset(stk + conn->smp_key_size, 0,
                                SMP_MAX_ENC_KEY_SIZE - conn->smp_key_size);
 
-               hci_add_ltk(conn->hcon->hdev, 0, conn->dst, ediv, rand, stk);
+               hci_add_ltk(conn->hcon->hdev, 0, conn->dst, conn->smp_key_size,
+                                                       ediv, rand, stk);
        }
 
        return 0;
 
                        hci_le_start_enc(hcon, master->ediv, master->rand,
                                                                key->val);
+                       hcon->enc_key_size = key->pin_len;
+
                        goto done;
                }
 
 
        skb_pull(skb, sizeof(*rp));
 
-       hci_add_ltk(conn->hcon->hdev, 1, conn->src, rp->ediv,
-                                               rp->rand, conn->tk);
+       hci_add_ltk(conn->hcon->hdev, 1, conn->src, conn->smp_key_size,
+                                               rp->ediv, rp->rand, conn->tk);
 
        smp_distribute_keys(conn, 1);
 
 
                smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
 
-               hci_add_ltk(conn->hcon->hdev, 1, conn->dst, ediv,
-                                                       ident.rand, enc.ltk);
+               hci_add_ltk(conn->hcon->hdev, 1, conn->dst, conn->smp_key_size,
+                                               ediv, ident.rand, enc.ltk);
 
                ident.ediv = cpu_to_le16(ediv);