From patchwork Tue Dec 12 15:03:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 121546 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp4234983qgn; Tue, 12 Dec 2017 07:04:06 -0800 (PST) X-Google-Smtp-Source: ACJfBovUG7HqXeArnB5wAmBYuwpezSjdvuubU1u6yfEISvoEUZhv8obr1eDzxKynbCXctOuRy1jZ X-Received: by 10.80.130.36 with SMTP id 33mr3422988edf.252.1513091046108; Tue, 12 Dec 2017 07:04:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513091046; cv=none; d=google.com; s=arc-20160816; b=Nn40gv037xKM0ZgFeKuRvmLEzk4T2PlBz93rxD7Sbt0rnORY9vmSaddKdnS+VUUzRJ xkC5fB8d9NnzB6lx/EMmdTcF4cqZBIwmbuq3RkN8f4cNo7e4Cto29iddVjFwRxh9Ebdh ExuY8z7WU0CWAWMbdBusskkF2jRYT72iDQhwihjV+1y1W0umbkdFSH2R1SDeisd7nOat +hxe+qSiPQnFrarphbAApIos6fi6HajRqeJw5XCIDr54WKTVo1QWBwpl4vXESWtKmTZL aXnad8ekdA/PGNslC3SIKVpwgvY17iRgPHV00qxKetJpSTMHpZSJ/h8No9nhaCHakTtb QhHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:cc:message-id:date:to:from :dkim-signature:arc-authentication-results; bh=IKM+MizdeOaORzIuPODMY+0gncK/EWGd5MjDNnGT3oI=; b=Lh6AbX0U9k6Y6urnH2i3mhZy7joNtxmYNRLNM+k6lSlAu98vCUB+r8Ct6qxnZOENmT OoXdKmNHnU3u4Y2HoQAiSHTBfuNhG+C0elfaAPjUSyiQEL9C8T1yckU4ObMRq8LtIQSb ERa6yR1CwqgU/s0nZFHbs3DpeiB/2aVcYx8z1ev0ZgOpz9Uz2rvJXXYqXDXMXylP0IJ9 VfQgVppSaVZWSOy8i31ESJMjTTNd2Ea0jBEzRSQPMOCBEgkDeBOna9pCf85EPwaxR3mJ TBpxGMjIPzPJZqg0y1y6x5r/QwVSOD3on/lGDeWVdUZiB+39KfnBOiVjrDixR7y7pWXI UbZA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=V96JS0Tv; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de Return-Path: Received: from lists.denx.de (dione.denx.de. [81.169.180.215]) by mx.google.com with ESMTP id k26si589352edf.191.2017.12.12.07.04.04; Tue, 12 Dec 2017 07:04:06 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) client-ip=81.169.180.215; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=V96JS0Tv; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de Received: by lists.denx.de (Postfix, from userid 105) id 88136C21DB9; Tue, 12 Dec 2017 15:04:03 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 549BEC21D9F; Tue, 12 Dec 2017 15:04:01 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 5DEC1C21D9F; Tue, 12 Dec 2017 15:04:00 +0000 (UTC) Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by lists.denx.de (Postfix) with ESMTPS id 27483C21C40 for ; Tue, 12 Dec 2017 15:03:59 +0000 (UTC) Received: by mail-wm0-f68.google.com with SMTP id f206so20836247wmf.5 for ; Tue, 12 Dec 2017 07:03:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=V+w7tucCzoEKjEgNtmdMrvCcLXn49YbcVH4qgwiEOrU=; b=V96JS0TvaCD0vFqJLUC4TmxZC7UMAo2muVJ+kr0JErMbwv2kKTjACrfu7h8X1M79rO JN/BbKzPXuNbUIwX+HBZMgBr3lQUJU9s09k1ByHtllsmDEj/OsGXQUmal0R5ED2Us4KR g6n0xlPNs8Ew1BJnRIb+G+JIWuVJZhgneuZI+yd14z0qeoLiSs13ZThvTwd+7RTCsWGM Nfi15Dzd32EF22Ld9Byg2toVQ0W7pZti2hBojeHJmeQ+zCos/a+AX+vjeO2gAeadF0u+ uvEIbOQxd8eTv5p3GVlKyvNlVvYmu0/x+U+IT5J46Qsf3/MVnwrEwhA3Ouzc0fY2Yg8B gcEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=V+w7tucCzoEKjEgNtmdMrvCcLXn49YbcVH4qgwiEOrU=; b=YoAmv+ac17tGPR94tcVjVtRFO28kwhTlpUdlv7bu9c5GuTw7UbesKxJatkR2Wk7UKQ bd0qiQVKYY5WewfAgzfhcWi0NYkomuj8w3VimRkITXJ1EeZF3fJBJPcJUvJTAsGIwhuw juO7EVvmmHxYm114drGSETZpWuw/F2qMsexQDCqI7Br47CO25VgN6HCjxjSpOPd6wQ8B sO959HRvvi0g7PA6i9Vcr1dNdqUbpE3/xqXUnWDgSat+f6Kuynxz05if6ndB/8yH6ZWY wiFXQkYMUatZ7P+zrbN11A+ewPLpiYCxdWPCQKQbGNcisWe27zUZwEetXTLkMLJkG/iA R8cQ== X-Gm-Message-State: AKGB3mIHg3DCvdCVmy3gfVGwYC1l1Q3wGlvkDbYR3FdxDknevwL38D6O qXk5Xt3lHZb9/Fm0a4Xu9huC8w6e8ac= X-Received: by 10.28.133.142 with SMTP id h136mr1843220wmd.122.1513091038270; Tue, 12 Dec 2017 07:03:58 -0800 (PST) Received: from bender.baylibre.local ([90.63.244.31]) by smtp.gmail.com with ESMTPSA id t65sm617084wmt.39.2017.12.12.07.03.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 12 Dec 2017 07:03:57 -0800 (PST) From: Neil Armstrong To: u-boot@lists.denx.de Date: Tue, 12 Dec 2017 16:03:55 +0100 Message-Id: <1513091035-32503-1-git-send-email-narmstrong@baylibre.com> X-Mailer: git-send-email 2.7.4 Cc: trini@konsulko.com, linux-amlogic@lists.infradead.org, Jerome Brunet Subject: [U-Boot] [PATCH u-boot] net: phy: meson-gxl: detect LPA corruption X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" From: Jerome Brunet This patch is ported from the Linux patch posted at [1] and applied to net tree as commit f1e2400a80ff. The purpose of this change is to fix the incorrect detection of the link partner (LP) advertised capabilities which sometimes happens with this PHY (roughly 1 time in a dozen) This issue may cause the link to be negotiated at 10Mbps/Full or 10Mbps/Half when 100MBps/Full is actually possible. In some case, the link is even completely broken and no communication is possible. To detect the corruption, we must look for a magic undocumented bit in the WOL bank (hint given by the SoC vendor kernel) but this is not enough to cover all cases. We also have to look at the LPA ack. If the LP supports Aneg but did not ack our base code when aneg is completed, we assume something went wrong. The detection of a corrupted LPA triggers a restart of the aneg process. This solves the problem but may take up to 6 retries to complete. [1] https://lkml.kernel.org/r/20171208110811.30789-1-jbrunet@baylibre.com Fixes: 8995a96d1d67 ("net: phy: Add Amlogic Meson GXL Internal PHY support") Signed-off-by: Jerome Brunet Signed-off-by: Neil Armstrong --- This patch has been tested on LibreTech-CC and adapted to U-Boot PHY calls. Comments from Jerome from the original patch : "" I suppose this patch probably seems a bit hacky, especially the part about the link partner acknowledge. I'm trying to figure out if the value in MII_LPA makes sense but I don't have such a deep knowledge of the ethernet spec. To me, it does not makes sense for the LP to support ANEG (Bit 1 in MII_EXPENSION), the aneg to have successfully complete and, at the same time, LP does not ACK our base code word, which we should have sent during this aneg. If you think this may have unintended consequences or if you have an idea to do this differently, feel free to let me know. This fix has been tested on the libretech-cc and khadas VIM "" drivers/net/phy/meson-gxl.c | 88 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/meson-gxl.c b/drivers/net/phy/meson-gxl.c index ccf70c9..5f4ecb1 100644 --- a/drivers/net/phy/meson-gxl.c +++ b/drivers/net/phy/meson-gxl.c @@ -10,8 +10,94 @@ #include #include #include +#include #include +/* This function is provided to cope with the possible failures of this phy + * during aneg process. When aneg fails, the PHY reports that aneg is done + * but the value found in MII_LPA is wrong: + * - Early failures: MII_LPA is just 0x0001. if MII_EXPANSION reports that + * the link partner (LP) supports aneg but the LP never acked our base + * code word, it is likely that we never sent it to begin with. + * - Late failures: MII_LPA is filled with a value which seems to make sense + * but it actually is not what the LP is advertising. It seems that we + * can detect this using a magic bit in the WOL bank (reg 12 - bit 12). + * If this particular bit is not set when aneg is reported being done, + * it means MII_LPA is likely to be wrong. + * + * In both case, forcing a restart of the aneg process solve the problem. + * When this failure happens, the first retry is usually successful but, + * in some cases, it may take up to 6 retries to get a decent result + */ +int meson_gxl_startup(struct phy_device *phydev) +{ + unsigned int retries = 10; + int ret, wol, lpa, exp; + +restart_aneg: + ret = genphy_update_link(phydev); + if (ret) + return ret; + + if (phydev->autoneg == AUTONEG_ENABLE) { + /* Need to access WOL bank, make sure the access is open */ + ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x14, 0x0000); + if (ret) + return ret; + ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x14, 0x0400); + if (ret) + return ret; + ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x14, 0x0000); + if (ret) + return ret; + ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x14, 0x0400); + if (ret) + return ret; + + /* Request LPI_STATUS WOL register */ + ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x14, 0x8D80); + if (ret) + return ret; + + /* Read LPI_STATUS value */ + wol = phy_read(phydev, MDIO_DEVAD_NONE, 0x15); + if (wol < 0) + return wol; + + lpa = phy_read(phydev, MDIO_DEVAD_NONE, MII_LPA); + if (lpa < 0) + return lpa; + + exp = phy_read(phydev, MDIO_DEVAD_NONE, MII_EXPANSION); + if (exp < 0) + return exp; + + if (!(wol & BIT(12)) || + ((exp & EXPANSION_NWAY) && !(lpa & LPA_LPACK))) { + + /* Looks like aneg failed after all */ + if (!retries) { + printf("%s LPA corruption max attempts\n", + phydev->dev->name); + return -ETIMEDOUT; + } + + printf("%s LPA corruption - aneg restart\n", + phydev->dev->name); + + ret = genphy_restart_aneg(phydev); + if (ret) + return ret; + + --retries; + + goto restart_aneg; + } + } + + return genphy_parse_link(phydev); +} + static int meson_gxl_phy_config(struct phy_device *phydev) { /* Enable Analog and DSP register Bank access by */ @@ -45,7 +131,7 @@ static struct phy_driver meson_gxl_phy_driver = { .mask = 0xfffffff0, .features = PHY_BASIC_FEATURES, .config = &meson_gxl_phy_config, - .startup = &genphy_startup, + .startup = &meson_gxl_startup, .shutdown = &genphy_shutdown, };