diff options
| -rw-r--r-- | drivers/net/ethernet/sfc/net_driver.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/sfc/rx.c | 17 | 
2 files changed, 7 insertions, 11 deletions
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h index 370c5bcebad..e22e75c8f63 100644 --- a/drivers/net/ethernet/sfc/net_driver.h +++ b/drivers/net/ethernet/sfc/net_driver.h @@ -228,6 +228,7 @@ struct efx_rx_buffer {  	u16 len;  	u16 flags;  }; +#define EFX_RX_BUF_LAST_IN_PAGE	0x0001  #define EFX_RX_PKT_CSUMMED	0x0002  #define EFX_RX_PKT_DISCARD	0x0004 diff --git a/drivers/net/ethernet/sfc/rx.c b/drivers/net/ethernet/sfc/rx.c index eea56f3ec81..4cc2ba48a91 100644 --- a/drivers/net/ethernet/sfc/rx.c +++ b/drivers/net/ethernet/sfc/rx.c @@ -95,14 +95,6 @@ static inline void efx_sync_rx_buffer(struct efx_nic *efx,  				DMA_FROM_DEVICE);  } -/* Return true if this is the last RX buffer using a page. */ -static inline bool efx_rx_is_last_buffer(struct efx_nic *efx, -					 struct efx_rx_buffer *rx_buf) -{ -	return (rx_buf->page_offset >= (PAGE_SIZE >> 1) || -		efx->rx_dma_len > EFX_RX_HALF_PAGE); -} -  /* Check the RX page recycle ring for a page that can be reused. */  static struct page *efx_reuse_page(struct efx_rx_queue *rx_queue)  { @@ -199,11 +191,14 @@ static int efx_init_rx_buffers(struct efx_rx_queue *rx_queue)  		if ((~count & 1) && (efx->rx_dma_len <= EFX_RX_HALF_PAGE)) {  			/* Use the second half of the page */  			get_page(page); +			rx_buf->flags = 0;  			dma_addr += (PAGE_SIZE >> 1);  			page_offset += (PAGE_SIZE >> 1);  			++count;  			goto split;  		} + +		rx_buf->flags = EFX_RX_BUF_LAST_IN_PAGE;  	}  	return 0; @@ -247,7 +242,7 @@ static void efx_recycle_rx_page(struct efx_channel *channel,  	unsigned index;  	/* Only recycle the page after processing the final buffer. */ -	if (!efx_rx_is_last_buffer(efx, rx_buf)) +	if (!(rx_buf->flags & EFX_RX_BUF_LAST_IN_PAGE))  		return;  	index = rx_queue->page_add & rx_queue->page_ptr_mask; @@ -278,7 +273,7 @@ static void efx_fini_rx_buffer(struct efx_rx_queue *rx_queue,  		put_page(rx_buf->page);  	/* If this is the last buffer in a page, unmap and free it. */ -	if (efx_rx_is_last_buffer(rx_queue->efx, rx_buf)) { +	if (rx_buf->flags & EFX_RX_BUF_LAST_IN_PAGE) {  		efx_unmap_rx_buffer(rx_queue->efx, rx_buf);  		efx_free_rx_buffer(rx_buf);  	} @@ -507,7 +502,7 @@ void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,  	struct efx_rx_buffer *rx_buf;  	rx_buf = efx_rx_buffer(rx_queue, index); -	rx_buf->flags = flags; +	rx_buf->flags |= flags;  	/* Validate the number of fragments and completed length */  	if (n_frags == 1) {  |