sfc: Reset driver's MAC stats after MC reboot seen
authorBen Hutchings <bhutchings@solarflare.com>
Mon, 1 Oct 2012 19:58:35 +0000 (20:58 +0100)
committerBen Hutchings <bhutchings@solarflare.com>
Sat, 1 Dec 2012 02:00:10 +0000 (02:00 +0000)
If the MC reboots then the stats it reports to us will have been
reset.  We need to reset ours to get efx_update_diff_stat() working
properly.

(Ideally we would maintain stats across the reboot, but as this should
only happen immediately after a firmware upgrade it's not really worth
the trouble.)

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
drivers/net/ethernet/sfc/mcdi.c

index e1967fbad161da9270c812c092eafd07ce9fa6c1..3ef71a0f99a8689a9a99006fa4053ad5aa23dc97 100644 (file)
@@ -207,7 +207,9 @@ out:
        return 0;
 }
 
-/* Test and clear MC-rebooted flag for this port/function */
+/* Test and clear MC-rebooted flag for this port/function; reset
+ * software state as necessary.
+ */
 int efx_mcdi_poll_reboot(struct efx_nic *efx)
 {
        unsigned int addr = FR_CZ_MC_TREG_SMEM + MCDI_STATUS(efx);
@@ -223,6 +225,11 @@ int efx_mcdi_poll_reboot(struct efx_nic *efx)
        if (value == 0)
                return 0;
 
+       /* MAC statistics have been cleared on the NIC; clear our copy
+        * so that efx_update_diff_stat() can continue to work.
+        */
+       memset(&efx->mac_stats, 0, sizeof(efx->mac_stats));
+
        EFX_ZERO_DWORD(reg);
        efx_writed(efx, &reg, addr);