aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/sfc
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2013-01-29 18:33:14 -0500
committerBen Hutchings <bhutchings@solarflare.com>2013-03-07 15:22:08 -0500
commitff734ef4bca05fd5cd51b83d2e2a9f008b64f9a3 (patch)
treec4e0095a62339ec8632b4d8262ce8043271b6094 /drivers/net/ethernet/sfc
parent9bc2fc9b5272cc888fb10d5839f7188fa0bfdc90 (diff)
sfc: Wrap __efx_rx_packet() with efx_rx_flush_packet()
The pipeline mechanism will need to change a bit for scattered packets. Add a wrapper to insulate efx_process_channel() from this. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/ethernet/sfc')
-rw-r--r--drivers/net/ethernet/sfc/efx.c6
-rw-r--r--drivers/net/ethernet/sfc/efx.h7
-rw-r--r--drivers/net/ethernet/sfc/rx.c3
3 files changed, 9 insertions, 7 deletions
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c
index 34b56ec87fba..f8013c3ea37c 100644
--- a/drivers/net/ethernet/sfc/efx.c
+++ b/drivers/net/ethernet/sfc/efx.c
@@ -250,11 +250,7 @@ static int efx_process_channel(struct efx_channel *channel, int budget)
250 struct efx_rx_queue *rx_queue = 250 struct efx_rx_queue *rx_queue =
251 efx_channel_get_rx_queue(channel); 251 efx_channel_get_rx_queue(channel);
252 252
253 /* Deliver last RX packet. */ 253 efx_rx_flush_packet(channel);
254 if (channel->rx_pkt) {
255 __efx_rx_packet(channel, channel->rx_pkt);
256 channel->rx_pkt = NULL;
257 }
258 if (rx_queue->enabled) 254 if (rx_queue->enabled)
259 efx_fast_push_rx_descriptors(rx_queue); 255 efx_fast_push_rx_descriptors(rx_queue);
260 } 256 }
diff --git a/drivers/net/ethernet/sfc/efx.h b/drivers/net/ethernet/sfc/efx.h
index 64c555e493be..00e7077fa1d8 100644
--- a/drivers/net/ethernet/sfc/efx.h
+++ b/drivers/net/ethernet/sfc/efx.h
@@ -43,6 +43,13 @@ extern void __efx_rx_packet(struct efx_channel *channel,
43 struct efx_rx_buffer *rx_buf); 43 struct efx_rx_buffer *rx_buf);
44extern void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index, 44extern void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,
45 unsigned int len, u16 flags); 45 unsigned int len, u16 flags);
46static inline void efx_rx_flush_packet(struct efx_channel *channel)
47{
48 if (channel->rx_pkt) {
49 __efx_rx_packet(channel, channel->rx_pkt);
50 channel->rx_pkt = NULL;
51 }
52}
46extern void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue); 53extern void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue);
47 54
48#define EFX_MAX_DMAQ_SIZE 4096UL 55#define EFX_MAX_DMAQ_SIZE 4096UL
diff --git a/drivers/net/ethernet/sfc/rx.c b/drivers/net/ethernet/sfc/rx.c
index 31361db28f91..60f4eb7cebc6 100644
--- a/drivers/net/ethernet/sfc/rx.c
+++ b/drivers/net/ethernet/sfc/rx.c
@@ -465,8 +465,7 @@ void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,
465 */ 465 */
466 rx_buf->len = len - efx->type->rx_buffer_hash_size; 466 rx_buf->len = len - efx->type->rx_buffer_hash_size;
467out: 467out:
468 if (channel->rx_pkt) 468 efx_rx_flush_packet(channel);
469 __efx_rx_packet(channel, channel->rx_pkt);
470 channel->rx_pkt = rx_buf; 469 channel->rx_pkt = rx_buf;
471} 470}
472 471