Commit eb67cdb3 authored by Paolo Abeni's avatar Paolo Abeni

Merge branch 'net-bcmasp-phy-managements-fixes'

Justin Chen says:

====================
net: bcmasp: phy managements fixes

Fix two issues.

- The unimac may be put in a bad state if PHY RX clk doesn't exist
  during reset. Work around this by bringing the unimac out of reset
  during phy up.

- Remove redundant phy_{suspend/resume}
====================

Link: https://lore.kernel.org/r/20240325193025.1540737-1-justin.chen@broadcom.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 6a4aee27 4494c10e
...@@ -392,7 +392,9 @@ static void umac_reset(struct bcmasp_intf *intf) ...@@ -392,7 +392,9 @@ static void umac_reset(struct bcmasp_intf *intf)
umac_wl(intf, 0x0, UMC_CMD); umac_wl(intf, 0x0, UMC_CMD);
umac_wl(intf, UMC_CMD_SW_RESET, UMC_CMD); umac_wl(intf, UMC_CMD_SW_RESET, UMC_CMD);
usleep_range(10, 100); usleep_range(10, 100);
umac_wl(intf, 0x0, UMC_CMD); /* We hold the umac in reset and bring it out of
* reset when phy link is up.
*/
} }
static void umac_set_hw_addr(struct bcmasp_intf *intf, static void umac_set_hw_addr(struct bcmasp_intf *intf,
...@@ -412,6 +414,8 @@ static void umac_enable_set(struct bcmasp_intf *intf, u32 mask, ...@@ -412,6 +414,8 @@ static void umac_enable_set(struct bcmasp_intf *intf, u32 mask,
u32 reg; u32 reg;
reg = umac_rl(intf, UMC_CMD); reg = umac_rl(intf, UMC_CMD);
if (reg & UMC_CMD_SW_RESET)
return;
if (enable) if (enable)
reg |= mask; reg |= mask;
else else
...@@ -430,7 +434,6 @@ static void umac_init(struct bcmasp_intf *intf) ...@@ -430,7 +434,6 @@ static void umac_init(struct bcmasp_intf *intf)
umac_wl(intf, 0x800, UMC_FRM_LEN); umac_wl(intf, 0x800, UMC_FRM_LEN);
umac_wl(intf, 0xffff, UMC_PAUSE_CNTRL); umac_wl(intf, 0xffff, UMC_PAUSE_CNTRL);
umac_wl(intf, 0x800, UMC_RX_MAX_PKT_SZ); umac_wl(intf, 0x800, UMC_RX_MAX_PKT_SZ);
umac_enable_set(intf, UMC_CMD_PROMISC, 1);
} }
static int bcmasp_tx_poll(struct napi_struct *napi, int budget) static int bcmasp_tx_poll(struct napi_struct *napi, int budget)
...@@ -658,6 +661,12 @@ static void bcmasp_adj_link(struct net_device *dev) ...@@ -658,6 +661,12 @@ static void bcmasp_adj_link(struct net_device *dev)
UMC_CMD_HD_EN | UMC_CMD_RX_PAUSE_IGNORE | UMC_CMD_HD_EN | UMC_CMD_RX_PAUSE_IGNORE |
UMC_CMD_TX_PAUSE_IGNORE); UMC_CMD_TX_PAUSE_IGNORE);
reg |= cmd_bits; reg |= cmd_bits;
if (reg & UMC_CMD_SW_RESET) {
reg &= ~UMC_CMD_SW_RESET;
umac_wl(intf, reg, UMC_CMD);
udelay(2);
reg |= UMC_CMD_TX_EN | UMC_CMD_RX_EN | UMC_CMD_PROMISC;
}
umac_wl(intf, reg, UMC_CMD); umac_wl(intf, reg, UMC_CMD);
active = phy_init_eee(phydev, 0) >= 0; active = phy_init_eee(phydev, 0) >= 0;
...@@ -1035,19 +1044,12 @@ static int bcmasp_netif_init(struct net_device *dev, bool phy_connect) ...@@ -1035,19 +1044,12 @@ static int bcmasp_netif_init(struct net_device *dev, bool phy_connect)
/* Indicate that the MAC is responsible for PHY PM */ /* Indicate that the MAC is responsible for PHY PM */
phydev->mac_managed_pm = true; phydev->mac_managed_pm = true;
} else if (!intf->wolopts) {
ret = phy_resume(dev->phydev);
if (ret)
goto err_phy_disable;
} }
umac_reset(intf); umac_reset(intf);
umac_init(intf); umac_init(intf);
/* Disable the UniMAC RX/TX */
umac_enable_set(intf, (UMC_CMD_RX_EN | UMC_CMD_TX_EN), 0);
umac_set_hw_addr(intf, dev->dev_addr); umac_set_hw_addr(intf, dev->dev_addr);
intf->old_duplex = -1; intf->old_duplex = -1;
...@@ -1062,9 +1064,6 @@ static int bcmasp_netif_init(struct net_device *dev, bool phy_connect) ...@@ -1062,9 +1064,6 @@ static int bcmasp_netif_init(struct net_device *dev, bool phy_connect)
netif_napi_add(intf->ndev, &intf->rx_napi, bcmasp_rx_poll); netif_napi_add(intf->ndev, &intf->rx_napi, bcmasp_rx_poll);
bcmasp_enable_rx(intf, 1); bcmasp_enable_rx(intf, 1);
/* Turn on UniMAC TX/RX */
umac_enable_set(intf, (UMC_CMD_RX_EN | UMC_CMD_TX_EN), 1);
intf->crc_fwd = !!(umac_rl(intf, UMC_CMD) & UMC_CMD_CRC_FWD); intf->crc_fwd = !!(umac_rl(intf, UMC_CMD) & UMC_CMD_CRC_FWD);
bcmasp_netif_start(dev); bcmasp_netif_start(dev);
...@@ -1306,7 +1305,14 @@ static void bcmasp_suspend_to_wol(struct bcmasp_intf *intf) ...@@ -1306,7 +1305,14 @@ static void bcmasp_suspend_to_wol(struct bcmasp_intf *intf)
if (intf->wolopts & WAKE_FILTER) if (intf->wolopts & WAKE_FILTER)
bcmasp_netfilt_suspend(intf); bcmasp_netfilt_suspend(intf);
/* UniMAC receive needs to be turned on */ /* Bring UniMAC out of reset if needed and enable RX */
reg = umac_rl(intf, UMC_CMD);
if (reg & UMC_CMD_SW_RESET)
reg &= ~UMC_CMD_SW_RESET;
reg |= UMC_CMD_RX_EN | UMC_CMD_PROMISC;
umac_wl(intf, reg, UMC_CMD);
umac_enable_set(intf, UMC_CMD_RX_EN, 1); umac_enable_set(intf, UMC_CMD_RX_EN, 1);
if (intf->parent->wol_irq > 0) { if (intf->parent->wol_irq > 0) {
...@@ -1324,7 +1330,6 @@ int bcmasp_interface_suspend(struct bcmasp_intf *intf) ...@@ -1324,7 +1330,6 @@ int bcmasp_interface_suspend(struct bcmasp_intf *intf)
{ {
struct device *kdev = &intf->parent->pdev->dev; struct device *kdev = &intf->parent->pdev->dev;
struct net_device *dev = intf->ndev; struct net_device *dev = intf->ndev;
int ret = 0;
if (!netif_running(dev)) if (!netif_running(dev))
return 0; return 0;
...@@ -1334,10 +1339,6 @@ int bcmasp_interface_suspend(struct bcmasp_intf *intf) ...@@ -1334,10 +1339,6 @@ int bcmasp_interface_suspend(struct bcmasp_intf *intf)
bcmasp_netif_deinit(dev); bcmasp_netif_deinit(dev);
if (!intf->wolopts) { if (!intf->wolopts) {
ret = phy_suspend(dev->phydev);
if (ret)
goto out;
if (intf->internal_phy) if (intf->internal_phy)
bcmasp_ephy_enable_set(intf, false); bcmasp_ephy_enable_set(intf, false);
else else
...@@ -1354,11 +1355,7 @@ int bcmasp_interface_suspend(struct bcmasp_intf *intf) ...@@ -1354,11 +1355,7 @@ int bcmasp_interface_suspend(struct bcmasp_intf *intf)
clk_disable_unprepare(intf->parent->clk); clk_disable_unprepare(intf->parent->clk);
return ret; return 0;
out:
bcmasp_netif_init(dev, false);
return ret;
} }
static void bcmasp_resume_from_wol(struct bcmasp_intf *intf) static void bcmasp_resume_from_wol(struct bcmasp_intf *intf)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment