Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: phy: smsc: disable energy detect mode

On some boards the energy enable detect mode leads in
trouble with some switches, so make the enabling of
this mode configurable through DT.

Signed-off-by: Heiko Schocher <hs@denx.de>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Heiko Schocher and committed by
David S. Miller
d88ecb37 9e42f715

+38 -5
+24
Documentation/devicetree/bindings/net/smsc-lan87xx.txt
··· 1 + SMSC LAN87xx Ethernet PHY 2 + 3 + Some boards require special tuning values. Configure them 4 + through an Ethernet OF device node. 5 + 6 + Optional properties: 7 + 8 + - smsc,disable-energy-detect: 9 + If set, do not enable energy detect mode for the SMSC phy. 10 + default: enable energy detect mode 11 + 12 + Examples: 13 + smsc phy with disabled energy detect mode on an am335x based board. 14 + &davinci_mdio { 15 + pinctrl-names = "default", "sleep"; 16 + pinctrl-0 = <&davinci_mdio_default>; 17 + pinctrl-1 = <&davinci_mdio_sleep>; 18 + status = "okay"; 19 + 20 + ethernetphy0: ethernet-phy@0 { 21 + reg = <0>; 22 + smsc,disable-energy-detect; 23 + }; 24 + };
+14 -5
drivers/net/phy/smsc.c
··· 43 43 44 44 static int smsc_phy_config_init(struct phy_device *phydev) 45 45 { 46 + int __maybe_unused len; 47 + struct device *dev __maybe_unused = &phydev->dev; 48 + struct device_node *of_node __maybe_unused = dev->of_node; 46 49 int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); 50 + int enable_energy = 1; 47 51 48 52 if (rc < 0) 49 53 return rc; 50 54 51 - /* Enable energy detect mode for this SMSC Transceivers */ 52 - rc = phy_write(phydev, MII_LAN83C185_CTRL_STATUS, 53 - rc | MII_LAN83C185_EDPWRDOWN); 54 - if (rc < 0) 55 - return rc; 55 + if (of_find_property(of_node, "smsc,disable-energy-detect", &len)) 56 + enable_energy = 0; 57 + 58 + if (enable_energy) { 59 + /* Enable energy detect mode for this SMSC Transceivers */ 60 + rc = phy_write(phydev, MII_LAN83C185_CTRL_STATUS, 61 + rc | MII_LAN83C185_EDPWRDOWN); 62 + if (rc < 0) 63 + return rc; 64 + } 56 65 57 66 return smsc_phy_ack_interrupt(phydev); 58 67 }