mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
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>
37 lines
926 B
C
37 lines
926 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (c) 2020 Synopsys, Inc. and/or its affiliates.
|
|
* Synopsys DesignWare XPCS helpers
|
|
*/
|
|
|
|
#ifndef __LINUX_PCS_XPCS_H
|
|
#define __LINUX_PCS_XPCS_H
|
|
|
|
#include <linux/phy.h>
|
|
#include <linux/phylink.h>
|
|
|
|
#define NXP_SJA1105_XPCS_ID 0x00000010
|
|
|
|
/* AN mode */
|
|
#define DW_AN_C73 1
|
|
#define DW_AN_C37_SGMII 2
|
|
#define DW_2500BASEX 3
|
|
|
|
struct xpcs_id;
|
|
|
|
struct dw_xpcs {
|
|
struct mdio_device *mdiodev;
|
|
const struct xpcs_id *id;
|
|
struct phylink_pcs pcs;
|
|
};
|
|
|
|
int xpcs_get_an_mode(struct dw_xpcs *xpcs, phy_interface_t interface);
|
|
void xpcs_validate(struct dw_xpcs *xpcs, unsigned long *supported,
|
|
struct phylink_link_state *state);
|
|
int xpcs_config_eee(struct dw_xpcs *xpcs, int mult_fact_100ns,
|
|
int enable);
|
|
struct dw_xpcs *xpcs_create(struct mdio_device *mdiodev,
|
|
phy_interface_t interface);
|
|
void xpcs_destroy(struct dw_xpcs *xpcs);
|
|
|
|
#endif /* __LINUX_PCS_XPCS_H */
|