brcm2708: organize kernel patches
[openwrt/openwrt.git] / target / linux / brcm2708 / patches-4.19 / 950-0688-net-bcmgenet-Workaround-2-for-Pi4-Ethernet-fail.patch
diff --git a/target/linux/brcm2708/patches-4.19/950-0688-net-bcmgenet-Workaround-2-for-Pi4-Ethernet-fail.patch b/target/linux/brcm2708/patches-4.19/950-0688-net-bcmgenet-Workaround-2-for-Pi4-Ethernet-fail.patch
new file mode 100644 (file)
index 0000000..beeeb2f
--- /dev/null
@@ -0,0 +1,52 @@
+From 103afc4641ab8d6587e981a5e3fda27427a8bf4b Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 9 Aug 2019 08:51:43 +0100
+Subject: [PATCH] net: bcmgenet: Workaround #2 for Pi4 Ethernet fail
+
+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);