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

Reply via email to