Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp2769714imj; Mon, 11 Feb 2019 08:12:03 -0800 (PST) X-Google-Smtp-Source: AHgI3IYw1zsurD3C31arN9Os44esBT+BHcd/Wxy911fri/1eNGnG6QgWFRSG5laYc5u2/3sFNoCM X-Received: by 2002:a63:4566:: with SMTP id u38mr33836249pgk.4.1549901523154; Mon, 11 Feb 2019 08:12:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549901523; cv=none; d=google.com; s=arc-20160816; b=yG4ZS5qA9yFqRHnlYptcotC0izGy3XTKzy4aw4/mKjyHTf4cZj+NzEbd4xgd4WxEJK 9chNWRFwibGoF/ZcUkpYx/Ly57uTRdnSgsmOlUf5PDN/dRnmrFlP3vkGiJDrkHXUx4z7 zrADa4sR9D8UuOrZrYwPFKtc7fifCtAJmJKFiw47q2hC2zvexQG6/ECzHAaIkGY7NWaV jexfKH5RpLFPv77Ludb/DB40S8+ddkxOnshTeJuH/UpxUIsllPKh2bcCVQ4LfibgRqB8 jpEb7+d0mnAWCWRiRfMyF8D/BUfhcVaPckMRKU3eK1looWlZ3hEYuEDtSvbJfo7X+aBj pvGA== 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=yZZJMplkvlJvujVb+Zzfq3OYQpUsy2uUI5WZlEewi4g=; b=aiUEq1sMdA4F7N06GXRvoli3cFfK3WAVT0E4/ku4FSdergidOnUfIsjfh8fhYPLw7M YPyjsmQPJo9ox2aL4igpZ2M7SUp6wu9gWeW9cfttaFarmBqFpxwzpjfa3fRqxtRkvqW4 JpVXtXFRLDfB4RnTw8+6ECNpUo6izdUfxy/pICH16blW92mfRoMzRPoNGIuA7m6zZ9YA fyUFEbI9+/0tKm+GellccPqCeH8NtPQCUNBJ3Gq7Td+WAYqTojhxfMqTjgsYv38pYzBx 6bhS1O9BzHYFsia65zBwkRKEyqZfZs5RfeCDwM0dgoXLRwbTnTM7Z6jf696JGzTrJVYm Y5mQ== 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 73si11390321pfm.50.2019.02.11.08.11.45; Mon, 11 Feb 2019 08:12:03 -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 S1727996AbfBKQKv (ORCPT + 99 others); Mon, 11 Feb 2019 11:10:51 -0500 Received: from relay1-d.mail.gandi.net ([217.70.183.193]:42261 "EHLO relay1-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729438AbfBKOZt (ORCPT ); Mon, 11 Feb 2019 09:25:49 -0500 X-Originating-IP: 90.88.22.177 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 relay1-d.mail.gandi.net (Postfix) with ESMTPSA id 86C1124000F; Mon, 11 Feb 2019 14:25:41 +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 1/4] net: phy: Mask-out non-compatible modes when setting the max-speed Date: Mon, 11 Feb 2019 15:25:26 +0100 Message-Id: <20190211142529.22885-2-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190211142529.22885-1-maxime.chevallier@bootlin.com> References: <20190211142529.22885-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 Reviewed-by: Andrew Lunn --- 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 cdea028d1328..855abf487279 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 3d14e48aebc5..65e18293d8e5 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -1964,44 +1964,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 @@ -2132,21 +2094,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 378da9a6165e..20344c7744d8 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -673,6 +673,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