mirror of
https://github.com/openwrt/openwrt.git
synced 2026-06-17 12:40:16 +04:00
f9f8531903
Backport phylink_replay_link() API patch from upstream kernel. This is mostly needed for force_major_config bool in phylink struct needed for new standalone PCS series. While at it also rename the current 703 patch to 703-01 as it's part of the same series merged upstream. All patch automatically refreshed. Link: https://github.com/openwrt/openwrt/pull/23271 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
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
|
|
@@ -60,6 +60,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;
|
|
|
|
@@ -625,7 +630,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,
|
|
@@ -1857,6 +1862,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);
|
|
@@ -2015,7 +2023,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");
|
|
@@ -2757,12 +2765,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;
|
|
}
|
|
|
|
@@ -3690,14 +3698,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");
|
|
@@ -3868,7 +3876,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);
|