sfc: add ability for extra channels to receive raw RX buffers
authorEdward Cree <ecree.xilinx@gmail.com>
Mon, 14 Nov 2022 13:15:53 +0000 (13:15 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Nov 2022 09:07:02 +0000 (09:07 +0000)
The TC extra channel will need its own special RX handling, which must
 operate before any code that expects the RX buffer to contain a network
 packet; buffers on this RX queue contain MAE counter packets in a
 special format that does not resemble an Ethernet frame, and many fields
 of the RX packet prefix are not populated.
The USER_MARK field, however, is populated with the generation count from
 the counter subsystem, which needs to be passed on to the RX handler.

Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/sfc/ef100_rx.c
drivers/net/ethernet/sfc/net_driver.h

index 735f503..83d9db7 100644 (file)
@@ -67,6 +67,13 @@ void __ef100_rx_packet(struct efx_channel *channel)
 
        prefix = (u32 *)(eh - ESE_GZ_RX_PKT_PREFIX_LEN);
 
+       if (channel->type->receive_raw) {
+               u32 mark = PREFIX_FIELD(prefix, USER_MARK);
+
+               if (channel->type->receive_raw(rx_queue, mark))
+                       return; /* packet was consumed */
+       }
+
        if (ef100_has_fcs_error(channel, prefix) &&
            unlikely(!(efx->net_dev->features & NETIF_F_RXALL)))
                goto out;
index b3d4138..1e42f34 100644 (file)
@@ -593,6 +593,7 @@ struct efx_msi_context {
  * @copy: Copy the channel state prior to reallocation.  May be %NULL if
  *     reallocation is not supported.
  * @receive_skb: Handle an skb ready to be passed to netif_receive_skb()
+ * @receive_raw: Handle an RX buffer ready to be passed to __efx_rx_packet()
  * @want_txqs: Determine whether this channel should have TX queues
  *     created.  If %NULL, TX queues are not created.
  * @keep_eventq: Flag for whether event queue should be kept initialised
@@ -609,6 +610,7 @@ struct efx_channel_type {
        void (*get_name)(struct efx_channel *, char *buf, size_t len);
        struct efx_channel *(*copy)(const struct efx_channel *);
        bool (*receive_skb)(struct efx_channel *, struct sk_buff *);
+       bool (*receive_raw)(struct efx_rx_queue *, u32);
        bool (*want_txqs)(struct efx_channel *);
        bool keep_eventq;
        bool want_pio;