Configure phylink to work with the PHYs in the AX88197A controllers and provide ethtool get/set eee operations calling into phylink. Signed-off-by: Birger Koblitz --- drivers/net/usb/ax88179a_devices.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/net/usb/ax88179a_devices.c b/drivers/net/usb/ax88179a_devices.c index 835d1c369b533929e92175f8223c728ffcc8d168..2bd6e181dfbe319e569fa3d6325fd45ea0b9c732 100644 --- a/drivers/net/usb/ax88179a_devices.c +++ b/drivers/net/usb/ax88179a_devices.c @@ -222,6 +222,26 @@ static int ax88179a_get_eeprom_len(struct net_device *net) return AX88179A_EEPROM_LEN; } +static int ax88179a_get_eee(struct net_device *net, struct ethtool_keee *edata) +{ + struct usbnet *dev = netdev_priv(net); + struct ax88179_data *ax179_data; + + ax179_data = dev->driver_priv; + + return phylink_ethtool_get_eee(ax179_data->phylink, edata); +} + +static int ax88179a_set_eee(struct net_device *net, struct ethtool_keee *edata) +{ + struct usbnet *dev = netdev_priv(net); + struct ax88179_data *ax179_data; + + ax179_data = dev->driver_priv; + + return phylink_ethtool_set_eee(ax179_data->phylink, edata); +} + static const struct ethtool_ops ax88179a_ethtool_ops = { .get_link = ethtool_op_get_link, .get_msglevel = usbnet_get_msglevel, @@ -231,6 +251,8 @@ static const struct ethtool_ops ax88179a_ethtool_ops = { .get_eeprom_len = ax88179a_get_eeprom_len, .get_eeprom = ax88179_get_eeprom, .set_eeprom = ax88179_set_eeprom, + .get_eee = ax88179a_get_eee, + .set_eee = ax88179a_set_eee, .nway_reset = usbnet_nway_reset, .get_link_ksettings = phy_ethtool_get_link_ksettings, .set_link_ksettings = phy_ethtool_set_link_ksettings, @@ -440,10 +462,19 @@ static int ax88179a_phylink_setup(struct usbnet *dev) else data->phylink_config.mac_capabilities |= MAC_1000 | MAC_2500FD; + if (!data->is_ax88772d) { + data->phylink_config.lpi_capabilities = MAC_100FD | MAC_1000FD; + data->phylink_config.eee_enabled_default = true; + netdev_info(dev->net, "Default: EEE\n"); + } __set_bit(PHY_INTERFACE_MODE_INTERNAL, data->phylink_config.supported_interfaces); phy_if_mode = PHY_INTERFACE_MODE_INTERNAL; + memcpy(data->phylink_config.lpi_interfaces, + data->phylink_config.supported_interfaces, + sizeof(data->phylink_config.lpi_interfaces)); + phylink = phylink_create(&data->phylink_config, dev->net->dev.fwnode, phy_if_mode, &ax88179a_phylink_mac_ops); if (IS_ERR(phylink)) -- 2.47.3