| From eefd7ac9c893e4c263d19f4d1e6482f8cdb9b6d7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 27 Oct 2021 15:27:27 +0530 |
| Subject: net: amd-xgbe: Toggle PLL settings during rate change |
| |
| From: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> |
| |
| [ Upstream commit daf182d360e509a494db18666799f4e85d83dda0 ] |
| |
| For each rate change command submission, the FW has to do a phy |
| power off sequence internally. For this to happen correctly, the |
| PLL re-initialization control setting has to be turned off before |
| sending mailbox commands and re-enabled once the command submission |
| is complete. |
| |
| Without the PLL control setting, the link up takes longer time in a |
| fixed phy configuration. |
| |
| Fixes: 47f164deab22 ("amd-xgbe: Add PCI device support") |
| Co-developed-by: Sudheesh Mavila <sudheesh.mavila@amd.com> |
| Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com> |
| Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> |
| Acked-by: Tom Lendacky <thomas.lendacky@amd.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/amd/xgbe/xgbe-common.h | 8 ++++++++ |
| drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 20 +++++++++++++++++++- |
| 2 files changed, 27 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h |
| index b2cd3bdba9f89..533b8519ec352 100644 |
| --- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h |
| +++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h |
| @@ -1331,6 +1331,10 @@ |
| #define MDIO_VEND2_PMA_CDR_CONTROL 0x8056 |
| #endif |
| |
| +#ifndef MDIO_VEND2_PMA_MISC_CTRL0 |
| +#define MDIO_VEND2_PMA_MISC_CTRL0 0x8090 |
| +#endif |
| + |
| #ifndef MDIO_CTRL1_SPEED1G |
| #define MDIO_CTRL1_SPEED1G (MDIO_CTRL1_SPEED10G & ~BMCR_SPEED100) |
| #endif |
| @@ -1389,6 +1393,10 @@ |
| #define XGBE_PMA_RX_RST_0_RESET_ON 0x10 |
| #define XGBE_PMA_RX_RST_0_RESET_OFF 0x00 |
| |
| +#define XGBE_PMA_PLL_CTRL_MASK BIT(15) |
| +#define XGBE_PMA_PLL_CTRL_ENABLE BIT(15) |
| +#define XGBE_PMA_PLL_CTRL_DISABLE 0x0000 |
| + |
| /* Bit setting and getting macros |
| * The get macro will extract the current bit field value from within |
| * the variable |
| diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c |
| index d6f6afb67bcc6..0b325ae875b52 100644 |
| --- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c |
| +++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c |
| @@ -1972,12 +1972,26 @@ static void xgbe_phy_rx_reset(struct xgbe_prv_data *pdata) |
| } |
| } |
| |
| +static void xgbe_phy_pll_ctrl(struct xgbe_prv_data *pdata, bool enable) |
| +{ |
| + XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_MISC_CTRL0, |
| + XGBE_PMA_PLL_CTRL_MASK, |
| + enable ? XGBE_PMA_PLL_CTRL_ENABLE |
| + : XGBE_PMA_PLL_CTRL_DISABLE); |
| + |
| + /* Wait for command to complete */ |
| + usleep_range(100, 200); |
| +} |
| + |
| static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, |
| unsigned int cmd, unsigned int sub_cmd) |
| { |
| unsigned int s0 = 0; |
| unsigned int wait; |
| |
| + /* Disable PLL re-initialization during FW command processing */ |
| + xgbe_phy_pll_ctrl(pdata, false); |
| + |
| /* Log if a previous command did not complete */ |
| if (XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) { |
| netif_dbg(pdata, link, pdata->netdev, |
| @@ -1998,7 +2012,7 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, |
| wait = XGBE_RATECHANGE_COUNT; |
| while (wait--) { |
| if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) |
| - return; |
| + goto reenable_pll; |
| |
| usleep_range(1000, 2000); |
| } |
| @@ -2008,6 +2022,10 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, |
| |
| /* Reset on error */ |
| xgbe_phy_rx_reset(pdata); |
| + |
| +reenable_pll: |
| + /* Enable PLL re-initialization */ |
| + xgbe_phy_pll_ctrl(pdata, true); |
| } |
| |
| static void xgbe_phy_rrc(struct xgbe_prv_data *pdata) |
| -- |
| 2.33.0 |
| |