diff options
author | Vladimir Oltean <vladimir.oltean@nxp.com> | 2021-06-11 22:05:25 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2021-06-11 22:43:56 +0200 |
commit | dd0721ea4c7a6c2ec8b309ff57d74d88f08d4c23 (patch) | |
tree | 1b71de6869d88e0bd1ddfdebb0465ade16890b3b /drivers/net/pcs/pcs-xpcs-nxp.c | |
parent | net: pcs: xpcs: also ignore phy id if it's all ones (diff) | |
download | linux-dd0721ea4c7a6c2ec8b309ff57d74d88f08d4c23.tar.xz linux-dd0721ea4c7a6c2ec8b309ff57d74d88f08d4c23.zip |
net: pcs: xpcs: add support for NXP SJA1105
The NXP SJA1105 DSA switch integrates a Synopsys SGMII XPCS on port 4.
The generic code works fine, except there is an integration issue which
needs to be dealt with: in this switch, the XPCS is integrated with a
PMA that has the TX lane polarity inverted by default (PLUS is MINUS,
MINUS is PLUS).
To obtain normal non-inverted behavior, the TX lane polarity must be
inverted in the PCS, via the DIGITAL_CONTROL_2 register.
We introduce a pma_config() method in xpcs_compat which is called by the
phylink_pcs_config() implementation.
Also, the NXP SJA1105 returns all zeroes in the PHY ID registers 2 and 3.
We need to hack up an ad-hoc PHY ID (OUI is zero, device ID is 1) in
order for the XPCS driver to recognize it. This PHY ID is added to the
public include/linux/pcs/pcs-xpcs.h for that reason (for the sja1105
driver to be able to use it in a later patch).
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/pcs/pcs-xpcs-nxp.c')
-rw-r--r-- | drivers/net/pcs/pcs-xpcs-nxp.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/net/pcs/pcs-xpcs-nxp.c b/drivers/net/pcs/pcs-xpcs-nxp.c new file mode 100644 index 000000000000..51b2fc7d36a9 --- /dev/null +++ b/drivers/net/pcs/pcs-xpcs-nxp.c @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright 2021 NXP Semiconductors + */ +#include <linux/pcs/pcs-xpcs.h> +#include "pcs-xpcs.h" + +/* In NXP SJA1105, the PCS is integrated with a PMA that has the TX lane + * polarity inverted by default (PLUS is MINUS, MINUS is PLUS). To obtain + * normal non-inverted behavior, the TX lane polarity must be inverted in the + * PCS, via the DIGITAL_CONTROL_2 register. + */ +int nxp_sja1105_sgmii_pma_config(struct dw_xpcs *xpcs) +{ + return xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL2, + DW_VR_MII_DIG_CTRL2_TX_POL_INV); +} |