From nobody Sat Jul 5 01:42:15 2025 Delivered-To: importer2@patchew.org Received-SPF: pass (zohomail.com: domain of vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; envelope-from=linux-kernel-owner@vger.kernel.org; helo=vger.kernel.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1618347539; cv=none; d=zohomail.com; s=zohoarc; b=koz3NcRn8haTbnIEsI7XeHbLIuG8vqyAovaSPFTsxwQb7J7JyR4aGpmA+Aokg0DFug2imt8NsBkH/pQ/CA/pnWTvpLt1qME9icy8ywBdMoRaLLXIkNO6AZVbHjDXsYmJOsMX4RA3exXPxmJeHMRn5psW/N1/aPv9Bndlc7ZvGAs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1618347539; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:MIME-Version:Message-ID:References:Subject:To; bh=j8urAsBawMQqW2DmstObcTvQMHs3pCAcv/4J3UfUt3c=; b=j5twUWUR8c36dFVZupVTrqipyIx1yF5kHQeH2w7iXfJ1d1pWgLyeAEi3viwFEicqf/rjx49mH89gCAfw7xySR4gvjyvMHIxbDEzvVS+y63p1HPvcoO7tDjHIOuWEpj7vg3ryAPB0FVKTAzZXABMge8hgpqen/WtYz5hYX92bMgY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mx.zohomail.com with SMTP id 1618347539124511.61921422662806; Tue, 13 Apr 2021 13:58:59 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245193AbhDMU7Q (ORCPT ); Tue, 13 Apr 2021 16:59:16 -0400 Received: from mail.pr-group.ru ([178.18.215.3]:59154 "EHLO mail.pr-group.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232385AbhDMU7M (ORCPT ); Tue, 13 Apr 2021 16:59:12 -0400 Received: from localhost.localdomain ([178.70.223.189]) (authenticated user i.bornyakov@metrotek.ru) by mail.pr-group.ru with ESMTPSA (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256 bits)); Tue, 13 Apr 2021 23:58:35 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=metrotek.ru; s=mail; h=from:subject:date:message-id:to:cc:mime-version:content-transfer-encoding: in-reply-to:references; bh=P88pMk4PnSldad+6WHmqsfjiq5x8YoXoUvHJ8oiVJbk=; b=rdc5cufNwaXBLpPzskGKVzs4Jm1+Ug7w1ttWb3+QNM22YUskFVUqNYLybDNrbwMq9SPuhZ0NXLuEn fuKy5AsBgrlpeedoWQqsQuXWzkaNUSapVIpT9BTwm335dlPTfKMbe3DYfVTBstMOh76rSQEGHaW7OK 71b0wq9DO6lfK++FBxcCULNT/e79ksXIMyvLooDIZfauYGpcfHrjSABVl/san3aUwjQLkeb3f2QtV4 p6H7+iXeA9CdEe4TC1O6NGbQZnxrG39s7ZyKvS628E+QecT8XGog8hQVBRELnQABZx4IvZFoUqKseS th3Pc6i/10tW/pVrHNoXWKIAJjwAu5Q== X-Spam-Status: No, hits=0.0 required=3.4 tests=AWL: 0.000, BAYES_00: -1.665, CUSTOM_RULE_FROM: ALLOW, TOTAL_SCORE: -1.665,autolearn=ham X-Spam-Level: X-Footer: bWV0cm90ZWsucnU= From: Ivan Bornyakov Cc: Ivan Bornyakov , system@metrotek.ru, andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 1/3] net: phy: marvell-88x2222: check that link is operational Date: Tue, 13 Apr 2021 23:54:50 +0300 Message-Id: <2dbac64b0eb7d91962d1f66ac485b8efaa8b0528.1618347034.git.i.bornyakov@metrotek.ru> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable To: unlisted-recipients:; (no To-header on input) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Some SFP modules uses RX_LOS for link indication. In such cases link will be always up, even without cable connected. RX_LOS changes will trigger link_up()/link_down() upstream operations. Thus, check that SFP link is operational before actual read link status. If there is no SFP cage connected to the tranciever, check only PMD Recieve Signal Detect register. Signed-off-by: Ivan Bornyakov --- drivers/net/phy/marvell-88x2222.c | 43 +++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/drivers/net/phy/marvell-88x2222.c b/drivers/net/phy/marvell-88= x2222.c index eca8c2f20684..28fe520228a4 100644 --- a/drivers/net/phy/marvell-88x2222.c +++ b/drivers/net/phy/marvell-88x2222.c @@ -32,6 +32,10 @@ #define MV_HOST_RST_SW BIT(7) #define MV_PORT_RST_SW (MV_LINE_RST_SW | MV_HOST_RST_SW) =20 +/* PMD Receive Signal Detect */ +#define MV_RX_SIGNAL_DETECT 0x000A +#define MV_RX_SIGNAL_DETECT_GLOBAL BIT(0) + /* 1000Base-X/SGMII Control Register */ #define MV_1GBX_CTRL (0x2000 + MII_BMCR) =20 @@ -51,6 +55,7 @@ struct mv2222_data { phy_interface_t line_interface; __ETHTOOL_DECLARE_LINK_MODE_MASK(supported); + bool sfp_link; }; =20 /* SFI PMA transmit enable */ @@ -139,6 +144,21 @@ static int mv2222_read_status_1g(struct phy_device *ph= ydev) return link; } =20 +static bool mv2222_link_is_operational(struct phy_device *phydev) +{ + struct mv2222_data *priv =3D phydev->priv; + int val; + + val =3D phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_RX_SIGNAL_DETECT); + if (val < 0 || !(val & MV_RX_SIGNAL_DETECT_GLOBAL)) + return false; + + if (phydev->sfp_bus && !priv->sfp_link) + return false; + + return true; +} + static int mv2222_read_status(struct phy_device *phydev) { struct mv2222_data *priv =3D phydev->priv; @@ -148,6 +168,9 @@ static int mv2222_read_status(struct phy_device *phydev) phydev->speed =3D SPEED_UNKNOWN; phydev->duplex =3D DUPLEX_UNKNOWN; =20 + if (!mv2222_link_is_operational(phydev)) + return 0; + if (priv->line_interface =3D=3D PHY_INTERFACE_MODE_10GBASER) link =3D mv2222_read_status_10g(phydev); else @@ -446,9 +469,29 @@ static void mv2222_sfp_remove(void *upstream) linkmode_zero(priv->supported); } =20 +static void mv2222_sfp_link_up(void *upstream) +{ + struct phy_device *phydev =3D upstream; + struct mv2222_data *priv; + + priv =3D phydev->priv; + priv->sfp_link =3D true; +} + +static void mv2222_sfp_link_down(void *upstream) +{ + struct phy_device *phydev =3D upstream; + struct mv2222_data *priv; + + priv =3D phydev->priv; + priv->sfp_link =3D false; +} + static const struct sfp_upstream_ops sfp_phy_ops =3D { .module_insert =3D mv2222_sfp_insert, .module_remove =3D mv2222_sfp_remove, + .link_up =3D mv2222_sfp_link_up, + .link_down =3D mv2222_sfp_link_down, .attach =3D phy_sfp_attach, .detach =3D phy_sfp_detach, }; --=20 2.26.3