blob: 662ad103f95e4a4385edc2a128465b5cea604e39 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001From 1737de8045838dcf3c7713c940eb1582810a319f Mon Sep 17 00:00:00 2001
2From: Vladimir Oltean <vladimir.oltean@nxp.com>
3Date: Mon, 16 Dec 2019 15:07:20 +0200
4Subject: [PATCH] net: mscc: ocelot: make phy_mode a member of the common
5 struct ocelot_port
6
7The Ocelot switchdev driver and the Felix DSA one need it for different
8reasons. Felix (or at least the VSC9959 instantiation in NXP LS1028A) is
9integrated with the traditional NXP Layerscape PCS design which does not
10support runtime configuration of SerDes protocol. So it needs to
11pre-validate the phy-mode from the device tree and prevent PHYLINK from
12attempting to change it. For this, it needs to cache it in a private
13variable.
14
15Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
16---
17 drivers/net/ethernet/mscc/ocelot.c | 7 ++++---
18 drivers/net/ethernet/mscc/ocelot.h | 1 -
19 drivers/net/ethernet/mscc/ocelot_board.c | 4 ++--
20 include/soc/mscc/ocelot.h | 2 ++
21 4 files changed, 8 insertions(+), 6 deletions(-)
22
23--- a/drivers/net/ethernet/mscc/ocelot.c
24+++ b/drivers/net/ethernet/mscc/ocelot.c
25@@ -500,13 +500,14 @@ EXPORT_SYMBOL(ocelot_port_enable);
26 static int ocelot_port_open(struct net_device *dev)
27 {
28 struct ocelot_port_private *priv = netdev_priv(dev);
29- struct ocelot *ocelot = priv->port.ocelot;
30+ struct ocelot_port *ocelot_port = &priv->port;
31+ struct ocelot *ocelot = ocelot_port->ocelot;
32 int port = priv->chip_port;
33 int err;
34
35 if (priv->serdes) {
36 err = phy_set_mode_ext(priv->serdes, PHY_MODE_ETHERNET,
37- priv->phy_mode);
38+ ocelot_port->phy_mode);
39 if (err) {
40 netdev_err(dev, "Could not set mode of SerDes\n");
41 return err;
42@@ -514,7 +515,7 @@ static int ocelot_port_open(struct net_d
43 }
44
45 err = phy_connect_direct(dev, priv->phy, &ocelot_port_adjust_link,
46- priv->phy_mode);
47+ ocelot_port->phy_mode);
48 if (err) {
49 netdev_err(dev, "Could not attach to PHY\n");
50 return err;
51--- a/drivers/net/ethernet/mscc/ocelot.h
52+++ b/drivers/net/ethernet/mscc/ocelot.h
53@@ -70,7 +70,6 @@ struct ocelot_port_private {
54
55 u8 vlan_aware;
56
57- phy_interface_t phy_mode;
58 struct phy *serdes;
59
60 struct ocelot_port_tc tc;
61--- a/drivers/net/ethernet/mscc/ocelot_board.c
62+++ b/drivers/net/ethernet/mscc/ocelot_board.c
63@@ -412,9 +412,9 @@ static int mscc_ocelot_probe(struct plat
64 if (phy_mode < 0)
65 phy_mode = PHY_INTERFACE_MODE_NA;
66
67- priv->phy_mode = phy_mode;
68+ ocelot_port->phy_mode = phy_mode;
69
70- switch (priv->phy_mode) {
71+ switch (ocelot_port->phy_mode) {
72 case PHY_INTERFACE_MODE_NA:
73 continue;
74 case PHY_INTERFACE_MODE_SGMII:
75--- a/include/soc/mscc/ocelot.h
76+++ b/include/soc/mscc/ocelot.h
77@@ -425,6 +425,8 @@ struct ocelot_port {
78 u8 ptp_cmd;
79 struct sk_buff_head tx_skbs;
80 u8 ts_id;
81+
82+ phy_interface_t phy_mode;
83 };
84
85 struct ocelot {