sfc: Replace efx_rx_is_last_buffer() with a flag
authorBen Hutchings <bhutchings@solarflare.com>
Thu, 7 Mar 2013 16:31:17 +0000 (16:31 +0000)
committerBen Hutchings <bhutchings@solarflare.com>
Thu, 7 Mar 2013 20:22:14 +0000 (20:22 +0000)
This condition is brittle and we have lots of flags to spare.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
drivers/net/ethernet/sfc/net_driver.h
drivers/net/ethernet/sfc/rx.c

index 370c5bc..e22e75c 100644 (file)
@@ -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
 
index eea56f3..4cc2ba4 100644 (file)
@@ -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) {