Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp141853imj; Thu, 7 Feb 2019 01:52:04 -0800 (PST) X-Google-Smtp-Source: AHgI3IZAPChjzT4WJXgbYJcGOpF0T8Yg+jyXVwYzbt4ypxmrRLcidO3vY+M8RnH4sIxH0/YxFPzC X-Received: by 2002:a63:4d22:: with SMTP id a34mr12256404pgb.432.1549533124703; Thu, 07 Feb 2019 01:52:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549533124; cv=none; d=google.com; s=arc-20160816; b=0u3wjdD/pJ7EhmkL16bUStjpCHnFdggtK8BuUwU2JawAAXDTARl0Ms4qHGQelFUPEY lRnkmJ4BqLdEGUs+aJmAIWoyGa1GTFDFrD8eb2hMOSkKqbkjt8QfyghxvDbg/aJEf1rC LFt61tl2XREOZIyqlnJhmuLHYfyrLjMffyCS3OBTI83F03GTarkR6LaydOUypaHW/7Xf v1eiXlaN4fKkMDK3dFvt4T6f2Pj/8jRaiW6ZosuH63kJkLnH4psrsEAqOAnQ4ME+4EOf wy8CLtXnY121l1fc9S3Jl+E11zNgc9yIllqdlmJcvyyHrYuwovXmYST9nBmaTgFijqbQ Spew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=dUXuXAXIyb6MekBfVEBUS/K+wHTd5/RvolugcjttQMk=; b=evNWYuOxj0nq+P6syBxRA8p963J4Fe27wWpm0lh7TW22yU+Lg01dWtf173rh2m+bIS M4X9G8nw0m7omq6AsR+6OwntgsOcAidVELLkaPUQxTltOhm4JGjoafinRTyRfEe16O3U NM/3MsBl1c4o0WK/YVF/xFod4wy3F8Kjk4C50W/Hg3/4AujuY1otB7C2RKSPdUKpZeTM Q6QkRTYdNaGjtWtOFkD37WN0S77ofR/JLz7PHlnWkPQ+FzkfdyTUJlooYN4KbFGkU+IZ sFSgUVoC4GJ0wTS95apbsJNrjF94HHkr3JVdwWFv0yiiO/5nyEZrqVjVkQOdJF5qmxEY ZkdA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y27si6045347pgk.490.2019.02.07.01.51.49; Thu, 07 Feb 2019 01:52:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727019AbfBGJuH (ORCPT + 99 others); Thu, 7 Feb 2019 04:50:07 -0500 Received: from relay11.mail.gandi.net ([217.70.178.231]:59999 "EHLO relay11.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726804AbfBGJuF (ORCPT ); Thu, 7 Feb 2019 04:50:05 -0500 Received: from mc-bl-xps13.lan (aaubervilliers-681-1-80-177.w90-88.abo.wanadoo.fr [90.88.22.177]) (Authenticated sender: maxime.chevallier@bootlin.com) by relay11.mail.gandi.net (Postfix) with ESMTPSA id E9A4E100004; Thu, 7 Feb 2019 09:49:59 +0000 (UTC) From: Maxime Chevallier To: davem@davemloft.net Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Andrew Lunn , Florian Fainelli , Heiner Kallweit , Russell King , linux-arm-kernel@lists.infradead.org, Antoine Tenart , thomas.petazzoni@bootlin.com, gregory.clement@bootlin.com, miquel.raynal@bootlin.com, nadavh@marvell.com, stefanc@marvell.com, mw@semihalf.com Subject: [PATCH net-next v2 02/10] net: phy: Mask-out non-compatible modes when setting the max-speed Date: Thu, 7 Feb 2019 10:49:31 +0100 Message-Id: <20190207094939.27369-3-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190207094939.27369-1-maxime.chevallier@bootlin.com> References: <20190207094939.27369-1-maxime.chevallier@bootlin.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When setting a PHY's max speed using either the max-speed DT property or ethtool, we should mask-out all non-compatible modes according to the settings table, instead of just the 10/100BASET modes. Signed-off-by: Maxime Chevallier Suggested-by: Russell King --- drivers/net/phy/phy-core.c | 45 ++++++++++++++++++++++++++++++ drivers/net/phy/phy_device.c | 53 ------------------------------------ include/linux/phy.h | 1 + 3 files changed, 46 insertions(+), 53 deletions(-) diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c index 7d6aad287f84..8e54fe396553 100644 --- a/drivers/net/phy/phy-core.c +++ b/drivers/net/phy/phy-core.c @@ -4,6 +4,7 @@ */ #include #include +#include const char *phy_speed_to_str(int speed) { @@ -338,6 +339,50 @@ size_t phy_speeds(unsigned int *speeds, size_t size, return count; } +static int __set_phy_supported(struct phy_device *phydev, u32 max_speed) +{ + const struct phy_setting *p; + int i; + + for (i = 0, p = settings; i < ARRAY_SIZE(settings); i++, p++) { + if (p->speed > max_speed) + linkmode_clear_bit(p->bit, phydev->supported); + else + break; + } + + return 0; +} + +int phy_set_max_speed(struct phy_device *phydev, u32 max_speed) +{ + int err; + + err = __set_phy_supported(phydev, max_speed); + if (err) + return err; + + linkmode_copy(phydev->advertising, phydev->supported); + + return 0; +} +EXPORT_SYMBOL(phy_set_max_speed); + +void of_set_phy_supported(struct phy_device *phydev) +{ + struct device_node *node = phydev->mdio.dev.of_node; + u32 max_speed; + + if (!IS_ENABLED(CONFIG_OF_MDIO)) + return; + + if (!node) + return; + + if (!of_property_read_u32(node, "max-speed", &max_speed)) + __set_phy_supported(phydev, max_speed); +} + /** * phy_resolve_aneg_linkmode - resolve the advertisements into phy settings * @phydev: The phy_device struct diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 18a10565efd4..a4ab16992806 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -2023,44 +2023,6 @@ int genphy_loopback(struct phy_device *phydev, bool enable) } EXPORT_SYMBOL(genphy_loopback); -static int __set_phy_supported(struct phy_device *phydev, u32 max_speed) -{ - switch (max_speed) { - case SPEED_10: - linkmode_clear_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, - phydev->supported); - linkmode_clear_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, - phydev->supported); - /* fall through */ - case SPEED_100: - linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, - phydev->supported); - linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, - phydev->supported); - break; - case SPEED_1000: - break; - default: - return -ENOTSUPP; - } - - return 0; -} - -int phy_set_max_speed(struct phy_device *phydev, u32 max_speed) -{ - int err; - - err = __set_phy_supported(phydev, max_speed); - if (err) - return err; - - linkmode_copy(phydev->advertising, phydev->supported); - - return 0; -} -EXPORT_SYMBOL(phy_set_max_speed); - /** * phy_remove_link_mode - Remove a supported link mode * @phydev: phy_device structure to remove link mode from @@ -2191,21 +2153,6 @@ bool phy_validate_pause(struct phy_device *phydev, } EXPORT_SYMBOL(phy_validate_pause); -static void of_set_phy_supported(struct phy_device *phydev) -{ - struct device_node *node = phydev->mdio.dev.of_node; - u32 max_speed; - - if (!IS_ENABLED(CONFIG_OF_MDIO)) - return; - - if (!node) - return; - - if (!of_property_read_u32(node, "max-speed", &max_speed)) - __set_phy_supported(phydev, max_speed); -} - static void of_set_phy_eee_broken(struct phy_device *phydev) { struct device_node *node = phydev->mdio.dev.of_node; diff --git a/include/linux/phy.h b/include/linux/phy.h index 237dd035858a..cfdd3de38410 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -667,6 +667,7 @@ phy_lookup_setting(int speed, int duplex, const unsigned long *mask, bool exact); size_t phy_speeds(unsigned int *speeds, size_t size, unsigned long *mask); +void of_set_phy_supported(struct phy_device *phydev); static inline bool __phy_is_started(struct phy_device *phydev) { -- 2.19.2