efx->last_irq_cpu = raw_smp_processor_id();
                EFX_TRACE(efx, "IRQ %d on CPU %d status " EFX_DWORD_FMT "\n",
                          irq, raw_smp_processor_id(), EFX_DWORD_VAL(reg));
+       } else if (EFX_WORKAROUND_15783(efx)) {
+               /* We can't return IRQ_HANDLED more than once on seeing ISR0=0
+                * because this might be a shared interrupt, but we do need to
+                * check the channel every time and preemptively rearm it if
+                * it's idle. */
+               efx_for_each_channel(channel, efx) {
+                       if (!channel->work_pending)
+                               efx_nic_eventq_read_ack(channel);
+               }
        }
 
        return result;