phydev_err(phydev, "Error while aborting cable test");
 }
 
+int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data)
+{
+       if (!phydev->drv)
+               return -EIO;
+
+       mutex_lock(&phydev->lock);
+       phydev->drv->get_strings(phydev, data);
+       mutex_unlock(&phydev->lock);
+
+       return 0;
+}
+EXPORT_SYMBOL(phy_ethtool_get_strings);
+
+int phy_ethtool_get_sset_count(struct phy_device *phydev)
+{
+       int ret;
+
+       if (!phydev->drv)
+               return -EIO;
+
+       if (phydev->drv->get_sset_count &&
+           phydev->drv->get_strings &&
+           phydev->drv->get_stats) {
+               mutex_lock(&phydev->lock);
+               ret = phydev->drv->get_sset_count(phydev);
+               mutex_unlock(&phydev->lock);
+
+               return ret;
+       }
+
+       return -EOPNOTSUPP;
+}
+EXPORT_SYMBOL(phy_ethtool_get_sset_count);
+
+int phy_ethtool_get_stats(struct phy_device *phydev,
+                         struct ethtool_stats *stats, u64 *data)
+{
+       if (!phydev->drv)
+               return -EIO;
+
+       mutex_lock(&phydev->lock);
+       phydev->drv->get_stats(phydev, stats, data);
+       mutex_unlock(&phydev->lock);
+
+       return 0;
+}
+EXPORT_SYMBOL(phy_ethtool_get_stats);
+
 int phy_start_cable_test(struct phy_device *phydev,
                         struct netlink_ext_ack *extack)
 {
 
 void mdio_bus_exit(void);
 #endif
 
-/* Inline function for use within net/core/ethtool.c (built-in) */
-static inline int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data)
-{
-       if (!phydev->drv)
-               return -EIO;
-
-       mutex_lock(&phydev->lock);
-       phydev->drv->get_strings(phydev, data);
-       mutex_unlock(&phydev->lock);
-
-       return 0;
-}
-
-static inline int phy_ethtool_get_sset_count(struct phy_device *phydev)
-{
-       int ret;
-
-       if (!phydev->drv)
-               return -EIO;
-
-       if (phydev->drv->get_sset_count &&
-           phydev->drv->get_strings &&
-           phydev->drv->get_stats) {
-               mutex_lock(&phydev->lock);
-               ret = phydev->drv->get_sset_count(phydev);
-               mutex_unlock(&phydev->lock);
-
-               return ret;
-       }
-
-       return -EOPNOTSUPP;
-}
-
-static inline int phy_ethtool_get_stats(struct phy_device *phydev,
-                                       struct ethtool_stats *stats, u64 *data)
-{
-       if (!phydev->drv)
-               return -EIO;
-
-       mutex_lock(&phydev->lock);
-       phydev->drv->get_stats(phydev, stats, data);
-       mutex_unlock(&phydev->lock);
-
-       return 0;
-}
+int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data);
+int phy_ethtool_get_sset_count(struct phy_device *phydev);
+int phy_ethtool_get_stats(struct phy_device *phydev,
+                         struct ethtool_stats *stats, u64 *data);
 
 static inline int phy_package_read(struct phy_device *phydev, u32 regnum)
 {
 
 
 static int __ethtool_get_sset_count(struct net_device *dev, int sset)
 {
+       const struct ethtool_phy_ops *phy_ops = ethtool_phy_ops;
        const struct ethtool_ops *ops = dev->ethtool_ops;
 
        if (sset == ETH_SS_FEATURES)
                return ARRAY_SIZE(phy_tunable_strings);
 
        if (sset == ETH_SS_PHY_STATS && dev->phydev &&
-           !ops->get_ethtool_phy_stats)
-               return phy_ethtool_get_sset_count(dev->phydev);
+           !ops->get_ethtool_phy_stats &&
+           phy_ops && phy_ops->get_sset_count)
+               return phy_ops->get_sset_count(dev->phydev);
 
        if (sset == ETH_SS_LINK_MODES)
                return __ETHTOOL_LINK_MODE_MASK_NBITS;
 static void __ethtool_get_strings(struct net_device *dev,
        u32 stringset, u8 *data)
 {
+       const struct ethtool_phy_ops *phy_ops = ethtool_phy_ops;
        const struct ethtool_ops *ops = dev->ethtool_ops;
 
        if (stringset == ETH_SS_FEATURES)
        else if (stringset == ETH_SS_PHY_TUNABLES)
                memcpy(data, phy_tunable_strings, sizeof(phy_tunable_strings));
        else if (stringset == ETH_SS_PHY_STATS && dev->phydev &&
-                !ops->get_ethtool_phy_stats)
-               phy_ethtool_get_strings(dev->phydev, data);
+                !ops->get_ethtool_phy_stats && phy_ops &&
+                phy_ops->get_strings)
+               phy_ops->get_strings(dev->phydev, data);
        else if (stringset == ETH_SS_LINK_MODES)
                memcpy(data, link_mode_names,
                       __ETHTOOL_LINK_MODE_MASK_NBITS * ETH_GSTRING_LEN);
 
 static int ethtool_get_phy_stats(struct net_device *dev, void __user *useraddr)
 {
+       const struct ethtool_phy_ops *phy_ops = ethtool_phy_ops;
        const struct ethtool_ops *ops = dev->ethtool_ops;
        struct phy_device *phydev = dev->phydev;
        struct ethtool_stats stats;
        if (!phydev && (!ops->get_ethtool_phy_stats || !ops->get_sset_count))
                return -EOPNOTSUPP;
 
-       if (dev->phydev && !ops->get_ethtool_phy_stats)
-               n_stats = phy_ethtool_get_sset_count(dev->phydev);
+       if (dev->phydev && !ops->get_ethtool_phy_stats &&
+           phy_ops && phy_ops->get_sset_count)
+               n_stats = phy_ops->get_sset_count(dev->phydev);
        else
                n_stats = ops->get_sset_count(dev, ETH_SS_PHY_STATS);
        if (n_stats < 0)
                if (!data)
                        return -ENOMEM;
 
-               if (dev->phydev && !ops->get_ethtool_phy_stats) {
-                       ret = phy_ethtool_get_stats(dev->phydev, &stats, data);
+               if (dev->phydev && !ops->get_ethtool_phy_stats &&
+                   phy_ops && phy_ops->get_stats) {
+                       ret = phy_ops->get_stats(dev->phydev, &stats, data);
                        if (ret < 0)
                                goto out;
                } else {
 
 static int strset_prepare_set(struct strset_info *info, struct net_device *dev,
                              unsigned int id, bool counts_only)
 {
+       const struct ethtool_phy_ops *phy_ops = ethtool_phy_ops;
        const struct ethtool_ops *ops = dev->ethtool_ops;
        void *strings;
        int count, ret;
 
        if (id == ETH_SS_PHY_STATS && dev->phydev &&
-           !ops->get_ethtool_phy_stats)
-               ret = phy_ethtool_get_sset_count(dev->phydev);
+           !ops->get_ethtool_phy_stats && phy_ops &&
+           phy_ops->get_sset_count)
+               ret = phy_ops->get_sset_count(dev->phydev);
        else if (ops->get_sset_count && ops->get_strings)
                ret = ops->get_sset_count(dev, id);
        else
                if (!strings)
                        return -ENOMEM;
                if (id == ETH_SS_PHY_STATS && dev->phydev &&
-                   !ops->get_ethtool_phy_stats)
-                       phy_ethtool_get_strings(dev->phydev, strings);
+                   !ops->get_ethtool_phy_stats && phy_ops &&
+                   phy_ops->get_strings)
+                       phy_ops->get_strings(dev->phydev, strings);
                else
                        ops->get_strings(dev, id, strings);
                info->strings = strings;