diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2017-10-19 17:07:13 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2017-10-26 10:42:58 -0400 |
commit | 069db9cd0bbde92d3aa947ed86a09cbd4ceb5f67 (patch) | |
tree | bf3a8bd9281986f957976ad323cb2258c908e645 | |
parent | 104ba83363d1d42af62abb247f1426c09a80fced (diff) |
ixgbe: Fix Tx map failure path
This patch is a partial revert of "ixgbe: Don't bother clearing buffer
memory for descriptor rings". Specifically I messed up the exception
handling path a bit and this resulted in us incorrectly adding the count
back in when we didn't need to.
In order to make this simpler I am reverting most of the exception handling
path change and instead just replacing the bit that was handled by the
unmap_and_free call.
Fixes: ffed21bcee7a ("ixgbe: Don't bother clearing buffer memory for descriptor rings")
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 4d76afd13868..6d5f31e94358 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -8020,29 +8020,23 @@ static int ixgbe_tx_map(struct ixgbe_ring *tx_ring, | |||
8020 | return 0; | 8020 | return 0; |
8021 | dma_error: | 8021 | dma_error: |
8022 | dev_err(tx_ring->dev, "TX DMA map failed\n"); | 8022 | dev_err(tx_ring->dev, "TX DMA map failed\n"); |
8023 | tx_buffer = &tx_ring->tx_buffer_info[i]; | ||
8024 | 8023 | ||
8025 | /* clear dma mappings for failed tx_buffer_info map */ | 8024 | /* clear dma mappings for failed tx_buffer_info map */ |
8026 | while (tx_buffer != first) { | 8025 | for (;;) { |
8026 | tx_buffer = &tx_ring->tx_buffer_info[i]; | ||
8027 | if (dma_unmap_len(tx_buffer, len)) | 8027 | if (dma_unmap_len(tx_buffer, len)) |
8028 | dma_unmap_page(tx_ring->dev, | 8028 | dma_unmap_page(tx_ring->dev, |
8029 | dma_unmap_addr(tx_buffer, dma), | 8029 | dma_unmap_addr(tx_buffer, dma), |
8030 | dma_unmap_len(tx_buffer, len), | 8030 | dma_unmap_len(tx_buffer, len), |
8031 | DMA_TO_DEVICE); | 8031 | DMA_TO_DEVICE); |
8032 | dma_unmap_len_set(tx_buffer, len, 0); | 8032 | dma_unmap_len_set(tx_buffer, len, 0); |
8033 | 8033 | if (tx_buffer == first) | |
8034 | if (i--) | 8034 | break; |
8035 | if (i == 0) | ||
8035 | i += tx_ring->count; | 8036 | i += tx_ring->count; |
8036 | tx_buffer = &tx_ring->tx_buffer_info[i]; | 8037 | i--; |
8037 | } | 8038 | } |
8038 | 8039 | ||
8039 | if (dma_unmap_len(tx_buffer, len)) | ||
8040 | dma_unmap_single(tx_ring->dev, | ||
8041 | dma_unmap_addr(tx_buffer, dma), | ||
8042 | dma_unmap_len(tx_buffer, len), | ||
8043 | DMA_TO_DEVICE); | ||
8044 | dma_unmap_len_set(tx_buffer, len, 0); | ||
8045 | |||
8046 | dev_kfree_skb_any(first->skb); | 8040 | dev_kfree_skb_any(first->skb); |
8047 | first->skb = NULL; | 8041 | first->skb = NULL; |
8048 | 8042 | ||