Commit 001f4261 authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by Jakub Kicinski

net: phylink: use legacy_pre_march2020

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: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent b0651536
...@@ -742,7 +742,7 @@ static void phylink_mac_pcs_an_restart(struct phylink *pl) ...@@ -742,7 +742,7 @@ static void phylink_mac_pcs_an_restart(struct phylink *pl)
phylink_autoneg_inband(pl->cur_link_an_mode)) { phylink_autoneg_inband(pl->cur_link_an_mode)) {
if (pl->pcs_ops) if (pl->pcs_ops)
pl->pcs_ops->pcs_an_restart(pl->pcs); pl->pcs_ops->pcs_an_restart(pl->pcs);
else else if (pl->config->legacy_pre_march2020)
pl->mac_ops->mac_an_restart(pl->config); pl->mac_ops->mac_an_restart(pl->config);
} }
} }
...@@ -803,7 +803,7 @@ static int phylink_change_inband_advert(struct phylink *pl) ...@@ -803,7 +803,7 @@ static int phylink_change_inband_advert(struct phylink *pl)
if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state))
return 0; return 0;
if (!pl->pcs_ops) { if (!pl->pcs_ops && pl->config->legacy_pre_march2020) {
/* Legacy method */ /* Legacy method */
phylink_mac_config(pl, &pl->link_config); phylink_mac_config(pl, &pl->link_config);
phylink_mac_pcs_an_restart(pl); phylink_mac_pcs_an_restart(pl);
...@@ -854,7 +854,8 @@ static void phylink_mac_pcs_get_state(struct phylink *pl, ...@@ -854,7 +854,8 @@ static void phylink_mac_pcs_get_state(struct phylink *pl,
if (pl->pcs_ops) if (pl->pcs_ops)
pl->pcs_ops->pcs_get_state(pl->pcs, state); 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); pl->mac_ops->mac_pcs_get_state(pl->config, state);
else else
state->link = 0; state->link = 0;
...@@ -1048,12 +1049,11 @@ static void phylink_resolve(struct work_struct *w) ...@@ -1048,12 +1049,11 @@ static void phylink_resolve(struct work_struct *w)
} }
phylink_major_config(pl, false, &link_state); phylink_major_config(pl, false, &link_state);
pl->link_config.interface = link_state.interface; 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, /* The interface remains unchanged, only the speed,
* duplex or pause settings have changed. Call the * duplex or pause settings have changed. Call the
* old mac_config() method to configure the MAC/PCS * old mac_config() method to configure the MAC/PCS
* only if we do not have a PCS installed (an * only if we do not have a legacy MAC driver.
* unconverted user.)
*/ */
phylink_mac_config(pl, &link_state); phylink_mac_config(pl, &link_state);
} }
......
...@@ -190,6 +190,10 @@ void validate(struct phylink_config *config, unsigned long *supported, ...@@ -190,6 +190,10 @@ void validate(struct phylink_config *config, unsigned long *supported,
* negotiation completion state in @state->an_complete, and link up state * negotiation completion state in @state->an_complete, and link up state
* in @state->link. If possible, @state->lp_advertising should also be * in @state->link. If possible, @state->lp_advertising should also be
* populated. * 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, void mac_pcs_get_state(struct phylink_config *config,
struct phylink_link_state *state); struct phylink_link_state *state);
...@@ -230,6 +234,15 @@ int mac_prepare(struct phylink_config *config, unsigned int mode, ...@@ -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 * guaranteed to be correct, and so any mac_config() implementation must
* never reference these fields. * 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 * (this requires a rewrite - please refer to mac_link_up() for situations
* where the PCS and MAC are not tightly integrated.) * where the PCS and MAC are not tightly integrated.)
* *
...@@ -314,6 +327,10 @@ int mac_finish(struct phylink_config *config, unsigned int mode, ...@@ -314,6 +327,10 @@ int mac_finish(struct phylink_config *config, unsigned int mode,
/** /**
* mac_an_restart() - restart 802.3z BaseX autonegotiation * mac_an_restart() - restart 802.3z BaseX autonegotiation
* @config: a pointer to a &struct phylink_config. * @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); void mac_an_restart(struct phylink_config *config);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment