summaryrefslogtreecommitdiff
path: root/drivers/net/phy/fixed_phy.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-04-03 15:08:20 -0400
committerDavid S. Miller <davem@davemloft.net>2015-04-03 15:08:20 -0400
commitb98d8075e65c9cb688e73b941d873986e7bbf7ae (patch)
tree11065a9cf7570f455b747eab454dfc9b48916175 /drivers/net/phy/fixed_phy.c
parentbcad57182425426dd4aa14deb27f97acb329f3cd (diff)
parent898b2970e2c91e4543b579998922822894325866 (diff)
Merge branch 'mvneta-sgmii'
Stas Sergeev says: ==================== mvneta: SGMII-based in-band link state signaling Currently the fixed-link DT binding is pre-configured and cannot be changed in run-time. This means the cable unplug events are not being detected, and the link parameters can't be negotiated. The following patches are needed when mvneta is used in fixed-link mode (without MDIO). They add an API to fixed_phy that allows to update status, and use that API in the mvneta driver when parsing the SGMII in-band status. There is also another implementation that doesn't add any API and does everything in mvneta driver locally: https://lkml.org/lkml/2015/3/31/327 I'll let people decide which approach is better. No strong opinion on my side. ==================== Signed-off-by: Stas Sergeev <stsp@users.sourceforge.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/phy/fixed_phy.c')
-rw-r--r--drivers/net/phy/fixed_phy.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/net/phy/fixed_phy.c b/drivers/net/phy/fixed_phy.c
index a08a3c78ba97..1960b46add65 100644
--- a/drivers/net/phy/fixed_phy.c
+++ b/drivers/net/phy/fixed_phy.c
@@ -183,6 +183,35 @@ int fixed_phy_set_link_update(struct phy_device *phydev,
}
EXPORT_SYMBOL_GPL(fixed_phy_set_link_update);
+int fixed_phy_update_state(struct phy_device *phydev,
+ const struct fixed_phy_status *status,
+ const struct fixed_phy_status *changed)
+{
+ struct fixed_mdio_bus *fmb = &platform_fmb;
+ struct fixed_phy *fp;
+
+ if (!phydev || !phydev->bus)
+ return -EINVAL;
+
+ list_for_each_entry(fp, &fmb->phys, node) {
+ if (fp->addr == phydev->addr) {
+#define _UPD(x) if (changed->x) \
+ fp->status.x = status->x
+ _UPD(link);
+ _UPD(speed);
+ _UPD(duplex);
+ _UPD(pause);
+ _UPD(asym_pause);
+#undef _UPD
+ fixed_phy_update_regs(fp);
+ return 0;
+ }
+ }
+
+ return -ENOENT;
+}
+EXPORT_SYMBOL(fixed_phy_update_state);
+
int fixed_phy_add(unsigned int irq, int phy_addr,
struct fixed_phy_status *status)
{