Skip to content

Commit

Permalink
sfc: Add explicit RX queue flag to channel
Browse files Browse the repository at this point in the history
The PTP channel will have its own RX queue even though it's not
a regular traffic channel.

Original work by Ben Hutchings <bhutchings@solarflare.com>

Signed-off-by: Stuart Hodgson <smhodgson@solarflare.com>
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
  • Loading branch information
Stuart Hodgson authored and Ben Hutchings committed Sep 7, 2012
1 parent 220a60a commit 79d68b3
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 4 deletions.
8 changes: 7 additions & 1 deletion drivers/net/ethernet/sfc/efx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1451,10 +1451,16 @@ static void efx_set_channels(struct efx_nic *efx)
efx->tx_channel_offset =
separate_tx_channels ? efx->n_channels - efx->n_tx_channels : 0;

/* We need to adjust the TX queue numbers if we have separate
/* We need to mark which channels really have RX and TX
* queues, and adjust the TX queue numbers if we have separate
* RX-only and TX-only channels.
*/
efx_for_each_channel(channel, efx) {
if (channel->channel < efx->n_rx_channels)
channel->rx_queue.core_index = channel->channel;
else
channel->rx_queue.core_index = -1;

efx_for_each_channel_tx_queue(tx_queue, channel)
tx_queue->queue -= (efx->tx_channel_offset *
EFX_TXQ_TYPES);
Expand Down
5 changes: 4 additions & 1 deletion drivers/net/ethernet/sfc/net_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,8 @@ struct efx_rx_page_state {
/**
* struct efx_rx_queue - An Efx RX queue
* @efx: The associated Efx NIC
* @core_index: Index of network core RX queue. Will be >= 0 iff this
* is associated with a real RX queue.
* @buffer: The software buffer ring
* @rxd: The hardware descriptor ring
* @ptr_mask: The size of the ring minus 1.
Expand All @@ -263,6 +265,7 @@ struct efx_rx_page_state {
*/
struct efx_rx_queue {
struct efx_nic *efx;
int core_index;
struct efx_rx_buffer *buffer;
struct efx_special_buffer rxd;
unsigned int ptr_mask;
Expand Down Expand Up @@ -1047,7 +1050,7 @@ static inline bool efx_tx_queue_used(struct efx_tx_queue *tx_queue)

static inline bool efx_channel_has_rx_queue(struct efx_channel *channel)
{
return channel->channel < channel->efx->n_rx_channels;
return channel->rx_queue.core_index >= 0;
}

static inline struct efx_rx_queue *
Expand Down
7 changes: 5 additions & 2 deletions drivers/net/ethernet/sfc/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,7 @@ static void efx_rx_packet_gro(struct efx_channel *channel,
skb->ip_summed = ((rx_buf->flags & EFX_RX_PKT_CSUMMED) ?
CHECKSUM_UNNECESSARY : CHECKSUM_NONE);

skb_record_rx_queue(skb, channel->channel);
skb_record_rx_queue(skb, channel->rx_queue.core_index);

gro_result = napi_gro_frags(napi);
} else {
Expand Down Expand Up @@ -571,6 +571,9 @@ static void efx_rx_deliver(struct efx_channel *channel,
/* Set the SKB flags */
skb_checksum_none_assert(skb);

/* Record the rx_queue */
skb_record_rx_queue(skb, channel->rx_queue.core_index);

/* Pass the packet up */
netif_receive_skb(skb);

Expand Down Expand Up @@ -608,7 +611,7 @@ void __efx_rx_packet(struct efx_channel *channel, struct efx_rx_buffer *rx_buf)
* at the ethernet header */
skb->protocol = eth_type_trans(skb, efx->net_dev);

skb_record_rx_queue(skb, channel->channel);
skb_record_rx_queue(skb, channel->rx_queue.core_index);
}

if (unlikely(!(efx->net_dev->features & NETIF_F_RXCSUM)))
Expand Down

0 comments on commit 79d68b3

Please sign in to comment.