diff options
Diffstat (limited to 'target/linux/brcm2708/patches-4.19/950-0748-net-bcmgenet-Workaround-for-Pi-4B-network-issue.patch')
-rw-r--r-- | target/linux/brcm2708/patches-4.19/950-0748-net-bcmgenet-Workaround-for-Pi-4B-network-issue.patch | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.19/950-0748-net-bcmgenet-Workaround-for-Pi-4B-network-issue.patch b/target/linux/brcm2708/patches-4.19/950-0748-net-bcmgenet-Workaround-for-Pi-4B-network-issue.patch new file mode 100644 index 0000000000..31eac62c54 --- /dev/null +++ b/target/linux/brcm2708/patches-4.19/950-0748-net-bcmgenet-Workaround-for-Pi-4B-network-issue.patch @@ -0,0 +1,65 @@ +From 3695a97f62ba999293cb5f92e29179e8beaa44a8 Mon Sep 17 00:00:00 2001 +From: Phil Elwell <phil@raspberrypi.org> +Date: Fri, 2 Aug 2019 22:25:27 +0100 +Subject: [PATCH 748/782] net: bcmgenet: Workaround for Pi 4B network issue + +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. + +Forcing renegotiation has been found to be an effective workaround, so +add an automatic renegotiation after the link comes up for the first +time; enable it with genet.force_reneg=y - by default it is disabled. + +See: https://github.com/raspberrypi/linux/issues/3108 + +Signed-off-by: Phil Elwell <phil@raspberrypi.org> +--- + .../net/ethernet/broadcom/genet/bcmgenet.c | 22 +++++++++++++++++++ + 1 file changed, 22 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 force_reneg = false; ++module_param(force_reneg, bool, 0444); ++MODULE_PARM_DESC(force_reneg, "Force a renegotiation after the initial link-up"); ++ + static inline void bcmgenet_writel(u32 value, void __iomem *offset) + { + /* MIPS chips strapped for BE will automagically configure the +@@ -2610,6 +2614,7 @@ static void bcmgenet_irq_task(struct wor + unsigned int status; + struct bcmgenet_priv *priv = container_of( + work, struct bcmgenet_priv, bcmgenet_irq_work); ++ static int first_link = 1; + + netif_dbg(priv, intr, priv->dev, "%s\n", __func__); + +@@ -2622,6 +2627,23 @@ static void bcmgenet_irq_task(struct wor + if (status & UMAC_IRQ_LINK_EVENT) { + priv->dev->phydev->link = !!(status & UMAC_IRQ_LINK_UP); + phy_mac_interrupt(priv->dev->phydev); ++ ++ if (priv->dev->phydev->link && first_link) { ++ first_link = 0; ++ /* ++ * HACK: Some Pi4Bs, when paired with some switches, ++ * come up in a strange state where they are unable to ++ * transmit, causing them to fail to get an IP address. ++ * Although the failure mechanism is not yet understood, ++ * forcing renegotiation at this point has been shown ++ * to be effective in avoiding the problem. ++ */ ++ if (force_reneg) { ++ dev_info(&priv->pdev->dev, ++ "Forcing renegotiation\n"); ++ genphy_restart_aneg(priv->dev->phydev); ++ } ++ } + } + } + |