12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- From cddbec19466a1dfb4d45ddd507d9f09f991d54ae Mon Sep 17 00:00:00 2001
- From: Ansuel Smith <[email protected]>
- Date: Wed, 2 Feb 2022 01:03:28 +0100
- Subject: [PATCH 09/16] net: dsa: qca8k: add tracking state of master port
- MDIO/MIB Ethernet require the master port and the tagger availabale to
- correctly work. Use the new api master_state_change to track when master
- is operational or not and set a bool in qca8k_priv.
- We cache the first cached master available and we check if other cpu
- port are operational when the cached one goes down.
- This cached master will later be used by mdio read/write and mib request to
- correctly use the working function.
- qca8k implementation for MDIO/MIB Ethernet is bad. CPU port0 is the only
- one that answers with the ack packet or sends MIB Ethernet packets. For
- this reason the master_state_change ignore CPU port6 and only checks
- CPU port0 if it's operational and enables this mode.
- Signed-off-by: Ansuel Smith <[email protected]>
- Reviewed-by: Florian Fainelli <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- ---
- drivers/net/dsa/qca8k.c | 15 +++++++++++++++
- drivers/net/dsa/qca8k.h | 1 +
- 2 files changed, 16 insertions(+)
- --- a/drivers/net/dsa/qca8k.c
- +++ b/drivers/net/dsa/qca8k.c
- @@ -2401,6 +2401,20 @@ qca8k_port_lag_leave(struct dsa_switch *
- return qca8k_lag_refresh_portmap(ds, port, lag, true);
- }
-
- +static void
- +qca8k_master_change(struct dsa_switch *ds, const struct net_device *master,
- + bool operational)
- +{
- + struct dsa_port *dp = master->dsa_ptr;
- + struct qca8k_priv *priv = ds->priv;
- +
- + /* Ethernet MIB/MDIO is only supported for CPU port 0 */
- + if (dp->index != 0)
- + return;
- +
- + priv->mgmt_master = operational ? (struct net_device *)master : NULL;
- +}
- +
- static const struct dsa_switch_ops qca8k_switch_ops = {
- .get_tag_protocol = qca8k_get_tag_protocol,
- .setup = qca8k_setup,
- @@ -2436,6 +2450,7 @@ static const struct dsa_switch_ops qca8k
- .get_phy_flags = qca8k_get_phy_flags,
- .port_lag_join = qca8k_port_lag_join,
- .port_lag_leave = qca8k_port_lag_leave,
- + .master_state_change = qca8k_master_change,
- };
-
- static int qca8k_read_switch_id(struct qca8k_priv *priv)
- --- a/drivers/net/dsa/qca8k.h
- +++ b/drivers/net/dsa/qca8k.h
- @@ -353,6 +353,7 @@ struct qca8k_priv {
- struct dsa_switch_ops ops;
- struct gpio_desc *reset_gpio;
- unsigned int port_mtu[QCA8K_NUM_PORTS];
- + struct net_device *mgmt_master; /* Track if mdio/mib Ethernet is available */
- };
-
- struct qca8k_mib_desc {
|