nfp: add support restart of link auto-negotiation
authorFei Qin <fei.qin@corigine.com>
Thu, 29 Sep 2022 08:58:32 +0000 (10:58 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 1 Oct 2022 01:47:53 +0000 (18:47 -0700)
Add support restart of link auto-negotiation.
This may be initiated using:

  # ethtool -r <intf>

Signed-off-by: Fei Qin <fei.qin@corigine.com>
Signed-off-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c

index 678cea0..22a5d24 100644 (file)
@@ -228,6 +228,37 @@ nfp_net_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
        nfp_get_drvinfo(nn->app, nn->pdev, vnic_version, drvinfo);
 }
 
+static int
+nfp_net_nway_reset(struct net_device *netdev)
+{
+       struct nfp_eth_table_port *eth_port;
+       struct nfp_port *port;
+       int err;
+
+       port = nfp_port_from_netdev(netdev);
+       eth_port = nfp_port_get_eth_port(port);
+       if (!eth_port)
+               return -EOPNOTSUPP;
+
+       if (!netif_running(netdev))
+               return 0;
+
+       err = nfp_eth_set_configured(port->app->cpp, eth_port->index, false);
+       if (err) {
+               netdev_info(netdev, "Link down failed: %d\n", err);
+               return err;
+       }
+
+       err = nfp_eth_set_configured(port->app->cpp, eth_port->index, true);
+       if (err) {
+               netdev_info(netdev, "Link up failed: %d\n", err);
+               return err;
+       }
+
+       netdev_info(netdev, "Link reset succeeded\n");
+       return 0;
+}
+
 static void
 nfp_app_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
 {
@@ -1841,6 +1872,7 @@ static const struct ethtool_ops nfp_net_ethtool_ops = {
                                     ETHTOOL_COALESCE_MAX_FRAMES |
                                     ETHTOOL_COALESCE_USE_ADAPTIVE,
        .get_drvinfo            = nfp_net_get_drvinfo,
+       .nway_reset             = nfp_net_nway_reset,
        .get_link               = ethtool_op_get_link,
        .get_ringparam          = nfp_net_get_ringparam,
        .set_ringparam          = nfp_net_set_ringparam,
@@ -1878,6 +1910,7 @@ static const struct ethtool_ops nfp_net_ethtool_ops = {
 
 const struct ethtool_ops nfp_port_ethtool_ops = {
        .get_drvinfo            = nfp_app_get_drvinfo,
+       .nway_reset             = nfp_net_nway_reset,
        .get_link               = ethtool_op_get_link,
        .get_strings            = nfp_port_get_strings,
        .get_ethtool_stats      = nfp_port_get_stats,