Commit eee6f6a9 authored by Ben Hutchings's avatar Ben Hutchings

sfc: Encapsulate access to efx_{channel,nic}::last_irq_cpu in self-test

Cleanup in preparation for doing an event test on ifup.
Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent ed74f480
...@@ -1332,8 +1332,10 @@ void efx_nic_remove_eventq(struct efx_channel *channel) ...@@ -1332,8 +1332,10 @@ void efx_nic_remove_eventq(struct efx_channel *channel)
} }
void efx_nic_generate_test_event(struct efx_channel *channel) void efx_nic_event_test_start(struct efx_channel *channel)
{ {
channel->last_irq_cpu = -1;
smp_wmb();
efx_magic_event(channel, EFX_CHANNEL_MAGIC_TEST(channel)); efx_magic_event(channel, EFX_CHANNEL_MAGIC_TEST(channel));
} }
...@@ -1382,8 +1384,10 @@ void efx_nic_disable_interrupts(struct efx_nic *efx) ...@@ -1382,8 +1384,10 @@ void efx_nic_disable_interrupts(struct efx_nic *efx)
* Interrupt must already have been enabled, otherwise nasty things * Interrupt must already have been enabled, otherwise nasty things
* may happen. * may happen.
*/ */
void efx_nic_generate_interrupt(struct efx_nic *efx) void efx_nic_irq_test_start(struct efx_nic *efx)
{ {
efx->last_irq_cpu = -1;
smp_wmb();
efx_nic_interrupts(efx, true, true); efx_nic_interrupts(efx, true, true);
} }
......
...@@ -301,14 +301,23 @@ extern void falcon_update_stats_xmac(struct efx_nic *efx); ...@@ -301,14 +301,23 @@ extern void falcon_update_stats_xmac(struct efx_nic *efx);
/* Interrupts and test events */ /* Interrupts and test events */
extern int efx_nic_init_interrupt(struct efx_nic *efx); extern int efx_nic_init_interrupt(struct efx_nic *efx);
extern void efx_nic_enable_interrupts(struct efx_nic *efx); extern void efx_nic_enable_interrupts(struct efx_nic *efx);
extern void efx_nic_generate_test_event(struct efx_channel *channel); extern void efx_nic_event_test_start(struct efx_channel *channel);
extern void efx_nic_generate_interrupt(struct efx_nic *efx); extern void efx_nic_irq_test_start(struct efx_nic *efx);
extern void efx_nic_disable_interrupts(struct efx_nic *efx); extern void efx_nic_disable_interrupts(struct efx_nic *efx);
extern void efx_nic_fini_interrupt(struct efx_nic *efx); extern void efx_nic_fini_interrupt(struct efx_nic *efx);
extern irqreturn_t efx_nic_fatal_interrupt(struct efx_nic *efx); extern irqreturn_t efx_nic_fatal_interrupt(struct efx_nic *efx);
extern irqreturn_t falcon_legacy_interrupt_a1(int irq, void *dev_id); extern irqreturn_t falcon_legacy_interrupt_a1(int irq, void *dev_id);
extern void falcon_irq_ack_a1(struct efx_nic *efx); extern void falcon_irq_ack_a1(struct efx_nic *efx);
static inline int efx_nic_event_test_irq_cpu(struct efx_channel *channel)
{
return ACCESS_ONCE(channel->last_irq_cpu);
}
static inline int efx_nic_irq_test_irq_cpu(struct efx_nic *efx)
{
return ACCESS_ONCE(efx->last_irq_cpu);
}
/* Global Resources */ /* Global Resources */
extern int efx_nic_flush_queues(struct efx_nic *efx); extern int efx_nic_flush_queues(struct efx_nic *efx);
extern void falcon_start_nic_stats(struct efx_nic *efx); extern void falcon_start_nic_stats(struct efx_nic *efx);
......
...@@ -149,11 +149,7 @@ static int efx_test_interrupts(struct efx_nic *efx, ...@@ -149,11 +149,7 @@ static int efx_test_interrupts(struct efx_nic *efx,
netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n"); netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n");
tests->interrupt = -1; tests->interrupt = -1;
/* Reset interrupt flag */ efx_nic_irq_test_start(efx);
efx->last_irq_cpu = -1;
smp_wmb();
efx_nic_generate_interrupt(efx);
timeout = jiffies + IRQ_TIMEOUT; timeout = jiffies + IRQ_TIMEOUT;
wait = 1; wait = 1;
...@@ -161,7 +157,7 @@ static int efx_test_interrupts(struct efx_nic *efx, ...@@ -161,7 +157,7 @@ static int efx_test_interrupts(struct efx_nic *efx,
netif_dbg(efx, drv, efx->net_dev, "waiting for test interrupt\n"); netif_dbg(efx, drv, efx->net_dev, "waiting for test interrupt\n");
do { do {
schedule_timeout_uninterruptible(wait); schedule_timeout_uninterruptible(wait);
cpu = ACCESS_ONCE(efx->last_irq_cpu); cpu = efx_nic_irq_test_irq_cpu(efx);
if (cpu >= 0) if (cpu >= 0)
goto success; goto success;
wait *= 2; wait *= 2;
...@@ -192,9 +188,7 @@ static int efx_test_eventq_irq(struct efx_nic *efx, ...@@ -192,9 +188,7 @@ static int efx_test_eventq_irq(struct efx_nic *efx,
read_ptr[channel->channel] = channel->eventq_read_ptr; read_ptr[channel->channel] = channel->eventq_read_ptr;
set_bit(channel->channel, &dma_pend); set_bit(channel->channel, &dma_pend);
set_bit(channel->channel, &int_pend); set_bit(channel->channel, &int_pend);
channel->last_irq_cpu = -1; efx_nic_event_test_start(channel);
smp_wmb();
efx_nic_generate_test_event(channel);
} }
timeout = jiffies + IRQ_TIMEOUT; timeout = jiffies + IRQ_TIMEOUT;
...@@ -216,7 +210,7 @@ static int efx_test_eventq_irq(struct efx_nic *efx, ...@@ -216,7 +210,7 @@ static int efx_test_eventq_irq(struct efx_nic *efx,
} else { } else {
if (efx_nic_event_present(channel)) if (efx_nic_event_present(channel))
clear_bit(channel->channel, &dma_pend); clear_bit(channel->channel, &dma_pend);
if (ACCESS_ONCE(channel->last_irq_cpu) >= 0) if (efx_nic_event_test_irq_cpu(channel) >= 0)
clear_bit(channel->channel, &int_pend); clear_bit(channel->channel, &int_pend);
} }
napi_enable(&channel->napi_str); napi_enable(&channel->napi_str);
......
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