Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp3682730pxb; Mon, 24 Jan 2022 15:14:55 -0800 (PST) X-Google-Smtp-Source: ABdhPJz0HAl2rS9KJenUsgOuJbNx+6MIepH2f+rYMFXGgiM+SYvn7VrYouw1/ocEJ+RmcnghVtOW X-Received: by 2002:a17:90b:3b52:: with SMTP id ot18mr486320pjb.237.1643066095748; Mon, 24 Jan 2022 15:14:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643066095; cv=none; d=google.com; s=arc-20160816; b=EhLgmHWWUpXZ9ZACyM+LE+7x5dUUEUxPNqeI3nJ341WJwSJJW7dFGifp6cs9hS2oqH c8LiPF+UxbEVH5bjuLnhLbmuhesq/8F+4zT1qVmNAO3QF1vwcKBwqcxDZCWkQhWEi7cj m6JjOYDm9PXimOZ+a3ypzNFle7tTEiJvrMIVuvFCd04TQ92LM9Hf5kz1KWU1r98q6WZ7 VtLjJAN2UkNLiZ3JlxWOiPBoxrJmqJcnSMPgvwjo5tf8ebsYhOjfle4F8b12x8Er86Qf u21+chCAQW0wW1Vvmvuby6AX6TFxU5BY7MXMgECq5USBpPJl5EHKKMj8JNTBw3bNrkHy wZWg== 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=Suk5SFIfnYzvovoRVJYFAsGlF84o5q3bKvgc3BDMCOo=; b=aVdRtyOL9qZY4HEhqg2sgSfL0qU7eK56aiuswSk0bSN8MWCbhxVDuYNnVYE7yPdRwP ONSM//dpPqYD8Pug+UaIpxV4q7VJRJwnFyHF1qzBocojvGNSqzUjv3dsiYhAe/FXQlHC PWS0OCif9s6DVNapcli9CFIRLVKcC1Fu6hN8WZIUR4PDLOmQ17RZbQgtT8Bw7ygHozLX x0Fss0Es2t9w3XLVI5nUXJg/Q7UnTCk3sFLDjdP3Sf+v8pMIWIqM1wMG0PdS/KVHiKQ5 AxaT5ET+//IIXVcG5TzT/Vo0aee/PNIK4WetzqnGZpEiEjraK8EIwfJQvUwkyWfhX+zO MXIw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=R+HriuUP; 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 u22si2136114pfg.2.2022.01.24.15.14.43; Mon, 24 Jan 2022 15:14:55 -0800 (PST) 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=R+HriuUP; 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 S1384826AbiAXXHe (ORCPT + 99 others); Mon, 24 Jan 2022 18:07:34 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36220 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1583277AbiAXWRb (ORCPT ); Mon, 24 Jan 2022 17:17:31 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 09C8CC061392; Mon, 24 Jan 2022 12:48:38 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id A6384B810A8; Mon, 24 Jan 2022 20:48:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DE51CC340E5; Mon, 24 Jan 2022 20:48:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1643057316; bh=7of+EHXBGl4nxCOkkheKVpwiRxEPsyfv3MBiRJmMuA8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=R+HriuUP5UFvQ2WwZoNn3VixX8eGbb0Eb5iuTvgfG7BBolOee8J+dwKz/f6XtlDla 6FMoFKV+5+QL0CMZXAJP17z815TgLQ1N1Vuf5bEFl/Ud+aNcNq9EJnXlKedox3KV6p 8KrFyU9cQAjZCpinMyOXuooZ0dpuyrywDWmoOUks= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Tobias Waldekranz , Andrew Lunn , Jakub Kicinski Subject: [PATCH 5.15 772/846] net/fsl: xgmac_mdio: Add workaround for erratum A-009885 Date: Mon, 24 Jan 2022 19:44:49 +0100 Message-Id: <20220124184127.593412395@linuxfoundation.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124184100.867127425@linuxfoundation.org> References: <20220124184100.867127425@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: Tobias Waldekranz commit 6198c722019774d38018457a8bfb9ba3ed8c931e upstream. Once an MDIO read transaction is initiated, we must read back the data register within 16 MDC cycles after the transaction completes. Outside of this window, reads may return corrupt data. Therefore, disable local interrupts in the critical section, to maximize the probability that we can satisfy this requirement. Fixes: d55ad2967d89 ("powerpc/mpc85xx: Create dts components for the FSL QorIQ DPAA FMan") Signed-off-by: Tobias Waldekranz Reviewed-by: Andrew Lunn Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/freescale/xgmac_mdio.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) --- a/drivers/net/ethernet/freescale/xgmac_mdio.c +++ b/drivers/net/ethernet/freescale/xgmac_mdio.c @@ -52,6 +52,7 @@ struct tgec_mdio_controller { struct mdio_fsl_priv { struct tgec_mdio_controller __iomem *mdio_base; bool is_little_endian; + bool has_a009885; bool has_a011043; }; @@ -187,10 +188,10 @@ static int xgmac_mdio_read(struct mii_bu { struct mdio_fsl_priv *priv = (struct mdio_fsl_priv *)bus->priv; struct tgec_mdio_controller __iomem *regs = priv->mdio_base; + unsigned long flags; uint16_t dev_addr; uint32_t mdio_stat; uint32_t mdio_ctl; - uint16_t value; int ret; bool endian = priv->is_little_endian; @@ -222,12 +223,18 @@ static int xgmac_mdio_read(struct mii_bu return ret; } + if (priv->has_a009885) + /* Once the operation completes, i.e. MDIO_STAT_BSY clears, we + * must read back the data register within 16 MDC cycles. + */ + local_irq_save(flags); + /* Initiate the read */ xgmac_write32(mdio_ctl | MDIO_CTL_READ, ®s->mdio_ctl, endian); ret = xgmac_wait_until_done(&bus->dev, regs, endian); if (ret) - return ret; + goto irq_restore; /* Return all Fs if nothing was there */ if ((xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) && @@ -235,13 +242,17 @@ static int xgmac_mdio_read(struct mii_bu dev_dbg(&bus->dev, "Error while reading PHY%d reg at %d.%hhu\n", phy_id, dev_addr, regnum); - return 0xffff; + ret = 0xffff; + } else { + ret = xgmac_read32(®s->mdio_data, endian) & 0xffff; + dev_dbg(&bus->dev, "read %04x\n", ret); } - value = xgmac_read32(®s->mdio_data, endian) & 0xffff; - dev_dbg(&bus->dev, "read %04x\n", value); +irq_restore: + if (priv->has_a009885) + local_irq_restore(flags); - return value; + return ret; } static int xgmac_mdio_probe(struct platform_device *pdev) @@ -288,6 +299,8 @@ static int xgmac_mdio_probe(struct platf priv->is_little_endian = device_property_read_bool(&pdev->dev, "little-endian"); + priv->has_a009885 = device_property_read_bool(&pdev->dev, + "fsl,erratum-a009885"); priv->has_a011043 = device_property_read_bool(&pdev->dev, "fsl,erratum-a011043");