diff mbox series

[1/2] net: rt8169: WAR for DHCP not getting IP after kernel boot/reboot

Message ID 1585263554-10258-2-git-send-email-tomcwarren3959@gmail.com
State Accepted
Commit a7a435e7d41db6a611427b4cc5fd506a18fb2c2f
Delegated to: Tom Rini
Headers show
Series net: tegra: Misc network fixes | expand

Commit Message

Tom Warren March 26, 2020, 10:59 p.m. UTC
From: Tom Warren <twarren@nvidia.com>

This is a WAR for DHCP failure after rebooting from the L4T kernel. The
r8169.c kernel driver is setting bit 19 of the rt816x HW register 0xF0,
which goes by FuncEvent and MISC in various driver source/datasheets.
That bit is called RxDv_Gated_En in the r8169.c kernel driver. Clear it
here at the end of probe to ensure that U-Boot can get an IP assigned
via DHCP.

Signed-off-by: Tom Warren <twarren@nvidia.com>
---
 drivers/net/rtl8169.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

Comments

Tom Rini June 12, 2020, 9:15 p.m. UTC | #1
On Thu, Mar 26, 2020 at 03:59:13PM -0700, tomcwarren3959@gmail.com wrote:

> From: Tom Warren <twarren@nvidia.com>
> 
> This is a WAR for DHCP failure after rebooting from the L4T kernel. The
> r8169.c kernel driver is setting bit 19 of the rt816x HW register 0xF0,
> which goes by FuncEvent and MISC in various driver source/datasheets.
> That bit is called RxDv_Gated_En in the r8169.c kernel driver. Clear it
> here at the end of probe to ensure that U-Boot can get an IP assigned
> via DHCP.
> 
> Signed-off-by: Tom Warren <twarren@nvidia.com>

Applied to u-boot/next, thanks!
diff mbox series

Patch

diff --git a/drivers/net/rtl8169.c b/drivers/net/rtl8169.c
index 5ccdfdd..ff89e28 100644
--- a/drivers/net/rtl8169.c
+++ b/drivers/net/rtl8169.c
@@ -237,6 +237,9 @@  enum RTL8169_register_content {
 
 	/*_TBICSRBit*/
 	TBILinkOK = 0x02000000,
+
+	/* FuncEvent/Misc */
+	RxDv_Gated_En = 0x80000,
 };
 
 static struct {
@@ -1207,6 +1210,19 @@  static int rtl8169_eth_probe(struct udevice *dev)
 		return ret;
 	}
 
+	/*
+	 * WAR for DHCP failure after rebooting from kernel.
+	 * Clear RxDv_Gated_En bit which was set by kernel driver.
+	 * Without this, U-Boot can't get an IP via DHCP.
+	 * Register (FuncEvent, aka MISC) and RXDV_GATED_EN bit are from
+	 * the r8169.c kernel driver.
+	 */
+
+	u32 val = RTL_R32(FuncEvent);
+	debug("%s: FuncEvent/Misc (0xF0) = 0x%08X\n", __func__, val);
+	val &= ~RxDv_Gated_En;
+	RTL_W32(FuncEvent, val);
+
 	return 0;
 }