sfc: Add explicit RX queue flag to channel
authorStuart Hodgson <smhodgson@solarflare.com>
Mon, 16 Jul 2012 16:08:33 +0000 (17:08 +0100)
committerBen Hutchings <bhutchings@solarflare.com>
Fri, 7 Sep 2012 20:13:38 +0000 (21:13 +0100)
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>
drivers/net/ethernet/sfc/efx.c
drivers/net/ethernet/sfc/net_driver.h
drivers/net/ethernet/sfc/rx.c

index a606db43c5badd35b66f07229d06f710e7cbed0c..342a1f31e5b85cd93b31e6ff9a5031279329a8a8 100644 (file)
@@ -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);
index 7ab1232494ef55ad62f5439dc25f462bfc1262d4..24a78a35bddbaa4cf71d72667de97d0e0215e5c9 100644 (file)
@@ -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.
@@ -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;
@@ -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 *
index 719319b89d7a8086f315559a1c68cfe28a82acd3..e997f83f14f555501592a2369a5636365185eeb0 100644 (file)
@@ -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 {
@@ -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);
 
@@ -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)))