igc: Introduce igc_unmap_tx_buffer() helper
authorAndre Guedes <andre.guedes@intel.com>
Fri, 23 Apr 2021 06:25:52 +0000 (23:25 -0700)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Thu, 20 May 2021 17:21:06 +0000 (10:21 -0700)
In preparation for AF_XDP zero-copy support, encapsulate the code that
unmaps Tx buffers into its own local helper so we can reuse it, avoiding
code duplication.

Signed-off-by: Andre Guedes <andre.guedes@intel.com>
Signed-off-by: Vedang Patel <vedang.patel@intel.com>
Signed-off-by: Jithu Joseph <jithu.joseph@intel.com>
Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Tested-by: Dvora Fuxbrumer <dvorax.fuxbrumer@linux.intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/igc/igc_main.c

index 5a262bab9116162306d52e01ea182232571ea63b..ebb57d82e4ddf868d69be21e93033aedf78948e3 100644 (file)
@@ -171,6 +171,14 @@ static void igc_get_hw_control(struct igc_adapter *adapter)
             ctrl_ext | IGC_CTRL_EXT_DRV_LOAD);
 }
 
+static void igc_unmap_tx_buffer(struct device *dev, struct igc_tx_buffer *buf)
+{
+       dma_unmap_single(dev, dma_unmap_addr(buf, dma),
+                        dma_unmap_len(buf, len), DMA_TO_DEVICE);
+
+       dma_unmap_len_set(buf, len, 0);
+}
+
 /**
  * igc_clean_tx_ring - Free Tx Buffers
  * @tx_ring: ring to be cleaned
@@ -188,11 +196,7 @@ static void igc_clean_tx_ring(struct igc_ring *tx_ring)
                else
                        dev_kfree_skb_any(tx_buffer->skb);
 
-               /* unmap skb header data */
-               dma_unmap_single(tx_ring->dev,
-                                dma_unmap_addr(tx_buffer, dma),
-                                dma_unmap_len(tx_buffer, len),
-                                DMA_TO_DEVICE);
+               igc_unmap_tx_buffer(tx_ring->dev, tx_buffer);
 
                /* check for eop_desc to determine the end of the packet */
                eop_desc = tx_buffer->next_to_watch;
@@ -211,10 +215,7 @@ static void igc_clean_tx_ring(struct igc_ring *tx_ring)
 
                        /* unmap any remaining paged data */
                        if (dma_unmap_len(tx_buffer, len))
-                               dma_unmap_page(tx_ring->dev,
-                                              dma_unmap_addr(tx_buffer, dma),
-                                              dma_unmap_len(tx_buffer, len),
-                                              DMA_TO_DEVICE);
+                               igc_unmap_tx_buffer(tx_ring->dev, tx_buffer);
                }
 
                /* move us one more past the eop_desc for start of next pkt */
@@ -1219,11 +1220,7 @@ dma_error:
        /* clear dma mappings for failed tx_buffer_info map */
        while (tx_buffer != first) {
                if (dma_unmap_len(tx_buffer, len))
-                       dma_unmap_page(tx_ring->dev,
-                                      dma_unmap_addr(tx_buffer, dma),
-                                      dma_unmap_len(tx_buffer, len),
-                                      DMA_TO_DEVICE);
-               dma_unmap_len_set(tx_buffer, len, 0);
+                       igc_unmap_tx_buffer(tx_ring->dev, tx_buffer);
 
                if (i-- == 0)
                        i += tx_ring->count;
@@ -1231,11 +1228,7 @@ dma_error:
        }
 
        if (dma_unmap_len(tx_buffer, len))
-               dma_unmap_single(tx_ring->dev,
-                                dma_unmap_addr(tx_buffer, dma),
-                                dma_unmap_len(tx_buffer, len),
-                                DMA_TO_DEVICE);
-       dma_unmap_len_set(tx_buffer, len, 0);
+               igc_unmap_tx_buffer(tx_ring->dev, tx_buffer);
 
        dev_kfree_skb_any(tx_buffer->skb);
        tx_buffer->skb = NULL;
@@ -2317,14 +2310,7 @@ static bool igc_clean_tx_irq(struct igc_q_vector *q_vector, int napi_budget)
                else
                        napi_consume_skb(tx_buffer->skb, napi_budget);
 
-               /* unmap skb header data */
-               dma_unmap_single(tx_ring->dev,
-                                dma_unmap_addr(tx_buffer, dma),
-                                dma_unmap_len(tx_buffer, len),
-                                DMA_TO_DEVICE);
-
-               /* clear tx_buffer data */
-               dma_unmap_len_set(tx_buffer, len, 0);
+               igc_unmap_tx_buffer(tx_ring->dev, tx_buffer);
 
                /* clear last DMA location and unmap remaining buffers */
                while (tx_desc != eop_desc) {
@@ -2338,13 +2324,8 @@ static bool igc_clean_tx_irq(struct igc_q_vector *q_vector, int napi_budget)
                        }
 
                        /* unmap any remaining paged data */
-                       if (dma_unmap_len(tx_buffer, len)) {
-                               dma_unmap_page(tx_ring->dev,
-                                              dma_unmap_addr(tx_buffer, dma),
-                                              dma_unmap_len(tx_buffer, len),
-                                              DMA_TO_DEVICE);
-                               dma_unmap_len_set(tx_buffer, len, 0);
-                       }
+                       if (dma_unmap_len(tx_buffer, len))
+                               igc_unmap_tx_buffer(tx_ring->dev, tx_buffer);
                }
 
                /* move us one more past the eop_desc for start of next pkt */