static int lbs_add_wpa_tlv(u8 *tlv, const u8 *ie, u8 ie_len)
 {
-       size_t tlv_len;
+       struct mrvl_ie_data *wpatlv = (struct mrvl_ie_data *)tlv;
+       const struct element *wpaie;
+
+       /* Find the first RSN or WPA IE to use */
+       wpaie = cfg80211_find_elem(WLAN_EID_RSN, ie, ie_len);
+       if (!wpaie)
+               wpaie = cfg80211_find_vendor_elem(WLAN_OUI_MICROSOFT,
+                                                 WLAN_OUI_TYPE_MICROSOFT_WPA,
+                                                 ie, ie_len);
+       if (!wpaie || wpaie->datalen > 128)
+               return 0;
 
        /*
-        * We need just convert an IE to an TLV. IEs use u8 for the header,
+        * Convert the found IE to a TLV. IEs use u8 for the header,
         *   u8      type
         *   u8      len
         *   u8[]    data
         *   __le16  len
         *   u8[]    data
         */
-       *tlv++ = *ie++;
-       *tlv++ = 0;
-       tlv_len = *tlv++ = *ie++;
-       *tlv++ = 0;
-       while (tlv_len--)
-               *tlv++ = *ie++;
-       /* the TLV is two bytes larger than the IE */
-       return ie_len + 2;
+       wpatlv->header.type = cpu_to_le16(wpaie->id);
+       wpatlv->header.len = cpu_to_le16(wpaie->datalen);
+       memcpy(wpatlv->data, wpaie->data, wpaie->datalen);
+
+       /* Return the total number of bytes added to the TLV buffer */
+       return sizeof(struct mrvl_ie_header) + wpaie->datalen;
 }
 
 /*