1 /* SPDX-License-Identifier: GPL-2.0-only */
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 RTL931X_MAC_PORT_CTRL (0x6004)
16 #define RTL930X_MAC_L2_PORT_CTRL(port) (0x3268 + (((port) << 6)))
17 #define RTL931X_MAC_L2_PORT_CTRL (0x6000)
19 #define RTL838X_RST_GLB_CTRL_0 (0x003c)
21 #define RTL838X_MAC_FORCE_MODE_CTRL (0xa104)
22 #define RTL839X_MAC_FORCE_MODE_CTRL (0x02bc)
23 #define RTL930X_MAC_FORCE_MODE_CTRL (0xCA1C)
24 #define RTL931X_MAC_FORCE_MODE_CTRL (0x0DCC)
26 #define RTL838X_DMY_REG31 (0x3b28)
27 #define RTL838X_SDS_MODE_SEL (0x0028)
28 #define RTL838X_SDS_CFG_REG (0x0034)
29 #define RTL838X_INT_MODE_CTRL (0x005c)
30 #define RTL838X_CHIP_INFO (0x00d8)
31 #define RTL839X_CHIP_INFO (0x0ff4)
32 #define RTL838X_PORT_ISO_CTRL(port) (0x4100 + ((port) << 2))
33 #define RTL839X_PORT_ISO_CTRL(port) (0x1400 + ((port) << 3))
35 /* Packet statistics */
36 #define RTL838X_STAT_PORT_STD_MIB (0x1200)
37 #define RTL839X_STAT_PORT_STD_MIB (0xC000)
38 #define RTL930X_STAT_PORT_MIB_CNTR (0x0664)
39 #define RTL838X_STAT_RST (0x3100)
40 #define RTL839X_STAT_RST (0xF504)
41 #define RTL930X_STAT_RST (0x3240)
42 #define RTL931X_STAT_RST (0x7ef4)
43 #define RTL838X_STAT_PORT_RST (0x3104)
44 #define RTL839X_STAT_PORT_RST (0xF508)
45 #define RTL930X_STAT_PORT_RST (0x3244)
46 #define RTL931X_STAT_PORT_RST (0x7ef8)
47 #define RTL838X_STAT_CTRL (0x3108)
48 #define RTL839X_STAT_CTRL (0x04cc)
49 #define RTL930X_STAT_CTRL (0x3248)
50 #define RTL931X_STAT_CTRL (0x5720)
52 /* Registers of the internal Serdes of the 8390 */
53 #define RTL8390_SDS0_1_XSG0 (0xA000)
54 #define RTL8390_SDS0_1_XSG1 (0xA100)
55 #define RTL839X_SDS12_13_XSG0 (0xB800)
56 #define RTL839X_SDS12_13_XSG1 (0xB900)
57 #define RTL839X_SDS12_13_PWR0 (0xb880)
58 #define RTL839X_SDS12_13_PWR1 (0xb980)
60 /* Registers of the internal Serdes of the 8380 */
61 #define RTL838X_SDS4_FIB_REG0 (0xF800)
62 #define RTL838X_SDS4_REG28 (0xef80)
63 #define RTL838X_SDS4_DUMMY0 (0xef8c)
64 #define RTL838X_SDS5_EXT_REG6 (0xf18c)
67 #define RTL838X_VLAN_CTRL (0x3A74)
68 #define RTL838X_VLAN_PROFILE(idx) (0x3A88 + ((idx) << 2))
69 #define RTL838X_VLAN_PORT_EGR_FLTR (0x3A84)
70 #define RTL838X_VLAN_PORT_PB_VLAN (0x3C00)
71 #define RTL838X_VLAN_PORT_IGR_FLTR (0x3A7C)
72 #define RTL838X_VLAN_PORT_TAG_STS_CTRL (0xA530)
74 #define RTL839X_VLAN_PROFILE(idx) (0x25C0 + (((idx) << 3)))
75 #define RTL839X_VLAN_CTRL (0x26D4)
76 #define RTL839X_VLAN_PORT_PB_VLAN (0x26D8)
77 #define RTL839X_VLAN_PORT_IGR_FLTR (0x27B4)
78 #define RTL839X_VLAN_PORT_EGR_FLTR (0x27C4)
79 #define RTL839X_VLAN_PORT_TAG_STS_CTRL (0x6828)
80 #define RTL839X_VLAN_PORT_TAG_STS_CTRL (0x6828)
82 #define RTL930X_VLAN_PROFILE_SET(idx) (0x9c60 + (((idx) * 20)))
83 #define RTL930X_VLAN_CTRL (0x82D4)
84 #define RTL930X_VLAN_PORT_PB_VLAN (0x82D8)
85 #define RTL930X_VLAN_PORT_IGR_FLTR (0x83C0)
86 #define RTL930X_VLAN_PORT_EGR_FLTR (0x83C8)
87 #define RTL930X_VLAN_PORT_TAG_STS_CTRL (0xCE24)
89 #define RTL931X_VLAN_PROFILE_SET(idx) (0x9800 + (((idx) * 28)))
90 #define RTL931X_VLAN_CTRL (0x94E4)
91 #define RTL931X_VLAN_PORT_IGR_CTRL (0x94E8)
92 #define RTL931X_VLAN_PORT_IGR_FLTR (0x96B4)
93 #define RTL931X_VLAN_PORT_EGR_FLTR (0x96C4)
94 #define RTL931X_VLAN_PORT_TAG_CTRL (0x4860)
96 /* Table access registers */
97 #define RTL838X_TBL_ACCESS_CTRL_0 (0x6914)
98 #define RTL838X_TBL_ACCESS_DATA_0(idx) (0x6918 + ((idx) << 2))
99 #define RTL838X_TBL_ACCESS_CTRL_1 (0xA4C8)
100 #define RTL838X_TBL_ACCESS_DATA_1(idx) (0xA4CC + ((idx) << 2))
102 #define RTL839X_TBL_ACCESS_CTRL_0 (0x1190)
103 #define RTL839X_TBL_ACCESS_DATA_0(idx) (0x1194 + ((idx) << 2))
104 #define RTL839X_TBL_ACCESS_CTRL_1 (0x6b80)
105 #define RTL839X_TBL_ACCESS_DATA_1(idx) (0x6b84 + ((idx) << 2))
106 #define RTL839X_TBL_ACCESS_CTRL_2 (0x611C)
107 #define RTL839X_TBL_ACCESS_DATA_2(i) (0x6120 + (((i) << 2)))
109 #define RTL930X_TBL_ACCESS_CTRL_0 (0xB340)
110 #define RTL930X_TBL_ACCESS_DATA_0(idx) (0xB344 + ((idx) << 2))
111 #define RTL930X_TBL_ACCESS_CTRL_1 (0xB3A0)
112 #define RTL930X_TBL_ACCESS_DATA_1(idx) (0xB3A4 + ((idx) << 2))
113 #define RTL930X_TBL_ACCESS_CTRL_2 (0xCE04)
114 #define RTL930X_TBL_ACCESS_DATA_2(i) (0xCE08 + (((i) << 2)))
116 #define RTL931X_TBL_ACCESS_CTRL_0 (0x8500)
117 #define RTL931X_TBL_ACCESS_DATA_0(idx) (0x8508 + ((idx) << 2))
118 #define RTL931X_TBL_ACCESS_CTRL_1 (0x40C0)
119 #define RTL931X_TBL_ACCESS_DATA_1(idx) (0x40C4 + ((idx) << 2))
120 #define RTL931X_TBL_ACCESS_CTRL_2 (0x8528)
121 #define RTL931X_TBL_ACCESS_DATA_2(i) (0x852C + (((i) << 2)))
122 #define RTL931X_TBL_ACCESS_CTRL_3 (0x0200)
123 #define RTL931X_TBL_ACCESS_DATA_3(i) (0x0204 + (((i) << 2)))
124 #define RTL931X_TBL_ACCESS_CTRL_4 (0x20DC)
125 #define RTL931X_TBL_ACCESS_DATA_4(i) (0x20E0 + (((i) << 2)))
126 #define RTL931X_TBL_ACCESS_CTRL_5 (0x7E1C)
127 #define RTL931X_TBL_ACCESS_DATA_5(i) (0x7E20 + (((i) << 2)))
130 #define RTL838X_MAC_LINK_STS (0xa188)
131 #define RTL839X_MAC_LINK_STS (0x0390)
132 #define RTL930X_MAC_LINK_STS (0xCB10)
133 #define RTL931X_MAC_LINK_STS (0x0EC0)
134 #define RTL838X_MAC_LINK_SPD_STS(p) (0xa190 + (((p >> 4) << 2)))
135 #define RTL839X_MAC_LINK_SPD_STS(p) (0x03a0 + (((p >> 4) << 2)))
136 #define RTL930X_MAC_LINK_SPD_STS(p) (0xCB18 + (((p >> 3) << 2)))
137 #define RTL931X_MAC_LINK_SPD_STS (0x0ED0)
138 #define RTL838X_MAC_LINK_DUP_STS (0xa19c)
139 #define RTL839X_MAC_LINK_DUP_STS (0x03b0)
140 #define RTL930X_MAC_LINK_DUP_STS (0xCB28)
141 #define RTL931X_MAC_LINK_DUP_STS (0x0EF0)
142 #define RTL838X_MAC_TX_PAUSE_STS (0xa1a0)
143 #define RTL839X_MAC_TX_PAUSE_STS (0x03b8)
144 #define RTL930X_MAC_TX_PAUSE_STS (0xCB2C)
145 #define RTL931X_MAC_TX_PAUSE_STS (0x0EF8)
146 #define RTL838X_MAC_RX_PAUSE_STS (0xa1a4)
147 #define RTL839X_MAC_RX_PAUSE_STS (0x03c0)
148 #define RTL930X_MAC_RX_PAUSE_STS (0xCB30)
149 #define RTL931X_MAC_RX_PAUSE_STS (0x0F00)
150 #define RTL930X_MAC_LINK_MEDIA_STS (0xCB14)
151 #define RTL931X_MAC_LINK_MEDIA_STS (0x0EC8)
153 /* MAC link state bits */
154 #define RTL838X_FORCE_EN (1 << 0)
155 #define RTL838X_FORCE_LINK_EN (1 << 1)
156 #define RTL838X_NWAY_EN (1 << 2)
157 #define RTL838X_DUPLEX_MODE (1 << 3)
158 #define RTL838X_TX_PAUSE_EN (1 << 6)
159 #define RTL838X_RX_PAUSE_EN (1 << 7)
160 #define RTL838X_MAC_FORCE_FC_EN (1 << 8)
162 #define RTL839X_FORCE_EN (1 << 0)
163 #define RTL839X_FORCE_LINK_EN (1 << 1)
164 #define RTL839X_DUPLEX_MODE (1 << 2)
165 #define RTL839X_TX_PAUSE_EN (1 << 5)
166 #define RTL839X_RX_PAUSE_EN (1 << 6)
167 #define RTL839X_MAC_FORCE_FC_EN (1 << 7)
169 #define RTL930X_FORCE_EN (1 << 0)
170 #define RTL930X_FORCE_LINK_EN (1 << 1)
171 #define RTL930X_DUPLEX_MODE (1 << 2)
172 #define RTL930X_TX_PAUSE_EN (1 << 7)
173 #define RTL930X_RX_PAUSE_EN (1 << 8)
174 #define RTL930X_MAC_FORCE_FC_EN (1 << 9)
176 #define RTL931X_FORCE_EN (1 << 9)
177 #define RTL931X_FORCE_LINK_EN (1 << 0)
178 #define RTL931X_DUPLEX_MODE (1 << 2)
179 #define RTL931X_MAC_FORCE_FC_EN (1 << 4)
180 #define RTL931X_TX_PAUSE_EN (1 << 16)
181 #define RTL931X_RX_PAUSE_EN (1 << 17)
184 #define RTL838X_MAC_EEE_ABLTY (0xa1a8)
185 #define RTL838X_EEE_PORT_TX_EN (0x014c)
186 #define RTL838X_EEE_PORT_RX_EN (0x0150)
187 #define RTL838X_EEE_CLK_STOP_CTRL (0x0148)
188 #define RTL838X_EEE_TX_TIMER_GIGA_CTRL (0xaa04)
189 #define RTL838X_EEE_TX_TIMER_GELITE_CTRL (0xaa08)
191 #define RTL839X_EEE_TX_TIMER_GELITE_CTRL (0x042C)
192 #define RTL839X_EEE_TX_TIMER_GIGA_CTRL (0x0430)
193 #define RTL839X_EEE_TX_TIMER_10G_CTRL (0x0434)
194 #define RTL839X_EEE_CTRL(p) (0x8008 + ((p) << 7))
195 #define RTL839X_MAC_EEE_ABLTY (0x03C8)
197 #define RTL930X_MAC_EEE_ABLTY (0xCB34)
198 #define RTL930X_EEE_CTRL(p) (0x3274 + ((p) << 6))
199 #define RTL930X_EEEP_PORT_CTRL(p) (0x3278 + ((p) << 6))
201 /* L2 functionality */
202 #define RTL838X_L2_CTRL_0 (0x3200)
203 #define RTL839X_L2_CTRL_0 (0x3800)
204 #define RTL930X_L2_CTRL (0x8FD8)
205 #define RTL931X_L2_CTRL (0xC800)
206 #define RTL838X_L2_CTRL_1 (0x3204)
207 #define RTL839X_L2_CTRL_1 (0x3804)
208 #define RTL930X_L2_AGE_CTRL (0x8FDC)
209 #define RTL931X_L2_AGE_CTRL (0xC804)
210 #define RTL838X_L2_PORT_AGING_OUT (0x3358)
211 #define RTL839X_L2_PORT_AGING_OUT (0x3b74)
212 #define RTL930X_L2_PORT_AGE_CTRL (0x8FE0)
213 #define RTL931X_L2_PORT_AGE_CTRL (0xc808)
214 #define RTL838X_TBL_ACCESS_L2_CTRL (0x6900)
215 #define RTL839X_TBL_ACCESS_L2_CTRL (0x1180)
216 #define RTL930X_TBL_ACCESS_L2_CTRL (0xB320)
217 #define RTL930X_TBL_ACCESS_L2_METHOD_CTRL (0xB324)
218 #define RTL838X_TBL_ACCESS_L2_DATA(idx) (0x6908 + ((idx) << 2))
219 #define RTL839X_TBL_ACCESS_L2_DATA(idx) (0x1184 + ((idx) << 2))
220 #define RTL930X_TBL_ACCESS_L2_DATA(idx) (0xab08 + ((idx) << 2))
222 #define RTL838X_L2_TBL_FLUSH_CTRL (0x3370)
223 #define RTL839X_L2_TBL_FLUSH_CTRL (0x3ba0)
224 #define RTL930X_L2_TBL_FLUSH_CTRL (0x9404)
225 #define RTL931X_L2_TBL_FLUSH_CTRL (0xCD9C)
227 #define RTL838X_L2_LRN_CONSTRT (0x329C)
228 #define RTL839X_L2_LRN_CONSTRT (0x3910)
229 #define RTL930X_L2_LRN_CONSTRT_CTRL (0x909c)
230 #define RTL931X_L2_LRN_CONSTRT_CTRL (0xC964)
232 #define RTL838X_L2_FLD_PMSK (0x3288)
233 #define RTL839X_L2_FLD_PMSK (0x38EC)
234 #define RTL930X_L2_BC_FLD_PMSK (0x9068)
235 #define RTL931X_L2_BC_FLD_PMSK (0xC8FC)
237 #define RTL930X_L2_UNKN_UC_FLD_PMSK (0x9064)
238 #define RTL931X_L2_UNKN_UC_FLD_PMSK (0xC8F4)
240 #define RTL838X_L2_LRN_CONSTRT_EN (0x3368)
241 #define RTL838X_L2_PORT_LRN_CONSTRT (0x32A0)
242 #define RTL839X_L2_PORT_LRN_CONSTRT (0x3914)
244 #define RTL838X_L2_PORT_NEW_SALRN(p) (0x328c + (((p >> 4) << 2)))
245 #define RTL839X_L2_PORT_NEW_SALRN(p) (0x38F0 + (((p >> 4) << 2)))
246 #define RTL930X_L2_PORT_SALRN(p) (0x8FEC + (((p >> 4) << 2)))
247 #define RTL931X_L2_PORT_NEW_SALRN(p) (0xC820 + (((p >> 4) << 2)))
248 #define RTL838X_L2_PORT_NEW_SA_FWD(p) (0x3294 + (((p >> 4) << 2)))
249 #define RTL839X_L2_PORT_NEW_SA_FWD(p) (0x3900 + (((p >> 4) << 2)))
250 #define RTL930X_L2_PORT_NEW_SA_FWD(p) (0x8FF4 + (((p / 10) << 2)))
251 #define RTL931X_L2_PORT_NEW_SA_FWD(p) (0xC830 + (((p / 10) << 2)))
253 #define RTL930X_ST_CTRL (0x8798)
255 #define RTL930X_L2_PORT_SABLK_CTRL (0x905c)
256 #define RTL930X_L2_PORT_DABLK_CTRL (0x9060)
258 #define RTL838X_L2_PORT_LM_ACT(p) (0x3208 + ((p) << 2))
259 #define RTL838X_VLAN_PORT_FWD (0x3A78)
260 #define RTL839X_VLAN_PORT_FWD (0x27AC)
261 #define RTL930X_VLAN_PORT_FWD (0x834C)
262 #define RTL931X_VLAN_PORT_FWD (0x95CC)
263 #define RTL838X_VLAN_FID_CTRL (0x3aa8)
266 #define RTL838X_MIR_CTRL (0x5D00)
267 #define RTL838X_MIR_DPM_CTRL (0x5D20)
268 #define RTL838X_MIR_SPM_CTRL (0x5D10)
270 #define RTL839X_MIR_CTRL (0x2500)
271 #define RTL839X_MIR_DPM_CTRL (0x2530)
272 #define RTL839X_MIR_SPM_CTRL (0x2510)
274 #define RTL930X_MIR_CTRL (0xA2A0)
275 #define RTL930X_MIR_DPM_CTRL (0xA2C0)
276 #define RTL930X_MIR_SPM_CTRL (0xA2B0)
278 #define RTL931X_MIR_CTRL (0xAF00)
279 #define RTL931X_MIR_DPM_CTRL (0xAF30)
280 #define RTL931X_MIR_SPM_CTRL (0xAF10)
282 /* Storm/rate control and scheduling */
283 #define RTL838X_STORM_CTRL (0x4700)
284 #define RTL839X_STORM_CTRL (0x1800)
285 #define RTL838X_STORM_CTRL_LB_CTRL(p) (0x4884 + (((p) << 2)))
286 #define RTL838X_STORM_CTRL_BURST_PPS_0 (0x4874)
287 #define RTL838X_STORM_CTRL_BURST_PPS_1 (0x4878)
288 #define RTL838X_STORM_CTRL_BURST_0 (0x487c)
289 #define RTL838X_STORM_CTRL_BURST_1 (0x4880)
290 #define RTL839X_STORM_CTRL_LB_TICK_TKN_CTRL_0 (0x1804)
291 #define RTL839X_STORM_CTRL_LB_TICK_TKN_CTRL_1 (0x1808)
292 #define RTL838X_SCHED_CTRL (0xB980)
293 #define RTL839X_SCHED_CTRL (0x60F4)
294 #define RTL838X_SCHED_LB_TICK_TKN_CTRL_0 (0xAD58)
295 #define RTL838X_SCHED_LB_TICK_TKN_CTRL_1 (0xAD5C)
296 #define RTL839X_SCHED_LB_TICK_TKN_CTRL_0 (0x1804)
297 #define RTL839X_SCHED_LB_TICK_TKN_CTRL_1 (0x1808)
298 #define RTL839X_STORM_CTRL_SPCL_LB_TICK_TKN_CTRL (0x2000)
299 #define RTL839X_IGR_BWCTRL_LB_TICK_TKN_CTRL_0 (0x1604)
300 #define RTL839X_IGR_BWCTRL_LB_TICK_TKN_CTRL_1 (0x1608)
301 #define RTL839X_SCHED_LB_TICK_TKN_CTRL (0x60F8)
302 #define RTL839X_SCHED_LB_TICK_TKN_PPS_CTRL (0x6200)
303 #define RTL838X_SCHED_LB_THR (0xB984)
304 #define RTL839X_SCHED_LB_THR (0x60FC)
305 #define RTL838X_SCHED_P_EGR_RATE_CTRL(p) (0xC008 + (((p) << 7)))
306 #define RTL838X_SCHED_Q_EGR_RATE_CTRL(p, q) (0xC00C + (p << 7) + (((q) << 2)))
307 #define RTL838X_STORM_CTRL_PORT_BC_EXCEED (0x470C)
308 #define RTL838X_STORM_CTRL_PORT_MC_EXCEED (0x4710)
309 #define RTL838X_STORM_CTRL_PORT_UC_EXCEED (0x4714)
310 #define RTL839X_STORM_CTRL_PORT_BC_EXCEED(p) (0x180c + (((p >> 5) << 2)))
311 #define RTL839X_STORM_CTRL_PORT_MC_EXCEED(p) (0x1814 + (((p >> 5) << 2)))
312 #define RTL839X_STORM_CTRL_PORT_UC_EXCEED(p) (0x181c + (((p >> 5) << 2)))
313 #define RTL838X_STORM_CTRL_PORT_UC(p) (0x4718 + (((p) << 2)))
314 #define RTL838X_STORM_CTRL_PORT_MC(p) (0x478c + (((p) << 2)))
315 #define RTL838X_STORM_CTRL_PORT_BC(p) (0x4800 + (((p) << 2)))
316 #define RTL839X_STORM_CTRL_PORT_UC_0(p) (0x185C + (((p) << 3)))
317 #define RTL839X_STORM_CTRL_PORT_UC_1(p) (0x1860 + (((p) << 3)))
318 #define RTL839X_STORM_CTRL_PORT_MC_0(p) (0x19FC + (((p) << 3)))
319 #define RTL839X_STORM_CTRL_PORT_MC_1(p) (0x1a00 + (((p) << 3)))
320 #define RTL839X_STORM_CTRL_PORT_BC_0(p) (0x1B9C + (((p) << 3)))
321 #define RTL839X_STORM_CTRL_PORT_BC_1(p) (0x1BA0 + (((p) << 3)))
322 #define RTL839X_TBL_ACCESS_CTRL_2 (0x611C)
323 #define RTL839X_TBL_ACCESS_DATA_2(i) (0x6120 + (((i) << 2)))
324 #define RTL839X_IGR_BWCTRL_PORT_CTRL_10G_0(p) (0x1618 + (((p) << 3)))
325 #define RTL839X_IGR_BWCTRL_PORT_CTRL_10G_1(p) (0x161C + (((p) << 3)))
326 #define RTL839X_IGR_BWCTRL_PORT_CTRL_0(p) (0x1640 + (((p) << 3)))
327 #define RTL839X_IGR_BWCTRL_PORT_CTRL_1(p) (0x1644 + (((p) << 3)))
328 #define RTL839X_IGR_BWCTRL_CTRL_LB_THR (0x1614)
330 /* Link aggregation (Trunking) */
331 #define TRUNK_DISTRIBUTION_ALGO_SPA_BIT 0x01
332 #define TRUNK_DISTRIBUTION_ALGO_SMAC_BIT 0x02
333 #define TRUNK_DISTRIBUTION_ALGO_DMAC_BIT 0x04
334 #define TRUNK_DISTRIBUTION_ALGO_SIP_BIT 0x08
335 #define TRUNK_DISTRIBUTION_ALGO_DIP_BIT 0x10
336 #define TRUNK_DISTRIBUTION_ALGO_SRC_L4PORT_BIT 0x20
337 #define TRUNK_DISTRIBUTION_ALGO_DST_L4PORT_BIT 0x40
338 #define TRUNK_DISTRIBUTION_ALGO_MASKALL 0x7F
340 #define TRUNK_DISTRIBUTION_ALGO_L2_SPA_BIT 0x01
341 #define TRUNK_DISTRIBUTION_ALGO_L2_SMAC_BIT 0x02
342 #define TRUNK_DISTRIBUTION_ALGO_L2_DMAC_BIT 0x04
343 #define TRUNK_DISTRIBUTION_ALGO_L2_VLAN_BIT 0x08
344 #define TRUNK_DISTRIBUTION_ALGO_L2_MASKALL 0xF
346 #define TRUNK_DISTRIBUTION_ALGO_L3_SPA_BIT 0x01
347 #define TRUNK_DISTRIBUTION_ALGO_L3_SMAC_BIT 0x02
348 #define TRUNK_DISTRIBUTION_ALGO_L3_DMAC_BIT 0x04
349 #define TRUNK_DISTRIBUTION_ALGO_L3_VLAN_BIT 0x08
350 #define TRUNK_DISTRIBUTION_ALGO_L3_SIP_BIT 0x10
351 #define TRUNK_DISTRIBUTION_ALGO_L3_DIP_BIT 0x20
352 #define TRUNK_DISTRIBUTION_ALGO_L3_SRC_L4PORT_BIT 0x40
353 #define TRUNK_DISTRIBUTION_ALGO_L3_DST_L4PORT_BIT 0x80
354 #define TRUNK_DISTRIBUTION_ALGO_L3_PROTO_BIT 0x100
355 #define TRUNK_DISTRIBUTION_ALGO_L3_FLOW_LABEL_BIT 0x200
356 #define TRUNK_DISTRIBUTION_ALGO_L3_MASKALL 0x3FF
358 #define RTL838X_TRK_MBR_CTR (0x3E00)
359 #define RTL838X_TRK_HASH_IDX_CTRL (0x3E20)
360 #define RTL838X_TRK_HASH_CTRL (0x3E24)
362 #define RTL839X_TRK_MBR_CTR (0x2200)
363 #define RTL839X_TRK_HASH_IDX_CTRL (0x2280)
364 #define RTL839X_TRK_HASH_CTRL (0x2284)
366 #define RTL930X_TRK_MBR_CTRL (0xA41C)
367 #define RTL930X_TRK_HASH_CTRL (0x9F80)
369 #define RTL931X_TRK_MBR_CTRL (0xB8D0)
370 #define RTL931X_TRK_HASH_CTRL (0xBA70)
372 /* Attack prevention */
373 #define RTL838X_ATK_PRVNT_PORT_EN (0x5B00)
374 #define RTL838X_ATK_PRVNT_CTRL (0x5B04)
375 #define RTL838X_ATK_PRVNT_ACT (0x5B08)
376 #define RTL838X_ATK_PRVNT_STS (0x5B1C)
379 #define RTL838X_RMA_BPDU_FLD_PMSK (0x4348)
380 #define RTL930X_RMA_BPDU_FLD_PMSK (0x9F18)
381 #define RTL931X_RMA_BPDU_FLD_PMSK (0x8950)
382 #define RTL839X_RMA_BPDU_FLD_PMSK (0x125C)
384 #define RTL838X_SPCL_TRAP_CTRL (0x6980)
385 #define RTL838X_SPCL_TRAP_EAPOL_CTRL (0x6988)
386 #define RTL838X_SPCL_TRAP_ARP_CTRL (0x698C)
387 #define RTL838X_SPCL_TRAP_IGMP_CTRL (0x6984)
388 #define RTL838X_SPCL_TRAP_IPV6_CTRL (0x6994)
389 #define RTL838X_SPCL_TRAP_SWITCH_MAC_CTRL (0x6998)
391 #define RTL839X_SPCL_TRAP_CTRL (0x1054)
392 #define RTL839X_SPCL_TRAP_EAPOL_CTRL (0x105C)
393 #define RTL839X_SPCL_TRAP_ARP_CTRL (0x1060)
394 #define RTL839X_SPCL_TRAP_IGMP_CTRL (0x1058)
395 #define RTL839X_SPCL_TRAP_IPV6_CTRL (0x1064)
396 #define RTL839X_SPCL_TRAP_SWITCH_MAC_CTRL (0x1068)
397 #define RTL839X_SPCL_TRAP_SWITCH_IPV4_ADDR_CTRL (0x106C)
398 #define RTL839X_SPCL_TRAP_CRC_CTRL (0x1070)
399 /* special port action controls */
402 0 = FORWARD (default)
405 3 = FLOOD IN ALL PORT
408 offset = CTRL + (port >> 4) << 2
409 value/mask = 3 << ((port&0xF) << 1)
431 #define RTL838X_RMA_BPDU_CTRL (0x4330)
432 #define RTL839X_RMA_BPDU_CTRL (0x122C)
433 #define RTL930X_RMA_BPDU_CTRL (0x9E7C)
434 #define RTL931X_RMA_BPDU_CTRL (0x881C)
436 #define RTL838X_RMA_PTP_CTRL (0x4338)
437 #define RTL839X_RMA_PTP_CTRL (0x123C)
438 #define RTL930X_RMA_PTP_CTRL (0x9E88)
439 #define RTL931X_RMA_PTP_CTRL (0x8834)
441 #define RTL838X_RMA_LLTP_CTRL (0x4340)
442 #define RTL839X_RMA_LLTP_CTRL (0x124C)
443 #define RTL930X_RMA_LLTP_CTRL (0x9EFC)
444 #define RTL931X_RMA_LLTP_CTRL (0x8918)
446 #define RTL930X_RMA_EAPOL_CTRL (0x9F08)
447 #define RTL931X_RMA_EAPOL_CTRL (0x8930)
448 #define RTL931X_TRAP_ARP_GRAT_PORT_ACT (0x8C04)
451 #define RTL838X_QM_INTPRI2QID_CTRL (0x5F00)
452 #define RTL839X_QM_INTPRI2QID_CTRL(q) (0x1110 + (q << 2))
453 #define RTL839X_QM_PORT_QNUM(p) (0x1130 + (((p / 10) << 2)))
454 #define RTL838X_PRI_SEL_PORT_PRI(p) (0x5FB8 + (((p / 10) << 2)))
455 #define RTL839X_PRI_SEL_PORT_PRI(p) (0x10A8 + (((p / 10) << 2)))
456 #define RTL838X_QM_PKT2CPU_INTPRI_MAP (0x5F10)
457 #define RTL839X_QM_PKT2CPU_INTPRI_MAP (0x1154)
458 #define RTL838X_PRI_SEL_CTRL (0x10E0)
459 #define RTL839X_PRI_SEL_CTRL (0x10E0)
460 #define RTL838X_PRI_SEL_TBL_CTRL(i) (0x5FD8 + (((i) << 2)))
461 #define RTL839X_PRI_SEL_TBL_CTRL(i) (0x10D0 + (((i) << 2)))
462 #define RTL838X_QM_PKT2CPU_INTPRI_0 (0x5F04)
463 #define RTL838X_QM_PKT2CPU_INTPRI_1 (0x5F08)
464 #define RTL838X_QM_PKT2CPU_INTPRI_2 (0x5F0C)
465 #define RTL839X_OAM_CTRL (0x2100)
466 #define RTL839X_OAM_PORT_ACT_CTRL(p) (0x2104 + (((p) << 2)))
467 #define RTL839X_RMK_PORT_DEI_TAG_CTRL(p) (0x6A9C + (((p >> 5) << 2)))
468 #define RTL839X_PRI_SEL_IPRI_REMAP (0x1080)
469 #define RTL838X_PRI_SEL_IPRI_REMAP (0x5F8C)
470 #define RTL839X_PRI_SEL_DEI2DP_REMAP (0x10EC)
471 #define RTL839X_PRI_SEL_DSCP2DP_REMAP_ADDR(i) (0x10F0 + (((i >> 4) << 2)))
472 #define RTL839X_RMK_DEI_CTRL (0x6AA4)
473 #define RTL839X_WRED_PORT_THR_CTRL(i) (0x6084 + ((i) << 2))
474 #define RTL839X_WRED_QUEUE_THR_CTRL(q, i) (0x6090 + ((q) * 12) + ((i) << 2))
475 #define RTL838X_PRI_DSCP_INVLD_CTRL0 (0x5FE8)
476 #define RTL838X_RMK_IPRI_CTRL (0xA460)
477 #define RTL838X_RMK_OPRI_CTRL (0xA464)
478 #define RTL838X_SCHED_P_TYPE_CTRL(p) (0xC04C + (((p) << 7)))
479 #define RTL838X_SCHED_LB_CTRL(p) (0xC004 + (((p) << 7)))
480 #define RTL838X_FC_P_EGR_DROP_CTRL(p) (0x6B1C + (((p) << 2)))
483 #define RTL930X_STAT_PRVTE_DROP_COUNTER0 (0xB5B8)
485 /* Packet Inspection Engine */
486 #define RTL838X_METER_GLB_CTRL (0x4B08)
487 #define RTL839X_METER_GLB_CTRL (0x1300)
488 #define RTL930X_METER_GLB_CTRL (0xa0a0)
489 #define RTL931X_METER_GLB_CTRL (0x411C)
491 #define RTL839X_ACL_CTRL (0x1288)
493 #define RTL838X_ACL_BLK_LOOKUP_CTRL (0x6100)
494 #define RTL839X_ACL_BLK_LOOKUP_CTRL (0x1280)
495 #define RTL930X_PIE_BLK_LOOKUP_CTRL (0xa5a0)
496 #define RTL931X_PIE_BLK_LOOKUP_CTRL (0x4180)
498 #define RTL838X_ACL_BLK_PWR_CTRL (0x6104)
499 #define RTL839X_PS_ACL_PWR_CTRL (0x049c)
501 #define RTL838X_ACL_BLK_TMPLTE_CTRL(block) (0x6108 + ((block) << 2))
502 #define RTL839X_ACL_BLK_TMPLTE_CTRL(block) (0x128c + ((block) << 2))
503 #define RTL930X_PIE_BLK_TMPLTE_CTRL(block) (0xa624 + ((block) << 2))
504 #define RTL931X_PIE_BLK_TMPLTE_CTRL(block) (0x4214 + ((block) << 2))
506 #define RTL838X_ACL_BLK_GROUP_CTRL (0x615C)
507 #define RTL839X_ACL_BLK_GROUP_CTRL (0x12ec)
509 #define RTL838X_ACL_CLR_CTRL (0x6168)
510 #define RTL839X_ACL_CLR_CTRL (0x12fc)
511 #define RTL930X_PIE_CLR_CTRL (0xa66c)
512 #define RTL931X_PIE_CLR_CTRL (0x42D8)
514 #define RTL838X_DMY_REG27 (0x3378)
516 #define RTL838X_ACL_PORT_LOOKUP_CTRL(p) (0x616C + (((p) << 2)))
517 #define RTL930X_ACL_PORT_LOOKUP_CTRL(p) (0xA784 + (((p) << 2)))
518 #define RTL931X_ACL_PORT_LOOKUP_CTRL(p) (0x44F8 + (((p) << 2)))
520 #define RTL930X_PIE_BLK_PHASE_CTRL (0xA5A4)
521 #define RTL931X_PIE_BLK_PHASE_CTRL (0x4184)
524 #define PIE_ACT_COPY_TO_PORT 2
525 #define PIE_ACT_REDIRECT_TO_PORT 4
526 #define PIE_ACT_ROUTE_UC 6
527 #define PIE_ACT_VID_ASSIGN 0
532 #define L3_TRAP2CPU 2
533 #define L3_COPY2CPU 3
534 #define L3_TRAP2MASTERCPU 4
535 #define L3_COPY2MASTERCPU 5
536 #define L3_HARDDROP 6
539 #define ROUTE_ACT_FORWARD 0
540 #define ROUTE_ACT_TRAP2CPU 1
541 #define ROUTE_ACT_COPY2CPU 2
542 #define ROUTE_ACT_DROP 3
545 #define RTL839X_ROUTING_SA_CTRL 0x6afc
546 #define RTL930X_L3_HOST_TBL_CTRL (0xAB48)
547 #define RTL930X_L3_IPUC_ROUTE_CTRL (0xAB4C)
548 #define RTL930X_L3_IP6UC_ROUTE_CTRL (0xAB50)
549 #define RTL930X_L3_IPMC_ROUTE_CTRL (0xAB54)
550 #define RTL930X_L3_IP6MC_ROUTE_CTRL (0xAB58)
551 #define RTL930X_L3_IP_MTU_CTRL(i) (0xAB5C + ((i >> 1) << 2))
552 #define RTL930X_L3_IP6_MTU_CTRL(i) (0xAB6C + ((i >> 1) << 2))
553 #define RTL930X_L3_HW_LU_KEY_CTRL (0xAC9C)
554 #define RTL930X_L3_HW_LU_KEY_IP_CTRL (0xACA0)
555 #define RTL930X_L3_HW_LU_CTRL (0xACC0)
556 #define RTL930X_L3_IP_ROUTE_CTRL 0xab44
558 /* Port LED Control */
559 #define RTL930X_LED_PORT_NUM_CTRL(p) (0xCC04 + (((p >> 4) << 2)))
560 #define RTL930X_LED_SET0_0_CTRL (0xCC28)
561 #define RTL930X_LED_PORT_COPR_SET_SEL_CTRL(p) (0xCC2C + (((p >> 4) << 2)))
562 #define RTL930X_LED_PORT_FIB_SET_SEL_CTRL(p) (0xCC34 + (((p >> 4) << 2)))
563 #define RTL930X_LED_PORT_COPR_MASK_CTRL (0xCC3C)
564 #define RTL930X_LED_PORT_FIB_MASK_CTRL (0xCC40)
565 #define RTL930X_LED_PORT_COMBO_MASK_CTRL (0xCC44)
567 #define RTL931X_LED_PORT_NUM_CTRL(p) (0x0604 + (((p >> 4) << 2)))
568 #define RTL931X_LED_SET0_0_CTRL (0x0630)
569 #define RTL931X_LED_PORT_COPR_SET_SEL_CTRL(p) (0x0634 + (((p >> 4) << 2)))
570 #define RTL931X_LED_PORT_FIB_SET_SEL_CTRL(p) (0x0644 + (((p >> 4) << 2)))
571 #define RTL931X_LED_PORT_COPR_MASK_CTRL (0x0654)
572 #define RTL931X_LED_PORT_FIB_MASK_CTRL (0x065c)
573 #define RTL931X_LED_PORT_COMBO_MASK_CTRL (0x0664)
575 #define MAX_VLANS 4096
578 #define RTL930X_PORT_IGNORE 0x3f
579 #define MAX_MC_GROUPS 512
580 #define UNKNOWN_MC_PMASK (MAX_MC_GROUPS - 1)
581 #define PIE_BLOCK_SIZE 128
582 #define MAX_PIE_ENTRIES (18 * PIE_BLOCK_SIZE)
583 #define N_FIXED_FIELDS 12
584 #define N_FIXED_FIELDS_RTL931X 14
585 #define MAX_COUNTERS 2048
586 #define MAX_ROUTES 512
587 #define MAX_HOST_ROUTES 1536
588 #define MAX_INTF_MTUS 8
589 #define DEFAULT_MTU 1536
590 #define MAX_INTERFACES 100
591 #define MAX_ROUTER_MACS 64
592 #define L3_EGRESS_DMACS 2048
598 PHY_RTL8218B_INT
= 2,
599 PHY_RTL8218B_EXT
= 3,
606 PBVLAN_TYPE_INNER
= 0,
611 PBVLAN_MODE_UNTAG_AND_PRITAG
= 0,
612 PBVLAN_MODE_UNTAG_ONLY
,
616 struct rtl838x_port
{
622 bool phy_is_integrated
;
627 const struct dsa_port
*dp
;
630 struct rtl838x_vlan_info
{
638 // The following fields are used only by the RTL931X
639 int if_id
; // Interface (index in L3_EGR_INTF_IDX)
640 u16 multicast_grp_mask
;
641 int l2_tunnel_list_id
;
652 struct rtl838x_l2_entry
{
658 enum l2_entry_type type
;
670 u16 mc_portmask_index
;
675 bool nh_vlan_target
; // Only RTL83xx: VLAN used for next hop
677 // The following is only valid on RTL931x
680 bool is_local_forward
;
681 bool is_remote_forward
;
684 int l2_tunnel_list_id
;
687 enum fwd_rule_action
{
688 FWD_RULE_ACTION_NONE
= 0,
689 FWD_RULE_ACTION_FWD
= 1,
708 /* Intermediate representation of a Packet Inspection Engine Rule
709 * as suggested by the Kernel's tc flower offload subsystem
710 * Field meaning is universal across SoC families, but data content is specific
711 * to SoC family (e.g. because of different port ranges) */
714 enum pie_phase phase
; // Phase in which this template is applied
715 int packet_cntr
; // ID of a packet counter assigned to this rule
716 int octet_cntr
; // ID of a byte counter assigned to this rule
720 // The following are requirements for the pie template
722 bool is_ipv6
; // This is a rule with IPv6 fields
724 // Fixed fields that are always matched against on RTL8380
726 u8 spn
; // Source port number
727 bool stacking_port
; // Source port is stacking port
728 bool mgnt_vlan
; // Packet arrived on management VLAN
729 bool dmac_hit_sw
; // The packet's destination MAC matches one of the device's
730 bool content_too_deep
; // The content of the packet cannot be parsed: too many layers
731 bool not_first_frag
; // Not the first IP fragment
732 u8 frame_type_l4
; // 0: UDP, 1: TCP, 2: ICMP/ICMPv6, 3: IGMP
733 u8 frame_type
; // 0: ARP, 1: L2 only, 2: IPv4, 3: IPv6
734 bool otag_fmt
; // 0: outer tag packet, 1: outer priority tag or untagged
735 bool itag_fmt
; // 0: inner tag packet, 1: inner priority tag or untagged
736 bool otag_exist
; // packet with outer tag
737 bool itag_exist
; // packet with inner tag
738 bool frame_type_l2
; // 0: Ethernet, 1: LLC_SNAP, 2: LLC_Other, 3: Reserved
739 bool igr_normal_port
; // Ingress port is not cpu or stacking port
740 u8 tid
; // The template ID defining the what the templated fields mean
742 // Masks for the fields that are always matched against on RTL8380
745 bool stacking_port_m
;
748 bool content_too_deep_m
;
749 bool not_first_frag_m
;
756 bool frame_type_l2_m
;
757 bool igr_normal_port_m
;
760 // Logical operations between rules, special rules for rule numbers apply
762 bool cond_not
; // Matches when conditions not match
763 bool cond_and1
; // And this rule 2n with the next rule 2n+1 in same block
764 bool cond_and2
; // And this rule m in block 2n with rule m in block 2n+1
767 // Actions to be performed
768 bool drop
; // Drop the packet
769 bool fwd_sel
; // Forward packet: to port, portmask, dest route, next rule, drop
770 bool ovid_sel
; // So something to outer vlan-id: shift, re-assign
771 bool ivid_sel
; // Do something to inner vlan-id: shift, re-assign
772 bool flt_sel
; // Filter the packet when sending to certain ports
773 bool log_sel
; // Log the packet in one of the LOG-table counters
774 bool rmk_sel
; // Re-mark the packet, i.e. change the priority-tag
775 bool meter_sel
; // Meter the packet, i.e. limit rate of this type of packet
776 bool tagst_sel
; // Change the ergress tag
777 bool mir_sel
; // Mirror the packet to a Link Aggregation Group
778 bool nopri_sel
; // Change the normal priority
779 bool cpupri_sel
; // Change the CPU priority
780 bool otpid_sel
; // Change Outer Tag Protocol Identifier (802.1q)
781 bool itpid_sel
; // Change Inner Tag Protocol Identifier (802.1q)
782 bool shaper_sel
; // Apply traffic shaper
783 bool mpls_sel
; // MPLS actions
784 bool bypass_sel
; // Bypass actions
785 bool fwd_sa_lrn
; // Learn the source address when forwarding
786 bool fwd_mod_to_cpu
; // Forward the modified VLAN tag format to CPU-port
788 // Fields used in predefined templates 0-2 on RTL8380 / 90 / 9300
789 u64 spm
; // Source Port Matrix
790 u16 otag
; // Outer VLAN-ID
791 u8 smac
[ETH_ALEN
]; // Source MAC address
792 u8 dmac
[ETH_ALEN
]; // Destination MAC address
793 u16 ethertype
; // Ethernet frame type field in ethernet header
794 u16 itag
; // Inner VLAN-ID
795 u16 field_range_check
;
796 u32 sip
; // Source IP
797 struct in6_addr sip6
; // IPv6 Source IP
798 u32 dip
; // Destination IP
799 struct in6_addr dip6
; // IPv6 Destination IP
800 u16 tos_proto
; // IPv4: TOS + Protocol fields, IPv6: Traffic class + next header
801 u16 sport
; // TCP/UDP source port
802 u16 dport
; // TCP/UDP destination port
805 u16 dsap_ssap
; // Destination / Source Service Access Point bytes (802.3)
813 u16 field_range_check_m
;
815 struct in6_addr sip6_m
; // IPv6 Source IP mask
817 struct in6_addr dip6_m
; // IPv6 Destination IP mask
825 // Data associated with actions
826 u8 fwd_act
; // Type of forwarding action
827 // 0: permit, 1: drop, 2: copy to port id, 4: copy to portmask
828 // 4: redirect to portid, 5: redirect to portmask
829 // 6: route, 7: vlan leaky (only 8380)
830 u16 fwd_data
; // Additional data for forwarding action, e.g. destination port
832 u16 ovid_data
; // Outer VLAN ID
834 u16 ivid_data
; // Inner VLAN ID
835 u16 flt_data
; // Filtering data
836 u16 log_data
; // ID of packet or octet counter in LOG table, on RTL93xx
837 // unnecessary since PIE-Rule-ID == LOG-counter-ID
839 u8 mpls_act
; // MPLS action type
840 u16 mpls_lib_idx
; // MPLS action data
842 u16 rmk_data
; // Data for remarking
843 u16 meter_data
; // ID of meter for bandwidth control
852 // Bypass actions, ignored on RTL8380
853 bool bypass_all
; // Not clear
854 bool bypass_igr_stp
; // Bypass Ingress STP state
855 bool bypass_ibc_sc
; // Bypass Ingress Bandwidth Control and Storm Control
858 struct rtl838x_l3_intf
{
867 u8 ip4_icmp_redirect
;
868 u8 ip6_icmp_redirect
;
869 u8 ip4_pbr_icmp_redirect
;
870 u8 ip6_pbr_icmp_redirect
;
874 * An entry in the RTL93XX SoC's ROUTER_MAC tables setting up a termination point
875 * for the L3 routing system. Packets arriving and matching an entry in this table
876 * will be considered for routing.
877 * Mask fields state whether the corresponding data fields matter for matching
879 struct rtl93xx_rt_mac
{
880 bool valid
; // Valid or not
881 bool p_type
; // Individual (0) or trunk (1) port
882 bool p_mask
; // Whether the port type is used
884 u8 p_id_mask
; // Mask for the port
885 u8 action
; // Routing action performed: 0: FORWARD, 1: DROP, 2: TRAP2CPU
886 // 3: COPY2CPU, 4: TRAP2MASTERCPU, 5: COPY2MASTERCPU, 6: HARDDROP
889 u64 mac
; // MAC address used as source MAC in the routed packet
893 struct rtl83xx_nexthop
{
894 u16 id
; // ID: L3_NEXT_HOP table-index or route-index set in L2_NEXT_HOP
897 u16 vid
; // VLAN-ID for L2 table entry (saved from L2-UC entry)
898 u16 rvid
; // Relay VID/FID for the L2 table entry
899 u64 mac
; // The MAC address of the entry in the L2_NEXT_HOP table
901 u16 l2_id
; // Index of this next hop forwarding entry in L2 FIB table
902 u64 gw
; // The gateway MAC address packets are forwarded to
903 int if_id
; // Interface (into L3_EGR_INTF_IDX)
906 struct rtl838x_switch_priv
;
908 struct rtl83xx_flow
{
909 unsigned long cookie
;
910 struct rhash_head node
;
911 struct rcu_head rcu_head
;
912 struct rtl838x_switch_priv
*priv
;
913 struct pie_rule rule
;
917 struct rtl93xx_route_attr
{
929 struct rtl83xx_route
{
930 u32 gw_ip
; // IP of the route's gateway
931 u32 dst_ip
; // IP of the destination net
932 struct in6_addr dst_ip6
;
933 int prefix_len
; // Network prefix len of the destination net
935 int id
; // ID number of this route
936 struct rhlist_head linkage
;
937 u16 switch_mac_id
; // Index into switch's own MACs, RTL839X only
938 struct rtl83xx_nexthop nh
;
940 struct rtl93xx_route_attr attr
;
944 void (*mask_port_reg_be
)(u64 clear
, u64 set
, int reg
);
945 void (*set_port_reg_be
)(u64 set
, int reg
);
946 u64 (*get_port_reg_be
)(int reg
);
947 void (*mask_port_reg_le
)(u64 clear
, u64 set
, int reg
);
948 void (*set_port_reg_le
)(u64 set
, int reg
);
949 u64 (*get_port_reg_le
)(int reg
);
952 int stat_port_std_mib
;
953 int (*port_iso_ctrl
)(int p
);
954 void (*traffic_enable
)(int source
, int dest
);
955 void (*traffic_disable
)(int source
, int dest
);
956 void (*traffic_set
)(int source
, u64 dest_matrix
);
957 u64 (*traffic_get
)(int source
);
961 u32 l2_port_aging_out
;
962 int l2_tbl_flush_ctrl
;
963 void (*exec_tbl0_cmd
)(u32 cmd
);
964 void (*exec_tbl1_cmd
)(u32 cmd
);
965 int (*tbl_access_data_0
)(int i
);
967 int isr_port_link_sts_chg
;
968 int imr_port_link_sts_chg
;
970 void (*vlan_tables_read
)(u32 vlan
, struct rtl838x_vlan_info
*info
);
971 void (*vlan_set_tagged
)(u32 vlan
, struct rtl838x_vlan_info
*info
);
972 void (*vlan_set_untagged
)(u32 vlan
, u64 portmask
);
973 void (*vlan_profile_dump
)(int index
);
974 void (*vlan_profile_setup
)(int profile
);
975 void (*vlan_port_pvidmode_set
)(int port
, enum pbvlan_type type
, enum pbvlan_mode mode
);
976 void (*vlan_port_pvid_set
)(int port
, enum pbvlan_type type
, int pvid
);
977 void (*set_vlan_igr_filter
)(int port
, enum igr_filter state
);
978 void (*set_vlan_egr_filter
)(int port
, enum egr_filter state
);
979 void (*enable_learning
)(int port
, bool enable
);
980 void (*enable_flood
)(int port
, bool enable
);
981 void (*enable_mcast_flood
)(int port
, bool enable
);
982 void (*enable_bcast_flood
)(int port
, bool enable
);
983 void (*stp_get
)(struct rtl838x_switch_priv
*priv
, u16 msti
, u32 port_state
[]);
984 void (*stp_set
)(struct rtl838x_switch_priv
*priv
, u16 msti
, u32 port_state
[]);
985 int (*mac_force_mode_ctrl
)(int port
);
986 int (*mac_port_ctrl
)(int port
);
987 int (*l2_port_new_salrn
)(int port
);
988 int (*l2_port_new_sa_fwd
)(int port
);
989 int (*set_ageing_time
)(unsigned long msec
);
994 int mac_link_dup_sts
;
995 int (*mac_link_spd_sts
)(int port
);
996 int mac_rx_pause_sts
;
997 int mac_tx_pause_sts
;
998 u64 (*read_l2_entry_using_hash
)(u32 hash
, u32 position
, struct rtl838x_l2_entry
*e
);
999 void (*write_l2_entry_using_hash
)(u32 hash
, u32 pos
, struct rtl838x_l2_entry
*e
);
1000 u64 (*read_cam
)(int idx
, struct rtl838x_l2_entry
*e
);
1001 void (*write_cam
)(int idx
, struct rtl838x_l2_entry
*e
);
1002 int vlan_port_tag_sts_ctrl
;
1003 int (*rtl838x_vlan_port_tag_sts_ctrl
)(int port
);
1004 int (*trk_mbr_ctr
)(int group
);
1005 int rma_bpdu_fld_pmask
;
1006 int spcl_trap_eapol_ctrl
;
1007 void (*init_eee
)(struct rtl838x_switch_priv
*priv
, bool enable
);
1008 void (*port_eee_set
)(struct rtl838x_switch_priv
*priv
, int port
, bool enable
);
1009 int (*eee_port_ability
)(struct rtl838x_switch_priv
*priv
,
1010 struct ethtool_eee
*e
, int port
);
1011 u64 (*l2_hash_seed
)(u64 mac
, u32 vid
);
1012 u32 (*l2_hash_key
)(struct rtl838x_switch_priv
*priv
, u64 seed
);
1013 u64 (*read_mcast_pmask
)(int idx
);
1014 void (*write_mcast_pmask
)(int idx
, u64 portmask
);
1015 void (*vlan_fwd_on_inner
)(int port
, bool is_set
);
1016 void (*pie_init
)(struct rtl838x_switch_priv
*priv
);
1017 int (*pie_rule_read
)(struct rtl838x_switch_priv
*priv
, int idx
, struct pie_rule
*pr
);
1018 int (*pie_rule_write
)(struct rtl838x_switch_priv
*priv
, int idx
, struct pie_rule
*pr
);
1019 int (*pie_rule_add
)(struct rtl838x_switch_priv
*priv
, struct pie_rule
*rule
);
1020 void (*pie_rule_rm
)(struct rtl838x_switch_priv
*priv
, struct pie_rule
*rule
);
1021 void (*l2_learning_setup
)(void);
1022 u32 (*packet_cntr_read
)(int counter
);
1023 void (*packet_cntr_clear
)(int counter
);
1024 void (*route_read
)(int idx
, struct rtl83xx_route
*rt
);
1025 void (*route_write
)(int idx
, struct rtl83xx_route
*rt
);
1026 void (*host_route_write
)(int idx
, struct rtl83xx_route
*rt
);
1027 int (*l3_setup
)(struct rtl838x_switch_priv
*priv
);
1028 void (*set_l3_nexthop
)(int idx
, u16 dmac_id
, u16 interface
);
1029 void (*get_l3_nexthop
)(int idx
, u16
*dmac_id
, u16
*interface
);
1030 u64 (*get_l3_egress_mac
)(u32 idx
);
1031 void (*set_l3_egress_mac
)(u32 idx
, u64 mac
);
1032 int (*find_l3_slot
)(struct rtl83xx_route
*rt
, bool must_exist
);
1033 int (*route_lookup_hw
)(struct rtl83xx_route
*rt
);
1034 void (*get_l3_router_mac
)(u32 idx
, struct rtl93xx_rt_mac
*m
);
1035 void (*set_l3_router_mac
)(u32 idx
, struct rtl93xx_rt_mac
*m
);
1036 void (*set_l3_egress_intf
)(int idx
, struct rtl838x_l3_intf
*intf
);
1037 void (*set_distribution_algorithm
)(int group
, int algoidx
, u32 algomask
);
1038 void (*set_receive_management_action
)(int port
, rma_ctrl_t type
, action_type_t action
);
1039 void (*led_init
)(struct rtl838x_switch_priv
*priv
);
1042 struct rtl838x_switch_priv
{
1043 /* Switch operation */
1044 struct dsa_switch
*ds
;
1049 struct rtl838x_port ports
[57];
1050 struct mutex reg_mutex
; // Mutex for individual register manipulations
1051 struct mutex pie_mutex
; // Mutex for Packet Inspection Engine
1053 int mirror_group_ports
[4];
1054 struct mii_bus
*mii_bus
;
1055 const struct rtl838x_reg
*r
;
1063 struct dentry
*dbgfs_dir
;
1065 u64 lags_port_members
[MAX_LAGS
];
1066 struct net_device
*lag_devs
[MAX_LAGS
];
1067 u32 lag_primary
[MAX_LAGS
];
1068 u32 is_lagmember
[57];
1070 struct notifier_block nb
; // TODO: change to different name
1071 struct notifier_block ne_nb
;
1072 struct notifier_block fib_nb
;
1074 unsigned long int mc_group_bm
[MAX_MC_GROUPS
>> 5];
1075 int mc_group_saves
[MAX_MC_GROUPS
];
1077 struct rhashtable tc_ht
;
1078 unsigned long int pie_use_bm
[MAX_PIE_ENTRIES
>> 5];
1080 unsigned long int octet_cntr_use_bm
[MAX_COUNTERS
>> 5];
1081 unsigned long int packet_cntr_use_bm
[MAX_COUNTERS
>> 4];
1082 struct rhltable routes
;
1083 unsigned long int route_use_bm
[MAX_ROUTES
>> 5];
1084 unsigned long int host_route_use_bm
[MAX_HOST_ROUTES
>> 5];
1085 struct rtl838x_l3_intf
*interfaces
[MAX_INTERFACES
];
1086 u16 intf_mtus
[MAX_INTF_MTUS
];
1087 int intf_mtu_count
[MAX_INTF_MTUS
];
1090 void rtl838x_dbgfs_init(struct rtl838x_switch_priv
*priv
);
1091 void rtl930x_dbgfs_init(struct rtl838x_switch_priv
*priv
);
1093 #endif /* _RTL838X_H */