| 
					
				 | 
			
			
				@@ -0,0 +1,76 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+From 327dabbd0111910a7d174b0b812d608d6b67bead Mon Sep 17 00:00:00 2001 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Date: Mon, 8 Aug 2022 23:05:25 +0200 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Subject: [PATCH] bgmac: fix *initial* chip reset to support BCM5358 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+MIME-Version: 1.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Content-Type: text/plain; charset=UTF-8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Content-Transfer-Encoding: 8bit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+While bringing hardware up we should perform a full reset including the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+switch bit (BGMAC_BCMA_IOCTL_SW_RESET aka SICF_SWRST). It's what 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+specification says and what reference driver does. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+This seems to be critical for the BCM5358. Without this hardware doesn't 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+get initialized properly and doesn't seem to transmit or receive any 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+packets. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Originally bgmac was calling bgmac_chip_reset() before setting 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+"has_robosw" property which resulted in expected behaviour. That has 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+changed as a side effect of adding platform device support which 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+regressed BCM5358 support. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Fixes: f6a95a24957a ("net: ethernet: bgmac: Add platform device support") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Cc: Jon Mason <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Signed-off-by: Rafał Miłecki <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+--- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ drivers/net/ethernet/broadcom/bgmac.c | 8 ++++++-- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ drivers/net/ethernet/broadcom/bgmac.h | 2 ++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 2 files changed, 8 insertions(+), 2 deletions(-) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+--- a/drivers/net/ethernet/broadcom/bgmac.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++++ b/drivers/net/ethernet/broadcom/bgmac.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -891,13 +891,13 @@ static void bgmac_chip_reset_idm_config( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		if (iost & BGMAC_BCMA_IOST_ATTACHED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			flags = BGMAC_BCMA_IOCTL_SW_CLKEN; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-			if (!bgmac->has_robosw) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++			if (bgmac->in_init || !bgmac->has_robosw) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				flags |= BGMAC_BCMA_IOCTL_SW_RESET; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		bgmac_clk_enable(bgmac, flags); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-	if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (iost & BGMAC_BCMA_IOST_ATTACHED && (bgmac->in_init || !bgmac->has_robosw)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		bgmac_idm_write(bgmac, BCMA_IOCTL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				bgmac_idm_read(bgmac, BCMA_IOCTL) & 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 				~BGMAC_BCMA_IOCTL_SW_RESET); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1502,6 +1502,8 @@ int bgmac_enet_probe(struct bgmac *bgmac 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	struct net_device *net_dev = bgmac->net_dev; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	int err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	bgmac->in_init = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	bgmac_chip_intrs_off(bgmac); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	net_dev->irq = bgmac->irq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -1562,6 +1564,8 @@ int bgmac_enet_probe(struct bgmac *bgmac 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 			bgmac->b53_device = &bgmac_b53_dev; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	bgmac->in_init = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	err = register_netdev(bgmac->net_dev); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 		dev_err(bgmac->dev, "Cannot register net device\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+--- a/drivers/net/ethernet/broadcom/bgmac.h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++++ b/drivers/net/ethernet/broadcom/bgmac.h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -513,6 +513,8 @@ struct bgmac { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	int irq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	u32 int_mask; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	bool in_init; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	/* Current MAC state */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	int mac_speed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	int mac_duplex; 
			 |