diff options
Diffstat (limited to 'bcm2837-lan78xx-fixes.patch')
-rw-r--r-- | bcm2837-lan78xx-fixes.patch | 364 |
1 files changed, 0 insertions, 364 deletions
diff --git a/bcm2837-lan78xx-fixes.patch b/bcm2837-lan78xx-fixes.patch index e8ac07b92..6d70cd36e 100644 --- a/bcm2837-lan78xx-fixes.patch +++ b/bcm2837-lan78xx-fixes.patch @@ -86,367 +86,3 @@ index 5b46998a6dce..6b61bb21f2ae 100644 -- 2.17.0 -From 7528d39c5d01383fadb17a84b9840f9f685d1e0b Mon Sep 17 00:00:00 2001 -From: Phil Elwell <phil@raspberrypi.org> -Date: Thu, 19 Apr 2018 17:59:38 +0100 -Subject: [PATCH 7/9] lan78xx: Read MAC address from DT if present - -There is a standard mechanism for locating and using a MAC address from -the Device Tree. Use this facility in the lan78xx driver to support -applications without programmed EEPROM or OTP. At the same time, -regularise the handling of the different address sources. - -Signed-off-by: Phil Elwell <phil@raspberrypi.org> ---- - drivers/net/usb/lan78xx.c | 42 +++++++++++++++++++-------------------- - 1 file changed, 20 insertions(+), 22 deletions(-) - -diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c -index 6b61bb21f2ae..6c38a74bb32d 100644 ---- a/drivers/net/usb/lan78xx.c -+++ b/drivers/net/usb/lan78xx.c -@@ -37,6 +37,7 @@ - #include <linux/irqchip/chained_irq.h> - #include <linux/microchipphy.h> - #include <linux/phy.h> -+#include <linux/of_net.h> - #include "lan78xx.h" - - #define DRIVER_AUTHOR "WOOJUNG HUH <woojung.huh@microchip.com>" -@@ -1652,34 +1653,31 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev) - addr[5] = (addr_hi >> 8) & 0xFF; - - if (!is_valid_ether_addr(addr)) { -- /* reading mac address from EEPROM or OTP */ -- if ((lan78xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN, -- addr) == 0) || -- (lan78xx_read_otp(dev, EEPROM_MAC_OFFSET, ETH_ALEN, -- addr) == 0)) { -- if (is_valid_ether_addr(addr)) { -- /* eeprom values are valid so use them */ -- netif_dbg(dev, ifup, dev->net, -- "MAC address read from EEPROM"); -- } else { -- /* generate random MAC */ -- random_ether_addr(addr); -- netif_dbg(dev, ifup, dev->net, -- "MAC address set to random addr"); -- } -- -- addr_lo = addr[0] | (addr[1] << 8) | -- (addr[2] << 16) | (addr[3] << 24); -- addr_hi = addr[4] | (addr[5] << 8); -- -- ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo); -- ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi); -+ if (!eth_platform_get_mac_address(&dev->udev->dev, addr)) { -+ /* valid address present in Device Tree */ -+ netif_dbg(dev, ifup, dev->net, -+ "MAC address read from Device Tree"); -+ } else if (((lan78xx_read_eeprom(dev, EEPROM_MAC_OFFSET, -+ ETH_ALEN, addr) == 0) || -+ (lan78xx_read_otp(dev, EEPROM_MAC_OFFSET, -+ ETH_ALEN, addr) == 0)) && -+ is_valid_ether_addr(addr)) { -+ /* eeprom values are valid so use them */ -+ netif_dbg(dev, ifup, dev->net, -+ "MAC address read from EEPROM"); - } else { - /* generate random MAC */ - random_ether_addr(addr); - netif_dbg(dev, ifup, dev->net, - "MAC address set to random addr"); - } -+ -+ addr_lo = addr[0] | (addr[1] << 8) | -+ (addr[2] << 16) | (addr[3] << 24); -+ addr_hi = addr[4] | (addr[5] << 8); -+ -+ ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo); -+ ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi); - } - - ret = lan78xx_write_reg(dev, MAF_LO(0), addr_lo); --- -2.17.0 - -From f8f9ad43b37f5db5895619e4304aa9ba286cbbb0 Mon Sep 17 00:00:00 2001 -From: Phil Elwell <phil@raspberrypi.org> -Date: Thu, 19 Apr 2018 17:59:40 +0100 -Subject: [PATCH 8/9] dt-bindings: Document the DT bindings for lan78xx - -The Microchip LAN78XX family of devices are Ethernet controllers with -a USB interface. Despite being discoverable devices it can be useful to -be able to configure them from Device Tree, particularly in low-cost -applications without an EEPROM or programmed OTP. - -Document the supported properties in a bindings file. - -Signed-off-by: Phil Elwell <phil@raspberrypi.org> -Reviewed-by: Andrew Lunn <andrew@lunn.ch> ---- - .../bindings/net/microchip,lan78xx.txt | 54 +++++++++++++++++++ - 1 file changed, 54 insertions(+) - create mode 100644 Documentation/devicetree/bindings/net/microchip,lan78xx.txt - -diff --git a/Documentation/devicetree/bindings/net/microchip,lan78xx.txt b/Documentation/devicetree/bindings/net/microchip,lan78xx.txt -new file mode 100644 -index 000000000000..76786a0f6d3d ---- /dev/null -+++ b/Documentation/devicetree/bindings/net/microchip,lan78xx.txt -@@ -0,0 +1,54 @@ -+Microchip LAN78xx Gigabit Ethernet controller -+ -+The LAN78XX devices are usually configured by programming their OTP or with -+an external EEPROM, but some platforms (e.g. Raspberry Pi 3 B+) have neither. -+The Device Tree properties, if present, override the OTP and EEPROM. -+ -+Required properties: -+- compatible: Should be one of "usb424,7800", "usb424,7801" or "usb424,7850". -+ -+Optional properties: -+- local-mac-address: see ethernet.txt -+- mac-address: see ethernet.txt -+ -+Optional properties of the embedded PHY: -+- microchip,led-modes: a 0..4 element vector, with each element configuring -+ the operating mode of an LED. Omitted LEDs are turned off. Allowed values -+ are defined in "include/dt-bindings/net/microchip-lan78xx.h". -+ -+Example: -+ -+/* Based on the configuration for a Raspberry Pi 3 B+ */ -+&usb { -+ usb-port@1 { -+ compatible = "usb424,2514"; -+ reg = <1>; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ usb-port@1 { -+ compatible = "usb424,2514"; -+ reg = <1>; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ ethernet: ethernet@1 { -+ compatible = "usb424,7800"; -+ reg = <1>; -+ local-mac-address = [ 00 11 22 33 44 55 ]; -+ -+ 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 -+ >; -+ }; -+ }; -+ }; -+ }; -+ }; -+}; --- -2.17.0 - -From be24db04ec2949e9b03763366f100ae40836c61e Mon Sep 17 00:00:00 2001 -From: Peter Robinson <pbrobinson@gmail.com> -Date: Mon, 23 Apr 2018 14:31:26 +0100 -Subject: [PATCH 9/9] lan78xx: Read LED states from Device Tree - -Add support for DT property "microchip,led-modes", a vector of zero -to four cells (u32s) in the range 0-15, each of which sets the mode -for one of the LEDs. Some possible values are: - - 0=link/activity 1=link1000/activity - 2=link100/activity 3=link10/activity - 4=link100/1000/activity 5=link10/1000/activity - 6=link10/100/activity 14=off 15=on - -These values are given symbolic constants in a dt-bindings header. - -Also use the presence of the DT property to indicate that the -LEDs should be enabled - necessary in the event that no valid OTP -or EEPROM is available. - -Signed-off-by: Phil Elwell <phil@raspberrypi.org> -Reviewed-by: Andrew Lunn <andrew@lunn.ch> ---- - MAINTAINERS | 1 + - drivers/net/phy/microchip.c | 25 ++++++++++++++++ - drivers/net/usb/lan78xx.c | 32 ++++++++++++++++++++- - include/dt-bindings/net/microchip-lan78xx.h | 21 ++++++++++++++ - include/linux/microchipphy.h | 3 ++ - 5 files changed, 81 insertions(+), 1 deletion(-) - create mode 100644 include/dt-bindings/net/microchip-lan78xx.h - -diff --git a/MAINTAINERS b/MAINTAINERS -index 6e950b8b4a41..c7d5f8c60a2c 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -14437,6 +14437,7 @@ M: Microchip Linux Driver Support <UNGLinuxDriver@microchip.com> - 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 <stern@rowland.harvard.edu> -diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c -index a97ac8c12c4c..2d67937866a3 100644 ---- a/drivers/net/phy/microchip.c -+++ b/drivers/net/phy/microchip.c -@@ -21,6 +21,8 @@ - #include <linux/phy.h> - #include <linux/microchipphy.h> - #include <linux/delay.h> -+#include <linux/of.h> -+#include <dt-bindings/net/microchip-lan78xx.h> - - #define DRIVER_AUTHOR "WOOJUNG HUH <woojung.huh@microchip.com>" - #define DRIVER_DESC "Microchip LAN88XX PHY driver" -@@ -225,6 +227,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) -@@ -232,6 +236,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 6c38a74bb32d..01b876daa600 100644 ---- a/drivers/net/usb/lan78xx.c -+++ b/drivers/net/usb/lan78xx.c -@@ -37,6 +37,7 @@ - #include <linux/irqchip/chained_irq.h> - #include <linux/microchipphy.h> - #include <linux/phy.h> -+#include <linux/of_mdio.h> - #include <linux/of_net.h> - #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 000000000000..0742ff075307 ---- /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 8f9c90379732..fd1fc8c248ef 100644 ---- a/include/linux/microchipphy.h -+++ b/include/linux/microchipphy.h -@@ -78,4 +78,7 @@ - #define LAN88XX_EXT_PAGE_TR_LOW_DATA 17 - #define LAN88XX_EXT_PAGE_TR_HIGH_DATA 18 - -+/* Registers specific to the LAN7800/LAN7850 embedded phy */ -+#define LAN78XX_PHY_LED_MODE_SELECT (0x1D) -+ - #endif /* _MICROCHIPPHY_H */ --- -2.17.0 |