2019-09-19 14:43:19 +00:00
|
|
|
From 103afc4641ab8d6587e981a5e3fda27427a8bf4b Mon Sep 17 00:00:00 2001
|
2019-08-09 17:50:30 +00:00
|
|
|
From: Phil Elwell <phil@raspberrypi.org>
|
|
|
|
Date: Fri, 9 Aug 2019 08:51:43 +0100
|
2019-12-23 12:42:55 +00:00
|
|
|
Subject: [PATCH] net: bcmgenet: Workaround #2 for Pi4 Ethernet fail
|
2019-08-09 17:50:30 +00:00
|
|
|
|
|
|
|
Some combinations of Pi 4Bs and Ethernet switches don't reliably get a
|
|
|
|
DCHP-assigned IP address, leaving the unit with a self=assigned 169.254
|
|
|
|
address. In the failure case, the Pi is left able to receive packets
|
|
|
|
but not send them, suggesting that the MAC<->PHY link is getting into
|
|
|
|
a bad state.
|
|
|
|
|
|
|
|
It has been found empirically that skipping a reset step by the genet
|
|
|
|
driver prevents the failures. No downsides have been discovered yet,
|
|
|
|
and unlike the forced renegotiation it doesn't increase the time to
|
|
|
|
get an IP address, so the workaround is enabled by default; add
|
|
|
|
|
|
|
|
genet.skip_umac_reset=n
|
|
|
|
|
|
|
|
to the command line to disable it.
|
|
|
|
|
|
|
|
See: https://github.com/raspberrypi/linux/issues/3108
|
|
|
|
|
|
|
|
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
|
|
|
---
|
|
|
|
drivers/net/ethernet/broadcom/genet/bcmgenet.c | 9 +++++++++
|
|
|
|
1 file changed, 9 insertions(+)
|
|
|
|
|
|
|
|
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
|
|
|
|
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
|
|
|
|
@@ -72,6 +72,10 @@
|
|
|
|
#define GENET_RDMA_REG_OFF (priv->hw_params->rdma_offset + \
|
|
|
|
TOTAL_DESC * DMA_DESC_SIZE)
|
|
|
|
|
|
|
|
+static bool skip_umac_reset = true;
|
|
|
|
+module_param(skip_umac_reset, bool, 0444);
|
|
|
|
+MODULE_PARM_DESC(skip_umac_reset, "Skip UMAC reset step");
|
|
|
|
+
|
|
|
|
static inline void bcmgenet_writel(u32 value, void __iomem *offset)
|
|
|
|
{
|
|
|
|
/* MIPS chips strapped for BE will automagically configure the
|
|
|
|
@@ -1993,6 +1997,11 @@ static void reset_umac(struct bcmgenet_p
|
|
|
|
bcmgenet_rbuf_ctrl_set(priv, 0);
|
|
|
|
udelay(10);
|
|
|
|
|
|
|
|
+ if (skip_umac_reset) {
|
|
|
|
+ pr_warn("Skipping UMAC reset\n");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
/* disable MAC while updating its registers */
|
|
|
|
bcmgenet_umac_writel(priv, 0, UMAC_CMD);
|
|
|
|
|