From patchwork Wed Dec 9 10:29:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 341758 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D9948C4361B for ; Wed, 9 Dec 2020 10:31:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9813023B5D for ; Wed, 9 Dec 2020 10:31:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729930AbgLIKas (ORCPT ); Wed, 9 Dec 2020 05:30:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56058 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729922AbgLIKas (ORCPT ); Wed, 9 Dec 2020 05:30:48 -0500 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8DE68C061793 for ; Wed, 9 Dec 2020 02:30:07 -0800 (PST) Received: from dude02.hi.pengutronix.de ([2001:67c:670:100:1d::28]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kmwjS-0005ty-KH; Wed, 09 Dec 2020 11:30:02 +0100 Received: from ukl by dude02.hi.pengutronix.de with local (Exim 4.92) (envelope-from ) id 1kmwjQ-0000Z8-9f; Wed, 09 Dec 2020 11:30:00 +0100 From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Fugang Duan , "David S. Miller" , Andrew Lunn Cc: kernel@pengutronix.de, netdev@vger.kernel.org Subject: [PATCH] net: ethernet: fec: Clear stale flag in IEVENT register before MII transfers Date: Wed, 9 Dec 2020 11:29:59 +0100 Message-Id: <20201209102959.2131-1-u.kleine-koenig@pengutronix.de> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::28 X-SA-Exim-Mail-From: ukl@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: netdev@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org For some mii transfers the MII bit in the event register is already set before a read or write transfer is started. This breaks evaluating the transfer's result because it is checked too early. Before MII transfers were switched from irq to polling this was not an issue because then it just resulted in an irq which completed the mdio_done completion. This completion however was reset before each transfer and so the event didn't hurt. This fixes NFS booting on an i.MX25 based machine. Fixes: f166f890c8f0 ("net: ethernet: fec: Replace interrupt driven MDIO with polled IO") Signed-off-by: Uwe Kleine-König --- Hello, I tried (shortly) to find out what actually results in this bit being set because looking at f166f890c8f0 I'd say it cares enough. It's just proven by the real world that it's not good enough :-) Best regards Uwe drivers/net/ethernet/freescale/fec_main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 2e209142f2d1..ab21d2bcda75 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1869,6 +1869,8 @@ static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum) frame_addr = regnum; } + writel(FEC_ENET_MII, fep->hwp + FEC_IEVENT); + /* start a read op */ writel(frame_start | frame_op | FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(frame_addr) | @@ -1926,6 +1928,8 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, frame_addr = regnum; } + writel(FEC_ENET_MII, fep->hwp + FEC_IEVENT); + /* start a write op */ writel(frame_start | FEC_MMFR_OP_WRITE | FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(frame_addr) |