Commit 2ab35745 authored by Ganesh Venkatesan's avatar Ganesh Venkatesan Committed by Jeff Garzik

[PATCH] e1000: Fix tx resource cleanup logic

Signed-off-by: default avatarGanesh Venkatesan <ganesh.venkatesan@intel.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 48546e52
...@@ -1059,6 +1059,24 @@ e1000_free_tx_resources(struct e1000_adapter *adapter) ...@@ -1059,6 +1059,24 @@ e1000_free_tx_resources(struct e1000_adapter *adapter)
adapter->tx_ring.desc = NULL; adapter->tx_ring.desc = NULL;
} }
static inline void
e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
struct e1000_buffer *buffer_info)
{
struct pci_dev *pdev = adapter->pdev;
if(buffer_info->dma) {
pci_unmap_page(pdev,
buffer_info->dma,
buffer_info->length,
PCI_DMA_TODEVICE);
buffer_info->dma = 0;
}
if(buffer_info->skb) {
dev_kfree_skb_any(buffer_info->skb);
buffer_info->skb = NULL;
}
}
/** /**
* e1000_clean_tx_ring - Free Tx Buffers * e1000_clean_tx_ring - Free Tx Buffers
* @adapter: board private structure * @adapter: board private structure
...@@ -1069,7 +1087,6 @@ e1000_clean_tx_ring(struct e1000_adapter *adapter) ...@@ -1069,7 +1087,6 @@ e1000_clean_tx_ring(struct e1000_adapter *adapter)
{ {
struct e1000_desc_ring *tx_ring = &adapter->tx_ring; struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
struct e1000_buffer *buffer_info; struct e1000_buffer *buffer_info;
struct pci_dev *pdev = adapter->pdev;
unsigned long size; unsigned long size;
unsigned int i; unsigned int i;
...@@ -1077,17 +1094,7 @@ e1000_clean_tx_ring(struct e1000_adapter *adapter) ...@@ -1077,17 +1094,7 @@ e1000_clean_tx_ring(struct e1000_adapter *adapter)
for(i = 0; i < tx_ring->count; i++) { for(i = 0; i < tx_ring->count; i++) {
buffer_info = &tx_ring->buffer_info[i]; buffer_info = &tx_ring->buffer_info[i];
if(buffer_info->skb) { e1000_unmap_and_free_tx_resource(adapter, buffer_info);
pci_unmap_page(pdev,
buffer_info->dma,
buffer_info->length,
PCI_DMA_TODEVICE);
dev_kfree_skb(buffer_info->skb);
buffer_info->skb = NULL;
}
} }
size = sizeof(struct e1000_buffer) * tx_ring->count; size = sizeof(struct e1000_buffer) * tx_ring->count;
...@@ -2194,7 +2201,6 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter) ...@@ -2194,7 +2201,6 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter)
{ {
struct e1000_desc_ring *tx_ring = &adapter->tx_ring; struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
struct pci_dev *pdev = adapter->pdev;
struct e1000_tx_desc *tx_desc, *eop_desc; struct e1000_tx_desc *tx_desc, *eop_desc;
struct e1000_buffer *buffer_info; struct e1000_buffer *buffer_info;
unsigned int i, eop; unsigned int i, eop;
...@@ -2209,19 +2215,7 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter) ...@@ -2209,19 +2215,7 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter)
tx_desc = E1000_TX_DESC(*tx_ring, i); tx_desc = E1000_TX_DESC(*tx_ring, i);
buffer_info = &tx_ring->buffer_info[i]; buffer_info = &tx_ring->buffer_info[i];
if(likely(buffer_info->dma)) { e1000_unmap_and_free_tx_resource(adapter, buffer_info);
pci_unmap_page(pdev,
buffer_info->dma,
buffer_info->length,
PCI_DMA_TODEVICE);
buffer_info->dma = 0;
}
if(buffer_info->skb) {
dev_kfree_skb_any(buffer_info->skb);
buffer_info->skb = NULL;
}
tx_desc->buffer_addr = 0; tx_desc->buffer_addr = 0;
tx_desc->lower.data = 0; tx_desc->lower.data = 0;
tx_desc->upper.data = 0; tx_desc->upper.data = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment