Commit ce31b31c authored by Florian Fainelli's avatar Florian Fainelli Committed by David S. Miller

net: dsa: allow updating fixed PHY link information

Allow switch drivers to hook a PHY link update callback to perform
port-specific link work.
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ec9436ba
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/phy_fixed.h>
#define DSA_MAX_SWITCHES 4 #define DSA_MAX_SWITCHES 4
#define DSA_MAX_PORTS 12 #define DSA_MAX_PORTS 12
...@@ -187,6 +188,8 @@ struct dsa_switch_driver { ...@@ -187,6 +188,8 @@ struct dsa_switch_driver {
*/ */
void (*adjust_link)(struct dsa_switch *ds, int port, void (*adjust_link)(struct dsa_switch *ds, int port,
struct phy_device *phydev); struct phy_device *phydev);
void (*fixed_link_update)(struct dsa_switch *ds, int port,
struct fixed_phy_status *st);
/* /*
* ethtool hardware statistics. * ethtool hardware statistics.
......
...@@ -358,6 +358,18 @@ static void dsa_slave_adjust_link(struct net_device *dev) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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
*/ */
......
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