Commit 36df6136 authored by Edward Cree's avatar Edward Cree Committed by David S. Miller

sfc: add ability for extra channels to receive raw RX buffers

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: default avatarEdward Cree <ecree.xilinx@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 85697f97
...@@ -67,6 +67,13 @@ void __ef100_rx_packet(struct efx_channel *channel) ...@@ -67,6 +67,13 @@ void __ef100_rx_packet(struct efx_channel *channel)
prefix = (u32 *)(eh - ESE_GZ_RX_PKT_PREFIX_LEN); 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) && if (ef100_has_fcs_error(channel, prefix) &&
unlikely(!(efx->net_dev->features & NETIF_F_RXALL))) unlikely(!(efx->net_dev->features & NETIF_F_RXALL)))
goto out; goto out;
......
...@@ -593,6 +593,7 @@ struct efx_msi_context { ...@@ -593,6 +593,7 @@ struct efx_msi_context {
* @copy: Copy the channel state prior to reallocation. May be %NULL if * @copy: Copy the channel state prior to reallocation. May be %NULL if
* reallocation is not supported. * reallocation is not supported.
* @receive_skb: Handle an skb ready to be passed to netif_receive_skb() * @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 * @want_txqs: Determine whether this channel should have TX queues
* created. If %NULL, TX queues are not created. * created. If %NULL, TX queues are not created.
* @keep_eventq: Flag for whether event queue should be kept initialised * @keep_eventq: Flag for whether event queue should be kept initialised
...@@ -609,6 +610,7 @@ struct efx_channel_type { ...@@ -609,6 +610,7 @@ struct efx_channel_type {
void (*get_name)(struct efx_channel *, char *buf, size_t len); void (*get_name)(struct efx_channel *, char *buf, size_t len);
struct efx_channel *(*copy)(const struct efx_channel *); struct efx_channel *(*copy)(const struct efx_channel *);
bool (*receive_skb)(struct efx_channel *, struct sk_buff *); bool (*receive_skb)(struct efx_channel *, struct sk_buff *);
bool (*receive_raw)(struct efx_rx_queue *, u32);
bool (*want_txqs)(struct efx_channel *); bool (*want_txqs)(struct efx_channel *);
bool keep_eventq; bool keep_eventq;
bool want_pio; bool want_pio;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment