diff options
Diffstat (limited to 'drivers/net/sfc/selftest.c')
-rw-r--r-- | drivers/net/sfc/selftest.c | 25 |
1 files changed, 6 insertions, 19 deletions
diff --git a/drivers/net/sfc/selftest.c b/drivers/net/sfc/selftest.c index a0f49b348d62..50ad3bcaf68a 100644 --- a/drivers/net/sfc/selftest.c +++ b/drivers/net/sfc/selftest.c | |||
@@ -131,8 +131,6 @@ static int efx_test_chip(struct efx_nic *efx, struct efx_self_tests *tests) | |||
131 | static int efx_test_interrupts(struct efx_nic *efx, | 131 | static int efx_test_interrupts(struct efx_nic *efx, |
132 | struct efx_self_tests *tests) | 132 | struct efx_self_tests *tests) |
133 | { | 133 | { |
134 | struct efx_channel *channel; | ||
135 | |||
136 | netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n"); | 134 | netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n"); |
137 | tests->interrupt = -1; | 135 | tests->interrupt = -1; |
138 | 136 | ||
@@ -140,15 +138,6 @@ static int efx_test_interrupts(struct efx_nic *efx, | |||
140 | efx->last_irq_cpu = -1; | 138 | efx->last_irq_cpu = -1; |
141 | smp_wmb(); | 139 | smp_wmb(); |
142 | 140 | ||
143 | /* ACK each interrupting event queue. Receiving an interrupt due to | ||
144 | * traffic before a test event is raised is considered a pass */ | ||
145 | efx_for_each_channel(channel, efx) { | ||
146 | if (channel->work_pending) | ||
147 | efx_process_channel_now(channel); | ||
148 | if (efx->last_irq_cpu >= 0) | ||
149 | goto success; | ||
150 | } | ||
151 | |||
152 | efx_nic_generate_interrupt(efx); | 141 | efx_nic_generate_interrupt(efx); |
153 | 142 | ||
154 | /* Wait for arrival of test interrupt. */ | 143 | /* Wait for arrival of test interrupt. */ |
@@ -173,13 +162,13 @@ static int efx_test_eventq_irq(struct efx_channel *channel, | |||
173 | struct efx_self_tests *tests) | 162 | struct efx_self_tests *tests) |
174 | { | 163 | { |
175 | struct efx_nic *efx = channel->efx; | 164 | struct efx_nic *efx = channel->efx; |
176 | unsigned int magic_count, count; | 165 | unsigned int read_ptr, count; |
177 | 166 | ||
178 | tests->eventq_dma[channel->channel] = -1; | 167 | tests->eventq_dma[channel->channel] = -1; |
179 | tests->eventq_int[channel->channel] = -1; | 168 | tests->eventq_int[channel->channel] = -1; |
180 | tests->eventq_poll[channel->channel] = -1; | 169 | tests->eventq_poll[channel->channel] = -1; |
181 | 170 | ||
182 | magic_count = channel->magic_count; | 171 | read_ptr = channel->eventq_read_ptr; |
183 | channel->efx->last_irq_cpu = -1; | 172 | channel->efx->last_irq_cpu = -1; |
184 | smp_wmb(); | 173 | smp_wmb(); |
185 | 174 | ||
@@ -190,10 +179,7 @@ static int efx_test_eventq_irq(struct efx_channel *channel, | |||
190 | do { | 179 | do { |
191 | schedule_timeout_uninterruptible(HZ / 100); | 180 | schedule_timeout_uninterruptible(HZ / 100); |
192 | 181 | ||
193 | if (channel->work_pending) | 182 | if (ACCESS_ONCE(channel->eventq_read_ptr) != read_ptr) |
194 | efx_process_channel_now(channel); | ||
195 | |||
196 | if (channel->magic_count != magic_count) | ||
197 | goto eventq_ok; | 183 | goto eventq_ok; |
198 | } while (++count < 2); | 184 | } while (++count < 2); |
199 | 185 | ||
@@ -211,8 +197,7 @@ static int efx_test_eventq_irq(struct efx_channel *channel, | |||
211 | } | 197 | } |
212 | 198 | ||
213 | /* Check to see if event was received even if interrupt wasn't */ | 199 | /* Check to see if event was received even if interrupt wasn't */ |
214 | efx_process_channel_now(channel); | 200 | if (efx_nic_event_present(channel)) { |
215 | if (channel->magic_count != magic_count) { | ||
216 | netif_err(efx, drv, efx->net_dev, | 201 | netif_err(efx, drv, efx->net_dev, |
217 | "channel %d event was generated, but " | 202 | "channel %d event was generated, but " |
218 | "failed to trigger an interrupt\n", channel->channel); | 203 | "failed to trigger an interrupt\n", channel->channel); |
@@ -770,6 +755,8 @@ int efx_selftest(struct efx_nic *efx, struct efx_self_tests *tests, | |||
770 | __efx_reconfigure_port(efx); | 755 | __efx_reconfigure_port(efx); |
771 | mutex_unlock(&efx->mac_lock); | 756 | mutex_unlock(&efx->mac_lock); |
772 | 757 | ||
758 | netif_tx_wake_all_queues(efx->net_dev); | ||
759 | |||
773 | return rc_test; | 760 | return rc_test; |
774 | } | 761 | } |
775 | 762 | ||