aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/marvell/prestera/prestera_main.c
diff options
context:
space:
mode:
authorVadym Kochan <vadym.kochan@plvision.eu>2020-09-16 19:31:00 +0300
committerDavid S. Miller <davem@davemloft.net>2020-09-17 16:35:47 -0700
commita97d3c69399d35c792b65b49f812f99fd5731dba (patch)
tree764a899a2f9ced340193a845cd813f9c68ad0678 /drivers/net/ethernet/marvell/prestera/prestera_main.c
parentnet: marvell: prestera: Add basic devlink support (diff)
downloadlinux-dev-a97d3c69399d35c792b65b49f812f99fd5731dba.tar.xz
linux-dev-a97d3c69399d35c792b65b49f812f99fd5731dba.zip
net: marvell: prestera: Add ethtool interface support
The ethtool API provides support for the configuration of the following features: speed and duplex, auto-negotiation, MDI-x, forward error correction, port media type. The API also provides information about the port status, hardware and software statistic. The following limitation exists: - port media type should be configured before speed setting - ethtool -m option is not supported - ethtool -p option is not supported - ethtool -r option is supported for RJ45 port only - the following combination of parameters is not supported: ethtool -s sw1pX port XX autoneg on - forward error correction feature is supported only on SFP ports, 10G speed - auto-negotiation and MDI-x features are not supported on Copper-to-Fiber SFP module Co-developed-by: Andrii Savka <andrii.savka@plvision.eu> Signed-off-by: Andrii Savka <andrii.savka@plvision.eu> Co-developed-by: Serhiy Boiko <serhiy.boiko@plvision.eu> Signed-off-by: Serhiy Boiko <serhiy.boiko@plvision.eu> Signed-off-by: Vadym Kochan <vadym.kochan@plvision.eu> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to '')
-rw-r--r--drivers/net/ethernet/marvell/prestera/prestera_main.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_main.c b/drivers/net/ethernet/marvell/prestera/prestera_main.c
index 47cd2bc367bf..bb51ee5646cd 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_main.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_main.c
@@ -13,6 +13,7 @@
#include "prestera_hw.h"
#include "prestera_rxtx.h"
#include "prestera_devlink.h"
+#include "prestera_ethtool.h"
#define PRESTERA_MTU_DEFAULT 1536
@@ -190,22 +191,38 @@ static const struct net_device_ops prestera_netdev_ops = {
.ndo_get_devlink_port = prestera_devlink_get_port,
};
-static int prestera_port_autoneg_set(struct prestera_port *port, bool enable,
- u64 link_modes, u8 fec)
+int prestera_port_autoneg_set(struct prestera_port *port, bool enable,
+ u64 adver_link_modes, u8 adver_fec)
{
bool refresh = false;
+ u64 link_modes;
int err;
+ u8 fec;
if (port->caps.type != PRESTERA_PORT_TYPE_TP)
return enable ? -EINVAL : 0;
- if (port->adver_link_modes != link_modes || port->adver_fec != fec) {
- port->adver_fec = fec ?: BIT(PRESTERA_PORT_FEC_OFF);
+ if (!enable)
+ goto set_autoneg;
+
+ link_modes = port->caps.supp_link_modes & adver_link_modes;
+ fec = port->caps.supp_fec & adver_fec;
+
+ if (!link_modes && !fec)
+ return -EOPNOTSUPP;
+
+ if (link_modes && port->adver_link_modes != link_modes) {
port->adver_link_modes = link_modes;
refresh = true;
}
- if (port->autoneg == enable && !(port->autoneg && refresh))
+ if (fec && port->adver_fec != fec) {
+ port->adver_fec = fec;
+ refresh = true;
+ }
+
+set_autoneg:
+ if (port->autoneg == enable && !refresh)
return 0;
err = prestera_hw_port_autoneg_set(port, enable, port->adver_link_modes,
@@ -261,6 +278,7 @@ static int prestera_port_create(struct prestera_switch *sw, u32 id)
dev->features |= NETIF_F_NETNS_LOCAL;
dev->netdev_ops = &prestera_netdev_ops;
+ dev->ethtool_ops = &prestera_ethtool_ops;
netif_carrier_off(dev);