Commit ee50d07c authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller

net: mscc: ocelot: make phy_mode a member of the common struct ocelot_port

The Ocelot switchdev driver and the Felix DSA one need it for different
reasons. Felix (or at least the VSC9959 instantiation in NXP LS1028A) is
integrated with the traditional NXP Layerscape PCS design which does not
support runtime configuration of SerDes protocol. So it needs to
pre-validate the phy-mode from the device tree and prevent PHYLINK from
attempting to change it. For this, it needs to cache it in a private
variable.
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d79d3032
...@@ -500,13 +500,14 @@ EXPORT_SYMBOL(ocelot_port_enable); ...@@ -500,13 +500,14 @@ EXPORT_SYMBOL(ocelot_port_enable);
static int ocelot_port_open(struct net_device *dev) static int ocelot_port_open(struct net_device *dev)
{ {
struct ocelot_port_private *priv = netdev_priv(dev); struct ocelot_port_private *priv = netdev_priv(dev);
struct ocelot *ocelot = priv->port.ocelot; struct ocelot_port *ocelot_port = &priv->port;
struct ocelot *ocelot = ocelot_port->ocelot;
int port = priv->chip_port; int port = priv->chip_port;
int err; int err;
if (priv->serdes) { if (priv->serdes) {
err = phy_set_mode_ext(priv->serdes, PHY_MODE_ETHERNET, err = phy_set_mode_ext(priv->serdes, PHY_MODE_ETHERNET,
priv->phy_mode); ocelot_port->phy_mode);
if (err) { if (err) {
netdev_err(dev, "Could not set mode of SerDes\n"); netdev_err(dev, "Could not set mode of SerDes\n");
return err; return err;
...@@ -514,7 +515,7 @@ static int ocelot_port_open(struct net_device *dev) ...@@ -514,7 +515,7 @@ static int ocelot_port_open(struct net_device *dev)
} }
err = phy_connect_direct(dev, priv->phy, &ocelot_port_adjust_link, err = phy_connect_direct(dev, priv->phy, &ocelot_port_adjust_link,
priv->phy_mode); ocelot_port->phy_mode);
if (err) { if (err) {
netdev_err(dev, "Could not attach to PHY\n"); netdev_err(dev, "Could not attach to PHY\n");
return err; return err;
......
...@@ -68,7 +68,6 @@ struct ocelot_port_private { ...@@ -68,7 +68,6 @@ struct ocelot_port_private {
u8 vlan_aware; u8 vlan_aware;
phy_interface_t phy_mode;
struct phy *serdes; struct phy *serdes;
struct ocelot_port_tc tc; struct ocelot_port_tc tc;
......
...@@ -402,9 +402,9 @@ static int mscc_ocelot_probe(struct platform_device *pdev) ...@@ -402,9 +402,9 @@ static int mscc_ocelot_probe(struct platform_device *pdev)
of_get_phy_mode(portnp, &phy_mode); of_get_phy_mode(portnp, &phy_mode);
priv->phy_mode = phy_mode; ocelot_port->phy_mode = phy_mode;
switch (priv->phy_mode) { switch (ocelot_port->phy_mode) {
case PHY_INTERFACE_MODE_NA: case PHY_INTERFACE_MODE_NA:
continue; continue;
case PHY_INTERFACE_MODE_SGMII: case PHY_INTERFACE_MODE_SGMII:
......
...@@ -420,6 +420,8 @@ struct ocelot_port { ...@@ -420,6 +420,8 @@ struct ocelot_port {
u8 ptp_cmd; u8 ptp_cmd;
struct sk_buff_head tx_skbs; struct sk_buff_head tx_skbs;
u8 ts_id; u8 ts_id;
phy_interface_t phy_mode;
}; };
struct ocelot { struct ocelot {
......
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