From d25abf4e7a93d78cd01475a68296dd9f2dfbe35f Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Sun, 15 Mar 2020 21:26:00 +0800 Subject: [PATCH] ipq40xx: 5.4: fix ethernet driver In 5.4 kernel old u32 array way of setting network features was dropped and linkmode is now the only way. So lets migrate the PHY driver to support linkmode. Also, now in order for gigabit to work, PHY driver needs to advertise PHY_GBIT_FEATURES instead of PHY_BASIC_FEATURES Signed-off-by: Robert Marko --- .../ethernet/qualcomm/essedma/edma_ethtool.c | 65 ++++++++++--------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/target/linux/ipq40xx/files-5.4/drivers/net/ethernet/qualcomm/essedma/edma_ethtool.c b/target/linux/ipq40xx/files-5.4/drivers/net/ethernet/qualcomm/essedma/edma_ethtool.c index 8f6e3833b6..b35792546d 100644 --- a/target/linux/ipq40xx/files-5.4/drivers/net/ethernet/qualcomm/essedma/edma_ethtool.c +++ b/target/linux/ipq40xx/files-5.4/drivers/net/ethernet/qualcomm/essedma/edma_ethtool.c @@ -180,9 +180,8 @@ static uint32_t edma_get_msglevel(struct net_device *netdev) /* edma_get_settings() * Get edma settings */ -#if 0 static int edma_get_settings(struct net_device *netdev, - struct ethtool_cmd *ecmd) + struct ethtool_link_ksettings *cmd) { struct edma_adapter *adapter = netdev_priv(netdev); @@ -196,38 +195,46 @@ static int edma_get_settings(struct net_device *netdev, phydev = adapter->phydev; - ecmd->advertising = phydev->advertising; - ecmd->autoneg = phydev->autoneg; + 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) { - ecmd->speed = SPEED_UNKNOWN; - ecmd->duplex = DUPLEX_UNKNOWN; + cmd->base.speed = SPEED_UNKNOWN; + cmd->base.duplex = DUPLEX_UNKNOWN; } else { - ecmd->speed = phydev->speed; - ecmd->duplex = phydev->duplex; + cmd->base.speed = phydev->speed; + cmd->base.duplex = phydev->duplex; } - ecmd->phy_address = adapter->phy_mdio_addr; + cmd->base.phy_address = adapter->phy_mdio_addr; phyreg = (uint16_t)phy_read(adapter->phydev, MII_LPA); if (phyreg & LPA_10HALF) - ecmd->lp_advertising |= ADVERTISED_10baseT_Half; + linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, + cmd->link_modes.lp_advertising); if (phyreg & LPA_10FULL) - ecmd->lp_advertising |= ADVERTISED_10baseT_Full; + linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, + cmd->link_modes.lp_advertising); if (phyreg & LPA_100HALF) - ecmd->lp_advertising |= ADVERTISED_100baseT_Half; + linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, + cmd->link_modes.lp_advertising); if (phyreg & LPA_100FULL) - ecmd->lp_advertising |= ADVERTISED_100baseT_Full; + 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) - ecmd->lp_advertising |= ADVERTISED_1000baseT_Half; + linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, + cmd->link_modes.lp_advertising); if (phyreg & LPA_1000FULL) - ecmd->lp_advertising |= ADVERTISED_1000baseT_Full; + linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, + cmd->link_modes.lp_advertising); } else { /* If the speed/duplex for this GMAC is forced and we * are not polling for link state changes, return the @@ -238,14 +245,14 @@ static int edma_get_settings(struct net_device *netdev, if (!(adapter->poll_required)) { if (adapter->forced_speed != SPEED_UNKNOWN) { /* set speed and duplex */ - ethtool_cmd_speed_set(ecmd, SPEED_1000); - ecmd->duplex = DUPLEX_FULL; + cmd->base.speed = SPEED_1000; + cmd->base.duplex = DUPLEX_FULL; /* Populate capabilities advertised by self */ - ecmd->advertising = 0; - ecmd->autoneg = 0; - ecmd->port = PORT_TP; - ecmd->transceiver = XCVR_EXTERNAL; + linkmode_zero(cmd->link_modes.advertising); + cmd->base.autoneg = 0; + cmd->base.port = PORT_TP; + cmd->base.transceiver = XCVR_EXTERNAL; } else { /* non link polled and non * forced speed/duplex interface @@ -262,7 +269,7 @@ static int edma_get_settings(struct net_device *netdev, * Set EDMA settings */ static int edma_set_settings(struct net_device *netdev, - struct ethtool_cmd *ecmd) + const struct ethtool_link_ksettings *cmd) { struct edma_adapter *adapter = netdev_priv(netdev); struct phy_device *phydev = NULL; @@ -272,16 +279,16 @@ static int edma_set_settings(struct net_device *netdev, return -EPERM; phydev = adapter->phydev; - phydev->advertising = ecmd->advertising; - phydev->autoneg = ecmd->autoneg; - phydev->speed = ethtool_cmd_speed(ecmd); - phydev->duplex = ecmd->duplex; + 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; } -#endif /* edma_get_coalesce * get interrupt mitigation @@ -356,8 +363,8 @@ static const struct ethtool_ops edma_ethtool_ops = { .get_msglevel = &edma_get_msglevel, .nway_reset = &edma_nway_reset, .get_wol = &edma_get_wol, -// .get_settings = &edma_get_settings, -// .set_settings = &edma_set_settings, + .get_link_ksettings = &edma_get_settings, + .set_link_ksettings = &edma_set_settings, .get_strings = &edma_get_strings, .get_sset_count = &edma_get_strset_count, .get_ethtool_stats = &edma_get_ethtool_stats,