diff --git a/root/target/linux/brcm2708/patches-4.14/0997-lan78xx-read-led-states-from-dt.patch b/root/target/linux/brcm2708/patches-4.14/0997-lan78xx-read-led-states-from-dt.patch new file mode 100644 index 00000000..0646b538 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0997-lan78xx-read-led-states-from-dt.patch @@ -0,0 +1,166 @@ +diff --git a/MAINTAINERS b/MAINTAINERS +index b60179d..23735d9 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -14573,6 +14573,7 @@ M: Microchip Linux Driver Support + L: netdev@vger.kernel.org + S: Maintained + F: drivers/net/usb/lan78xx.* ++F: include/dt-bindings/net/microchip-lan78xx.h + + USB MASS STORAGE DRIVER + M: Alan Stern +diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c +index 0f293ef..ef5e160 100644 +--- a/drivers/net/phy/microchip.c ++++ b/drivers/net/phy/microchip.c +@@ -20,7 +20,9 @@ + #include + #include + #include + #include ++#include ++#include + + #define DRIVER_AUTHOR "WOOJUNG HUH " + #define DRIVER_DESC "Microchip LAN88XX PHY driver" +@@ -70,6 +72,8 @@ static int lan88xx_probe(struct phy_device *phydev) + { + struct device *dev = &phydev->mdio.dev; + struct lan88xx_priv *priv; ++ u32 led_modes[4]; ++ int len; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) +@@ -77,6 +81,27 @@ static int lan88xx_probe(struct phy_device *phydev) + + priv->wolopts = 0; + ++ len = of_property_read_variable_u32_array(dev->of_node, ++ "microchip,led-modes", ++ led_modes, ++ 0, ++ ARRAY_SIZE(led_modes)); ++ if (len >= 0) { ++ u32 reg = 0; ++ int i; ++ ++ for (i = 0; i < len; i++) { ++ if (led_modes[i] > 15) ++ return -EINVAL; ++ reg |= led_modes[i] << (i * 4); ++ } ++ for (; i < ARRAY_SIZE(led_modes); i++) ++ reg |= LAN78XX_FORCE_LED_OFF << (i * 4); ++ (void)phy_write(phydev, LAN78XX_PHY_LED_MODE_SELECT, reg); ++ } else if (len == -EOVERFLOW) { ++ return -EINVAL; ++ } ++ + /* these values can be used to identify internal PHY */ + priv->chip_id = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_ID); + priv->chip_rev = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_REV); +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index a823f01..6b03b97 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -37,6 +37,7 @@ + #include + #include + #include ++#include + #include + #include "lan78xx.h" + +@@ -1760,6 +1761,7 @@ static int lan78xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx, + + static int lan78xx_mdio_init(struct lan78xx_net *dev) + { ++ struct device_node *node; + int ret; + + dev->mdiobus = mdiobus_alloc(); +@@ -1788,7 +1790,13 @@ static int lan78xx_mdio_init(struct lan78xx_net *dev) + break; + } + +- ret = mdiobus_register(dev->mdiobus); ++ node = of_get_child_by_name(dev->udev->dev.of_node, "mdio"); ++ if (node) { ++ ret = of_mdiobus_register(dev->mdiobus, node); ++ of_node_put(node); ++ } else { ++ ret = mdiobus_register(dev->mdiobus); ++ } + if (ret) { + netdev_err(dev->net, "can't register MDIO bus\n"); + goto exit1; +@@ -2077,6 +2085,28 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) + mii_adv = (u32)mii_advertise_flowctrl(dev->fc_request_control); + phydev->advertising |= mii_adv_to_ethtool_adv_t(mii_adv); + ++ if (phydev->mdio.dev.of_node) { ++ u32 reg; ++ int len; ++ ++ len = of_property_count_elems_of_size(phydev->mdio.dev.of_node, ++ "microchip,led-modes", ++ sizeof(u32)); ++ if (len >= 0) { ++ /* Ensure the appropriate LEDs are enabled */ ++ lan78xx_read_reg(dev, HW_CFG, ®); ++ reg &= ~(HW_CFG_LED0_EN_ | ++ HW_CFG_LED1_EN_ | ++ HW_CFG_LED2_EN_ | ++ HW_CFG_LED3_EN_); ++ reg |= (len > 0) * HW_CFG_LED0_EN_ | ++ (len > 1) * HW_CFG_LED1_EN_ | ++ (len > 2) * HW_CFG_LED2_EN_ | ++ (len > 3) * HW_CFG_LED3_EN_; ++ lan78xx_write_reg(dev, HW_CFG, reg); ++ } ++ } ++ + genphy_config_aneg(phydev); + + dev->fc_autoneg = phydev->autoneg; +diff --git a/include/dt-bindings/net/microchip-lan78xx.h b/include/dt-bindings/net/microchip-lan78xx.h +new file mode 100644 +index 0000000..0742ff0 +--- /dev/null ++++ b/include/dt-bindings/net/microchip-lan78xx.h +@@ -0,0 +1,21 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef _DT_BINDINGS_MICROCHIP_LAN78XX_H ++#define _DT_BINDINGS_MICROCHIP_LAN78XX_H ++ ++/* LED modes for LAN7800/LAN7850 embedded PHY */ ++ ++#define LAN78XX_LINK_ACTIVITY 0 ++#define LAN78XX_LINK_1000_ACTIVITY 1 ++#define LAN78XX_LINK_100_ACTIVITY 2 ++#define LAN78XX_LINK_10_ACTIVITY 3 ++#define LAN78XX_LINK_100_1000_ACTIVITY 4 ++#define LAN78XX_LINK_10_1000_ACTIVITY 5 ++#define LAN78XX_LINK_10_100_ACTIVITY 6 ++#define LAN78XX_DUPLEX_COLLISION 8 ++#define LAN78XX_COLLISION 9 ++#define LAN78XX_ACTIVITY 10 ++#define LAN78XX_AUTONEG_FAULT 12 ++#define LAN78XX_FORCE_LED_OFF 14 ++#define LAN78XX_FORCE_LED_ON 15 ++ ++#endif +diff --git a/include/linux/microchipphy.h b/include/linux/microchipphy.h +index eb492d4..8e4015e 100644 +--- a/include/linux/microchipphy.h ++++ b/include/linux/microchipphy.h +@@ -70,4 +70,7 @@ + #define LAN88XX_MMD3_CHIP_ID (32877) + #define LAN88XX_MMD3_CHIP_REV (32878) + ++/* Registers specific to the LAN7800/LAN7850 embedded phy */ ++#define LAN78XX_PHY_LED_MODE_SELECT (0x1D) ++ + #endif /* _MICROCHIPPHY_H */ diff --git a/root/target/linux/brcm2708/patches-4.14/0998-set-led-states-to-dt.patch b/root/target/linux/brcm2708/patches-4.14/0998-set-led-states-to-dt.patch new file mode 100644 index 00000000..bc05f86e --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0998-set-led-states-to-dt.patch @@ -0,0 +1,49 @@ +--- a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi 2018-09-08 19:34:01.223685465 +0200 ++++ b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi 2018-09-08 19:37:11.689325045 +0200 +@@ -1,3 +1,5 @@ ++#include ++ + / { + aliases { + ethernet0 = ðernet; +@@ -17,27 +17,22 @@ + #address-cells = <1>; + #size-cells = <0>; + +- ethernet: usbether@1 { ++ ethernet: ethernet@1 { + compatible = "usb424,7800"; + reg = <1>; +- microchip,eee-enabled; +- microchip,tx-lpi-timer = <600>; /* non-aggressive*/ +- /* +- * led0 = 1:link1000/activity +- * led1 = 6:link10/100/activity +- */ +- microchip,led-modes = <1 6>; ++ ++ mdio { ++ #address-cells = <0x1>; ++ #size-cells = <0x0>; ++ eth_phy: ethernet-phy@1 { ++ reg = <1>; ++ microchip,led-modes = < ++ LAN78XX_LINK_1000_ACTIVITY ++ LAN78XX_LINK_10_100_ACTIVITY ++ >; ++ }; ++ }; + }; + }; + }; + }; +- +- +-/ { +- __overrides__ { +- eee = <ðernet>,"microchip,eee-enabled?"; +- tx_lpi_timer = <ðernet>,"microchip,tx-lpi-timer:0"; +- eth_led0 = <ðernet>,"microchip,led-modes:0"; +- eth_led1 = <ðernet>,"microchip,led-modes:4"; +- }; +-};