mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	Try to fix RPI ethernet led
This commit is contained in:
		
							parent
							
								
									76d0a1574c
								
							
						
					
					
						commit
						1b98a82ed6
					
				
					 2 changed files with 215 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -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 <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 0f293ef..ef5e160 100644
 | 
			
		||||
--- a/drivers/net/phy/microchip.c
 | 
			
		||||
+++ b/drivers/net/phy/microchip.c
 | 
			
		||||
@@ -20,7 +20,9 @@
 | 
			
		||||
 #include <linux/ethtool.h>
 | 
			
		||||
 #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"
 | 
			
		||||
@@ -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 <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 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 */
 | 
			
		||||
| 
						 | 
				
			
			@ -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 <dt-bindings/net/microchip-lan78xx.h>
 | 
			
		||||
+
 | 
			
		||||
 / {
 | 
			
		||||
	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";
 | 
			
		||||
-	};
 | 
			
		||||
-};
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue