Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp305364pxx; Wed, 28 Oct 2020 05:30:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJykpI6S7mOHA2F0syvOaK6nArA8iRq1kWjdHsK8cNAXYnESd1/BR4S7N5CcZ8myTcC104ZW X-Received: by 2002:a17:906:580e:: with SMTP id m14mr7062820ejq.237.1603888215135; Wed, 28 Oct 2020 05:30:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603888215; cv=none; d=google.com; s=arc-20160816; b=WwqTzm4PnqOKi9hsIfKac+QaaVzZb3F108FTCCp+fbvJxn39GaEShIu8sTCPVJidHJ Wv0Uqw10NyKrPAmwarzZ8t/1lL5jsUcnUUAYTY/Fr9L9cyDxh5P8gLoQpTr0W4lPFdUm 9V1lMewVnYyZKdoXeGM5MD1GFpGBWjSxcuHfD52SaIhJHJOd7kiiQOP+K9ZTFH0LcQd5 MRbEASRImLJGaS+XJCgYZsDhZCWzaBPafiBqof1wQbzblHgK9+64diAyjNX19TzmVpWS z51AwqnF52xydff51fHO3aqoMozJ0+cbDt2rF6aXcQllCmWr7dLF9D9AK6GbUNue6Qwp F/6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ByaDMm6yhn2vRnVk8y1PM56Wk3AvXaAI4oAcbJx6v6k=; b=UGfYPNsMz1ibUoYR2eqktpHjQgLW4P9DYQ8LIVYLpf2ktPu1aSMDIvIxxW2XZFsPFC dMbczqb/XTzT1px3sJA1nKyNSjp06XRWonO0BF9oBhir1xvuvdiOe9sMgtixzBesl2ds eA0f+dZ76/fhoUkGuBb1Gs91Bsqv32RALyB2KX4SF4H8w7QBYnXi8DV4m2aZT9V16ymH mCM0bG06c6wZ+b23ENVHhw0DQAliuvGgWOy1PqUcPB+BAvYpHNL5qu6hnV829cykZxYR rCIOzNT7N3UvHyv3rVe0B0zdUTQKsBUudkIpLdlatlw8eQkttcE+RbYPc+iGWNjNrhsJ +Psg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Wkd7Jkky; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bt10si1135660edb.503.2020.10.28.05.29.53; Wed, 28 Oct 2020 05:30:15 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Wkd7Jkky; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1797111AbgJ0PVk (ORCPT + 99 others); Tue, 27 Oct 2020 11:21:40 -0400 Received: from mail.kernel.org ([198.145.29.99]:56832 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1796525AbgJ0PTN (ORCPT ); Tue, 27 Oct 2020 11:19:13 -0400 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B654720657; Tue, 27 Oct 2020 15:19:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603811952; bh=SS3hx8C0A6/3HvvdBxZ9ZAhNIsrJck4DS4Ekb/+uOVk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Wkd7JkkyXjvAUV3juWN2maLxNvy5thB/Q7sGPjELqLQP1WmHxAu1p38nBkle4mBpd ZBpaGDSpbBgbWk+mdlLQGEKTMn0MZXHak59M/m/cFHY+aQEj3rFm+jusvHwoRRtRit IDAJNUkPi2tXLHhRg9/GFu9VtR/4AH4Xy/gzTuNU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Marek Vasut , Christoph Niedermaier , "David S. Miller" , NXP Linux Team , Richard Leitner , Shawn Guo , Jakub Kicinski Subject: [PATCH 5.9 009/757] net: fec: Fix phy_device lookup for phy_reset_after_clk_enable() Date: Tue, 27 Oct 2020 14:44:19 +0100 Message-Id: <20201027135450.964834393@linuxfoundation.org> X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201027135450.497324313@linuxfoundation.org> References: <20201027135450.497324313@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Marek Vasut [ Upstream commit 64a632da538a6827fad0ea461925cedb9899ebe2 ] The phy_reset_after_clk_enable() is always called with ndev->phydev, however that pointer may be NULL even though the PHY device instance already exists and is sufficient to perform the PHY reset. This condition happens in fec_open(), where the clock must be enabled first, then the PHY must be reset, and then the PHY IDs can be read out of the PHY. If the PHY still is not bound to the MAC, but there is OF PHY node and a matching PHY device instance already, use the OF PHY node to obtain the PHY device instance, and then use that PHY device instance when triggering the PHY reset. Fixes: 1b0a83ac04e3 ("net: fec: add phy_reset_after_clk_enable() support") Signed-off-by: Marek Vasut Cc: Christoph Niedermaier Cc: David S. Miller Cc: NXP Linux Team Cc: Richard Leitner Cc: Shawn Guo Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/freescale/fec_main.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1912,6 +1912,27 @@ out: return ret; } +static void fec_enet_phy_reset_after_clk_enable(struct net_device *ndev) +{ + struct fec_enet_private *fep = netdev_priv(ndev); + struct phy_device *phy_dev = ndev->phydev; + + if (phy_dev) { + phy_reset_after_clk_enable(phy_dev); + } else if (fep->phy_node) { + /* + * If the PHY still is not bound to the MAC, but there is + * OF PHY node and a matching PHY device instance already, + * use the OF PHY node to obtain the PHY device instance, + * and then use that PHY device instance when triggering + * the PHY reset. + */ + phy_dev = of_phy_find_device(fep->phy_node); + phy_reset_after_clk_enable(phy_dev); + put_device(&phy_dev->mdio.dev); + } +} + static int fec_enet_clk_enable(struct net_device *ndev, bool enable) { struct fec_enet_private *fep = netdev_priv(ndev); @@ -1938,7 +1959,7 @@ static int fec_enet_clk_enable(struct ne if (ret) goto failed_clk_ref; - phy_reset_after_clk_enable(ndev->phydev); + fec_enet_phy_reset_after_clk_enable(ndev); } else { clk_disable_unprepare(fep->clk_enet_out); if (fep->clk_ptp) { @@ -2993,7 +3014,7 @@ fec_enet_open(struct net_device *ndev) * phy_reset_after_clk_enable() before because the PHY wasn't probed. */ if (reset_again) - phy_reset_after_clk_enable(ndev->phydev); + fec_enet_phy_reset_after_clk_enable(ndev); if (fep->quirks & FEC_QUIRK_ERR006687) imx6q_cpuidle_fec_irqs_used();