Marvell's mvpp2 packet processor supports RXAUI on port zero in a similar manner to the existing 10G protocols that have already been implemented. This patch implements the miscellaneous extra configuration steps required for RXAUI operation.
Signed-off-by: Matt Pelland <mpell...@starry.com> --- drivers/net/ethernet/marvell/mvpp2/mvpp2.h | 1 + .../net/ethernet/marvell/mvpp2/mvpp2_main.c | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h index 4d9564ba68f6..256e7c796631 100644 --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h @@ -481,6 +481,7 @@ #define MVPP22_XLG_CTRL4_REG 0x184 #define MVPP22_XLG_CTRL4_FWD_FC BIT(5) #define MVPP22_XLG_CTRL4_FWD_PFC BIT(6) +#define MVPP22_XLG_CTRL4_USE_XPCS BIT(8) #define MVPP22_XLG_CTRL4_MACMODSELECT_GMAC BIT(12) #define MVPP22_XLG_CTRL4_EN_IDLE_CHECK BIT(14) diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c index 74fd9e171865..1a5037a398fc 100644 --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c @@ -980,6 +980,7 @@ mvpp2_shared_interrupt_mask_unmask(struct mvpp2_port *port, bool mask) static bool mvpp2_is_xlg(phy_interface_t interface) { return interface == PHY_INTERFACE_MODE_10GKR || + interface == PHY_INTERFACE_MODE_RXAUI || interface == PHY_INTERFACE_MODE_XAUI; } @@ -1020,6 +1021,29 @@ static void mvpp22_gop_init_sgmii(struct mvpp2_port *port) } } +static void mvpp22_gop_init_rxaui(struct mvpp2_port *port) +{ + struct mvpp2 *priv = port->priv; + void __iomem *xpcs; + u32 val; + + xpcs = priv->iface_base + MVPP22_XPCS_BASE(port->gop_id); + + val = readl(xpcs + MVPP22_XPCS_CFG0); + val &= ~MVPP22_XPCS_CFG0_RESET_DIS; + writel(val, xpcs + MVPP22_XPCS_CFG0); + + val = readl(xpcs + MVPP22_XPCS_CFG0); + val &= ~(MVPP22_XPCS_CFG0_PCS_MODE(0x3) | + MVPP22_XPCS_CFG0_ACTIVE_LANE(0x3)); + val |= MVPP22_XPCS_CFG0_ACTIVE_LANE(2); + writel(val, xpcs + MVPP22_XPCS_CFG0); + + val = readl(xpcs + MVPP22_XPCS_CFG0); + val |= MVPP22_XPCS_CFG0_RESET_DIS; + writel(val, xpcs + MVPP22_XPCS_CFG0); +} + static void mvpp22_gop_init_10gkr(struct mvpp2_port *port) { struct mvpp2 *priv = port->priv; @@ -1065,6 +1089,9 @@ static int mvpp22_gop_init(struct mvpp2_port *port) case PHY_INTERFACE_MODE_2500BASEX: mvpp22_gop_init_sgmii(port); break; + case PHY_INTERFACE_MODE_RXAUI: + mvpp22_gop_init_rxaui(port); + break; case PHY_INTERFACE_MODE_10GKR: if (port->gop_id != 0) goto invalid_conf; @@ -4567,6 +4594,7 @@ static void mvpp2_phylink_validate(struct phylink_config *config, switch (state->interface) { case PHY_INTERFACE_MODE_10GKR: case PHY_INTERFACE_MODE_XAUI: + case PHY_INTERFACE_MODE_RXAUI: if (port->gop_id != 0) goto empty_set; break; @@ -4589,6 +4617,7 @@ static void mvpp2_phylink_validate(struct phylink_config *config, switch (state->interface) { case PHY_INTERFACE_MODE_10GKR: case PHY_INTERFACE_MODE_XAUI: + case PHY_INTERFACE_MODE_RXAUI: case PHY_INTERFACE_MODE_NA: if (port->gop_id == 0) { phylink_set(mask, 10000baseT_Full); @@ -4741,6 +4770,9 @@ static void mvpp2_xlg_config(struct mvpp2_port *port, unsigned int mode, MVPP22_XLG_CTRL4_EN_IDLE_CHECK); ctrl4 |= MVPP22_XLG_CTRL4_FWD_FC | MVPP22_XLG_CTRL4_FWD_PFC; + if (state->interface == PHY_INTERFACE_MODE_RXAUI) + ctrl4 |= MVPP22_XLG_CTRL4_USE_XPCS; + if (old_ctrl0 != ctrl0) writel(ctrl0, port->base + MVPP22_XLG_CTRL0_REG); if (old_ctrl4 != ctrl4) -- 2.21.0