From patchwork Mon Jul 1 08:51:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Gantois X-Patchwork-Id: 13717676 X-Patchwork-Delegate: kuba@kernel.org Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C977A86131; Mon, 1 Jul 2024 08:50:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823849; cv=none; b=T2CHgwrN8RL3ZvY7CP/mGkTAqXk2X6lvNRYwWvnRGHyf4OtVXQHVtyAGaXEhWHkFzpHo1yJ5CkBcTzXCOYFPZFMOwDuYPsHHFBTX+hdGbgqSVQorI4zV9rwT0qkU4K4Q8L+1G+/zQpxVlwpgOp1S9fxEveTGnPFWpxQGPRYA9OM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823849; c=relaxed/simple; bh=XCkunF4AkoYqkk7iGvEclPs05+M/NfpaS+34vYEgKWQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mAh008UanuZbTD57iLBAFgGOU7PN3g7HMyva9LPRpCa73lSUzSElTem+IHnp09Bc+/pnAQDqWbsKO3bVbMG69+ZYtm3KLVhqogip0mmynq9GjGlIzuWDUFom6f21L/ly4KiZC/vRnpQvd8KKnTHW6yM9Rva2x9P3HUUbITfsMKA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=DJ7gTZLQ; arc=none smtp.client-ip=217.70.183.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="DJ7gTZLQ" Received: by mail.gandi.net (Postfix) with ESMTPSA id 602F2C0011; Mon, 1 Jul 2024 08:50:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1719823844; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ew3JaznEZxurg8VWcTWT0iqBhrJFxR4lf44/wyJRZV4=; b=DJ7gTZLQTxh8TCadSbqg5H1e9BFo/cx8I+wCnN0Nw9EnX7oHelxZZaEPoCIWV4ogQCf7KR 6GDj2HjMp0pxBTt5iDI4CYTvUWCQ22Bn0LVooDGzazpWgwsCHriD6Pi1Rg0L4rkefmIL7T j9Mqord/KHqPxBBzo0qmMWqPwTBt/Iy8pxwo53QnWusHH+k9yB7oUYigQHcm3hZhFasai2 ckg5veS8kR5Q9cYjynYbdsdJ45GaFMAkMs0hDkuMYOMBEayW3wOZQN9Evr2zC5Ldsqf2pk Cn1C0q8G3NBzopIl+fHGAZz8uhnXFrduoqA+TGX0mCM8U36CON18mvX+aAtMww== From: Romain Gantois Date: Mon, 01 Jul 2024 10:51:03 +0200 Subject: [PATCH net-next 1/6] net: phy: dp83869: Disable autonegotiation in RGMII/1000Base-X mode Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240701-b4-dp83869-sfp-v1-1-a71d6d0ad5f8@bootlin.com> References: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> In-Reply-To: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Thomas Petazzoni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Romain Gantois X-Mailer: b4 0.14.0 X-GND-Sasl: romain.gantois@bootlin.com X-Patchwork-Delegate: kuba@kernel.org Currently, the DP83869 driver only disables autonegotiation in fiber configurations for 100Base-FX mode. However, the DP83869 PHY does not support autonegotiation in any of its fiber modes. Disable autonegotiation for all fiber modes. Signed-off-by: Romain Gantois --- drivers/net/phy/dp83869.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/net/phy/dp83869.c b/drivers/net/phy/dp83869.c index d7aaefb5226b6..f6b05e3a3173e 100644 --- a/drivers/net/phy/dp83869.c +++ b/drivers/net/phy/dp83869.c @@ -647,6 +647,21 @@ static int dp83869_configure_fiber(struct phy_device *phydev, linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, phydev->supported); linkmode_set_bit(ADVERTISED_FIBRE, phydev->advertising); + /* Auto neg is not supported in 100/1000base FX modes */ + bmcr = phy_read(phydev, MII_BMCR); + if (bmcr < 0) + return bmcr; + + phydev->autoneg = AUTONEG_DISABLE; + linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported); + linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->advertising); + + if (bmcr & BMCR_ANENABLE) { + ret = phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0); + if (ret < 0) + return ret; + } + if (dp83869->mode == DP83869_RGMII_1000_BASE) { linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, phydev->supported); @@ -655,21 +670,6 @@ static int dp83869_configure_fiber(struct phy_device *phydev, phydev->supported); linkmode_set_bit(ETHTOOL_LINK_MODE_100baseFX_Half_BIT, phydev->supported); - - /* Auto neg is not supported in 100base FX mode */ - bmcr = phy_read(phydev, MII_BMCR); - if (bmcr < 0) - return bmcr; - - phydev->autoneg = AUTONEG_DISABLE; - linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported); - linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->advertising); - - if (bmcr & BMCR_ANENABLE) { - ret = phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0); - if (ret < 0) - return ret; - } } /* Update advertising from supported */ From patchwork Mon Jul 1 08:51:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Gantois X-Patchwork-Id: 13717677 X-Patchwork-Delegate: kuba@kernel.org Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C97B7126F02; Mon, 1 Jul 2024 08:50:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823849; cv=none; b=uNLXuhOVjjvY29+Cs5xPhOrg6a5tvDzVpFQzcGPKZqe16FN6EBfYlWfgJbm1O/btF6nYCDKbYnQKzWHB3WTNN4DKGtnK+KTVnLe7etwHDDc20dw0ev2rJmEgylpd4RfkOUME/OIj7fqU6OOiuucAaQ8BVlh3hkv4V1ZK5wvS9Vg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823849; c=relaxed/simple; bh=4erFu/spT9FjrZekQ2U9iz8hr99jm+tE7VnqW8IDVLs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NcwWw2aaPih8miJm09Y/A2Pk9+X//sHIDMCWgvxwctQRL+3h7XmYdzX8/8Dd+SJlaXxWaeBF+zbvO9HI5ZKS1tUEjtVLSGfi0MsoAK+R0RXicyDJBP+ctOE2ULDI2UULMHfh9BlOjj4Ec8QKTG8BlkoUVCwcC+u8vg483leIEDI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=GxOKHRw6; arc=none smtp.client-ip=217.70.183.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="GxOKHRw6" Received: by mail.gandi.net (Postfix) with ESMTPSA id 0D52BC0004; Mon, 1 Jul 2024 08:50:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1719823845; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zn0q+gZqrKKeF19k9TKaX7hCYo/kcK3UWiKgxWYe21c=; b=GxOKHRw6nyjpfFNCwjheFQHkEkQJKFcK0eoOsjcB0KVSy8MQUl6/PaVMqWy27NjhTBnLXT gRqiV/Soa6R7lcL5Rd6vrZsgwj7TIQcP28EhsQ92/4IBueOcs4+atBmaCJsvexKzWUAyH9 2agXzxrDRQagSLvWKz03+mILx71siCOYPSbsbrTWlkTsTzf/voXQ5bMpBKcVsmsn4kOQqg JkHRtw9egjXuwxVHYxnPrnsxbpYagm27Pe8FpzxvAyGRU+hDjSPIBlrxeZYgKyN4SZtg06 Ufodxg+hdaKLTureOdCIBSk6agaCyS1pxY39NW2R/oF0pyIkhoMuNNDTCK6EeA== From: Romain Gantois Date: Mon, 01 Jul 2024 10:51:04 +0200 Subject: [PATCH net-next 2/6] net: phy: dp83869: Perform software restart after configuring op mode Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240701-b4-dp83869-sfp-v1-2-a71d6d0ad5f8@bootlin.com> References: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> In-Reply-To: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Thomas Petazzoni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Romain Gantois X-Mailer: b4 0.14.0 X-GND-Sasl: romain.gantois@bootlin.com X-Patchwork-Delegate: kuba@kernel.org The DP83869 PHY requires a software restart after OP_MODE is changed in the OP_MODE_DECODE register. Add this restart in dp83869_configure_mode(). Signed-off-by: Romain Gantois --- drivers/net/phy/dp83869.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/phy/dp83869.c b/drivers/net/phy/dp83869.c index f6b05e3a3173e..6bb9bb1c0e962 100644 --- a/drivers/net/phy/dp83869.c +++ b/drivers/net/phy/dp83869.c @@ -786,6 +786,10 @@ static int dp83869_configure_mode(struct phy_device *phydev, return -EINVAL; } + ret = phy_write(phydev, DP83869_CTRL, DP83869_SW_RESTART); + + usleep_range(10, 20); + return ret; } From patchwork Mon Jul 1 08:51:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Gantois X-Patchwork-Id: 13717678 X-Patchwork-Delegate: kuba@kernel.org Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C973483CD4; Mon, 1 Jul 2024 08:50:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823849; cv=none; b=prSzhFbqfBpZ2EvdB1//jbkaS/VNmTUPVTzTKA4QpmFIQ64Cp+CiekMIRr2FjZauYxhK8U5vLZsF+yRckD049RDUTEsMEI7PLKgC2KAqxOAkNG5tfWr5dICtXd8+EXGo1p4ikSKf5YVYEvaEsDwuM72rOa2WCgWJUMutjobn6kw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823849; c=relaxed/simple; bh=dM26KV7IcWU1eKc3ESLM8nCREge6dZZhQTJUDCMgjeY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=REWi/jRbQ8Cc9JBpcgUe+a2dwPmWzCLMYjESdvI8T+ZP8bamF5GYofLxl/Qn59FKtDz6LsXMjmjYME7dBWkE1Ee5VRp2ups39oafUjoiqJ4fkJx/tVT8+CrxQ4ZNuqYc9wQwkhmTJkuMqZygzmuFZ/CX5co5zNqiDKJPAGbLmPg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=aBOg2sMg; arc=none smtp.client-ip=217.70.183.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="aBOg2sMg" Received: by mail.gandi.net (Postfix) with ESMTPSA id A6F59C000E; Mon, 1 Jul 2024 08:50:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1719823846; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4KWTM28xCttexEfryGnrAJQCAdQ+fe99PoCf6yYBGvY=; b=aBOg2sMgmPAEG0asW8W5yHv8Xb1IdQEA/Rn1gjlHKZ0weyL8Lu+s7dqhAdWsb8nCREb2ij JbTqMpGtE2g0Kf5fbPo5KAESyjWoAquk+2qtczQCOSe+CB1lQRoa9k0JYQ8JH/DPYOYk7w Qtb3M4xBHLqP1waFMn7tKtRzyLOWBfwyZ2ikEaNr+xW9FJLwP8CyawsY+pFl+uA5eABFvk S3oNXYuBiGvDiu0tXZM6unX+EuERe8Gi4djl6psPxyEzUrpeaSriM8k+RkxkrX5bCM3F3+ kPEeislca4RvFM6K7p2r8zDN9wjGySgRyxwamWrk9VUFzfOQc3Sz3oWWAtiD8w== From: Romain Gantois Date: Mon, 01 Jul 2024 10:51:05 +0200 Subject: [PATCH net-next 3/6] net: phy: dp83869: Ensure that the FORCE_LINK_GOOD bit is cleared Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240701-b4-dp83869-sfp-v1-3-a71d6d0ad5f8@bootlin.com> References: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> In-Reply-To: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Thomas Petazzoni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Romain Gantois X-Mailer: b4 0.14.0 X-GND-Sasl: romain.gantois@bootlin.com X-Patchwork-Delegate: kuba@kernel.org This bit is located in the PHY_CONTROL register and should be cleared on reset. However, this is not always the case, which can cause unexpected behavior such as link up being incorrectly reported as good when the DP83869 is brought up directly in RGMII-SGMII bridge mode. Make sure that this bit is cleared for all operational modes. Signed-off-by: Romain Gantois --- drivers/net/phy/dp83869.c | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/drivers/net/phy/dp83869.c b/drivers/net/phy/dp83869.c index 6bb9bb1c0e962..579cf6f84e030 100644 --- a/drivers/net/phy/dp83869.c +++ b/drivers/net/phy/dp83869.c @@ -713,17 +713,20 @@ static int dp83869_configure_mode(struct phy_device *phydev, if (ret) return ret; - phy_ctrl_val = (dp83869->rx_fifo_depth << DP83869_RX_FIFO_SHIFT | + /* The FORCE_LINK_GOOD bit 10 in the PHYCTRL register should be + * unset after a hardware reset but it is not. make sure it is + * cleared so that the PHY can function properly. + * Also configure TX/RX FIFO depth for modes that require it. + */ + ret = phy_write(phydev, MII_DP83869_PHYCTRL, + dp83869->rx_fifo_depth << DP83869_RX_FIFO_SHIFT | dp83869->tx_fifo_depth << DP83869_TX_FIFO_SHIFT | DP83869_PHY_CTRL_DEFAULT); + if (ret) + return ret; switch (dp83869->mode) { case DP83869_RGMII_COPPER_ETHERNET: - ret = phy_write(phydev, MII_DP83869_PHYCTRL, - phy_ctrl_val); - if (ret) - return ret; - ret = phy_write(phydev, MII_CTRL1000, DP83869_CFG1_DEFAULT); if (ret) return ret; @@ -746,28 +749,14 @@ static int dp83869_configure_mode(struct phy_device *phydev, break; case DP83869_1000M_MEDIA_CONVERT: - ret = phy_write(phydev, MII_DP83869_PHYCTRL, - phy_ctrl_val); - if (ret) - return ret; - ret = phy_write_mmd(phydev, DP83869_DEVADDR, DP83869_FX_CTRL, DP83869_FX_CTRL_DEFAULT); if (ret) return ret; break; case DP83869_100M_MEDIA_CONVERT: - ret = phy_write(phydev, MII_DP83869_PHYCTRL, - phy_ctrl_val); - if (ret) - return ret; break; case DP83869_SGMII_COPPER_ETHERNET: - ret = phy_write(phydev, MII_DP83869_PHYCTRL, - phy_ctrl_val); - if (ret) - return ret; - ret = phy_write(phydev, MII_CTRL1000, DP83869_CFG1_DEFAULT); if (ret) return ret; From patchwork Mon Jul 1 08:51:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Gantois X-Patchwork-Id: 13717680 X-Patchwork-Delegate: kuba@kernel.org Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F5BE7E0F0; Mon, 1 Jul 2024 08:50:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823850; cv=none; b=cb44uCCGOtA/A6nGgARKuRpAIXZMA+i2l9038yq1qO3ciPC5H/0GTnb33YfGWlNPWBVYHCrbDnzj1DN40LKtGCnJxZ0XtgCjUiKmrJg9F+B0LpBYOxJ9+Qx4uNRWoXKgQbTQ0t6AcovxSoaJF3SIO45IDyHuIGnAfwIJGij8ZEs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823850; c=relaxed/simple; bh=1ZHhzaXO/qyzrVPK875CXBdCiwYG+tNpCoZ7YYPtqxg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ip+0FILhfwqKxW6Y4hl/+M6us4wfdkQFAQ2sSIB2tCMpJtwttLG8X+Xwu5r16jwf9BkmvKote4C0WXVxBRKE2yA7KATk1STT+dUOvxEBkM04xsGOzZOjRIZrfD2+reCyKpkWIMVjDAC2Pq/WYq5Y4tjnkM32AKUPwhUGSjMzw8M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=QqSNhPO9; arc=none smtp.client-ip=217.70.183.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="QqSNhPO9" Received: by mail.gandi.net (Postfix) with ESMTPSA id 5EBC4C000D; Mon, 1 Jul 2024 08:50:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1719823846; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=MZphmPMPCyxcl1+lMlccveFAU5GvuISteHDMC4X9nDA=; b=QqSNhPO9khOguffGObeAEmjOC0bBH4YUUUOiCo54Ppji21mL/3bO6EgRqVEWdVWWBHIOhX WyKMXBopdn9a/20l7v+ix2UxUPut8KdWEo45aYPQ/hoV1oOk7VkDKBD2BkoG9m/2eIMVZi 6wXKXJlNecX7SPRRKfjg0QdfSWPwQFReNdiYmGHIRdWz3Fnauuq0HrD0rom4i65g/G4oQv AKxJarvVZYUuZKhxzds7o2oK3CrylSNt1B2esiCw3iRugkLa2LHQLeKLB0xQ4DSnvsLqRf O7mo3LXGlCY9JAjPaywDdEt9x6tWJeebEfcwUHqeL53glk6foyugo6yA0KHlaA== From: Romain Gantois Date: Mon, 01 Jul 2024 10:51:06 +0200 Subject: [PATCH net-next 4/6] net: phy: dp83869: Support 1000Base-X and 100Base-FX SFP modules Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240701-b4-dp83869-sfp-v1-4-a71d6d0ad5f8@bootlin.com> References: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> In-Reply-To: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Thomas Petazzoni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Romain Gantois X-Mailer: b4 0.14.0 X-GND-Sasl: romain.gantois@bootlin.com X-Patchwork-Delegate: kuba@kernel.org The DP83869HM PHY transceiver can be configured in RGMII-1000Base-X mode to interface an RGMII MAC with a copper direct-attach (DAC) or fiber SFP module. SFP upstream ops are needed to notify the DP83869 driver of SFP module insertions and let it configure the PHY appropriately. Add relevant SFP callbacks to the DP83869 driver to support 1000Base-X and 100Base-FX modules. Signed-off-by: Romain Gantois --- drivers/net/phy/dp83869.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/drivers/net/phy/dp83869.c b/drivers/net/phy/dp83869.c index 579cf6f84e030..a3ccaad738b28 100644 --- a/drivers/net/phy/dp83869.c +++ b/drivers/net/phy/dp83869.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include @@ -843,6 +845,62 @@ static int dp83869_config_init(struct phy_device *phydev) return ret; } +static int dp83869_module_insert(void *upstream, const struct sfp_eeprom_id *id) +{ + __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_support); + __ETHTOOL_DECLARE_LINK_MODE_MASK(sfp_support); + DECLARE_PHY_INTERFACE_MASK(interfaces); + struct phy_device *phydev = upstream; + struct dp83869_private *dp83869; + phy_interface_t interface; + + linkmode_zero(phy_support); + phylink_set(phy_support, 1000baseX_Full); + phylink_set(phy_support, 100baseFX_Full); + phylink_set(phy_support, FIBRE); + + linkmode_zero(sfp_support); + sfp_parse_support(phydev->sfp_bus, id, sfp_support, interfaces); + + linkmode_and(sfp_support, phy_support, sfp_support); + + if (linkmode_empty(sfp_support)) { + dev_err(&phydev->mdio.dev, "incompatible SFP module inserted\n"); + return -EINVAL; + } + + interface = sfp_select_interface(phydev->sfp_bus, sfp_support); + + dev_info(&phydev->mdio.dev, "%s SFP compatible link mode: %s\n", __func__, + phy_modes(interface)); + + dp83869 = phydev->priv; + + switch (interface) { + case PHY_INTERFACE_MODE_100BASEX: + dp83869->mode = DP83869_RGMII_100_BASE; + phydev->port = PORT_FIBRE; + break; + case PHY_INTERFACE_MODE_1000BASEX: + dp83869->mode = DP83869_RGMII_1000_BASE; + phydev->port = PORT_FIBRE; + break; + default: + dev_err(&phydev->mdio.dev, + "incompatible PHY-to-SFP module link mode %s!\n", + phy_modes(interface)); + return -EINVAL; + } + + return dp83869_configure_mode(phydev, dp83869); +} + +static const struct sfp_upstream_ops dp83869_sfp_ops = { + .attach = phy_sfp_attach, + .detach = phy_sfp_detach, + .module_insert = dp83869_module_insert, +}; + static int dp83869_probe(struct phy_device *phydev) { struct dp83869_private *dp83869; @@ -859,6 +917,10 @@ static int dp83869_probe(struct phy_device *phydev) if (ret) return ret; + ret = phy_sfp_probe(phydev, &dp83869_sfp_ops); + if (ret) + return ret; + if (dp83869->mode == DP83869_RGMII_100_BASE || dp83869->mode == DP83869_RGMII_1000_BASE) phydev->port = PORT_FIBRE; From patchwork Mon Jul 1 08:51:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Gantois X-Patchwork-Id: 13717681 X-Patchwork-Delegate: kuba@kernel.org Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1AB5783CD2; Mon, 1 Jul 2024 08:50:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823851; cv=none; b=GL/Ju/xKTd3D/edGqmjLCRhHIfRj0lxrDQlp4tYK49KVFVVcBFTWVZei4vAuIb+kfjq0Pd+TKlf5GJMopIfnBEgMmhZWlcrVzGKGcu4/M2EeW0V2WWaAssFfHiUjogMhPk5RPj2MMtcNB3OQghhF9lbSYxfIY0fMJC/1zJ662yc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823851; c=relaxed/simple; bh=Qbzsv+o+10uVgBolMErJzFgza2Cclektj/sx8Hrkgpk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r+T+xxUrECOJbjbkX4CQicm4jkbMy/6/RYZ8dDt5p1ZE5PO7Pi+nRBJLEbQF6bkD+oiA09sBu4SOhez9lGgPchiRtv2K9CNce1l8azcaHQL2w599/0M9oI2a2cmPEMEP61GzCFVTE8gQBm5EwKHH6yX3QdREgBvsKji7gZjIi8w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=bcI/U9nZ; arc=none smtp.client-ip=217.70.183.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="bcI/U9nZ" Received: by mail.gandi.net (Postfix) with ESMTPSA id 02216C0010; Mon, 1 Jul 2024 08:50:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1719823847; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=e+k+cQVeC5+oHnw/gxWDOFgR0fNAUfcW0a0uGgqAPu8=; b=bcI/U9nZdbhD1hLyYm9NRhCL1N33tiP1M1Fisl0bNhgiVQsnZjwprHoKMdJZaFGQRNpsHz dLEBHD8mRobvrZi2sLNa4gZl7N80RgNDFpkfTx8+snQ6H6Etzg7+xqmQMVpJSdfpV3emDu NHQW2jtKpy8R9xIGAvR8/PML77bek/964OMVuciD5FhwgXAZGUeCLY+fwON0P33wrTtIRG Nzc2kQ9DY2WsSY+yU+9wZAX0b0QMgG1XaqwKDyWq1YsDHtDhs1b9+V968+YqS8jwuo9gOa uAYKPhOirS0z1EHHFGzu0ZfiYpXkD3Wc9fwMfYz0I+JQy2XzaGbk0QkjzpRTjg== From: Romain Gantois Date: Mon, 01 Jul 2024 10:51:07 +0200 Subject: [PATCH net-next 5/6] net: phy: dp83869: Support SGMII SFP modules Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240701-b4-dp83869-sfp-v1-5-a71d6d0ad5f8@bootlin.com> References: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> In-Reply-To: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Thomas Petazzoni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Romain Gantois X-Mailer: b4 0.14.0 X-GND-Sasl: romain.gantois@bootlin.com X-Patchwork-Delegate: kuba@kernel.org The DP83869HM PHY transceiver can be configured in RGMII-SGMII bridge mode to interface an RGMII MAC with a standard SFP module containing an integrated PHY. Additional SFP upstream ops are needed to notify the DP83869 driver of SFP PHY detection so that it can initialize it. Add relevant SFP callbacks to the DP83869 driver to support SGMII modules. Signed-off-by: Romain Gantois --- drivers/net/phy/dp83869.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/drivers/net/phy/dp83869.c b/drivers/net/phy/dp83869.c index a3ccaad738b28..a07ec1be84baf 100644 --- a/drivers/net/phy/dp83869.c +++ b/drivers/net/phy/dp83869.c @@ -153,6 +153,8 @@ struct dp83869_private { bool rxctrl_strap_quirk; int clk_output_sel; int mode; + /* PHY in a downstream SFP module */ + struct phy_device *mod_phy; }; static int dp83869_read_status(struct phy_device *phydev) @@ -845,6 +847,93 @@ static int dp83869_config_init(struct phy_device *phydev) return ret; } +static void dp83869_sfp_phy_change(struct phy_device *phydev, bool up) +{ + /* phylink uses this to populate its own structs from phy_device fields + * we don't actually need this callback but if we don't implement it + * the phy core will crash + */ +} + +static int dp83869_connect_phy(void *upstream, struct phy_device *phy) +{ + struct phy_device *phydev = upstream; + struct dp83869_private *dp83869; + + dp83869 = phydev->priv; + + if (dp83869->mode != DP83869_RGMII_SGMII_BRIDGE) + return 0; + + if (!phy->drv) { + dev_warn(&phy->mdio.dev, "No driver bound to SFP module phy!\n"); + return 0; + } + + phy_support_asym_pause(phy); + linkmode_set_bit(PHY_INTERFACE_MODE_SGMII, phy->host_interfaces); + phy->interface = PHY_INTERFACE_MODE_SGMII; + phy->port = PORT_TP; + + phy->speed = SPEED_UNKNOWN; + phy->duplex = DUPLEX_UNKNOWN; + phy->pause = MLO_PAUSE_NONE; + phy->interrupts = PHY_INTERRUPT_DISABLED; + phy->irq = PHY_POLL; + phy->phy_link_change = &dp83869_sfp_phy_change; + phy->state = PHY_READY; + + dp83869->mod_phy = phy; + + return 0; +} + +static void dp83869_disconnect_phy(void *upstream) +{ + struct phy_device *phydev = upstream; + struct dp83869_private *dp83869; + + dp83869 = phydev->priv; + dp83869->mod_phy = NULL; +} + +static int dp83869_module_start(void *upstream) +{ + struct phy_device *phydev = upstream; + struct dp83869_private *dp83869; + struct phy_device *mod_phy; + int ret; + + dp83869 = phydev->priv; + mod_phy = dp83869->mod_phy; + if (!mod_phy) + return 0; + + ret = phy_init_hw(mod_phy); + if (ret) { + dev_err(&mod_phy->mdio.dev, "Failed to initialize PHY hardware: error %d", ret); + return ret; + } + + phy_start(mod_phy); + + return 0; +} + +static void dp83869_module_stop(void *upstream) +{ + struct phy_device *phydev = upstream; + struct dp83869_private *dp83869; + struct phy_device *mod_phy; + + dp83869 = phydev->priv; + mod_phy = dp83869->mod_phy; + if (!mod_phy) + return; + + phy_stop(mod_phy); +} + static int dp83869_module_insert(void *upstream, const struct sfp_eeprom_id *id) { __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_support); @@ -858,6 +947,13 @@ static int dp83869_module_insert(void *upstream, const struct sfp_eeprom_id *id) phylink_set(phy_support, 1000baseX_Full); phylink_set(phy_support, 100baseFX_Full); phylink_set(phy_support, FIBRE); + phylink_set(phy_support, 10baseT_Full); + phylink_set(phy_support, 100baseT_Full); + phylink_set(phy_support, 1000baseT_Full); + phylink_set(phy_support, Autoneg); + phylink_set(phy_support, Pause); + phylink_set(phy_support, Asym_Pause); + phylink_set(phy_support, TP); linkmode_zero(sfp_support); sfp_parse_support(phydev->sfp_bus, id, sfp_support, interfaces); @@ -877,6 +973,10 @@ static int dp83869_module_insert(void *upstream, const struct sfp_eeprom_id *id) dp83869 = phydev->priv; switch (interface) { + case PHY_INTERFACE_MODE_SGMII: + dp83869->mode = DP83869_RGMII_SGMII_BRIDGE; + phydev->port = PORT_TP; + break; case PHY_INTERFACE_MODE_100BASEX: dp83869->mode = DP83869_RGMII_100_BASE; phydev->port = PORT_FIBRE; @@ -899,6 +999,10 @@ static const struct sfp_upstream_ops dp83869_sfp_ops = { .attach = phy_sfp_attach, .detach = phy_sfp_detach, .module_insert = dp83869_module_insert, + .module_start = dp83869_module_start, + .module_stop = dp83869_module_stop, + .connect_phy = dp83869_connect_phy, + .disconnect_phy = dp83869_disconnect_phy, }; static int dp83869_probe(struct phy_device *phydev) From patchwork Mon Jul 1 08:51:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Gantois X-Patchwork-Id: 13717682 X-Patchwork-Delegate: kuba@kernel.org Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1F80129A74; Mon, 1 Jul 2024 08:50:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823851; cv=none; b=oipWS89sAhpv2Ftb688Vy6MSVncGR3aRpfBjOY56QFuY0ADQhlQ5D+oBwYyxNURSj+Tx40IrA7GnVd+QgXfNmiYl69vDuQGXdSxTQTZ5uc2WowyRrHO36eBgTxhjc7gMLs14wTqMLkuOUYarw6sbsmO5Ja3cMqOifie+QCvX/dA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719823851; c=relaxed/simple; bh=n2/xgzsl+qJoK6f43YJ0iruAwF8Tx6e40mU2gJPkrkE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C7shQrboYfFbJT2FmONsWc6XPMFQO0TM/UHXzRQq1MV6XzNcAM3R1F3mvFymmK7izf7Zjz3A+76etxsxldbUACees8pWZpQOv7VDBWr8URj9uieE9xNVa/Q8IEn8MtOmUTjIyboLJDe/Em3lEPuBzXTtP8QMtJ4g99Df66Mawjk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=kNlE+jEi; arc=none smtp.client-ip=217.70.183.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="kNlE+jEi" Received: by mail.gandi.net (Postfix) with ESMTPSA id A0611C0008; Mon, 1 Jul 2024 08:50:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1719823848; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XwNu9+nW/Ko4RFh/lSyDmVJiYeuN5ritog+3eRgk5Q4=; b=kNlE+jEiG+UJrQPUSg21WD+M/se5DBN4BNCINxSHuXl5x8LGZGjOxEV7QIlQTSdND8RQO1 3EF7M5/aZykTuqHc7+1beyOk+jDVVrJ5ra/I7VkSp3SP1ZDCKce5i/0ITGslFDbjVmnvp6 RXLTWRU2X+zLL3obVg02uV65ic1WaERrQTx99LKPGt5fnMR52i6CSQOd6UNejzFGNiwSO2 JV1yYNknbpoNCWHPlsWac3lFEpZOYOx0vCZVjTGLT5l/dWo/x7TpSPq8WdVvJCo2+V8ROi alN1bPsapjQTE5rCsaU28tGzSSmLHo1baJEYGwNPET7kNS/5uHXpBrAteEAcIA== From: Romain Gantois Date: Mon, 01 Jul 2024 10:51:08 +0200 Subject: [PATCH net-next 6/6] net: phy: dp83869: Fix link up reporting in SGMII bridge mode Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240701-b4-dp83869-sfp-v1-6-a71d6d0ad5f8@bootlin.com> References: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> In-Reply-To: <20240701-b4-dp83869-sfp-v1-0-a71d6d0ad5f8@bootlin.com> To: Andrew Lunn , Heiner Kallweit , Russell King , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Thomas Petazzoni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Romain Gantois X-Mailer: b4 0.14.0 X-GND-Sasl: romain.gantois@bootlin.com X-Patchwork-Delegate: kuba@kernel.org In RGMII-SGMII bridge mode, the DP83869HM PHY can perform an SGMII autonegotiation with a downstream link partner. In this operational mode, the standard link and autonegotiation status bits do not report correct values, the extended fiber status register must be checked. Link parameters should theoretically be obtainable from the DP83869 registers after SGMII autonegotiation has completed. However, for unknown reasons, this is not the case, and the link partner fiber capabilities register will incorrectly report a remote fault even if the SGMII autonegotiation was successful. Modify the read_status() callback of the DP83869 driver to check the fiber status register in RGMII-SGMII bridge mode. On link up, obtain the link parameters from the downstream SFP PHY driver if possible. If not, set speed and duplex to "unknown". Signed-off-by: Romain Gantois --- drivers/net/phy/dp83869.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/dp83869.c b/drivers/net/phy/dp83869.c index a07ec1be84baf..843af90667d41 100644 --- a/drivers/net/phy/dp83869.c +++ b/drivers/net/phy/dp83869.c @@ -43,6 +43,7 @@ #define DP83869_IO_MUX_CFG 0x0170 #define DP83869_OP_MODE 0x01df #define DP83869_FX_CTRL 0x0c00 +#define DP83869_FX_STS 0x0c01 #define DP83869_SW_RESET BIT(15) #define DP83869_SW_RESTART BIT(14) @@ -72,6 +73,10 @@ /* This is the same bit mask as the BMCR so re-use the BMCR default */ #define DP83869_FX_CTRL_DEFAULT MII_DP83869_BMCR_DEFAULT +/* FX_STS bits */ +#define DP83869_FX_LSTATUS BIT(2) +#define DP83869_FX_ANEGCOMPLETE BIT(5) + /* CFG1 bits */ #define DP83869_CFG1_DEFAULT (ADVERTISE_1000HALF | \ ADVERTISE_1000FULL | \ @@ -160,7 +165,8 @@ struct dp83869_private { static int dp83869_read_status(struct phy_device *phydev) { struct dp83869_private *dp83869 = phydev->priv; - int ret; + int ret, old_link = phydev->link; + u32 status; ret = genphy_read_status(phydev); if (ret) @@ -176,6 +182,38 @@ static int dp83869_read_status(struct phy_device *phydev) } } + if (dp83869->mode == DP83869_RGMII_SGMII_BRIDGE) { + /* check if SGMII link is up */ + status = phy_read_mmd(phydev, DP83869_DEVADDR, DP83869_FX_STS); + + phydev->link = status & DP83869_FX_LSTATUS ? 1 : 0; + phydev->autoneg_complete = status & DP83869_FX_ANEGCOMPLETE ? 1 : 0; + + if (!phydev->autoneg_complete) { + phydev->link = 0; + } else if (phydev->link && !old_link) { + /* It seems like link status and duplex resolved from + * SGMII autonegotiation are incorrectly reported in + * the fiber link partner capabilities register and in + * the PHY status register. If there is a handle to the + * downstream PHY, read link parameters from it. If + * not, fallback to unknown. + */ + + if (dp83869->mod_phy) { + ret = phy_read_status(dp83869->mod_phy); + if (ret) + return ret; + + phydev->speed = dp83869->mod_phy->speed; + phydev->duplex = dp83869->mod_phy->duplex; + } else { + phydev->speed = SPEED_UNKNOWN; + phydev->duplex = DUPLEX_UNKNOWN; + } + } + } + return 0; }