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 | ||
