f04e377a50
QCA808x does not currently fill in the possible_interfaces. This leads to Phylink not being aware that it supports 2500Base-X as well so in cases where it is connected to a DSA switch like MV88E6393 it will limit that port to phy-mode set in the DTS. That means that if SGMII is used you are limited to 1G only while if 2500Base-X was set you are limited to 2.5G only. Populating the possible_interfaces fixes this, so lets backport the patches from kernel 6.9. This also includes a backport of the Phylink PHY validation series from kernel 6.8 that allows the use of possible_interfaces. Link: https://github.com/openwrt/openwrt/pull/15765 Signed-off-by: Robert Marko <robimarko@gmail.com>
61 lines
2.3 KiB
Diff
61 lines
2.3 KiB
Diff
From 1a7aa058bc92f0edae7a0d1ef1a7b05aec0c643a Mon Sep 17 00:00:00 2001
|
|
From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
|
|
Date: Fri, 24 Nov 2023 12:27:52 +0000
|
|
Subject: [PATCH 1/7] net: phy: add possible interfaces
|
|
|
|
Add a possible_interfaces member to struct phy_device to indicate which
|
|
interfaces a clause 45 PHY may switch between depending on the media.
|
|
This must be populated by the PHY driver by the time the .config_init()
|
|
method completes according to the PHYs host-side configuration.
|
|
|
|
For example, the Marvell 88x3310 PHY can switch between 10GBASE-R,
|
|
5GBASE-R, 2500BASE-X, and SGMII on the host side depending on the media
|
|
side speed, so all these interface modes are set in the
|
|
possible_interfaces member.
|
|
|
|
This allows phylib users (such as phylink) to know in advance which
|
|
interface modes to expect, which allows them to appropriately restrict
|
|
the advertised link modes according to the capabilities of other parts
|
|
of the link.
|
|
|
|
Tested-by: Luo Jie <quic_luoj@quicinc.com>
|
|
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
|
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
|
Link: https://lore.kernel.org/r/E1r6VHk-00DDLN-I7@rmk-PC.armlinux.org.uk
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
drivers/net/phy/phy_device.c | 2 ++
|
|
include/linux/phy.h | 3 +++
|
|
2 files changed, 5 insertions(+)
|
|
|
|
--- a/drivers/net/phy/phy_device.c
|
|
+++ b/drivers/net/phy/phy_device.c
|
|
@@ -1215,6 +1215,8 @@ int phy_init_hw(struct phy_device *phyde
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
+ phy_interface_zero(phydev->possible_interfaces);
|
|
+
|
|
if (phydev->drv->config_init) {
|
|
ret = phydev->drv->config_init(phydev);
|
|
if (ret < 0)
|
|
--- a/include/linux/phy.h
|
|
+++ b/include/linux/phy.h
|
|
@@ -600,6 +600,8 @@ struct macsec_ops;
|
|
* @irq_rerun: Flag indicating interrupts occurred while PHY was suspended,
|
|
* requiring a rerun of the interrupt handler after resume
|
|
* @interface: enum phy_interface_t value
|
|
+ * @possible_interfaces: bitmap if interface modes that the attached PHY
|
|
+ * will switch between depending on media speed.
|
|
* @skb: Netlink message for cable diagnostics
|
|
* @nest: Netlink nest used for cable diagnostics
|
|
* @ehdr: nNtlink header for cable diagnostics
|
|
@@ -665,6 +667,7 @@ struct phy_device {
|
|
u32 dev_flags;
|
|
|
|
phy_interface_t interface;
|
|
+ DECLARE_PHY_INTERFACE_MASK(possible_interfaces);
|
|
|
|
/*
|
|
* forced speed & duplex (no autoneg)
|