bgmac: fix *initial* chip reset to support BCM5358
commitf99e6d7c4e
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:f6a95a2495
("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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
794bfb6fd9
commit
6f2bb37da4
@ -890,13 +890,13 @@ static void bgmac_chip_reset_idm_config(struct bgmac *bgmac)
|
|||||||
|
|
||||||
if (iost & BGMAC_BCMA_IOST_ATTACHED) {
|
if (iost & BGMAC_BCMA_IOST_ATTACHED) {
|
||||||
flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
|
flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
|
||||||
if (!bgmac->has_robosw)
|
if (bgmac->in_init || !bgmac->has_robosw)
|
||||||
flags |= BGMAC_BCMA_IOCTL_SW_RESET;
|
flags |= BGMAC_BCMA_IOCTL_SW_RESET;
|
||||||
}
|
}
|
||||||
bgmac_clk_enable(bgmac, flags);
|
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_write(bgmac, BCMA_IOCTL,
|
||||||
bgmac_idm_read(bgmac, BCMA_IOCTL) &
|
bgmac_idm_read(bgmac, BCMA_IOCTL) &
|
||||||
~BGMAC_BCMA_IOCTL_SW_RESET);
|
~BGMAC_BCMA_IOCTL_SW_RESET);
|
||||||
@ -1489,6 +1489,8 @@ int bgmac_enet_probe(struct bgmac *bgmac)
|
|||||||
struct net_device *net_dev = bgmac->net_dev;
|
struct net_device *net_dev = bgmac->net_dev;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
bgmac->in_init = true;
|
||||||
|
|
||||||
bgmac_chip_intrs_off(bgmac);
|
bgmac_chip_intrs_off(bgmac);
|
||||||
|
|
||||||
net_dev->irq = bgmac->irq;
|
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->hw_features = net_dev->features;
|
||||||
net_dev->vlan_features = net_dev->features;
|
net_dev->vlan_features = net_dev->features;
|
||||||
|
|
||||||
|
bgmac->in_init = false;
|
||||||
|
|
||||||
err = register_netdev(bgmac->net_dev);
|
err = register_netdev(bgmac->net_dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(bgmac->dev, "Cannot register net device\n");
|
dev_err(bgmac->dev, "Cannot register net device\n");
|
||||||
|
@ -511,6 +511,8 @@ struct bgmac {
|
|||||||
int irq;
|
int irq;
|
||||||
u32 int_mask;
|
u32 int_mask;
|
||||||
|
|
||||||
|
bool in_init;
|
||||||
|
|
||||||
/* Current MAC state */
|
/* Current MAC state */
|
||||||
int mac_speed;
|
int mac_speed;
|
||||||
int mac_duplex;
|
int mac_duplex;
|
||||||
|
Reference in New Issue
Block a user