static void
 e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
-                                struct e1000_tx_buffer *buffer_info)
+                                struct e1000_tx_buffer *buffer_info,
+                                int budget)
 {
        if (buffer_info->dma) {
                if (buffer_info->mapped_as_page)
                buffer_info->dma = 0;
        }
        if (buffer_info->skb) {
-               dev_kfree_skb_any(buffer_info->skb);
+               napi_consume_skb(buffer_info->skb, budget);
                buffer_info->skb = NULL;
        }
        buffer_info->time_stamp = 0;
 
        for (i = 0; i < tx_ring->count; i++) {
                buffer_info = &tx_ring->buffer_info[i];
-               e1000_unmap_and_free_tx_resource(adapter, buffer_info);
+               e1000_unmap_and_free_tx_resource(adapter, buffer_info, 0);
        }
 
        netdev_reset_queue(adapter->netdev);
                        i += tx_ring->count;
                i--;
                buffer_info = &tx_ring->buffer_info[i];
-               e1000_unmap_and_free_tx_resource(adapter, buffer_info);
+               e1000_unmap_and_free_tx_resource(adapter, buffer_info, 0);
        }
 
        return 0;
                                }
 
                        }
-                       e1000_unmap_and_free_tx_resource(adapter, buffer_info);
+                       e1000_unmap_and_free_tx_resource(adapter, buffer_info,
+                                                        64);
                        tx_desc->upper.data = 0;
 
                        if (unlikely(++i == tx_ring->count))