Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp2319566pxb; Mon, 20 Sep 2021 18:42:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzHIV/+ravjqS063TsGfrCCsqPgBsd1YX7wLMBMd6rFg2BqoXFaDilCf2+zvtIxI5vzqqMh X-Received: by 2002:a5e:c701:: with SMTP id f1mr9668700iop.185.1632188567941; Mon, 20 Sep 2021 18:42:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632188567; cv=none; d=google.com; s=arc-20160816; b=0T/CFwDXLWgsOvYZToxAyBnJyI8qAt6wPJbe+w7KxN7Ih1sXYJg1MRa/ecXMXhTo2T pRbf+Sni0/CXsXBCpovMleO+tJ7iVrOlL722Lt6BAeV8DTDKA3M3Ozd1v09noVtqQypy NF37oMdO1H/vLJidVJeNijfAu6pIjTUHqjMJEynNo9fVK7+o4XgesN9XoTofXgSKGqoi YUm4vDuDZ65bklfAWYAG+ieEh1AIo7u0fEZOzIAQg2foYlIOqD6USDpaPewe+mgfEzWg 9NUaLeUf+ZW+WWK1YhLl38MEM5fT+c0xgW1QnQ1USqi4foH9gnDsuHhYzHJwliuTcPlN tltw== 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=NWrD1dhlGoLaIteFB2nHN/e/ouNsZIKgDk69EZdhzzY=; b=mmEXVHD9Am6y92XXC8rn/JvWMhvJGX1d8EE2pBuQ3cpKzVYZFHcm3BQ889jn5fdv22 JSqslNwzBG9vZvQmpfWEiy4n5CcI52lccJPqsCjHDC2RItG+6tYZCBxge4yInCdCMiBx N1RGpZot+hMjAtL3Si1OBPKbUrte4yQLzx+2iCQvqt963+8+lyeeqNEwvITsfnKY3N47 OsHfSJBipKVkqXuOxciCfruu6hqigk0fg7ybzPcFUWTb6cHbLs7l+gOCTGXDqLZlXjJi K/9NJprxDBCs99nHHIe5at9hp5GHl4kC5mXUq4J5AjK+lkVweFQScOZawQOF+RIq37Ye kiEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=L4vg2nzy; 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 f8si4653948ilu.129.2021.09.20.18.42.37; Mon, 20 Sep 2021 18:42:47 -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=L4vg2nzy; 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 S245078AbhITQzz (ORCPT + 99 others); Mon, 20 Sep 2021 12:55:55 -0400 Received: from mail.kernel.org ([198.145.29.99]:39768 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244480AbhITQwN (ORCPT ); Mon, 20 Sep 2021 12:52:13 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 0CD1B6126A; Mon, 20 Sep 2021 16:49:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1632156580; bh=TH9Uqq0frq96kNIR/4jqQDsgvg16xDhg2iBSm7ZzbdQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=L4vg2nzyUiDq+QvrLYIxFqesBG1wz78+w20uryqGjhMRqUHP6rjin7uQ9KQRcSY00 7cIBstOERfI2aLHM1Rv/q9INPKXf/URR43gI9WEHTf37zTatm/sQP4TR9JVcXvyznI 995p5njD9PsgytJWKp34ddW4MlNCGi2+17Z2m3Yo= 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.4 123/133] r6040: Restore MDIO clock frequency after MAC reset Date: Mon, 20 Sep 2021 18:43:21 +0200 Message-Id: <20210920163916.651851656@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210920163912.603434365@linuxfoundation.org> References: <20210920163912.603434365@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 */ @@ -369,8 +371,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); @@ -382,6 +385,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)