diff options
| author | Andre Guedes <andre.guedes@intel.com> | 2021-04-22 23:25:52 -0700 | 
|---|---|---|
| committer | Tony Nguyen <anthony.l.nguyen@intel.com> | 2021-05-20 10:21:06 -0700 | 
| commit | 6123429516c7fc6a7ee2f0a9dbef8c0c16ffb7cc (patch) | |
| tree | a36602607651c83fcb97832711b0b3cdf9a7f802 /drivers/net/ethernet/intel/igc/igc_main.c | |
| parent | a27e6e73e5501fd0cb84467d71ddeac9a5855e0b (diff) | |
igc: Introduce igc_unmap_tx_buffer() helper
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>
Diffstat (limited to 'drivers/net/ethernet/intel/igc/igc_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_main.c | 49 | 
1 files changed, 15 insertions, 34 deletions
diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 5a262bab9116..ebb57d82e4dd 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -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 */  | 
