bcm47xx: fix bgmac support for BCM5358
Fix two long-standing regressions. Fixes: https://github.com/openwrt/openwrt/issues/8278 Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
		| @@ -0,0 +1,46 @@ | |||||||
|  | From d61615c366a489646a1bfe5b33455f916762d5f4 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Wed, 8 Feb 2023 10:16:37 +0100 | ||||||
|  | Subject: [PATCH] net: bgmac: fix BCM5358 support by setting correct flags | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | Code blocks handling BCMA_CHIP_ID_BCM5357 and BCMA_CHIP_ID_BCM53572 were | ||||||
|  | incorrectly unified. Chip package values are not unique and cannot be | ||||||
|  | checked independently. They are meaningful only in a context of a given | ||||||
|  | chip. | ||||||
|  |  | ||||||
|  | Packages BCM5358 and BCM47188 share the same value but then belong to | ||||||
|  | different chips. Code unification resulted in treating BCM5358 as | ||||||
|  | BCM47188 and broke its initialization. | ||||||
|  |  | ||||||
|  | Link: https://github.com/openwrt/openwrt/issues/8278 | ||||||
|  | Fixes: cb1b0f90acfe ("net: ethernet: bgmac: unify code of the same family") | ||||||
|  | Cc: Jon Mason <jdmason@kudzu.us> | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> | ||||||
|  | Link: https://lore.kernel.org/r/20230208091637.16291-1-zajec5@gmail.com | ||||||
|  | Signed-off-by: Jakub Kicinski <kuba@kernel.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/ethernet/broadcom/bgmac-bcma.c | 6 +++--- | ||||||
|  |  1 file changed, 3 insertions(+), 3 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/ethernet/broadcom/bgmac-bcma.c | ||||||
|  | +++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c | ||||||
|  | @@ -240,12 +240,12 @@ static int bgmac_probe(struct bcma_devic | ||||||
|  |  		bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST; | ||||||
|  |  		bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1; | ||||||
|  |  		bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY; | ||||||
|  | -		if (ci->pkg == BCMA_PKG_ID_BCM47188 || | ||||||
|  | -		    ci->pkg == BCMA_PKG_ID_BCM47186) { | ||||||
|  | +		if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) || | ||||||
|  | +		    (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) { | ||||||
|  |  			bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII; | ||||||
|  |  			bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED; | ||||||
|  |  		} | ||||||
|  | -		if (ci->pkg == BCMA_PKG_ID_BCM5358) | ||||||
|  | +		if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358) | ||||||
|  |  			bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII; | ||||||
|  |  		break; | ||||||
|  |  	case BCMA_CHIP_ID_BCM53573: | ||||||
| @@ -0,0 +1,76 @@ | |||||||
|  | From 327dabbd0111910a7d174b0b812d608d6b67bead Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | 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 <jdmason@kudzu.us> | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | --- | ||||||
|  |  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; | ||||||
| @@ -0,0 +1,46 @@ | |||||||
|  | From d61615c366a489646a1bfe5b33455f916762d5f4 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Wed, 8 Feb 2023 10:16:37 +0100 | ||||||
|  | Subject: [PATCH] net: bgmac: fix BCM5358 support by setting correct flags | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | Code blocks handling BCMA_CHIP_ID_BCM5357 and BCMA_CHIP_ID_BCM53572 were | ||||||
|  | incorrectly unified. Chip package values are not unique and cannot be | ||||||
|  | checked independently. They are meaningful only in a context of a given | ||||||
|  | chip. | ||||||
|  |  | ||||||
|  | Packages BCM5358 and BCM47188 share the same value but then belong to | ||||||
|  | different chips. Code unification resulted in treating BCM5358 as | ||||||
|  | BCM47188 and broke its initialization. | ||||||
|  |  | ||||||
|  | Link: https://github.com/openwrt/openwrt/issues/8278 | ||||||
|  | Fixes: cb1b0f90acfe ("net: ethernet: bgmac: unify code of the same family") | ||||||
|  | Cc: Jon Mason <jdmason@kudzu.us> | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> | ||||||
|  | Link: https://lore.kernel.org/r/20230208091637.16291-1-zajec5@gmail.com | ||||||
|  | Signed-off-by: Jakub Kicinski <kuba@kernel.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/ethernet/broadcom/bgmac-bcma.c | 6 +++--- | ||||||
|  |  1 file changed, 3 insertions(+), 3 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/ethernet/broadcom/bgmac-bcma.c | ||||||
|  | +++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c | ||||||
|  | @@ -240,12 +240,12 @@ static int bgmac_probe(struct bcma_devic | ||||||
|  |  		bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST; | ||||||
|  |  		bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1; | ||||||
|  |  		bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY; | ||||||
|  | -		if (ci->pkg == BCMA_PKG_ID_BCM47188 || | ||||||
|  | -		    ci->pkg == BCMA_PKG_ID_BCM47186) { | ||||||
|  | +		if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) || | ||||||
|  | +		    (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) { | ||||||
|  |  			bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII; | ||||||
|  |  			bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED; | ||||||
|  |  		} | ||||||
|  | -		if (ci->pkg == BCMA_PKG_ID_BCM5358) | ||||||
|  | +		if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358) | ||||||
|  |  			bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII; | ||||||
|  |  		break; | ||||||
|  |  	case BCMA_CHIP_ID_BCM53573: | ||||||
| @@ -0,0 +1,76 @@ | |||||||
|  | From 327dabbd0111910a7d174b0b812d608d6b67bead Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | 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 <jdmason@kudzu.us> | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | --- | ||||||
|  |  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 | ||||||
|  | @@ -475,6 +475,8 @@ struct bgmac { | ||||||
|  |  	int irq; | ||||||
|  |  	u32 int_mask; | ||||||
|  |   | ||||||
|  | +	bool in_init; | ||||||
|  | + | ||||||
|  |  	/* Current MAC state */ | ||||||
|  |  	int mac_speed; | ||||||
|  |  	int mac_duplex; | ||||||
		Reference in New Issue
	
	Block a user
	 Rafał Miłecki
					Rafał Miłecki