Free up 2 bytes in skb->cb to be used for multi-rate retry later.
Move iv_len and icv_len initialization into key alloc.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
 
        if (info->control.hw_key) {
                keyidx = info->control.hw_key->hw_key_idx;
-               pktlen += info->control.icv_len;
+               pktlen += info->control.hw_key->icv_len;
        }
        ret = ah->ah_setup_tx_desc(ah, ds, pktlen,
                ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL,
 
 
        if (tx_info->control.hw_key) {
                txctl->keyix = tx_info->control.hw_key->hw_key_idx;
-               txctl->frmlen += tx_info->control.icv_len;
+               txctl->frmlen += tx_info->control.hw_key->icv_len;
 
                if (tx_info->control.hw_key->alg == ALG_WEP)
                        txctl->keytype = ATH9K_KEY_TYPE_WEP;
 
                }
 
                /* Hardware appends ICV. */
-               plcp_fragment_len += info->control.icv_len;
+               plcp_fragment_len += info->control.hw_key->icv_len;
 
                key_idx = b43_kidx_to_fw(dev, key_idx);
                mac_ctl |= (key_idx << B43_TXH_MAC_KEYIDX_SHIFT) &
                mac_ctl |= (key->algorithm << B43_TXH_MAC_KEYALG_SHIFT) &
                           B43_TXH_MAC_KEYALG;
                wlhdr_len = ieee80211_hdrlen(fctl);
-               iv_len = min((size_t) info->control.iv_len,
+               iv_len = min((size_t) info->control.hw_key->iv_len,
                             ARRAY_SIZE(txhdr->iv));
                memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len);
        }
 
 
                if (key->enabled) {
                        /* Hardware appends ICV. */
-                       plcp_fragment_len += info->control.icv_len;
+                       plcp_fragment_len += info->control.hw_key->icv_len;
 
                        key_idx = b43legacy_kidx_to_fw(dev, key_idx);
                        mac_ctl |= (key_idx << B43legacy_TX4_MAC_KEYIDX_SHIFT) &
                                   B43legacy_TX4_MAC_KEYALG_SHIFT) &
                                   B43legacy_TX4_MAC_KEYALG;
                        wlhdr_len = ieee80211_hdrlen(wlhdr->frame_control);
-                       iv_len = min((size_t)info->control.iv_len,
+                       iv_len = min((size_t)info->control.hw_key->iv_len,
                                     ARRAY_SIZE(txhdr->iv));
                        memcpy(txhdr->iv, ((u8 *)wlhdr) + wlhdr_len, iv_len);
                } else {
 
         * note that these lengths should only be added when
         * mac80211 does not generate it.
         */
-       overhead += tx_info->control.icv_len;
+       overhead += key->icv_len;
 
        if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_IV))
-               overhead += tx_info->control.iv_len;
+               overhead += key->iv_len;
 
        if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) {
                if (key->alg == ALG_TKIP)
 
        struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX);
        struct txentry_desc txdesc;
        struct skb_frame_desc *skbdesc;
-       unsigned int iv_len = IEEE80211_SKB_CB(skb)->control.iv_len;
+       unsigned int iv_len;
 
        if (unlikely(rt2x00queue_full(queue)))
                return -EINVAL;
         * the frame so we can provide it to the driver seperately.
         */
        if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc.flags) &&
-           !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags))
+           !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags) &&
+               (IEEE80211_SKB_CB(skb)->control.hw_key != NULL)) {
+               iv_len = IEEE80211_SKB_CB(skb)->control.hw_key->iv_len;
                rt2x00crypto_tx_remove_iv(skb, iv_len);
+       }
 
        /*
         * It could be possible that the queue was corrupted and this
 
                        unsigned long jiffies;
                        s8 rts_cts_rate_idx, alt_retry_rate_idx;
                        u8 retry_limit;
-                       u8 icv_len;
-                       u8 iv_len;
                } control;
                struct {
                        u64 ampdu_ack_map;
  */
 struct ieee80211_key_conf {
        enum ieee80211_key_alg alg;
+       u8 icv_len;
+       u8 iv_len;
        u8 hw_key_idx;
        u8 flags;
        s8 keyidx;
 
        key->conf.alg = alg;
        key->conf.keyidx = idx;
        key->conf.keylen = key_len;
+       switch (alg) {
+       case ALG_WEP:
+               key->conf.iv_len = WEP_IV_LEN;
+               key->conf.icv_len = WEP_ICV_LEN;
+               break;
+       case ALG_TKIP:
+               key->conf.iv_len = TKIP_IV_LEN;
+               key->conf.icv_len = TKIP_ICV_LEN;
+               break;
+       case ALG_CCMP:
+               key->conf.iv_len = CCMP_HDR_LEN;
+               key->conf.icv_len = CCMP_MIC_LEN;
+               break;
+       }
        memcpy(key->conf.key, key_data, key_len);
        INIT_LIST_HEAD(&key->list);
        INIT_LIST_HEAD(&key->todo);
 
 {
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 
-       info->control.iv_len = WEP_IV_LEN;
-       info->control.icv_len = WEP_ICV_LEN;
-
        if (!(tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) {
                if (ieee80211_wep_encrypt(tx->local, skb, tx->key))
                        return -1;
 
        int len, tail;
        u8 *pos;
 
-       info->control.icv_len = TKIP_ICV_LEN;
-       info->control.iv_len = TKIP_IV_LEN;
-
        if ((tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) &&
            !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
                /* hwaccel - with no need for preallocated room for IV/ICV */
        u8 *pos, *pn;
        int i;
 
-       info->control.icv_len = CCMP_MIC_LEN;
-       info->control.iv_len = CCMP_HDR_LEN;
-
        if ((tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) &&
            !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
                /* hwaccel - with no need for preallocated room for CCMP "