From: "Russell King (Oracle)" <linux@armlinux.org.uk>
To: Andrew Lunn <andrew@lunn.ch>, Heiner Kallweit <hkallweit1@gmail.com>
Cc: "Alexandre Belloni" <alexandre.belloni@bootlin.com>,
"Alvin Šipraga" <alsi@bang-olufsen.dk>,
"Claudiu Manoil" <claudiu.manoil@nxp.com>,
"David S. Miller" <davem@davemloft.net>,
"DENG Qingfang" <dqfext@gmail.com>,
"Eric Dumazet" <edumazet@google.com>,
"Florian Fainelli" <f.fainelli@gmail.com>,
"George McCollister" <george.mccollister@gmail.com>,
"Hauke Mehrtens" <hauke@hauke-m.de>,
"Jakub Kicinski" <kuba@kernel.org>,
"Kurt Kanzenbach" <kurt@linutronix.de>,
"Landen Chao" <Landen.Chao@mediatek.com>,
"Linus Walleij" <linus.walleij@linaro.org>,
linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org,
"Marek Behún" <kabel@kernel.org>,
"Matthias Brugger" <matthias.bgg@gmail.com>,
netdev@vger.kernel.org, "Paolo Abeni" <pabeni@redhat.com>,
"Sean Wang" <sean.wang@mediatek.com>,
UNGLinuxDriver@microchip.com,
"Vivien Didelot" <vivien.didelot@gmail.com>,
"Vladimir Oltean" <olteanv@gmail.com>,
"Woojung Huh" <woojung.huh@microchip.com>
Subject: Re: [PATCH RFC net-next 0/4] net: dsa: always use phylink
Date: Tue, 28 Jun 2022 22:16:17 +0100 [thread overview]
Message-ID: <YrtvoRhUK+4BneYC@shell.armlinux.org.uk> (raw)
In-Reply-To: <YrWi5oBFn7vR15BH@shell.armlinux.org.uk>
On Fri, Jun 24, 2022 at 12:41:26PM +0100, Russell King (Oracle) wrote:
> Hi,
>
> Currently, the core DSA code conditionally uses phylink for CPU and DSA
> ports depending on whether the firmware specifies a fixed-link or a PHY.
> If either of these are specified, then phylink is used for these ports,
> otherwise phylink is not, and we rely on the DSA drivers to "do the
> right thing". However, this detail is not mentioned in the DT binding,
> but Andrew has said that this behaviour has always something that DSA
> wants.
>
> mv88e6xxx has had support for this for a long time with its "SPEED_MAX"
> thing, which I recently reworked to make use of the mac_capabilities in
> preparation to solving this more fully.
>
> This series is an experiment to solve this properly, and it does this
> in two steps.
>
> The first step consists of the first two patches. Phylink needs to
> know the PHY interface mode that is being used so it can (a) pass the
> right mode into the MAC/PCS etc and (b) know the properties of the
> link and therefore which speeds can be supported across it.
>
> In order to achieve this, the DSA phylink_get_caps() method has an
> extra argument added to it so that DSA drivers can report the
> interface mode that they will be using for this port back to the core
> DSA code, thereby allowing phylink to be initialised with the correct
> interface mode.
>
> Note that this can only be used for CPU and DSA ports as "user" ports
> need a different behaviour - they rely on getting the interface mode
> from phylib, which will only happen if phylink is initialised with
> PHY_INTERFACE_MODE_NA. Unfortunately, changing this behaviour is likely
> to cause widespread regressions.
>
> Obvious questions:
> 1. Should phylink_get_caps() be augmented in this way, or should it be
> a separate method?
>
> 2. DSA has traditionally used "interface mode for the maximum supported
> speed on this port" where the interface mode is programmable (via
> its internal port_max_speed_mode() method) but this is only present
> for a few of the sub-drivers. Is reporting the current interface
> mode correct where this method is not implemented?
>
> The second step is to introduce a function that allows phylink to be
> reconfigured after creation time to operate at max-speed fixed-link
> mode for the PHY interface mode, also using the MAC capabilities to
> determine the speed and duplex mode we should be using.
>
> Obvious questions:
> 1. Should we be allowing half-duplex for this?
> 2. If we do allow half-duplex, should we prefer fastest speed over
> duplex setting, or should we prefer fastest full-duplex speed
> over any half-duplex?
> 3. How do we sanely switch DSA from its current behaviour to always
> using phylink for these ports without breakage - this is the
> difficult one, because it's not obvious which drivers have been
> coded to either work around this quirk of the DSA implementation.
> For example, if we start forcing the link down before calling
> dsa_port_phylink_create(), and we then fail to set max-fixed-link,
> then the CPU/DSA port is going to fail, and we're going to have
> lots of regressions.
>
> Please look at the patches and make suggestions on how we can proceed
> to clean up this quirk of DSA.
An alternative idea has been put forward by Marek on how to solve this
without involving changes to DSA drivers, but everyone would have to
fill in the supported_interfaces and mac_capabilities.
The suggestion is that DSA calls phylink_set_max_fixed_link(), which
looks at the above two fields, and finds an interface which gives the
maximum link speed if the interface mode has not been specified. In
other words, something like this for phylink_set_max_fixed_link():
interface = pl->link_interface;
if (interface != PHY_INTERFACE_MODE_NA) {
/* Get the speed/duplex capabilities and reduce according to the
* specified interface mode.
*/
caps = pl->config->mac_capabilities;
caps &= phylink_interface_to_caps(interface);
} else {
interfaces = pl->config->supported_interfaces;
max_caps = 0;
/* Find the supported interface mode which gives the maximum
* speed.
*/
for (intf = 0; intf < PHY_INTERFACE_MODE_MAX; intf++) {
if (test_bit(intf, interfaces)) {
caps = pl->config->mac_capabilities;
caps &= phylink_interface_to_caps(intf);
if (caps > max_caps) {
max_caps = caps;
interface = intf;
}
}
}
caps = max_caps;
}
caps &= ~(MAC_SYM_PAUSE | MAC_ASYM_PAUSE);
/* If there are no capabilities, then we are not using this default. */
if (!caps)
return -EINVAL;
/* Decode to fastest speed and duplex */
duplex = DUPLEX_UNKNOWN;
speed = SPEED_UNKNOWN;
for (i = 0; i < ARRAY_SIZE(phylink_caps_speeds); i++) {
if (caps & phylink_caps_speeds[i].fd_mask) {
duplex = DUPLEX_FULL;
speed = phylink_caps_speeds[i].speed;
break;
} else if (caps & phylink_caps_speeds[i].hd_mask) {
duplex = DUPLEX_HALF;
speed = phylink_caps_speeds[i].speed;
break;
}
}
/* If we didn't find anything, bail. */
if (speed == SPEED_UNKNOWN)
return -EINVAL;
pl->link_interface = interface;
pl->link_config.interface = interface;
pl->link_config.speed = speed;
pl->link_config.duplex = duplex;
pl->link_config.link = 1;
pl->cfg_link_an_mode = MLO_AN_FIXED;
pl->cur_link_an_mode = MLO_AN_FIXED;
This would have the effect of selecting the first interface mode in
numerical order that gives us the fastest link speed.
I should point out that if a DSA port can be programmed in software to
support both SGMII and 1000baseX, this will end up selecting SGMII
irrespective of what the hardware was wire-strapped to and how it was
initially configured. Do we believe that would be acceptable?
Some comments would be really useful on this.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!
next prev parent reply other threads:[~2022-06-28 21:17 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-24 11:41 [PATCH RFC net-next 0/4] net: dsa: always use phylink Russell King (Oracle)
2022-06-24 11:41 ` [PATCH RFC net-next 1/4] net: dsa: add support for retrieving the interface mode Russell King (Oracle)
2022-06-24 11:41 ` [PATCH RFC net-next 2/4] net: dsa: mv88e6xxx: report the default interface mode for the port Russell King (Oracle)
2022-06-24 11:42 ` [PATCH RFC net-next 3/4] net: phylink: add phylink_set_max_fixed_link() Russell King (Oracle)
2022-06-24 11:42 ` [PATCH RFC net-next 4/4] net: dsa: always use phylink for CPU and DSA ports Russell King (Oracle)
2022-06-28 21:16 ` Russell King (Oracle) [this message]
2022-06-29 7:18 ` [PATCH RFC net-next 0/4] net: dsa: always use phylink Andrew Lunn
2022-06-29 9:27 ` Marek Behún
2022-06-29 9:34 ` Russell King (Oracle)
2022-06-29 9:42 ` Marek Behún
2022-06-29 9:43 ` Russell King (Oracle)
2022-06-29 10:10 ` Marek Behún
2022-06-29 12:41 ` Russell King (Oracle)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YrtvoRhUK+4BneYC@shell.armlinux.org.uk \
--to=linux@armlinux.org.uk \
--cc=Landen.Chao@mediatek.com \
--cc=UNGLinuxDriver@microchip.com \
--cc=alexandre.belloni@bootlin.com \
--cc=alsi@bang-olufsen.dk \
--cc=andrew@lunn.ch \
--cc=claudiu.manoil@nxp.com \
--cc=davem@davemloft.net \
--cc=dqfext@gmail.com \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=george.mccollister@gmail.com \
--cc=hauke@hauke-m.de \
--cc=hkallweit1@gmail.com \
--cc=kabel@kernel.org \
--cc=kuba@kernel.org \
--cc=kurt@linutronix.de \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=matthias.bgg@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=olteanv@gmail.com \
--cc=pabeni@redhat.com \
--cc=sean.wang@mediatek.com \
--cc=vivien.didelot@gmail.com \
--cc=woojung.huh@microchip.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).