1186623f4SDavid Yang /* SPDX-License-Identifier: GPL-2.0-or-later */ 2186623f4SDavid Yang /* 3186623f4SDavid Yang * Copyright (c) 2025 David Yang 4186623f4SDavid Yang */ 5186623f4SDavid Yang 6186623f4SDavid Yang #ifndef __YT921X_H 7186623f4SDavid Yang #define __YT921X_H 8186623f4SDavid Yang 9186623f4SDavid Yang #include <net/dsa.h> 10186623f4SDavid Yang 11186623f4SDavid Yang #define YT921X_SMI_SWITCHID_M GENMASK(3, 2) 12186623f4SDavid Yang #define YT921X_SMI_SWITCHID(x) FIELD_PREP(YT921X_SMI_SWITCHID_M, (x)) 13186623f4SDavid Yang #define YT921X_SMI_AD BIT(1) 14186623f4SDavid Yang #define YT921X_SMI_ADDR 0 15186623f4SDavid Yang #define YT921X_SMI_DATA YT921X_SMI_AD 16186623f4SDavid Yang #define YT921X_SMI_RW BIT(0) 17186623f4SDavid Yang #define YT921X_SMI_WRITE 0 18186623f4SDavid Yang #define YT921X_SMI_READ YT921X_SMI_RW 19186623f4SDavid Yang 20186623f4SDavid Yang #define YT921X_SWITCHID_NUM 4 21186623f4SDavid Yang 22186623f4SDavid Yang #define YT921X_RST 0x80000 23186623f4SDavid Yang #define YT921X_RST_HW BIT(31) 24186623f4SDavid Yang #define YT921X_RST_SW BIT(1) 25186623f4SDavid Yang #define YT921X_FUNC 0x80004 26186623f4SDavid Yang #define YT921X_FUNC_MIB BIT(1) 27186623f4SDavid Yang #define YT921X_CHIP_ID 0x80008 28186623f4SDavid Yang #define YT921X_CHIP_ID_MAJOR GENMASK(31, 16) 29186623f4SDavid Yang #define YT921X_EXT_CPU_PORT 0x8000c 30186623f4SDavid Yang #define YT921X_EXT_CPU_PORT_TAG_EN BIT(15) 31186623f4SDavid Yang #define YT921X_EXT_CPU_PORT_PORT_EN BIT(14) 32186623f4SDavid Yang #define YT921X_EXT_CPU_PORT_PORT_M GENMASK(3, 0) 33186623f4SDavid Yang #define YT921X_EXT_CPU_PORT_PORT(x) FIELD_PREP(YT921X_EXT_CPU_PORT_PORT_M, (x)) 34186623f4SDavid Yang #define YT921X_CPU_TAG_TPID 0x80010 35186623f4SDavid Yang #define YT921X_CPU_TAG_TPID_TPID_M GENMASK(15, 0) 36186623f4SDavid Yang /* Same as ETH_P_YT921X, but this represents the true HW default, while the 37186623f4SDavid Yang * former is a local convention chosen by us. 38186623f4SDavid Yang */ 39186623f4SDavid Yang #define YT921X_CPU_TAG_TPID_TPID_DEFAULT 0x9988 40186623f4SDavid Yang #define YT921X_PVID_SEL 0x80014 41186623f4SDavid Yang #define YT921X_PVID_SEL_SVID_PORTn(port) BIT(port) 42186623f4SDavid Yang #define YT921X_SERDES_CTRL 0x80028 43186623f4SDavid Yang #define YT921X_SERDES_CTRL_PORTn_TEST(port) BIT((port) - 3) 44186623f4SDavid Yang #define YT921X_SERDES_CTRL_PORTn(port) BIT((port) - 8) 45186623f4SDavid Yang #define YT921X_IO_LEVEL 0x80030 46186623f4SDavid Yang #define YT9215_IO_LEVEL_NORMAL_M GENMASK(5, 4) 47186623f4SDavid Yang #define YT9215_IO_LEVEL_NORMAL(x) FIELD_PREP(YT9215_IO_LEVEL_NORMAL_M, (x)) 48186623f4SDavid Yang #define YT9215_IO_LEVEL_NORMAL_3V3 YT9215_IO_LEVEL_NORMAL(0) 49186623f4SDavid Yang #define YT9215_IO_LEVEL_NORMAL_1V8 YT9215_IO_LEVEL_NORMAL(3) 50186623f4SDavid Yang #define YT9215_IO_LEVEL_RGMII1_M GENMASK(3, 2) 51186623f4SDavid Yang #define YT9215_IO_LEVEL_RGMII1(x) FIELD_PREP(YT9215_IO_LEVEL_RGMII1_M, (x)) 52186623f4SDavid Yang #define YT9215_IO_LEVEL_RGMII1_3V3 YT9215_IO_LEVEL_RGMII1(0) 53186623f4SDavid Yang #define YT9215_IO_LEVEL_RGMII1_2V5 YT9215_IO_LEVEL_RGMII1(1) 54186623f4SDavid Yang #define YT9215_IO_LEVEL_RGMII1_1V8 YT9215_IO_LEVEL_RGMII1(2) 55186623f4SDavid Yang #define YT9215_IO_LEVEL_RGMII0_M GENMASK(1, 0) 56186623f4SDavid Yang #define YT9215_IO_LEVEL_RGMII0(x) FIELD_PREP(YT9215_IO_LEVEL_RGMII0_M, (x)) 57186623f4SDavid Yang #define YT9215_IO_LEVEL_RGMII0_3V3 YT9215_IO_LEVEL_RGMII0(0) 58186623f4SDavid Yang #define YT9215_IO_LEVEL_RGMII0_2V5 YT9215_IO_LEVEL_RGMII0(1) 59186623f4SDavid Yang #define YT9215_IO_LEVEL_RGMII0_1V8 YT9215_IO_LEVEL_RGMII0(2) 60186623f4SDavid Yang #define YT9218_IO_LEVEL_RGMII1_M GENMASK(5, 4) 61186623f4SDavid Yang #define YT9218_IO_LEVEL_RGMII1(x) FIELD_PREP(YT9218_IO_LEVEL_RGMII1_M, (x)) 62186623f4SDavid Yang #define YT9218_IO_LEVEL_RGMII1_3V3 YT9218_IO_LEVEL_RGMII1(0) 63186623f4SDavid Yang #define YT9218_IO_LEVEL_RGMII1_2V5 YT9218_IO_LEVEL_RGMII1(1) 64186623f4SDavid Yang #define YT9218_IO_LEVEL_RGMII1_1V8 YT9218_IO_LEVEL_RGMII1(2) 65186623f4SDavid Yang #define YT9218_IO_LEVEL_RGMII0_M GENMASK(3, 2) 66186623f4SDavid Yang #define YT9218_IO_LEVEL_RGMII0(x) FIELD_PREP(YT9218_IO_LEVEL_RGMII0_M, (x)) 67186623f4SDavid Yang #define YT9218_IO_LEVEL_RGMII0_3V3 YT9218_IO_LEVEL_RGMII0(0) 68186623f4SDavid Yang #define YT9218_IO_LEVEL_RGMII0_2V5 YT9218_IO_LEVEL_RGMII0(1) 69186623f4SDavid Yang #define YT9218_IO_LEVEL_RGMII0_1V8 YT9218_IO_LEVEL_RGMII0(2) 70186623f4SDavid Yang #define YT9218_IO_LEVEL_NORMAL_M GENMASK(1, 0) 71186623f4SDavid Yang #define YT9218_IO_LEVEL_NORMAL(x) FIELD_PREP(YT9218_IO_LEVEL_NORMAL_M, (x)) 72186623f4SDavid Yang #define YT9218_IO_LEVEL_NORMAL_3V3 YT9218_IO_LEVEL_NORMAL(0) 73186623f4SDavid Yang #define YT9218_IO_LEVEL_NORMAL_1V8 YT9218_IO_LEVEL_NORMAL(3) 74186623f4SDavid Yang #define YT921X_MAC_ADDR_HI2 0x80080 75186623f4SDavid Yang #define YT921X_MAC_ADDR_LO4 0x80084 76186623f4SDavid Yang #define YT921X_SERDESn(port) (0x8008c + 4 * ((port) - 8)) 77186623f4SDavid Yang #define YT921X_SERDES_MODE_M GENMASK(9, 7) 78186623f4SDavid Yang #define YT921X_SERDES_MODE(x) FIELD_PREP(YT921X_SERDES_MODE_M, (x)) 79186623f4SDavid Yang #define YT921X_SERDES_MODE_SGMII YT921X_SERDES_MODE(0) 80186623f4SDavid Yang #define YT921X_SERDES_MODE_REVSGMII YT921X_SERDES_MODE(1) 81186623f4SDavid Yang #define YT921X_SERDES_MODE_1000BASEX YT921X_SERDES_MODE(2) 82186623f4SDavid Yang #define YT921X_SERDES_MODE_100BASEX YT921X_SERDES_MODE(3) 83186623f4SDavid Yang #define YT921X_SERDES_MODE_2500BASEX YT921X_SERDES_MODE(4) 84186623f4SDavid Yang #define YT921X_SERDES_RX_PAUSE BIT(6) 85186623f4SDavid Yang #define YT921X_SERDES_TX_PAUSE BIT(5) 86186623f4SDavid Yang #define YT921X_SERDES_LINK BIT(4) /* force link */ 87186623f4SDavid Yang #define YT921X_SERDES_DUPLEX_FULL BIT(3) 88186623f4SDavid Yang #define YT921X_SERDES_SPEED_M GENMASK(2, 0) 89186623f4SDavid Yang #define YT921X_SERDES_SPEED(x) FIELD_PREP(YT921X_SERDES_SPEED_M, (x)) 90186623f4SDavid Yang #define YT921X_SERDES_SPEED_10 YT921X_SERDES_SPEED(0) 91186623f4SDavid Yang #define YT921X_SERDES_SPEED_100 YT921X_SERDES_SPEED(1) 92186623f4SDavid Yang #define YT921X_SERDES_SPEED_1000 YT921X_SERDES_SPEED(2) 93186623f4SDavid Yang #define YT921X_SERDES_SPEED_10000 YT921X_SERDES_SPEED(3) 94186623f4SDavid Yang #define YT921X_SERDES_SPEED_2500 YT921X_SERDES_SPEED(4) 95186623f4SDavid Yang #define YT921X_PORTn_CTRL(port) (0x80100 + 4 * (port)) 96186623f4SDavid Yang #define YT921X_PORT_CTRL_PAUSE_AN BIT(10) 97186623f4SDavid Yang #define YT921X_PORTn_STATUS(port) (0x80200 + 4 * (port)) 98186623f4SDavid Yang #define YT921X_PORT_LINK BIT(9) /* CTRL: auto negotiation */ 99186623f4SDavid Yang #define YT921X_PORT_HALF_PAUSE BIT(8) /* Half-duplex back pressure mode */ 100186623f4SDavid Yang #define YT921X_PORT_DUPLEX_FULL BIT(7) 101186623f4SDavid Yang #define YT921X_PORT_RX_PAUSE BIT(6) 102186623f4SDavid Yang #define YT921X_PORT_TX_PAUSE BIT(5) 103186623f4SDavid Yang #define YT921X_PORT_RX_MAC_EN BIT(4) 104186623f4SDavid Yang #define YT921X_PORT_TX_MAC_EN BIT(3) 105186623f4SDavid Yang #define YT921X_PORT_SPEED_M GENMASK(2, 0) 106186623f4SDavid Yang #define YT921X_PORT_SPEED(x) FIELD_PREP(YT921X_PORT_SPEED_M, (x)) 107186623f4SDavid Yang #define YT921X_PORT_SPEED_10 YT921X_PORT_SPEED(0) 108186623f4SDavid Yang #define YT921X_PORT_SPEED_100 YT921X_PORT_SPEED(1) 109186623f4SDavid Yang #define YT921X_PORT_SPEED_1000 YT921X_PORT_SPEED(2) 110186623f4SDavid Yang #define YT921X_PORT_SPEED_10000 YT921X_PORT_SPEED(3) 111186623f4SDavid Yang #define YT921X_PORT_SPEED_2500 YT921X_PORT_SPEED(4) 112186623f4SDavid Yang #define YT921X_PON_STRAP_FUNC 0x80320 113186623f4SDavid Yang #define YT921X_PON_STRAP_VAL 0x80324 114186623f4SDavid Yang #define YT921X_PON_STRAP_CAP 0x80328 115186623f4SDavid Yang #define YT921X_PON_STRAP_EEE BIT(16) 116186623f4SDavid Yang #define YT921X_PON_STRAP_LOOP_DETECT BIT(7) 117186623f4SDavid Yang #define YT921X_MDIO_POLLINGn(port) (0x80364 + 4 * ((port) - 8)) 118186623f4SDavid Yang #define YT921X_MDIO_POLLING_DUPLEX_FULL BIT(4) 119186623f4SDavid Yang #define YT921X_MDIO_POLLING_LINK BIT(3) 120186623f4SDavid Yang #define YT921X_MDIO_POLLING_SPEED_M GENMASK(2, 0) 121186623f4SDavid Yang #define YT921X_MDIO_POLLING_SPEED(x) FIELD_PREP(YT921X_MDIO_POLLING_SPEED_M, (x)) 122186623f4SDavid Yang #define YT921X_MDIO_POLLING_SPEED_10 YT921X_MDIO_POLLING_SPEED(0) 123186623f4SDavid Yang #define YT921X_MDIO_POLLING_SPEED_100 YT921X_MDIO_POLLING_SPEED(1) 124186623f4SDavid Yang #define YT921X_MDIO_POLLING_SPEED_1000 YT921X_MDIO_POLLING_SPEED(2) 125186623f4SDavid Yang #define YT921X_MDIO_POLLING_SPEED_10000 YT921X_MDIO_POLLING_SPEED(3) 126186623f4SDavid Yang #define YT921X_MDIO_POLLING_SPEED_2500 YT921X_MDIO_POLLING_SPEED(4) 127186623f4SDavid Yang #define YT921X_SENSOR 0x8036c 128186623f4SDavid Yang #define YT921X_SENSOR_TEMP BIT(18) 129186623f4SDavid Yang #define YT921X_TEMP 0x80374 130186623f4SDavid Yang #define YT921X_CHIP_MODE 0x80388 131186623f4SDavid Yang #define YT921X_CHIP_MODE_MODE GENMASK(1, 0) 132186623f4SDavid Yang #define YT921X_XMII_CTRL 0x80394 133186623f4SDavid Yang #define YT921X_XMII_CTRL_PORTn(port) BIT(9 - (port)) /* Yes, it's reversed */ 134186623f4SDavid Yang #define YT921X_XMIIn(port) (0x80400 + 8 * ((port) - 8)) 135186623f4SDavid Yang #define YT921X_XMII_MODE_M GENMASK(31, 29) 136186623f4SDavid Yang #define YT921X_XMII_MODE(x) FIELD_PREP(YT921X_XMII_MODE_M, (x)) 137186623f4SDavid Yang #define YT921X_XMII_MODE_MII YT921X_XMII_MODE(0) 138186623f4SDavid Yang #define YT921X_XMII_MODE_REVMII YT921X_XMII_MODE(1) 139186623f4SDavid Yang #define YT921X_XMII_MODE_RMII YT921X_XMII_MODE(2) 140186623f4SDavid Yang #define YT921X_XMII_MODE_REVRMII YT921X_XMII_MODE(3) 141186623f4SDavid Yang #define YT921X_XMII_MODE_RGMII YT921X_XMII_MODE(4) 142186623f4SDavid Yang #define YT921X_XMII_MODE_DISABLE YT921X_XMII_MODE(5) 143186623f4SDavid Yang #define YT921X_XMII_LINK BIT(19) /* force link */ 144186623f4SDavid Yang #define YT921X_XMII_EN BIT(18) 145186623f4SDavid Yang #define YT921X_XMII_SOFT_RST BIT(17) 146186623f4SDavid Yang #define YT921X_XMII_RGMII_TX_DELAY_150PS_M GENMASK(16, 13) 147186623f4SDavid Yang #define YT921X_XMII_RGMII_TX_DELAY_150PS(x) FIELD_PREP(YT921X_XMII_RGMII_TX_DELAY_150PS_M, (x)) 148186623f4SDavid Yang #define YT921X_XMII_TX_CLK_IN BIT(11) 149186623f4SDavid Yang #define YT921X_XMII_RX_CLK_IN BIT(10) 150186623f4SDavid Yang #define YT921X_XMII_RGMII_TX_DELAY_2NS BIT(8) 151186623f4SDavid Yang #define YT921X_XMII_RGMII_TX_CLK_OUT BIT(7) 152186623f4SDavid Yang #define YT921X_XMII_RGMII_RX_DELAY_150PS_M GENMASK(6, 3) 153186623f4SDavid Yang #define YT921X_XMII_RGMII_RX_DELAY_150PS(x) FIELD_PREP(YT921X_XMII_RGMII_RX_DELAY_150PS_M, (x)) 154186623f4SDavid Yang #define YT921X_XMII_RMII_PHY_TX_CLK_OUT BIT(2) 155186623f4SDavid Yang #define YT921X_XMII_REVMII_TX_CLK_OUT BIT(1) 156186623f4SDavid Yang #define YT921X_XMII_REVMII_RX_CLK_OUT BIT(0) 157186623f4SDavid Yang 158186623f4SDavid Yang #define YT921X_MACn_FRAME(port) (0x81008 + 0x1000 * (port)) 159186623f4SDavid Yang #define YT921X_MAC_FRAME_SIZE_M GENMASK(21, 8) 160186623f4SDavid Yang #define YT921X_MAC_FRAME_SIZE(x) FIELD_PREP(YT921X_MAC_FRAME_SIZE_M, (x)) 161186623f4SDavid Yang 162186623f4SDavid Yang #define YT921X_EEEn_VAL(port) (0xa0000 + 0x40 * (port)) 163186623f4SDavid Yang #define YT921X_EEE_VAL_DATA BIT(1) 164186623f4SDavid Yang 165186623f4SDavid Yang #define YT921X_EEE_CTRL 0xb0000 166186623f4SDavid Yang #define YT921X_EEE_CTRL_ENn(port) BIT(port) 167186623f4SDavid Yang 168186623f4SDavid Yang #define YT921X_MIB_CTRL 0xc0004 169186623f4SDavid Yang #define YT921X_MIB_CTRL_CLEAN BIT(30) 170186623f4SDavid Yang #define YT921X_MIB_CTRL_PORT_M GENMASK(6, 3) 171186623f4SDavid Yang #define YT921X_MIB_CTRL_PORT(x) FIELD_PREP(YT921X_MIB_CTRL_PORT_M, (x)) 172186623f4SDavid Yang #define YT921X_MIB_CTRL_ONE_PORT BIT(1) 173186623f4SDavid Yang #define YT921X_MIB_CTRL_ALL_PORT BIT(0) 174186623f4SDavid Yang #define YT921X_MIBn_DATA0(port) (0xc0100 + 0x100 * (port)) 175186623f4SDavid Yang #define YT921X_MIBn_DATAm(port, x) (YT921X_MIBn_DATA0(port) + 4 * (x)) 176fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_BROADCAST 0x00 177fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_PAUSE 0x04 178fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_MULTICAST 0x08 179fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_CRC_ERR 0x0c 180fbce7b36SDavid Yang 181fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_ALIGN_ERR 0x10 182fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_UNDERSIZE_ERR 0x14 183fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_FRAG_ERR 0x18 184fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_PKT_SZ_64 0x1c 185fbce7b36SDavid Yang 186fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_PKT_SZ_65_TO_127 0x20 187fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_PKT_SZ_128_TO_255 0x24 188fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_PKT_SZ_256_TO_511 0x28 189fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_PKT_SZ_512_TO_1023 0x2c 190fbce7b36SDavid Yang 191fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_PKT_SZ_1024_TO_1518 0x30 192fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_PKT_SZ_1519_TO_MAX 0x34 193fbce7b36SDavid Yang /* 0x38: unused */ 194fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_GOOD_BYTES 0x3c 195fbce7b36SDavid Yang 196fbce7b36SDavid Yang /* 0x40: 64 bytes */ 197fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_BAD_BYTES 0x44 198fbce7b36SDavid Yang /* 0x48: 64 bytes */ 199fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_OVERSIZE_ERR 0x4c 200fbce7b36SDavid Yang 201fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_DROPPED 0x50 202fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_BROADCAST 0x54 203fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_PAUSE 0x58 204fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_MULTICAST 0x5c 205fbce7b36SDavid Yang 206fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_UNDERSIZE_ERR 0x60 207fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_PKT_SZ_64 0x64 208fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127 0x68 209fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255 0x6c 210fbce7b36SDavid Yang 211fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_PKT_SZ_256_TO_511 0x70 212fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_PKT_SZ_512_TO_1023 0x74 213fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_PKT_SZ_1024_TO_1518 0x78 214fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_PKT_SZ_1519_TO_MAX 0x7c 215fbce7b36SDavid Yang 216fbce7b36SDavid Yang /* 0x80: unused */ 217fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_GOOD_BYTES 0x84 218fbce7b36SDavid Yang /* 0x88: 64 bytes */ 219fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_COLLISION 0x8c 220fbce7b36SDavid Yang 221fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_EXCESSIVE_COLLISION 0x90 222fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_MULTIPLE_COLLISION 0x94 223fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_SINGLE_COLLISION 0x98 224fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_PKT 0x9c 225fbce7b36SDavid Yang 226fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_DEFERRED 0xa0 227fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_LATE_COLLISION 0xa4 228fbce7b36SDavid Yang #define YT921X_MIB_DATA_RX_OAM 0xa8 229fbce7b36SDavid Yang #define YT921X_MIB_DATA_TX_OAM 0xac 230186623f4SDavid Yang 231186623f4SDavid Yang #define YT921X_EDATA_CTRL 0xe0000 232186623f4SDavid Yang #define YT921X_EDATA_CTRL_ADDR_M GENMASK(15, 8) 233186623f4SDavid Yang #define YT921X_EDATA_CTRL_ADDR(x) FIELD_PREP(YT921X_EDATA_CTRL_ADDR_M, (x)) 234186623f4SDavid Yang #define YT921X_EDATA_CTRL_OP_M GENMASK(3, 0) 235186623f4SDavid Yang #define YT921X_EDATA_CTRL_OP(x) FIELD_PREP(YT921X_EDATA_CTRL_OP_M, (x)) 236186623f4SDavid Yang #define YT921X_EDATA_CTRL_READ YT921X_EDATA_CTRL_OP(5) 237186623f4SDavid Yang #define YT921X_EDATA_DATA 0xe0004 238186623f4SDavid Yang #define YT921X_EDATA_DATA_DATA_M GENMASK(31, 24) 239186623f4SDavid Yang #define YT921X_EDATA_DATA_STATUS_M GENMASK(3, 0) 240186623f4SDavid Yang #define YT921X_EDATA_DATA_STATUS(x) FIELD_PREP(YT921X_EDATA_DATA_STATUS_M, (x)) 241186623f4SDavid Yang #define YT921X_EDATA_DATA_IDLE YT921X_EDATA_DATA_STATUS(3) 242186623f4SDavid Yang 243186623f4SDavid Yang #define YT921X_EXT_MBUS_OP 0x6a000 244186623f4SDavid Yang #define YT921X_INT_MBUS_OP 0xf0000 245186623f4SDavid Yang #define YT921X_MBUS_OP_START BIT(0) 246186623f4SDavid Yang #define YT921X_EXT_MBUS_CTRL 0x6a004 247186623f4SDavid Yang #define YT921X_INT_MBUS_CTRL 0xf0004 248186623f4SDavid Yang #define YT921X_MBUS_CTRL_PORT_M GENMASK(25, 21) 249186623f4SDavid Yang #define YT921X_MBUS_CTRL_PORT(x) FIELD_PREP(YT921X_MBUS_CTRL_PORT_M, (x)) 250186623f4SDavid Yang #define YT921X_MBUS_CTRL_REG_M GENMASK(20, 16) 251186623f4SDavid Yang #define YT921X_MBUS_CTRL_REG(x) FIELD_PREP(YT921X_MBUS_CTRL_REG_M, (x)) 252186623f4SDavid Yang #define YT921X_MBUS_CTRL_TYPE_M GENMASK(11, 8) /* wild guess */ 253186623f4SDavid Yang #define YT921X_MBUS_CTRL_TYPE(x) FIELD_PREP(YT921X_MBUS_CTRL_TYPE_M, (x)) 254186623f4SDavid Yang #define YT921X_MBUS_CTRL_TYPE_C22 YT921X_MBUS_CTRL_TYPE(4) 255186623f4SDavid Yang #define YT921X_MBUS_CTRL_OP_M GENMASK(3, 2) /* wild guess */ 256186623f4SDavid Yang #define YT921X_MBUS_CTRL_OP(x) FIELD_PREP(YT921X_MBUS_CTRL_OP_M, (x)) 257186623f4SDavid Yang #define YT921X_MBUS_CTRL_WRITE YT921X_MBUS_CTRL_OP(1) 258186623f4SDavid Yang #define YT921X_MBUS_CTRL_READ YT921X_MBUS_CTRL_OP(2) 259186623f4SDavid Yang #define YT921X_EXT_MBUS_DOUT 0x6a008 260186623f4SDavid Yang #define YT921X_INT_MBUS_DOUT 0xf0008 261186623f4SDavid Yang #define YT921X_EXT_MBUS_DIN 0x6a00c 262186623f4SDavid Yang #define YT921X_INT_MBUS_DIN 0xf000c 263186623f4SDavid Yang 264186623f4SDavid Yang #define YT921X_PORTn_EGR(port) (0x100000 + 4 * (port)) 265186623f4SDavid Yang #define YT921X_PORT_EGR_TPID_CTAG_M GENMASK(5, 4) 266186623f4SDavid Yang #define YT921X_PORT_EGR_TPID_CTAG(x) FIELD_PREP(YT921X_PORT_EGR_TPID_CTAG_M, (x)) 267186623f4SDavid Yang #define YT921X_PORT_EGR_TPID_STAG_M GENMASK(3, 2) 268186623f4SDavid Yang #define YT921X_PORT_EGR_TPID_STAG(x) FIELD_PREP(YT921X_PORT_EGR_TPID_STAG_M, (x)) 269186623f4SDavid Yang #define YT921X_TPID_EGRn(x) (0x100300 + 4 * (x)) /* [0, 3] */ 270186623f4SDavid Yang #define YT921X_TPID_EGR_TPID_M GENMASK(15, 0) 271186623f4SDavid Yang 272186623f4SDavid Yang #define YT921X_VLAN_IGR_FILTER 0x180280 273186623f4SDavid Yang #define YT921X_VLAN_IGR_FILTER_PORTn_BYPASS_IGMP(port) BIT((port) + 11) 274186623f4SDavid Yang #define YT921X_VLAN_IGR_FILTER_PORTn(port) BIT(port) 275186623f4SDavid Yang #define YT921X_PORTn_ISOLATION(port) (0x180294 + 4 * (port)) 276186623f4SDavid Yang #define YT921X_PORT_ISOLATION_BLOCKn(port) BIT(port) 277*633b1d01SDavid Yang #define YT921X_STPn(n) (0x18038c + 4 * (n)) 278*633b1d01SDavid Yang #define YT921X_STP_PORTn_M(port) GENMASK(2 * (port) + 1, 2 * (port)) 279*633b1d01SDavid Yang #define YT921X_STP_PORTn(port, x) ((x) << (2 * (port))) 280*633b1d01SDavid Yang #define YT921X_STP_PORTn_DISABLED(port) YT921X_STP_PORTn(port, 0) 281*633b1d01SDavid Yang #define YT921X_STP_PORTn_LEARNING(port) YT921X_STP_PORTn(port, 1) 282*633b1d01SDavid Yang #define YT921X_STP_PORTn_BLOCKING(port) YT921X_STP_PORTn(port, 2) 283*633b1d01SDavid Yang #define YT921X_STP_PORTn_FORWARD(port) YT921X_STP_PORTn(port, 3) 284186623f4SDavid Yang #define YT921X_PORTn_LEARN(port) (0x1803d0 + 4 * (port)) 285186623f4SDavid Yang #define YT921X_PORT_LEARN_VID_LEARN_MULTI_EN BIT(22) 286186623f4SDavid Yang #define YT921X_PORT_LEARN_VID_LEARN_MODE BIT(21) 287186623f4SDavid Yang #define YT921X_PORT_LEARN_VID_LEARN_EN BIT(20) 288186623f4SDavid Yang #define YT921X_PORT_LEARN_SUSPEND_COPY_EN BIT(19) 289186623f4SDavid Yang #define YT921X_PORT_LEARN_SUSPEND_DROP_EN BIT(18) 290186623f4SDavid Yang #define YT921X_PORT_LEARN_DIS BIT(17) 291186623f4SDavid Yang #define YT921X_PORT_LEARN_LIMIT_EN BIT(16) 292186623f4SDavid Yang #define YT921X_PORT_LEARN_LIMIT_M GENMASK(15, 8) 293186623f4SDavid Yang #define YT921X_PORT_LEARN_LIMIT(x) FIELD_PREP(YT921X_PORT_LEARN_LIMIT_M, (x)) 294186623f4SDavid Yang #define YT921X_PORT_LEARN_DROP_ON_EXCEEDED BIT(2) 295186623f4SDavid Yang #define YT921X_PORT_LEARN_MODE_M GENMASK(1, 0) 296186623f4SDavid Yang #define YT921X_PORT_LEARN_MODE(x) FIELD_PREP(YT921X_PORT_LEARN_MODE_M, (x)) 297186623f4SDavid Yang #define YT921X_PORT_LEARN_MODE_AUTO YT921X_PORT_LEARN_MODE(0) 298186623f4SDavid Yang #define YT921X_PORT_LEARN_MODE_AUTO_AND_COPY YT921X_PORT_LEARN_MODE(1) 299186623f4SDavid Yang #define YT921X_PORT_LEARN_MODE_CPU_CONTROL YT921X_PORT_LEARN_MODE(2) 300186623f4SDavid Yang #define YT921X_AGEING 0x180440 301186623f4SDavid Yang #define YT921X_AGEING_INTERVAL_M GENMASK(15, 0) 302186623f4SDavid Yang #define YT921X_FDB_IN0 0x180454 303186623f4SDavid Yang #define YT921X_FDB_IN1 0x180458 304186623f4SDavid Yang #define YT921X_FDB_IN2 0x18045c 305186623f4SDavid Yang #define YT921X_FDB_OP 0x180460 306186623f4SDavid Yang #define YT921X_FDB_OP_INDEX_M GENMASK(22, 11) 307186623f4SDavid Yang #define YT921X_FDB_OP_INDEX(x) FIELD_PREP(YT921X_FDB_OP_INDEX_M, (x)) 308186623f4SDavid Yang #define YT921X_FDB_OP_MODE_INDEX BIT(10) /* mac+fid / index */ 309186623f4SDavid Yang #define YT921X_FDB_OP_FLUSH_MCAST BIT(9) /* ucast / mcast */ 310186623f4SDavid Yang #define YT921X_FDB_OP_FLUSH_M GENMASK(8, 7) 311186623f4SDavid Yang #define YT921X_FDB_OP_FLUSH(x) FIELD_PREP(YT921X_FDB_OP_FLUSH_M, (x)) 312186623f4SDavid Yang #define YT921X_FDB_OP_FLUSH_ALL YT921X_FDB_OP_FLUSH(0) 313186623f4SDavid Yang #define YT921X_FDB_OP_FLUSH_PORT YT921X_FDB_OP_FLUSH(1) 314186623f4SDavid Yang #define YT921X_FDB_OP_FLUSH_PORT_VID YT921X_FDB_OP_FLUSH(2) 315186623f4SDavid Yang #define YT921X_FDB_OP_FLUSH_VID YT921X_FDB_OP_FLUSH(3) 316186623f4SDavid Yang #define YT921X_FDB_OP_FLUSH_STATIC BIT(6) 317186623f4SDavid Yang #define YT921X_FDB_OP_NEXT_TYPE_M GENMASK(5, 4) 318186623f4SDavid Yang #define YT921X_FDB_OP_NEXT_TYPE(x) FIELD_PREP(YT921X_FDB_OP_NEXT_TYPE_M, (x)) 319186623f4SDavid Yang #define YT921X_FDB_OP_NEXT_TYPE_UCAST_PORT YT921X_FDB_OP_NEXT_TYPE(0) 320186623f4SDavid Yang #define YT921X_FDB_OP_NEXT_TYPE_UCAST_VID YT921X_FDB_OP_NEXT_TYPE(1) 321186623f4SDavid Yang #define YT921X_FDB_OP_NEXT_TYPE_UCAST YT921X_FDB_OP_NEXT_TYPE(2) 322186623f4SDavid Yang #define YT921X_FDB_OP_NEXT_TYPE_MCAST YT921X_FDB_OP_NEXT_TYPE(3) 323186623f4SDavid Yang #define YT921X_FDB_OP_OP_M GENMASK(3, 1) 324186623f4SDavid Yang #define YT921X_FDB_OP_OP(x) FIELD_PREP(YT921X_FDB_OP_OP_M, (x)) 325186623f4SDavid Yang #define YT921X_FDB_OP_OP_ADD YT921X_FDB_OP_OP(0) 326186623f4SDavid Yang #define YT921X_FDB_OP_OP_DEL YT921X_FDB_OP_OP(1) 327186623f4SDavid Yang #define YT921X_FDB_OP_OP_GET_ONE YT921X_FDB_OP_OP(2) 328186623f4SDavid Yang #define YT921X_FDB_OP_OP_GET_NEXT YT921X_FDB_OP_OP(3) 329186623f4SDavid Yang #define YT921X_FDB_OP_OP_FLUSH YT921X_FDB_OP_OP(4) 330186623f4SDavid Yang #define YT921X_FDB_OP_START BIT(0) 331186623f4SDavid Yang #define YT921X_FDB_RESULT 0x180464 332186623f4SDavid Yang #define YT921X_FDB_RESULT_DONE BIT(15) 333186623f4SDavid Yang #define YT921X_FDB_RESULT_NOTFOUND BIT(14) 334186623f4SDavid Yang #define YT921X_FDB_RESULT_OVERWRITED BIT(13) 335186623f4SDavid Yang #define YT921X_FDB_RESULT_INDEX_M GENMASK(11, 0) 336186623f4SDavid Yang #define YT921X_FDB_RESULT_INDEX(x) FIELD_PREP(YT921X_FDB_RESULT_INDEX_M, (x)) 337186623f4SDavid Yang #define YT921X_FDB_OUT0 0x1804b0 338186623f4SDavid Yang #define YT921X_FDB_IO0_ADDR_HI4_M GENMASK(31, 0) 339186623f4SDavid Yang #define YT921X_FDB_OUT1 0x1804b4 340186623f4SDavid Yang #define YT921X_FDB_IO1_EGR_INT_PRI_EN BIT(31) 341186623f4SDavid Yang #define YT921X_FDB_IO1_STATUS_M GENMASK(30, 28) 342186623f4SDavid Yang #define YT921X_FDB_IO1_STATUS(x) FIELD_PREP(YT921X_FDB_IO1_STATUS_M, (x)) 343186623f4SDavid Yang #define YT921X_FDB_IO1_STATUS_INVALID YT921X_FDB_IO1_STATUS(0) 344186623f4SDavid Yang #define YT921X_FDB_IO1_STATUS_MIN_TIME YT921X_FDB_IO1_STATUS(1) 345186623f4SDavid Yang #define YT921X_FDB_IO1_STATUS_MOVE_AGING_MAX_TIME YT921X_FDB_IO1_STATUS(3) 346186623f4SDavid Yang #define YT921X_FDB_IO1_STATUS_MAX_TIME YT921X_FDB_IO1_STATUS(5) 347186623f4SDavid Yang #define YT921X_FDB_IO1_STATUS_PENDING YT921X_FDB_IO1_STATUS(6) 348186623f4SDavid Yang #define YT921X_FDB_IO1_STATUS_STATIC YT921X_FDB_IO1_STATUS(7) 349186623f4SDavid Yang #define YT921X_FDB_IO1_FID_M GENMASK(27, 16) /* filtering ID (VID) */ 350186623f4SDavid Yang #define YT921X_FDB_IO1_FID(x) FIELD_PREP(YT921X_FDB_IO1_FID_M, (x)) 351186623f4SDavid Yang #define YT921X_FDB_IO1_ADDR_LO2_M GENMASK(15, 0) 352186623f4SDavid Yang #define YT921X_FDB_OUT2 0x1804b8 353186623f4SDavid Yang #define YT921X_FDB_IO2_MOVE_AGING_STATUS_M GENMASK(31, 30) 354186623f4SDavid Yang #define YT921X_FDB_IO2_IGR_DROP BIT(29) 355186623f4SDavid Yang #define YT921X_FDB_IO2_EGR_PORTS_M GENMASK(28, 18) 356186623f4SDavid Yang #define YT921X_FDB_IO2_EGR_PORTS(x) FIELD_PREP(YT921X_FDB_IO2_EGR_PORTS_M, (x)) 357186623f4SDavid Yang #define YT921X_FDB_IO2_EGR_DROP BIT(17) 358186623f4SDavid Yang #define YT921X_FDB_IO2_COPY_TO_CPU BIT(16) 359186623f4SDavid Yang #define YT921X_FDB_IO2_IGR_INT_PRI_EN BIT(15) 360186623f4SDavid Yang #define YT921X_FDB_IO2_INT_PRI_M GENMASK(14, 12) 361186623f4SDavid Yang #define YT921X_FDB_IO2_INT_PRI(x) FIELD_PREP(YT921X_FDB_IO2_INT_PRI_M, (x)) 362186623f4SDavid Yang #define YT921X_FDB_IO2_NEW_VID_M GENMASK(11, 0) 363186623f4SDavid Yang #define YT921X_FDB_IO2_NEW_VID(x) FIELD_PREP(YT921X_FDB_IO2_NEW_VID_M, (x)) 364186623f4SDavid Yang #define YT921X_FILTER_UNK_UCAST 0x180508 365186623f4SDavid Yang #define YT921X_FILTER_UNK_MCAST 0x18050c 366186623f4SDavid Yang #define YT921X_FILTER_MCAST 0x180510 367186623f4SDavid Yang #define YT921X_FILTER_BCAST 0x180514 368186623f4SDavid Yang #define YT921X_FILTER_PORTS_M GENMASK(10, 0) 369186623f4SDavid Yang #define YT921X_FILTER_PORTS(x) FIELD_PREP(YT921X_FILTER_PORTS_M, (x)) 370186623f4SDavid Yang #define YT921X_FILTER_PORTn(port) BIT(port) 371186623f4SDavid Yang #define YT921X_VLAN_EGR_FILTER 0x180598 372186623f4SDavid Yang #define YT921X_VLAN_EGR_FILTER_PORTn(port) BIT(port) 373186623f4SDavid Yang #define YT921X_CPU_COPY 0x180690 374186623f4SDavid Yang #define YT921X_CPU_COPY_FORCE_INT_PORT BIT(2) 375186623f4SDavid Yang #define YT921X_CPU_COPY_TO_INT_CPU BIT(1) 376186623f4SDavid Yang #define YT921X_CPU_COPY_TO_EXT_CPU BIT(0) 377186623f4SDavid Yang #define YT921X_ACT_UNK_UCAST 0x180734 378186623f4SDavid Yang #define YT921X_ACT_UNK_MCAST 0x180738 379186623f4SDavid Yang #define YT921X_ACT_UNK_MCAST_BYPASS_DROP_RMA BIT(23) 380186623f4SDavid Yang #define YT921X_ACT_UNK_MCAST_BYPASS_DROP_IGMP BIT(22) 381186623f4SDavid Yang #define YT921X_ACT_UNK_ACTn_M(port) GENMASK(2 * (port) + 1, 2 * (port)) 382186623f4SDavid Yang #define YT921X_ACT_UNK_ACTn(port, x) ((x) << (2 * (port))) 383186623f4SDavid Yang #define YT921X_ACT_UNK_ACTn_FORWARD(port) YT921X_ACT_UNK_ACTn(port, 0) /* flood */ 384186623f4SDavid Yang #define YT921X_ACT_UNK_ACTn_TRAP(port) YT921X_ACT_UNK_ACTn(port, 1) /* steer to CPU */ 385186623f4SDavid Yang #define YT921X_ACT_UNK_ACTn_DROP(port) YT921X_ACT_UNK_ACTn(port, 2) /* discard */ 386186623f4SDavid Yang /* NEVER use this action; see comments in the tag driver */ 387186623f4SDavid Yang #define YT921X_ACT_UNK_ACTn_COPY(port) YT921X_ACT_UNK_ACTn(port, 3) /* flood and copy */ 388186623f4SDavid Yang #define YT921X_FDB_HW_FLUSH 0x180958 389186623f4SDavid Yang #define YT921X_FDB_HW_FLUSH_ON_LINKDOWN BIT(0) 390186623f4SDavid Yang 391186623f4SDavid Yang #define YT921X_VLANn_CTRL(vlan) (0x188000 + 8 * (vlan)) 392d973ac83SDavid Yang #define YT921X_VLAN_CTRL_UNTAG_PORTS_M GENMASK_ULL(50, 40) 393186623f4SDavid Yang #define YT921X_VLAN_CTRL_UNTAG_PORTS(x) FIELD_PREP(YT921X_VLAN_CTRL_UNTAG_PORTS_M, (x)) 394d973ac83SDavid Yang #define YT921X_VLAN_CTRL_UNTAG_PORTn(port) BIT_ULL((port) + 40) 395d973ac83SDavid Yang #define YT921X_VLAN_CTRL_STP_ID_M GENMASK_ULL(39, 36) 396186623f4SDavid Yang #define YT921X_VLAN_CTRL_STP_ID(x) FIELD_PREP(YT921X_VLAN_CTRL_STP_ID_M, (x)) 397d973ac83SDavid Yang #define YT921X_VLAN_CTRL_SVLAN_EN BIT_ULL(35) 398d973ac83SDavid Yang #define YT921X_VLAN_CTRL_FID_M GENMASK_ULL(34, 23) 399186623f4SDavid Yang #define YT921X_VLAN_CTRL_FID(x) FIELD_PREP(YT921X_VLAN_CTRL_FID_M, (x)) 400d973ac83SDavid Yang #define YT921X_VLAN_CTRL_LEARN_DIS BIT_ULL(22) 401d973ac83SDavid Yang #define YT921X_VLAN_CTRL_INT_PRI_EN BIT_ULL(21) 402d973ac83SDavid Yang #define YT921X_VLAN_CTRL_INT_PRI_M GENMASK_ULL(20, 18) 403d973ac83SDavid Yang #define YT921X_VLAN_CTRL_PORTS_M GENMASK_ULL(17, 7) 404186623f4SDavid Yang #define YT921X_VLAN_CTRL_PORTS(x) FIELD_PREP(YT921X_VLAN_CTRL_PORTS_M, (x)) 405d973ac83SDavid Yang #define YT921X_VLAN_CTRL_PORTn(port) BIT_ULL((port) + 7) 406d973ac83SDavid Yang #define YT921X_VLAN_CTRL_BYPASS_1X_AC BIT_ULL(6) 407d973ac83SDavid Yang #define YT921X_VLAN_CTRL_METER_EN BIT_ULL(5) 408d973ac83SDavid Yang #define YT921X_VLAN_CTRL_METER_ID_M GENMASK_ULL(4, 0) 409186623f4SDavid Yang 410186623f4SDavid Yang #define YT921X_TPID_IGRn(x) (0x210000 + 4 * (x)) /* [0, 3] */ 411186623f4SDavid Yang #define YT921X_TPID_IGR_TPID_M GENMASK(15, 0) 412186623f4SDavid Yang #define YT921X_PORTn_IGR_TPID(port) (0x210010 + 4 * (port)) 413186623f4SDavid Yang #define YT921X_PORT_IGR_TPIDn_STAG_M GENMASK(7, 4) 414186623f4SDavid Yang #define YT921X_PORT_IGR_TPIDn_STAG(x) BIT((x) + 4) 415186623f4SDavid Yang #define YT921X_PORT_IGR_TPIDn_CTAG_M GENMASK(3, 0) 416186623f4SDavid Yang #define YT921X_PORT_IGR_TPIDn_CTAG(x) BIT(x) 417186623f4SDavid Yang 418186623f4SDavid Yang #define YT921X_PORTn_VLAN_CTRL(port) (0x230010 + 4 * (port)) 419186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL_SVLAN_PRI_EN BIT(31) 420186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL_CVLAN_PRI_EN BIT(30) 421186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL_SVID_M GENMASK(29, 18) 422186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL_SVID(x) FIELD_PREP(YT921X_PORT_VLAN_CTRL_SVID_M, (x)) 423186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL_CVID_M GENMASK(17, 6) 424186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL_CVID(x) FIELD_PREP(YT921X_PORT_VLAN_CTRL_CVID_M, (x)) 425186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL_SVLAN_PRI_M GENMASK(5, 3) 426186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL_CVLAN_PRI_M GENMASK(2, 0) 427186623f4SDavid Yang #define YT921X_PORTn_VLAN_CTRL1(port) (0x230080 + 4 * (port)) 428186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL1_VLAN_RANGE_EN BIT(8) 429186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL1_VLAN_RANGE_PROFILE_ID_M GENMASK(7, 4) 430186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL1_SVLAN_DROP_TAGGED BIT(3) 431186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL1_SVLAN_DROP_UNTAGGED BIT(2) 432186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL1_CVLAN_DROP_TAGGED BIT(1) 433186623f4SDavid Yang #define YT921X_PORT_VLAN_CTRL1_CVLAN_DROP_UNTAGGED BIT(0) 434186623f4SDavid Yang 435186623f4SDavid Yang #define YT921X_MIRROR 0x300300 436186623f4SDavid Yang #define YT921X_MIRROR_IGR_PORTS_M GENMASK(26, 16) 437186623f4SDavid Yang #define YT921X_MIRROR_IGR_PORTS(x) FIELD_PREP(YT921X_MIRROR_IGR_PORTS_M, (x)) 438186623f4SDavid Yang #define YT921X_MIRROR_IGR_PORTn(port) BIT((port) + 16) 439186623f4SDavid Yang #define YT921X_MIRROR_EGR_PORTS_M GENMASK(14, 4) 440186623f4SDavid Yang #define YT921X_MIRROR_EGR_PORTS(x) FIELD_PREP(YT921X_MIRROR_EGR_PORTS_M, (x)) 441186623f4SDavid Yang #define YT921X_MIRROR_EGR_PORTn(port) BIT((port) + 4) 442186623f4SDavid Yang #define YT921X_MIRROR_PORT_M GENMASK(3, 0) 443186623f4SDavid Yang #define YT921X_MIRROR_PORT(x) FIELD_PREP(YT921X_MIRROR_PORT_M, (x)) 444186623f4SDavid Yang 445186623f4SDavid Yang #define YT921X_EDATA_EXTMODE 0xfb 446186623f4SDavid Yang #define YT921X_EDATA_LEN 0x100 447186623f4SDavid Yang 448186623f4SDavid Yang #define YT921X_FDB_NUM 4096 449186623f4SDavid Yang 450186623f4SDavid Yang enum yt921x_fdb_entry_status { 451186623f4SDavid Yang YT921X_FDB_ENTRY_STATUS_INVALID = 0, 452186623f4SDavid Yang YT921X_FDB_ENTRY_STATUS_MIN_TIME = 1, 453186623f4SDavid Yang YT921X_FDB_ENTRY_STATUS_MOVE_AGING_MAX_TIME = 3, 454186623f4SDavid Yang YT921X_FDB_ENTRY_STATUS_MAX_TIME = 5, 455186623f4SDavid Yang YT921X_FDB_ENTRY_STATUS_PENDING = 6, 456186623f4SDavid Yang YT921X_FDB_ENTRY_STATUS_STATIC = 7, 457186623f4SDavid Yang }; 458186623f4SDavid Yang 459*633b1d01SDavid Yang #define YT921X_MSTI_NUM 16 460*633b1d01SDavid Yang 461186623f4SDavid Yang #define YT9215_MAJOR 0x9002 462186623f4SDavid Yang #define YT9218_MAJOR 0x9001 463186623f4SDavid Yang 464186623f4SDavid Yang /* required for a hard reset */ 465186623f4SDavid Yang #define YT921X_RST_DELAY_US 10000 466186623f4SDavid Yang 467186623f4SDavid Yang #define YT921X_FRAME_SIZE_MAX 0x2400 /* 9216 */ 468186623f4SDavid Yang 469186623f4SDavid Yang #define YT921X_TAG_LEN 8 470186623f4SDavid Yang 471186623f4SDavid Yang /* 8 internal + 2 external + 1 mcu */ 472186623f4SDavid Yang #define YT921X_PORT_NUM 11 473186623f4SDavid Yang 474186623f4SDavid Yang #define yt921x_port_is_internal(port) ((port) < 8) 475186623f4SDavid Yang #define yt921x_port_is_external(port) (8 <= (port) && (port) < 9) 476186623f4SDavid Yang 477186623f4SDavid Yang struct yt921x_mib { 478186623f4SDavid Yang u64 rx_broadcast; 479186623f4SDavid Yang u64 rx_pause; 480186623f4SDavid Yang u64 rx_multicast; 481186623f4SDavid Yang u64 rx_crc_errors; 482186623f4SDavid Yang 483186623f4SDavid Yang u64 rx_alignment_errors; 484186623f4SDavid Yang u64 rx_undersize_errors; 485186623f4SDavid Yang u64 rx_fragment_errors; 486186623f4SDavid Yang u64 rx_64byte; 487186623f4SDavid Yang 488186623f4SDavid Yang u64 rx_65_127byte; 489186623f4SDavid Yang u64 rx_128_255byte; 490186623f4SDavid Yang u64 rx_256_511byte; 491186623f4SDavid Yang u64 rx_512_1023byte; 492186623f4SDavid Yang 493186623f4SDavid Yang u64 rx_1024_1518byte; 494186623f4SDavid Yang u64 rx_jumbo; 495186623f4SDavid Yang u64 rx_good_bytes; 496186623f4SDavid Yang 497186623f4SDavid Yang u64 rx_bad_bytes; 498186623f4SDavid Yang u64 rx_oversize_errors; 499186623f4SDavid Yang 500186623f4SDavid Yang u64 rx_dropped; 501186623f4SDavid Yang u64 tx_broadcast; 502186623f4SDavid Yang u64 tx_pause; 503186623f4SDavid Yang u64 tx_multicast; 504186623f4SDavid Yang 505186623f4SDavid Yang u64 tx_undersize_errors; 506186623f4SDavid Yang u64 tx_64byte; 507186623f4SDavid Yang u64 tx_65_127byte; 508186623f4SDavid Yang u64 tx_128_255byte; 509186623f4SDavid Yang 510186623f4SDavid Yang u64 tx_256_511byte; 511186623f4SDavid Yang u64 tx_512_1023byte; 512186623f4SDavid Yang u64 tx_1024_1518byte; 513186623f4SDavid Yang u64 tx_jumbo; 514186623f4SDavid Yang 515186623f4SDavid Yang u64 tx_good_bytes; 516186623f4SDavid Yang u64 tx_collisions; 517186623f4SDavid Yang 518186623f4SDavid Yang u64 tx_aborted_errors; 519186623f4SDavid Yang u64 tx_multiple_collisions; 520186623f4SDavid Yang u64 tx_single_collisions; 521186623f4SDavid Yang u64 tx_good; 522186623f4SDavid Yang 523186623f4SDavid Yang u64 tx_deferred; 524186623f4SDavid Yang u64 tx_late_collisions; 525186623f4SDavid Yang u64 rx_oam; 526186623f4SDavid Yang u64 tx_oam; 527186623f4SDavid Yang }; 528186623f4SDavid Yang 529186623f4SDavid Yang struct yt921x_port { 530186623f4SDavid Yang unsigned char index; 531186623f4SDavid Yang 532186623f4SDavid Yang bool hairpin; 533186623f4SDavid Yang bool isolated; 534186623f4SDavid Yang 535186623f4SDavid Yang struct delayed_work mib_read; 536186623f4SDavid Yang struct yt921x_mib mib; 537186623f4SDavid Yang u64 rx_frames; 538186623f4SDavid Yang u64 tx_frames; 539186623f4SDavid Yang }; 540186623f4SDavid Yang 541186623f4SDavid Yang struct yt921x_reg_ops { 542186623f4SDavid Yang int (*read)(void *context, u32 reg, u32 *valp); 543186623f4SDavid Yang int (*write)(void *context, u32 reg, u32 val); 544186623f4SDavid Yang }; 545186623f4SDavid Yang 546186623f4SDavid Yang struct yt921x_priv { 547186623f4SDavid Yang struct dsa_switch ds; 548186623f4SDavid Yang 549186623f4SDavid Yang const struct yt921x_info *info; 550186623f4SDavid Yang /* cache of dsa_cpu_ports(ds) */ 551186623f4SDavid Yang u16 cpu_ports_mask; 552186623f4SDavid Yang 553186623f4SDavid Yang /* protect the access to the switch registers */ 554186623f4SDavid Yang struct mutex reg_lock; 555186623f4SDavid Yang const struct yt921x_reg_ops *reg_ops; 556186623f4SDavid Yang void *reg_ctx; 557186623f4SDavid Yang 558186623f4SDavid Yang /* mdio master bus */ 559186623f4SDavid Yang struct mii_bus *mbus_int; 560186623f4SDavid Yang struct mii_bus *mbus_ext; 561186623f4SDavid Yang 562186623f4SDavid Yang struct yt921x_port ports[YT921X_PORT_NUM]; 563186623f4SDavid Yang 564186623f4SDavid Yang u16 eee_ports_mask; 565186623f4SDavid Yang }; 566186623f4SDavid Yang 567186623f4SDavid Yang #endif 568