diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2020-03-10 13:40:12 +0000 |
---|---|---|
committer | Russell King <rmk+kernel@armlinux.org.uk> | 2020-05-23 13:11:43 +0100 |
commit | 8c94e7ec54b9fabbee961ef5ec486697f5e2e889 (patch) | |
tree | 60d850ab3a80898cf621f112fe766f359d9b6bae /drivers | |
parent | 2da5331d428a83a2f8a2dade88804d46ef620ee2 (diff) |
dpaa2-mac: add 10GBASE-R PCS support
Add support for the 10GBASE-R PCS internal PHY, which we only use to
check the link status, since it offers a single fixed speed at fixed
full duplex only.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c | 31 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h | 1 |
2 files changed, 31 insertions, 1 deletions
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c index 39e545ccd697..8cf83168e2a0 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c @@ -34,6 +34,10 @@ static void dpaa2_mac_pcs_get_state(struct phylink_config *config, phylink_mii_c22_pcs_get_state(mac->pcs_sgmii, state); break; + case PHY_INTERFACE_MODE_10GBASER: + phylink_mii_c45_pcs_get_state(mac->pcs_10g, state); + break; + default: break; } @@ -146,6 +150,10 @@ static int phy_mode(enum dpmac_eth_if eth_if, phy_interface_t *if_mode) *if_mode = PHY_INTERFACE_MODE_SGMII; break; + case DPMAC_ETH_IF_XFI: + *if_mode = PHY_INTERFACE_MODE_10GBASER; + break; + default: return -EINVAL; } @@ -202,6 +210,9 @@ static bool dpaa2_mac_phy_mode_mismatch(struct dpaa2_mac *mac, case PHY_INTERFACE_MODE_1000BASEX: return interface != mac->if_mode && !mac->pcs_sgmii; + case PHY_INTERFACE_MODE_10GBASER: + return interface != mac->if_mode && !mac->pcs_10g; + case PHY_INTERFACE_MODE_RGMII: case PHY_INTERFACE_MODE_RGMII_ID: case PHY_INTERFACE_MODE_RGMII_RXID: @@ -231,6 +242,17 @@ static void dpaa2_mac_validate(struct phylink_config *config, switch (state->interface) { case PHY_INTERFACE_MODE_NA: + case PHY_INTERFACE_MODE_10GBASER: + phylink_set(mask, 10000baseT_Full); + phylink_set(mask, 10000baseKR_Full); + phylink_set(mask, 10000baseCR_Full); + phylink_set(mask, 10000baseSR_Full); + phylink_set(mask, 10000baseLR_Full); + phylink_set(mask, 10000baseLRM_Full); + phylink_set(mask, 10000baseER_Full); + if (state->interface != PHY_INTERFACE_MODE_NA) + break; + /* fallthrough */ case PHY_INTERFACE_MODE_1000BASEX: case PHY_INTERFACE_MODE_SGMII: case PHY_INTERFACE_MODE_RGMII: @@ -392,7 +414,10 @@ static int dpaa2_pcs_create(struct dpaa2_mac *mac, if (!mdiodev) return -EPROBE_DEFER; + get_device(&mdiodev->dev); + mac->pcs_sgmii = mdiodev; + mac->pcs_10g = mdiodev; mac->phylink_config.pcs_poll = true; return 0; @@ -404,6 +429,10 @@ static void dpaa2_pcs_destroy(struct dpaa2_mac *mac) put_device(&mac->pcs_sgmii->dev); mac->pcs_sgmii = NULL; } + if (mac->pcs_10g) { + put_device(&mac->pcs_10g->dev); + mac->pcs_10g = NULL; + } } int dpaa2_mac_connect(struct dpaa2_mac *mac) @@ -483,7 +512,7 @@ int dpaa2_mac_connect(struct dpaa2_mac *mac) } mac->phylink = phylink; - if (mac->pcs_sgmii) + if (mac->pcs_sgmii || mac->pcs_10g) phylink_add_pcs(mac->phylink, &dpaa2_pcs_phylink_ops); rtnl_lock(); diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h index 9df3fd290a47..066bf6fa70fe 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h @@ -20,6 +20,7 @@ struct dpaa2_mac { struct phylink_config phylink_config; struct phylink *phylink; struct mdio_device *pcs_sgmii; + struct mdio_device *pcs_10g; phy_interface_t if_mode; enum dpmac_link_type if_link_type; }; |