aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/sfc/selftest.c
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2012-02-28 18:37:35 -0500
committerBen Hutchings <bhutchings@solarflare.com>2012-03-06 13:14:15 -0500
commiteee6f6a9e0c83811de77a137989d4a3289e297cc (patch)
tree88f5a56b976c0c26177eeaf2b0f115e9153b92d1 /drivers/net/ethernet/sfc/selftest.c
parented74f48087d1b1cf7cf534dad03bf1584eee783d (diff)
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>
Diffstat (limited to 'drivers/net/ethernet/sfc/selftest.c')
-rw-r--r--drivers/net/ethernet/sfc/selftest.c14
1 files changed, 4 insertions, 10 deletions
diff --git a/drivers/net/ethernet/sfc/selftest.c b/drivers/net/ethernet/sfc/selftest.c
index e4b4c8a3abc6..aa4ab53cac57 100644
--- a/drivers/net/ethernet/sfc/selftest.c
+++ b/drivers/net/ethernet/sfc/selftest.c
@@ -149,11 +149,7 @@ static int efx_test_interrupts(struct efx_nic *efx,
149 netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n"); 149 netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n");
150 tests->interrupt = -1; 150 tests->interrupt = -1;
151 151
152 /* Reset interrupt flag */ 152 efx_nic_irq_test_start(efx);
153 efx->last_irq_cpu = -1;
154 smp_wmb();
155
156 efx_nic_generate_interrupt(efx);
157 timeout = jiffies + IRQ_TIMEOUT; 153 timeout = jiffies + IRQ_TIMEOUT;
158 wait = 1; 154 wait = 1;
159 155
@@ -161,7 +157,7 @@ static int efx_test_interrupts(struct efx_nic *efx,
161 netif_dbg(efx, drv, efx->net_dev, "waiting for test interrupt\n"); 157 netif_dbg(efx, drv, efx->net_dev, "waiting for test interrupt\n");
162 do { 158 do {
163 schedule_timeout_uninterruptible(wait); 159 schedule_timeout_uninterruptible(wait);
164 cpu = ACCESS_ONCE(efx->last_irq_cpu); 160 cpu = efx_nic_irq_test_irq_cpu(efx);
165 if (cpu >= 0) 161 if (cpu >= 0)
166 goto success; 162 goto success;
167 wait *= 2; 163 wait *= 2;
@@ -192,9 +188,7 @@ static int efx_test_eventq_irq(struct efx_nic *efx,
192 read_ptr[channel->channel] = channel->eventq_read_ptr; 188 read_ptr[channel->channel] = channel->eventq_read_ptr;
193 set_bit(channel->channel, &dma_pend); 189 set_bit(channel->channel, &dma_pend);
194 set_bit(channel->channel, &int_pend); 190 set_bit(channel->channel, &int_pend);
195 channel->last_irq_cpu = -1; 191 efx_nic_event_test_start(channel);
196 smp_wmb();
197 efx_nic_generate_test_event(channel);
198 } 192 }
199 193
200 timeout = jiffies + IRQ_TIMEOUT; 194 timeout = jiffies + IRQ_TIMEOUT;
@@ -216,7 +210,7 @@ static int efx_test_eventq_irq(struct efx_nic *efx,
216 } else { 210 } else {
217 if (efx_nic_event_present(channel)) 211 if (efx_nic_event_present(channel))
218 clear_bit(channel->channel, &dma_pend); 212 clear_bit(channel->channel, &dma_pend);
219 if (ACCESS_ONCE(channel->last_irq_cpu) >= 0) 213 if (efx_nic_event_test_irq_cpu(channel) >= 0)
220 clear_bit(channel->channel, &int_pend); 214 clear_bit(channel->channel, &int_pend);
221 } 215 }
222 napi_enable(&channel->napi_str); 216 napi_enable(&channel->napi_str);