109 lines
3.7 KiB
Diff
109 lines
3.7 KiB
Diff
|
From 6ed88d188a8240ba44da6578eab7d17e036d0e61 Mon Sep 17 00:00:00 2001
|
||
|
From: Phil Elwell <phil@raspberrypi.org>
|
||
|
Date: Tue, 17 Oct 2017 15:04:29 +0100
|
||
|
Subject: [PATCH] lan78xx: Enable LEDs if no valid EEPROM or OTP
|
||
|
|
||
|
For applications of the LAN78xx that don't have valid programmed
|
||
|
EEPROMs or OTPs, enabling both LEDs by default seems reasonable.
|
||
|
|
||
|
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||
|
---
|
||
|
drivers/net/usb/lan78xx.c | 6 ++++++
|
||
|
1 file changed, 6 insertions(+)
|
||
|
|
||
|
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
|
||
|
index a21039852f8d..cd20ce4ed87d 100644
|
||
|
--- a/drivers/net/usb/lan78xx.c
|
||
|
+++ b/drivers/net/usb/lan78xx.c
|
||
|
@@ -2414,6 +2414,12 @@ static int lan78xx_reset(struct lan78xx_net *dev)
|
||
|
|
||
|
ret = lan78xx_read_reg(dev, HW_CFG, &buf);
|
||
|
buf |= HW_CFG_MEF_;
|
||
|
+
|
||
|
+ /* If no valid EEPROM and no valid OTP, enable the LEDs by default */
|
||
|
+ if (lan78xx_read_eeprom(dev, 0, 0, NULL) &&
|
||
|
+ lan78xx_read_otp(dev, 0, 0, NULL))
|
||
|
+ buf |= HW_CFG_LED0_EN_ | HW_CFG_LED1_EN_;
|
||
|
+
|
||
|
ret = lan78xx_write_reg(dev, HW_CFG, buf);
|
||
|
|
||
|
ret = lan78xx_read_reg(dev, USB_CFG0, &buf);
|
||
|
From f8a798bb45ae15cbec980c8e921eb377fd1a3df6 Mon Sep 17 00:00:00 2001
|
||
|
From: Phil Elwell <phil@raspberrypi.org>
|
||
|
Date: Tue, 28 Nov 2017 12:02:37 +0000
|
||
|
Subject: [PATCH] lan78xx: Correctly indicate invalid OTP
|
||
|
|
||
|
lan78xx_read_otp tries to return -EINVAL in the event of invalid OTP
|
||
|
content, but the value gets overwritten before it is returned and the
|
||
|
read goes ahead anyway. Make the read conditional as it should be
|
||
|
and preserve the error code.
|
||
|
|
||
|
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||
|
---
|
||
|
drivers/net/usb/lan78xx.c | 3 ++-
|
||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
|
||
|
index cd20ce4ed87d..b270935f3f8d 100644
|
||
|
--- a/drivers/net/usb/lan78xx.c
|
||
|
+++ b/drivers/net/usb/lan78xx.c
|
||
|
@@ -929,7 +929,8 @@ static int lan78xx_read_otp(struct lan78xx_net *dev, u32 offset,
|
||
|
offset += 0x100;
|
||
|
else
|
||
|
ret = -EINVAL;
|
||
|
- ret = lan78xx_read_raw_otp(dev, offset, length, data);
|
||
|
+ if (!ret)
|
||
|
+ ret = lan78xx_read_raw_otp(dev, offset, length, data);
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
From 4a4710f3847cd087e150f83382dffd92e09d9914 Mon Sep 17 00:00:00 2001
|
||
|
From: Phil Elwell <phil@raspberrypi.org>
|
||
|
Date: Sat, 17 Mar 2018 00:10:02 +0100
|
||
|
Subject: [PATCH] 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.
|
||
|
|
||
|
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||
|
---
|
||
|
drivers/net/usb/lan78xx.c | 10 ++++++++++
|
||
|
1 file changed, 10 insertions(+)
|
||
|
|
||
|
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
|
||
|
index 60a604cc7647..a21039852f8d 100644
|
||
|
--- a/drivers/net/usb/lan78xx.c
|
||
|
+++ b/drivers/net/usb/lan78xx.c
|
||
|
@@ -36,6 +36,7 @@
|
||
|
#include <linux/irq.h>
|
||
|
#include <linux/irqchip/chained_irq.h>
|
||
|
#include <linux/microchipphy.h>
|
||
|
+#include <linux/of_net.h>
|
||
|
#include <linux/phy.h>
|
||
|
#include "lan78xx.h"
|
||
|
|
||
|
@@ -1639,6 +1640,14 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev)
|
||
|
u32 addr_lo, addr_hi;
|
||
|
int ret;
|
||
|
u8 addr[6];
|
||
|
+ const u8 *mac_addr;
|
||
|
+
|
||
|
+ /* maybe the boot loader passed the MAC address in devicetree */
|
||
|
+ mac_addr = of_get_mac_address(dev->udev->dev.of_node);
|
||
|
+ if (mac_addr) {
|
||
|
+ ether_addr_copy(addr, mac_addr);
|
||
|
+ goto set_mac_addr;
|
||
|
+ }
|
||
|
|
||
|
ret = lan78xx_read_reg(dev, RX_ADDRL, &addr_lo);
|
||
|
ret = lan78xx_read_reg(dev, RX_ADDRH, &addr_hi);
|
||
|
@@ -1667,6 +1676,7 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev)
|
||
|
"MAC address set to random addr");
|
||
|
}
|
||
|
|
||
|
+set_mac_addr:
|
||
|
addr_lo = addr[0] | (addr[1] << 8) |
|
||
|
(addr[2] << 16) | (addr[3] << 24);
|
||
|
addr_hi = addr[4] | (addr[5] << 8);
|