From mboxrd@z Thu Jan 1 00:00:00 1970 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=-8.9 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,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 71357C43381 for ; Tue, 19 Feb 2019 07:21:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3C6B021903 for ; Tue, 19 Feb 2019 07:21:51 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dwEB1QVP" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726565AbfBSHVt (ORCPT ); Tue, 19 Feb 2019 02:21:49 -0500 Received: from mail-ed1-f65.google.com ([209.85.208.65]:35671 "EHLO mail-ed1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726546AbfBSHVt (ORCPT ); Tue, 19 Feb 2019 02:21:49 -0500 Received: by mail-ed1-f65.google.com with SMTP id g19so6844323edp.2 for ; Mon, 18 Feb 2019 23:21:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=Y3pIWHGXGWEZdjYY7oEYD5uLNyZ41lw9zSkn4iikpiM=; b=dwEB1QVPr/tJJGgLPVNxVqo7S0LP6j0Qyv8sM5b+LYDQQRUdwaOxnraSyLgNTwcEJi Db24Z1ueK33r3sshEyXcicAVStbAiFQGn9cP8RBAbCOkwFx1qxEBu5vhi/8EoYMJkHlX bCTOe7/RV7fJMj7VlIDdTHRjj1wG/BRHjpR4parx1rWMfDmDuz6TX3vA8TvuTaW7hN16 +I7ACOSHF//jDbopJvaLr9aNjy9/Nm1kgRXejcdEI6m9fcKKvQhghXq8qQFfc7xIqA0r zc4W1x7y5rDA540MUCqtMVYvO+sWd7B2UAQaV1IEYy2503YECuyR4QCrI8g5Wviiw1cK 7T8w== 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=Y3pIWHGXGWEZdjYY7oEYD5uLNyZ41lw9zSkn4iikpiM=; b=jyklyq9YjSw2Q7Lsph/JwRMwdzk2gZipxEI26lD4MSEBPuNMTeTNPNdfSsRuOgXFOS NF5N8gnrHGRzdjYWdtvAHfTRu/CG8/H6kd5XnuJY0Se8WECKYA5NQRoVAC6zBHLOlmQH +WG/Ec/6EIKO6rSunqkORBYHYfVKUCKAYHIcA4sqHrNgbQv84Fnl3F23UokUmI//nWaK l6pLcO7P5NN9Qh4/YTlV4gs2Ig/0T5xpuHZWTXSaFJy5u1c7gmugBRSWrVP48pdpPhNt Ra3+Bx70VPlna5ISE/hydEeu4/wV/i69i6soyq+e4Rxpq5GyTOBeypzRaN1sIwLbusCp KyQg== X-Gm-Message-State: AHQUAubRFJZ8TQgwyfQdtCoy40omuwUGRSrQ1sI38ozTcsdNBx8votrH bmmIvzoh7byDwxlQvuAKv7g= X-Google-Smtp-Source: AHgI3IY0jUzbpN2Ae8413kVeoVpu5NUvWLE5vz2uuiV1viU1tzuwa/YzClpnPyZHzzENieNECn7Vzw== X-Received: by 2002:a17:906:c286:: with SMTP id r6mr19226956ejz.7.1550560907324; Mon, 18 Feb 2019 23:21:47 -0800 (PST) Received: from localhost.localdomain (D96447CA.static.ziggozakelijk.nl. [217.100.71.202]) by smtp.gmail.com with ESMTPSA id k14sm3603836edb.51.2019.02.18.23.21.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 18 Feb 2019 23:21:46 -0800 (PST) From: Frank de Brabander To: Andrew Lunn , Florian Fainelli , Heiner Kallweit Cc: Frank de Brabander , netdev@vger.kernel.org Subject: [PATCH] phy/marvell: prevent unneeded page switching Date: Tue, 19 Feb 2019 08:21:33 +0100 Message-Id: <1550560893-2445-1-git-send-email-debrabander@gmail.com> X-Mailer: git-send-email 2.7.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org marvell_read_status() no longer first switches to the fiber page, instead looks at the already active register page first. In case the link is down, switches to the other (fiber/copper) register page. Unneeded register page switching of the Marvell 88E1510 PHY can cause the ethernet driver to register a link down & up event. Signed-off-by: Frank de Brabander --- drivers/net/phy/marvell.c | 59 ++++++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index abb7876..31de2db 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -194,6 +194,11 @@ static int marvell_read_page(struct phy_device *phydev) return __phy_read(phydev, MII_MARVELL_PHY_PAGE); } +static int marvell_get_page(struct phy_device *phydev) +{ + return phy_read(phydev, MII_MARVELL_PHY_PAGE); +} + static int marvell_write_page(struct phy_device *phydev, int page) { return __phy_write(phydev, MII_MARVELL_PHY_PAGE, page); @@ -1245,47 +1250,59 @@ static int marvell_read_status_page(struct phy_device *phydev, int page) * Some Marvell's phys have two modes: fiber and copper. * Both need status checked. * Description: - * First, check the fiber link and status. - * If the fiber link is down, check the copper link and status which - * will be the default value if both link are down. + * First, check the link of the currently selected page. Unneeded page + * switches should be prevented, they can trigger the ethernet driver to + * register a link down event. + * If the first checked link type is down, continue with checking the other + * link type. This is needed for platforms that have a fiber and copper link + * connected to the same phy. */ static int marvell_read_status(struct phy_device *phydev) { int err; + int page; - /* Check the fiber mode first */ if (linkmode_test_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, phydev->supported) && phydev->interface != PHY_INTERFACE_MODE_SGMII) { - err = marvell_set_page(phydev, MII_MARVELL_FIBER_PAGE); - if (err < 0) - goto error; + page = marvell_get_page(phydev); + if (page < 0) + return page; + + if (page != MII_MARVELL_FIBER_PAGE && + page != MII_MARVELL_COPPER_PAGE) { + page = MII_MARVELL_FIBER_PAGE; - err = marvell_read_status_page(phydev, MII_MARVELL_FIBER_PAGE); + err = marvell_set_page(phydev, page); + if (err < 0) + return err; + } + + err = marvell_read_status_page(phydev, page); if (err < 0) - goto error; + return err; - /* If the fiber link is up, it is the selected and - * used link. In this case, we need to stay in the - * fiber page. Please to be careful about that, avoid - * to restore Copper page in other functions which - * could break the behaviour for some fiber phy like + /* If the link is up, it is the selected and + * used link. In this case, we need to stay in that + * page. Please to be careful about that, avoid + * to restore the page in other functions which + * could break the behaviour for some phy's like * 88E1512. */ if (phydev->link) return 0; - /* If fiber link is down, check and save copper mode state */ - err = marvell_set_page(phydev, MII_MARVELL_COPPER_PAGE); + page = (page == MII_MARVELL_FIBER_PAGE) ? + MII_MARVELL_COPPER_PAGE : MII_MARVELL_FIBER_PAGE; + + err = marvell_set_page(phydev, page); if (err < 0) - goto error; + return err; + + return marvell_read_status_page(phydev, page); } return marvell_read_status_page(phydev, MII_MARVELL_COPPER_PAGE); - -error: - marvell_set_page(phydev, MII_MARVELL_COPPER_PAGE); - return err; } /* marvell_suspend -- 2.7.4