iwlagn: update rate scaling with BA notifications
[pandora-kernel.git] / drivers / net / wireless / iwlwifi / iwl-agn-tx.c
index 12a9808..0e5d649 100644 (file)
@@ -342,6 +342,8 @@ int iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
 
        iwl_update_stats(priv, true, fc, len);
 
+       memset(&info->status, 0, sizeof(info->status));
+
        info->driver_data[0] = ctx;
        info->driver_data[1] = dev_cmd;
 
@@ -580,6 +582,9 @@ static void iwl_rx_reply_tx_agg(struct iwl_priv *priv,
                IWL_DEBUG_COEX(priv, "receive reply tx w/ bt_kill\n");
        }
 
+       if (tx_resp->frame_count == 1)
+               return;
+
        /* Construct bit-map of pending frames within Tx window */
        for (i = 0; i < tx_resp->frame_count; i++) {
                u16 fstatus = le16_to_cpu(frame_status[i].status);
@@ -938,7 +943,10 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
                else
                        WARN_ON_ONCE(1);
 
-               if (freed == 0) {
+               info = IEEE80211_SKB_CB(skb);
+               kmem_cache_free(priv->tx_cmd_pool, (info->driver_data[1]));
+
+               if (freed == 1) {
                        /* this is the first skb we deliver in this batch */
                        /* put the rate scaling data there */
                        info = IEEE80211_SKB_CB(skb);
@@ -951,9 +959,6 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
                                                    info);
                }
 
-               info = IEEE80211_SKB_CB(skb);
-               kmem_cache_free(priv->tx_cmd_pool, (info->driver_data[1]));
-
                ieee80211_tx_status_irqsafe(priv->hw, skb);
        }