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