Received: by 2002:a05:6520:4d:b0:139:a872:a4c9 with SMTP id i13csp2563620lkm; Mon, 20 Sep 2021 18:49:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwn21A51mRfdb1B8yNyX6AzWsf4pW2DW36h08sUjix1/OR1hSBrA11nmFMVftqKfZrqJW+3 X-Received: by 2002:a05:6e02:12ec:: with SMTP id l12mr4851329iln.314.1632188840784; Mon, 20 Sep 2021 18:47:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632188840; cv=none; d=google.com; s=arc-20160816; b=b1FrNMNGkWlx/fftiqXhaM6HH4nSinBmez846esld1rwvOVfKHDI4hhYXkq2a1ALxe XetySHNCGu3iPsnCVLu6/ynS5vJ8T/5vDjBJ0rgUv4CFPTQ/SUBW5VsGU0fb1TlCg8G5 5s55D5lnFQaaHHrup5V+5Y5rTzxParsgerzSdNKPshqptgmbaAidxOkcPN8sSfCzXJoA 8h/v7rxuGC1ul0PDNYs42EyiYcV0A+lWludu6GMJ+Y16DDZH2uJe5Yx68VsQe7BDVc/f Hynzz8koAUKvWyfwkhj0O3bGnvRvB8p4/y7F/G+lkHBiQXCTeKWQybHsLFKhcxh1v7zp AT5g== 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=GmO6ZVQTWi4iPUUXsK6Mjf5zNA1HB8lmNSBBnvl9iF0=; b=azN6sZNof1wz0BvjrIPLoB1/mkBISAqyc7uWwFYs7h/BxB8mYeZKTTcbPbi4AzlY8u 7uKUoTpYBS24dL1+GBlhrOuYOz6EghvALxDnckkB6gFwuulfh0Q/Liuayayhlb6QUrpN a0H++LHXF1JlVzHwClr10uQ4wdbXCrTR+n2sk2g0c7Z2w6GFB9JCKtTk/K6XaJUDm61P Y+NCV86gXB8a282KgWNiDLjl/ITvluTSsglfn6ZYsFf9okClkJkvGMXR0+fMLAettJVy ymXw68KLo3UAgfF25SkUs/PFkkSWaK99JlIR9Ez6F+Rtz/mCXrjZfqInbc8ZgYo5BJif nn6A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="j/0mhLFX"; 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=pass (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 q12si3290513jac.12.2021.09.20.18.47.09; Mon, 20 Sep 2021 18:47:20 -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=@linuxfoundation.org header.s=korg header.b="j/0mhLFX"; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1351036AbhITRbq (ORCPT + 99 others); Mon, 20 Sep 2021 13:31:46 -0400 Received: from mail.kernel.org ([198.145.29.99]:56974 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1347407AbhITR2o (ORCPT ); Mon, 20 Sep 2021 13:28:44 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 53BE261360; Mon, 20 Sep 2021 17:03:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1632157417; bh=KUe582VJtgGZabFDrgxZbLWdHNKJM0l/JO/BSUaJiU4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j/0mhLFX8jie6qAWBMDMdNDVfRovoOU4706TrhXX926E3GwDsazY2LgyJhXG4NsVx lNujXyLqrH7zmdPQjcFeeRjUpT5AMyiN3Rht42AzKXgpLvPlg00uA2UV0ULLtkBMRQ OJ8MDGAb3nJyAqln80gcOpVY/WvhMpLZ+E+Fj/EM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Andrius V , Darek Strugacz , Florian Fainelli , "David S. Miller" Subject: [PATCH 4.14 199/217] r6040: Restore MDIO clock frequency after MAC reset Date: Mon, 20 Sep 2021 18:43:40 +0200 Message-Id: <20210920163931.376391933@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210920163924.591371269@linuxfoundation.org> References: <20210920163924.591371269@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: Florian Fainelli commit e3f0cc1a945fcefec0c7c9d9dfd028a51daa1846 upstream. A number of users have reported that they were not able to get the PHY to successfully link up, especially after commit c36757eb9dee ("net: phy: consider AN_RESTART status when reading link status") where we stopped reading just BMSR, but we also read BMCR to determine the link status. Andrius at NetBSD did a wonderful job at debugging the problem and found out that the MDIO bus clock frequency would be incorrectly set back to its default value which would prevent the MDIO bus controller from reading PHY registers properly. Back when we only read BMSR, if we read all 1s, we could falsely indicate a link status, though in general there is a cable plugged in, so this went unnoticed. After a second read of BMCR was added, a wrong read will lead to the inability to determine a link UP condition which is when it started to be visibly broken, even if it was long before that. The fix consists in restoring the value of the MD_CSR register that was set prior to the MAC reset. Link: http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=53494 Fixes: 90f750a81a29 ("r6040: consolidate MAC reset to its own function") Reported-by: Andrius V Reported-by: Darek Strugacz Tested-by: Darek Strugacz Signed-off-by: Florian Fainelli Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/rdc/r6040.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) --- a/drivers/net/ethernet/rdc/r6040.c +++ b/drivers/net/ethernet/rdc/r6040.c @@ -133,6 +133,8 @@ #define PHY_ST 0x8A /* PHY status register */ #define MAC_SM 0xAC /* MAC status machine */ #define MAC_SM_RST 0x0002 /* MAC status machine reset */ +#define MD_CSC 0xb6 /* MDC speed control register */ +#define MD_CSC_DEFAULT 0x0030 #define MAC_ID 0xBE /* Identifier register */ #define TX_DCNT 0x80 /* TX descriptor count */ @@ -368,8 +370,9 @@ static void r6040_reset_mac(struct r6040 { void __iomem *ioaddr = lp->base; int limit = MAC_DEF_TIMEOUT; - u16 cmd; + u16 cmd, md_csc; + md_csc = ioread16(ioaddr + MD_CSC); iowrite16(MAC_RST, ioaddr + MCR1); while (limit--) { cmd = ioread16(ioaddr + MCR1); @@ -381,6 +384,10 @@ static void r6040_reset_mac(struct r6040 iowrite16(MAC_SM_RST, ioaddr + MAC_SM); iowrite16(0, ioaddr + MAC_SM); mdelay(5); + + /* Restore MDIO clock frequency */ + if (md_csc != MD_CSC_DEFAULT) + iowrite16(md_csc, ioaddr + MD_CSC); } static void r6040_init_mac_regs(struct net_device *dev)