diff options
-rw-r--r-- | drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c index 6d1a62a84c9d..1966444590f6 100644 --- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c | |||
@@ -1678,6 +1678,7 @@ static int atl1e_tx_map(struct atl1e_adapter *adapter, | |||
1678 | u16 f; | 1678 | u16 f; |
1679 | int segment; | 1679 | int segment; |
1680 | int ring_start = adapter->tx_ring.next_to_use; | 1680 | int ring_start = adapter->tx_ring.next_to_use; |
1681 | int ring_end; | ||
1681 | 1682 | ||
1682 | nr_frags = skb_shinfo(skb)->nr_frags; | 1683 | nr_frags = skb_shinfo(skb)->nr_frags; |
1683 | segment = (tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK; | 1684 | segment = (tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK; |
@@ -1721,6 +1722,15 @@ static int atl1e_tx_map(struct atl1e_adapter *adapter, | |||
1721 | map_len, PCI_DMA_TODEVICE); | 1722 | map_len, PCI_DMA_TODEVICE); |
1722 | 1723 | ||
1723 | if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) { | 1724 | if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) { |
1725 | /* We need to unwind the mappings we've done */ | ||
1726 | ring_end = adapter->tx_ring.next_to_use; | ||
1727 | adapter->tx_ring.next_to_use = ring_start; | ||
1728 | while (adapter->tx_ring.next_to_use != ring_end) { | ||
1729 | tpd = atl1e_get_tpd(adapter); | ||
1730 | tx_buffer = atl1e_get_tx_buffer(adapter, tpd); | ||
1731 | pci_unmap_single(adapter->pdev, tx_buffer->dma, | ||
1732 | tx_buffer->length, PCI_DMA_TODEVICE); | ||
1733 | } | ||
1724 | /* Reset the tx rings next pointer */ | 1734 | /* Reset the tx rings next pointer */ |
1725 | adapter->tx_ring.next_to_use = ring_start; | 1735 | adapter->tx_ring.next_to_use = ring_start; |
1726 | return -ENOSPC; | 1736 | return -ENOSPC; |
@@ -1763,6 +1773,16 @@ static int atl1e_tx_map(struct atl1e_adapter *adapter, | |||
1763 | DMA_TO_DEVICE); | 1773 | DMA_TO_DEVICE); |
1764 | 1774 | ||
1765 | if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) { | 1775 | if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) { |
1776 | /* We need to unwind the mappings we've done */ | ||
1777 | ring_end = adapter->tx_ring.next_to_use; | ||
1778 | adapter->tx_ring.next_to_use = ring_start; | ||
1779 | while (adapter->tx_ring.next_to_use != ring_end) { | ||
1780 | tpd = atl1e_get_tpd(adapter); | ||
1781 | tx_buffer = atl1e_get_tx_buffer(adapter, tpd); | ||
1782 | dma_unmap_page(&adapter->pdev->dev, tx_buffer->dma, | ||
1783 | tx_buffer->length, DMA_TO_DEVICE); | ||
1784 | } | ||
1785 | |||
1766 | /* Reset the ring next to use pointer */ | 1786 | /* Reset the ring next to use pointer */ |
1767 | adapter->tx_ring.next_to_use = ring_start; | 1787 | adapter->tx_ring.next_to_use = ring_start; |
1768 | return -ENOSPC; | 1788 | return -ENOSPC; |
@@ -1853,8 +1873,10 @@ static netdev_tx_t atl1e_xmit_frame(struct sk_buff *skb, | |||
1853 | return NETDEV_TX_OK; | 1873 | return NETDEV_TX_OK; |
1854 | } | 1874 | } |
1855 | 1875 | ||
1856 | if (atl1e_tx_map(adapter, skb, tpd)) | 1876 | if (atl1e_tx_map(adapter, skb, tpd)) { |
1877 | dev_kfree_skb_any(skb); | ||
1857 | goto out; | 1878 | goto out; |
1879 | } | ||
1858 | 1880 | ||
1859 | atl1e_tx_queue(adapter, tpd_req, tpd); | 1881 | atl1e_tx_queue(adapter, tpd_req, tpd); |
1860 | 1882 | ||