diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2013-03-07 20:31:17 +0400 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2013-03-08 00:22:14 +0400 |
commit | 179ea7f039f68ae4247a340bfb59fd861e7def12 (patch) | |
tree | 1cbbfe3b56674737df34b26fff87deabe99dd800 /drivers/net/ethernet/sfc | |
parent | 2768935a46603bb9bdd121864b1f2b2e8a71cccc (diff) | |
download | linux-179ea7f039f68ae4247a340bfb59fd861e7def12.tar.xz |
sfc: Replace efx_rx_is_last_buffer() with a flag
This condition is brittle and we have lots of flags to spare.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/ethernet/sfc')
-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 370c5bcebad9..e22e75c8f635 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 eea56f3ec81c..4cc2ba48a912 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) { |