net/sfc/base: add MCDI agnostic wrapper for MAC stats clear
authorIvan Malov <ivan.malov@oktetlabs.ru>
Fri, 3 Mar 2017 12:49:24 +0000 (12:49 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 4 Apr 2017 13:52:52 +0000 (15:52 +0200)
If a libefx-based driver needs some way to clear port statistics,
then an MCDI agnostic method is required.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
drivers/net/sfc/base/efx.h
drivers/net/sfc/base/efx_impl.h
drivers/net/sfc/base/efx_mac.c

index 0815d7a..1d1c8bd 100644 (file)
@@ -559,6 +559,10 @@ efx_mac_stats_get_mask(
 
 #define        EFX_MAC_STATS_SIZE 0x400
 
+extern __checkReturn                   efx_rc_t
+efx_mac_stats_clear(
+       __in                            efx_nic_t *enp);
+
 /*
  * Upload mac statistics supported by the hardware into the given buffer.
  *
index 3a520a8..a38dad4 100644 (file)
@@ -198,6 +198,7 @@ typedef struct efx_mac_ops_s {
 #endif /* EFSYS_OPT_LOOPBACK */
 #if EFSYS_OPT_MAC_STATS
        efx_rc_t        (*emo_stats_get_mask)(efx_nic_t *, uint32_t *, size_t);
+       efx_rc_t        (*emo_stats_clear)(efx_nic_t *);
        efx_rc_t        (*emo_stats_upload)(efx_nic_t *, efsys_mem_t *);
        efx_rc_t        (*emo_stats_periodic)(efx_nic_t *, efsys_mem_t *,
                                              uint16_t, boolean_t);
index c1d81ef..752e720 100644 (file)
@@ -55,6 +55,7 @@ static const efx_mac_ops_t    __efx_siena_mac_ops = {
 #endif /* EFSYS_OPT_LOOPBACK */
 #if EFSYS_OPT_MAC_STATS
        siena_mac_stats_get_mask,               /* emo_stats_get_mask */
+       efx_mcdi_mac_stats_clear,               /* emo_stats_clear */
        efx_mcdi_mac_stats_upload,              /* emo_stats_upload */
        efx_mcdi_mac_stats_periodic,            /* emo_stats_periodic */
        siena_mac_stats_update                  /* emo_stats_update */
@@ -79,6 +80,7 @@ static const efx_mac_ops_t    __efx_ef10_mac_ops = {
 #endif /* EFSYS_OPT_LOOPBACK */
 #if EFSYS_OPT_MAC_STATS
        ef10_mac_stats_get_mask,                /* emo_stats_get_mask */
+       efx_mcdi_mac_stats_clear,               /* emo_stats_clear */
        efx_mcdi_mac_stats_upload,              /* emo_stats_upload */
        efx_mcdi_mac_stats_periodic,            /* emo_stats_periodic */
        ef10_mac_stats_update                   /* emo_stats_update */
@@ -707,6 +709,29 @@ efx_mac_stats_get_mask(
 
        return (0);
 
+fail1:
+       EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+       return (rc);
+}
+
+       __checkReturn                   efx_rc_t
+efx_mac_stats_clear(
+       __in                            efx_nic_t *enp)
+{
+       efx_port_t *epp = &(enp->en_port);
+       const efx_mac_ops_t *emop = epp->ep_emop;
+       efx_rc_t rc;
+
+       EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
+       EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PORT);
+       EFSYS_ASSERT(emop != NULL);
+
+       if ((rc = emop->emo_stats_clear(enp)) != 0)
+               goto fail1;
+
+       return (0);
+
 fail1:
        EFSYS_PROBE1(fail1, efx_rc_t, rc);