}
 }
 EXPORT_SYMBOL(wx_get_drvinfo);
+
+int wx_nway_reset(struct net_device *netdev)
+{
+       struct wx *wx = netdev_priv(netdev);
+
+       return phylink_ethtool_nway_reset(wx->phylink);
+}
+EXPORT_SYMBOL(wx_nway_reset);
+
+int wx_get_link_ksettings(struct net_device *netdev,
+                         struct ethtool_link_ksettings *cmd)
+{
+       struct wx *wx = netdev_priv(netdev);
+
+       return phylink_ethtool_ksettings_get(wx->phylink, cmd);
+}
+EXPORT_SYMBOL(wx_get_link_ksettings);
+
+int wx_set_link_ksettings(struct net_device *netdev,
+                         const struct ethtool_link_ksettings *cmd)
+{
+       struct wx *wx = netdev_priv(netdev);
+
+       return phylink_ethtool_ksettings_set(wx->phylink, cmd);
+}
+EXPORT_SYMBOL(wx_set_link_ksettings);
 
 void wx_get_pause_stats(struct net_device *netdev,
                        struct ethtool_pause_stats *stats);
 void wx_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *info);
+int wx_nway_reset(struct net_device *netdev);
+int wx_get_link_ksettings(struct net_device *netdev,
+                         struct ethtool_link_ksettings *cmd);
+int wx_set_link_ksettings(struct net_device *netdev,
+                         const struct ethtool_link_ksettings *cmd);
 #endif /* _WX_ETHTOOL_H_ */
 
 #include <linux/bitfield.h>
 #include <linux/netdevice.h>
 #include <linux/if_vlan.h>
+#include <linux/phylink.h>
 #include <net/ip.h>
 
 #define WX_NCSI_SUP                             0x8000
        int speed;
        int duplex;
        struct phy_device *phydev;
+       struct phylink *phylink;
+       struct phylink_config phylink_config;
 
        bool wol_hw_supported;
        bool ncsi_enabled;
 #define wx_dbg(wx, fmt, arg...) \
        dev_dbg(&(wx)->pdev->dev, fmt, ##arg)
 
+static inline struct wx *phylink_to_wx(struct phylink_config *config)
+{
+       return container_of(config, struct wx, phylink_config);
+}
+
 #endif /* _WX_TYPE_H_ */