123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- From 3c252c9745794d454391f378e7b99a4b4ea4b1c3 Mon Sep 17 00:00:00 2001
- From: Phil Elwell <[email protected]>
- 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 <[email protected]>
- ---
- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 8 ++++++++
- 1 file changed, 8 insertions(+)
- --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
- +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
- @@ -67,6 +67,9 @@
-
- /* 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)
- {
- @@ -2490,6 +2493,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;
- + }
- +
- /* issue soft reset and disable MAC while updating its registers */
- bcmgenet_umac_writel(priv, CMD_SW_RESET, UMAC_CMD);
- udelay(2);
|