Message ID | 20190523011958.14944-10-ioana.ciornei@nxp.com |
---|---|
State | RFC |
Delegated to: | David Miller |
Headers | show |
Series | Decoupling PHYLINK from struct net_device | expand |
On 5/22/2019 6:20 PM, Ioana Ciornei wrote: > From: Vladimir Oltean <olteanv@gmail.com> > > PHYLIB and PHYLINK handle fixed-link interfaces differently. PHYLIB > wraps them in a software PHY ("pseudo fixed link") phydev construct such > that .adjust_link driver callbacks see an unified API. Whereas PHYLINK > simply creates a phylink_link_state structure and passes it to > .mac_config. > > At the time the driver was introduced, DSA was using PHYLIB for the > CPU/cascade ports (the ones with no net devices) and PHYLINK for > everything else. > > As explained below: > > commit aab9c4067d2389d0adfc9c53806437df7b0fe3d5 > Author: Florian Fainelli <f.fainelli@gmail.com> > Date: Thu May 10 13:17:36 2018 -0700 > > net: dsa: Plug in PHYLINK support > > Drivers that utilize fixed links for user-facing ports (e.g: bcm_sf2) > will need to implement phylink_mac_ops from now on to preserve > functionality, since PHYLINK *does not* create a phy_device instance > for fixed links. > > In the above patch, DSA guards the .phylink_mac_config callback against > a NULL phydev pointer. Therefore, .adjust_link is not called in case of > a fixed-link user port. > > This patch fixes the situation by converting the driver from using > .adjust_link to .phylink_mac_config. This can be done now in a unified > fashion for both slave and CPU/cascade ports because DSA now uses > PHYLINK for all ports. > > Signed-off-by: Vladimir Oltean <olteanv@gmail.com> > Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c index 0663b78a2f6c..cfdefd9f1905 100644 --- a/drivers/net/dsa/sja1105/sja1105_main.c +++ b/drivers/net/dsa/sja1105/sja1105_main.c @@ -734,15 +734,16 @@ static int sja1105_adjust_port_config(struct sja1105_private *priv, int port, return sja1105_clocking_setup_port(priv, port); } -static void sja1105_adjust_link(struct dsa_switch *ds, int port, - struct phy_device *phydev) +static void sja1105_mac_config(struct dsa_switch *ds, int port, + unsigned int link_an_mode, + const struct phylink_link_state *state) { struct sja1105_private *priv = ds->priv; - if (!phydev->link) + if (!state->link) sja1105_adjust_port_config(priv, port, 0, false); else - sja1105_adjust_port_config(priv, port, phydev->speed, true); + sja1105_adjust_port_config(priv, port, state->speed, true); } static void sja1105_phylink_validate(struct dsa_switch *ds, int port, @@ -1515,9 +1516,9 @@ static int sja1105_set_ageing_time(struct dsa_switch *ds, static const struct dsa_switch_ops sja1105_switch_ops = { .get_tag_protocol = sja1105_get_tag_protocol, .setup = sja1105_setup, - .adjust_link = sja1105_adjust_link, .set_ageing_time = sja1105_set_ageing_time, .phylink_validate = sja1105_phylink_validate, + .phylink_mac_config = sja1105_mac_config, .get_strings = sja1105_get_strings, .get_ethtool_stats = sja1105_get_ethtool_stats, .get_sset_count = sja1105_get_sset_count,