|
@@ -358,6 +358,18 @@ static void dsa_slave_adjust_link(struct net_device *dev)
|
|
phy_print_status(p->phy);
|
|
phy_print_status(p->phy);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int dsa_slave_fixed_link_update(struct net_device *dev,
|
|
|
|
+ struct fixed_phy_status *status)
|
|
|
|
+{
|
|
|
|
+ struct dsa_slave_priv *p = netdev_priv(dev);
|
|
|
|
+ struct dsa_switch *ds = p->parent;
|
|
|
|
+
|
|
|
|
+ if (ds->drv->fixed_link_update)
|
|
|
|
+ ds->drv->fixed_link_update(ds, p->port, status);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
/* slave device setup *******************************************************/
|
|
/* slave device setup *******************************************************/
|
|
static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
|
|
static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
|
|
struct net_device *slave_dev)
|
|
struct net_device *slave_dev)
|
|
@@ -365,6 +377,7 @@ static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
|
|
struct dsa_switch *ds = p->parent;
|
|
struct dsa_switch *ds = p->parent;
|
|
struct dsa_chip_data *cd = ds->pd;
|
|
struct dsa_chip_data *cd = ds->pd;
|
|
struct device_node *phy_dn, *port_dn;
|
|
struct device_node *phy_dn, *port_dn;
|
|
|
|
+ bool phy_is_fixed = false;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
port_dn = cd->port_dn[p->port];
|
|
port_dn = cd->port_dn[p->port];
|
|
@@ -380,6 +393,7 @@ static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
|
|
pr_err("failed to register fixed PHY\n");
|
|
pr_err("failed to register fixed PHY\n");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ phy_is_fixed = true;
|
|
phy_dn = port_dn;
|
|
phy_dn = port_dn;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -388,6 +402,9 @@ static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
|
|
dsa_slave_adjust_link, 0,
|
|
dsa_slave_adjust_link, 0,
|
|
p->phy_interface);
|
|
p->phy_interface);
|
|
|
|
|
|
|
|
+ if (p->phy && phy_is_fixed)
|
|
|
|
+ fixed_phy_set_link_update(p->phy, dsa_slave_fixed_link_update);
|
|
|
|
+
|
|
/* We could not connect to a designated PHY, so use the switch internal
|
|
/* We could not connect to a designated PHY, so use the switch internal
|
|
* MDIO bus instead
|
|
* MDIO bus instead
|
|
*/
|
|
*/
|