mirror of https://github.com/hak5/openwrt.git
121 lines
3.7 KiB
Diff
121 lines
3.7 KiB
Diff
From 36569971241ae6b81376da4937d2c8760122d10b Mon Sep 17 00:00:00 2001
|
|
From: Russell King <rmk+kernel@armlinux.org.uk>
|
|
Date: Thu, 21 Nov 2019 17:58:58 +0000
|
|
Subject: [PATCH 652/660] net: phylink: split phylink_sfp_module_insert()
|
|
|
|
Split out the configuration step from phylink_sfp_module_insert() so
|
|
we can re-use this later.
|
|
|
|
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
|
|
---
|
|
drivers/net/phy/phylink.c | 47 +++++++++++++++++++++++----------------
|
|
1 file changed, 28 insertions(+), 19 deletions(-)
|
|
|
|
--- a/drivers/net/phy/phylink.c
|
|
+++ b/drivers/net/phy/phylink.c
|
|
@@ -1633,25 +1633,21 @@ static void phylink_sfp_detach(void *ups
|
|
pl->netdev->sfp_bus = NULL;
|
|
}
|
|
|
|
-static int phylink_sfp_module_insert(void *upstream,
|
|
- const struct sfp_eeprom_id *id)
|
|
+static int phylink_sfp_config(struct phylink *pl, u8 mode, u8 port,
|
|
+ const unsigned long *supported,
|
|
+ const unsigned long *advertising)
|
|
{
|
|
- struct phylink *pl = upstream;
|
|
- __ETHTOOL_DECLARE_LINK_MODE_MASK(support) = { 0, };
|
|
__ETHTOOL_DECLARE_LINK_MODE_MASK(support1);
|
|
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(support);
|
|
struct phylink_link_state config;
|
|
phy_interface_t iface;
|
|
- int ret = 0;
|
|
bool changed;
|
|
- u8 port;
|
|
+ int ret;
|
|
|
|
- ASSERT_RTNL();
|
|
-
|
|
- sfp_parse_support(pl->sfp_bus, id, support);
|
|
- port = sfp_parse_port(pl->sfp_bus, id, support);
|
|
+ linkmode_copy(support, supported);
|
|
|
|
memset(&config, 0, sizeof(config));
|
|
- linkmode_copy(config.advertising, support);
|
|
+ linkmode_copy(config.advertising, advertising);
|
|
config.interface = PHY_INTERFACE_MODE_NA;
|
|
config.speed = SPEED_UNKNOWN;
|
|
config.duplex = DUPLEX_UNKNOWN;
|
|
@@ -1666,8 +1662,6 @@ static int phylink_sfp_module_insert(voi
|
|
return ret;
|
|
}
|
|
|
|
- linkmode_copy(support1, support);
|
|
-
|
|
iface = sfp_select_interface(pl->sfp_bus, config.advertising);
|
|
if (iface == PHY_INTERFACE_MODE_NA) {
|
|
netdev_err(pl->netdev,
|
|
@@ -1677,18 +1671,18 @@ static int phylink_sfp_module_insert(voi
|
|
}
|
|
|
|
config.interface = iface;
|
|
+ linkmode_copy(support1, support);
|
|
ret = phylink_validate(pl, support1, &config);
|
|
if (ret) {
|
|
netdev_err(pl->netdev, "validation of %s/%s with support %*pb failed: %d\n",
|
|
- phylink_an_mode_str(MLO_AN_INBAND),
|
|
+ phylink_an_mode_str(mode),
|
|
phy_modes(config.interface),
|
|
__ETHTOOL_LINK_MODE_MASK_NBITS, support, ret);
|
|
return ret;
|
|
}
|
|
|
|
netdev_dbg(pl->netdev, "requesting link mode %s/%s with support %*pb\n",
|
|
- phylink_an_mode_str(MLO_AN_INBAND),
|
|
- phy_modes(config.interface),
|
|
+ phylink_an_mode_str(mode), phy_modes(config.interface),
|
|
__ETHTOOL_LINK_MODE_MASK_NBITS, support);
|
|
|
|
if (phy_interface_mode_is_8023z(iface) && pl->phydev)
|
|
@@ -1701,15 +1695,15 @@ static int phylink_sfp_module_insert(voi
|
|
linkmode_copy(pl->link_config.advertising, config.advertising);
|
|
}
|
|
|
|
- if (pl->cur_link_an_mode != MLO_AN_INBAND ||
|
|
+ if (pl->cur_link_an_mode != mode ||
|
|
pl->link_config.interface != config.interface) {
|
|
pl->link_config.interface = config.interface;
|
|
- pl->cur_link_an_mode = MLO_AN_INBAND;
|
|
+ pl->cur_link_an_mode = mode;
|
|
|
|
changed = true;
|
|
|
|
netdev_info(pl->netdev, "switched to %s/%s link mode\n",
|
|
- phylink_an_mode_str(MLO_AN_INBAND),
|
|
+ phylink_an_mode_str(mode),
|
|
phy_modes(config.interface));
|
|
}
|
|
|
|
@@ -1722,6 +1716,21 @@ static int phylink_sfp_module_insert(voi
|
|
return ret;
|
|
}
|
|
|
|
+static int phylink_sfp_module_insert(void *upstream,
|
|
+ const struct sfp_eeprom_id *id)
|
|
+{
|
|
+ struct phylink *pl = upstream;
|
|
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(support) = { 0, };
|
|
+ u8 port;
|
|
+
|
|
+ ASSERT_RTNL();
|
|
+
|
|
+ sfp_parse_support(pl->sfp_bus, id, support);
|
|
+ port = sfp_parse_port(pl->sfp_bus, id, support);
|
|
+
|
|
+ return phylink_sfp_config(pl, MLO_AN_INBAND, port, support, support);
|
|
+}
|
|
+
|
|
static int phylink_sfp_module_start(void *upstream)
|
|
{
|
|
struct phylink *pl = upstream;
|