memcpy(outbuf, pdu + offset, outlen);
 }
 
+static void efx_ef10_mcdi_reboot_detected(struct efx_nic *efx)
+{
+       struct efx_ef10_nic_data *nic_data = efx->nic_data;
+
+       /* All our allocations have been reset */
+       efx_ef10_reset_mc_allocations(efx);
+
+       /* The datapath firmware might have been changed */
+       nic_data->must_check_datapath_caps = true;
+
+       /* MAC statistics have been cleared on the NIC; clear the local
+        * statistic that we update with efx_update_diff_stat().
+        */
+       nic_data->stats[EF10_STAT_port_rx_bad_bytes] = 0;
+}
+
 static int efx_ef10_mcdi_poll_reboot(struct efx_nic *efx)
 {
        struct efx_ef10_nic_data *nic_data = efx->nic_data;
                return 0;
 
        nic_data->warm_boot_count = rc;
-
-       /* All our allocations have been reset */
-       efx_ef10_reset_mc_allocations(efx);
-
-       /* The datapath firmware might have been changed */
-       nic_data->must_check_datapath_caps = true;
-
-       /* MAC statistics have been cleared on the NIC; clear the local
-        * statistic that we update with efx_update_diff_stat().
-        */
-       nic_data->stats[EF10_STAT_port_rx_bad_bytes] = 0;
+       efx_ef10_mcdi_reboot_detected(efx);
 
        return -EIO;
 }
        .mcdi_poll_response = efx_ef10_mcdi_poll_response,
        .mcdi_read_response = efx_ef10_mcdi_read_response,
        .mcdi_poll_reboot = efx_ef10_mcdi_poll_reboot,
+       .mcdi_reboot_detected = efx_ef10_mcdi_reboot_detected,
        .irq_enable_master = efx_port_dummy_op_void,
        .irq_test_generate = efx_ef10_irq_test_generate,
        .irq_disable_non_ev = efx_port_dummy_op_void,
        .mcdi_poll_response = efx_ef10_mcdi_poll_response,
        .mcdi_read_response = efx_ef10_mcdi_read_response,
        .mcdi_poll_reboot = efx_ef10_mcdi_poll_reboot,
+       .mcdi_reboot_detected = efx_ef10_mcdi_reboot_detected,
        .irq_enable_master = efx_port_dummy_op_void,
        .irq_test_generate = efx_ef10_irq_test_generate,
        .irq_disable_non_ev = efx_port_dummy_op_void,
 
 
                /* Consume the status word since efx_mcdi_rpc_finish() won't */
                for (count = 0; count < MCDI_STATUS_DELAY_COUNT; ++count) {
-                       if (efx_mcdi_poll_reboot(efx))
+                       rc = efx_mcdi_poll_reboot(efx);
+                       if (rc)
                                break;
                        udelay(MCDI_STATUS_DELAY_US);
                }
+
+               /* On EF10, a CODE_MC_REBOOT event can be received without the
+                * reboot detection in efx_mcdi_poll_reboot() being triggered.
+                * If zero was returned from the final call to
+                * efx_mcdi_poll_reboot(), the MC reboot wasn't noticed but the
+                * MC has definitely rebooted so prepare for the reset.
+                */
+               if (!rc && efx->type->mcdi_reboot_detected)
+                       efx->type->mcdi_reboot_detected(efx);
+
                mcdi->new_epoch = true;
 
                /* Nobody was waiting for an MCDI request, so trigger a reset */
 
        void (*mcdi_read_response)(struct efx_nic *efx, efx_dword_t *pdu,
                                   size_t pdu_offset, size_t pdu_len);
        int (*mcdi_poll_reboot)(struct efx_nic *efx);
+       void (*mcdi_reboot_detected)(struct efx_nic *efx);
        void (*irq_enable_master)(struct efx_nic *efx);
        void (*irq_test_generate)(struct efx_nic *efx);
        void (*irq_disable_non_ev)(struct efx_nic *efx);