net: sparx5: add ethtool configuration and statistics support
This adds statistic counters for the network interfaces provided by the driver. It also adds CPU port counters (which are not exposed by ethtool). This also adds support for configuring the network interface parameters via ethtool: speed, duplex, aneg etc. Signed-off-by: Steen Hegelund <steen.hegelund@microchip.com> Signed-off-by: Bjarni Jonasson <bjarni.jonasson@microchip.com> Signed-off-by: Lars Povlsen <lars.povlsen@microchip.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0a9d48ad0d
commit
af4b11022e
@ -7,4 +7,4 @@ obj-$(CONFIG_SPARX5_SWITCH) += sparx5-switch.o
|
||||
|
||||
sparx5-switch-objs := sparx5_main.o sparx5_packet.o \
|
||||
sparx5_netdev.o sparx5_phylink.o sparx5_port.o sparx5_mactable.o sparx5_vlan.o \
|
||||
sparx5_switchdev.o sparx5_calendar.o
|
||||
sparx5_switchdev.o sparx5_calendar.o sparx5_ethtool.o
|
||||
|
1227
drivers/net/ethernet/microchip/sparx5/sparx5_ethtool.c
Normal file
1227
drivers/net/ethernet/microchip/sparx5/sparx5_ethtool.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -614,6 +614,10 @@ static int sparx5_start(struct sparx5 *sparx5)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Init stats */
|
||||
err = sparx_stats_init(sparx5);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Init mact_sw struct */
|
||||
mutex_init(&sparx5->mact_lock);
|
||||
|
@ -135,6 +135,15 @@ struct sparx5 {
|
||||
/* port structures are in net device */
|
||||
struct sparx5_port *ports[SPX5_PORTS];
|
||||
enum sparx5_core_clockfreq coreclock;
|
||||
/* Statistics */
|
||||
u32 num_stats;
|
||||
u32 num_ethtool_stats;
|
||||
const char * const *stats_layout;
|
||||
u64 *stats;
|
||||
/* Workqueue for reading stats */
|
||||
struct mutex queue_stats_lock;
|
||||
struct delayed_work stats_work;
|
||||
struct workqueue_struct *stats_queue;
|
||||
/* Notifiers */
|
||||
struct notifier_block netdevice_nb;
|
||||
struct notifier_block switchdev_nb;
|
||||
@ -203,6 +212,10 @@ void sparx5_vlan_port_apply(struct sparx5 *sparx5, struct sparx5_port *port);
|
||||
int sparx5_config_auto_calendar(struct sparx5 *sparx5);
|
||||
int sparx5_config_dsm_calendar(struct sparx5 *sparx5);
|
||||
|
||||
/* sparx5_ethtool.c */
|
||||
void sparx5_get_stats64(struct net_device *ndev, struct rtnl_link_stats64 *stats);
|
||||
int sparx_stats_init(struct sparx5 *sparx5);
|
||||
|
||||
/* sparx5_netdev.c */
|
||||
bool sparx5_netdevice_check(const struct net_device *dev);
|
||||
struct net_device *sparx5_create_netdev(struct sparx5 *sparx5, u32 portno);
|
||||
@ -233,6 +246,7 @@ static inline bool sparx5_is_baser(phy_interface_t interface)
|
||||
|
||||
extern const struct phylink_mac_ops sparx5_phylink_mac_ops;
|
||||
extern const struct phylink_pcs_ops sparx5_phylink_pcs_ops;
|
||||
extern const struct ethtool_ops sparx5_ethtool_ops;
|
||||
|
||||
/* Calculate raw offset */
|
||||
static inline __pure int spx5_offset(int id, int tinst, int tcnt,
|
||||
|
@ -180,6 +180,7 @@ static const struct net_device_ops sparx5_port_netdev_ops = {
|
||||
.ndo_get_phys_port_name = sparx5_port_get_phys_port_name,
|
||||
.ndo_set_mac_address = sparx5_set_mac_address,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_get_stats64 = sparx5_get_stats64,
|
||||
.ndo_get_port_parent_id = sparx5_get_port_parent_id,
|
||||
};
|
||||
|
||||
@ -206,6 +207,7 @@ struct net_device *sparx5_create_netdev(struct sparx5 *sparx5, u32 portno)
|
||||
sparx5_set_port_ifh(spx5_port->ifh, portno);
|
||||
|
||||
ndev->netdev_ops = &sparx5_port_netdev_ops;
|
||||
ndev->ethtool_ops = &sparx5_ethtool_ops;
|
||||
|
||||
val = ether_addr_to_u64(sparx5->base_mac) + portno + 1;
|
||||
u64_to_ether_addr(val, ndev->dev_addr);
|
||||
|
Loading…
Reference in New Issue
Block a user