| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 | 
							- /* SPDX-License-Identifier: GPL-2.0-only */
 
- #ifndef _RTL838X_H
 
- #define _RTL838X_H
 
- #include <net/dsa.h>
 
- /*
 
-  * Register definition
 
-  */
 
- #define RTL838X_MAC_PORT_CTRL(port)		(0xd560 + (((port) << 7)))
 
- #define RTL839X_MAC_PORT_CTRL(port)		(0x8004 + (((port) << 7)))
 
- #define RTL930X_MAC_PORT_CTRL(port)		(0x3260 + (((port) << 6)))
 
- #define RTL930X_MAC_L2_PORT_CTRL(port)		(0x3268 + (((port) << 6)))
 
- #define RTL931X_MAC_PORT_CTRL(port)		(0x6004 + (((port) << 7)))
 
- #define RTL838X_RST_GLB_CTRL_0			(0x003c)
 
- #define RTL838X_MAC_FORCE_MODE_CTRL		(0xa104)
 
- #define RTL839X_MAC_FORCE_MODE_CTRL		(0x02bc)
 
- #define RTL930X_MAC_FORCE_MODE_CTRL		(0xCA1C)
 
- #define RTL931X_MAC_FORCE_MODE_CTRL		(0x0DCC)
 
- #define RTL838X_DMY_REG31			(0x3b28)
 
- #define RTL838X_SDS_MODE_SEL			(0x0028)
 
- #define RTL838X_SDS_CFG_REG			(0x0034)
 
- #define RTL838X_INT_MODE_CTRL			(0x005c)
 
- #define RTL838X_CHIP_INFO			(0x00d8)
 
- #define RTL839X_CHIP_INFO			(0x0ff4)
 
- #define RTL838X_PORT_ISO_CTRL(port)		(0x4100 + ((port) << 2))
 
- #define RTL839X_PORT_ISO_CTRL(port)		(0x1400 + ((port) << 3))
 
- /* Packet statistics */
 
- #define RTL838X_STAT_PORT_STD_MIB		(0x1200)
 
- #define RTL839X_STAT_PORT_STD_MIB		(0xC000)
 
- #define RTL930X_STAT_PORT_MIB_CNTR		(0x0664)
 
- #define RTL838X_STAT_RST			(0x3100)
 
- #define RTL839X_STAT_RST			(0xF504)
 
- #define RTL930X_STAT_RST			(0x3240)
 
- #define RTL931X_STAT_RST			(0x7ef4)
 
- #define RTL838X_STAT_PORT_RST			(0x3104)
 
- #define RTL839X_STAT_PORT_RST			(0xF508)
 
- #define RTL930X_STAT_PORT_RST			(0x3244)
 
- #define RTL931X_STAT_PORT_RST			(0x7ef8)
 
- #define RTL838X_STAT_CTRL			(0x3108)
 
- #define RTL839X_STAT_CTRL			(0x04cc)
 
- #define RTL930X_STAT_CTRL			(0x3248)
 
- #define RTL931X_STAT_CTRL			(0x5720)
 
- /* Registers of the internal Serdes of the 8390 */
 
- #define RTL8390_SDS0_1_XSG0			(0xA000)
 
- #define RTL8390_SDS0_1_XSG1			(0xA100)
 
- #define RTL839X_SDS12_13_XSG0			(0xB800)
 
- #define RTL839X_SDS12_13_XSG1			(0xB900)
 
- #define RTL839X_SDS12_13_PWR0			(0xb880)
 
- #define RTL839X_SDS12_13_PWR1			(0xb980)
 
- /* Registers of the internal Serdes of the 8380 */
 
- #define RTL838X_SDS4_FIB_REG0			(0xF800)
 
- #define RTL838X_SDS4_REG28			(0xef80)
 
- #define RTL838X_SDS4_DUMMY0			(0xef8c)
 
- #define RTL838X_SDS5_EXT_REG6			(0xf18c)
 
- /* VLAN registers */
 
- #define RTL838X_VLAN_CTRL			(0x3A74)
 
- #define RTL838X_VLAN_PROFILE(idx)		(0x3A88 + ((idx) << 2))
 
- #define RTL838X_VLAN_PORT_EGR_FLTR		(0x3A84)
 
- #define RTL838X_VLAN_PORT_PB_VLAN		(0x3C00)
 
- #define RTL838X_VLAN_PORT_IGR_FLTR(port)	(0x3A7C + (((port >> 4) << 2)))
 
- #define RTL838X_VLAN_PORT_IGR_FLTR_0		(0x3A7C)
 
- #define RTL838X_VLAN_PORT_IGR_FLTR_1		(0x3A7C + 4)
 
- #define RTL838X_VLAN_PORT_TAG_STS_CTRL		(0xA530)
 
- #define RTL839X_VLAN_PROFILE(idx)		(0x25C0 + (((idx) << 3)))
 
- #define RTL839X_VLAN_CTRL			(0x26D4)
 
- #define RTL839X_VLAN_PORT_PB_VLAN		(0x26D8)
 
- #define RTL839X_VLAN_PORT_IGR_FLTR(port)	(0x27B4 + (((port >> 4) << 2)))
 
- #define RTL839X_VLAN_PORT_EGR_FLTR(port)	(0x27C4 + (((port >> 5) << 2)))
 
- #define RTL839X_VLAN_PORT_TAG_STS_CTRL		(0x6828)
 
- #define RTL930X_VLAN_PROFILE_SET(idx)		(0x9c60 + (((idx) * 20)))
 
- #define RTL930X_VLAN_CTRL			(0x82D4)
 
- #define RTL930X_VLAN_PORT_PB_VLAN		(0x82D8)
 
- #define RTL930X_VLAN_PORT_IGR_FLTR(port)	(0x83C0 + (((port >> 4) << 2)))
 
- #define RTL930X_VLAN_PORT_EGR_FLTR		(0x83C8)
 
- #define RTL930X_VLAN_PORT_TAG_STS_CTRL		(0xCE24)
 
- #define RTL931X_VLAN_PROFILE_SET(idx)		(0x9800 + (((idx) * 28)))
 
- #define RTL931X_VLAN_CTRL			(0x94E4)
 
- #define RTL931X_VLAN_PORT_IGR_FLTR(port)	(0x96B4 + (((port >> 4) << 2)))
 
- #define RTL931X_VLAN_PORT_EGR_FLTR(port)	(0x96C4 + (((port >> 5) << 2)))
 
- #define RTL931X_VLAN_PORT_TAG_CTRL		(0x4860)
 
- /* Table access registers */
 
- #define RTL838X_TBL_ACCESS_CTRL_0		(0x6914)
 
- #define RTL838X_TBL_ACCESS_DATA_0(idx)		(0x6918 + ((idx) << 2))
 
- #define RTL838X_TBL_ACCESS_CTRL_1		(0xA4C8)
 
- #define RTL838X_TBL_ACCESS_DATA_1(idx)		(0xA4CC + ((idx) << 2))
 
- #define RTL839X_TBL_ACCESS_CTRL_0		(0x1190)
 
- #define RTL839X_TBL_ACCESS_DATA_0(idx)		(0x1194 + ((idx) << 2))
 
- #define RTL839X_TBL_ACCESS_CTRL_1		(0x6b80)
 
- #define RTL839X_TBL_ACCESS_DATA_1(idx)		(0x6b84 + ((idx) << 2))
 
- #define RTL839X_TBL_ACCESS_CTRL_2		(0x611C)
 
- #define RTL839X_TBL_ACCESS_DATA_2(i)		(0x6120 + (((i) << 2)))
 
- #define RTL930X_TBL_ACCESS_CTRL_0		(0xB340)
 
- #define RTL930X_TBL_ACCESS_DATA_0(idx)		(0xB344 + ((idx) << 2))
 
- #define RTL930X_TBL_ACCESS_CTRL_1		(0xB3A0)
 
- #define RTL930X_TBL_ACCESS_DATA_1(idx)		(0xB3A4 + ((idx) << 2))
 
- #define RTL930X_TBL_ACCESS_CTRL_2		(0xCE04)
 
- #define RTL930X_TBL_ACCESS_DATA_2(i)		(0xCE08 + (((i) << 2)))
 
- #define RTL931X_TBL_ACCESS_CTRL_0		(0x8500)
 
- #define RTL931X_TBL_ACCESS_DATA_0(idx)		(0x8508 + ((idx) << 2))
 
- #define RTL931X_TBL_ACCESS_CTRL_1		(0x40C0)
 
- #define RTL931X_TBL_ACCESS_DATA_1(idx)		(0x40C4 + ((idx) << 2))
 
- #define RTL931X_TBL_ACCESS_CTRL_2		(0x8528)
 
- #define RTL931X_TBL_ACCESS_DATA_2(i)		(0x852C + (((i) << 2)))
 
- #define RTL931X_TBL_ACCESS_CTRL_3		(0x0200)
 
- #define RTL931X_TBL_ACCESS_DATA_3(i)		(0x0204 + (((i) << 2)))
 
- #define RTL931X_TBL_ACCESS_CTRL_4		(0x20DC)
 
- #define RTL931X_TBL_ACCESS_DATA_4(i)		(0x20E0 + (((i) << 2)))
 
- #define RTL931X_TBL_ACCESS_CTRL_5		(0x7E1C)
 
- #define RTL931X_TBL_ACCESS_DATA_5(i)		(0x7E20 + (((i) << 2)))
 
- /* MAC handling */
 
- #define RTL838X_MAC_LINK_STS			(0xa188)
 
- #define RTL839X_MAC_LINK_STS			(0x0390)
 
- #define RTL930X_MAC_LINK_STS			(0xCB10)
 
- #define RTL931X_MAC_LINK_STS			(0x0EC0)
 
- #define RTL838X_MAC_LINK_SPD_STS(p)		(0xa190 + (((p >> 4) << 2)))
 
- #define RTL839X_MAC_LINK_SPD_STS(p)		(0x03a0 + (((p >> 4) << 2)))
 
- #define RTL930X_MAC_LINK_SPD_STS(p)		(0xCB18 + (((p >> 3) << 2)))
 
- #define RTL931X_MAC_LINK_SPD_STS(p)		(0x0ED0 + (((p >> 3) << 2)))
 
- #define RTL838X_MAC_LINK_DUP_STS		(0xa19c)
 
- #define RTL839X_MAC_LINK_DUP_STS		(0x03b0)
 
- #define RTL930X_MAC_LINK_DUP_STS		(0xCB28)
 
- #define RTL931X_MAC_LINK_DUP_STS		(0x0EF0)
 
- #define RTL838X_MAC_TX_PAUSE_STS		(0xa1a0)
 
- #define RTL839X_MAC_TX_PAUSE_STS		(0x03b8)
 
- #define RTL930X_MAC_TX_PAUSE_STS		(0xCB2C)
 
- #define RTL931X_MAC_TX_PAUSE_STS		(0x0EF8)
 
- #define RTL838X_MAC_RX_PAUSE_STS		(0xa1a4)
 
- #define RTL839X_MAC_RX_PAUSE_STS		(0x03c0)
 
- #define RTL930X_MAC_RX_PAUSE_STS		(0xCB30)
 
- #define RTL931X_MAC_RX_PAUSE_STS		(0x0F00)
 
- /* MAC link state bits */
 
- #define FORCE_EN				(1 << 0)
 
- #define FORCE_LINK_EN				(1 << 1)
 
- #define NWAY_EN					(1 << 2)
 
- #define DUPLX_MODE				(1 << 3)
 
- #define TX_PAUSE_EN				(1 << 6)
 
- #define RX_PAUSE_EN				(1 << 7)
 
- /* EEE */
 
- #define RTL838X_MAC_EEE_ABLTY			(0xa1a8)
 
- #define RTL838X_EEE_PORT_TX_EN			(0x014c)
 
- #define RTL838X_EEE_PORT_RX_EN			(0x0150)
 
- #define RTL838X_EEE_CLK_STOP_CTRL		(0x0148)
 
- #define RTL838X_EEE_TX_TIMER_GIGA_CTRL		(0xaa04)
 
- #define RTL838X_EEE_TX_TIMER_GELITE_CTRL	(0xaa08)
 
- #define RTL839X_EEE_TX_TIMER_GELITE_CTRL	(0x042C)
 
- #define RTL839X_EEE_TX_TIMER_GIGA_CTRL		(0x0430)
 
- #define RTL839X_EEE_TX_TIMER_10G_CTRL		(0x0434)
 
- #define RTL839X_EEE_CTRL(p)			(0x8008 + ((p) << 7))
 
- #define RTL839X_MAC_EEE_ABLTY			(0x03C8)
 
- #define RTL930X_MAC_EEE_ABLTY			(0xCB34)
 
- #define RTL930X_EEE_CTRL(p)			(0x3274 + ((p) << 6))
 
- #define RTL930X_EEEP_PORT_CTRL(p)		(0x3278 + ((p) << 6))
 
- /* L2 functionality */
 
- #define RTL838X_L2_CTRL_0			(0x3200)
 
- #define RTL839X_L2_CTRL_0			(0x3800)
 
- #define RTL930X_L2_CTRL				(0x8FD8)
 
- #define RTL931X_L2_CTRL				(0xC800)
 
- #define RTL838X_L2_CTRL_1			(0x3204)
 
- #define RTL839X_L2_CTRL_1			(0x3804)
 
- #define RTL930X_L2_AGE_CTRL			(0x8FDC)
 
- #define RTL931X_L2_AGE_CTRL			(0xC804)
 
- #define RTL838X_L2_PORT_AGING_OUT		(0x3358)
 
- #define RTL839X_L2_PORT_AGING_OUT		(0x3b74)
 
- #define	RTL930X_L2_PORT_AGE_CTRL		(0x8FE0)
 
- #define	RTL931X_L2_PORT_AGE_CTRL		(0xc808)
 
- #define RTL838X_TBL_ACCESS_L2_CTRL		(0x6900)
 
- #define RTL839X_TBL_ACCESS_L2_CTRL		(0x1180)
 
- #define RTL930X_TBL_ACCESS_L2_CTRL		(0xB320)
 
- #define RTL930X_TBL_ACCESS_L2_METHOD_CTRL	(0xB324)
 
- #define RTL838X_TBL_ACCESS_L2_DATA(idx)		(0x6908 + ((idx) << 2))
 
- #define RTL839X_TBL_ACCESS_L2_DATA(idx)		(0x1184 + ((idx) << 2))
 
- #define RTL930X_TBL_ACCESS_L2_DATA(idx)		(0xab08 + ((idx) << 2))
 
- #define RTL838X_L2_TBL_FLUSH_CTRL		(0x3370)
 
- #define RTL839X_L2_TBL_FLUSH_CTRL		(0x3ba0)
 
- #define RTL930X_L2_TBL_FLUSH_CTRL		(0x9404)
 
- #define RTL931X_L2_TBL_FLUSH_CTRL		(0xCD9C)
 
- #define RTL838X_L2_PORT_NEW_SALRN(p)		(0x328c + (((p >> 4) << 2)))
 
- #define RTL839X_L2_PORT_NEW_SALRN(p)		(0x38F0 + (((p >> 4) << 2)))
 
- #define RTL930X_L2_PORT_SALRN(p)		(0x8FEC + (((p >> 4) << 2)))
 
- #define RTL931X_L2_PORT_NEW_SALRN(p)		(0xC820 + (((p >> 4) << 2)))
 
- #define RTL838X_L2_PORT_NEW_SA_FWD(p)		(0x3294 + (((p >> 4) << 2)))
 
- #define RTL839X_L2_PORT_NEW_SA_FWD(p)		(0x3900 + (((p >> 4) << 2)))
 
- #define RTL930X_L2_PORT_NEW_SA_FWD(p)		(0x8FF4 + (((p / 10) << 2)))
 
- #define RTL931X_L2_PORT_NEW_SA_FWD(p)		(0xC830 + (((p / 10) << 2)))
 
- #define RTL930X_ST_CTRL				(0x8798)
 
- #define RTL930X_L2_PORT_SABLK_CTRL		(0x905c)
 
- #define RTL930X_L2_PORT_DABLK_CTRL		(0x9060)
 
- #define RTL838X_RMA_BPDU_FLD_PMSK		(0x4348)
 
- #define RTL930X_RMA_BPDU_FLD_PMSK		(0x9F18)
 
- #define RTL931X_RMA_BPDU_FLD_PMSK		(0x8950)
 
- #define RTL839X_RMA_BPDU_FLD_PMSK		(0x125C)
 
- #define RTL838X_L2_PORT_LM_ACT(p)		(0x3208 + ((p) << 2))
 
- #define RTL838X_VLAN_PORT_FWD			(0x3A78)
 
- #define RTL839X_VLAN_PORT_FWD			(0x27AC)
 
- #define RTL930X_VLAN_PORT_FWD			(0x834C)
 
- #define RTL838X_VLAN_FID_CTRL			(0x3aa8)
 
- /* Port Mirroring */
 
- #define RTL838X_MIR_CTRL			(0x5D00)
 
- #define RTL838X_MIR_DPM_CTRL			(0x5D20)
 
- #define RTL838X_MIR_SPM_CTRL			(0x5D10)
 
- #define RTL839X_MIR_CTRL			(0x2500)
 
- #define RTL839X_MIR_DPM_CTRL			(0x2530)
 
- #define RTL839X_MIR_SPM_CTRL			(0x2510)
 
- #define RTL930X_MIR_CTRL			(0xA2A0)
 
- #define RTL930X_MIR_DPM_CTRL			(0xA2C0)
 
- #define RTL930X_MIR_SPM_CTRL			(0xA2B0)
 
- #define RTL931X_MIR_CTRL			(0xAF00)
 
- #define RTL931X_MIR_DPM_CTRL			(0xAF30)
 
- #define RTL931X_MIR_SPM_CTRL			(0xAF10)
 
- /* Storm/rate control and scheduling */
 
- #define RTL838X_STORM_CTRL			(0x4700)
 
- #define RTL839X_STORM_CTRL			(0x1800)
 
- #define RTL838X_STORM_CTRL_LB_CTRL(p)		(0x4884 + (((p) << 2)))
 
- #define RTL838X_STORM_CTRL_BURST_PPS_0		(0x4874)
 
- #define RTL838X_STORM_CTRL_BURST_PPS_1		(0x4878)
 
- #define RTL838X_STORM_CTRL_BURST_0		(0x487c)
 
- #define RTL838X_STORM_CTRL_BURST_1		(0x4880)
 
- #define RTL839X_STORM_CTRL_LB_TICK_TKN_CTRL_0	(0x1804)
 
- #define RTL839X_STORM_CTRL_LB_TICK_TKN_CTRL_1	(0x1808)
 
- #define RTL838X_SCHED_CTRL			(0xB980)
 
- #define RTL839X_SCHED_CTRL			(0x60F4)
 
- #define RTL838X_SCHED_LB_TICK_TKN_CTRL_0	(0xAD58)
 
- #define RTL838X_SCHED_LB_TICK_TKN_CTRL_1	(0xAD5C)
 
- #define RTL839X_SCHED_LB_TICK_TKN_CTRL_0	(0x1804)
 
- #define RTL839X_SCHED_LB_TICK_TKN_CTRL_1	(0x1808)
 
- #define RTL839X_STORM_CTRL_SPCL_LB_TICK_TKN_CTRL (0x2000)
 
- #define RTL839X_IGR_BWCTRL_LB_TICK_TKN_CTRL_0	(0x1604)
 
- #define RTL839X_IGR_BWCTRL_LB_TICK_TKN_CTRL_1	(0x1608)
 
- #define RTL839X_SCHED_LB_TICK_TKN_CTRL		(0x60F8)
 
- #define RTL839X_SCHED_LB_TICK_TKN_PPS_CTRL	(0x6200)
 
- #define RTL838X_SCHED_LB_THR			(0xB984)
 
- #define RTL839X_SCHED_LB_THR			(0x60FC)
 
- #define RTL838X_SCHED_P_EGR_RATE_CTRL(p)	(0xC008 + (((p) << 7)))
 
- #define RTL838X_SCHED_Q_EGR_RATE_CTRL(p, q)	(0xC00C + (p << 7) + (((q) << 2)))
 
- #define RTL838X_STORM_CTRL_PORT_BC_EXCEED	(0x470C)
 
- #define RTL838X_STORM_CTRL_PORT_MC_EXCEED	(0x4710)
 
- #define RTL838X_STORM_CTRL_PORT_UC_EXCEED	(0x4714)
 
- #define RTL839X_STORM_CTRL_PORT_BC_EXCEED(p)	(0x180c + (((p >> 5) << 2)))
 
- #define RTL839X_STORM_CTRL_PORT_MC_EXCEED(p)	(0x1814 + (((p >> 5) << 2)))
 
- #define RTL839X_STORM_CTRL_PORT_UC_EXCEED(p)	(0x181c + (((p >> 5) << 2)))
 
- #define RTL838X_STORM_CTRL_PORT_UC(p)		(0x4718 + (((p) << 2)))
 
- #define RTL838X_STORM_CTRL_PORT_MC(p)		(0x478c + (((p) << 2)))
 
- #define RTL838X_STORM_CTRL_PORT_BC(p)		(0x4800 + (((p) << 2)))
 
- #define RTL839X_STORM_CTRL_PORT_UC_0(p)		(0x185C + (((p) << 3)))
 
- #define RTL839X_STORM_CTRL_PORT_UC_1(p)		(0x1860 + (((p) << 3)))
 
- #define RTL839X_STORM_CTRL_PORT_MC_0(p)		(0x19FC + (((p) << 3)))
 
- #define RTL839X_STORM_CTRL_PORT_MC_1(p)		(0x1a00 + (((p) << 3)))
 
- #define RTL839X_STORM_CTRL_PORT_BC_0(p)		(0x1B9C + (((p) << 3)))
 
- #define RTL839X_STORM_CTRL_PORT_BC_1(p)		(0x1BA0 + (((p) << 3)))
 
- #define RTL839X_TBL_ACCESS_CTRL_2		(0x611C)
 
- #define RTL839X_TBL_ACCESS_DATA_2(i)		(0x6120 + (((i) << 2)))
 
- #define RTL839X_IGR_BWCTRL_PORT_CTRL_10G_0(p)	(0x1618 + (((p) << 3)))
 
- #define RTL839X_IGR_BWCTRL_PORT_CTRL_10G_1(p)	(0x161C + (((p) << 3)))
 
- #define RTL839X_IGR_BWCTRL_PORT_CTRL_0(p)	(0x1640 + (((p) << 3)))
 
- #define RTL839X_IGR_BWCTRL_PORT_CTRL_1(p)	(0x1644 + (((p) << 3)))
 
- #define RTL839X_IGR_BWCTRL_CTRL_LB_THR		(0x1614)
 
- /* Link aggregation (Trunking) */
 
- #define RTL839X_TRK_MBR_CTR			(0x2200)
 
- #define RTL838X_TRK_MBR_CTR			(0x3E00)
 
- #define RTL930X_TRK_MBR_CTRL			(0xA41C)
 
- #define RTL931X_TRK_MBR_CTRL			(0xB8D0)
 
- /* Attack prevention */
 
- #define RTL838X_ATK_PRVNT_PORT_EN		(0x5B00)
 
- #define RTL838X_ATK_PRVNT_CTRL			(0x5B04)
 
- #define RTL838X_ATK_PRVNT_ACT			(0x5B08)
 
- #define RTL838X_ATK_PRVNT_STS			(0x5B1C)
 
- /* 802.1X */
 
- #define RTL838X_SPCL_TRAP_EAPOL_CTRL		(0x6988)
 
- #define RTL839X_SPCL_TRAP_EAPOL_CTRL		(0x105C)
 
- /* QoS */
 
- #define RTL838X_QM_INTPRI2QID_CTRL		(0x5F00)
 
- #define RTL839X_QM_INTPRI2QID_CTRL(q)		(0x1110 + (q << 2))
 
- #define RTL839X_QM_PORT_QNUM(p)			(0x1130 + (((p / 10) << 2)))
 
- #define RTL838X_PRI_SEL_PORT_PRI(p)		(0x5FB8 + (((p / 10) << 2)))
 
- #define RTL839X_PRI_SEL_PORT_PRI(p)		(0x10A8 + (((p / 10) << 2)))
 
- #define RTL838X_QM_PKT2CPU_INTPRI_MAP		(0x5F10)
 
- #define RTL839X_QM_PKT2CPU_INTPRI_MAP		(0x1154)
 
- #define RTL838X_PRI_SEL_CTRL			(0x10E0)
 
- #define RTL839X_PRI_SEL_CTRL			(0x10E0)
 
- #define RTL838X_PRI_SEL_TBL_CTRL(i)		(0x5FD8 + (((i) << 2)))
 
- #define RTL839X_PRI_SEL_TBL_CTRL(i)		(0x10D0 + (((i) << 2)))
 
- #define RTL838X_QM_PKT2CPU_INTPRI_0		(0x5F04)
 
- #define RTL838X_QM_PKT2CPU_INTPRI_1		(0x5F08)
 
- #define RTL838X_QM_PKT2CPU_INTPRI_2		(0x5F0C)
 
- #define RTL839X_OAM_CTRL			(0x2100)
 
- #define RTL839X_OAM_PORT_ACT_CTRL(p)	 	(0x2104 + (((p) << 2)))
 
- #define RTL839X_RMK_PORT_DEI_TAG_CTRL(p)	(0x6A9C + (((p >> 5) << 2)))
 
- #define RTL839X_PRI_SEL_IPRI_REMAP		(0x1080)
 
- #define RTL838X_PRI_SEL_IPRI_REMAP		(0x5F8C)
 
- #define RTL839X_PRI_SEL_DEI2DP_REMAP		(0x10EC)
 
- #define RTL839X_PRI_SEL_DSCP2DP_REMAP_ADDR(i)	(0x10F0 + (((i >> 4) << 2)))
 
- #define RTL839X_RMK_DEI_CTRL			(0x6AA4)
 
- #define RTL839X_WRED_PORT_THR_CTRL(i)		(0x6084 + ((i) << 2))
 
- #define RTL839X_WRED_QUEUE_THR_CTRL(q, i) 	(0x6090 + ((q) * 12) + ((i) << 2))
 
- #define RTL838X_PRI_DSCP_INVLD_CTRL0		(0x5FE8)
 
- #define RTL838X_RMK_IPRI_CTRL			(0xA460)
 
- #define RTL838X_RMK_OPRI_CTRL			(0xA464)
 
- #define RTL838X_SCHED_P_TYPE_CTRL(p)		(0xC04C + (((p) << 7)))
 
- #define RTL838X_SCHED_LB_CTRL(p)		(0xC004 + (((p) << 7)))
 
- #define RTL838X_FC_P_EGR_DROP_CTRL(p)		(0x6B1C + (((p) << 2)))
 
- /* Debug features */
 
- #define RTL930X_STAT_PRVTE_DROP_COUNTER0	(0xB5B8)
 
- #define MAX_VLANS 4096
 
- #define MAX_LAGS 16
 
- #define MAX_PRIOS 8
 
- #define RTL930X_PORT_IGNORE 0x3f
 
- #define MAX_MC_GROUPS 512
 
- #define UNKNOWN_MC_PMASK (MAX_MC_GROUPS - 1)
 
- enum phy_type {
 
- 	PHY_NONE = 0,
 
- 	PHY_RTL838X_SDS = 1,
 
- 	PHY_RTL8218B_INT = 2,
 
- 	PHY_RTL8218B_EXT = 3,
 
- 	PHY_RTL8214FC = 4,
 
- 	PHY_RTL839X_SDS = 5,
 
- };
 
- struct rtl838x_port {
 
- 	bool enable;
 
- 	u64 pm;
 
- 	u16 pvid;
 
- 	bool eee_enabled;
 
- 	enum phy_type phy;
 
- 	bool is10G;
 
- 	bool is2G5;
 
- 	u8 sds_num;
 
- 	const struct dsa_port *dp;
 
- };
 
- struct rtl838x_vlan_info {
 
- 	u64 untagged_ports;
 
- 	u64 tagged_ports;
 
- 	u8 profile_id;
 
- 	bool hash_mc_fid;
 
- 	bool hash_uc_fid;
 
- 	u8 fid;
 
- };
 
- enum l2_entry_type {
 
- 	L2_INVALID = 0,
 
- 	L2_UNICAST = 1,
 
- 	L2_MULTICAST = 2,
 
- 	IP4_MULTICAST = 3,
 
- 	IP6_MULTICAST = 4,
 
- };
 
- struct rtl838x_l2_entry {
 
- 	u8 mac[6];
 
- 	u16 vid;
 
- 	u16 rvid;
 
- 	u8 port;
 
- 	bool valid;
 
- 	enum l2_entry_type type;
 
- 	bool is_static;
 
- 	bool is_ip_mc;
 
- 	bool is_ipv6_mc;
 
- 	bool block_da;
 
- 	bool block_sa;
 
- 	bool suspended;
 
- 	bool next_hop;
 
- 	int age;
 
- 	u8 trunk;
 
- 	bool is_trunk;
 
- 	u8 stack_dev;
 
- 	u16 mc_portmask_index;
 
- 	u32 mc_gip;
 
- 	u32 mc_sip;
 
- 	u16 mc_mac_index;
 
- 	u16 nh_route_id;
 
- 	bool nh_vlan_target;  // Only RTL83xx: VLAN used for next hop
 
- };
 
- struct rtl838x_nexthop {
 
- 	u16 id;		// ID in HW Nexthop table
 
- 	u32 ip;		// IP Addres of nexthop
 
- 	u32 dev_id;
 
- 	u16 port;
 
- 	u16 vid;
 
- 	u16 fid;
 
- 	u64 mac;
 
- 	u16 mac_id;
 
- 	u16 l2_id;	// Index of this next hop forwarding entry in L2 FIB table
 
- 	u16 if_id;
 
- };
 
- struct rtl838x_switch_priv;
 
- struct rtl838x_reg {
 
- 	void (*mask_port_reg_be)(u64 clear, u64 set, int reg);
 
- 	void (*set_port_reg_be)(u64 set, int reg);
 
- 	u64 (*get_port_reg_be)(int reg);
 
- 	void (*mask_port_reg_le)(u64 clear, u64 set, int reg);
 
- 	void (*set_port_reg_le)(u64 set, int reg);
 
- 	u64 (*get_port_reg_le)(int reg);
 
- 	int stat_port_rst;
 
- 	int stat_rst;
 
- 	int stat_port_std_mib;
 
- 	int (*port_iso_ctrl)(int p);
 
- 	void (*traffic_enable)(int source, int dest);
 
- 	void (*traffic_disable)(int source, int dest);
 
- 	void (*traffic_set)(int source, u64 dest_matrix);
 
- 	u64 (*traffic_get)(int source);
 
- 	int l2_ctrl_0;
 
- 	int l2_ctrl_1;
 
- 	int l2_port_aging_out;
 
- 	int smi_poll_ctrl;
 
- 	int l2_tbl_flush_ctrl;
 
- 	void (*exec_tbl0_cmd)(u32 cmd);
 
- 	void (*exec_tbl1_cmd)(u32 cmd);
 
- 	int (*tbl_access_data_0)(int i);
 
- 	int isr_glb_src;
 
- 	int isr_port_link_sts_chg;
 
- 	int imr_port_link_sts_chg;
 
- 	int imr_glb;
 
- 	void (*vlan_tables_read)(u32 vlan, struct rtl838x_vlan_info *info);
 
- 	void (*vlan_set_tagged)(u32 vlan, struct rtl838x_vlan_info *info);
 
- 	void (*vlan_set_untagged)(u32 vlan, u64 portmask);
 
- 	void (*vlan_profile_dump)(int index);
 
- 	void (*vlan_profile_setup)(int profile);
 
- 	void (*stp_get)(struct rtl838x_switch_priv *priv, u16 msti, u32 port_state[]);
 
- 	void (*stp_set)(struct rtl838x_switch_priv *priv, u16 msti, u32 port_state[]);
 
- 	int  (*mac_force_mode_ctrl)(int port);
 
- 	int  (*mac_port_ctrl)(int port);
 
- 	int  (*l2_port_new_salrn)(int port);
 
- 	int  (*l2_port_new_sa_fwd)(int port);
 
- 	int mir_ctrl;
 
- 	int mir_dpm;
 
- 	int mir_spm;
 
- 	int mac_link_sts;
 
- 	int mac_link_dup_sts;
 
- 	int  (*mac_link_spd_sts)(int port);
 
- 	int mac_rx_pause_sts;
 
- 	int mac_tx_pause_sts;
 
- 	u64 (*read_l2_entry_using_hash)(u32 hash, u32 position, struct rtl838x_l2_entry *e);
 
- 	void (*write_l2_entry_using_hash)(u32 hash, u32 pos, struct rtl838x_l2_entry *e);
 
- 	u64 (*read_cam)(int idx, struct rtl838x_l2_entry *e);
 
- 	void (*write_cam)(int idx, struct rtl838x_l2_entry *e);
 
- 	int vlan_port_egr_filter;
 
- 	int vlan_port_igr_filter;
 
- 	int vlan_port_pb;
 
- 	int vlan_port_tag_sts_ctrl;
 
- 	int (*rtl838x_vlan_port_tag_sts_ctrl)(int port);
 
- 	int (*trk_mbr_ctr)(int group);
 
- 	int rma_bpdu_fld_pmask;
 
- 	int spcl_trap_eapol_ctrl;
 
- 	void (*init_eee)(struct rtl838x_switch_priv *priv, bool enable);
 
- 	void (*port_eee_set)(struct rtl838x_switch_priv *priv, int port, bool enable);
 
- 	int (*eee_port_ability)(struct rtl838x_switch_priv *priv,
 
- 				struct ethtool_eee *e, int port);
 
- 	u64 (*l2_hash_seed)(u64 mac, u32 vid);
 
- 	u32 (*l2_hash_key)(struct rtl838x_switch_priv *priv, u64 seed);
 
- 	u64 (*read_mcast_pmask)(int idx);
 
- 	void (*write_mcast_pmask)(int idx, u64 portmask);
 
- 	void (*vlan_fwd_on_inner)(int port, bool is_set);
 
- };
 
- struct rtl838x_switch_priv {
 
- 	/* Switch operation */
 
- 	struct dsa_switch *ds;
 
- 	struct device *dev;
 
- 	u16 id;
 
- 	u16 family_id;
 
- 	char version;
 
- 	struct rtl838x_port ports[57];
 
- 	struct mutex reg_mutex;
 
- 	int link_state_irq;
 
- 	int mirror_group_ports[4];
 
- 	struct mii_bus *mii_bus;
 
- 	const struct rtl838x_reg *r;
 
- 	u8 cpu_port;
 
- 	u8 port_mask;
 
- 	u8 port_width;
 
- 	u64 irq_mask;
 
- 	u32 fib_entries;
 
- 	int l2_bucket_size;
 
- 	struct dentry *dbgfs_dir;
 
- 	int n_lags;
 
- 	u64 lags_port_members[MAX_LAGS];
 
- 	struct net_device *lag_devs[MAX_LAGS];
 
- 	struct notifier_block nb;
 
- 	bool eee_enabled;
 
- 	unsigned long int mc_group_bm[MAX_MC_GROUPS >> 5];
 
- };
 
- void rtl838x_dbgfs_init(struct rtl838x_switch_priv *priv);
 
- #endif /* _RTL838X_H */
 
 
  |