ipq40xx: refresh ess driver and phy with new api
[openwrt/openwrt.git] / target / linux / ipq40xx / files / drivers / net / ethernet / qualcomm / essedma / edma_ethtool.c
index 1270e20a90cc115f097fd40b675808913701c407..65706cfae12ae80d25c733d8acfc0cce0123f640 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/ethtool.h>
 #include <linux/netdevice.h>
 #include <linux/string.h>
+#include <linux/version.h>
 #include "edma.h"
 
 struct edma_ethtool_stats {
@@ -186,55 +187,15 @@ static int edma_get_settings(struct net_device *netdev,
        struct edma_adapter *adapter = netdev_priv(netdev);
 
        if (adapter->poll_required) {
-               struct phy_device *phydev = NULL;
-               uint16_t phyreg;
-
                if ((adapter->forced_speed != SPEED_UNKNOWN)
                        && !(adapter->poll_required))
                        return -EPERM;
 
-               phydev = adapter->phydev;
-
-               linkmode_copy(cmd->link_modes.advertising, phydev->advertising);
-               linkmode_copy(cmd->link_modes.supported, phydev->supported);
-
-               cmd->base.autoneg = phydev->autoneg;
-
-               if (adapter->link_state == __EDMA_LINKDOWN) {
-                       cmd->base.speed =  SPEED_UNKNOWN;
-                       cmd->base.duplex = DUPLEX_UNKNOWN;
-               } else {
-                       cmd->base.speed = phydev->speed;
-                       cmd->base.duplex = phydev->duplex;
-               }
-
-               cmd->base.phy_address = adapter->phy_mdio_addr;
-
-               phyreg = (uint16_t)phy_read(adapter->phydev, MII_LPA);
-               if (phyreg & LPA_10HALF)
-                       linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, 
-                                                               cmd->link_modes.lp_advertising);
-
-               if (phyreg & LPA_10FULL)
-                       linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, 
-                                                               cmd->link_modes.lp_advertising);
-
-               if (phyreg & LPA_100HALF)
-                       linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, 
-                                                               cmd->link_modes.lp_advertising);
-
-               if (phyreg & LPA_100FULL)
-                       linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, 
-                                                               cmd->link_modes.lp_advertising);
-
-               phyreg = (uint16_t)phy_read(adapter->phydev, MII_STAT1000);
-               if (phyreg & LPA_1000HALF)
-                       linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, 
-                                                               cmd->link_modes.lp_advertising);
-
-               if (phyreg & LPA_1000FULL)
-                       linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, 
-                                                               cmd->link_modes.lp_advertising);
+               phy_ethtool_ksettings_get(adapter->phydev, cmd);
+               if (linkmode_test_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, adapter->phydev->advertising))
+                       cmd->base.port = PORT_FIBRE;
+               else
+                       cmd->base.port = PORT_TP;
        } else {
                /* If the speed/duplex for this GMAC is forced and we
                 * are not polling for link state changes, return the
@@ -272,29 +233,25 @@ static int edma_set_settings(struct net_device *netdev,
                            const struct ethtool_link_ksettings *cmd)
 {
        struct edma_adapter *adapter = netdev_priv(netdev);
-       struct phy_device *phydev = NULL;
 
        if ((adapter->forced_speed != SPEED_UNKNOWN) &&
             !adapter->poll_required)
                return -EPERM;
 
-       phydev = adapter->phydev;
-       linkmode_copy(phydev->advertising, cmd->link_modes.advertising);
-       linkmode_copy(phydev->supported, cmd->link_modes.supported);
-       phydev->autoneg = cmd->base.autoneg;
-       phydev->speed = cmd->base.speed;
-       phydev->duplex = cmd->base.duplex;
-
-       genphy_config_aneg(phydev);
-
-       return 0;
+       return phy_ethtool_ksettings_set(adapter->phydev, cmd);
 }
 
 /* edma_get_coalesce
  *     get interrupt mitigation
  */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
+static int edma_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
+#else
 static int edma_get_coalesce(struct net_device *netdev,
                             struct ethtool_coalesce *ec)
+#endif
 {
        u32 reg_val;
 
@@ -315,8 +272,14 @@ static int edma_get_coalesce(struct net_device *netdev,
 /* edma_set_coalesce
  *     set interrupt mitigation
  */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
+static int edma_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec,
+                            struct kernel_ethtool_coalesce *kernel_coal,
+                            struct netlink_ext_ack *extack)
+#else
 static int edma_set_coalesce(struct net_device *netdev,
                             struct ethtool_coalesce *ec)
+#endif
 {
        if (ec->tx_coalesce_usecs)
                edma_change_tx_coalesce(ec->tx_coalesce_usecs);
@@ -358,6 +321,9 @@ static void edma_get_ringparam(struct net_device *netdev,
 /* Ethtool operations
  */
 static const struct ethtool_ops edma_ethtool_ops = {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,7,0)
+       .supported_coalesce_params = ETHTOOL_COALESCE_USECS,
+#endif
        .get_drvinfo = &edma_get_drvinfo,
        .get_link = &ethtool_op_get_link,
        .get_msglevel = &edma_get_msglevel,