129 lines
4.0 KiB
C
129 lines
4.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause
|
|
*
|
|
* Northstar Plus switch SerDes/SGMII PHY definitions
|
|
*
|
|
* Copyright (C) 2018 Florian Fainelli <f.fainelli@gmail.com>
|
|
*/
|
|
|
|
#include <linux/phy.h>
|
|
#include <linux/types.h>
|
|
|
|
/* Non-standard page used to access SerDes PHY registers on NorthStar Plus */
|
|
#define B53_SERDES_PAGE 0x16
|
|
#define B53_SERDES_BLKADDR 0x3e
|
|
#define B53_SERDES_LANE 0x3c
|
|
|
|
#define B53_SERDES_ID0 0x20
|
|
#define SERDES_ID0_MODEL_MASK 0x3f
|
|
#define SERDES_ID0_REV_NUM_SHIFT 11
|
|
#define SERDES_ID0_REV_NUM_MASK 0x7
|
|
#define SERDES_ID0_REV_LETTER_SHIFT 14
|
|
|
|
#define B53_SERDES_MII_REG(x) (0x20 + (x) * 2)
|
|
#define B53_SERDES_DIGITAL_CONTROL(x) (0x1e + (x) * 2)
|
|
#define B53_SERDES_DIGITAL_STATUS 0x28
|
|
|
|
/* SERDES_DIGITAL_CONTROL1 */
|
|
#define FIBER_MODE_1000X BIT(0)
|
|
#define TBI_INTERFACE BIT(1)
|
|
#define SIGNAL_DETECT_EN BIT(2)
|
|
#define INVERT_SIGNAL_DETECT BIT(3)
|
|
#define AUTODET_EN BIT(4)
|
|
#define SGMII_MASTER_MODE BIT(5)
|
|
#define DISABLE_DLL_PWRDOWN BIT(6)
|
|
#define CRC_CHECKER_DIS BIT(7)
|
|
#define COMMA_DET_EN BIT(8)
|
|
#define ZERO_COMMA_DET_EN BIT(9)
|
|
#define REMOTE_LOOPBACK BIT(10)
|
|
#define SEL_RX_PKTS_FOR_CNTR BIT(11)
|
|
#define MASTER_MDIO_PHY_SEL BIT(13)
|
|
#define DISABLE_SIGNAL_DETECT_FLT BIT(14)
|
|
|
|
/* SERDES_DIGITAL_CONTROL2 */
|
|
#define EN_PARALLEL_DET BIT(0)
|
|
#define DIS_FALSE_LINK BIT(1)
|
|
#define FLT_FORCE_LINK BIT(2)
|
|
#define EN_AUTONEG_ERR_TIMER BIT(3)
|
|
#define DIS_REMOTE_FAULT_SENSING BIT(4)
|
|
#define FORCE_XMIT_DATA BIT(5)
|
|
#define AUTONEG_FAST_TIMERS BIT(6)
|
|
#define DIS_CARRIER_EXTEND BIT(7)
|
|
#define DIS_TRRR_GENERATION BIT(8)
|
|
#define BYPASS_PCS_RX BIT(9)
|
|
#define BYPASS_PCS_TX BIT(10)
|
|
#define TEST_CNTR_EN BIT(11)
|
|
#define TX_PACKET_SEQ_TEST BIT(12)
|
|
#define TX_IDLE_JAM_SEQ_TEST BIT(13)
|
|
#define CLR_BER_CNTR BIT(14)
|
|
|
|
/* SERDES_DIGITAL_CONTROL3 */
|
|
#define TX_FIFO_RST BIT(0)
|
|
#define FIFO_ELAST_TX_RX_SHIFT 1
|
|
#define FIFO_ELAST_TX_RX_5K 0
|
|
#define FIFO_ELAST_TX_RX_10K 1
|
|
#define FIFO_ELAST_TX_RX_13_5K 2
|
|
#define FIFO_ELAST_TX_RX_18_5K 3
|
|
#define BLOCK_TXEN_MODE BIT(9)
|
|
#define JAM_FALSE_CARRIER_MODE BIT(10)
|
|
#define EXT_PHY_CRS_MODE BIT(11)
|
|
#define INVERT_EXT_PHY_CRS BIT(12)
|
|
#define DISABLE_TX_CRS BIT(13)
|
|
|
|
/* SERDES_DIGITAL_STATUS */
|
|
#define SGMII_MODE BIT(0)
|
|
#define LINK_STATUS BIT(1)
|
|
#define DUPLEX_STATUS BIT(2)
|
|
#define SPEED_STATUS_SHIFT 3
|
|
#define SPEED_STATUS_10 0
|
|
#define SPEED_STATUS_100 1
|
|
#define SPEED_STATUS_1000 2
|
|
#define SPEED_STATUS_2500 3
|
|
#define SPEED_STATUS_MASK SPEED_STATUS_2500
|
|
#define PAUSE_RESOLUTION_TX_SIDE BIT(5)
|
|
#define PAUSE_RESOLUTION_RX_SIDE BIT(6)
|
|
#define LINK_STATUS_CHANGE BIT(7)
|
|
#define EARLY_END_EXT_DET BIT(8)
|
|
#define CARRIER_EXT_ERR_DET BIT(9)
|
|
#define RX_ERR_DET BIT(10)
|
|
#define TX_ERR_DET BIT(11)
|
|
#define CRC_ERR_DET BIT(12)
|
|
#define FALSE_CARRIER_ERR_DET BIT(13)
|
|
#define RXFIFO_ERR_DET BIT(14)
|
|
#define TXFIFO_ERR_DET BIT(15)
|
|
|
|
/* Block offsets */
|
|
#define SERDES_DIGITAL_BLK 0x8300
|
|
#define SERDES_ID0 0x8310
|
|
#define SERDES_MII_BLK 0xffe0
|
|
#define SERDES_XGXSBLK0_BLOCKADDRESS 0xffd0
|
|
|
|
struct phylink_link_state;
|
|
|
|
static inline u8 b53_serdes_map_lane(struct b53_device *dev, int port)
|
|
{
|
|
if (!dev->ops->serdes_map_lane)
|
|
return B53_INVALID_LANE;
|
|
|
|
return dev->ops->serdes_map_lane(dev, port);
|
|
}
|
|
|
|
int b53_serdes_get_link(struct b53_device *dev, int port);
|
|
int b53_serdes_link_state(struct b53_device *dev, int port,
|
|
struct phylink_link_state *state);
|
|
void b53_serdes_config(struct b53_device *dev, int port, unsigned int mode,
|
|
const struct phylink_link_state *state);
|
|
void b53_serdes_an_restart(struct b53_device *dev, int port);
|
|
void b53_serdes_link_set(struct b53_device *dev, int port, unsigned int mode,
|
|
phy_interface_t interface, bool link_up);
|
|
void b53_serdes_phylink_validate(struct b53_device *dev, int port,
|
|
unsigned long *supported,
|
|
struct phylink_link_state *state);
|
|
#if IS_ENABLED(CONFIG_B53_SERDES)
|
|
int b53_serdes_init(struct b53_device *dev, int port);
|
|
#else
|
|
static inline int b53_serdes_init(struct b53_device *dev, int port)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
#endif
|