| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- From 128e363e406841fbbd9800199cb093b4737d7cba 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 | 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
- @@ -1997,6 +2001,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);
-
|