diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2012-02-07 23:49:52 +0000 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2012-02-16 00:15:03 +0000 |
commit | 2ae75dac301b0f255f79cd84ac70c619e55d7694 (patch) | |
tree | e9e6f63e02d23e0d76fa2a8fd092c50454d25ecc /drivers/net/ethernet/sfc/nic.c | |
parent | 4ef594eb892b3263fe45d72d5b8161ed4ffa6c0d (diff) |
sfc: Generate RX fill events based on RX queues, not channels
This makes it harder to accidentally send such events to TX-only
channels.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/ethernet/sfc/nic.c')
-rw-r--r-- | drivers/net/ethernet/sfc/nic.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/net/ethernet/sfc/nic.c b/drivers/net/ethernet/sfc/nic.c index 0a46b1c872a7..2b33afd4276d 100644 --- a/drivers/net/ethernet/sfc/nic.c +++ b/drivers/net/ethernet/sfc/nic.c @@ -66,8 +66,9 @@ #define EFX_CHANNEL_MAGIC_TEST(_channel) \ _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_TEST, (_channel)->channel) -#define EFX_CHANNEL_MAGIC_FILL(_channel) \ - _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_FILL, (_channel)->channel) +#define EFX_CHANNEL_MAGIC_FILL(_rx_queue) \ + _EFX_CHANNEL_MAGIC(_EFX_CHANNEL_MAGIC_FILL, \ + efx_rx_queue_index(_rx_queue)) /************************************************************************** * @@ -912,17 +913,20 @@ static void efx_handle_generated_event(struct efx_channel *channel, efx_qword_t *event) { struct efx_nic *efx = channel->efx; + struct efx_rx_queue *rx_queue = + efx_channel_has_rx_queue(channel) ? + efx_channel_get_rx_queue(channel) : NULL; unsigned magic; magic = EFX_QWORD_FIELD(*event, FSF_AZ_DRV_GEN_EV_MAGIC); if (magic == EFX_CHANNEL_MAGIC_TEST(channel)) ; /* ignore */ - else if (magic == EFX_CHANNEL_MAGIC_FILL(channel)) + else if (rx_queue && magic == EFX_CHANNEL_MAGIC_FILL(rx_queue)) /* The queue must be empty, so we won't receive any rx * events, so efx_process_channel() won't refill the * queue. Refill it here */ - efx_fast_push_rx_descriptors(efx_channel_get_rx_queue(channel)); + efx_fast_push_rx_descriptors(rx_queue); else netif_dbg(efx, hw, efx->net_dev, "channel %d received " "generated event "EFX_QWORD_FMT"\n", @@ -1150,9 +1154,10 @@ void efx_nic_generate_test_event(struct efx_channel *channel) efx_magic_event(channel, EFX_CHANNEL_MAGIC_TEST(channel)); } -void efx_nic_generate_fill_event(struct efx_channel *channel) +void efx_nic_generate_fill_event(struct efx_rx_queue *rx_queue) { - efx_magic_event(channel, EFX_CHANNEL_MAGIC_FILL(channel)); + efx_magic_event(efx_rx_queue_channel(rx_queue), + EFX_CHANNEL_MAGIC_FILL(rx_queue)); } /************************************************************************** |