| From 128e363e406841fbbd9800199cb093b4737d7cba 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 @@ |
| /* Forward declarations */ |
| static void bcmgenet_set_rx_mode(struct net_device *dev); |
| |
| +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 |
| @@ -2011,6 +2015,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); |
| |