* [PATCH net-next 1/5] net: phylink: add legacy_pre_march2020 indicator
2021-12-07 15:51 [PATCH net-next 0/5] net: phylink: introduce legacy mode flag Russell King (Oracle)
@ 2021-12-09 13:11 ` Russell King (Oracle)
2021-12-09 13:11 ` [PATCH net-next 2/5] net: dsa: mark DSA phylink as legacy_pre_march2020 Russell King (Oracle)
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Russell King (Oracle) @ 2021-12-09 13:11 UTC (permalink / raw)
To: Chris Snook, Felix Fietkau, Florian Fainelli, John Crispin,
Mark Lee, Matthias Brugger, Sean Wang, Vivien Didelot,
Vladimir Oltean
Cc: Andrew Lunn, Heiner Kallweit, linux-arm-kernel, linux-mediatek,
netdev
Add a boolean to phylink_config to indicate whether a driver has not
been updated for the changes in commit 7cceb599d15d ("net: phylink:
avoid mac_config calls"), and thus are reliant on the old behaviour.
We were currently keying the phylink behaviour on the presence of a
PCS, but this is sub-optimal for modern drivers that may not have a
PCS.
This commit merely introduces the new flag, but does not add any use,
since we need all legacy drivers to set this flag before it can be
used. Once these legacy drivers have been updated, we can remove this
flag.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
Resent with the correct cover-letter message-ID.
include/linux/phylink.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/include/linux/phylink.h b/include/linux/phylink.h
index 01224235df0f..d005b8e36048 100644
--- a/include/linux/phylink.h
+++ b/include/linux/phylink.h
@@ -84,6 +84,8 @@ enum phylink_op_type {
* struct phylink_config - PHYLINK configuration structure
* @dev: a pointer to a struct device associated with the MAC
* @type: operation type of PHYLINK instance
+ * @legacy_pre_march2020: driver has not been updated for March 2020 updates
+ * (See commit 7cceb599d15d ("net: phylink: avoid mac_config calls")
* @pcs_poll: MAC PCS cannot provide link change interrupt
* @poll_fixed_state: if true, starts link_poll,
* if MAC link is at %MLO_AN_FIXED mode.
@@ -97,6 +99,7 @@ enum phylink_op_type {
struct phylink_config {
struct device *dev;
enum phylink_op_type type;
+ bool legacy_pre_march2020;
bool pcs_poll;
bool poll_fixed_state;
bool ovr_an_inband;
--
2.30.2
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH net-next 2/5] net: dsa: mark DSA phylink as legacy_pre_march2020
2021-12-07 15:51 [PATCH net-next 0/5] net: phylink: introduce legacy mode flag Russell King (Oracle)
2021-12-09 13:11 ` [PATCH net-next 1/5] net: phylink: add legacy_pre_march2020 indicator Russell King (Oracle)
@ 2021-12-09 13:11 ` Russell King (Oracle)
2021-12-09 13:11 ` [PATCH net-next 3/5] net: mtk_eth_soc: mark as a legacy_pre_march2020 driver Russell King (Oracle)
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Russell King (Oracle) @ 2021-12-09 13:11 UTC (permalink / raw)
To: Chris Snook, Felix Fietkau, Florian Fainelli, John Crispin,
Mark Lee, Matthias Brugger, Sean Wang, Vivien Didelot,
Vladimir Oltean
Cc: Andrew Lunn, Heiner Kallweit, linux-arm-kernel, linux-mediatek,
netdev, David S. Miller, Jakub Kicinski
The majority of DSA drivers do not make use of the PCS support, and
thus operate in legacy mode. In order to preserve this behaviour in
future, we need to set the legacy_pre_march2020 flag so phylink knows
this may require the legacy calls.
There are some DSA drivers that do make use of PCS support, and these
will continue operating as before - legacy_pre_march2020 will not
prevent split-PCS support enabling the newer phylink behaviour.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
Resent with the correct cover-letter message-ID.
net/dsa/port.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/net/dsa/port.c b/net/dsa/port.c
index 6d5ebe61280b..3b8d18e5b72c 100644
--- a/net/dsa/port.c
+++ b/net/dsa/port.c
@@ -1094,6 +1094,13 @@ int dsa_port_phylink_create(struct dsa_port *dp)
if (err)
mode = PHY_INTERFACE_MODE_NA;
+ /* Presence of phylink_mac_link_state or phylink_mac_an_restart is
+ * an indicator of a legacy phylink driver.
+ */
+ if (ds->ops->phylink_mac_link_state ||
+ ds->ops->phylink_mac_an_restart)
+ dp->pl_config.legacy_pre_march2020 = true;
+
if (ds->ops->phylink_get_caps)
ds->ops->phylink_get_caps(ds, dp->index, &dp->pl_config);
--
2.30.2
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH net-next 3/5] net: mtk_eth_soc: mark as a legacy_pre_march2020 driver
2021-12-07 15:51 [PATCH net-next 0/5] net: phylink: introduce legacy mode flag Russell King (Oracle)
2021-12-09 13:11 ` [PATCH net-next 1/5] net: phylink: add legacy_pre_march2020 indicator Russell King (Oracle)
2021-12-09 13:11 ` [PATCH net-next 2/5] net: dsa: mark DSA phylink as legacy_pre_march2020 Russell King (Oracle)
@ 2021-12-09 13:11 ` Russell King (Oracle)
2021-12-09 13:11 ` [PATCH net-next 4/5] net: phylink: use legacy_pre_march2020 Russell King (Oracle)
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Russell King (Oracle) @ 2021-12-09 13:11 UTC (permalink / raw)
To: Chris Snook, Felix Fietkau, Florian Fainelli, John Crispin,
Mark Lee, Matthias Brugger, Sean Wang, Vivien Didelot,
Vladimir Oltean
Cc: Andrew Lunn, Heiner Kallweit, linux-arm-kernel, linux-mediatek,
netdev, David S. Miller, Jakub Kicinski
mtk_eth_soc has not been updated for commit 7cceb599d15d ("net: phylink:
avoid mac_config calls"), and makes use of state->speed and
state->duplex in contravention of the phylink documentation. This makes
reliant on the legacy behaviours, so mark it as a legacy driver.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
Resent with the correct cover-letter message-ID.
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index de4152e2e3e4..a068cf5c970f 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -2923,6 +2923,10 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
mac->phylink_config.dev = ð->netdev[id]->dev;
mac->phylink_config.type = PHYLINK_NETDEV;
+ /* This driver makes use of state->speed/state->duplex in
+ * mac_config
+ */
+ mac->phylink_config.legacy_pre_march2020 = true;
mac->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
MAC_10 | MAC_100 | MAC_1000 | MAC_2500FD;
--
2.30.2
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH net-next 4/5] net: phylink: use legacy_pre_march2020
2021-12-07 15:51 [PATCH net-next 0/5] net: phylink: introduce legacy mode flag Russell King (Oracle)
` (2 preceding siblings ...)
2021-12-09 13:11 ` [PATCH net-next 3/5] net: mtk_eth_soc: mark as a legacy_pre_march2020 driver Russell King (Oracle)
@ 2021-12-09 13:11 ` Russell King (Oracle)
2021-12-09 13:11 ` [PATCH net-next 5/5] net: ag71xx: remove unnecessary legacy methods Russell King (Oracle)
2021-12-09 20:00 ` [PATCH net-next 0/5] net: phylink: introduce legacy mode flag patchwork-bot+netdevbpf
5 siblings, 0 replies; 7+ messages in thread
From: Russell King (Oracle) @ 2021-12-09 13:11 UTC (permalink / raw)
To: Chris Snook, Felix Fietkau, Florian Fainelli, John Crispin,
Mark Lee, Matthias Brugger, Sean Wang, Vivien Didelot,
Vladimir Oltean
Cc: Andrew Lunn, Heiner Kallweit, linux-arm-kernel, linux-mediatek,
netdev, David S. Miller, Jakub Kicinski
Use the legacy flag to indicate whether we should operate in legacy
mode. This allows us to stop using the presence of a PCS as an
indicator to the age of the phylink user, and make PCS presence
optional.
Legacy mode involves:
1) calling mac_config() whenever the link comes up
2) calling mac_config() whenever the inband advertisement changes,
possibly followed by a call to mac_an_restart()
3) making use of mac_an_restart()
4) making use of mac_pcs_get_state()
All the above functionality was moved to a seperate "PCS" block of
operations in March 2020.
Update the documents to indicate that the differences that this flag
makes.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
Resent with the correct cover-letter message-ID.
drivers/net/phy/phylink.c | 12 ++++++------
include/linux/phylink.h | 17 +++++++++++++++++
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
index 8e3861f09b4f..e47f2baf4b07 100644
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
@@ -742,7 +742,7 @@ static void phylink_mac_pcs_an_restart(struct phylink *pl)
phylink_autoneg_inband(pl->cur_link_an_mode)) {
if (pl->pcs_ops)
pl->pcs_ops->pcs_an_restart(pl->pcs);
- else
+ else if (pl->config->legacy_pre_march2020)
pl->mac_ops->mac_an_restart(pl->config);
}
}
@@ -803,7 +803,7 @@ static int phylink_change_inband_advert(struct phylink *pl)
if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state))
return 0;
- if (!pl->pcs_ops) {
+ if (!pl->pcs_ops && pl->config->legacy_pre_march2020) {
/* Legacy method */
phylink_mac_config(pl, &pl->link_config);
phylink_mac_pcs_an_restart(pl);
@@ -854,7 +854,8 @@ static void phylink_mac_pcs_get_state(struct phylink *pl,
if (pl->pcs_ops)
pl->pcs_ops->pcs_get_state(pl->pcs, state);
- else if (pl->mac_ops->mac_pcs_get_state)
+ else if (pl->mac_ops->mac_pcs_get_state &&
+ pl->config->legacy_pre_march2020)
pl->mac_ops->mac_pcs_get_state(pl->config, state);
else
state->link = 0;
@@ -1048,12 +1049,11 @@ static void phylink_resolve(struct work_struct *w)
}
phylink_major_config(pl, false, &link_state);
pl->link_config.interface = link_state.interface;
- } else if (!pl->pcs_ops) {
+ } else if (!pl->pcs_ops && pl->config->legacy_pre_march2020) {
/* The interface remains unchanged, only the speed,
* duplex or pause settings have changed. Call the
* old mac_config() method to configure the MAC/PCS
- * only if we do not have a PCS installed (an
- * unconverted user.)
+ * only if we do not have a legacy MAC driver.
*/
phylink_mac_config(pl, &link_state);
}
diff --git a/include/linux/phylink.h b/include/linux/phylink.h
index d005b8e36048..a2f266cc3442 100644
--- a/include/linux/phylink.h
+++ b/include/linux/phylink.h
@@ -190,6 +190,10 @@ void validate(struct phylink_config *config, unsigned long *supported,
* negotiation completion state in @state->an_complete, and link up state
* in @state->link. If possible, @state->lp_advertising should also be
* populated.
+ *
+ * Note: This is a legacy method. This function will not be called unless
+ * legacy_pre_march2020 is set in &struct phylink_config and there is no
+ * PCS attached.
*/
void mac_pcs_get_state(struct phylink_config *config,
struct phylink_link_state *state);
@@ -230,6 +234,15 @@ int mac_prepare(struct phylink_config *config, unsigned int mode,
* guaranteed to be correct, and so any mac_config() implementation must
* never reference these fields.
*
+ * Note: For legacy March 2020 drivers (drivers with legacy_pre_march2020 set
+ * in their &phylnk_config and which don't have a PCS), this function will be
+ * called on each link up event, and to also change the in-band advert. For
+ * non-legacy drivers, it will only be called to reconfigure the MAC for a
+ * "major" change in e.g. interface mode. It will not be called for changes
+ * in speed, duplex or pause modes or to change the in-band advertisement.
+ * In any case, it is strongly preferred that speed, duplex and pause settings
+ * are handled in the mac_link_up() method and not in this method.
+ *
* (this requires a rewrite - please refer to mac_link_up() for situations
* where the PCS and MAC are not tightly integrated.)
*
@@ -314,6 +327,10 @@ int mac_finish(struct phylink_config *config, unsigned int mode,
/**
* mac_an_restart() - restart 802.3z BaseX autonegotiation
* @config: a pointer to a &struct phylink_config.
+ *
+ * Note: This is a legacy method. This function will not be called unless
+ * legacy_pre_march2020 is set in &struct phylink_config and there is no
+ * PCS attached.
*/
void mac_an_restart(struct phylink_config *config);
--
2.30.2
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH net-next 5/5] net: ag71xx: remove unnecessary legacy methods
2021-12-07 15:51 [PATCH net-next 0/5] net: phylink: introduce legacy mode flag Russell King (Oracle)
` (3 preceding siblings ...)
2021-12-09 13:11 ` [PATCH net-next 4/5] net: phylink: use legacy_pre_march2020 Russell King (Oracle)
@ 2021-12-09 13:11 ` Russell King (Oracle)
2021-12-09 20:00 ` [PATCH net-next 0/5] net: phylink: introduce legacy mode flag patchwork-bot+netdevbpf
5 siblings, 0 replies; 7+ messages in thread
From: Russell King (Oracle) @ 2021-12-09 13:11 UTC (permalink / raw)
To: Chris Snook, Felix Fietkau, Florian Fainelli, John Crispin,
Mark Lee, Matthias Brugger, Sean Wang, Vivien Didelot,
Vladimir Oltean
Cc: Andrew Lunn, Heiner Kallweit, linux-arm-kernel, linux-mediatek,
netdev, David S. Miller, Jakub Kicinski
ag71xx may have a PCS, but it does not appear to support configuration
of the PCS in the current code. The functions to get its state merely
report that the link is down, and the AN restart function is empty.
Since neither of these functions will be called unless phylink's legacy
flag is set, we can safely remove these functions and indicate this is
a modern driver.
Should PCS support be added later, it will need to be modelled using
the phylink_pcs support rather than operating as a legacy driver.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
Resent with the correct cover-letter message-ID.
drivers/net/ethernet/atheros/ag71xx.c | 13 -------------
1 file changed, 13 deletions(-)
diff --git a/drivers/net/ethernet/atheros/ag71xx.c b/drivers/net/ethernet/atheros/ag71xx.c
index ff924f06581e..270c2935591b 100644
--- a/drivers/net/ethernet/atheros/ag71xx.c
+++ b/drivers/net/ethernet/atheros/ag71xx.c
@@ -1024,17 +1024,6 @@ static void ag71xx_mac_config(struct phylink_config *config, unsigned int mode,
ag71xx_wr(ag, AG71XX_REG_FIFO_CFG3, ag->fifodata[2]);
}
-static void ag71xx_mac_pcs_get_state(struct phylink_config *config,
- struct phylink_link_state *state)
-{
- state->link = 0;
-}
-
-static void ag71xx_mac_an_restart(struct phylink_config *config)
-{
- /* Not Supported */
-}
-
static void ag71xx_mac_link_down(struct phylink_config *config,
unsigned int mode, phy_interface_t interface)
{
@@ -1098,8 +1087,6 @@ static void ag71xx_mac_link_up(struct phylink_config *config,
static const struct phylink_mac_ops ag71xx_phylink_mac_ops = {
.validate = phylink_generic_validate,
- .mac_pcs_get_state = ag71xx_mac_pcs_get_state,
- .mac_an_restart = ag71xx_mac_an_restart,
.mac_config = ag71xx_mac_config,
.mac_link_down = ag71xx_mac_link_down,
.mac_link_up = ag71xx_mac_link_up,
--
2.30.2
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH net-next 0/5] net: phylink: introduce legacy mode flag
2021-12-07 15:51 [PATCH net-next 0/5] net: phylink: introduce legacy mode flag Russell King (Oracle)
` (4 preceding siblings ...)
2021-12-09 13:11 ` [PATCH net-next 5/5] net: ag71xx: remove unnecessary legacy methods Russell King (Oracle)
@ 2021-12-09 20:00 ` patchwork-bot+netdevbpf
5 siblings, 0 replies; 7+ messages in thread
From: patchwork-bot+netdevbpf @ 2021-12-09 20:00 UTC (permalink / raw)
To: Russell King
Cc: chris.snook, nbd, f.fainelli, john, Mark-MC.Lee, matthias.bgg,
sean.wang, vivien.didelot, olteanv, andrew, davem, hkallweit1,
kuba, linux-arm-kernel, linux-mediatek, netdev
Hello:
This series was applied to netdev/net-next.git (master)
by Jakub Kicinski <kuba@kernel.org>:
On Tue, 7 Dec 2021 15:51:53 +0000 you wrote:
> Hi all,
>
> In March 2020, phylink gained support to split the PCS support out of
> the MAC callbacks. By doing so, a slight behavioural difference was
> introduced when a PCS is present, specifically:
>
> 1) the call to mac_config() when the link comes up or advertisement
> changes were eliminated
> 2) mac_an_restart() will never be called
> 3) mac_pcs_get_state() will never be called
>
> [...]
Here is the summary with links:
- [net-next,1/5] net: phylink: add legacy_pre_march2020 indicator
https://git.kernel.org/netdev/net-next/c/3e5b1feccea7
- [net-next,2/5] net: dsa: mark DSA phylink as legacy_pre_march2020
https://git.kernel.org/netdev/net-next/c/0a9f0794d9bd
- [net-next,3/5] net: mtk_eth_soc: mark as a legacy_pre_march2020 driver
https://git.kernel.org/netdev/net-next/c/b06515367fac
- [net-next,4/5] net: phylink: use legacy_pre_march2020
https://git.kernel.org/netdev/net-next/c/001f4261fe4d
- [net-next,5/5] net: ag71xx: remove unnecessary legacy methods
https://git.kernel.org/netdev/net-next/c/11053047a4af
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 7+ messages in thread