diff options
Diffstat (limited to 'drivers/net/ethernet/intel/i40e/i40e_ethtool.c')
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 73 | 
1 files changed, 54 insertions, 19 deletions
| diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c index c70dec65a572..040a01400b85 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c @@ -212,7 +212,7 @@ static void __i40e_add_stat_strings(u8 **p, const struct i40e_stats stats[],  }  /** - * 40e_add_stat_strings - copy stat strings into ethtool buffer + * i40e_add_stat_strings - copy stat strings into ethtool buffer   * @p: ethtool supplied buffer   * @stats: stat definitions array   * @@ -232,6 +232,8 @@ static void __i40e_add_stat_strings(u8 **p, const struct i40e_stats stats[],  	I40E_STAT(struct i40e_vsi, _name, _stat)  #define I40E_VEB_STAT(_name, _stat) \  	I40E_STAT(struct i40e_veb, _name, _stat) +#define I40E_VEB_TC_STAT(_name, _stat) \ +	I40E_STAT(struct i40e_cp_veb_tc_stats, _name, _stat)  #define I40E_PFC_STAT(_name, _stat) \  	I40E_STAT(struct i40e_pfc_stats, _name, _stat)  #define I40E_QUEUE_STAT(_name, _stat) \ @@ -266,11 +268,18 @@ static const struct i40e_stats i40e_gstrings_veb_stats[] = {  	I40E_VEB_STAT("veb.rx_unknown_protocol", stats.rx_unknown_protocol),  }; +struct i40e_cp_veb_tc_stats { +	u64 tc_rx_packets; +	u64 tc_rx_bytes; +	u64 tc_tx_packets; +	u64 tc_tx_bytes; +}; +  static const struct i40e_stats i40e_gstrings_veb_tc_stats[] = { -	I40E_VEB_STAT("veb.tc_%u_tx_packets", tc_stats.tc_tx_packets), -	I40E_VEB_STAT("veb.tc_%u_tx_bytes", tc_stats.tc_tx_bytes), -	I40E_VEB_STAT("veb.tc_%u_rx_packets", tc_stats.tc_rx_packets), -	I40E_VEB_STAT("veb.tc_%u_rx_bytes", tc_stats.tc_rx_bytes), +	I40E_VEB_TC_STAT("veb.tc_%u_tx_packets", tc_tx_packets), +	I40E_VEB_TC_STAT("veb.tc_%u_tx_bytes", tc_tx_bytes), +	I40E_VEB_TC_STAT("veb.tc_%u_rx_packets", tc_rx_packets), +	I40E_VEB_TC_STAT("veb.tc_%u_rx_bytes", tc_rx_bytes),  };  static const struct i40e_stats i40e_gstrings_misc_stats[] = { @@ -1101,6 +1110,7 @@ static int i40e_get_link_ksettings(struct net_device *netdev,  	/* Set flow control settings */  	ethtool_link_ksettings_add_link_mode(ks, supported, Pause); +	ethtool_link_ksettings_add_link_mode(ks, supported, Asym_Pause);  	switch (hw->fc.requested_mode) {  	case I40E_FC_FULL: @@ -2217,6 +2227,29 @@ static int i40e_get_sset_count(struct net_device *netdev, int sset)  }  /** + * i40e_get_veb_tc_stats - copy VEB TC statistics to formatted structure + * @tc: the TC statistics in VEB structure (veb->tc_stats) + * @i: the index of traffic class in (veb->tc_stats) structure to copy + * + * Copy VEB TC statistics from structure of arrays (veb->tc_stats) to + * one dimensional structure i40e_cp_veb_tc_stats. + * Produce formatted i40e_cp_veb_tc_stats structure of the VEB TC + * statistics for the given TC. + **/ +static struct i40e_cp_veb_tc_stats +i40e_get_veb_tc_stats(struct i40e_veb_tc_stats *tc, unsigned int i) +{ +	struct i40e_cp_veb_tc_stats veb_tc = { +		.tc_rx_packets = tc->tc_rx_packets[i], +		.tc_rx_bytes = tc->tc_rx_bytes[i], +		.tc_tx_packets = tc->tc_tx_packets[i], +		.tc_tx_bytes = tc->tc_tx_bytes[i], +	}; + +	return veb_tc; +} + +/**   * i40e_get_pfc_stats - copy HW PFC statistics to formatted structure   * @pf: the PF device structure   * @i: the priority value to copy @@ -2300,8 +2333,16 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,  			       i40e_gstrings_veb_stats);  	for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) -		i40e_add_ethtool_stats(&data, veb_stats ? veb : NULL, -				       i40e_gstrings_veb_tc_stats); +		if (veb_stats) { +			struct i40e_cp_veb_tc_stats veb_tc = +				i40e_get_veb_tc_stats(&veb->tc_stats, i); + +			i40e_add_ethtool_stats(&data, &veb_tc, +					       i40e_gstrings_veb_tc_stats); +		} else { +			i40e_add_ethtool_stats(&data, NULL, +					       i40e_gstrings_veb_tc_stats); +		}  	i40e_add_ethtool_stats(&data, pf, i40e_gstrings_stats); @@ -2368,21 +2409,15 @@ static void i40e_get_priv_flag_strings(struct net_device *netdev, u8 *data)  	struct i40e_netdev_priv *np = netdev_priv(netdev);  	struct i40e_vsi *vsi = np->vsi;  	struct i40e_pf *pf = vsi->back; -	char *p = (char *)data;  	unsigned int i; +	u8 *p = data; -	for (i = 0; i < I40E_PRIV_FLAGS_STR_LEN; i++) { -		snprintf(p, ETH_GSTRING_LEN, "%s", -			 i40e_gstrings_priv_flags[i].flag_string); -		p += ETH_GSTRING_LEN; -	} +	for (i = 0; i < I40E_PRIV_FLAGS_STR_LEN; i++) +		ethtool_sprintf(&p, i40e_gstrings_priv_flags[i].flag_string);  	if (pf->hw.pf_id != 0)  		return; -	for (i = 0; i < I40E_GL_PRIV_FLAGS_STR_LEN; i++) { -		snprintf(p, ETH_GSTRING_LEN, "%s", -			 i40e_gl_gstrings_priv_flags[i].flag_string); -		p += ETH_GSTRING_LEN; -	} +	for (i = 0; i < I40E_GL_PRIV_FLAGS_STR_LEN; i++) +		ethtool_sprintf(&p, i40e_gl_gstrings_priv_flags[i].flag_string);  }  static void i40e_get_strings(struct net_device *netdev, u32 stringset, @@ -5439,7 +5474,7 @@ static int i40e_get_module_eeprom(struct net_device *netdev,  		status = i40e_aq_get_phy_register(hw,  				I40E_AQ_PHY_REG_ACCESS_EXTERNAL_MODULE, -				true, addr, offset, &value, NULL); +				addr, true, offset, &value, NULL);  		if (status)  			return -EIO;  		data[i] = value; | 
