On Thu, Jun 18, 2020 at 05:34:49PM +0000, Ioana Ciornei wrote: > I am not sure how this would work with Felix and DSA drivers in general > since the DSA core is hiding the phylink_pcs_ops from the actual switch > driver.
Here's an idea to work around DSA (untested): diff --git a/include/linux/phylink.h b/include/linux/phylink.h index 1f8e0023f4f4..f578a5bb8ad0 100644 --- a/include/linux/phylink.h +++ b/include/linux/phylink.h @@ -67,6 +67,7 @@ enum phylink_op_type { struct phylink_config { struct device *dev; enum phylink_op_type type; + void *pcs_private; bool pcs_poll; bool poll_fixed_state; void (*get_fixed_state)(struct phylink_config *config, diff --git a/include/net/dsa.h b/include/net/dsa.h index a50d5007fd39..0fbb3a542b6e 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -742,6 +742,9 @@ int dsa_port_get_phy_strings(struct dsa_port *dp, uint8_t *data); int dsa_port_get_ethtool_phy_stats(struct dsa_port *dp, uint64_t *data); int dsa_port_get_phy_sset_count(struct dsa_port *dp); void dsa_port_phylink_mac_change(struct dsa_switch *ds, int port, bool up); +void dsa_slave_attach_phylink_pcs(struct dsa_switch *ds, int port, + const struct phylink_pcs_ops *ops, + void *priv); struct dsa_tag_driver { const struct dsa_device_ops *ops; diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 2ae17f95cb63..c80f62d88b63 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -1619,6 +1619,17 @@ static int dsa_slave_phy_connect(struct net_device *slave_dev, int addr) return phylink_connect_phy(dp->pl, slave_dev->phydev); } +void dsa_slave_attach_phylink_pcs(struct dsa_switch *ds, int port, + const struct phylink_pcs_ops *ops, + void *priv) +{ + const struct dsa_port *dp = dsa_to_port(ds, port); + + dp->pl_config.pcs_private = priv; + phylink_add_pcs(dp->pl, ops); +} +EXPORT_SYMBOL_GPL(dsa_slave_attach_phylink_pcs); + static int dsa_slave_phy_setup(struct net_device *slave_dev) { struct dsa_port *dp = dsa_slave_to_port(slave_dev); dsa_slave_attach_phylink_pcs() can be passed anything as it's priv argument - that could be "dp", or it could be a lynx PCS private data structure, but that's up to the driver code to decide. At least this gives a way for us to have some standardised PCS code that can be bolted into either DSA or a MAC driver by the higher levels without the PCS code having to know which it's connected to, and without having to have veneers to bridge into the PCS code. -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!