aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/phy/micrel.c
diff options
context:
space:
mode:
authorPhilipp Zabel <p.zabel@pengutronix.de>2016-07-14 10:29:43 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-15 14:53:02 -0400
commit77501a79cec40eac65c59ee7af3f786c703ead9c (patch)
treefab4f2e3f889b732c7aaaa9c1d9cd72ca698d998 /drivers/net/phy/micrel.c
parent2f43b9beeac8e063353452b4bcf8712f6c2de27b (diff)
net: phy: micrel: Add KSZ8041FTL fiber mode support
We can't detect the FXEN (fiber mode) bootstrap pin, so configure it via a boolean device tree property "micrel,fiber-mode". If it is enabled, auto-negotiation is not supported. The only available modes are 100base-fx (full duplex and half duplex). Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/phy/micrel.c')
-rw-r--r--drivers/net/phy/micrel.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c
index 5a8fefc25157..059f13b60fe0 100644
--- a/drivers/net/phy/micrel.c
+++ b/drivers/net/phy/micrel.c
@@ -311,6 +311,36 @@ static int kszphy_config_init(struct phy_device *phydev)
311 return 0; 311 return 0;
312} 312}
313 313
314static int ksz8041_config_init(struct phy_device *phydev)
315{
316 struct device_node *of_node = phydev->mdio.dev.of_node;
317
318 /* Limit supported and advertised modes in fiber mode */
319 if (of_property_read_bool(of_node, "micrel,fiber-mode")) {
320 phydev->dev_flags |= MICREL_PHY_FXEN;
321 phydev->supported &= SUPPORTED_FIBRE |
322 SUPPORTED_100baseT_Full |
323 SUPPORTED_100baseT_Half;
324 phydev->advertising &= ADVERTISED_FIBRE |
325 ADVERTISED_100baseT_Full |
326 ADVERTISED_100baseT_Half;
327 phydev->autoneg = AUTONEG_DISABLE;
328 }
329
330 return kszphy_config_init(phydev);
331}
332
333static int ksz8041_config_aneg(struct phy_device *phydev)
334{
335 /* Skip auto-negotiation in fiber mode */
336 if (phydev->dev_flags & MICREL_PHY_FXEN) {
337 phydev->speed = SPEED_100;
338 return 0;
339 }
340
341 return genphy_config_aneg(phydev);
342}
343
314static int ksz9021_load_values_from_of(struct phy_device *phydev, 344static int ksz9021_load_values_from_of(struct phy_device *phydev,
315 const struct device_node *of_node, 345 const struct device_node *of_node,
316 u16 reg, 346 u16 reg,
@@ -788,8 +818,8 @@ static struct phy_driver ksphy_driver[] = {
788 .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, 818 .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT,
789 .driver_data = &ksz8041_type, 819 .driver_data = &ksz8041_type,
790 .probe = kszphy_probe, 820 .probe = kszphy_probe,
791 .config_init = kszphy_config_init, 821 .config_init = ksz8041_config_init,
792 .config_aneg = genphy_config_aneg, 822 .config_aneg = ksz8041_config_aneg,
793 .read_status = genphy_read_status, 823 .read_status = genphy_read_status,
794 .ack_interrupt = kszphy_ack_interrupt, 824 .ack_interrupt = kszphy_ack_interrupt,
795 .config_intr = kszphy_config_intr, 825 .config_intr = kszphy_config_intr,