lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <DB8PR04MB6828E4768064062D959BF4EDE0CF0@DB8PR04MB6828.eurprd04.prod.outlook.com>
Date:   Thu, 26 Mar 2020 21:49:02 +0000
From:   Ioana Ciornei <ioana.ciornei@....com>
To:     Russell King <rmk+kernel@...linux.org.uk>,
        Andrew Lunn <andrew@...n.ch>,
        Florian Fainelli <f.fainelli@...il.com>,
        Heiner Kallweit <hkallweit1@...il.com>
CC:     "David S. Miller" <davem@...emloft.net>,
        "netdev@...r.kernel.org" <netdev@...r.kernel.org>
Subject: RE: [PATCH net-next 2/2] net: phylink: add separate pcs operations
 structure

> Subject: [PATCH net-next 2/2] net: phylink: add separate pcs operations
> structure
> 
> Add a separate set of PCS operations, which MAC drivers can use to couple
> phylink with their associated MAC PCS layer.  The PCS operations include:
> 
> - pcs_get_state() - reads the link up/down, resolved speed, duplex
>    and pause from the PCS.
> - pcs_config() - configures the PCS for the specified mode, PHY
>    interface type, and setting the advertisement.
> - pcs_an_restart() - restarts 802.3 in-band negotiation with the
>    link partner
> - pcs_link_up() - informs the PCS that link has come up, and the
>    parameters of the link. Link parameters are used to program the
>    PCS for fixed speed and non-inband modes.
> 
> Signed-off-by: Russell King <rmk+kernel@...linux.org.uk>
> ---

Are the old mac ops going to be removed at some point (after the drivers have been converted to the PCS operations)?
I am referring to mac_pcs_get_state() and mac_an_restart().

Also, what are the rules for what should and shouldn't be done in the new pcs_config() method?
Maybe a documentation entry for this would help.

>  drivers/net/phy/phylink.c | 76 +++++++++++++++++++++++++++------------
>  include/linux/phylink.h   | 11 ++++++
>  2 files changed, 65 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c index
> a34a3be92dba..abe2cc168f93 100644
> --- a/drivers/net/phy/phylink.c
> +++ b/drivers/net/phy/phylink.c
> @@ -41,6 +41,7 @@ struct phylink {
>  	/* private: */
>  	struct net_device *netdev;
>  	const struct phylink_mac_ops *mac_ops;
> +	const struct phylink_pcs_ops *pcs_ops;
>  	struct phylink_config *config;
>  	struct device *dev;
>  	unsigned int old_link_state:1;
> @@ -425,11 +426,31 @@ static void phylink_mac_config_up(struct phylink *pl,
>  		phylink_mac_config(pl, state);
>  }
> 
> -static void phylink_mac_an_restart(struct phylink *pl)
> +static void phylink_mac_pcs_an_restart(struct phylink *pl)
>  {
>  	if (pl->link_config.an_enabled &&
> -	    phy_interface_mode_is_8023z(pl->link_config.interface))
> -		pl->mac_ops->mac_an_restart(pl->config);
> +	    phy_interface_mode_is_8023z(pl->link_config.interface)) {
> +		if (pl->pcs_ops)
> +			pl->pcs_ops->pcs_an_restart(pl->config);
> +		else
> +			pl->mac_ops->mac_an_restart(pl->config);
> +	}
> +}
> +
> +static void phylink_pcs_config(struct phylink *pl, bool force_restart,
> +			       const struct phylink_link_state *state) {
> +	bool restart = force_restart;
> +
> +	if (pl->pcs_ops && pl->pcs_ops->pcs_config(pl->config,
> +						   pl->cur_link_an_mode,
> +						   state))
> +		restart = true;
> +
> +	phylink_mac_config(pl, state);
> +
> +	if (restart)
> +		phylink_mac_pcs_an_restart(pl);
>  }
> 
>  static void phylink_mac_pcs_get_state(struct phylink *pl, @@ -445,7 +466,10
> @@ static void phylink_mac_pcs_get_state(struct phylink *pl,
>  	state->an_complete = 0;
>  	state->link = 1;
> 
> -	pl->mac_ops->mac_pcs_get_state(pl->config, state);
> +	if (pl->pcs_ops)
> +		pl->pcs_ops->pcs_get_state(pl->config, state);
> +	else
> +		pl->mac_ops->mac_pcs_get_state(pl->config, state);
>  }
> 
>  /* The fixed state is... fixed except for the link state, @@ -463,7 +487,7 @@
> static void phylink_get_fixed_state(struct phylink *pl,
>  	phylink_resolve_flow(state);
>  }
> 
> -static void phylink_mac_initial_config(struct phylink *pl)
> +static void phylink_mac_initial_config(struct phylink *pl, bool
> +force_restart)
>  {
>  	struct phylink_link_state link_state;
> 
> @@ -489,7 +513,7 @@ static void phylink_mac_initial_config(struct phylink *pl)
>  	link_state.link = false;
> 
>  	phylink_apply_manual_flow(pl, &link_state);
> -	phylink_mac_config(pl, &link_state);
> +	phylink_pcs_config(pl, force_restart, &link_state);
>  }
> 
>  static const char *phylink_pause_to_str(int pause) @@ -506,12 +530,18 @@
> static const char *phylink_pause_to_str(int pause)
>  	}
>  }
> 
> -static void phylink_mac_link_up(struct phylink *pl,
> -				struct phylink_link_state link_state)
> +static void phylink_link_up(struct phylink *pl,
> +			    struct phylink_link_state link_state)
>  {
>  	struct net_device *ndev = pl->netdev;
> 
>  	pl->cur_interface = link_state.interface;
> +
> +	if (pl->pcs_ops && pl->pcs_ops->pcs_link_up)
> +		pl->pcs_ops->pcs_link_up(pl->config, pl->cur_link_an_mode,
> +					 pl->cur_interface,
> +					 link_state.speed, link_state.duplex);
> +
>  	pl->mac_ops->mac_link_up(pl->config, pl->phydev,
>  				 pl->cur_link_an_mode, pl->cur_interface,
>  				 link_state.speed, link_state.duplex, @@ -528,7
> +558,7 @@ static void phylink_mac_link_up(struct phylink *pl,
>  		     phylink_pause_to_str(link_state.pause));
>  }
> 
> -static void phylink_mac_link_down(struct phylink *pl)
> +static void phylink_link_down(struct phylink *pl)
>  {
>  	struct net_device *ndev = pl->netdev;
> 
> @@ -597,9 +627,9 @@ static void phylink_resolve(struct work_struct *w)
>  	if (link_changed) {
>  		pl->old_link_state = link_state.link;
>  		if (!link_state.link)
> -			phylink_mac_link_down(pl);
> +			phylink_link_down(pl);
>  		else
> -			phylink_mac_link_up(pl, link_state);
> +			phylink_link_up(pl, link_state);
>  	}
>  	if (!link_state.link && pl->mac_link_dropped) {
>  		pl->mac_link_dropped = false;
> @@ -746,6 +776,12 @@ struct phylink *phylink_create(struct phylink_config
> *config,  }  EXPORT_SYMBOL_GPL(phylink_create);
> 
> +void phylink_add_pcs(struct phylink *pl, const struct phylink_pcs_ops
> +*ops) {
> +	pl->pcs_ops = ops;
> +}
> +EXPORT_SYMBOL_GPL(phylink_add_pcs);
> +
>  /**
>   * phylink_destroy() - cleanup and destroy the phylink instance
>   * @pl: a pointer to a &struct phylink returned from phylink_create() @@ -
> 1082,14 +1118,12 @@ void phylink_start(struct phylink *pl)
>  	/* Apply the link configuration to the MAC when starting. This allows
>  	 * a fixed-link to start with the correct parameters, and also
>  	 * ensures that we set the appropriate advertisement for Serdes links.
> -	 */
> -	phylink_mac_initial_config(pl);
> -
> -	/* Restart autonegotiation if using 802.3z to ensure that the link
> +	 *
> +	 * Restart autonegotiation if using 802.3z to ensure that the link
>  	 * parameters are properly negotiated.  This is necessary for DSA
>  	 * switches using 802.3z negotiation to ensure they see our modes.
>  	 */
> -	phylink_mac_an_restart(pl);
> +	phylink_mac_initial_config(pl, true);
> 
>  	clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state);
>  	phylink_run_resolve(pl);
> @@ -1386,8 +1420,7 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
>  			 * advertisement; the only thing we have is the pause
>  			 * modes which can only come from a PHY.
>  			 */
> -			phylink_mac_config(pl, &pl->link_config);
> -			phylink_mac_an_restart(pl);
> +			phylink_pcs_config(pl, true, &pl->link_config);
>  		}
>  		mutex_unlock(&pl->state_mutex);
>  	}
> @@ -1415,7 +1448,7 @@ int phylink_ethtool_nway_reset(struct phylink *pl)
> 
>  	if (pl->phydev)
>  		ret = phy_restart_aneg(pl->phydev);
> -	phylink_mac_an_restart(pl);
> +	phylink_mac_pcs_an_restart(pl);
> 
>  	return ret;
>  }
> @@ -1494,8 +1527,7 @@ int phylink_ethtool_set_pauseparam(struct phylink
> *pl,
>  				   pause->tx_pause);
>  	} else if (!test_bit(PHYLINK_DISABLE_STOPPED,
>  			     &pl->phylink_disable_state)) {
> -		phylink_mac_config(pl, &pl->link_config);
> -		phylink_mac_an_restart(pl);
> +		phylink_pcs_config(pl, true, &pl->link_config);
>  	}
>  	mutex_unlock(&pl->state_mutex);
> 
> @@ -1901,7 +1933,7 @@ static int phylink_sfp_config(struct phylink *pl, u8
> mode,
> 
>  	if (changed && !test_bit(PHYLINK_DISABLE_STOPPED,
>  				 &pl->phylink_disable_state))
> -		phylink_mac_initial_config(pl);
> +		phylink_mac_initial_config(pl, false);
> 
>  	return ret;
>  }
> diff --git a/include/linux/phylink.h b/include/linux/phylink.h index
> 8fa6df3b881b..dc27dd341ebd 100644
> --- a/include/linux/phylink.h
> +++ b/include/linux/phylink.h
> @@ -97,6 +97,16 @@ struct phylink_mac_ops {
>  			    bool tx_pause, bool rx_pause);
>  };
> 
> +struct phylink_pcs_ops {
> +	void (*pcs_get_state)(struct phylink_config *config,
> +			      struct phylink_link_state *state);
> +	int (*pcs_config)(struct phylink_config *config, unsigned int mode,
> +			  const struct phylink_link_state *state);
> +	void (*pcs_an_restart)(struct phylink_config *config);
> +	void (*pcs_link_up)(struct phylink_config *config, unsigned int mode,
> +			    phy_interface_t interface, int speed, int duplex); };
> +
>  #if 0 /* For kernel-doc purposes only. */
>  /**
>   * validate - Validate and update the link configuration @@ -273,6 +283,7 @@
> void mac_link_up(struct phylink_config *config, struct phy_device *phy,  struct
> phylink *phylink_create(struct phylink_config *, struct fwnode_handle *,
>  			       phy_interface_t iface,
>  			       const struct phylink_mac_ops *ops);
> +void phylink_add_pcs(struct phylink *, const struct phylink_pcs_ops
> +*ops);
>  void phylink_destroy(struct phylink *);
> 
>  int phylink_connect_phy(struct phylink *, struct phy_device *);
> --
> 2.20.1

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ