Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp2351322pxb; Mon, 20 Sep 2021 19:47:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxdg2GiInAveruY12TigXBl4mQTciHH41IEKxZZwg5b9jPOMfelZBacWk8W504RuIdANKyn X-Received: by 2002:a17:906:dbf2:: with SMTP id yd18mr18320935ejb.536.1632192435976; Mon, 20 Sep 2021 19:47:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632192435; cv=none; d=google.com; s=arc-20160816; b=axPNpbeW5R27obzz8oCPhjgsmAWWmebn3oj3NoZWY1ImLLJ1bebcqq8klIlY92I9iO mOOwILHHfWxlJVfOT/anSwDVEd2neI6W16ZvY8mYUX4zUqxJ1DqQMobrM8Shrf2waAUW zPuj4afv1aW4UhHc0z/8L9A9MQPkPEYL2DmgiS+Y1sjfiiNj1O/SknhLK3ieuAv7kUjA gw0wV440jDlFmgG1tHwn7ynPUphd866y4Jlp8JupfTO2dhzv8/fGhsS2qdS1rrVrKmij /eI7rJ01ymeySB6d/kCGMpqfnub3zvTK8mSMH4EnNpdEs/AyeWuzFwk2bWdib+ZlMZjR rYNA== 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=7JPmpP+5Vmga9Iyj5QdqZtzt86K9fUzWpYh/AyT0n5M=; b=Lul40kA/0RkfMQbsSQ349mXeRxoGhqgLsUSizBE8s+0fJt1Ubza/aqnPySww9Nw9wc pXJEB0+3+DCHMhbNmlbJfgAxwlYflpqFwZKCYHah8XVF6+lbTQOcVB3g2oGvpyxzYpER KQONF07z2UtfxBVBa/IwVUrtWq1aQOweHUppBCyvr6ca95uhyieqFrX3Cr7sRJZ+0UNH C63OlpElydppcrHoVv0R+5dKWvS+KZAAkA8RQUR+etQwBmfB8g1HofERfk7hdIk/3vLs Xrn0EHUN9zhbwE7eLMSDdwnOPqHqTKm70NGWDKEUdrY0pZ+a80uUjO9aIqg8pV/lROJN IbRQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=qA2W4w9t; 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 y11si17868839eda.74.2021.09.20.19.46.52; Mon, 20 Sep 2021 19:47: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=@linuxfoundation.org header.s=korg header.b=qA2W4w9t; 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 S1352301AbhITS0L (ORCPT + 99 others); Mon, 20 Sep 2021 14:26:11 -0400 Received: from mail.kernel.org ([198.145.29.99]:40368 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1358883AbhITSSS (ORCPT ); Mon, 20 Sep 2021 14:18:18 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 4474C6135E; Mon, 20 Sep 2021 17:22:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1632158564; bh=s4HQuz1Gq+kbJ/mEFzo9C6PTGG/TxCf56IN1M5lLZ6M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qA2W4w9tvJ1wVPGji8wqYTE+otDG5qZNBjPcu0yDNBtpyxuHwawo4L1uDGS+K1Gim GDoPo8m9iuYm1+MisaikNs+4+RGaw0TDlE/IwBedvzYrju0vHqM+ulbVRPfMVFX7xr ylJ+j+X5So8T+u26V0sNPTKyUAKvn7bIzeg0WdZ0= 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 5.4 214/260] r6040: Restore MDIO clock frequency after MAC reset Date: Mon, 20 Sep 2021 18:43:52 +0200 Message-Id: <20210920163938.385688390@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210920163931.123590023@linuxfoundation.org> References: <20210920163931.123590023@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 @@ -119,6 +119,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 */ @@ -354,8 +356,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); @@ -367,6 +370,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)