u8 rate_idx, rate_flags;
 
        if (unlikely(rt2x00queue_full(queue)))
-               return -EINVAL;
+               return -ENOBUFS;
 
        if (test_and_set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) {
                ERROR(queue->rt2x00dev,
        tx_info = IEEE80211_SKB_CB(skb);
        rate_idx = tx_info->control.rates[0].idx;
        rate_flags = tx_info->control.rates[0].flags;
-       skbdesc = get_skb_frame_desc(entry->skb);
+       skbdesc = get_skb_frame_desc(skb);
        memset(skbdesc, 0, sizeof(*skbdesc));
        skbdesc->entry = entry;
        skbdesc->tx_rate_idx = rate_idx;
         * 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))
                rt2x00crypto_tx_remove_iv(skb, iv_len);
-       }
 
        /*
         * It could be possible that the queue was corrupted and this
-        * call failed. Just drop the frame, we cannot rollback and pass
-        * the frame to mac80211 because the skb->cb has now been tainted.
+        * call failed. Since we always return NETDEV_TX_OK to mac80211,
+        * this frame will simply be dropped.
         */
        if (unlikely(queue->rt2x00dev->ops->lib->write_tx_data(entry))) {
                clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
-               dev_kfree_skb_any(entry->skb);
                entry->skb = NULL;
-               return 0;
+               return -EIO;
        }
 
        if (test_bit(DRIVER_REQUIRE_DMA, &queue->rt2x00dev->flags))