19c472a0dSDavid Yang /* SPDX-License-Identifier: GPL-2.0-or-later */ 29c472a0dSDavid Yang /* 39c472a0dSDavid Yang * Copyright (c) 2025 David Yang 49c472a0dSDavid Yang */ 59c472a0dSDavid Yang 69c472a0dSDavid Yang #ifndef __YT921X_H 79c472a0dSDavid Yang #define __YT921X_H 89c472a0dSDavid Yang 99c472a0dSDavid Yang #include <net/dsa.h> 109c472a0dSDavid Yang 119c472a0dSDavid Yang #define YT921X_SMI_SWITCHID_M GENMASK(3, 2) 129c472a0dSDavid Yang #define YT921X_SMI_SWITCHID(x) FIELD_PREP(YT921X_SMI_SWITCHID_M, (x)) 139c472a0dSDavid Yang #define YT921X_SMI_AD BIT(1) 149c472a0dSDavid Yang #define YT921X_SMI_ADDR 0 159c472a0dSDavid Yang #define YT921X_SMI_DATA YT921X_SMI_AD 169c472a0dSDavid Yang #define YT921X_SMI_RW BIT(0) 179c472a0dSDavid Yang #define YT921X_SMI_WRITE 0 189c472a0dSDavid Yang #define YT921X_SMI_READ YT921X_SMI_RW 199c472a0dSDavid Yang 209c472a0dSDavid Yang #define YT921X_SWITCHID_NUM 4 219c472a0dSDavid Yang 229c472a0dSDavid Yang #define YT921X_RST 0x80000 239c472a0dSDavid Yang #define YT921X_RST_HW BIT(31) 249c472a0dSDavid Yang #define YT921X_RST_SW BIT(1) 259c472a0dSDavid Yang #define YT921X_FUNC 0x80004 269c472a0dSDavid Yang #define YT921X_FUNC_METER BIT(4) 279c472a0dSDavid Yang #define YT921X_FUNC_ACL BIT(2) 289c472a0dSDavid Yang #define YT921X_FUNC_MIB BIT(1) 299c472a0dSDavid Yang #define YT921X_CHIP_ID 0x80008 309c472a0dSDavid Yang #define YT921X_CHIP_ID_MAJOR GENMASK(31, 16) 319c472a0dSDavid Yang #define YT921X_EXT_CPU_PORT 0x8000c 329c472a0dSDavid Yang #define YT921X_EXT_CPU_PORT_TAG_EN BIT(15) 339c472a0dSDavid Yang #define YT921X_EXT_CPU_PORT_PORT_EN BIT(14) 349c472a0dSDavid Yang #define YT921X_EXT_CPU_PORT_PORT_M GENMASK(3, 0) 359c472a0dSDavid Yang #define YT921X_EXT_CPU_PORT_PORT(x) FIELD_PREP(YT921X_EXT_CPU_PORT_PORT_M, (x)) 369c472a0dSDavid Yang #define YT921X_CPU_TAG_TPID 0x80010 379c472a0dSDavid Yang #define YT921X_CPU_TAG_TPID_TPID_M GENMASK(15, 0) 389c472a0dSDavid Yang /* Same as ETH_P_YT921X, but this represents the true HW default, while the 399c472a0dSDavid Yang * former is a local convention chosen by us. 409c472a0dSDavid Yang */ 419c472a0dSDavid Yang #define YT921X_CPU_TAG_TPID_TPID_DEFAULT 0x9988 429c472a0dSDavid Yang #define YT921X_PVID_SEL 0x80014 439c472a0dSDavid Yang #define YT921X_PVID_SEL_SVID_PORTn(port) BIT(port) 449c472a0dSDavid Yang #define YT921X_SERDES_CTRL 0x80028 45be5cdff0SDavid Yang #define YT921X_SERDES_CTRL_TEST BIT(6) 469c472a0dSDavid Yang #define YT921X_SERDES_CTRL_PORTn(port) BIT((port) - 8) 479c472a0dSDavid Yang #define YT921X_IO_LEVEL 0x80030 489c472a0dSDavid Yang #define YT9215_IO_LEVEL_NORMAL_M GENMASK(5, 4) 499c472a0dSDavid Yang #define YT9215_IO_LEVEL_NORMAL(x) FIELD_PREP(YT9215_IO_LEVEL_NORMAL_M, (x)) 509c472a0dSDavid Yang #define YT9215_IO_LEVEL_NORMAL_3V3 YT9215_IO_LEVEL_NORMAL(0) 519c472a0dSDavid Yang #define YT9215_IO_LEVEL_NORMAL_1V8 YT9215_IO_LEVEL_NORMAL(3) 529c472a0dSDavid Yang #define YT9215_IO_LEVEL_RGMII1_M GENMASK(3, 2) 539c472a0dSDavid Yang #define YT9215_IO_LEVEL_RGMII1(x) FIELD_PREP(YT9215_IO_LEVEL_RGMII1_M, (x)) 549c472a0dSDavid Yang #define YT9215_IO_LEVEL_RGMII1_3V3 YT9215_IO_LEVEL_RGMII1(0) 559c472a0dSDavid Yang #define YT9215_IO_LEVEL_RGMII1_2V5 YT9215_IO_LEVEL_RGMII1(1) 569c472a0dSDavid Yang #define YT9215_IO_LEVEL_RGMII1_1V8 YT9215_IO_LEVEL_RGMII1(2) 579c472a0dSDavid Yang #define YT9215_IO_LEVEL_RGMII0_M GENMASK(1, 0) 589c472a0dSDavid Yang #define YT9215_IO_LEVEL_RGMII0(x) FIELD_PREP(YT9215_IO_LEVEL_RGMII0_M, (x)) 599c472a0dSDavid Yang #define YT9215_IO_LEVEL_RGMII0_3V3 YT9215_IO_LEVEL_RGMII0(0) 609c472a0dSDavid Yang #define YT9215_IO_LEVEL_RGMII0_2V5 YT9215_IO_LEVEL_RGMII0(1) 619c472a0dSDavid Yang #define YT9215_IO_LEVEL_RGMII0_1V8 YT9215_IO_LEVEL_RGMII0(2) 629c472a0dSDavid Yang #define YT9218_IO_LEVEL_RGMII1_M GENMASK(5, 4) 639c472a0dSDavid Yang #define YT9218_IO_LEVEL_RGMII1(x) FIELD_PREP(YT9218_IO_LEVEL_RGMII1_M, (x)) 649c472a0dSDavid Yang #define YT9218_IO_LEVEL_RGMII1_3V3 YT9218_IO_LEVEL_RGMII1(0) 659c472a0dSDavid Yang #define YT9218_IO_LEVEL_RGMII1_2V5 YT9218_IO_LEVEL_RGMII1(1) 669c472a0dSDavid Yang #define YT9218_IO_LEVEL_RGMII1_1V8 YT9218_IO_LEVEL_RGMII1(2) 679c472a0dSDavid Yang #define YT9218_IO_LEVEL_RGMII0_M GENMASK(3, 2) 689c472a0dSDavid Yang #define YT9218_IO_LEVEL_RGMII0(x) FIELD_PREP(YT9218_IO_LEVEL_RGMII0_M, (x)) 699c472a0dSDavid Yang #define YT9218_IO_LEVEL_RGMII0_3V3 YT9218_IO_LEVEL_RGMII0(0) 709c472a0dSDavid Yang #define YT9218_IO_LEVEL_RGMII0_2V5 YT9218_IO_LEVEL_RGMII0(1) 719c472a0dSDavid Yang #define YT9218_IO_LEVEL_RGMII0_1V8 YT9218_IO_LEVEL_RGMII0(2) 729c472a0dSDavid Yang #define YT9218_IO_LEVEL_NORMAL_M GENMASK(1, 0) 739c472a0dSDavid Yang #define YT9218_IO_LEVEL_NORMAL(x) FIELD_PREP(YT9218_IO_LEVEL_NORMAL_M, (x)) 749c472a0dSDavid Yang #define YT9218_IO_LEVEL_NORMAL_3V3 YT9218_IO_LEVEL_NORMAL(0) 759c472a0dSDavid Yang #define YT9218_IO_LEVEL_NORMAL_1V8 YT9218_IO_LEVEL_NORMAL(3) 769c472a0dSDavid Yang #define YT921X_MAC_ADDR_HI2 0x80080 779c472a0dSDavid Yang #define YT921X_MAC_ADDR_LO4 0x80084 789c472a0dSDavid Yang #define YT921X_SERDESn(port) (0x8008c + 4 * ((port) - 8)) 799c472a0dSDavid Yang #define YT921X_SERDES_MODE_M GENMASK(9, 7) 809c472a0dSDavid Yang #define YT921X_SERDES_MODE(x) FIELD_PREP(YT921X_SERDES_MODE_M, (x)) 819c472a0dSDavid Yang #define YT921X_SERDES_MODE_SGMII YT921X_SERDES_MODE(0) 829c472a0dSDavid Yang #define YT921X_SERDES_MODE_REVSGMII YT921X_SERDES_MODE(1) 839c472a0dSDavid Yang #define YT921X_SERDES_MODE_1000BASEX YT921X_SERDES_MODE(2) 849c472a0dSDavid Yang #define YT921X_SERDES_MODE_100BASEX YT921X_SERDES_MODE(3) 859c472a0dSDavid Yang #define YT921X_SERDES_MODE_2500BASEX YT921X_SERDES_MODE(4) 869c472a0dSDavid Yang #define YT921X_SERDES_RX_PAUSE BIT(6) 879c472a0dSDavid Yang #define YT921X_SERDES_TX_PAUSE BIT(5) 889c472a0dSDavid Yang #define YT921X_SERDES_LINK BIT(4) /* force link */ 899c472a0dSDavid Yang #define YT921X_SERDES_DUPLEX_FULL BIT(3) 909c472a0dSDavid Yang #define YT921X_SERDES_SPEED_M GENMASK(2, 0) 919c472a0dSDavid Yang #define YT921X_SERDES_SPEED(x) FIELD_PREP(YT921X_SERDES_SPEED_M, (x)) 92be5cdff0SDavid Yang #define YT921X_PORTn_CTRL(port) (0x80100 + 4 * (port)) /* Bit 7-0 shared with PORT_STATUS */ 939c472a0dSDavid Yang #define YT921X_PORT_CTRL_PAUSE_AN BIT(10) 94be5cdff0SDavid Yang #define YT921X_PORT_CTRL_LINK_AN BIT(9) 95be5cdff0SDavid Yang #define YT921X_PORT_CTRL_HALF_PAUSE BIT(8) /* Half-duplex back pressure mode */ 969c472a0dSDavid Yang #define YT921X_PORTn_STATUS(port) (0x80200 + 4 * (port)) 97be5cdff0SDavid Yang #define YT921X_PORT_LINK BIT(8) 989c472a0dSDavid Yang #define YT921X_PORT_DUPLEX_FULL BIT(7) 999c472a0dSDavid Yang #define YT921X_PORT_RX_PAUSE BIT(6) 1009c472a0dSDavid Yang #define YT921X_PORT_TX_PAUSE BIT(5) 1019c472a0dSDavid Yang #define YT921X_PORT_RX_MAC_EN BIT(4) 1029c472a0dSDavid Yang #define YT921X_PORT_TX_MAC_EN BIT(3) 1039c472a0dSDavid Yang #define YT921X_PORT_SPEED_M GENMASK(2, 0) 1049c472a0dSDavid Yang #define YT921X_PORT_SPEED(x) FIELD_PREP(YT921X_PORT_SPEED_M, (x)) 1059c472a0dSDavid Yang #define YT921X_PON_STRAP_FUNC 0x80320 1069c472a0dSDavid Yang #define YT921X_PON_STRAP_VAL 0x80324 1079c472a0dSDavid Yang #define YT921X_PON_STRAP_CAP 0x80328 1089c472a0dSDavid Yang #define YT921X_PON_STRAP_EEE BIT(16) 1099c472a0dSDavid Yang #define YT921X_PON_STRAP_LOOP_DETECT BIT(7) 1109c472a0dSDavid Yang #define YT921X_MDIO_POLLINGn(port) (0x80364 + 4 * ((port) - 8)) 1119c472a0dSDavid Yang #define YT921X_MDIO_POLLING_DUPLEX_FULL BIT(4) 1129c472a0dSDavid Yang #define YT921X_MDIO_POLLING_LINK BIT(3) 1139c472a0dSDavid Yang #define YT921X_MDIO_POLLING_SPEED_M GENMASK(2, 0) 1149c472a0dSDavid Yang #define YT921X_MDIO_POLLING_SPEED(x) FIELD_PREP(YT921X_MDIO_POLLING_SPEED_M, (x)) 1155423f892SDavid Yang 1165423f892SDavid Yang enum yt921x_speed { 1175423f892SDavid Yang YT921X_SPEED_10, 1185423f892SDavid Yang YT921X_SPEED_100, 1195423f892SDavid Yang YT921X_SPEED_1000, 1205423f892SDavid Yang YT921X_SPEED_10000, 1215423f892SDavid Yang YT921X_SPEED_2500, 1225423f892SDavid Yang YT921X_SPEED_INVALID 1235423f892SDavid Yang }; 1245423f892SDavid Yang 1259c472a0dSDavid Yang #define YT921X_SENSOR 0x8036c 1269c472a0dSDavid Yang #define YT921X_SENSOR_TEMP BIT(18) 1279c472a0dSDavid Yang #define YT921X_TEMP 0x80374 1289c472a0dSDavid Yang #define YT921X_CHIP_MODE 0x80388 1299c472a0dSDavid Yang #define YT921X_CHIP_MODE_MODE GENMASK(1, 0) 1309c472a0dSDavid Yang #define YT921X_XMII_CTRL 0x80394 1319c472a0dSDavid Yang #define YT921X_XMII_CTRL_PORTn(port) BIT(9 - (port)) /* Yes, it's reversed */ 1329c472a0dSDavid Yang #define YT921X_XMIIn(port) (0x80400 + 8 * ((port) - 8)) 1339c472a0dSDavid Yang #define YT921X_XMII_MODE_M GENMASK(31, 29) 1349c472a0dSDavid Yang #define YT921X_XMII_MODE(x) FIELD_PREP(YT921X_XMII_MODE_M, (x)) 1359c472a0dSDavid Yang #define YT921X_XMII_MODE_MII YT921X_XMII_MODE(0) 1369c472a0dSDavid Yang #define YT921X_XMII_MODE_REVMII YT921X_XMII_MODE(1) 1379c472a0dSDavid Yang #define YT921X_XMII_MODE_RMII YT921X_XMII_MODE(2) 1389c472a0dSDavid Yang #define YT921X_XMII_MODE_REVRMII YT921X_XMII_MODE(3) 1399c472a0dSDavid Yang #define YT921X_XMII_MODE_RGMII YT921X_XMII_MODE(4) 1409c472a0dSDavid Yang #define YT921X_XMII_MODE_DISABLE YT921X_XMII_MODE(5) 1419c472a0dSDavid Yang #define YT921X_XMII_LINK BIT(19) /* force link */ 1429c472a0dSDavid Yang #define YT921X_XMII_EN BIT(18) 1439c472a0dSDavid Yang #define YT921X_XMII_SOFT_RST BIT(17) 1449c472a0dSDavid Yang #define YT921X_XMII_RGMII_TX_DELAY_150PS_M GENMASK(16, 13) 1459c472a0dSDavid Yang #define YT921X_XMII_RGMII_TX_DELAY_150PS(x) FIELD_PREP(YT921X_XMII_RGMII_TX_DELAY_150PS_M, (x)) 1469c472a0dSDavid Yang #define YT921X_XMII_TX_CLK_IN BIT(11) 1479c472a0dSDavid Yang #define YT921X_XMII_RX_CLK_IN BIT(10) 1489c472a0dSDavid Yang #define YT921X_XMII_RGMII_TX_DELAY_2NS BIT(8) 1499c472a0dSDavid Yang #define YT921X_XMII_RGMII_TX_CLK_OUT BIT(7) 1509c472a0dSDavid Yang #define YT921X_XMII_RGMII_RX_DELAY_150PS_M GENMASK(6, 3) 1519c472a0dSDavid Yang #define YT921X_XMII_RGMII_RX_DELAY_150PS(x) FIELD_PREP(YT921X_XMII_RGMII_RX_DELAY_150PS_M, (x)) 1529c472a0dSDavid Yang #define YT921X_XMII_RMII_PHY_TX_CLK_OUT BIT(2) 1539c472a0dSDavid Yang #define YT921X_XMII_REVMII_TX_CLK_OUT BIT(1) 1549c472a0dSDavid Yang #define YT921X_XMII_REVMII_RX_CLK_OUT BIT(0) 1559c472a0dSDavid Yang 1569c472a0dSDavid Yang #define YT921X_MACn_FRAME(port) (0x81008 + 0x1000 * (port)) 1579c472a0dSDavid Yang #define YT921X_MAC_FRAME_SIZE_M GENMASK(21, 8) 1589c472a0dSDavid Yang #define YT921X_MAC_FRAME_SIZE(x) FIELD_PREP(YT921X_MAC_FRAME_SIZE_M, (x)) 1599c472a0dSDavid Yang 1609c472a0dSDavid Yang #define YT921X_EEEn_VAL(port) (0xa0000 + 0x40 * (port)) 1619c472a0dSDavid Yang #define YT921X_EEE_VAL_DATA BIT(1) 1629c472a0dSDavid Yang 1639c472a0dSDavid Yang #define YT921X_EEE_CTRL 0xb0000 1649c472a0dSDavid Yang #define YT921X_EEE_CTRL_ENn(port) BIT(port) 1659c472a0dSDavid Yang 1669c472a0dSDavid Yang #define YT921X_EDATA_CTRL 0xe0000 1679c472a0dSDavid Yang #define YT921X_EDATA_CTRL_ADDR_M GENMASK(15, 8) 1689c472a0dSDavid Yang #define YT921X_EDATA_CTRL_ADDR(x) FIELD_PREP(YT921X_EDATA_CTRL_ADDR_M, (x)) 1699c472a0dSDavid Yang #define YT921X_EDATA_CTRL_OP_M GENMASK(3, 0) 1709c472a0dSDavid Yang #define YT921X_EDATA_CTRL_OP(x) FIELD_PREP(YT921X_EDATA_CTRL_OP_M, (x)) 1719c472a0dSDavid Yang #define YT921X_EDATA_CTRL_READ YT921X_EDATA_CTRL_OP(5) 1729c472a0dSDavid Yang #define YT921X_EDATA_DATA 0xe0004 1739c472a0dSDavid Yang #define YT921X_EDATA_DATA_DATA_M GENMASK(31, 24) 1749c472a0dSDavid Yang #define YT921X_EDATA_DATA_STATUS_M GENMASK(3, 0) 1759c472a0dSDavid Yang #define YT921X_EDATA_DATA_STATUS(x) FIELD_PREP(YT921X_EDATA_DATA_STATUS_M, (x)) 1769c472a0dSDavid Yang #define YT921X_EDATA_DATA_IDLE YT921X_EDATA_DATA_STATUS(3) 1779c472a0dSDavid Yang #define YT921X_SYS_CLK 0xe0040 1789c472a0dSDavid Yang #define YT921X_SYS_CLK_SEL_M GENMASK(1, 0) /* unknown: 167M */ 1799c472a0dSDavid Yang #define YT9215_SYS_CLK_125M 0 1809c472a0dSDavid Yang #define YT9218_SYS_CLK_167M 0 1819c472a0dSDavid Yang #define YT921X_SYS_CLK_143M 1 1829c472a0dSDavid Yang 1839c472a0dSDavid Yang #define YT921X_PORTn_EGR(port) (0x100000 + 4 * (port)) 1849c472a0dSDavid Yang #define YT921X_PORT_EGR_TPID_CTAG_M GENMASK(5, 4) 1859c472a0dSDavid Yang #define YT921X_PORT_EGR_TPID_CTAG(x) FIELD_PREP(YT921X_PORT_EGR_TPID_CTAG_M, (x)) 1869c472a0dSDavid Yang #define YT921X_PORT_EGR_TPID_STAG_M GENMASK(3, 2) 1879c472a0dSDavid Yang #define YT921X_PORT_EGR_TPID_STAG(x) FIELD_PREP(YT921X_PORT_EGR_TPID_STAG_M, (x)) 1889c472a0dSDavid Yang #define YT921X_TPID_EGRn(x) (0x100300 + 4 * (x)) /* [0, 3] */ 1899c472a0dSDavid Yang #define YT921X_TPID_EGR_TPID_M GENMASK(15, 0) 1909c472a0dSDavid Yang 1919c472a0dSDavid Yang #define YT921X_IPM_DSCPn(n) (0x180000 + 4 * (n)) /* Internal Priority Map */ 1929c472a0dSDavid Yang #define YT921X_IPM_PCPn(map, dei, pcp) (0x180100 + 4 * (16 * (map) + 8 * (dei) + (pcp))) 1939c472a0dSDavid Yang #define YT921X_IPM_PRIO_M GENMASK(4, 2) 1949c472a0dSDavid Yang #define YT921X_IPM_PRIO(x) FIELD_PREP(YT921X_IPM_PRIO_M, (x)) 1959c472a0dSDavid Yang #define YT921X_IPM_COLOR_M GENMASK(1, 0) 1969c472a0dSDavid Yang #define YT921X_IPM_COLOR(x) FIELD_PREP(YT921X_IPM_COLOR_M, (x)) 1979c472a0dSDavid Yang #define YT921X_IPM_COLOR_GREEN YT921X_IPM_COLOR(0) 1989c472a0dSDavid Yang #define YT921X_IPM_COLOR_YELLOW YT921X_IPM_COLOR(1) 1999c472a0dSDavid Yang #define YT921X_IPM_COLOR_RED YT921X_IPM_COLOR(2) 2009c472a0dSDavid Yang #define YT921X_PORTn_QOS(port) (0x180180 + 4 * (port)) 2019c472a0dSDavid Yang #define YT921X_PORT_QOS_CVLAN_PRIO_MAP_ID BIT(5) 2029c472a0dSDavid Yang #define YT921X_PORT_QOS_SVLAN_PRIO_MAP_ID BIT(4) 2039c472a0dSDavid Yang #define YT921X_PORT_QOS_PRIO_M GENMASK(3, 1) 2049c472a0dSDavid Yang #define YT921X_PORT_QOS_PRIO(x) FIELD_PREP(YT921X_PORT_QOS_PRIO_M, (x)) 2059c472a0dSDavid Yang #define YT921X_PORT_QOS_PRIO_EN BIT(0) 2069c472a0dSDavid Yang #define YT921X_PORTn_PRIO_ORD(port) (0x180200 + 4 * (port)) 2079c472a0dSDavid Yang #define YT921X_PORT_PRIO_ORD_APPm_M(m) GENMASK(3 * (m) + 2, 3 * (m)) 2089c472a0dSDavid Yang #define YT921X_PORT_PRIO_ORD_APPm(m, x) ((x) << (3 * (m))) /* 0: disabled, except PORT_QOS_PRIO */ 2099c472a0dSDavid Yang 2109c472a0dSDavid Yang enum yt921x_app_selector { 2119c472a0dSDavid Yang YT921X_APP_SEL_MAC_SA, 2129c472a0dSDavid Yang YT921X_APP_SEL_MAC_DA, 2139c472a0dSDavid Yang YT921X_APP_SEL_VID, 2149c472a0dSDavid Yang YT921X_APP_SEL_ACL, 2159c472a0dSDavid Yang YT921X_APP_SEL_DSCP, 2169c472a0dSDavid Yang YT921X_APP_SEL_CVLAN_PCP, 2179c472a0dSDavid Yang YT921X_APP_SEL_SVLAN_PCP, 2189c472a0dSDavid Yang /* The physical port, i.e. YT921X_PORT_QOS_PRIO */ 2199c472a0dSDavid Yang YT921X_APP_SEL_PORT, 2209c472a0dSDavid Yang YT921X_APP_SEL_NUM 2219c472a0dSDavid Yang }; 2229c472a0dSDavid Yang 2239c472a0dSDavid Yang #define YT921X_VLAN_IGR_FILTER 0x180280 2249c472a0dSDavid Yang #define YT921X_VLAN_IGR_FILTER_PORTn_BYPASS_IGMP(port) BIT((port) + 11) 2259c472a0dSDavid Yang #define YT921X_VLAN_IGR_FILTER_PORTn(port) BIT(port) 2269c472a0dSDavid Yang #define YT921X_PORTn_ISOLATION(port) (0x180294 + 4 * (port)) 2279c472a0dSDavid Yang #define YT921X_PORT_ISOLATION_BLOCKn(port) BIT(port) 2289c472a0dSDavid Yang #define YT921X_STPn(n) (0x18038c + 4 * (n)) 2299c472a0dSDavid Yang #define YT921X_STP_PORTn_M(port) GENMASK(2 * (port) + 1, 2 * (port)) 2309c472a0dSDavid Yang #define YT921X_STP_PORTn(port, x) ((x) << (2 * (port))) 2319c472a0dSDavid Yang #define YT921X_STP_PORTn_DISABLED(port) YT921X_STP_PORTn(port, 0) 2329c472a0dSDavid Yang #define YT921X_STP_PORTn_LEARNING(port) YT921X_STP_PORTn(port, 1) 2339c472a0dSDavid Yang #define YT921X_STP_PORTn_BLOCKING(port) YT921X_STP_PORTn(port, 2) 2349c472a0dSDavid Yang #define YT921X_STP_PORTn_FORWARD(port) YT921X_STP_PORTn(port, 3) 2359c472a0dSDavid Yang #define YT921X_PORTn_LEARN(port) (0x1803d0 + 4 * (port)) 2369c472a0dSDavid Yang #define YT921X_PORT_LEARN_VID_LEARN_MULTI_EN BIT(22) 2379c472a0dSDavid Yang #define YT921X_PORT_LEARN_VID_LEARN_MODE BIT(21) 2389c472a0dSDavid Yang #define YT921X_PORT_LEARN_VID_LEARN_EN BIT(20) 2399c472a0dSDavid Yang #define YT921X_PORT_LEARN_SUSPEND_COPY_EN BIT(19) 2409c472a0dSDavid Yang #define YT921X_PORT_LEARN_SUSPEND_DROP_EN BIT(18) 2419c472a0dSDavid Yang #define YT921X_PORT_LEARN_DIS BIT(17) 2429c472a0dSDavid Yang #define YT921X_PORT_LEARN_LIMIT_EN BIT(16) 2439c472a0dSDavid Yang #define YT921X_PORT_LEARN_LIMIT_M GENMASK(15, 8) 2449c472a0dSDavid Yang #define YT921X_PORT_LEARN_LIMIT(x) FIELD_PREP(YT921X_PORT_LEARN_LIMIT_M, (x)) 2459c472a0dSDavid Yang #define YT921X_PORT_LEARN_DROP_ON_EXCEEDED BIT(2) 2469c472a0dSDavid Yang #define YT921X_PORT_LEARN_MODE_M GENMASK(1, 0) 2479c472a0dSDavid Yang #define YT921X_PORT_LEARN_MODE(x) FIELD_PREP(YT921X_PORT_LEARN_MODE_M, (x)) 2489c472a0dSDavid Yang #define YT921X_PORT_LEARN_MODE_AUTO YT921X_PORT_LEARN_MODE(0) 2499c472a0dSDavid Yang #define YT921X_PORT_LEARN_MODE_AUTO_AND_COPY YT921X_PORT_LEARN_MODE(1) 2509c472a0dSDavid Yang #define YT921X_PORT_LEARN_MODE_CPU_CONTROL YT921X_PORT_LEARN_MODE(2) 2519c472a0dSDavid Yang #define YT921X_AGEING 0x180440 2529c472a0dSDavid Yang #define YT921X_AGEING_INTERVAL_M GENMASK(15, 0) 2539c472a0dSDavid Yang #define YT921X_FDB_IN0 0x180454 2549c472a0dSDavid Yang #define YT921X_FDB_IN1 0x180458 2559c472a0dSDavid Yang #define YT921X_FDB_IN2 0x18045c 2569c472a0dSDavid Yang #define YT921X_FDB_OP 0x180460 2579c472a0dSDavid Yang #define YT921X_FDB_OP_INDEX_M GENMASK(22, 11) 2589c472a0dSDavid Yang #define YT921X_FDB_OP_INDEX(x) FIELD_PREP(YT921X_FDB_OP_INDEX_M, (x)) 2599c472a0dSDavid Yang #define YT921X_FDB_OP_MODE_INDEX BIT(10) /* mac+fid / index */ 2609c472a0dSDavid Yang #define YT921X_FDB_OP_FLUSH_MCAST BIT(9) /* ucast / mcast */ 2619c472a0dSDavid Yang #define YT921X_FDB_OP_FLUSH_M GENMASK(8, 7) 2629c472a0dSDavid Yang #define YT921X_FDB_OP_FLUSH(x) FIELD_PREP(YT921X_FDB_OP_FLUSH_M, (x)) 2639c472a0dSDavid Yang #define YT921X_FDB_OP_FLUSH_ALL YT921X_FDB_OP_FLUSH(0) 2649c472a0dSDavid Yang #define YT921X_FDB_OP_FLUSH_PORT YT921X_FDB_OP_FLUSH(1) 2659c472a0dSDavid Yang #define YT921X_FDB_OP_FLUSH_PORT_VID YT921X_FDB_OP_FLUSH(2) 2669c472a0dSDavid Yang #define YT921X_FDB_OP_FLUSH_VID YT921X_FDB_OP_FLUSH(3) 2679c472a0dSDavid Yang #define YT921X_FDB_OP_FLUSH_STATIC BIT(6) 2689c472a0dSDavid Yang #define YT921X_FDB_OP_NEXT_TYPE_M GENMASK(5, 4) 2699c472a0dSDavid Yang #define YT921X_FDB_OP_NEXT_TYPE(x) FIELD_PREP(YT921X_FDB_OP_NEXT_TYPE_M, (x)) 2709c472a0dSDavid Yang #define YT921X_FDB_OP_NEXT_TYPE_UCAST_PORT YT921X_FDB_OP_NEXT_TYPE(0) 2719c472a0dSDavid Yang #define YT921X_FDB_OP_NEXT_TYPE_UCAST_VID YT921X_FDB_OP_NEXT_TYPE(1) 2729c472a0dSDavid Yang #define YT921X_FDB_OP_NEXT_TYPE_UCAST YT921X_FDB_OP_NEXT_TYPE(2) 2739c472a0dSDavid Yang #define YT921X_FDB_OP_NEXT_TYPE_MCAST YT921X_FDB_OP_NEXT_TYPE(3) 2749c472a0dSDavid Yang #define YT921X_FDB_OP_OP_M GENMASK(3, 1) 2759c472a0dSDavid Yang #define YT921X_FDB_OP_OP(x) FIELD_PREP(YT921X_FDB_OP_OP_M, (x)) 2769c472a0dSDavid Yang #define YT921X_FDB_OP_OP_ADD YT921X_FDB_OP_OP(0) 2779c472a0dSDavid Yang #define YT921X_FDB_OP_OP_DEL YT921X_FDB_OP_OP(1) 2789c472a0dSDavid Yang #define YT921X_FDB_OP_OP_GET_ONE YT921X_FDB_OP_OP(2) 2799c472a0dSDavid Yang #define YT921X_FDB_OP_OP_GET_NEXT YT921X_FDB_OP_OP(3) 2809c472a0dSDavid Yang #define YT921X_FDB_OP_OP_FLUSH YT921X_FDB_OP_OP(4) 2819c472a0dSDavid Yang #define YT921X_FDB_OP_START BIT(0) 2829c472a0dSDavid Yang #define YT921X_FDB_RESULT 0x180464 2839c472a0dSDavid Yang #define YT921X_FDB_RESULT_DONE BIT(15) 2849c472a0dSDavid Yang #define YT921X_FDB_RESULT_NOTFOUND BIT(14) 2859c472a0dSDavid Yang #define YT921X_FDB_RESULT_OVERWRITED BIT(13) 2869c472a0dSDavid Yang #define YT921X_FDB_RESULT_INDEX_M GENMASK(11, 0) 2879c472a0dSDavid Yang #define YT921X_FDB_RESULT_INDEX(x) FIELD_PREP(YT921X_FDB_RESULT_INDEX_M, (x)) 2889c472a0dSDavid Yang #define YT921X_FDB_OUT0 0x1804b0 2899c472a0dSDavid Yang #define YT921X_FDB_IO0_ADDR_HI4_M GENMASK(31, 0) 2909c472a0dSDavid Yang #define YT921X_FDB_OUT1 0x1804b4 2919c472a0dSDavid Yang #define YT921X_FDB_IO1_EGR_PRIO_EN BIT(31) 2929c472a0dSDavid Yang #define YT921X_FDB_IO1_STATUS_M GENMASK(30, 28) 2939c472a0dSDavid Yang #define YT921X_FDB_IO1_STATUS(x) FIELD_PREP(YT921X_FDB_IO1_STATUS_M, (x)) 2949c472a0dSDavid Yang #define YT921X_FDB_IO1_STATUS_INVALID YT921X_FDB_IO1_STATUS(0) 2959c472a0dSDavid Yang #define YT921X_FDB_IO1_STATUS_MIN_TIME YT921X_FDB_IO1_STATUS(1) 2969c472a0dSDavid Yang #define YT921X_FDB_IO1_STATUS_MOVE_AGING_MAX_TIME YT921X_FDB_IO1_STATUS(3) 2979c472a0dSDavid Yang #define YT921X_FDB_IO1_STATUS_MAX_TIME YT921X_FDB_IO1_STATUS(5) 2989c472a0dSDavid Yang #define YT921X_FDB_IO1_STATUS_PENDING YT921X_FDB_IO1_STATUS(6) 2999c472a0dSDavid Yang #define YT921X_FDB_IO1_STATUS_STATIC YT921X_FDB_IO1_STATUS(7) 3009c472a0dSDavid Yang #define YT921X_FDB_IO1_FID_M GENMASK(27, 16) /* filtering ID (VID) */ 3019c472a0dSDavid Yang #define YT921X_FDB_IO1_FID(x) FIELD_PREP(YT921X_FDB_IO1_FID_M, (x)) 3029c472a0dSDavid Yang #define YT921X_FDB_IO1_ADDR_LO2_M GENMASK(15, 0) 3039c472a0dSDavid Yang #define YT921X_FDB_OUT2 0x1804b8 3049c472a0dSDavid Yang #define YT921X_FDB_IO2_MOVE_AGING_STATUS_M GENMASK(31, 30) 3059c472a0dSDavid Yang #define YT921X_FDB_IO2_IGR_DROP BIT(29) 3069c472a0dSDavid Yang #define YT921X_FDB_IO2_EGR_PORTS_M GENMASK(28, 18) 3079c472a0dSDavid Yang #define YT921X_FDB_IO2_EGR_PORTS(x) FIELD_PREP(YT921X_FDB_IO2_EGR_PORTS_M, (x)) 3089c472a0dSDavid Yang #define YT921X_FDB_IO2_EGR_DROP BIT(17) 3099c472a0dSDavid Yang #define YT921X_FDB_IO2_COPY_TO_CPU BIT(16) 3109c472a0dSDavid Yang #define YT921X_FDB_IO2_IGR_PRIO_EN BIT(15) 3119c472a0dSDavid Yang #define YT921X_FDB_IO2_PRIO_M GENMASK(14, 12) 3129c472a0dSDavid Yang #define YT921X_FDB_IO2_PRIO(x) FIELD_PREP(YT921X_FDB_IO2_PRIO_M, (x)) 3139c472a0dSDavid Yang #define YT921X_FDB_IO2_NEW_VID_M GENMASK(11, 0) 3149c472a0dSDavid Yang #define YT921X_FDB_IO2_NEW_VID(x) FIELD_PREP(YT921X_FDB_IO2_NEW_VID_M, (x)) 3159c472a0dSDavid Yang #define YT921X_FILTER_UNK_UCAST 0x180508 3169c472a0dSDavid Yang #define YT921X_FILTER_UNK_MCAST 0x18050c 3179c472a0dSDavid Yang #define YT921X_FILTER_MCAST 0x180510 3189c472a0dSDavid Yang #define YT921X_FILTER_BCAST 0x180514 3199c472a0dSDavid Yang #define YT921X_FILTER_PORTS_M GENMASK(10, 0) 3209c472a0dSDavid Yang #define YT921X_FILTER_PORTS(x) FIELD_PREP(YT921X_FILTER_PORTS_M, (x)) 3219c472a0dSDavid Yang #define YT921X_FILTER_PORTn(port) BIT(port) 3229c472a0dSDavid Yang #define YT921X_VLAN_EGR_FILTER 0x180598 3239c472a0dSDavid Yang #define YT921X_VLAN_EGR_FILTER_PORTn(port) BIT(port) 3249c472a0dSDavid Yang #define YT921X_LAG_GROUPn(n) (0x1805a8 + 4 * (n)) 3259c472a0dSDavid Yang #define YT921X_LAG_GROUP_PORTS_M GENMASK(13, 3) 3269c472a0dSDavid Yang #define YT921X_LAG_GROUP_PORTS(x) FIELD_PREP(YT921X_LAG_GROUP_PORTS_M, (x)) 3279c472a0dSDavid Yang #define YT921X_LAG_GROUP_MEMBER_NUM_M GENMASK(2, 0) 3289c472a0dSDavid Yang #define YT921X_LAG_GROUP_MEMBER_NUM(x) FIELD_PREP(YT921X_LAG_GROUP_MEMBER_NUM_M, (x)) 3299c472a0dSDavid Yang #define YT921X_LAG_MEMBERnm(n, m) (0x1805b0 + 4 * (4 * (n) + (m))) 3309c472a0dSDavid Yang #define YT921X_LAG_MEMBER_PORT_M GENMASK(3, 0) 3319c472a0dSDavid Yang #define YT921X_LAG_MEMBER_PORT(x) FIELD_PREP(YT921X_LAG_MEMBER_PORT_M, (x)) 3329c472a0dSDavid Yang #define YT921X_CPU_COPY 0x180690 3339c472a0dSDavid Yang #define YT921X_CPU_COPY_FORCE_INT_PORT BIT(2) 3349c472a0dSDavid Yang #define YT921X_CPU_COPY_TO_INT_CPU BIT(1) 3359c472a0dSDavid Yang #define YT921X_CPU_COPY_TO_EXT_CPU BIT(0) 3369c472a0dSDavid Yang #define YT921X_ACL_PERMIT_UNMATCH 0x1806a0 3379c472a0dSDavid Yang #define YT921X_ACL_PERMIT_UNMATCH_PORTS_M GENMASK(10, 0) 3389c472a0dSDavid Yang #define YT921X_ACL_PERMIT_UNMATCH_PORTS(x) FIELD_PREP(YT921X_ACL_PERMIT_UNMATCH_PORTS_M, (x)) 3399c472a0dSDavid Yang #define YT921X_ACL_PERMIT_UNMATCH_PORTn(port) BIT(port) 3409c472a0dSDavid Yang #define YT921X_ACT_UNK_UCAST 0x180734 3419c472a0dSDavid Yang #define YT921X_ACT_UNK_MCAST 0x180738 3429c472a0dSDavid Yang #define YT921X_ACT_UNK_MCAST_BYPASS_DROP_RMA BIT(23) 3439c472a0dSDavid Yang #define YT921X_ACT_UNK_MCAST_BYPASS_DROP_IGMP BIT(22) 3449c472a0dSDavid Yang #define YT921X_ACT_UNK_ACTn_M(port) GENMASK(2 * (port) + 1, 2 * (port)) 3459c472a0dSDavid Yang #define YT921X_ACT_UNK_ACTn(port, x) ((x) << (2 * (port))) 3469c472a0dSDavid Yang #define YT921X_ACT_UNK_ACTn_FORWARD(port) YT921X_ACT_UNK_ACTn(port, 0) /* flood */ 3479c472a0dSDavid Yang #define YT921X_ACT_UNK_ACTn_TRAP(port) YT921X_ACT_UNK_ACTn(port, 1) /* steer to CPU */ 3489c472a0dSDavid Yang #define YT921X_ACT_UNK_ACTn_DROP(port) YT921X_ACT_UNK_ACTn(port, 2) /* discard */ 3499c472a0dSDavid Yang /* NEVER use this action; see comments in the tag driver */ 3509c472a0dSDavid Yang #define YT921X_ACT_UNK_ACTn_COPY(port) YT921X_ACT_UNK_ACTn(port, 3) /* flood and copy */ 3519c472a0dSDavid Yang #define YT921X_FDB_HW_FLUSH 0x180958 3529c472a0dSDavid Yang #define YT921X_FDB_HW_FLUSH_ON_LINKDOWN BIT(0) 3539c472a0dSDavid Yang 3549c472a0dSDavid Yang #define YT921X_VLANn_CTRL(vlan) (0x188000 + 8 * (vlan)) 3559c472a0dSDavid Yang #define YT921X_VLAN_CTRLb_UNTAG_PORTS_M GENMASK(18, 8) 3569c472a0dSDavid Yang #define YT921X_VLAN_CTRLb_UNTAG_PORTS(x) FIELD_PREP(YT921X_VLAN_CTRLb_UNTAG_PORTS_M, (x)) 3579c472a0dSDavid Yang #define YT921X_VLAN_CTRLb_UNTAG_PORTn(port) BIT((port) + 8) 3589c472a0dSDavid Yang #define YT921X_VLAN_CTRLb_STP_ID_M GENMASK(7, 4) 3599c472a0dSDavid Yang #define YT921X_VLAN_CTRLb_STP_ID(x) FIELD_PREP(YT921X_VLAN_CTRLb_STP_ID_M, (x)) 3609c472a0dSDavid Yang #define YT921X_VLAN_CTRLb_SVLAN_EN BIT(3) 3619c472a0dSDavid Yang #define YT921X_VLAN_CTRLab_FID_M GENMASK_ULL(34, 23) 3629c472a0dSDavid Yang #define YT921X_VLAN_CTRLab_FID(x) FIELD_PREP(YT921X_VLAN_CTRLab_FID_M, (x)) 3639c472a0dSDavid Yang #define YT921X_VLAN_CTRLa_LEARN_DIS BIT(22) 3649c472a0dSDavid Yang #define YT921X_VLAN_CTRLa_PRIO_EN BIT(21) 3659c472a0dSDavid Yang #define YT921X_VLAN_CTRLa_PRIO_M GENMASK(20, 18) 3669c472a0dSDavid Yang #define YT921X_VLAN_CTRLa_PRIO(x) FIELD_PREP(YT921X_VLAN_CTRLa_PRIO_M, (x)) 3679c472a0dSDavid Yang #define YT921X_VLAN_CTRLa_PORTS_M GENMASK(17, 7) 3689c472a0dSDavid Yang #define YT921X_VLAN_CTRLa_PORTS(x) FIELD_PREP(YT921X_VLAN_CTRLa_PORTS_M, (x)) 3699c472a0dSDavid Yang #define YT921X_VLAN_CTRLa_PORTn(port) BIT((port) + 7) 3709c472a0dSDavid Yang #define YT921X_VLAN_CTRLa_BYPASS_1X_AC BIT(6) 3719c472a0dSDavid Yang #define YT921X_VLAN_CTRLa_METER_EN BIT(5) 3729c472a0dSDavid Yang #define YT921X_VLAN_CTRLa_METER_ID_M GENMASK(4, 0) 3739c472a0dSDavid Yang 3749c472a0dSDavid Yang #define YT921X_TPID_IGRn(x) (0x210000 + 4 * (x)) /* [0, 3] */ 3759c472a0dSDavid Yang #define YT921X_TPID_IGR_TPID_M GENMASK(15, 0) 3769c472a0dSDavid Yang #define YT921X_PORTn_IGR_TPID(port) (0x210010 + 4 * (port)) 3779c472a0dSDavid Yang #define YT921X_PORT_IGR_TPIDn_STAG_M GENMASK(7, 4) 3789c472a0dSDavid Yang #define YT921X_PORT_IGR_TPIDn_STAG(x) BIT((x) + 4) 3799c472a0dSDavid Yang #define YT921X_PORT_IGR_TPIDn_CTAG_M GENMASK(3, 0) 3809c472a0dSDavid Yang #define YT921X_PORT_IGR_TPIDn_CTAG(x) BIT(x) 3819c472a0dSDavid Yang #define YT921X_LAG_HASH 0x210090 3829c472a0dSDavid Yang #define YT921X_LAG_HASH_L4_SPORT BIT(7) 3839c472a0dSDavid Yang #define YT921X_LAG_HASH_L4_DPORT BIT(6) 3849c472a0dSDavid Yang #define YT921X_LAG_HASH_IP_PROTO BIT(5) 3859c472a0dSDavid Yang #define YT921X_LAG_HASH_IP_SRC BIT(4) 3869c472a0dSDavid Yang #define YT921X_LAG_HASH_IP_DST BIT(3) 3879c472a0dSDavid Yang #define YT921X_LAG_HASH_MAC_SA BIT(2) 3889c472a0dSDavid Yang #define YT921X_LAG_HASH_MAC_DA BIT(1) 3899c472a0dSDavid Yang #define YT921X_LAG_HASH_SRC_PORT BIT(0) 3909c472a0dSDavid Yang 3919c472a0dSDavid Yang #define YT921X_PORTn_VLAN_CTRL(port) (0x230010 + 4 * (port)) 3929c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL_SVLAN_PRIO_EN BIT(31) 3939c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL_CVLAN_PRIO_EN BIT(30) 3949c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL_SVID_M GENMASK(29, 18) 3959c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL_SVID(x) FIELD_PREP(YT921X_PORT_VLAN_CTRL_SVID_M, (x)) 3969c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL_CVID_M GENMASK(17, 6) 3979c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL_CVID(x) FIELD_PREP(YT921X_PORT_VLAN_CTRL_CVID_M, (x)) 3989c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL_SVLAN_PRIO_M GENMASK(5, 3) 3999c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL_CVLAN_PRIO_M GENMASK(2, 0) 4009c472a0dSDavid Yang #define YT921X_PORTn_VLAN_CTRL1(port) (0x230080 + 4 * (port)) 4019c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL1_VLAN_RANGE_EN BIT(8) 4029c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL1_VLAN_RANGE_PROFILE_ID_M GENMASK(7, 4) 4039c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL1_SVLAN_DROP_TAGGED BIT(3) 4049c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL1_SVLAN_DROP_UNTAGGED BIT(2) 4059c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL1_CVLAN_DROP_TAGGED BIT(1) 4069c472a0dSDavid Yang #define YT921X_PORT_VLAN_CTRL1_CVLAN_DROP_UNTAGGED BIT(0) 4079c472a0dSDavid Yang 4089c472a0dSDavid Yang #define YT921X_EDATA_EXTMODE 0xfb 4099c472a0dSDavid Yang #define YT921X_EDATA_LEN 0x100 4109c472a0dSDavid Yang 4119c472a0dSDavid Yang #define YT921X_FDB_NUM 4096 4129c472a0dSDavid Yang 4139c472a0dSDavid Yang enum yt921x_fdb_entry_status { 4149c472a0dSDavid Yang YT921X_FDB_ENTRY_STATUS_INVALID = 0, 4159c472a0dSDavid Yang YT921X_FDB_ENTRY_STATUS_MIN_TIME = 1, 4169c472a0dSDavid Yang YT921X_FDB_ENTRY_STATUS_MOVE_AGING_MAX_TIME = 3, 4179c472a0dSDavid Yang YT921X_FDB_ENTRY_STATUS_MAX_TIME = 5, 4189c472a0dSDavid Yang YT921X_FDB_ENTRY_STATUS_PENDING = 6, 4199c472a0dSDavid Yang YT921X_FDB_ENTRY_STATUS_STATIC = 7, 4209c472a0dSDavid Yang }; 4219c472a0dSDavid Yang 4229c472a0dSDavid Yang #define YT921X_MSTI_NUM 16 4239c472a0dSDavid Yang 4249c472a0dSDavid Yang /* Custom meters only, not including dedicated port meters (11) */ 4259c472a0dSDavid Yang #define YT921X_METER_NUM 64 4269c472a0dSDavid Yang 4279c472a0dSDavid Yang #define YT921X_LAG_NUM 2 4289c472a0dSDavid Yang #define YT921X_LAG_PORT_NUM 4 4299c472a0dSDavid Yang 4309c472a0dSDavid Yang #define YT921X_PRIO_NUM 8 4319c472a0dSDavid Yang 4329c472a0dSDavid Yang #define YT9215_MAJOR 0x9002 4339c472a0dSDavid Yang #define YT9218_MAJOR 0x9001 4349c472a0dSDavid Yang 4359c472a0dSDavid Yang /* required for a hard reset */ 4369c472a0dSDavid Yang #define YT921X_RST_DELAY_US 10000 4379c472a0dSDavid Yang 4389c472a0dSDavid Yang #define YT921X_FRAME_SIZE_MAX 0x2400 /* 9216 */ 4399c472a0dSDavid Yang 4409c472a0dSDavid Yang #define YT921X_TAG_LEN 8 4419c472a0dSDavid Yang 4429c472a0dSDavid Yang #define YT921X_ACL_BLK_NUM 48 443*279d5c8aSDavid Yang #define YT921X_UDF_NUM 16 4449c472a0dSDavid Yang 4459af9a816SDavid Yang #define YT921X_LED_GROUP_NUM 3 4469af9a816SDavid Yang #define YT921X_LED_PORT_NUM 10 4479af9a816SDavid Yang 4489c472a0dSDavid Yang /* 8 internal + 2 external + 1 mcu */ 4499c472a0dSDavid Yang #define YT921X_PORT_NUM 11 4509c472a0dSDavid Yang 4519af9a816SDavid Yang #define YT921X_NAME "yt921x" 4529af9a816SDavid Yang 4539c472a0dSDavid Yang struct yt921x_port { 4549c472a0dSDavid Yang unsigned char index; 4559c472a0dSDavid Yang 45607b60e1bSDavid Yang /* SerDes in use */ 45707b60e1bSDavid Yang bool serdes:1; 4584b8fbb87SDavid Yang /* Link from in-band status (PHYLINK_PCS_NEG_INBAND) */ 4594b8fbb87SDavid Yang bool inband:1; 46007b60e1bSDavid Yang /* BR_HAIRPIN_MODE */ 46107b60e1bSDavid Yang bool hairpin:1; 46207b60e1bSDavid Yang /* BR_ISOLATED */ 46307b60e1bSDavid Yang bool isolated:1; 4649c472a0dSDavid Yang 46573db071aSDavid Yang unsigned short acl_cnt; 46673db071aSDavid Yang 4679af9a816SDavid Yang #if IS_ENABLED(CONFIG_NET_DSA_YT921X_LEDS) 4689af9a816SDavid Yang unsigned char led_duty; 4699af9a816SDavid Yang unsigned short led_cycle; 4709af9a816SDavid Yang 4719af9a816SDavid Yang unsigned char led_duty_mask; 4729af9a816SDavid Yang unsigned char led_cycle_mask; 4739af9a816SDavid Yang 4749af9a816SDavid Yang struct yt921x_led *leds[YT921X_LED_GROUP_NUM]; 4759af9a816SDavid Yang #endif 4764b8fbb87SDavid Yang 477a219b5eaSDavid Yang struct yt921x_mib *mib; 4784b8fbb87SDavid Yang struct phylink_pcs pcs; 4799c472a0dSDavid Yang }; 4809c472a0dSDavid Yang 4814b8fbb87SDavid Yang #define pcs_to_yt921x_port(_pcs) container_of((_pcs), struct yt921x_port, pcs) 4824b8fbb87SDavid Yang 4839c472a0dSDavid Yang struct yt921x_reg_ops { 4849c472a0dSDavid Yang int (*read)(void *context, u32 reg, u32 *valp); 4859c472a0dSDavid Yang int (*write)(void *context, u32 reg, u32 val); 4869c472a0dSDavid Yang }; 4879c472a0dSDavid Yang 488605597afSDavid Yang struct yt921x_info { 489605597afSDavid Yang const char *name; 490605597afSDavid Yang u16 major; 491605597afSDavid Yang /* Unknown, seems to be plain enumeration */ 492605597afSDavid Yang u8 mode; 493605597afSDavid Yang u8 extmode; 494605597afSDavid Yang /* Ports with integral GbE PHYs, not including MCU Port 10 */ 495605597afSDavid Yang u16 internal_mask; 496605597afSDavid Yang /* Note: xmii_mask and serdes_mask may overlap */ 497605597afSDavid Yang u16 xmii_mask; 498605597afSDavid Yang u16 serdes_mask; 499605597afSDavid Yang }; 500605597afSDavid Yang 501a219b5eaSDavid Yang static inline u16 yt921x_info_ports_mask(const struct yt921x_info *info) 502a219b5eaSDavid Yang { 503a219b5eaSDavid Yang return info->internal_mask | info->xmii_mask | info->serdes_mask; 504a219b5eaSDavid Yang } 505a219b5eaSDavid Yang 5069c472a0dSDavid Yang struct yt921x_priv { 5079c472a0dSDavid Yang struct dsa_switch ds; 5089c472a0dSDavid Yang 5099c472a0dSDavid Yang const struct yt921x_info *info; 5109c472a0dSDavid Yang unsigned int meter_slot_ns; 5119c472a0dSDavid Yang unsigned int port_shape_slot_ns; 5129c472a0dSDavid Yang /* cache of dsa_cpu_ports(ds) */ 5139c472a0dSDavid Yang u16 cpu_ports_mask; 5149c472a0dSDavid Yang unsigned char cycle_ns; 5159c472a0dSDavid Yang 5169c472a0dSDavid Yang /* protect the access to the switch registers */ 5179c472a0dSDavid Yang struct mutex reg_lock; 5189c472a0dSDavid Yang const struct yt921x_reg_ops *reg_ops; 5199c472a0dSDavid Yang void *reg_ctx; 5209c472a0dSDavid Yang 5219c472a0dSDavid Yang /* mdio master bus */ 5229c472a0dSDavid Yang struct mii_bus *mbus_int; 5239c472a0dSDavid Yang struct mii_bus *mbus_ext; 5249c472a0dSDavid Yang 5259c472a0dSDavid Yang struct yt921x_port ports[YT921X_PORT_NUM]; 5269c472a0dSDavid Yang 5279c472a0dSDavid Yang u16 eee_ports_mask; 5289c472a0dSDavid Yang 5299c472a0dSDavid Yang DECLARE_BITMAP(meters_map, YT921X_METER_NUM); 5309c472a0dSDavid Yang 5319c472a0dSDavid Yang u8 acl_masks[YT921X_ACL_BLK_NUM]; 5329c472a0dSDavid Yang struct yt921x_acl_blk *acl_blks[YT921X_ACL_BLK_NUM]; 5339c472a0dSDavid Yang }; 5349c472a0dSDavid Yang 535cece0b57SDavid Yang #define dsa_to_yt921x_priv(_ds) container_of_const(_ds, struct yt921x_priv, ds) 536c9996cf7SDavid Yang #define yt921x_port_to_priv(pp) \ 537c9996cf7SDavid Yang container_of_const((pp), struct yt921x_priv, ports[(pp)->index]) 538cece0b57SDavid Yang #define yt921x_priv_to_device(priv) ((priv)->ds.dev) 539c9996cf7SDavid Yang 5405423f892SDavid Yang static inline int ethtool_speed_to_yt921x(int speed) 5415423f892SDavid Yang { 5425423f892SDavid Yang switch (speed) { 5435423f892SDavid Yang case SPEED_10: 5445423f892SDavid Yang return YT921X_SPEED_10; 5455423f892SDavid Yang case SPEED_100: 5465423f892SDavid Yang return YT921X_SPEED_100; 5475423f892SDavid Yang case SPEED_1000: 5485423f892SDavid Yang return YT921X_SPEED_1000; 5495423f892SDavid Yang case SPEED_2500: 5505423f892SDavid Yang return YT921X_SPEED_2500; 5515423f892SDavid Yang case SPEED_10000: 5525423f892SDavid Yang return YT921X_SPEED_10000; 5535423f892SDavid Yang default: 5545423f892SDavid Yang return YT921X_SPEED_INVALID; 5555423f892SDavid Yang } 5565423f892SDavid Yang } 5575423f892SDavid Yang 558ba13bd27SDavid Yang static inline u32 ethaddr_hi4_to_u32(const unsigned char *addr) 559ba13bd27SDavid Yang { 560ba13bd27SDavid Yang return (addr[0] << 24) | (addr[1] << 16) | (addr[2] << 8) | addr[3]; 561ba13bd27SDavid Yang } 562ba13bd27SDavid Yang 563ba13bd27SDavid Yang static inline u32 ethaddr_lo2_to_u32(const unsigned char *addr) 564ba13bd27SDavid Yang { 565ba13bd27SDavid Yang return (addr[4] << 8) | addr[5]; 566ba13bd27SDavid Yang } 567ba13bd27SDavid Yang 5689c472a0dSDavid Yang #endif 569