Run tested: ath79, ipq40xx Build tested: ath79, ipq40xx Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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
 | |
| @@ -1995,6 +1999,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);
 | |
|  
 |