|
@@ -575,7 +575,10 @@ static void efx_rx_deliver(struct efx_channel *channel,
|
|
|
skb_record_rx_queue(skb, channel->rx_queue.core_index);
|
|
|
|
|
|
/* Pass the packet up */
|
|
|
- netif_receive_skb(skb);
|
|
|
+ if (channel->type->receive_skb)
|
|
|
+ channel->type->receive_skb(channel, skb);
|
|
|
+ else
|
|
|
+ netif_receive_skb(skb);
|
|
|
|
|
|
/* Update allocation strategy method */
|
|
|
channel->rx_alloc_level += RX_ALLOC_FACTOR_SKB;
|
|
@@ -617,7 +620,8 @@ void __efx_rx_packet(struct efx_channel *channel, struct efx_rx_buffer *rx_buf)
|
|
|
if (unlikely(!(efx->net_dev->features & NETIF_F_RXCSUM)))
|
|
|
rx_buf->flags &= ~EFX_RX_PKT_CSUMMED;
|
|
|
|
|
|
- if (likely(rx_buf->flags & (EFX_RX_BUF_PAGE | EFX_RX_PKT_CSUMMED)))
|
|
|
+ if (likely(rx_buf->flags & (EFX_RX_BUF_PAGE | EFX_RX_PKT_CSUMMED)) &&
|
|
|
+ !channel->type->receive_skb)
|
|
|
efx_rx_packet_gro(channel, rx_buf, eh);
|
|
|
else
|
|
|
efx_rx_deliver(channel, rx_buf);
|
|
@@ -627,6 +631,11 @@ void efx_rx_strategy(struct efx_channel *channel)
|
|
|
{
|
|
|
enum efx_rx_alloc_method method = rx_alloc_method;
|
|
|
|
|
|
+ if (channel->type->receive_skb) {
|
|
|
+ channel->rx_alloc_push_pages = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
/* Only makes sense to use page based allocation if GRO is enabled */
|
|
|
if (!(channel->efx->net_dev->features & NETIF_F_GRO)) {
|
|
|
method = RX_ALLOC_METHOD_SKB;
|