diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2013-01-29 18:33:14 -0500 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2013-03-07 15:22:08 -0500 |
commit | ff734ef4bca05fd5cd51b83d2e2a9f008b64f9a3 (patch) | |
tree | c4e0095a62339ec8632b4d8262ce8043271b6094 /drivers/net/ethernet/sfc | |
parent | 9bc2fc9b5272cc888fb10d5839f7188fa0bfdc90 (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.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/efx.h | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/rx.c | 3 |
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); |
44 | extern void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index, | 44 | extern 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); |
46 | static 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 | } | ||
46 | extern void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue); | 53 | extern 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; |
467 | out: | 467 | out: |
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 | ||