| 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 |
| @@ -1688,25 +1688,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; |
| @@ -1721,8 +1717,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) { |
| phylink_err(pl, |
| @@ -1732,18 +1726,18 @@ static int phylink_sfp_module_insert(voi |
| } |
| |
| config.interface = iface; |
| + linkmode_copy(support1, support); |
| ret = phylink_validate(pl, support1, &config); |
| if (ret) { |
| phylink_err(pl, "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; |
| } |
| |
| phylink_dbg(pl, "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) |
| @@ -1756,15 +1750,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; |
| |
| phylink_info(pl, "switched to %s/%s link mode\n", |
| - phylink_an_mode_str(MLO_AN_INBAND), |
| + phylink_an_mode_str(mode), |
| phy_modes(config.interface)); |
| } |
| |
| @@ -1777,6 +1771,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; |