ice: Add code to get DCB related statistics
This patch adds a new function ice_update_dcb_stats to get DCB stats from the hardware and ethtool support for displaying these stats. Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
5f6aa50e4e
commit
4b0fdceb81
|
@ -359,6 +359,44 @@ dcb_init_err:
|
|||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_update_dcb_stats - Update DCB stats counters
|
||||
* @pf: PF whose stats needs to be updated
|
||||
*/
|
||||
void ice_update_dcb_stats(struct ice_pf *pf)
|
||||
{
|
||||
struct ice_hw_port_stats *prev_ps, *cur_ps;
|
||||
struct ice_hw *hw = &pf->hw;
|
||||
u8 pf_id = hw->pf_id;
|
||||
int i;
|
||||
|
||||
prev_ps = &pf->stats_prev;
|
||||
cur_ps = &pf->stats;
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
ice_stat_update32(hw, GLPRT_PXOFFRXC(pf_id, i),
|
||||
pf->stat_prev_loaded,
|
||||
&prev_ps->priority_xoff_rx[i],
|
||||
&cur_ps->priority_xoff_rx[i]);
|
||||
ice_stat_update32(hw, GLPRT_PXONRXC(pf_id, i),
|
||||
pf->stat_prev_loaded,
|
||||
&prev_ps->priority_xon_rx[i],
|
||||
&cur_ps->priority_xon_rx[i]);
|
||||
ice_stat_update32(hw, GLPRT_PXONTXC(pf_id, i),
|
||||
pf->stat_prev_loaded,
|
||||
&prev_ps->priority_xon_tx[i],
|
||||
&cur_ps->priority_xon_tx[i]);
|
||||
ice_stat_update32(hw, GLPRT_PXOFFTXC(pf_id, i),
|
||||
pf->stat_prev_loaded,
|
||||
&prev_ps->priority_xoff_tx[i],
|
||||
&cur_ps->priority_xoff_tx[i]);
|
||||
ice_stat_update32(hw, GLPRT_RXON2OFFCNT(pf_id, i),
|
||||
pf->stat_prev_loaded,
|
||||
&prev_ps->priority_xon_2_xoff[i],
|
||||
&cur_ps->priority_xon_2_xoff[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_tx_prepare_vlan_flags_dcb - prepare VLAN tagging for DCB
|
||||
* @tx_ring: ring to send buffer on
|
||||
|
|
|
@ -12,6 +12,7 @@ u8 ice_dcb_get_ena_tc(struct ice_dcbx_cfg *dcbcfg);
|
|||
u8 ice_dcb_get_num_tc(struct ice_dcbx_cfg *dcbcfg);
|
||||
void ice_vsi_cfg_dcb_rings(struct ice_vsi *vsi);
|
||||
int ice_init_pf_dcb(struct ice_pf *pf);
|
||||
void ice_update_dcb_stats(struct ice_pf *pf);
|
||||
int
|
||||
ice_tx_prepare_vlan_flags_dcb(struct ice_ring *tx_ring,
|
||||
struct ice_tx_buf *first);
|
||||
|
@ -47,6 +48,7 @@ ice_tx_prepare_vlan_flags_dcb(struct ice_ring __always_unused *tx_ring,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define ice_update_dcb_stats(pf) do {} while (0)
|
||||
#define ice_vsi_cfg_dcb_rings(vsi) do {} while (0)
|
||||
#define ice_dcb_process_lldp_set_mib_change(pf, event) do {} while (0)
|
||||
#define ice_set_cgd_num(tlan_ctx, ring) do {} while (0)
|
||||
|
|
|
@ -33,8 +33,14 @@ static int ice_q_stats_len(struct net_device *netdev)
|
|||
#define ICE_PF_STATS_LEN ARRAY_SIZE(ice_gstrings_pf_stats)
|
||||
#define ICE_VSI_STATS_LEN ARRAY_SIZE(ice_gstrings_vsi_stats)
|
||||
|
||||
#define ICE_ALL_STATS_LEN(n) (ICE_PF_STATS_LEN + ICE_VSI_STATS_LEN + \
|
||||
ice_q_stats_len(n))
|
||||
#define ICE_PFC_STATS_LEN ( \
|
||||
(FIELD_SIZEOF(struct ice_pf, stats.priority_xoff_rx) + \
|
||||
FIELD_SIZEOF(struct ice_pf, stats.priority_xon_rx) + \
|
||||
FIELD_SIZEOF(struct ice_pf, stats.priority_xoff_tx) + \
|
||||
FIELD_SIZEOF(struct ice_pf, stats.priority_xon_tx)) \
|
||||
/ sizeof(u64))
|
||||
#define ICE_ALL_STATS_LEN(n) (ICE_PF_STATS_LEN + ICE_PFC_STATS_LEN + \
|
||||
ICE_VSI_STATS_LEN + ice_q_stats_len(n))
|
||||
|
||||
static const struct ice_stats ice_gstrings_vsi_stats[] = {
|
||||
ICE_VSI_STAT("tx_unicast", eth_stats.tx_unicast),
|
||||
|
@ -309,6 +315,22 @@ static void ice_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
|
|||
p += ETH_GSTRING_LEN;
|
||||
}
|
||||
|
||||
for (i = 0; i < ICE_MAX_USER_PRIORITY; i++) {
|
||||
snprintf(p, ETH_GSTRING_LEN,
|
||||
"port.tx-priority-%u-xon", i);
|
||||
p += ETH_GSTRING_LEN;
|
||||
snprintf(p, ETH_GSTRING_LEN,
|
||||
"port.tx-priority-%u-xoff", i);
|
||||
p += ETH_GSTRING_LEN;
|
||||
}
|
||||
for (i = 0; i < ICE_MAX_USER_PRIORITY; i++) {
|
||||
snprintf(p, ETH_GSTRING_LEN,
|
||||
"port.rx-priority-%u-xon", i);
|
||||
p += ETH_GSTRING_LEN;
|
||||
snprintf(p, ETH_GSTRING_LEN,
|
||||
"port.rx-priority-%u-xoff", i);
|
||||
p += ETH_GSTRING_LEN;
|
||||
}
|
||||
break;
|
||||
case ETH_SS_PRIV_FLAGS:
|
||||
for (i = 0; i < ICE_PRIV_FLAG_ARRAY_SIZE; i++) {
|
||||
|
@ -486,6 +508,16 @@ ice_get_ethtool_stats(struct net_device *netdev,
|
|||
data[i++] = (ice_gstrings_pf_stats[j].sizeof_stat ==
|
||||
sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
|
||||
}
|
||||
|
||||
for (j = 0; j < ICE_MAX_USER_PRIORITY; j++) {
|
||||
data[i++] = pf->stats.priority_xon_tx[j];
|
||||
data[i++] = pf->stats.priority_xoff_tx[j];
|
||||
}
|
||||
|
||||
for (j = 0; j < ICE_MAX_USER_PRIORITY; j++) {
|
||||
data[i++] = pf->stats.priority_xon_rx[j];
|
||||
data[i++] = pf->stats.priority_xoff_rx[j];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -321,11 +321,16 @@
|
|||
#define GLPRT_PTC64L(_i) (0x00380B80 + ((_i) * 8))
|
||||
#define GLPRT_PTC9522H(_i) (0x00380D04 + ((_i) * 8))
|
||||
#define GLPRT_PTC9522L(_i) (0x00380D00 + ((_i) * 8))
|
||||
#define GLPRT_PXOFFRXC(_i, _j) (0x00380500 + ((_i) * 8 + (_j) * 64))
|
||||
#define GLPRT_PXOFFTXC(_i, _j) (0x00380F40 + ((_i) * 8 + (_j) * 64))
|
||||
#define GLPRT_PXONRXC(_i, _j) (0x00380300 + ((_i) * 8 + (_j) * 64))
|
||||
#define GLPRT_PXONTXC(_i, _j) (0x00380D40 + ((_i) * 8 + (_j) * 64))
|
||||
#define GLPRT_RFC(_i) (0x00380AC0 + ((_i) * 8))
|
||||
#define GLPRT_RJC(_i) (0x00380B00 + ((_i) * 8))
|
||||
#define GLPRT_RLEC(_i) (0x00380140 + ((_i) * 8))
|
||||
#define GLPRT_ROC(_i) (0x00380240 + ((_i) * 8))
|
||||
#define GLPRT_RUC(_i) (0x00380200 + ((_i) * 8))
|
||||
#define GLPRT_RXON2OFFCNT(_i, _j) (0x00380700 + ((_i) * 8 + (_j) * 64))
|
||||
#define GLPRT_TDOLD(_i) (0x00381280 + ((_i) * 8))
|
||||
#define GLPRT_UPRCH(_i) (0x00381304 + ((_i) * 8))
|
||||
#define GLPRT_UPRCL(_i) (0x00381300 + ((_i) * 8))
|
||||
|
|
|
@ -3251,6 +3251,8 @@ static void ice_update_pf_stats(struct ice_pf *pf)
|
|||
ice_stat_update32(hw, GLPRT_LXOFFTXC(pf_id), pf->stat_prev_loaded,
|
||||
&prev_ps->link_xoff_tx, &cur_ps->link_xoff_tx);
|
||||
|
||||
ice_update_dcb_stats(pf);
|
||||
|
||||
ice_stat_update32(hw, GLPRT_CRCERRS(pf_id), pf->stat_prev_loaded,
|
||||
&prev_ps->crc_errors, &cur_ps->crc_errors);
|
||||
|
||||
|
|
|
@ -477,6 +477,11 @@ struct ice_hw_port_stats {
|
|||
u64 link_xoff_rx; /* lxoffrxc */
|
||||
u64 link_xon_tx; /* lxontxc */
|
||||
u64 link_xoff_tx; /* lxofftxc */
|
||||
u64 priority_xon_rx[8]; /* pxonrxc[8] */
|
||||
u64 priority_xoff_rx[8]; /* pxoffrxc[8] */
|
||||
u64 priority_xon_tx[8]; /* pxontxc[8] */
|
||||
u64 priority_xoff_tx[8]; /* pxofftxc[8] */
|
||||
u64 priority_xon_2_xoff[8]; /* pxon2offc[8] */
|
||||
u64 rx_size_64; /* prc64 */
|
||||
u64 rx_size_127; /* prc127 */
|
||||
u64 rx_size_255; /* prc255 */
|
||||
|
|
Loading…
Reference in New Issue