if (work_done < budget) {
                napi_complete_done(napi, work_done);
 
-               /* Packets received while interrupts were disabled */
+               /* RSR bits only seem to propagate to raise interrupts when
+                * interrupts are enabled at the time, so if bits are already
+                * set due to packets received while interrupts were disabled,
+                * they will not cause another interrupt to be generated when
+                * interrupts are re-enabled.
+                * Check for this case here. This has been seen to happen
+                * around 30% of the time under heavy network load.
+                */
                status = macb_readl(bp, RSR);
                if (status) {
                        if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
                        napi_reschedule(napi);
                } else {
                        queue_writel(queue, IER, bp->rx_intr_mask);
+
+                       /* In rare cases, packets could have been received in
+                        * the window between the check above and re-enabling
+                        * interrupts. Therefore, a double-check is required
+                        * to avoid losing a wakeup. This can potentially race
+                        * with the interrupt handler doing the same actions
+                        * if an interrupt is raised just after enabling them,
+                        * but this should be harmless.
+                        */
+                       status = macb_readl(bp, RSR);
+                       if (unlikely(status)) {
+                               queue_writel(queue, IDR, bp->rx_intr_mask);
+                               if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
+                                       queue_writel(queue, ISR, MACB_BIT(RCOMP));
+                               napi_schedule(napi);
+                       }
                }
        }