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: Ben Hutchings <bhutchings@solarflare.com>
This commit is contained in:
parent
ed74f48087
commit
eee6f6a9e0
3 changed files with 21 additions and 14 deletions
|
@ -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)
|
||||||
* 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);
|
||||||
/* 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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
} 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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue