sfc: include size-binned TX stats on sfn8542q
authorEdward Cree <ecree@solarflare.com>
Fri, 26 Aug 2016 14:12:41 +0000 (15:12 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 27 Aug 2016 04:43:51 +0000 (21:43 -0700)
TX size bins were not supported on the 7000's 40G MAC, but the 8000 series
does support them and the MCPU advertises that via a new capability bit.

Signed-off-by: Edward Cree <ecree@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/sfc/ef10.c

index 2a70b1a39d8037dec5d69055fc9ddc640c23df4f..d039f29cd8d7da002d060c28600bc76882a26ca5 100644 (file)
@@ -1533,9 +1533,10 @@ static const struct efx_hw_stat_desc efx_ef10_stat_desc[EF10_STAT_COUNT] = {
                               (1ULL << GENERIC_STAT_rx_nodesc_trunc) | \
                               (1ULL << GENERIC_STAT_rx_noskb_drops))
 
-/* These statistics are only provided by the 10G MAC.  For a 10G/40G
- * switchable port we do not expose these because they might not
- * include all the packets they should.
+/* On 7000 series NICs, these statistics are only provided by the 10G MAC.
+ * For a 10G/40G switchable port we do not expose these because they might
+ * not include all the packets they should.
+ * On 8000 series NICs these statistics are always provided.
  */
 #define HUNT_10G_ONLY_STAT_MASK ((1ULL << EF10_STAT_port_tx_control) | \
                                 (1ULL << EF10_STAT_port_tx_lt64) |     \
@@ -1581,10 +1582,15 @@ static u64 efx_ef10_raw_stat_mask(struct efx_nic *efx)
              1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_LINKCTRL))
                return 0;
 
-       if (port_caps & (1 << MC_CMD_PHY_CAP_40000FDX_LBN))
+       if (port_caps & (1 << MC_CMD_PHY_CAP_40000FDX_LBN)) {
                raw_mask |= HUNT_40G_EXTRA_STAT_MASK;
-       else
+               /* 8000 series have everything even at 40G */
+               if (nic_data->datapath_caps2 &
+                   (1 << MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN))
+                       raw_mask |= HUNT_10G_ONLY_STAT_MASK;
+       } else {
                raw_mask |= HUNT_10G_ONLY_STAT_MASK;
+       }
 
        if (nic_data->datapath_caps &
            (1 << MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_LBN))