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)
 {
                                     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,
 
 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,