Message ID | 20230706111346.20234-1-zajec5@gmail.com (mailing list archive) |
---|---|
State | Handled Elsewhere |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [linux-5.4.y] bgmac: fix *initial* chip reset to support BCM5358 | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessing tree name failed - patch did not apply |
On Thu, Jul 06, 2023 at 01:13:46PM +0200, Rafał Miłecki wrote: > From: Rafał Miłecki <rafal@milecki.pl> > > commit f99e6d7c4ed3be2531bd576425a5bd07fb133bd7 upstream. > > 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> > Reviewed-by: Leon Romanovsky <leonro@nvidia.com> > Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> > Link: https://lore.kernel.org/r/20230227091156.19509-1-zajec5@gmail.com > Signed-off-by: Paolo Abeni <pabeni@redhat.com> > --- > Upstream commit wasn't backported to 5.4 (and older) because it couldn't > be cherry-picked cleanly. There was a small fuzz caused by a missing > commit 8c7da63978f1 ("bgmac: configure MTU and add support for frames > beyond 8192 byte size"). > > I've manually cherry-picked fix for BCM5358 to the linux-5.4.x. > --- > drivers/net/ethernet/broadcom/bgmac.c | 8 ++++++-- > drivers/net/ethernet/broadcom/bgmac.h | 2 ++ > 2 files changed, 8 insertions(+), 2 deletions(-) > Now queued up, thanks. greg k-h
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c index 193722334d93..89a63fdbe0e3 100644 --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c @@ -890,13 +890,13 @@ static void bgmac_chip_reset_idm_config(struct bgmac *bgmac) 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); @@ -1489,6 +1489,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; @@ -1538,6 +1540,8 @@ int bgmac_enet_probe(struct bgmac *bgmac) net_dev->hw_features = net_dev->features; net_dev->vlan_features = net_dev->features; + bgmac->in_init = false; + err = register_netdev(bgmac->net_dev); if (err) { dev_err(bgmac->dev, "Cannot register net device\n"); diff --git a/drivers/net/ethernet/broadcom/bgmac.h b/drivers/net/ethernet/broadcom/bgmac.h index 40d02fec2747..76930b8353d6 100644 --- a/drivers/net/ethernet/broadcom/bgmac.h +++ b/drivers/net/ethernet/broadcom/bgmac.h @@ -511,6 +511,8 @@ struct bgmac { int irq; u32 int_mask; + bool in_init; + /* Current MAC state */ int mac_speed; int mac_duplex;