Import pending series introducing support for standalone PCS drivers. This has previously already been used by the airoha target, and is also the base for the closer-to-upstream patches for MediaTek MT7988 10G SerDes support. In order to not having to diverge from upstream also backport series for standardized handling for PHY and PCS SerDes pair polarity. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
104 lines
3.8 KiB
Diff
104 lines
3.8 KiB
Diff
From c6f6cb55c3c316f6169e07eacc5ccb214116719a Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Mon, 31 Mar 2025 15:40:12 +0200
|
|
Subject: [PATCH 1/7] net: phylink: keep and use MAC supported_interfaces in
|
|
phylink struct
|
|
|
|
Add in phylink struct a copy of supported_interfaces from phylink_config
|
|
and make use of that instead of relying on phylink_config value.
|
|
|
|
This in preparation for support of PCS handling internally to phylink
|
|
where a PCS can be removed or added after the phylink is created and we
|
|
need both a reference of the supported_interfaces value from
|
|
phylink_config and an internal value that can be updated with the new
|
|
PCS info.
|
|
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
---
|
|
drivers/net/phy/phylink.c | 22 +++++++++++++++-------
|
|
1 file changed, 15 insertions(+), 7 deletions(-)
|
|
|
|
--- a/drivers/net/phy/phylink.c
|
|
+++ b/drivers/net/phy/phylink.c
|
|
@@ -59,6 +59,11 @@ struct phylink {
|
|
/* The link configuration settings */
|
|
struct phylink_link_state link_config;
|
|
|
|
+ /* What interface are supported by the current link.
|
|
+ * Can change on removal or addition of new PCS.
|
|
+ */
|
|
+ DECLARE_PHY_INTERFACE_MASK(supported_interfaces);
|
|
+
|
|
/* The current settings */
|
|
phy_interface_t cur_interface;
|
|
|
|
@@ -623,7 +628,7 @@ static int phylink_validate_mask(struct
|
|
static int phylink_validate(struct phylink *pl, unsigned long *supported,
|
|
struct phylink_link_state *state)
|
|
{
|
|
- const unsigned long *interfaces = pl->config->supported_interfaces;
|
|
+ const unsigned long *interfaces = pl->supported_interfaces;
|
|
|
|
if (state->interface == PHY_INTERFACE_MODE_NA)
|
|
return phylink_validate_mask(pl, NULL, supported, state,
|
|
@@ -1853,6 +1858,9 @@ struct phylink *phylink_create(struct ph
|
|
mutex_init(&pl->state_mutex);
|
|
INIT_WORK(&pl->resolve, phylink_resolve);
|
|
|
|
+ phy_interface_copy(pl->supported_interfaces,
|
|
+ config->supported_interfaces);
|
|
+
|
|
pl->config = config;
|
|
if (config->type == PHYLINK_NETDEV) {
|
|
pl->netdev = to_net_dev(config->dev);
|
|
@@ -2011,7 +2019,7 @@ static int phylink_validate_phy(struct p
|
|
* those which the host supports.
|
|
*/
|
|
phy_interface_and(interfaces, phy->possible_interfaces,
|
|
- pl->config->supported_interfaces);
|
|
+ pl->supported_interfaces);
|
|
|
|
if (phy_interface_empty(interfaces)) {
|
|
phylink_err(pl, "PHY has no common interfaces\n");
|
|
@@ -2753,12 +2761,12 @@ static phy_interface_t phylink_sfp_selec
|
|
return interface;
|
|
}
|
|
|
|
- if (!test_bit(interface, pl->config->supported_interfaces)) {
|
|
+ if (!test_bit(interface, pl->supported_interfaces)) {
|
|
phylink_err(pl,
|
|
"selection of interface failed, SFP selected %s (%u) but MAC supports %*pbl\n",
|
|
phy_modes(interface), interface,
|
|
(int)PHY_INTERFACE_MODE_MAX,
|
|
- pl->config->supported_interfaces);
|
|
+ pl->supported_interfaces);
|
|
return PHY_INTERFACE_MODE_NA;
|
|
}
|
|
|
|
@@ -3686,14 +3694,14 @@ static int phylink_sfp_config_optical(st
|
|
|
|
phylink_dbg(pl, "optical SFP: interfaces=[mac=%*pbl, sfp=%*pbl]\n",
|
|
(int)PHY_INTERFACE_MODE_MAX,
|
|
- pl->config->supported_interfaces,
|
|
+ pl->supported_interfaces,
|
|
(int)PHY_INTERFACE_MODE_MAX,
|
|
pl->sfp_interfaces);
|
|
|
|
/* Find the union of the supported interfaces by the PCS/MAC and
|
|
* the SFP module.
|
|
*/
|
|
- phy_interface_and(pl->sfp_interfaces, pl->config->supported_interfaces,
|
|
+ phy_interface_and(pl->sfp_interfaces, pl->supported_interfaces,
|
|
pl->sfp_interfaces);
|
|
if (phy_interface_empty(pl->sfp_interfaces)) {
|
|
phylink_err(pl, "unsupported SFP module: no common interface modes\n");
|
|
@@ -3864,7 +3872,7 @@ static int phylink_sfp_connect_phy(void
|
|
|
|
/* Set the PHY's host supported interfaces */
|
|
phy_interface_and(phy->host_interfaces, phylink_sfp_interfaces,
|
|
- pl->config->supported_interfaces);
|
|
+ pl->supported_interfaces);
|
|
|
|
/* Do the initial configuration */
|
|
return phylink_sfp_config_phy(pl, phy);
|