realtek: add driver support for routing offload
[openwrt/staging/dedeckeh.git] / target / linux / realtek / files-5.10 / drivers / net / dsa / rtl83xx / rtl838x.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2
3 #ifndef _RTL838X_H
4 #define _RTL838X_H
5
6 #include <net/dsa.h>
7
8 /*
9 * Register definition
10 */
11 #define RTL838X_MAC_PORT_CTRL(port) (0xd560 + (((port) << 7)))
12 #define RTL839X_MAC_PORT_CTRL(port) (0x8004 + (((port) << 7)))
13 #define RTL930X_MAC_PORT_CTRL(port) (0x3260 + (((port) << 6)))
14 #define RTL930X_MAC_L2_PORT_CTRL(port) (0x3268 + (((port) << 6)))
15 #define RTL931X_MAC_PORT_CTRL(port) (0x6004 + (((port) << 7)))
16
17 #define RTL838X_RST_GLB_CTRL_0 (0x003c)
18
19 #define RTL838X_MAC_FORCE_MODE_CTRL (0xa104)
20 #define RTL839X_MAC_FORCE_MODE_CTRL (0x02bc)
21 #define RTL930X_MAC_FORCE_MODE_CTRL (0xCA1C)
22 #define RTL931X_MAC_FORCE_MODE_CTRL (0x0DCC)
23
24 #define RTL838X_DMY_REG31 (0x3b28)
25 #define RTL838X_SDS_MODE_SEL (0x0028)
26 #define RTL838X_SDS_CFG_REG (0x0034)
27 #define RTL838X_INT_MODE_CTRL (0x005c)
28 #define RTL838X_CHIP_INFO (0x00d8)
29 #define RTL839X_CHIP_INFO (0x0ff4)
30 #define RTL838X_PORT_ISO_CTRL(port) (0x4100 + ((port) << 2))
31 #define RTL839X_PORT_ISO_CTRL(port) (0x1400 + ((port) << 3))
32
33 /* Packet statistics */
34 #define RTL838X_STAT_PORT_STD_MIB (0x1200)
35 #define RTL839X_STAT_PORT_STD_MIB (0xC000)
36 #define RTL930X_STAT_PORT_MIB_CNTR (0x0664)
37 #define RTL838X_STAT_RST (0x3100)
38 #define RTL839X_STAT_RST (0xF504)
39 #define RTL930X_STAT_RST (0x3240)
40 #define RTL931X_STAT_RST (0x7ef4)
41 #define RTL838X_STAT_PORT_RST (0x3104)
42 #define RTL839X_STAT_PORT_RST (0xF508)
43 #define RTL930X_STAT_PORT_RST (0x3244)
44 #define RTL931X_STAT_PORT_RST (0x7ef8)
45 #define RTL838X_STAT_CTRL (0x3108)
46 #define RTL839X_STAT_CTRL (0x04cc)
47 #define RTL930X_STAT_CTRL (0x3248)
48 #define RTL931X_STAT_CTRL (0x5720)
49
50 /* Registers of the internal Serdes of the 8390 */
51 #define RTL8390_SDS0_1_XSG0 (0xA000)
52 #define RTL8390_SDS0_1_XSG1 (0xA100)
53 #define RTL839X_SDS12_13_XSG0 (0xB800)
54 #define RTL839X_SDS12_13_XSG1 (0xB900)
55 #define RTL839X_SDS12_13_PWR0 (0xb880)
56 #define RTL839X_SDS12_13_PWR1 (0xb980)
57
58 /* Registers of the internal Serdes of the 8380 */
59 #define RTL838X_SDS4_FIB_REG0 (0xF800)
60 #define RTL838X_SDS4_REG28 (0xef80)
61 #define RTL838X_SDS4_DUMMY0 (0xef8c)
62 #define RTL838X_SDS5_EXT_REG6 (0xf18c)
63
64 /* VLAN registers */
65 #define RTL838X_VLAN_CTRL (0x3A74)
66 #define RTL838X_VLAN_PROFILE(idx) (0x3A88 + ((idx) << 2))
67 #define RTL838X_VLAN_PORT_EGR_FLTR (0x3A84)
68 #define RTL838X_VLAN_PORT_PB_VLAN (0x3C00)
69 #define RTL838X_VLAN_PORT_IGR_FLTR (0x3A7C)
70 #define RTL838X_VLAN_PORT_TAG_STS_CTRL (0xA530)
71
72 #define RTL839X_VLAN_PROFILE(idx) (0x25C0 + (((idx) << 3)))
73 #define RTL839X_VLAN_CTRL (0x26D4)
74 #define RTL839X_VLAN_PORT_PB_VLAN (0x26D8)
75 #define RTL839X_VLAN_PORT_IGR_FLTR (0x27B4)
76 #define RTL839X_VLAN_PORT_EGR_FLTR (0x27C4)
77 #define RTL839X_VLAN_PORT_TAG_STS_CTRL (0x6828)
78 #define RTL839X_VLAN_PORT_TAG_STS_CTRL (0x6828)
79
80 #define RTL930X_VLAN_PROFILE_SET(idx) (0x9c60 + (((idx) * 20)))
81 #define RTL930X_VLAN_CTRL (0x82D4)
82 #define RTL930X_VLAN_PORT_PB_VLAN (0x82D8)
83 #define RTL930X_VLAN_PORT_IGR_FLTR (0x83C0)
84 #define RTL930X_VLAN_PORT_EGR_FLTR (0x83C8)
85 #define RTL930X_VLAN_PORT_TAG_STS_CTRL (0xCE24)
86
87 #define RTL931X_VLAN_PROFILE_SET(idx) (0x9800 + (((idx) * 28)))
88 #define RTL931X_VLAN_CTRL (0x94E4)
89 #define RTL931X_VLAN_PORT_IGR_FLTR (0x96B4)
90 #define RTL931X_VLAN_PORT_EGR_FLTR (0x96C4)
91 #define RTL931X_VLAN_PORT_TAG_CTRL (0x4860)
92
93 /* Table access registers */
94 #define RTL838X_TBL_ACCESS_CTRL_0 (0x6914)
95 #define RTL838X_TBL_ACCESS_DATA_0(idx) (0x6918 + ((idx) << 2))
96 #define RTL838X_TBL_ACCESS_CTRL_1 (0xA4C8)
97 #define RTL838X_TBL_ACCESS_DATA_1(idx) (0xA4CC + ((idx) << 2))
98
99 #define RTL839X_TBL_ACCESS_CTRL_0 (0x1190)
100 #define RTL839X_TBL_ACCESS_DATA_0(idx) (0x1194 + ((idx) << 2))
101 #define RTL839X_TBL_ACCESS_CTRL_1 (0x6b80)
102 #define RTL839X_TBL_ACCESS_DATA_1(idx) (0x6b84 + ((idx) << 2))
103 #define RTL839X_TBL_ACCESS_CTRL_2 (0x611C)
104 #define RTL839X_TBL_ACCESS_DATA_2(i) (0x6120 + (((i) << 2)))
105
106 #define RTL930X_TBL_ACCESS_CTRL_0 (0xB340)
107 #define RTL930X_TBL_ACCESS_DATA_0(idx) (0xB344 + ((idx) << 2))
108 #define RTL930X_TBL_ACCESS_CTRL_1 (0xB3A0)
109 #define RTL930X_TBL_ACCESS_DATA_1(idx) (0xB3A4 + ((idx) << 2))
110 #define RTL930X_TBL_ACCESS_CTRL_2 (0xCE04)
111 #define RTL930X_TBL_ACCESS_DATA_2(i) (0xCE08 + (((i) << 2)))
112
113 #define RTL931X_TBL_ACCESS_CTRL_0 (0x8500)
114 #define RTL931X_TBL_ACCESS_DATA_0(idx) (0x8508 + ((idx) << 2))
115 #define RTL931X_TBL_ACCESS_CTRL_1 (0x40C0)
116 #define RTL931X_TBL_ACCESS_DATA_1(idx) (0x40C4 + ((idx) << 2))
117 #define RTL931X_TBL_ACCESS_CTRL_2 (0x8528)
118 #define RTL931X_TBL_ACCESS_DATA_2(i) (0x852C + (((i) << 2)))
119 #define RTL931X_TBL_ACCESS_CTRL_3 (0x0200)
120 #define RTL931X_TBL_ACCESS_DATA_3(i) (0x0204 + (((i) << 2)))
121 #define RTL931X_TBL_ACCESS_CTRL_4 (0x20DC)
122 #define RTL931X_TBL_ACCESS_DATA_4(i) (0x20E0 + (((i) << 2)))
123 #define RTL931X_TBL_ACCESS_CTRL_5 (0x7E1C)
124 #define RTL931X_TBL_ACCESS_DATA_5(i) (0x7E20 + (((i) << 2)))
125
126 /* MAC handling */
127 #define RTL838X_MAC_LINK_STS (0xa188)
128 #define RTL839X_MAC_LINK_STS (0x0390)
129 #define RTL930X_MAC_LINK_STS (0xCB10)
130 #define RTL931X_MAC_LINK_STS (0x0EC0)
131 #define RTL838X_MAC_LINK_SPD_STS(p) (0xa190 + (((p >> 4) << 2)))
132 #define RTL839X_MAC_LINK_SPD_STS(p) (0x03a0 + (((p >> 4) << 2)))
133 #define RTL930X_MAC_LINK_SPD_STS(p) (0xCB18 + (((p >> 3) << 2)))
134 #define RTL931X_MAC_LINK_SPD_STS(p) (0x0ED0 + (((p >> 3) << 2)))
135 #define RTL838X_MAC_LINK_DUP_STS (0xa19c)
136 #define RTL839X_MAC_LINK_DUP_STS (0x03b0)
137 #define RTL930X_MAC_LINK_DUP_STS (0xCB28)
138 #define RTL931X_MAC_LINK_DUP_STS (0x0EF0)
139 #define RTL838X_MAC_TX_PAUSE_STS (0xa1a0)
140 #define RTL839X_MAC_TX_PAUSE_STS (0x03b8)
141 #define RTL930X_MAC_TX_PAUSE_STS (0xCB2C)
142 #define RTL931X_MAC_TX_PAUSE_STS (0x0EF8)
143 #define RTL838X_MAC_RX_PAUSE_STS (0xa1a4)
144 #define RTL839X_MAC_RX_PAUSE_STS (0x03c0)
145 #define RTL930X_MAC_RX_PAUSE_STS (0xCB30)
146 #define RTL931X_MAC_RX_PAUSE_STS (0x0F00)
147 #define RTL930X_MAC_LINK_MEDIA_STS (0xCB14)
148
149 /* MAC link state bits */
150 #define FORCE_EN (1 << 0)
151 #define FORCE_LINK_EN (1 << 1)
152 #define NWAY_EN (1 << 2)
153 #define DUPLX_MODE (1 << 3)
154 #define TX_PAUSE_EN (1 << 6)
155 #define RX_PAUSE_EN (1 << 7)
156
157 /* EEE */
158 #define RTL838X_MAC_EEE_ABLTY (0xa1a8)
159 #define RTL838X_EEE_PORT_TX_EN (0x014c)
160 #define RTL838X_EEE_PORT_RX_EN (0x0150)
161 #define RTL838X_EEE_CLK_STOP_CTRL (0x0148)
162 #define RTL838X_EEE_TX_TIMER_GIGA_CTRL (0xaa04)
163 #define RTL838X_EEE_TX_TIMER_GELITE_CTRL (0xaa08)
164
165 #define RTL839X_EEE_TX_TIMER_GELITE_CTRL (0x042C)
166 #define RTL839X_EEE_TX_TIMER_GIGA_CTRL (0x0430)
167 #define RTL839X_EEE_TX_TIMER_10G_CTRL (0x0434)
168 #define RTL839X_EEE_CTRL(p) (0x8008 + ((p) << 7))
169 #define RTL839X_MAC_EEE_ABLTY (0x03C8)
170
171 #define RTL930X_MAC_EEE_ABLTY (0xCB34)
172 #define RTL930X_EEE_CTRL(p) (0x3274 + ((p) << 6))
173 #define RTL930X_EEEP_PORT_CTRL(p) (0x3278 + ((p) << 6))
174
175 /* L2 functionality */
176 #define RTL838X_L2_CTRL_0 (0x3200)
177 #define RTL839X_L2_CTRL_0 (0x3800)
178 #define RTL930X_L2_CTRL (0x8FD8)
179 #define RTL931X_L2_CTRL (0xC800)
180 #define RTL838X_L2_CTRL_1 (0x3204)
181 #define RTL839X_L2_CTRL_1 (0x3804)
182 #define RTL930X_L2_AGE_CTRL (0x8FDC)
183 #define RTL931X_L2_AGE_CTRL (0xC804)
184 #define RTL838X_L2_PORT_AGING_OUT (0x3358)
185 #define RTL839X_L2_PORT_AGING_OUT (0x3b74)
186 #define RTL930X_L2_PORT_AGE_CTRL (0x8FE0)
187 #define RTL931X_L2_PORT_AGE_CTRL (0xc808)
188 #define RTL838X_TBL_ACCESS_L2_CTRL (0x6900)
189 #define RTL839X_TBL_ACCESS_L2_CTRL (0x1180)
190 #define RTL930X_TBL_ACCESS_L2_CTRL (0xB320)
191 #define RTL930X_TBL_ACCESS_L2_METHOD_CTRL (0xB324)
192 #define RTL838X_TBL_ACCESS_L2_DATA(idx) (0x6908 + ((idx) << 2))
193 #define RTL839X_TBL_ACCESS_L2_DATA(idx) (0x1184 + ((idx) << 2))
194 #define RTL930X_TBL_ACCESS_L2_DATA(idx) (0xab08 + ((idx) << 2))
195 #define RTL838X_L2_TBL_FLUSH_CTRL (0x3370)
196 #define RTL839X_L2_TBL_FLUSH_CTRL (0x3ba0)
197 #define RTL930X_L2_TBL_FLUSH_CTRL (0x9404)
198 #define RTL931X_L2_TBL_FLUSH_CTRL (0xCD9C)
199
200 #define RTL838X_L2_LRN_CONSTRT (0x329C)
201 #define RTL839X_L2_LRN_CONSTRT (0x3910)
202 #define RTL930X_L2_LRN_CONSTRT_CTRL (0x909c)
203 #define RTL838X_L2_FLD_PMSK (0x3288)
204 #define RTL839X_L2_FLD_PMSK (0x38EC)
205 #define RTL930X_L2_BC_FLD_PMSK (0x9068)
206 #define RTL930X_L2_UNKN_UC_FLD_PMSK (0x9064)
207 #define RTL838X_L2_LRN_CONSTRT_EN (0x3368)
208
209 #define RTL838X_L2_PORT_NEW_SALRN(p) (0x328c + (((p >> 4) << 2)))
210 #define RTL839X_L2_PORT_NEW_SALRN(p) (0x38F0 + (((p >> 4) << 2)))
211 #define RTL930X_L2_PORT_SALRN(p) (0x8FEC + (((p >> 4) << 2)))
212 #define RTL931X_L2_PORT_NEW_SALRN(p) (0xC820 + (((p >> 4) << 2)))
213 #define RTL838X_L2_PORT_NEW_SA_FWD(p) (0x3294 + (((p >> 4) << 2)))
214 #define RTL839X_L2_PORT_NEW_SA_FWD(p) (0x3900 + (((p >> 4) << 2)))
215 #define RTL930X_L2_PORT_NEW_SA_FWD(p) (0x8FF4 + (((p / 10) << 2)))
216 #define RTL931X_L2_PORT_NEW_SA_FWD(p) (0xC830 + (((p / 10) << 2)))
217
218 #define RTL930X_ST_CTRL (0x8798)
219
220 #define RTL930X_L2_PORT_SABLK_CTRL (0x905c)
221 #define RTL930X_L2_PORT_DABLK_CTRL (0x9060)
222
223 #define RTL838X_RMA_BPDU_FLD_PMSK (0x4348)
224 #define RTL930X_RMA_BPDU_FLD_PMSK (0x9F18)
225 #define RTL931X_RMA_BPDU_FLD_PMSK (0x8950)
226 #define RTL839X_RMA_BPDU_FLD_PMSK (0x125C)
227
228 #define RTL838X_L2_PORT_LM_ACT(p) (0x3208 + ((p) << 2))
229 #define RTL838X_VLAN_PORT_FWD (0x3A78)
230 #define RTL839X_VLAN_PORT_FWD (0x27AC)
231 #define RTL930X_VLAN_PORT_FWD (0x834C)
232 #define RTL838X_VLAN_FID_CTRL (0x3aa8)
233
234 /* Port Mirroring */
235 #define RTL838X_MIR_CTRL (0x5D00)
236 #define RTL838X_MIR_DPM_CTRL (0x5D20)
237 #define RTL838X_MIR_SPM_CTRL (0x5D10)
238
239 #define RTL839X_MIR_CTRL (0x2500)
240 #define RTL839X_MIR_DPM_CTRL (0x2530)
241 #define RTL839X_MIR_SPM_CTRL (0x2510)
242
243 #define RTL930X_MIR_CTRL (0xA2A0)
244 #define RTL930X_MIR_DPM_CTRL (0xA2C0)
245 #define RTL930X_MIR_SPM_CTRL (0xA2B0)
246
247 #define RTL931X_MIR_CTRL (0xAF00)
248 #define RTL931X_MIR_DPM_CTRL (0xAF30)
249 #define RTL931X_MIR_SPM_CTRL (0xAF10)
250
251 /* Storm/rate control and scheduling */
252 #define RTL838X_STORM_CTRL (0x4700)
253 #define RTL839X_STORM_CTRL (0x1800)
254 #define RTL838X_STORM_CTRL_LB_CTRL(p) (0x4884 + (((p) << 2)))
255 #define RTL838X_STORM_CTRL_BURST_PPS_0 (0x4874)
256 #define RTL838X_STORM_CTRL_BURST_PPS_1 (0x4878)
257 #define RTL838X_STORM_CTRL_BURST_0 (0x487c)
258 #define RTL838X_STORM_CTRL_BURST_1 (0x4880)
259 #define RTL839X_STORM_CTRL_LB_TICK_TKN_CTRL_0 (0x1804)
260 #define RTL839X_STORM_CTRL_LB_TICK_TKN_CTRL_1 (0x1808)
261 #define RTL838X_SCHED_CTRL (0xB980)
262 #define RTL839X_SCHED_CTRL (0x60F4)
263 #define RTL838X_SCHED_LB_TICK_TKN_CTRL_0 (0xAD58)
264 #define RTL838X_SCHED_LB_TICK_TKN_CTRL_1 (0xAD5C)
265 #define RTL839X_SCHED_LB_TICK_TKN_CTRL_0 (0x1804)
266 #define RTL839X_SCHED_LB_TICK_TKN_CTRL_1 (0x1808)
267 #define RTL839X_STORM_CTRL_SPCL_LB_TICK_TKN_CTRL (0x2000)
268 #define RTL839X_IGR_BWCTRL_LB_TICK_TKN_CTRL_0 (0x1604)
269 #define RTL839X_IGR_BWCTRL_LB_TICK_TKN_CTRL_1 (0x1608)
270 #define RTL839X_SCHED_LB_TICK_TKN_CTRL (0x60F8)
271 #define RTL839X_SCHED_LB_TICK_TKN_PPS_CTRL (0x6200)
272 #define RTL838X_SCHED_LB_THR (0xB984)
273 #define RTL839X_SCHED_LB_THR (0x60FC)
274 #define RTL838X_SCHED_P_EGR_RATE_CTRL(p) (0xC008 + (((p) << 7)))
275 #define RTL838X_SCHED_Q_EGR_RATE_CTRL(p, q) (0xC00C + (p << 7) + (((q) << 2)))
276 #define RTL838X_STORM_CTRL_PORT_BC_EXCEED (0x470C)
277 #define RTL838X_STORM_CTRL_PORT_MC_EXCEED (0x4710)
278 #define RTL838X_STORM_CTRL_PORT_UC_EXCEED (0x4714)
279 #define RTL839X_STORM_CTRL_PORT_BC_EXCEED(p) (0x180c + (((p >> 5) << 2)))
280 #define RTL839X_STORM_CTRL_PORT_MC_EXCEED(p) (0x1814 + (((p >> 5) << 2)))
281 #define RTL839X_STORM_CTRL_PORT_UC_EXCEED(p) (0x181c + (((p >> 5) << 2)))
282 #define RTL838X_STORM_CTRL_PORT_UC(p) (0x4718 + (((p) << 2)))
283 #define RTL838X_STORM_CTRL_PORT_MC(p) (0x478c + (((p) << 2)))
284 #define RTL838X_STORM_CTRL_PORT_BC(p) (0x4800 + (((p) << 2)))
285 #define RTL839X_STORM_CTRL_PORT_UC_0(p) (0x185C + (((p) << 3)))
286 #define RTL839X_STORM_CTRL_PORT_UC_1(p) (0x1860 + (((p) << 3)))
287 #define RTL839X_STORM_CTRL_PORT_MC_0(p) (0x19FC + (((p) << 3)))
288 #define RTL839X_STORM_CTRL_PORT_MC_1(p) (0x1a00 + (((p) << 3)))
289 #define RTL839X_STORM_CTRL_PORT_BC_0(p) (0x1B9C + (((p) << 3)))
290 #define RTL839X_STORM_CTRL_PORT_BC_1(p) (0x1BA0 + (((p) << 3)))
291 #define RTL839X_TBL_ACCESS_CTRL_2 (0x611C)
292 #define RTL839X_TBL_ACCESS_DATA_2(i) (0x6120 + (((i) << 2)))
293 #define RTL839X_IGR_BWCTRL_PORT_CTRL_10G_0(p) (0x1618 + (((p) << 3)))
294 #define RTL839X_IGR_BWCTRL_PORT_CTRL_10G_1(p) (0x161C + (((p) << 3)))
295 #define RTL839X_IGR_BWCTRL_PORT_CTRL_0(p) (0x1640 + (((p) << 3)))
296 #define RTL839X_IGR_BWCTRL_PORT_CTRL_1(p) (0x1644 + (((p) << 3)))
297 #define RTL839X_IGR_BWCTRL_CTRL_LB_THR (0x1614)
298
299 /* Link aggregation (Trunking) */
300 #define RTL839X_TRK_MBR_CTR (0x2200)
301 #define RTL838X_TRK_MBR_CTR (0x3E00)
302 #define RTL930X_TRK_MBR_CTRL (0xA41C)
303 #define RTL931X_TRK_MBR_CTRL (0xB8D0)
304
305 /* Attack prevention */
306 #define RTL838X_ATK_PRVNT_PORT_EN (0x5B00)
307 #define RTL838X_ATK_PRVNT_CTRL (0x5B04)
308 #define RTL838X_ATK_PRVNT_ACT (0x5B08)
309 #define RTL838X_ATK_PRVNT_STS (0x5B1C)
310
311 /* 802.1X */
312 #define RTL838X_SPCL_TRAP_EAPOL_CTRL (0x6988)
313 #define RTL839X_SPCL_TRAP_EAPOL_CTRL (0x105C)
314 #define RTL838X_SPCL_TRAP_ARP_CTRL (0x698C)
315 #define RTL839X_SPCL_TRAP_ARP_CTRL (0x1060)
316
317 /* QoS */
318 #define RTL838X_QM_INTPRI2QID_CTRL (0x5F00)
319 #define RTL839X_QM_INTPRI2QID_CTRL(q) (0x1110 + (q << 2))
320 #define RTL839X_QM_PORT_QNUM(p) (0x1130 + (((p / 10) << 2)))
321 #define RTL838X_PRI_SEL_PORT_PRI(p) (0x5FB8 + (((p / 10) << 2)))
322 #define RTL839X_PRI_SEL_PORT_PRI(p) (0x10A8 + (((p / 10) << 2)))
323 #define RTL838X_QM_PKT2CPU_INTPRI_MAP (0x5F10)
324 #define RTL839X_QM_PKT2CPU_INTPRI_MAP (0x1154)
325 #define RTL838X_PRI_SEL_CTRL (0x10E0)
326 #define RTL839X_PRI_SEL_CTRL (0x10E0)
327 #define RTL838X_PRI_SEL_TBL_CTRL(i) (0x5FD8 + (((i) << 2)))
328 #define RTL839X_PRI_SEL_TBL_CTRL(i) (0x10D0 + (((i) << 2)))
329 #define RTL838X_QM_PKT2CPU_INTPRI_0 (0x5F04)
330 #define RTL838X_QM_PKT2CPU_INTPRI_1 (0x5F08)
331 #define RTL838X_QM_PKT2CPU_INTPRI_2 (0x5F0C)
332 #define RTL839X_OAM_CTRL (0x2100)
333 #define RTL839X_OAM_PORT_ACT_CTRL(p) (0x2104 + (((p) << 2)))
334 #define RTL839X_RMK_PORT_DEI_TAG_CTRL(p) (0x6A9C + (((p >> 5) << 2)))
335 #define RTL839X_PRI_SEL_IPRI_REMAP (0x1080)
336 #define RTL838X_PRI_SEL_IPRI_REMAP (0x5F8C)
337 #define RTL839X_PRI_SEL_DEI2DP_REMAP (0x10EC)
338 #define RTL839X_PRI_SEL_DSCP2DP_REMAP_ADDR(i) (0x10F0 + (((i >> 4) << 2)))
339 #define RTL839X_RMK_DEI_CTRL (0x6AA4)
340 #define RTL839X_WRED_PORT_THR_CTRL(i) (0x6084 + ((i) << 2))
341 #define RTL839X_WRED_QUEUE_THR_CTRL(q, i) (0x6090 + ((q) * 12) + ((i) << 2))
342 #define RTL838X_PRI_DSCP_INVLD_CTRL0 (0x5FE8)
343 #define RTL838X_RMK_IPRI_CTRL (0xA460)
344 #define RTL838X_RMK_OPRI_CTRL (0xA464)
345 #define RTL838X_SCHED_P_TYPE_CTRL(p) (0xC04C + (((p) << 7)))
346 #define RTL838X_SCHED_LB_CTRL(p) (0xC004 + (((p) << 7)))
347 #define RTL838X_FC_P_EGR_DROP_CTRL(p) (0x6B1C + (((p) << 2)))
348
349 /* Debug features */
350 #define RTL930X_STAT_PRVTE_DROP_COUNTER0 (0xB5B8)
351
352 /* Packet Inspection Engine */
353 #define RTL838X_METER_GLB_CTRL (0x4B08)
354 #define RTL839X_METER_GLB_CTRL (0x1300)
355 #define RTL930X_METER_GLB_CTRL (0xa0a0)
356 #define RTL839X_ACL_CTRL (0x1288)
357 #define RTL838X_ACL_BLK_LOOKUP_CTRL (0x6100)
358 #define RTL839X_ACL_BLK_LOOKUP_CTRL (0x1280)
359 #define RTL930X_PIE_BLK_LOOKUP_CTRL (0xa5a0)
360 #define RTL838X_ACL_BLK_PWR_CTRL (0x6104)
361 #define RTL839X_PS_ACL_PWR_CTRL (0x049c)
362 #define RTL838X_ACL_BLK_TMPLTE_CTRL(block) (0x6108 + ((block) << 2))
363 #define RTL839X_ACL_BLK_TMPLTE_CTRL(block) (0x128c + ((block) << 2))
364 #define RTL930X_PIE_BLK_TMPLTE_CTRL(block) (0xa624 + ((block) << 2))
365 #define RTL838X_ACL_BLK_GROUP_CTRL (0x615C)
366 #define RTL839X_ACL_BLK_GROUP_CTRL (0x12ec)
367 #define RTL838X_ACL_CLR_CTRL (0x6168)
368 #define RTL839X_ACL_CLR_CTRL (0x12fc)
369 #define RTL930X_PIE_CLR_CTRL (0xa66c)
370 #define RTL838X_DMY_REG27 (0x3378)
371 #define RTL838X_ACL_PORT_LOOKUP_CTRL(p) (0x616C + (((p) << 2)))
372 #define RTL930X_ACL_PORT_LOOKUP_CTRL(p) (0xA784 + (((p) << 2)))
373 #define RTL930X_PIE_BLK_PHASE_CTRL (0xA5A4)
374
375 // PIE actions
376 #define PIE_ACT_COPY_TO_PORT 2
377 #define PIE_ACT_REDIRECT_TO_PORT 4
378 #define PIE_ACT_ROUTE_UC 6
379 #define PIE_ACT_VID_ASSIGN 0
380
381 // L3 actions
382 #define L3_FORWARD 0
383 #define L3_DROP 1
384 #define L3_TRAP2CPU 2
385 #define L3_COPY2CPU 3
386 #define L3_TRAP2MASTERCPU 4
387 #define L3_COPY2MASTERCPU 5
388 #define L3_HARDDROP 6
389
390 // Route actions
391 #define ROUTE_ACT_FORWARD 0
392 #define ROUTE_ACT_TRAP2CPU 1
393 #define ROUTE_ACT_COPY2CPU 2
394 #define ROUTE_ACT_DROP 3
395
396 /* L3 Routing */
397 #define RTL839X_ROUTING_SA_CTRL 0x6afc
398 #define RTL930X_L3_HOST_TBL_CTRL (0xAB48)
399 #define RTL930X_L3_IPUC_ROUTE_CTRL (0xAB4C)
400 #define RTL930X_L3_IP6UC_ROUTE_CTRL (0xAB50)
401 #define RTL930X_L3_IPMC_ROUTE_CTRL (0xAB54)
402 #define RTL930X_L3_IP6MC_ROUTE_CTRL (0xAB58)
403 #define RTL930X_L3_IP_MTU_CTRL(i) (0xAB5C + ((i >> 1) << 2))
404 #define RTL930X_L3_IP6_MTU_CTRL(i) (0xAB6C + ((i >> 1) << 2))
405 #define RTL930X_L3_HW_LU_KEY_CTRL (0xAC9C)
406 #define RTL930X_L3_HW_LU_KEY_IP_CTRL (0xACA0)
407 #define RTL930X_L3_HW_LU_CTRL (0xACC0)
408 #define RTL930X_L3_IP_ROUTE_CTRL 0xab44
409
410 #define MAX_VLANS 4096
411 #define MAX_LAGS 16
412 #define MAX_PRIOS 8
413 #define RTL930X_PORT_IGNORE 0x3f
414 #define MAX_MC_GROUPS 512
415 #define UNKNOWN_MC_PMASK (MAX_MC_GROUPS - 1)
416 #define PIE_BLOCK_SIZE 128
417 #define MAX_PIE_ENTRIES (18 * PIE_BLOCK_SIZE)
418 #define N_FIXED_FIELDS 12
419 #define MAX_COUNTERS 2048
420 #define MAX_ROUTES 512
421 #define MAX_HOST_ROUTES 1536
422 #define MAX_INTF_MTUS 8
423 #define DEFAULT_MTU 1536
424 #define MAX_INTERFACES 100
425 #define MAX_ROUTER_MACS 64
426 #define L3_EGRESS_DMACS 2048
427 #define MAX_SMACS 64
428
429 enum phy_type {
430 PHY_NONE = 0,
431 PHY_RTL838X_SDS = 1,
432 PHY_RTL8218B_INT = 2,
433 PHY_RTL8218B_EXT = 3,
434 PHY_RTL8214FC = 4,
435 PHY_RTL839X_SDS = 5,
436 };
437
438 struct rtl838x_port {
439 bool enable;
440 u64 pm;
441 u16 pvid;
442 bool eee_enabled;
443 enum phy_type phy;
444 bool is10G;
445 bool is2G5;
446 u8 sds_num;
447 const struct dsa_port *dp;
448 };
449
450 struct rtl838x_vlan_info {
451 u64 untagged_ports;
452 u64 tagged_ports;
453 u8 profile_id;
454 bool hash_mc_fid;
455 bool hash_uc_fid;
456 u8 fid;
457 };
458
459 enum l2_entry_type {
460 L2_INVALID = 0,
461 L2_UNICAST = 1,
462 L2_MULTICAST = 2,
463 IP4_MULTICAST = 3,
464 IP6_MULTICAST = 4,
465 };
466
467 struct rtl838x_l2_entry {
468 u8 mac[6];
469 u16 vid;
470 u16 rvid;
471 u8 port;
472 bool valid;
473 enum l2_entry_type type;
474 bool is_static;
475 bool is_ip_mc;
476 bool is_ipv6_mc;
477 bool block_da;
478 bool block_sa;
479 bool suspended;
480 bool next_hop;
481 int age;
482 u8 trunk;
483 bool is_trunk;
484 u8 stack_dev;
485 u16 mc_portmask_index;
486 u32 mc_gip;
487 u32 mc_sip;
488 u16 mc_mac_index;
489 u16 nh_route_id;
490 bool nh_vlan_target; // Only RTL83xx: VLAN used for next hop
491 };
492
493 enum fwd_rule_action {
494 FWD_RULE_ACTION_NONE = 0,
495 FWD_RULE_ACTION_FWD = 1,
496 };
497
498 enum pie_phase {
499 PHASE_VACL = 0,
500 PHASE_IACL = 1,
501 };
502
503 /* Intermediate representation of a Packet Inspection Engine Rule
504 * as suggested by the Kernel's tc flower offload subsystem
505 * Field meaning is universal across SoC families, but data content is specific
506 * to SoC family (e.g. because of different port ranges) */
507 struct pie_rule {
508 int id;
509 enum pie_phase phase; // Phase in which this template is applied
510 int packet_cntr; // ID of a packet counter assigned to this rule
511 int octet_cntr; // ID of a byte counter assigned to this rule
512 u32 last_packet_cnt;
513 u64 last_octet_cnt;
514
515 // The following are requirements for the pie template
516 bool is_egress;
517 bool is_ipv6; // This is a rule with IPv6 fields
518
519 // Fixed fields that are always matched against on RTL8380
520 u8 spmmask_fix;
521 u8 spn; // Source port number
522 bool stacking_port; // Source port is stacking port
523 bool mgnt_vlan; // Packet arrived on management VLAN
524 bool dmac_hit_sw; // The packet's destination MAC matches one of the device's
525 bool content_too_deep; // The content of the packet cannot be parsed: too many layers
526 bool not_first_frag; // Not the first IP fragment
527 u8 frame_type_l4; // 0: UDP, 1: TCP, 2: ICMP/ICMPv6, 3: IGMP
528 u8 frame_type; // 0: ARP, 1: L2 only, 2: IPv4, 3: IPv6
529 bool otag_fmt; // 0: outer tag packet, 1: outer priority tag or untagged
530 bool itag_fmt; // 0: inner tag packet, 1: inner priority tag or untagged
531 bool otag_exist; // packet with outer tag
532 bool itag_exist; // packet with inner tag
533 bool frame_type_l2; // 0: Ethernet, 1: LLC_SNAP, 2: LLC_Other, 3: Reserved
534 bool igr_normal_port; // Ingress port is not cpu or stacking port
535 u8 tid; // The template ID defining the what the templated fields mean
536
537 // Masks for the fields that are always matched against on RTL8380
538 u8 spmmask_fix_m;
539 u8 spn_m;
540 bool stacking_port_m;
541 bool mgnt_vlan_m;
542 bool dmac_hit_sw_m;
543 bool content_too_deep_m;
544 bool not_first_frag_m;
545 u8 frame_type_l4_m;
546 u8 frame_type_m;
547 bool otag_fmt_m;
548 bool itag_fmt_m;
549 bool otag_exist_m;
550 bool itag_exist_m;
551 bool frame_type_l2_m;
552 bool igr_normal_port_m;
553 u8 tid_m;
554
555 // Logical operations between rules, special rules for rule numbers apply
556 bool valid;
557 bool cond_not; // Matches when conditions not match
558 bool cond_and1; // And this rule 2n with the next rule 2n+1 in same block
559 bool cond_and2; // And this rule m in block 2n with rule m in block 2n+1
560 bool ivalid;
561
562 // Actions to be performed
563 bool drop; // Drop the packet
564 bool fwd_sel; // Forward packet: to port, portmask, dest route, next rule, drop
565 bool ovid_sel; // So something to outer vlan-id: shift, re-assign
566 bool ivid_sel; // Do something to inner vlan-id: shift, re-assign
567 bool flt_sel; // Filter the packet when sending to certain ports
568 bool log_sel; // Log the packet in one of the LOG-table counters
569 bool rmk_sel; // Re-mark the packet, i.e. change the priority-tag
570 bool meter_sel; // Meter the packet, i.e. limit rate of this type of packet
571 bool tagst_sel; // Change the ergress tag
572 bool mir_sel; // Mirror the packet to a Link Aggregation Group
573 bool nopri_sel; // Change the normal priority
574 bool cpupri_sel; // Change the CPU priority
575 bool otpid_sel; // Change Outer Tag Protocol Identifier (802.1q)
576 bool itpid_sel; // Change Inner Tag Protocol Identifier (802.1q)
577 bool shaper_sel; // Apply traffic shaper
578 bool mpls_sel; // MPLS actions
579 bool bypass_sel; // Bypass actions
580 bool fwd_sa_lrn; // Learn the source address when forwarding
581 bool fwd_mod_to_cpu; // Forward the modified VLAN tag format to CPU-port
582
583 // Fields used in predefined templates 0-2 on RTL8380 / 90 / 9300
584 u64 spm; // Source Port Matrix
585 u16 otag; // Outer VLAN-ID
586 u8 smac[ETH_ALEN]; // Source MAC address
587 u8 dmac[ETH_ALEN]; // Destination MAC address
588 u16 ethertype; // Ethernet frame type field in ethernet header
589 u16 itag; // Inner VLAN-ID
590 u16 field_range_check;
591 u32 sip; // Source IP
592 struct in6_addr sip6; // IPv6 Source IP
593 u32 dip; // Destination IP
594 struct in6_addr dip6; // IPv6 Destination IP
595 u16 tos_proto; // IPv4: TOS + Protocol fields, IPv6: Traffic class + next header
596 u16 sport; // TCP/UDP source port
597 u16 dport; // TCP/UDP destination port
598 u16 icmp_igmp;
599 u16 tcp_info;
600 u16 dsap_ssap; // Destination / Source Service Access Point bytes (802.3)
601
602 u64 spm_m;
603 u16 otag_m;
604 u8 smac_m[ETH_ALEN];
605 u8 dmac_m[ETH_ALEN];
606 u8 ethertype_m;
607 u16 itag_m;
608 u16 field_range_check_m;
609 u32 sip_m;
610 struct in6_addr sip6_m; // IPv6 Source IP mask
611 u32 dip_m;
612 struct in6_addr dip6_m; // IPv6 Destination IP mask
613 u16 tos_proto_m;
614 u16 sport_m;
615 u16 dport_m;
616 u16 icmp_igmp_m;
617 u16 tcp_info_m;
618 u16 dsap_ssap_m;
619
620 // Data associated with actions
621 u8 fwd_act; // Type of forwarding action
622 // 0: permit, 1: drop, 2: copy to port id, 4: copy to portmask
623 // 4: redirect to portid, 5: redirect to portmask
624 // 6: route, 7: vlan leaky (only 8380)
625 u16 fwd_data; // Additional data for forwarding action, e.g. destination port
626 u8 ovid_act;
627 u16 ovid_data; // Outer VLAN ID
628 u8 ivid_act;
629 u16 ivid_data; // Inner VLAN ID
630 u16 flt_data; // Filtering data
631 u16 log_data; // ID of packet or octet counter in LOG table, on RTL93xx
632 // unnecessary since PIE-Rule-ID == LOG-counter-ID
633 bool log_octets;
634 u8 mpls_act; // MPLS action type
635 u16 mpls_lib_idx; // MPLS action data
636
637 u16 rmk_data; // Data for remarking
638 u16 meter_data; // ID of meter for bandwidth control
639 u16 tagst_data;
640 u16 mir_data;
641 u16 nopri_data;
642 u16 cpupri_data;
643 u16 otpid_data;
644 u16 itpid_data;
645 u16 shaper_data;
646
647 // Bypass actions, ignored on RTL8380
648 bool bypass_all; // Not clear
649 bool bypass_igr_stp; // Bypass Ingress STP state
650 bool bypass_ibc_sc; // Bypass Ingress Bandwidth Control and Storm Control
651 };
652
653 struct rtl838x_l3_intf {
654 u16 vid;
655 u8 smac_idx;
656 u8 ip4_mtu_id;
657 u8 ip6_mtu_id;
658 u16 ip4_mtu;
659 u16 ip6_mtu;
660 u8 ttl_scope;
661 u8 hl_scope;
662 u8 ip4_icmp_redirect;
663 u8 ip6_icmp_redirect;
664 u8 ip4_pbr_icmp_redirect;
665 u8 ip6_pbr_icmp_redirect;
666 };
667
668 /*
669 * An entry in the RTL93XX SoC's ROUTER_MAC tables setting up a termination point
670 * for the L3 routing system. Packets arriving and matching an entry in this table
671 * will be considered for routing.
672 * Mask fields state whether the corresponding data fields matter for matching
673 */
674 struct rtl93xx_rt_mac {
675 bool valid; // Valid or not
676 bool p_type; // Individual (0) or trunk (1) port
677 bool p_mask; // Whether the port type is used
678 u8 p_id;
679 u8 p_id_mask; // Mask for the port
680 u8 action; // Routing action performed: 0: FORWARD, 1: DROP, 2: TRAP2CPU
681 // 3: COPY2CPU, 4: TRAP2MASTERCPU, 5: COPY2MASTERCPU, 6: HARDDROP
682 u16 vid;
683 u16 vid_mask;
684 u64 mac; // MAC address used as source MAC in the routed packet
685 u64 mac_mask;
686 };
687
688 struct rtl83xx_nexthop {
689 u16 id; // ID: L3_NEXT_HOP table-index or route-index set in L2_NEXT_HOP
690 u32 dev_id;
691 u16 port;
692 u16 vid; // VLAN-ID for L2 table entry (saved from L2-UC entry)
693 u16 rvid; // Relay VID/FID for the L2 table entry
694 u64 mac; // The MAC address of the entry in the L2_NEXT_HOP table
695 u16 mac_id;
696 u16 l2_id; // Index of this next hop forwarding entry in L2 FIB table
697 u64 gw; // The gateway MAC address packets are forwarded to
698 int if_id; // Interface (into L3_EGR_INTF_IDX)
699 };
700
701 struct rtl838x_switch_priv;
702
703 struct rtl83xx_flow {
704 unsigned long cookie;
705 struct rhash_head node;
706 struct rcu_head rcu_head;
707 struct rtl838x_switch_priv *priv;
708 struct pie_rule rule;
709 u32 flags;
710 };
711
712 struct rtl93xx_route_attr {
713 bool valid;
714 bool hit;
715 bool ttl_dec;
716 bool ttl_check;
717 bool dst_null;
718 bool qos_as;
719 u8 qos_prio;
720 u8 type;
721 u8 action;
722 };
723
724 struct rtl83xx_route {
725 u32 gw_ip; // IP of the route's gateway
726 u32 dst_ip; // IP of the destination net
727 struct in6_addr dst_ip6;
728 int prefix_len; // Network prefix len of the destination net
729 bool is_host_route;
730 int id; // ID number of this route
731 struct rhlist_head linkage;
732 u16 switch_mac_id; // Index into switch's own MACs, RTL839X only
733 struct rtl83xx_nexthop nh;
734 struct pie_rule pr;
735 struct rtl93xx_route_attr attr;
736 };
737
738 struct rtl838x_reg {
739 void (*mask_port_reg_be)(u64 clear, u64 set, int reg);
740 void (*set_port_reg_be)(u64 set, int reg);
741 u64 (*get_port_reg_be)(int reg);
742 void (*mask_port_reg_le)(u64 clear, u64 set, int reg);
743 void (*set_port_reg_le)(u64 set, int reg);
744 u64 (*get_port_reg_le)(int reg);
745 int stat_port_rst;
746 int stat_rst;
747 int stat_port_std_mib;
748 int (*port_iso_ctrl)(int p);
749 void (*traffic_enable)(int source, int dest);
750 void (*traffic_disable)(int source, int dest);
751 void (*traffic_set)(int source, u64 dest_matrix);
752 u64 (*traffic_get)(int source);
753 int l2_ctrl_0;
754 int l2_ctrl_1;
755 int l2_port_aging_out;
756 int smi_poll_ctrl;
757 int l2_tbl_flush_ctrl;
758 void (*exec_tbl0_cmd)(u32 cmd);
759 void (*exec_tbl1_cmd)(u32 cmd);
760 int (*tbl_access_data_0)(int i);
761 int isr_glb_src;
762 int isr_port_link_sts_chg;
763 int imr_port_link_sts_chg;
764 int imr_glb;
765 void (*vlan_tables_read)(u32 vlan, struct rtl838x_vlan_info *info);
766 void (*vlan_set_tagged)(u32 vlan, struct rtl838x_vlan_info *info);
767 void (*vlan_set_untagged)(u32 vlan, u64 portmask);
768 void (*vlan_profile_dump)(int index);
769 void (*vlan_profile_setup)(int profile);
770 void (*stp_get)(struct rtl838x_switch_priv *priv, u16 msti, u32 port_state[]);
771 void (*stp_set)(struct rtl838x_switch_priv *priv, u16 msti, u32 port_state[]);
772 int (*mac_force_mode_ctrl)(int port);
773 int (*mac_port_ctrl)(int port);
774 int (*l2_port_new_salrn)(int port);
775 int (*l2_port_new_sa_fwd)(int port);
776 int mir_ctrl;
777 int mir_dpm;
778 int mir_spm;
779 int mac_link_sts;
780 int mac_link_dup_sts;
781 int (*mac_link_spd_sts)(int port);
782 int mac_rx_pause_sts;
783 int mac_tx_pause_sts;
784 u64 (*read_l2_entry_using_hash)(u32 hash, u32 position, struct rtl838x_l2_entry *e);
785 void (*write_l2_entry_using_hash)(u32 hash, u32 pos, struct rtl838x_l2_entry *e);
786 u64 (*read_cam)(int idx, struct rtl838x_l2_entry *e);
787 void (*write_cam)(int idx, struct rtl838x_l2_entry *e);
788 int vlan_port_egr_filter;
789 int vlan_port_igr_filter;
790 int vlan_port_pb;
791 int vlan_port_tag_sts_ctrl;
792 int (*rtl838x_vlan_port_tag_sts_ctrl)(int port);
793 int (*trk_mbr_ctr)(int group);
794 int rma_bpdu_fld_pmask;
795 int spcl_trap_eapol_ctrl;
796 void (*init_eee)(struct rtl838x_switch_priv *priv, bool enable);
797 void (*port_eee_set)(struct rtl838x_switch_priv *priv, int port, bool enable);
798 int (*eee_port_ability)(struct rtl838x_switch_priv *priv,
799 struct ethtool_eee *e, int port);
800 u64 (*l2_hash_seed)(u64 mac, u32 vid);
801 u32 (*l2_hash_key)(struct rtl838x_switch_priv *priv, u64 seed);
802 u64 (*read_mcast_pmask)(int idx);
803 void (*write_mcast_pmask)(int idx, u64 portmask);
804 void (*vlan_fwd_on_inner)(int port, bool is_set);
805 void (*pie_init)(struct rtl838x_switch_priv *priv);
806 int (*pie_rule_read)(struct rtl838x_switch_priv *priv, int idx, struct pie_rule *pr);
807 int (*pie_rule_write)(struct rtl838x_switch_priv *priv, int idx, struct pie_rule *pr);
808 int (*pie_rule_add)(struct rtl838x_switch_priv *priv, struct pie_rule *rule);
809 void (*pie_rule_rm)(struct rtl838x_switch_priv *priv, struct pie_rule *rule);
810 void (*l2_learning_setup)(void);
811 u32 (*packet_cntr_read)(int counter);
812 void (*packet_cntr_clear)(int counter);
813 void (*route_read)(int idx, struct rtl83xx_route *rt);
814 void (*route_write)(int idx, struct rtl83xx_route *rt);
815 void (*host_route_write)(int idx, struct rtl83xx_route *rt);
816 int (*l3_setup)(struct rtl838x_switch_priv *priv);
817 void (*set_l3_nexthop)(int idx, u16 dmac_id, u16 interface);
818 void (*get_l3_nexthop)(int idx, u16 *dmac_id, u16 *interface);
819 u64 (*get_l3_egress_mac)(u32 idx);
820 void (*set_l3_egress_mac)(u32 idx, u64 mac);
821 int (*find_l3_slot)(struct rtl83xx_route *rt, bool must_exist);
822 int (*route_lookup_hw)(struct rtl83xx_route *rt);
823 void (*get_l3_router_mac)(u32 idx, struct rtl93xx_rt_mac *m);
824 void (*set_l3_router_mac)(u32 idx, struct rtl93xx_rt_mac *m);
825 void (*set_l3_egress_intf)(int idx, struct rtl838x_l3_intf *intf);
826 };
827
828 struct rtl838x_switch_priv {
829 /* Switch operation */
830 struct dsa_switch *ds;
831 struct device *dev;
832 u16 id;
833 u16 family_id;
834 char version;
835 struct rtl838x_port ports[57];
836 struct mutex reg_mutex; // Mutex for individual register manipulations
837 struct mutex pie_mutex; // Mutex for Packet Inspection Engine
838 int link_state_irq;
839 int mirror_group_ports[4];
840 struct mii_bus *mii_bus;
841 const struct rtl838x_reg *r;
842 u8 cpu_port;
843 u8 port_mask;
844 u8 port_width;
845 u8 port_ignore;
846 u64 irq_mask;
847 u32 fib_entries;
848 int l2_bucket_size;
849 struct dentry *dbgfs_dir;
850 int n_lags;
851 u64 lags_port_members[MAX_LAGS];
852 struct net_device *lag_devs[MAX_LAGS];
853 struct notifier_block nb; // TODO: change to different name
854 struct notifier_block ne_nb;
855 struct notifier_block fib_nb;
856 bool eee_enabled;
857 unsigned long int mc_group_bm[MAX_MC_GROUPS >> 5];
858 int n_pie_blocks;
859 struct rhashtable tc_ht;
860 unsigned long int pie_use_bm[MAX_PIE_ENTRIES >> 5];
861 int n_counters;
862 unsigned long int octet_cntr_use_bm[MAX_COUNTERS >> 5];
863 unsigned long int packet_cntr_use_bm[MAX_COUNTERS >> 4];
864 struct rhltable routes;
865 unsigned long int route_use_bm[MAX_ROUTES >> 5];
866 unsigned long int host_route_use_bm[MAX_HOST_ROUTES >> 5];
867 struct rtl838x_l3_intf *interfaces[MAX_INTERFACES];
868 u16 intf_mtus[MAX_INTF_MTUS];
869 int intf_mtu_count[MAX_INTF_MTUS];
870 };
871
872 void rtl838x_dbgfs_init(struct rtl838x_switch_priv *priv);
873 void rtl930x_dbgfs_init(struct rtl838x_switch_priv *priv);
874
875 #endif /* _RTL838X_H */