Loading...
1/* SPDX-License-Identifier: GPL-2.0 */
2/* Renesas Ethernet Switch device driver
3 *
4 * Copyright (C) 2022 Renesas Electronics Corporation
5 */
6
7#ifndef __RSWITCH_H__
8#define __RSWITCH_H__
9
10#include <linux/platform_device.h>
11#include "rcar_gen4_ptp.h"
12
13#define RSWITCH_MAX_NUM_QUEUES 128
14
15#define RSWITCH_NUM_PORTS 3
16#define rswitch_for_each_enabled_port(priv, i) \
17 for (i = 0; i < RSWITCH_NUM_PORTS; i++) \
18 if (priv->rdev[i]->disabled) \
19 continue; \
20 else
21
22#define rswitch_for_each_enabled_port_continue_reverse(priv, i) \
23 for (; i-- > 0; ) \
24 if (priv->rdev[i]->disabled) \
25 continue; \
26 else
27
28#define TX_RING_SIZE 1024
29#define RX_RING_SIZE 4096
30#define TS_RING_SIZE (TX_RING_SIZE * RSWITCH_NUM_PORTS)
31
32#define RSWITCH_MAX_MTU 9600
33#define RSWITCH_HEADROOM (NET_SKB_PAD + NET_IP_ALIGN)
34#define RSWITCH_DESC_BUF_SIZE 2048
35#define RSWITCH_TAILROOM SKB_DATA_ALIGN(sizeof(struct skb_shared_info))
36#define RSWITCH_ALIGN 128
37#define RSWITCH_BUF_SIZE (RSWITCH_HEADROOM + RSWITCH_DESC_BUF_SIZE + \
38 RSWITCH_TAILROOM + RSWITCH_ALIGN)
39#define RSWITCH_MAP_BUF_SIZE (RSWITCH_BUF_SIZE - RSWITCH_HEADROOM)
40#define RSWITCH_MAX_CTAG_PCP 7
41
42#define RSWITCH_TIMEOUT_US 100000
43
44#define RSWITCH_TOP_OFFSET 0x00008000
45#define RSWITCH_COMA_OFFSET 0x00009000
46#define RSWITCH_ETHA_OFFSET 0x0000a000 /* with RMAC */
47#define RSWITCH_ETHA_SIZE 0x00002000 /* with RMAC */
48#define RSWITCH_GWCA0_OFFSET 0x00010000
49#define RSWITCH_GWCA1_OFFSET 0x00012000
50
51/* TODO: hardcoded ETHA/GWCA settings for now */
52#define GWCA_IRQ_RESOURCE_NAME "gwca0_rxtx%d"
53#define GWCA_IRQ_NAME "rswitch: gwca0_rxtx%d"
54#define GWCA_NUM_IRQS 8
55#define GWCA_INDEX 0
56#define AGENT_INDEX_GWCA 3
57#define GWCA_IPV_NUM 0
58#define GWRO RSWITCH_GWCA0_OFFSET
59
60#define GWCA_TS_IRQ_RESOURCE_NAME "gwca0_rxts0"
61#define GWCA_TS_IRQ_NAME "rswitch: gwca0_rxts0"
62#define GWCA_TS_IRQ_BIT BIT(0)
63
64#define FWRO 0
65#define TPRO RSWITCH_TOP_OFFSET
66#define CARO RSWITCH_COMA_OFFSET
67#define TARO 0
68#define RMRO 0x1000
69enum rswitch_reg {
70 FWGC = FWRO + 0x0000,
71 FWTTC0 = FWRO + 0x0010,
72 FWTTC1 = FWRO + 0x0014,
73 FWLBMC = FWRO + 0x0018,
74 FWCEPTC = FWRO + 0x0020,
75 FWCEPRC0 = FWRO + 0x0024,
76 FWCEPRC1 = FWRO + 0x0028,
77 FWCEPRC2 = FWRO + 0x002c,
78 FWCLPTC = FWRO + 0x0030,
79 FWCLPRC = FWRO + 0x0034,
80 FWCMPTC = FWRO + 0x0040,
81 FWEMPTC = FWRO + 0x0044,
82 FWSDMPTC = FWRO + 0x0050,
83 FWSDMPVC = FWRO + 0x0054,
84 FWLBWMC0 = FWRO + 0x0080,
85 FWPC00 = FWRO + 0x0100,
86 FWPC10 = FWRO + 0x0104,
87 FWPC20 = FWRO + 0x0108,
88 FWCTGC00 = FWRO + 0x0400,
89 FWCTGC10 = FWRO + 0x0404,
90 FWCTTC00 = FWRO + 0x0408,
91 FWCTTC10 = FWRO + 0x040c,
92 FWCTTC200 = FWRO + 0x0410,
93 FWCTSC00 = FWRO + 0x0420,
94 FWCTSC10 = FWRO + 0x0424,
95 FWCTSC20 = FWRO + 0x0428,
96 FWCTSC30 = FWRO + 0x042c,
97 FWCTSC40 = FWRO + 0x0430,
98 FWTWBFC0 = FWRO + 0x1000,
99 FWTWBFVC0 = FWRO + 0x1004,
100 FWTHBFC0 = FWRO + 0x1400,
101 FWTHBFV0C0 = FWRO + 0x1404,
102 FWTHBFV1C0 = FWRO + 0x1408,
103 FWFOBFC0 = FWRO + 0x1800,
104 FWFOBFV0C0 = FWRO + 0x1804,
105 FWFOBFV1C0 = FWRO + 0x1808,
106 FWRFC0 = FWRO + 0x1c00,
107 FWRFVC0 = FWRO + 0x1c04,
108 FWCFC0 = FWRO + 0x2000,
109 FWCFMC00 = FWRO + 0x2004,
110 FWIP4SC = FWRO + 0x4008,
111 FWIP6SC = FWRO + 0x4018,
112 FWIP6OC = FWRO + 0x401c,
113 FWL2SC = FWRO + 0x4020,
114 FWSFHEC = FWRO + 0x4030,
115 FWSHCR0 = FWRO + 0x4040,
116 FWSHCR1 = FWRO + 0x4044,
117 FWSHCR2 = FWRO + 0x4048,
118 FWSHCR3 = FWRO + 0x404c,
119 FWSHCR4 = FWRO + 0x4050,
120 FWSHCR5 = FWRO + 0x4054,
121 FWSHCR6 = FWRO + 0x4058,
122 FWSHCR7 = FWRO + 0x405c,
123 FWSHCR8 = FWRO + 0x4060,
124 FWSHCR9 = FWRO + 0x4064,
125 FWSHCR10 = FWRO + 0x4068,
126 FWSHCR11 = FWRO + 0x406c,
127 FWSHCR12 = FWRO + 0x4070,
128 FWSHCR13 = FWRO + 0x4074,
129 FWSHCRR = FWRO + 0x4078,
130 FWLTHHEC = FWRO + 0x4090,
131 FWLTHHC = FWRO + 0x4094,
132 FWLTHTL0 = FWRO + 0x40a0,
133 FWLTHTL1 = FWRO + 0x40a4,
134 FWLTHTL2 = FWRO + 0x40a8,
135 FWLTHTL3 = FWRO + 0x40ac,
136 FWLTHTL4 = FWRO + 0x40b0,
137 FWLTHTL5 = FWRO + 0x40b4,
138 FWLTHTL6 = FWRO + 0x40b8,
139 FWLTHTL7 = FWRO + 0x40bc,
140 FWLTHTL80 = FWRO + 0x40c0,
141 FWLTHTL9 = FWRO + 0x40d0,
142 FWLTHTLR = FWRO + 0x40d4,
143 FWLTHTIM = FWRO + 0x40e0,
144 FWLTHTEM = FWRO + 0x40e4,
145 FWLTHTS0 = FWRO + 0x4100,
146 FWLTHTS1 = FWRO + 0x4104,
147 FWLTHTS2 = FWRO + 0x4108,
148 FWLTHTS3 = FWRO + 0x410c,
149 FWLTHTS4 = FWRO + 0x4110,
150 FWLTHTSR0 = FWRO + 0x4120,
151 FWLTHTSR1 = FWRO + 0x4124,
152 FWLTHTSR2 = FWRO + 0x4128,
153 FWLTHTSR3 = FWRO + 0x412c,
154 FWLTHTSR40 = FWRO + 0x4130,
155 FWLTHTSR5 = FWRO + 0x4140,
156 FWLTHTR = FWRO + 0x4150,
157 FWLTHTRR0 = FWRO + 0x4154,
158 FWLTHTRR1 = FWRO + 0x4158,
159 FWLTHTRR2 = FWRO + 0x415c,
160 FWLTHTRR3 = FWRO + 0x4160,
161 FWLTHTRR4 = FWRO + 0x4164,
162 FWLTHTRR5 = FWRO + 0x4168,
163 FWLTHTRR6 = FWRO + 0x416c,
164 FWLTHTRR7 = FWRO + 0x4170,
165 FWLTHTRR8 = FWRO + 0x4174,
166 FWLTHTRR9 = FWRO + 0x4180,
167 FWLTHTRR10 = FWRO + 0x4190,
168 FWIPHEC = FWRO + 0x4214,
169 FWIPHC = FWRO + 0x4218,
170 FWIPTL0 = FWRO + 0x4220,
171 FWIPTL1 = FWRO + 0x4224,
172 FWIPTL2 = FWRO + 0x4228,
173 FWIPTL3 = FWRO + 0x422c,
174 FWIPTL4 = FWRO + 0x4230,
175 FWIPTL5 = FWRO + 0x4234,
176 FWIPTL6 = FWRO + 0x4238,
177 FWIPTL7 = FWRO + 0x4240,
178 FWIPTL8 = FWRO + 0x4250,
179 FWIPTLR = FWRO + 0x4254,
180 FWIPTIM = FWRO + 0x4260,
181 FWIPTEM = FWRO + 0x4264,
182 FWIPTS0 = FWRO + 0x4270,
183 FWIPTS1 = FWRO + 0x4274,
184 FWIPTS2 = FWRO + 0x4278,
185 FWIPTS3 = FWRO + 0x427c,
186 FWIPTS4 = FWRO + 0x4280,
187 FWIPTSR0 = FWRO + 0x4284,
188 FWIPTSR1 = FWRO + 0x4288,
189 FWIPTSR2 = FWRO + 0x428c,
190 FWIPTSR3 = FWRO + 0x4290,
191 FWIPTSR4 = FWRO + 0x42a0,
192 FWIPTR = FWRO + 0x42b0,
193 FWIPTRR0 = FWRO + 0x42b4,
194 FWIPTRR1 = FWRO + 0x42b8,
195 FWIPTRR2 = FWRO + 0x42bc,
196 FWIPTRR3 = FWRO + 0x42c0,
197 FWIPTRR4 = FWRO + 0x42c4,
198 FWIPTRR5 = FWRO + 0x42c8,
199 FWIPTRR6 = FWRO + 0x42cc,
200 FWIPTRR7 = FWRO + 0x42d0,
201 FWIPTRR8 = FWRO + 0x42e0,
202 FWIPTRR9 = FWRO + 0x42f0,
203 FWIPHLEC = FWRO + 0x4300,
204 FWIPAGUSPC = FWRO + 0x4500,
205 FWIPAGC = FWRO + 0x4504,
206 FWIPAGM0 = FWRO + 0x4510,
207 FWIPAGM1 = FWRO + 0x4514,
208 FWIPAGM2 = FWRO + 0x4518,
209 FWIPAGM3 = FWRO + 0x451c,
210 FWIPAGM4 = FWRO + 0x4520,
211 FWMACHEC = FWRO + 0x4620,
212 FWMACHC = FWRO + 0x4624,
213 FWMACTL0 = FWRO + 0x4630,
214 FWMACTL1 = FWRO + 0x4634,
215 FWMACTL2 = FWRO + 0x4638,
216 FWMACTL3 = FWRO + 0x463c,
217 FWMACTL4 = FWRO + 0x4640,
218 FWMACTL5 = FWRO + 0x4650,
219 FWMACTLR = FWRO + 0x4654,
220 FWMACTIM = FWRO + 0x4660,
221 FWMACTEM = FWRO + 0x4664,
222 FWMACTS0 = FWRO + 0x4670,
223 FWMACTS1 = FWRO + 0x4674,
224 FWMACTSR0 = FWRO + 0x4678,
225 FWMACTSR1 = FWRO + 0x467c,
226 FWMACTSR2 = FWRO + 0x4680,
227 FWMACTSR3 = FWRO + 0x4690,
228 FWMACTR = FWRO + 0x46a0,
229 FWMACTRR0 = FWRO + 0x46a4,
230 FWMACTRR1 = FWRO + 0x46a8,
231 FWMACTRR2 = FWRO + 0x46ac,
232 FWMACTRR3 = FWRO + 0x46b0,
233 FWMACTRR4 = FWRO + 0x46b4,
234 FWMACTRR5 = FWRO + 0x46c0,
235 FWMACTRR6 = FWRO + 0x46d0,
236 FWMACHLEC = FWRO + 0x4700,
237 FWMACAGUSPC = FWRO + 0x4880,
238 FWMACAGC = FWRO + 0x4884,
239 FWMACAGM0 = FWRO + 0x4888,
240 FWMACAGM1 = FWRO + 0x488c,
241 FWVLANTEC = FWRO + 0x4900,
242 FWVLANTL0 = FWRO + 0x4910,
243 FWVLANTL1 = FWRO + 0x4914,
244 FWVLANTL2 = FWRO + 0x4918,
245 FWVLANTL3 = FWRO + 0x4920,
246 FWVLANTL4 = FWRO + 0x4930,
247 FWVLANTLR = FWRO + 0x4934,
248 FWVLANTIM = FWRO + 0x4940,
249 FWVLANTEM = FWRO + 0x4944,
250 FWVLANTS = FWRO + 0x4950,
251 FWVLANTSR0 = FWRO + 0x4954,
252 FWVLANTSR1 = FWRO + 0x4958,
253 FWVLANTSR2 = FWRO + 0x4960,
254 FWVLANTSR3 = FWRO + 0x4970,
255 FWPBFC0 = FWRO + 0x4a00,
256 FWPBFCSDC00 = FWRO + 0x4a04,
257 FWL23URL0 = FWRO + 0x4e00,
258 FWL23URL1 = FWRO + 0x4e04,
259 FWL23URL2 = FWRO + 0x4e08,
260 FWL23URL3 = FWRO + 0x4e0c,
261 FWL23URLR = FWRO + 0x4e10,
262 FWL23UTIM = FWRO + 0x4e20,
263 FWL23URR = FWRO + 0x4e30,
264 FWL23URRR0 = FWRO + 0x4e34,
265 FWL23URRR1 = FWRO + 0x4e38,
266 FWL23URRR2 = FWRO + 0x4e3c,
267 FWL23URRR3 = FWRO + 0x4e40,
268 FWL23URMC0 = FWRO + 0x4f00,
269 FWPMFGC0 = FWRO + 0x5000,
270 FWPGFC0 = FWRO + 0x5100,
271 FWPGFIGSC0 = FWRO + 0x5104,
272 FWPGFENC0 = FWRO + 0x5108,
273 FWPGFENM0 = FWRO + 0x510c,
274 FWPGFCSTC00 = FWRO + 0x5110,
275 FWPGFCSTC10 = FWRO + 0x5114,
276 FWPGFCSTM00 = FWRO + 0x5118,
277 FWPGFCSTM10 = FWRO + 0x511c,
278 FWPGFCTC0 = FWRO + 0x5120,
279 FWPGFCTM0 = FWRO + 0x5124,
280 FWPGFHCC0 = FWRO + 0x5128,
281 FWPGFSM0 = FWRO + 0x512c,
282 FWPGFGC0 = FWRO + 0x5130,
283 FWPGFGL0 = FWRO + 0x5500,
284 FWPGFGL1 = FWRO + 0x5504,
285 FWPGFGLR = FWRO + 0x5518,
286 FWPGFGR = FWRO + 0x5510,
287 FWPGFGRR0 = FWRO + 0x5514,
288 FWPGFGRR1 = FWRO + 0x5518,
289 FWPGFRIM = FWRO + 0x5520,
290 FWPMTRFC0 = FWRO + 0x5600,
291 FWPMTRCBSC0 = FWRO + 0x5604,
292 FWPMTRC0RC0 = FWRO + 0x5608,
293 FWPMTREBSC0 = FWRO + 0x560c,
294 FWPMTREIRC0 = FWRO + 0x5610,
295 FWPMTRFM0 = FWRO + 0x5614,
296 FWFTL0 = FWRO + 0x6000,
297 FWFTL1 = FWRO + 0x6004,
298 FWFTLR = FWRO + 0x6008,
299 FWFTOC = FWRO + 0x6010,
300 FWFTOPC = FWRO + 0x6014,
301 FWFTIM = FWRO + 0x6020,
302 FWFTR = FWRO + 0x6030,
303 FWFTRR0 = FWRO + 0x6034,
304 FWFTRR1 = FWRO + 0x6038,
305 FWFTRR2 = FWRO + 0x603c,
306 FWSEQNGC0 = FWRO + 0x6100,
307 FWSEQNGM0 = FWRO + 0x6104,
308 FWSEQNRC = FWRO + 0x6200,
309 FWCTFDCN0 = FWRO + 0x6300,
310 FWLTHFDCN0 = FWRO + 0x6304,
311 FWIPFDCN0 = FWRO + 0x6308,
312 FWLTWFDCN0 = FWRO + 0x630c,
313 FWPBFDCN0 = FWRO + 0x6310,
314 FWMHLCN0 = FWRO + 0x6314,
315 FWIHLCN0 = FWRO + 0x6318,
316 FWICRDCN0 = FWRO + 0x6500,
317 FWWMRDCN0 = FWRO + 0x6504,
318 FWCTRDCN0 = FWRO + 0x6508,
319 FWLTHRDCN0 = FWRO + 0x650c,
320 FWIPRDCN0 = FWRO + 0x6510,
321 FWLTWRDCN0 = FWRO + 0x6514,
322 FWPBRDCN0 = FWRO + 0x6518,
323 FWPMFDCN0 = FWRO + 0x6700,
324 FWPGFDCN0 = FWRO + 0x6780,
325 FWPMGDCN0 = FWRO + 0x6800,
326 FWPMYDCN0 = FWRO + 0x6804,
327 FWPMRDCN0 = FWRO + 0x6808,
328 FWFRPPCN0 = FWRO + 0x6a00,
329 FWFRDPCN0 = FWRO + 0x6a04,
330 FWEIS00 = FWRO + 0x7900,
331 FWEIE00 = FWRO + 0x7904,
332 FWEID00 = FWRO + 0x7908,
333 FWEIS1 = FWRO + 0x7a00,
334 FWEIE1 = FWRO + 0x7a04,
335 FWEID1 = FWRO + 0x7a08,
336 FWEIS2 = FWRO + 0x7a10,
337 FWEIE2 = FWRO + 0x7a14,
338 FWEID2 = FWRO + 0x7a18,
339 FWEIS3 = FWRO + 0x7a20,
340 FWEIE3 = FWRO + 0x7a24,
341 FWEID3 = FWRO + 0x7a28,
342 FWEIS4 = FWRO + 0x7a30,
343 FWEIE4 = FWRO + 0x7a34,
344 FWEID4 = FWRO + 0x7a38,
345 FWEIS5 = FWRO + 0x7a40,
346 FWEIE5 = FWRO + 0x7a44,
347 FWEID5 = FWRO + 0x7a48,
348 FWEIS60 = FWRO + 0x7a50,
349 FWEIE60 = FWRO + 0x7a54,
350 FWEID60 = FWRO + 0x7a58,
351 FWEIS61 = FWRO + 0x7a60,
352 FWEIE61 = FWRO + 0x7a64,
353 FWEID61 = FWRO + 0x7a68,
354 FWEIS62 = FWRO + 0x7a70,
355 FWEIE62 = FWRO + 0x7a74,
356 FWEID62 = FWRO + 0x7a78,
357 FWEIS63 = FWRO + 0x7a80,
358 FWEIE63 = FWRO + 0x7a84,
359 FWEID63 = FWRO + 0x7a88,
360 FWEIS70 = FWRO + 0x7a90,
361 FWEIE70 = FWRO + 0x7A94,
362 FWEID70 = FWRO + 0x7a98,
363 FWEIS71 = FWRO + 0x7aa0,
364 FWEIE71 = FWRO + 0x7aa4,
365 FWEID71 = FWRO + 0x7aa8,
366 FWEIS72 = FWRO + 0x7ab0,
367 FWEIE72 = FWRO + 0x7ab4,
368 FWEID72 = FWRO + 0x7ab8,
369 FWEIS73 = FWRO + 0x7ac0,
370 FWEIE73 = FWRO + 0x7ac4,
371 FWEID73 = FWRO + 0x7ac8,
372 FWEIS80 = FWRO + 0x7ad0,
373 FWEIE80 = FWRO + 0x7ad4,
374 FWEID80 = FWRO + 0x7ad8,
375 FWEIS81 = FWRO + 0x7ae0,
376 FWEIE81 = FWRO + 0x7ae4,
377 FWEID81 = FWRO + 0x7ae8,
378 FWEIS82 = FWRO + 0x7af0,
379 FWEIE82 = FWRO + 0x7af4,
380 FWEID82 = FWRO + 0x7af8,
381 FWEIS83 = FWRO + 0x7b00,
382 FWEIE83 = FWRO + 0x7b04,
383 FWEID83 = FWRO + 0x7b08,
384 FWMIS0 = FWRO + 0x7c00,
385 FWMIE0 = FWRO + 0x7c04,
386 FWMID0 = FWRO + 0x7c08,
387 FWSCR0 = FWRO + 0x7d00,
388 FWSCR1 = FWRO + 0x7d04,
389 FWSCR2 = FWRO + 0x7d08,
390 FWSCR3 = FWRO + 0x7d0c,
391 FWSCR4 = FWRO + 0x7d10,
392 FWSCR5 = FWRO + 0x7d14,
393 FWSCR6 = FWRO + 0x7d18,
394 FWSCR7 = FWRO + 0x7d1c,
395 FWSCR8 = FWRO + 0x7d20,
396 FWSCR9 = FWRO + 0x7d24,
397 FWSCR10 = FWRO + 0x7d28,
398 FWSCR11 = FWRO + 0x7d2c,
399 FWSCR12 = FWRO + 0x7d30,
400 FWSCR13 = FWRO + 0x7d34,
401 FWSCR14 = FWRO + 0x7d38,
402 FWSCR15 = FWRO + 0x7d3c,
403 FWSCR16 = FWRO + 0x7d40,
404 FWSCR17 = FWRO + 0x7d44,
405 FWSCR18 = FWRO + 0x7d48,
406 FWSCR19 = FWRO + 0x7d4c,
407 FWSCR20 = FWRO + 0x7d50,
408 FWSCR21 = FWRO + 0x7d54,
409 FWSCR22 = FWRO + 0x7d58,
410 FWSCR23 = FWRO + 0x7d5c,
411 FWSCR24 = FWRO + 0x7d60,
412 FWSCR25 = FWRO + 0x7d64,
413 FWSCR26 = FWRO + 0x7d68,
414 FWSCR27 = FWRO + 0x7d6c,
415 FWSCR28 = FWRO + 0x7d70,
416 FWSCR29 = FWRO + 0x7d74,
417 FWSCR30 = FWRO + 0x7d78,
418 FWSCR31 = FWRO + 0x7d7c,
419 FWSCR32 = FWRO + 0x7d80,
420 FWSCR33 = FWRO + 0x7d84,
421 FWSCR34 = FWRO + 0x7d88,
422 FWSCR35 = FWRO + 0x7d8c,
423 FWSCR36 = FWRO + 0x7d90,
424 FWSCR37 = FWRO + 0x7d94,
425 FWSCR38 = FWRO + 0x7d98,
426 FWSCR39 = FWRO + 0x7d9c,
427 FWSCR40 = FWRO + 0x7da0,
428 FWSCR41 = FWRO + 0x7da4,
429 FWSCR42 = FWRO + 0x7da8,
430 FWSCR43 = FWRO + 0x7dac,
431 FWSCR44 = FWRO + 0x7db0,
432 FWSCR45 = FWRO + 0x7db4,
433 FWSCR46 = FWRO + 0x7db8,
434
435 TPEMIMC0 = TPRO + 0x0000,
436 TPEMIMC1 = TPRO + 0x0004,
437 TPEMIMC2 = TPRO + 0x0008,
438 TPEMIMC3 = TPRO + 0x000c,
439 TPEMIMC4 = TPRO + 0x0010,
440 TPEMIMC5 = TPRO + 0x0014,
441 TPEMIMC60 = TPRO + 0x0080,
442 TPEMIMC70 = TPRO + 0x0100,
443 TSIM = TPRO + 0x0700,
444 TFIM = TPRO + 0x0704,
445 TCIM = TPRO + 0x0708,
446 TGIM0 = TPRO + 0x0710,
447 TGIM1 = TPRO + 0x0714,
448 TEIM0 = TPRO + 0x0720,
449 TEIM1 = TPRO + 0x0724,
450 TEIM2 = TPRO + 0x0728,
451
452 RIPV = CARO + 0x0000,
453 RRC = CARO + 0x0004,
454 RCEC = CARO + 0x0008,
455 RCDC = CARO + 0x000c,
456 RSSIS = CARO + 0x0010,
457 RSSIE = CARO + 0x0014,
458 RSSID = CARO + 0x0018,
459 CABPIBWMC = CARO + 0x0020,
460 CABPWMLC = CARO + 0x0040,
461 CABPPFLC0 = CARO + 0x0050,
462 CABPPWMLC0 = CARO + 0x0060,
463 CABPPPFLC00 = CARO + 0x00a0,
464 CABPULC = CARO + 0x0100,
465 CABPIRM = CARO + 0x0140,
466 CABPPCM = CARO + 0x0144,
467 CABPLCM = CARO + 0x0148,
468 CABPCPM = CARO + 0x0180,
469 CABPMCPM = CARO + 0x0200,
470 CARDNM = CARO + 0x0280,
471 CARDMNM = CARO + 0x0284,
472 CARDCN = CARO + 0x0290,
473 CAEIS0 = CARO + 0x0300,
474 CAEIE0 = CARO + 0x0304,
475 CAEID0 = CARO + 0x0308,
476 CAEIS1 = CARO + 0x0310,
477 CAEIE1 = CARO + 0x0314,
478 CAEID1 = CARO + 0x0318,
479 CAMIS0 = CARO + 0x0340,
480 CAMIE0 = CARO + 0x0344,
481 CAMID0 = CARO + 0x0348,
482 CAMIS1 = CARO + 0x0350,
483 CAMIE1 = CARO + 0x0354,
484 CAMID1 = CARO + 0x0358,
485 CASCR = CARO + 0x0380,
486
487 EAMC = TARO + 0x0000,
488 EAMS = TARO + 0x0004,
489 EAIRC = TARO + 0x0010,
490 EATDQSC = TARO + 0x0014,
491 EATDQC = TARO + 0x0018,
492 EATDQAC = TARO + 0x001c,
493 EATPEC = TARO + 0x0020,
494 EATMFSC0 = TARO + 0x0040,
495 EATDQDC0 = TARO + 0x0060,
496 EATDQM0 = TARO + 0x0080,
497 EATDQMLM0 = TARO + 0x00a0,
498 EACTQC = TARO + 0x0100,
499 EACTDQDC = TARO + 0x0104,
500 EACTDQM = TARO + 0x0108,
501 EACTDQMLM = TARO + 0x010c,
502 EAVCC = TARO + 0x0130,
503 EAVTC = TARO + 0x0134,
504 EATTFC = TARO + 0x0138,
505 EACAEC = TARO + 0x0200,
506 EACC = TARO + 0x0204,
507 EACAIVC0 = TARO + 0x0220,
508 EACAULC0 = TARO + 0x0240,
509 EACOEM = TARO + 0x0260,
510 EACOIVM0 = TARO + 0x0280,
511 EACOULM0 = TARO + 0x02a0,
512 EACGSM = TARO + 0x02c0,
513 EATASC = TARO + 0x0300,
514 EATASENC0 = TARO + 0x0320,
515 EATASCTENC = TARO + 0x0340,
516 EATASENM0 = TARO + 0x0360,
517 EATASCTENM = TARO + 0x0380,
518 EATASCSTC0 = TARO + 0x03a0,
519 EATASCSTC1 = TARO + 0x03a4,
520 EATASCSTM0 = TARO + 0x03a8,
521 EATASCSTM1 = TARO + 0x03ac,
522 EATASCTC = TARO + 0x03b0,
523 EATASCTM = TARO + 0x03b4,
524 EATASGL0 = TARO + 0x03c0,
525 EATASGL1 = TARO + 0x03c4,
526 EATASGLR = TARO + 0x03c8,
527 EATASGR = TARO + 0x03d0,
528 EATASGRR = TARO + 0x03d4,
529 EATASHCC = TARO + 0x03e0,
530 EATASRIRM = TARO + 0x03e4,
531 EATASSM = TARO + 0x03e8,
532 EAUSMFSECN = TARO + 0x0400,
533 EATFECN = TARO + 0x0404,
534 EAFSECN = TARO + 0x0408,
535 EADQOECN = TARO + 0x040c,
536 EADQSECN = TARO + 0x0410,
537 EACKSECN = TARO + 0x0414,
538 EAEIS0 = TARO + 0x0500,
539 EAEIE0 = TARO + 0x0504,
540 EAEID0 = TARO + 0x0508,
541 EAEIS1 = TARO + 0x0510,
542 EAEIE1 = TARO + 0x0514,
543 EAEID1 = TARO + 0x0518,
544 EAEIS2 = TARO + 0x0520,
545 EAEIE2 = TARO + 0x0524,
546 EAEID2 = TARO + 0x0528,
547 EASCR = TARO + 0x0580,
548
549 MPSM = RMRO + 0x0000,
550 MPIC = RMRO + 0x0004,
551 MPIM = RMRO + 0x0008,
552 MIOC = RMRO + 0x0010,
553 MIOM = RMRO + 0x0014,
554 MXMS = RMRO + 0x0018,
555 MTFFC = RMRO + 0x0020,
556 MTPFC = RMRO + 0x0024,
557 MTPFC2 = RMRO + 0x0028,
558 MTPFC30 = RMRO + 0x0030,
559 MTATC0 = RMRO + 0x0050,
560 MTIM = RMRO + 0x0060,
561 MRGC = RMRO + 0x0080,
562 MRMAC0 = RMRO + 0x0084,
563 MRMAC1 = RMRO + 0x0088,
564 MRAFC = RMRO + 0x008c,
565 MRSCE = RMRO + 0x0090,
566 MRSCP = RMRO + 0x0094,
567 MRSCC = RMRO + 0x0098,
568 MRFSCE = RMRO + 0x009c,
569 MRFSCP = RMRO + 0x00a0,
570 MTRC = RMRO + 0x00a4,
571 MRIM = RMRO + 0x00a8,
572 MRPFM = RMRO + 0x00ac,
573 MPFC0 = RMRO + 0x0100,
574 MLVC = RMRO + 0x0180,
575 MEEEC = RMRO + 0x0184,
576 MLBC = RMRO + 0x0188,
577 MXGMIIC = RMRO + 0x0190,
578 MPCH = RMRO + 0x0194,
579 MANC = RMRO + 0x0198,
580 MANM = RMRO + 0x019c,
581 MPLCA1 = RMRO + 0x01a0,
582 MPLCA2 = RMRO + 0x01a4,
583 MPLCA3 = RMRO + 0x01a8,
584 MPLCA4 = RMRO + 0x01ac,
585 MPLCAM = RMRO + 0x01b0,
586 MHDC1 = RMRO + 0x01c0,
587 MHDC2 = RMRO + 0x01c4,
588 MEIS = RMRO + 0x0200,
589 MEIE = RMRO + 0x0204,
590 MEID = RMRO + 0x0208,
591 MMIS0 = RMRO + 0x0210,
592 MMIE0 = RMRO + 0x0214,
593 MMID0 = RMRO + 0x0218,
594 MMIS1 = RMRO + 0x0220,
595 MMIE1 = RMRO + 0x0224,
596 MMID1 = RMRO + 0x0228,
597 MMIS2 = RMRO + 0x0230,
598 MMIE2 = RMRO + 0x0234,
599 MMID2 = RMRO + 0x0238,
600 MMPFTCT = RMRO + 0x0300,
601 MAPFTCT = RMRO + 0x0304,
602 MPFRCT = RMRO + 0x0308,
603 MFCICT = RMRO + 0x030c,
604 MEEECT = RMRO + 0x0310,
605 MMPCFTCT0 = RMRO + 0x0320,
606 MAPCFTCT0 = RMRO + 0x0330,
607 MPCFRCT0 = RMRO + 0x0340,
608 MHDCC = RMRO + 0x0350,
609 MROVFC = RMRO + 0x0354,
610 MRHCRCEC = RMRO + 0x0358,
611 MRXBCE = RMRO + 0x0400,
612 MRXBCP = RMRO + 0x0404,
613 MRGFCE = RMRO + 0x0408,
614 MRGFCP = RMRO + 0x040c,
615 MRBFC = RMRO + 0x0410,
616 MRMFC = RMRO + 0x0414,
617 MRUFC = RMRO + 0x0418,
618 MRPEFC = RMRO + 0x041c,
619 MRNEFC = RMRO + 0x0420,
620 MRFMEFC = RMRO + 0x0424,
621 MRFFMEFC = RMRO + 0x0428,
622 MRCFCEFC = RMRO + 0x042c,
623 MRFCEFC = RMRO + 0x0430,
624 MRRCFEFC = RMRO + 0x0434,
625 MRUEFC = RMRO + 0x043c,
626 MROEFC = RMRO + 0x0440,
627 MRBOEC = RMRO + 0x0444,
628 MTXBCE = RMRO + 0x0500,
629 MTXBCP = RMRO + 0x0504,
630 MTGFCE = RMRO + 0x0508,
631 MTGFCP = RMRO + 0x050c,
632 MTBFC = RMRO + 0x0510,
633 MTMFC = RMRO + 0x0514,
634 MTUFC = RMRO + 0x0518,
635 MTEFC = RMRO + 0x051c,
636
637 GWMC = GWRO + 0x0000,
638 GWMS = GWRO + 0x0004,
639 GWIRC = GWRO + 0x0010,
640 GWRDQSC = GWRO + 0x0014,
641 GWRDQC = GWRO + 0x0018,
642 GWRDQAC = GWRO + 0x001c,
643 GWRGC = GWRO + 0x0020,
644 GWRMFSC0 = GWRO + 0x0040,
645 GWRDQDC0 = GWRO + 0x0060,
646 GWRDQM0 = GWRO + 0x0080,
647 GWRDQMLM0 = GWRO + 0x00a0,
648 GWMTIRM = GWRO + 0x0100,
649 GWMSTLS = GWRO + 0x0104,
650 GWMSTLR = GWRO + 0x0108,
651 GWMSTSS = GWRO + 0x010c,
652 GWMSTSR = GWRO + 0x0110,
653 GWMAC0 = GWRO + 0x0120,
654 GWMAC1 = GWRO + 0x0124,
655 GWVCC = GWRO + 0x0130,
656 GWVTC = GWRO + 0x0134,
657 GWTTFC = GWRO + 0x0138,
658 GWTDCAC00 = GWRO + 0x0140,
659 GWTDCAC10 = GWRO + 0x0144,
660 GWTSDCC0 = GWRO + 0x0160,
661 GWTNM = GWRO + 0x0180,
662 GWTMNM = GWRO + 0x0184,
663 GWAC = GWRO + 0x0190,
664 GWDCBAC0 = GWRO + 0x0194,
665 GWDCBAC1 = GWRO + 0x0198,
666 GWIICBSC = GWRO + 0x019c,
667 GWMDNC = GWRO + 0x01a0,
668 GWTRC0 = GWRO + 0x0200,
669 GWTPC0 = GWRO + 0x0300,
670 GWARIRM = GWRO + 0x0380,
671 GWDCC0 = GWRO + 0x0400,
672 GWAARSS = GWRO + 0x0800,
673 GWAARSR0 = GWRO + 0x0804,
674 GWAARSR1 = GWRO + 0x0808,
675 GWIDAUAS0 = GWRO + 0x0840,
676 GWIDASM0 = GWRO + 0x0880,
677 GWIDASAM00 = GWRO + 0x0900,
678 GWIDASAM10 = GWRO + 0x0904,
679 GWIDACAM00 = GWRO + 0x0980,
680 GWIDACAM10 = GWRO + 0x0984,
681 GWGRLC = GWRO + 0x0a00,
682 GWGRLULC = GWRO + 0x0a04,
683 GWRLIVC0 = GWRO + 0x0a80,
684 GWRLULC0 = GWRO + 0x0a84,
685 GWIDPC = GWRO + 0x0b00,
686 GWIDC0 = GWRO + 0x0c00,
687 GWDIS0 = GWRO + 0x1100,
688 GWDIE0 = GWRO + 0x1104,
689 GWDID0 = GWRO + 0x1108,
690 GWTSDIS = GWRO + 0x1180,
691 GWTSDIE = GWRO + 0x1184,
692 GWTSDID = GWRO + 0x1188,
693 GWEIS0 = GWRO + 0x1190,
694 GWEIE0 = GWRO + 0x1194,
695 GWEID0 = GWRO + 0x1198,
696 GWEIS1 = GWRO + 0x11a0,
697 GWEIE1 = GWRO + 0x11a4,
698 GWEID1 = GWRO + 0x11a8,
699 GWEIS20 = GWRO + 0x1200,
700 GWEIE20 = GWRO + 0x1204,
701 GWEID20 = GWRO + 0x1208,
702 GWEIS3 = GWRO + 0x1280,
703 GWEIE3 = GWRO + 0x1284,
704 GWEID3 = GWRO + 0x1288,
705 GWEIS4 = GWRO + 0x1290,
706 GWEIE4 = GWRO + 0x1294,
707 GWEID4 = GWRO + 0x1298,
708 GWEIS5 = GWRO + 0x12a0,
709 GWEIE5 = GWRO + 0x12a4,
710 GWEID5 = GWRO + 0x12a8,
711 GWSCR0 = GWRO + 0x1800,
712 GWSCR1 = GWRO + 0x1900,
713};
714
715/* ETHA/RMAC */
716enum rswitch_etha_mode {
717 EAMC_OPC_RESET,
718 EAMC_OPC_DISABLE,
719 EAMC_OPC_CONFIG,
720 EAMC_OPC_OPERATION,
721};
722
723#define EAMS_OPS_MASK EAMC_OPC_OPERATION
724
725#define EAVCC_VEM_SC_TAG (0x3 << 16)
726
727#define MPIC_PIS_MII 0x00
728#define MPIC_PIS_GMII 0x02
729#define MPIC_PIS_XGMII 0x04
730#define MPIC_LSC_SHIFT 3
731#define MPIC_LSC_100M (1 << MPIC_LSC_SHIFT)
732#define MPIC_LSC_1G (2 << MPIC_LSC_SHIFT)
733#define MPIC_LSC_2_5G (3 << MPIC_LSC_SHIFT)
734
735#define MDIO_READ_C45 0x03
736#define MDIO_WRITE_C45 0x01
737
738#define MPSM_PSME BIT(0)
739#define MPSM_MFF_C45 BIT(2)
740#define MPSM_PRD_SHIFT 16
741#define MPSM_PRD_MASK GENMASK(31, MPSM_PRD_SHIFT)
742
743/* Completion flags */
744#define MMIS1_PAACS BIT(2) /* Address */
745#define MMIS1_PWACS BIT(1) /* Write */
746#define MMIS1_PRACS BIT(0) /* Read */
747#define MMIS1_CLEAR_FLAGS 0xf
748
749#define MPIC_PSMCS_SHIFT 16
750#define MPIC_PSMCS_MASK GENMASK(22, MPIC_PSMCS_SHIFT)
751#define MPIC_PSMCS(val) ((val) << MPIC_PSMCS_SHIFT)
752
753#define MPIC_PSMHT_SHIFT 24
754#define MPIC_PSMHT_MASK GENMASK(26, MPIC_PSMHT_SHIFT)
755#define MPIC_PSMHT(val) ((val) << MPIC_PSMHT_SHIFT)
756
757#define MLVC_PLV BIT(16)
758
759/* GWCA */
760enum rswitch_gwca_mode {
761 GWMC_OPC_RESET,
762 GWMC_OPC_DISABLE,
763 GWMC_OPC_CONFIG,
764 GWMC_OPC_OPERATION,
765};
766
767#define GWMS_OPS_MASK GWMC_OPC_OPERATION
768
769#define GWMTIRM_MTIOG BIT(0)
770#define GWMTIRM_MTR BIT(1)
771
772#define GWVCC_VEM_SC_TAG (0x3 << 16)
773
774#define GWARIRM_ARIOG BIT(0)
775#define GWARIRM_ARR BIT(1)
776
777#define GWMDNC_TSDMN(num) (((num) << 16) & GENMASK(17, 16))
778#define GWMDNC_TXDMN(num) (((num) << 8) & GENMASK(12, 8))
779#define GWMDNC_RXDMN(num) ((num) & GENMASK(4, 0))
780
781#define GWDCC_BALR BIT(24)
782#define GWDCC_DCP_MASK GENMASK(18, 16)
783#define GWDCC_DCP(prio) FIELD_PREP(GWDCC_DCP_MASK, (prio))
784#define GWDCC_DQT BIT(11)
785#define GWDCC_ETS BIT(9)
786#define GWDCC_EDE BIT(8)
787
788#define GWTRC(queue) (GWTRC0 + (queue) / 32 * 4)
789#define GWTPC_PPPL(ipv) BIT(ipv)
790#define GWDCC_OFFS(queue) (GWDCC0 + (queue) * 4)
791
792#define GWDIS(i) (GWDIS0 + (i) * 0x10)
793#define GWDIE(i) (GWDIE0 + (i) * 0x10)
794#define GWDID(i) (GWDID0 + (i) * 0x10)
795
796/* COMA */
797#define RRC_RR BIT(0)
798#define RRC_RR_CLR 0
799#define RCEC_ACE_DEFAULT (BIT(0) | BIT(AGENT_INDEX_GWCA))
800#define RCEC_RCE BIT(16)
801#define RCDC_RCD BIT(16)
802
803#define CABPIRM_BPIOG BIT(0)
804#define CABPIRM_BPR BIT(1)
805
806#define CABPPFLC_INIT_VALUE 0x00800080
807
808/* MFWD */
809#define FWPC0_LTHTA BIT(0)
810#define FWPC0_IP4UE BIT(3)
811#define FWPC0_IP4TE BIT(4)
812#define FWPC0_IP4OE BIT(5)
813#define FWPC0_L2SE BIT(9)
814#define FWPC0_IP4EA BIT(10)
815#define FWPC0_IPDSA BIT(12)
816#define FWPC0_IPHLA BIT(18)
817#define FWPC0_MACSDA BIT(20)
818#define FWPC0_MACHLA BIT(26)
819#define FWPC0_MACHMA BIT(27)
820#define FWPC0_VLANSA BIT(28)
821
822#define FWPC0(i) (FWPC00 + (i) * 0x10)
823#define FWPC0_DEFAULT (FWPC0_LTHTA | FWPC0_IP4UE | FWPC0_IP4TE | \
824 FWPC0_IP4OE | FWPC0_L2SE | FWPC0_IP4EA | \
825 FWPC0_IPDSA | FWPC0_IPHLA | FWPC0_MACSDA | \
826 FWPC0_MACHLA | FWPC0_MACHMA | FWPC0_VLANSA)
827#define FWPC1(i) (FWPC10 + (i) * 0x10)
828#define FWPC1_DDE BIT(0)
829
830#define FWPBFC(i) (FWPBFC0 + (i) * 0x10)
831
832#define FWPBFCSDC(j, i) (FWPBFCSDC00 + (i) * 0x10 + (j) * 0x04)
833
834/* TOP */
835#define TPEMIMC7(queue) (TPEMIMC70 + (queue) * 4)
836
837/* Descriptors */
838enum RX_DS_CC_BIT {
839 RX_DS = 0x0fff, /* Data size */
840 RX_TR = 0x1000, /* Truncation indication */
841 RX_EI = 0x2000, /* Error indication */
842 RX_PS = 0xc000, /* Padding selection */
843};
844
845enum TX_DS_TAGL_BIT {
846 TX_DS = 0x0fff, /* Data size */
847 TX_TAGL = 0xf000, /* Frame tag LSBs */
848};
849
850enum DIE_DT {
851 /* Frame data */
852 DT_FSINGLE = 0x80,
853 DT_FSTART = 0x90,
854 DT_FMID = 0xa0,
855 DT_FEND = 0xb0,
856
857 /* Chain control */
858 DT_LEMPTY = 0xc0,
859 DT_EEMPTY = 0xd0,
860 DT_LINKFIX = 0x00,
861 DT_LINK = 0xe0,
862 DT_EOS = 0xf0,
863 /* HW/SW arbitration */
864 DT_FEMPTY = 0x40,
865 DT_FEMPTY_IS = 0x10,
866 DT_FEMPTY_IC = 0x20,
867 DT_FEMPTY_ND = 0x30,
868 DT_FEMPTY_START = 0x50,
869 DT_FEMPTY_MID = 0x60,
870 DT_FEMPTY_END = 0x70,
871
872 DT_MASK = 0xf0,
873 DIE = 0x08, /* Descriptor Interrupt Enable */
874};
875
876/* Both transmission and reception */
877#define INFO1_FMT BIT(2)
878#define INFO1_TXC BIT(3)
879
880/* For transmission */
881#define INFO1_TSUN(val) ((u64)(val) << 8ULL)
882#define INFO1_IPV(prio) ((u64)(prio) << 28ULL)
883#define INFO1_CSD0(index) ((u64)(index) << 32ULL)
884#define INFO1_CSD1(index) ((u64)(index) << 40ULL)
885#define INFO1_DV(port_vector) ((u64)(port_vector) << 48ULL)
886
887/* For reception */
888#define INFO1_SPN(port) ((u64)(port) << 36ULL)
889
890/* For timestamp descriptor in dptrl (Byte 4 to 7) */
891#define TS_DESC_TSUN(dptrl) ((dptrl) & GENMASK(7, 0))
892#define TS_DESC_SPN(dptrl) (((dptrl) & GENMASK(10, 8)) >> 8)
893#define TS_DESC_DPN(dptrl) (((dptrl) & GENMASK(17, 16)) >> 16)
894#define TS_DESC_TN(dptrl) ((dptrl) & BIT(24))
895
896struct rswitch_desc {
897 __le16 info_ds; /* Descriptor size */
898 u8 die_dt; /* Descriptor interrupt enable and type */
899 __u8 dptrh; /* Descriptor pointer MSB */
900 __le32 dptrl; /* Descriptor pointer LSW */
901} __packed;
902
903struct rswitch_ts_desc {
904 struct rswitch_desc desc;
905 __le32 ts_nsec;
906 __le32 ts_sec;
907} __packed;
908
909struct rswitch_ext_desc {
910 struct rswitch_desc desc;
911 __le64 info1;
912} __packed;
913
914struct rswitch_ext_ts_desc {
915 struct rswitch_desc desc;
916 __le64 info1;
917 __le32 ts_nsec;
918 __le32 ts_sec;
919} __packed;
920
921struct rswitch_etha {
922 unsigned int index;
923 void __iomem *addr;
924 void __iomem *coma_addr;
925 bool external_phy;
926 struct mii_bus *mii;
927 phy_interface_t phy_interface;
928 u32 psmcs;
929 u8 mac_addr[MAX_ADDR_LEN];
930 int link;
931 int speed;
932
933 /* This hardware could not be initialized twice so that marked
934 * this flag to avoid multiple initialization.
935 */
936 bool operated;
937};
938
939/* The datasheet said descriptor "chain" and/or "queue". For consistency of
940 * name, this driver calls "queue".
941 */
942struct rswitch_gwca_queue {
943 union {
944 struct rswitch_ext_desc *tx_ring;
945 struct rswitch_ext_ts_desc *rx_ring;
946 struct rswitch_ts_desc *ts_ring;
947 };
948
949 /* Common */
950 dma_addr_t ring_dma;
951 unsigned int ring_size;
952 unsigned int cur;
953 unsigned int dirty;
954
955 /* For [rt]x_ring */
956 unsigned int index;
957 bool dir_tx;
958 struct net_device *ndev; /* queue to ndev for irq */
959
960 union {
961 /* For TX */
962 struct {
963 struct sk_buff **skbs;
964 dma_addr_t *unmap_addrs;
965 };
966 /* For RX */
967 struct {
968 void **rx_bufs;
969 struct sk_buff *skb_fstart;
970 u16 pkt_len;
971 };
972 };
973};
974
975struct rswitch_gwca_ts_info {
976 struct sk_buff *skb;
977 struct list_head list;
978
979 int port;
980 u8 tag;
981};
982
983#define RSWITCH_NUM_IRQ_REGS (RSWITCH_MAX_NUM_QUEUES / BITS_PER_TYPE(u32))
984struct rswitch_gwca {
985 unsigned int index;
986 struct rswitch_desc *linkfix_table;
987 dma_addr_t linkfix_table_dma;
988 u32 linkfix_table_size;
989 struct rswitch_gwca_queue *queues;
990 int num_queues;
991 struct rswitch_gwca_queue ts_queue;
992 struct list_head ts_info_list;
993 DECLARE_BITMAP(used, RSWITCH_MAX_NUM_QUEUES);
994 u32 tx_irq_bits[RSWITCH_NUM_IRQ_REGS];
995 u32 rx_irq_bits[RSWITCH_NUM_IRQ_REGS];
996 int speed;
997};
998
999#define NUM_QUEUES_PER_NDEV 2
1000struct rswitch_device {
1001 struct rswitch_private *priv;
1002 struct net_device *ndev;
1003 struct napi_struct napi;
1004 void __iomem *addr;
1005 struct rswitch_gwca_queue *tx_queue;
1006 struct rswitch_gwca_queue *rx_queue;
1007 u8 ts_tag;
1008 bool disabled;
1009
1010 int port;
1011 struct rswitch_etha *etha;
1012 struct device_node *np_port;
1013 struct phy *serdes;
1014};
1015
1016struct rswitch_mfwd_mac_table_entry {
1017 int queue_index;
1018 unsigned char addr[MAX_ADDR_LEN];
1019};
1020
1021struct rswitch_mfwd {
1022 struct rswitch_mac_table_entry *mac_table_entries;
1023 int num_mac_table_entries;
1024};
1025
1026struct rswitch_private {
1027 struct platform_device *pdev;
1028 void __iomem *addr;
1029 struct rcar_gen4_ptp_private *ptp_priv;
1030
1031 struct rswitch_device *rdev[RSWITCH_NUM_PORTS];
1032 DECLARE_BITMAP(opened_ports, RSWITCH_NUM_PORTS);
1033
1034 struct rswitch_gwca gwca;
1035 struct rswitch_etha etha[RSWITCH_NUM_PORTS];
1036 struct rswitch_mfwd mfwd;
1037
1038 spinlock_t lock; /* lock interrupt registers' control */
1039 struct clk *clk;
1040
1041 bool etha_no_runtime_change;
1042 bool gwca_halt;
1043};
1044
1045#endif /* #ifndef __RSWITCH_H__ */
1/* SPDX-License-Identifier: GPL-2.0 */
2/* Renesas Ethernet Switch device driver
3 *
4 * Copyright (C) 2022 Renesas Electronics Corporation
5 */
6
7#ifndef __RSWITCH_H__
8#define __RSWITCH_H__
9
10#include <linux/platform_device.h>
11#include "rcar_gen4_ptp.h"
12
13#define RSWITCH_MAX_NUM_QUEUES 128
14
15#define RSWITCH_NUM_PORTS 3
16#define rswitch_for_each_enabled_port(priv, i) \
17 for (i = 0; i < RSWITCH_NUM_PORTS; i++) \
18 if (priv->rdev[i]->disabled) \
19 continue; \
20 else
21
22#define rswitch_for_each_enabled_port_continue_reverse(priv, i) \
23 for (i--; i >= 0; i--) \
24 if (priv->rdev[i]->disabled) \
25 continue; \
26 else
27
28#define TX_RING_SIZE 1024
29#define RX_RING_SIZE 1024
30
31#define PKT_BUF_SZ 1584
32#define RSWITCH_ALIGN 128
33#define RSWITCH_MAX_CTAG_PCP 7
34
35#define RSWITCH_TIMEOUT_US 100000
36
37#define RSWITCH_TOP_OFFSET 0x00008000
38#define RSWITCH_COMA_OFFSET 0x00009000
39#define RSWITCH_ETHA_OFFSET 0x0000a000 /* with RMAC */
40#define RSWITCH_ETHA_SIZE 0x00002000 /* with RMAC */
41#define RSWITCH_GWCA0_OFFSET 0x00010000
42#define RSWITCH_GWCA1_OFFSET 0x00012000
43
44/* TODO: hardcoded ETHA/GWCA settings for now */
45#define GWCA_IRQ_RESOURCE_NAME "gwca0_rxtx%d"
46#define GWCA_IRQ_NAME "rswitch: gwca0_rxtx%d"
47#define GWCA_NUM_IRQS 8
48#define GWCA_INDEX 0
49#define AGENT_INDEX_GWCA 3
50#define GWRO RSWITCH_GWCA0_OFFSET
51
52#define FWRO 0
53#define TPRO RSWITCH_TOP_OFFSET
54#define CARO RSWITCH_COMA_OFFSET
55#define TARO 0
56#define RMRO 0x1000
57enum rswitch_reg {
58 FWGC = FWRO + 0x0000,
59 FWTTC0 = FWRO + 0x0010,
60 FWTTC1 = FWRO + 0x0014,
61 FWLBMC = FWRO + 0x0018,
62 FWCEPTC = FWRO + 0x0020,
63 FWCEPRC0 = FWRO + 0x0024,
64 FWCEPRC1 = FWRO + 0x0028,
65 FWCEPRC2 = FWRO + 0x002c,
66 FWCLPTC = FWRO + 0x0030,
67 FWCLPRC = FWRO + 0x0034,
68 FWCMPTC = FWRO + 0x0040,
69 FWEMPTC = FWRO + 0x0044,
70 FWSDMPTC = FWRO + 0x0050,
71 FWSDMPVC = FWRO + 0x0054,
72 FWLBWMC0 = FWRO + 0x0080,
73 FWPC00 = FWRO + 0x0100,
74 FWPC10 = FWRO + 0x0104,
75 FWPC20 = FWRO + 0x0108,
76 FWCTGC00 = FWRO + 0x0400,
77 FWCTGC10 = FWRO + 0x0404,
78 FWCTTC00 = FWRO + 0x0408,
79 FWCTTC10 = FWRO + 0x040c,
80 FWCTTC200 = FWRO + 0x0410,
81 FWCTSC00 = FWRO + 0x0420,
82 FWCTSC10 = FWRO + 0x0424,
83 FWCTSC20 = FWRO + 0x0428,
84 FWCTSC30 = FWRO + 0x042c,
85 FWCTSC40 = FWRO + 0x0430,
86 FWTWBFC0 = FWRO + 0x1000,
87 FWTWBFVC0 = FWRO + 0x1004,
88 FWTHBFC0 = FWRO + 0x1400,
89 FWTHBFV0C0 = FWRO + 0x1404,
90 FWTHBFV1C0 = FWRO + 0x1408,
91 FWFOBFC0 = FWRO + 0x1800,
92 FWFOBFV0C0 = FWRO + 0x1804,
93 FWFOBFV1C0 = FWRO + 0x1808,
94 FWRFC0 = FWRO + 0x1c00,
95 FWRFVC0 = FWRO + 0x1c04,
96 FWCFC0 = FWRO + 0x2000,
97 FWCFMC00 = FWRO + 0x2004,
98 FWIP4SC = FWRO + 0x4008,
99 FWIP6SC = FWRO + 0x4018,
100 FWIP6OC = FWRO + 0x401c,
101 FWL2SC = FWRO + 0x4020,
102 FWSFHEC = FWRO + 0x4030,
103 FWSHCR0 = FWRO + 0x4040,
104 FWSHCR1 = FWRO + 0x4044,
105 FWSHCR2 = FWRO + 0x4048,
106 FWSHCR3 = FWRO + 0x404c,
107 FWSHCR4 = FWRO + 0x4050,
108 FWSHCR5 = FWRO + 0x4054,
109 FWSHCR6 = FWRO + 0x4058,
110 FWSHCR7 = FWRO + 0x405c,
111 FWSHCR8 = FWRO + 0x4060,
112 FWSHCR9 = FWRO + 0x4064,
113 FWSHCR10 = FWRO + 0x4068,
114 FWSHCR11 = FWRO + 0x406c,
115 FWSHCR12 = FWRO + 0x4070,
116 FWSHCR13 = FWRO + 0x4074,
117 FWSHCRR = FWRO + 0x4078,
118 FWLTHHEC = FWRO + 0x4090,
119 FWLTHHC = FWRO + 0x4094,
120 FWLTHTL0 = FWRO + 0x40a0,
121 FWLTHTL1 = FWRO + 0x40a4,
122 FWLTHTL2 = FWRO + 0x40a8,
123 FWLTHTL3 = FWRO + 0x40ac,
124 FWLTHTL4 = FWRO + 0x40b0,
125 FWLTHTL5 = FWRO + 0x40b4,
126 FWLTHTL6 = FWRO + 0x40b8,
127 FWLTHTL7 = FWRO + 0x40bc,
128 FWLTHTL80 = FWRO + 0x40c0,
129 FWLTHTL9 = FWRO + 0x40d0,
130 FWLTHTLR = FWRO + 0x40d4,
131 FWLTHTIM = FWRO + 0x40e0,
132 FWLTHTEM = FWRO + 0x40e4,
133 FWLTHTS0 = FWRO + 0x4100,
134 FWLTHTS1 = FWRO + 0x4104,
135 FWLTHTS2 = FWRO + 0x4108,
136 FWLTHTS3 = FWRO + 0x410c,
137 FWLTHTS4 = FWRO + 0x4110,
138 FWLTHTSR0 = FWRO + 0x4120,
139 FWLTHTSR1 = FWRO + 0x4124,
140 FWLTHTSR2 = FWRO + 0x4128,
141 FWLTHTSR3 = FWRO + 0x412c,
142 FWLTHTSR40 = FWRO + 0x4130,
143 FWLTHTSR5 = FWRO + 0x4140,
144 FWLTHTR = FWRO + 0x4150,
145 FWLTHTRR0 = FWRO + 0x4154,
146 FWLTHTRR1 = FWRO + 0x4158,
147 FWLTHTRR2 = FWRO + 0x415c,
148 FWLTHTRR3 = FWRO + 0x4160,
149 FWLTHTRR4 = FWRO + 0x4164,
150 FWLTHTRR5 = FWRO + 0x4168,
151 FWLTHTRR6 = FWRO + 0x416c,
152 FWLTHTRR7 = FWRO + 0x4170,
153 FWLTHTRR8 = FWRO + 0x4174,
154 FWLTHTRR9 = FWRO + 0x4180,
155 FWLTHTRR10 = FWRO + 0x4190,
156 FWIPHEC = FWRO + 0x4214,
157 FWIPHC = FWRO + 0x4218,
158 FWIPTL0 = FWRO + 0x4220,
159 FWIPTL1 = FWRO + 0x4224,
160 FWIPTL2 = FWRO + 0x4228,
161 FWIPTL3 = FWRO + 0x422c,
162 FWIPTL4 = FWRO + 0x4230,
163 FWIPTL5 = FWRO + 0x4234,
164 FWIPTL6 = FWRO + 0x4238,
165 FWIPTL7 = FWRO + 0x4240,
166 FWIPTL8 = FWRO + 0x4250,
167 FWIPTLR = FWRO + 0x4254,
168 FWIPTIM = FWRO + 0x4260,
169 FWIPTEM = FWRO + 0x4264,
170 FWIPTS0 = FWRO + 0x4270,
171 FWIPTS1 = FWRO + 0x4274,
172 FWIPTS2 = FWRO + 0x4278,
173 FWIPTS3 = FWRO + 0x427c,
174 FWIPTS4 = FWRO + 0x4280,
175 FWIPTSR0 = FWRO + 0x4284,
176 FWIPTSR1 = FWRO + 0x4288,
177 FWIPTSR2 = FWRO + 0x428c,
178 FWIPTSR3 = FWRO + 0x4290,
179 FWIPTSR4 = FWRO + 0x42a0,
180 FWIPTR = FWRO + 0x42b0,
181 FWIPTRR0 = FWRO + 0x42b4,
182 FWIPTRR1 = FWRO + 0x42b8,
183 FWIPTRR2 = FWRO + 0x42bc,
184 FWIPTRR3 = FWRO + 0x42c0,
185 FWIPTRR4 = FWRO + 0x42c4,
186 FWIPTRR5 = FWRO + 0x42c8,
187 FWIPTRR6 = FWRO + 0x42cc,
188 FWIPTRR7 = FWRO + 0x42d0,
189 FWIPTRR8 = FWRO + 0x42e0,
190 FWIPTRR9 = FWRO + 0x42f0,
191 FWIPHLEC = FWRO + 0x4300,
192 FWIPAGUSPC = FWRO + 0x4500,
193 FWIPAGC = FWRO + 0x4504,
194 FWIPAGM0 = FWRO + 0x4510,
195 FWIPAGM1 = FWRO + 0x4514,
196 FWIPAGM2 = FWRO + 0x4518,
197 FWIPAGM3 = FWRO + 0x451c,
198 FWIPAGM4 = FWRO + 0x4520,
199 FWMACHEC = FWRO + 0x4620,
200 FWMACHC = FWRO + 0x4624,
201 FWMACTL0 = FWRO + 0x4630,
202 FWMACTL1 = FWRO + 0x4634,
203 FWMACTL2 = FWRO + 0x4638,
204 FWMACTL3 = FWRO + 0x463c,
205 FWMACTL4 = FWRO + 0x4640,
206 FWMACTL5 = FWRO + 0x4650,
207 FWMACTLR = FWRO + 0x4654,
208 FWMACTIM = FWRO + 0x4660,
209 FWMACTEM = FWRO + 0x4664,
210 FWMACTS0 = FWRO + 0x4670,
211 FWMACTS1 = FWRO + 0x4674,
212 FWMACTSR0 = FWRO + 0x4678,
213 FWMACTSR1 = FWRO + 0x467c,
214 FWMACTSR2 = FWRO + 0x4680,
215 FWMACTSR3 = FWRO + 0x4690,
216 FWMACTR = FWRO + 0x46a0,
217 FWMACTRR0 = FWRO + 0x46a4,
218 FWMACTRR1 = FWRO + 0x46a8,
219 FWMACTRR2 = FWRO + 0x46ac,
220 FWMACTRR3 = FWRO + 0x46b0,
221 FWMACTRR4 = FWRO + 0x46b4,
222 FWMACTRR5 = FWRO + 0x46c0,
223 FWMACTRR6 = FWRO + 0x46d0,
224 FWMACHLEC = FWRO + 0x4700,
225 FWMACAGUSPC = FWRO + 0x4880,
226 FWMACAGC = FWRO + 0x4884,
227 FWMACAGM0 = FWRO + 0x4888,
228 FWMACAGM1 = FWRO + 0x488c,
229 FWVLANTEC = FWRO + 0x4900,
230 FWVLANTL0 = FWRO + 0x4910,
231 FWVLANTL1 = FWRO + 0x4914,
232 FWVLANTL2 = FWRO + 0x4918,
233 FWVLANTL3 = FWRO + 0x4920,
234 FWVLANTL4 = FWRO + 0x4930,
235 FWVLANTLR = FWRO + 0x4934,
236 FWVLANTIM = FWRO + 0x4940,
237 FWVLANTEM = FWRO + 0x4944,
238 FWVLANTS = FWRO + 0x4950,
239 FWVLANTSR0 = FWRO + 0x4954,
240 FWVLANTSR1 = FWRO + 0x4958,
241 FWVLANTSR2 = FWRO + 0x4960,
242 FWVLANTSR3 = FWRO + 0x4970,
243 FWPBFC0 = FWRO + 0x4a00,
244 FWPBFCSDC00 = FWRO + 0x4a04,
245 FWL23URL0 = FWRO + 0x4e00,
246 FWL23URL1 = FWRO + 0x4e04,
247 FWL23URL2 = FWRO + 0x4e08,
248 FWL23URL3 = FWRO + 0x4e0c,
249 FWL23URLR = FWRO + 0x4e10,
250 FWL23UTIM = FWRO + 0x4e20,
251 FWL23URR = FWRO + 0x4e30,
252 FWL23URRR0 = FWRO + 0x4e34,
253 FWL23URRR1 = FWRO + 0x4e38,
254 FWL23URRR2 = FWRO + 0x4e3c,
255 FWL23URRR3 = FWRO + 0x4e40,
256 FWL23URMC0 = FWRO + 0x4f00,
257 FWPMFGC0 = FWRO + 0x5000,
258 FWPGFC0 = FWRO + 0x5100,
259 FWPGFIGSC0 = FWRO + 0x5104,
260 FWPGFENC0 = FWRO + 0x5108,
261 FWPGFENM0 = FWRO + 0x510c,
262 FWPGFCSTC00 = FWRO + 0x5110,
263 FWPGFCSTC10 = FWRO + 0x5114,
264 FWPGFCSTM00 = FWRO + 0x5118,
265 FWPGFCSTM10 = FWRO + 0x511c,
266 FWPGFCTC0 = FWRO + 0x5120,
267 FWPGFCTM0 = FWRO + 0x5124,
268 FWPGFHCC0 = FWRO + 0x5128,
269 FWPGFSM0 = FWRO + 0x512c,
270 FWPGFGC0 = FWRO + 0x5130,
271 FWPGFGL0 = FWRO + 0x5500,
272 FWPGFGL1 = FWRO + 0x5504,
273 FWPGFGLR = FWRO + 0x5518,
274 FWPGFGR = FWRO + 0x5510,
275 FWPGFGRR0 = FWRO + 0x5514,
276 FWPGFGRR1 = FWRO + 0x5518,
277 FWPGFRIM = FWRO + 0x5520,
278 FWPMTRFC0 = FWRO + 0x5600,
279 FWPMTRCBSC0 = FWRO + 0x5604,
280 FWPMTRC0RC0 = FWRO + 0x5608,
281 FWPMTREBSC0 = FWRO + 0x560c,
282 FWPMTREIRC0 = FWRO + 0x5610,
283 FWPMTRFM0 = FWRO + 0x5614,
284 FWFTL0 = FWRO + 0x6000,
285 FWFTL1 = FWRO + 0x6004,
286 FWFTLR = FWRO + 0x6008,
287 FWFTOC = FWRO + 0x6010,
288 FWFTOPC = FWRO + 0x6014,
289 FWFTIM = FWRO + 0x6020,
290 FWFTR = FWRO + 0x6030,
291 FWFTRR0 = FWRO + 0x6034,
292 FWFTRR1 = FWRO + 0x6038,
293 FWFTRR2 = FWRO + 0x603c,
294 FWSEQNGC0 = FWRO + 0x6100,
295 FWSEQNGM0 = FWRO + 0x6104,
296 FWSEQNRC = FWRO + 0x6200,
297 FWCTFDCN0 = FWRO + 0x6300,
298 FWLTHFDCN0 = FWRO + 0x6304,
299 FWIPFDCN0 = FWRO + 0x6308,
300 FWLTWFDCN0 = FWRO + 0x630c,
301 FWPBFDCN0 = FWRO + 0x6310,
302 FWMHLCN0 = FWRO + 0x6314,
303 FWIHLCN0 = FWRO + 0x6318,
304 FWICRDCN0 = FWRO + 0x6500,
305 FWWMRDCN0 = FWRO + 0x6504,
306 FWCTRDCN0 = FWRO + 0x6508,
307 FWLTHRDCN0 = FWRO + 0x650c,
308 FWIPRDCN0 = FWRO + 0x6510,
309 FWLTWRDCN0 = FWRO + 0x6514,
310 FWPBRDCN0 = FWRO + 0x6518,
311 FWPMFDCN0 = FWRO + 0x6700,
312 FWPGFDCN0 = FWRO + 0x6780,
313 FWPMGDCN0 = FWRO + 0x6800,
314 FWPMYDCN0 = FWRO + 0x6804,
315 FWPMRDCN0 = FWRO + 0x6808,
316 FWFRPPCN0 = FWRO + 0x6a00,
317 FWFRDPCN0 = FWRO + 0x6a04,
318 FWEIS00 = FWRO + 0x7900,
319 FWEIE00 = FWRO + 0x7904,
320 FWEID00 = FWRO + 0x7908,
321 FWEIS1 = FWRO + 0x7a00,
322 FWEIE1 = FWRO + 0x7a04,
323 FWEID1 = FWRO + 0x7a08,
324 FWEIS2 = FWRO + 0x7a10,
325 FWEIE2 = FWRO + 0x7a14,
326 FWEID2 = FWRO + 0x7a18,
327 FWEIS3 = FWRO + 0x7a20,
328 FWEIE3 = FWRO + 0x7a24,
329 FWEID3 = FWRO + 0x7a28,
330 FWEIS4 = FWRO + 0x7a30,
331 FWEIE4 = FWRO + 0x7a34,
332 FWEID4 = FWRO + 0x7a38,
333 FWEIS5 = FWRO + 0x7a40,
334 FWEIE5 = FWRO + 0x7a44,
335 FWEID5 = FWRO + 0x7a48,
336 FWEIS60 = FWRO + 0x7a50,
337 FWEIE60 = FWRO + 0x7a54,
338 FWEID60 = FWRO + 0x7a58,
339 FWEIS61 = FWRO + 0x7a60,
340 FWEIE61 = FWRO + 0x7a64,
341 FWEID61 = FWRO + 0x7a68,
342 FWEIS62 = FWRO + 0x7a70,
343 FWEIE62 = FWRO + 0x7a74,
344 FWEID62 = FWRO + 0x7a78,
345 FWEIS63 = FWRO + 0x7a80,
346 FWEIE63 = FWRO + 0x7a84,
347 FWEID63 = FWRO + 0x7a88,
348 FWEIS70 = FWRO + 0x7a90,
349 FWEIE70 = FWRO + 0x7A94,
350 FWEID70 = FWRO + 0x7a98,
351 FWEIS71 = FWRO + 0x7aa0,
352 FWEIE71 = FWRO + 0x7aa4,
353 FWEID71 = FWRO + 0x7aa8,
354 FWEIS72 = FWRO + 0x7ab0,
355 FWEIE72 = FWRO + 0x7ab4,
356 FWEID72 = FWRO + 0x7ab8,
357 FWEIS73 = FWRO + 0x7ac0,
358 FWEIE73 = FWRO + 0x7ac4,
359 FWEID73 = FWRO + 0x7ac8,
360 FWEIS80 = FWRO + 0x7ad0,
361 FWEIE80 = FWRO + 0x7ad4,
362 FWEID80 = FWRO + 0x7ad8,
363 FWEIS81 = FWRO + 0x7ae0,
364 FWEIE81 = FWRO + 0x7ae4,
365 FWEID81 = FWRO + 0x7ae8,
366 FWEIS82 = FWRO + 0x7af0,
367 FWEIE82 = FWRO + 0x7af4,
368 FWEID82 = FWRO + 0x7af8,
369 FWEIS83 = FWRO + 0x7b00,
370 FWEIE83 = FWRO + 0x7b04,
371 FWEID83 = FWRO + 0x7b08,
372 FWMIS0 = FWRO + 0x7c00,
373 FWMIE0 = FWRO + 0x7c04,
374 FWMID0 = FWRO + 0x7c08,
375 FWSCR0 = FWRO + 0x7d00,
376 FWSCR1 = FWRO + 0x7d04,
377 FWSCR2 = FWRO + 0x7d08,
378 FWSCR3 = FWRO + 0x7d0c,
379 FWSCR4 = FWRO + 0x7d10,
380 FWSCR5 = FWRO + 0x7d14,
381 FWSCR6 = FWRO + 0x7d18,
382 FWSCR7 = FWRO + 0x7d1c,
383 FWSCR8 = FWRO + 0x7d20,
384 FWSCR9 = FWRO + 0x7d24,
385 FWSCR10 = FWRO + 0x7d28,
386 FWSCR11 = FWRO + 0x7d2c,
387 FWSCR12 = FWRO + 0x7d30,
388 FWSCR13 = FWRO + 0x7d34,
389 FWSCR14 = FWRO + 0x7d38,
390 FWSCR15 = FWRO + 0x7d3c,
391 FWSCR16 = FWRO + 0x7d40,
392 FWSCR17 = FWRO + 0x7d44,
393 FWSCR18 = FWRO + 0x7d48,
394 FWSCR19 = FWRO + 0x7d4c,
395 FWSCR20 = FWRO + 0x7d50,
396 FWSCR21 = FWRO + 0x7d54,
397 FWSCR22 = FWRO + 0x7d58,
398 FWSCR23 = FWRO + 0x7d5c,
399 FWSCR24 = FWRO + 0x7d60,
400 FWSCR25 = FWRO + 0x7d64,
401 FWSCR26 = FWRO + 0x7d68,
402 FWSCR27 = FWRO + 0x7d6c,
403 FWSCR28 = FWRO + 0x7d70,
404 FWSCR29 = FWRO + 0x7d74,
405 FWSCR30 = FWRO + 0x7d78,
406 FWSCR31 = FWRO + 0x7d7c,
407 FWSCR32 = FWRO + 0x7d80,
408 FWSCR33 = FWRO + 0x7d84,
409 FWSCR34 = FWRO + 0x7d88,
410 FWSCR35 = FWRO + 0x7d8c,
411 FWSCR36 = FWRO + 0x7d90,
412 FWSCR37 = FWRO + 0x7d94,
413 FWSCR38 = FWRO + 0x7d98,
414 FWSCR39 = FWRO + 0x7d9c,
415 FWSCR40 = FWRO + 0x7da0,
416 FWSCR41 = FWRO + 0x7da4,
417 FWSCR42 = FWRO + 0x7da8,
418 FWSCR43 = FWRO + 0x7dac,
419 FWSCR44 = FWRO + 0x7db0,
420 FWSCR45 = FWRO + 0x7db4,
421 FWSCR46 = FWRO + 0x7db8,
422
423 TPEMIMC0 = TPRO + 0x0000,
424 TPEMIMC1 = TPRO + 0x0004,
425 TPEMIMC2 = TPRO + 0x0008,
426 TPEMIMC3 = TPRO + 0x000c,
427 TPEMIMC4 = TPRO + 0x0010,
428 TPEMIMC5 = TPRO + 0x0014,
429 TPEMIMC60 = TPRO + 0x0080,
430 TPEMIMC70 = TPRO + 0x0100,
431 TSIM = TPRO + 0x0700,
432 TFIM = TPRO + 0x0704,
433 TCIM = TPRO + 0x0708,
434 TGIM0 = TPRO + 0x0710,
435 TGIM1 = TPRO + 0x0714,
436 TEIM0 = TPRO + 0x0720,
437 TEIM1 = TPRO + 0x0724,
438 TEIM2 = TPRO + 0x0728,
439
440 RIPV = CARO + 0x0000,
441 RRC = CARO + 0x0004,
442 RCEC = CARO + 0x0008,
443 RCDC = CARO + 0x000c,
444 RSSIS = CARO + 0x0010,
445 RSSIE = CARO + 0x0014,
446 RSSID = CARO + 0x0018,
447 CABPIBWMC = CARO + 0x0020,
448 CABPWMLC = CARO + 0x0040,
449 CABPPFLC0 = CARO + 0x0050,
450 CABPPWMLC0 = CARO + 0x0060,
451 CABPPPFLC00 = CARO + 0x00a0,
452 CABPULC = CARO + 0x0100,
453 CABPIRM = CARO + 0x0140,
454 CABPPCM = CARO + 0x0144,
455 CABPLCM = CARO + 0x0148,
456 CABPCPM = CARO + 0x0180,
457 CABPMCPM = CARO + 0x0200,
458 CARDNM = CARO + 0x0280,
459 CARDMNM = CARO + 0x0284,
460 CARDCN = CARO + 0x0290,
461 CAEIS0 = CARO + 0x0300,
462 CAEIE0 = CARO + 0x0304,
463 CAEID0 = CARO + 0x0308,
464 CAEIS1 = CARO + 0x0310,
465 CAEIE1 = CARO + 0x0314,
466 CAEID1 = CARO + 0x0318,
467 CAMIS0 = CARO + 0x0340,
468 CAMIE0 = CARO + 0x0344,
469 CAMID0 = CARO + 0x0348,
470 CAMIS1 = CARO + 0x0350,
471 CAMIE1 = CARO + 0x0354,
472 CAMID1 = CARO + 0x0358,
473 CASCR = CARO + 0x0380,
474
475 EAMC = TARO + 0x0000,
476 EAMS = TARO + 0x0004,
477 EAIRC = TARO + 0x0010,
478 EATDQSC = TARO + 0x0014,
479 EATDQC = TARO + 0x0018,
480 EATDQAC = TARO + 0x001c,
481 EATPEC = TARO + 0x0020,
482 EATMFSC0 = TARO + 0x0040,
483 EATDQDC0 = TARO + 0x0060,
484 EATDQM0 = TARO + 0x0080,
485 EATDQMLM0 = TARO + 0x00a0,
486 EACTQC = TARO + 0x0100,
487 EACTDQDC = TARO + 0x0104,
488 EACTDQM = TARO + 0x0108,
489 EACTDQMLM = TARO + 0x010c,
490 EAVCC = TARO + 0x0130,
491 EAVTC = TARO + 0x0134,
492 EATTFC = TARO + 0x0138,
493 EACAEC = TARO + 0x0200,
494 EACC = TARO + 0x0204,
495 EACAIVC0 = TARO + 0x0220,
496 EACAULC0 = TARO + 0x0240,
497 EACOEM = TARO + 0x0260,
498 EACOIVM0 = TARO + 0x0280,
499 EACOULM0 = TARO + 0x02a0,
500 EACGSM = TARO + 0x02c0,
501 EATASC = TARO + 0x0300,
502 EATASENC0 = TARO + 0x0320,
503 EATASCTENC = TARO + 0x0340,
504 EATASENM0 = TARO + 0x0360,
505 EATASCTENM = TARO + 0x0380,
506 EATASCSTC0 = TARO + 0x03a0,
507 EATASCSTC1 = TARO + 0x03a4,
508 EATASCSTM0 = TARO + 0x03a8,
509 EATASCSTM1 = TARO + 0x03ac,
510 EATASCTC = TARO + 0x03b0,
511 EATASCTM = TARO + 0x03b4,
512 EATASGL0 = TARO + 0x03c0,
513 EATASGL1 = TARO + 0x03c4,
514 EATASGLR = TARO + 0x03c8,
515 EATASGR = TARO + 0x03d0,
516 EATASGRR = TARO + 0x03d4,
517 EATASHCC = TARO + 0x03e0,
518 EATASRIRM = TARO + 0x03e4,
519 EATASSM = TARO + 0x03e8,
520 EAUSMFSECN = TARO + 0x0400,
521 EATFECN = TARO + 0x0404,
522 EAFSECN = TARO + 0x0408,
523 EADQOECN = TARO + 0x040c,
524 EADQSECN = TARO + 0x0410,
525 EACKSECN = TARO + 0x0414,
526 EAEIS0 = TARO + 0x0500,
527 EAEIE0 = TARO + 0x0504,
528 EAEID0 = TARO + 0x0508,
529 EAEIS1 = TARO + 0x0510,
530 EAEIE1 = TARO + 0x0514,
531 EAEID1 = TARO + 0x0518,
532 EAEIS2 = TARO + 0x0520,
533 EAEIE2 = TARO + 0x0524,
534 EAEID2 = TARO + 0x0528,
535 EASCR = TARO + 0x0580,
536
537 MPSM = RMRO + 0x0000,
538 MPIC = RMRO + 0x0004,
539 MPIM = RMRO + 0x0008,
540 MIOC = RMRO + 0x0010,
541 MIOM = RMRO + 0x0014,
542 MXMS = RMRO + 0x0018,
543 MTFFC = RMRO + 0x0020,
544 MTPFC = RMRO + 0x0024,
545 MTPFC2 = RMRO + 0x0028,
546 MTPFC30 = RMRO + 0x0030,
547 MTATC0 = RMRO + 0x0050,
548 MTIM = RMRO + 0x0060,
549 MRGC = RMRO + 0x0080,
550 MRMAC0 = RMRO + 0x0084,
551 MRMAC1 = RMRO + 0x0088,
552 MRAFC = RMRO + 0x008c,
553 MRSCE = RMRO + 0x0090,
554 MRSCP = RMRO + 0x0094,
555 MRSCC = RMRO + 0x0098,
556 MRFSCE = RMRO + 0x009c,
557 MRFSCP = RMRO + 0x00a0,
558 MTRC = RMRO + 0x00a4,
559 MRIM = RMRO + 0x00a8,
560 MRPFM = RMRO + 0x00ac,
561 MPFC0 = RMRO + 0x0100,
562 MLVC = RMRO + 0x0180,
563 MEEEC = RMRO + 0x0184,
564 MLBC = RMRO + 0x0188,
565 MXGMIIC = RMRO + 0x0190,
566 MPCH = RMRO + 0x0194,
567 MANC = RMRO + 0x0198,
568 MANM = RMRO + 0x019c,
569 MPLCA1 = RMRO + 0x01a0,
570 MPLCA2 = RMRO + 0x01a4,
571 MPLCA3 = RMRO + 0x01a8,
572 MPLCA4 = RMRO + 0x01ac,
573 MPLCAM = RMRO + 0x01b0,
574 MHDC1 = RMRO + 0x01c0,
575 MHDC2 = RMRO + 0x01c4,
576 MEIS = RMRO + 0x0200,
577 MEIE = RMRO + 0x0204,
578 MEID = RMRO + 0x0208,
579 MMIS0 = RMRO + 0x0210,
580 MMIE0 = RMRO + 0x0214,
581 MMID0 = RMRO + 0x0218,
582 MMIS1 = RMRO + 0x0220,
583 MMIE1 = RMRO + 0x0224,
584 MMID1 = RMRO + 0x0228,
585 MMIS2 = RMRO + 0x0230,
586 MMIE2 = RMRO + 0x0234,
587 MMID2 = RMRO + 0x0238,
588 MMPFTCT = RMRO + 0x0300,
589 MAPFTCT = RMRO + 0x0304,
590 MPFRCT = RMRO + 0x0308,
591 MFCICT = RMRO + 0x030c,
592 MEEECT = RMRO + 0x0310,
593 MMPCFTCT0 = RMRO + 0x0320,
594 MAPCFTCT0 = RMRO + 0x0330,
595 MPCFRCT0 = RMRO + 0x0340,
596 MHDCC = RMRO + 0x0350,
597 MROVFC = RMRO + 0x0354,
598 MRHCRCEC = RMRO + 0x0358,
599 MRXBCE = RMRO + 0x0400,
600 MRXBCP = RMRO + 0x0404,
601 MRGFCE = RMRO + 0x0408,
602 MRGFCP = RMRO + 0x040c,
603 MRBFC = RMRO + 0x0410,
604 MRMFC = RMRO + 0x0414,
605 MRUFC = RMRO + 0x0418,
606 MRPEFC = RMRO + 0x041c,
607 MRNEFC = RMRO + 0x0420,
608 MRFMEFC = RMRO + 0x0424,
609 MRFFMEFC = RMRO + 0x0428,
610 MRCFCEFC = RMRO + 0x042c,
611 MRFCEFC = RMRO + 0x0430,
612 MRRCFEFC = RMRO + 0x0434,
613 MRUEFC = RMRO + 0x043c,
614 MROEFC = RMRO + 0x0440,
615 MRBOEC = RMRO + 0x0444,
616 MTXBCE = RMRO + 0x0500,
617 MTXBCP = RMRO + 0x0504,
618 MTGFCE = RMRO + 0x0508,
619 MTGFCP = RMRO + 0x050c,
620 MTBFC = RMRO + 0x0510,
621 MTMFC = RMRO + 0x0514,
622 MTUFC = RMRO + 0x0518,
623 MTEFC = RMRO + 0x051c,
624
625 GWMC = GWRO + 0x0000,
626 GWMS = GWRO + 0x0004,
627 GWIRC = GWRO + 0x0010,
628 GWRDQSC = GWRO + 0x0014,
629 GWRDQC = GWRO + 0x0018,
630 GWRDQAC = GWRO + 0x001c,
631 GWRGC = GWRO + 0x0020,
632 GWRMFSC0 = GWRO + 0x0040,
633 GWRDQDC0 = GWRO + 0x0060,
634 GWRDQM0 = GWRO + 0x0080,
635 GWRDQMLM0 = GWRO + 0x00a0,
636 GWMTIRM = GWRO + 0x0100,
637 GWMSTLS = GWRO + 0x0104,
638 GWMSTLR = GWRO + 0x0108,
639 GWMSTSS = GWRO + 0x010c,
640 GWMSTSR = GWRO + 0x0110,
641 GWMAC0 = GWRO + 0x0120,
642 GWMAC1 = GWRO + 0x0124,
643 GWVCC = GWRO + 0x0130,
644 GWVTC = GWRO + 0x0134,
645 GWTTFC = GWRO + 0x0138,
646 GWTDCAC00 = GWRO + 0x0140,
647 GWTDCAC10 = GWRO + 0x0144,
648 GWTSDCC0 = GWRO + 0x0160,
649 GWTNM = GWRO + 0x0180,
650 GWTMNM = GWRO + 0x0184,
651 GWAC = GWRO + 0x0190,
652 GWDCBAC0 = GWRO + 0x0194,
653 GWDCBAC1 = GWRO + 0x0198,
654 GWIICBSC = GWRO + 0x019c,
655 GWMDNC = GWRO + 0x01a0,
656 GWTRC0 = GWRO + 0x0200,
657 GWTPC0 = GWRO + 0x0300,
658 GWARIRM = GWRO + 0x0380,
659 GWDCC0 = GWRO + 0x0400,
660 GWAARSS = GWRO + 0x0800,
661 GWAARSR0 = GWRO + 0x0804,
662 GWAARSR1 = GWRO + 0x0808,
663 GWIDAUAS0 = GWRO + 0x0840,
664 GWIDASM0 = GWRO + 0x0880,
665 GWIDASAM00 = GWRO + 0x0900,
666 GWIDASAM10 = GWRO + 0x0904,
667 GWIDACAM00 = GWRO + 0x0980,
668 GWIDACAM10 = GWRO + 0x0984,
669 GWGRLC = GWRO + 0x0a00,
670 GWGRLULC = GWRO + 0x0a04,
671 GWRLIVC0 = GWRO + 0x0a80,
672 GWRLULC0 = GWRO + 0x0a84,
673 GWIDPC = GWRO + 0x0b00,
674 GWIDC0 = GWRO + 0x0c00,
675 GWDIS0 = GWRO + 0x1100,
676 GWDIE0 = GWRO + 0x1104,
677 GWDID0 = GWRO + 0x1108,
678 GWTSDIS = GWRO + 0x1180,
679 GWTSDIE = GWRO + 0x1184,
680 GWTSDID = GWRO + 0x1188,
681 GWEIS0 = GWRO + 0x1190,
682 GWEIE0 = GWRO + 0x1194,
683 GWEID0 = GWRO + 0x1198,
684 GWEIS1 = GWRO + 0x11a0,
685 GWEIE1 = GWRO + 0x11a4,
686 GWEID1 = GWRO + 0x11a8,
687 GWEIS20 = GWRO + 0x1200,
688 GWEIE20 = GWRO + 0x1204,
689 GWEID20 = GWRO + 0x1208,
690 GWEIS3 = GWRO + 0x1280,
691 GWEIE3 = GWRO + 0x1284,
692 GWEID3 = GWRO + 0x1288,
693 GWEIS4 = GWRO + 0x1290,
694 GWEIE4 = GWRO + 0x1294,
695 GWEID4 = GWRO + 0x1298,
696 GWEIS5 = GWRO + 0x12a0,
697 GWEIE5 = GWRO + 0x12a4,
698 GWEID5 = GWRO + 0x12a8,
699 GWSCR0 = GWRO + 0x1800,
700 GWSCR1 = GWRO + 0x1900,
701};
702
703/* ETHA/RMAC */
704enum rswitch_etha_mode {
705 EAMC_OPC_RESET,
706 EAMC_OPC_DISABLE,
707 EAMC_OPC_CONFIG,
708 EAMC_OPC_OPERATION,
709};
710
711#define EAMS_OPS_MASK EAMC_OPC_OPERATION
712
713#define EAVCC_VEM_SC_TAG (0x3 << 16)
714
715#define MPIC_PIS_MII 0x00
716#define MPIC_PIS_GMII 0x02
717#define MPIC_PIS_XGMII 0x04
718#define MPIC_LSC_SHIFT 3
719#define MPIC_LSC_100M (1 << MPIC_LSC_SHIFT)
720#define MPIC_LSC_1G (2 << MPIC_LSC_SHIFT)
721#define MPIC_LSC_2_5G (3 << MPIC_LSC_SHIFT)
722
723#define MDIO_READ_C45 0x03
724#define MDIO_WRITE_C45 0x01
725
726#define MPSM_PSME BIT(0)
727#define MPSM_MFF_C45 BIT(2)
728#define MPSM_PRD_SHIFT 16
729#define MPSM_PRD_MASK GENMASK(31, MPSM_PRD_SHIFT)
730
731/* Completion flags */
732#define MMIS1_PAACS BIT(2) /* Address */
733#define MMIS1_PWACS BIT(1) /* Write */
734#define MMIS1_PRACS BIT(0) /* Read */
735#define MMIS1_CLEAR_FLAGS 0xf
736
737#define MPIC_PSMCS_SHIFT 16
738#define MPIC_PSMCS_MASK GENMASK(22, MPIC_PSMCS_SHIFT)
739#define MPIC_PSMCS(val) ((val) << MPIC_PSMCS_SHIFT)
740
741#define MPIC_PSMHT_SHIFT 24
742#define MPIC_PSMHT_MASK GENMASK(26, MPIC_PSMHT_SHIFT)
743#define MPIC_PSMHT(val) ((val) << MPIC_PSMHT_SHIFT)
744
745#define MLVC_PLV BIT(16)
746
747/* GWCA */
748enum rswitch_gwca_mode {
749 GWMC_OPC_RESET,
750 GWMC_OPC_DISABLE,
751 GWMC_OPC_CONFIG,
752 GWMC_OPC_OPERATION,
753};
754
755#define GWMS_OPS_MASK GWMC_OPC_OPERATION
756
757#define GWMTIRM_MTIOG BIT(0)
758#define GWMTIRM_MTR BIT(1)
759
760#define GWVCC_VEM_SC_TAG (0x3 << 16)
761
762#define GWARIRM_ARIOG BIT(0)
763#define GWARIRM_ARR BIT(1)
764
765#define GWDCC_BALR BIT(24)
766#define GWDCC_DQT BIT(11)
767#define GWDCC_ETS BIT(9)
768#define GWDCC_EDE BIT(8)
769
770#define GWTRC(queue) (GWTRC0 + (queue) / 32 * 4)
771#define GWDCC_OFFS(queue) (GWDCC0 + (queue) * 4)
772
773#define GWDIS(i) (GWDIS0 + (i) * 0x10)
774#define GWDIE(i) (GWDIE0 + (i) * 0x10)
775#define GWDID(i) (GWDID0 + (i) * 0x10)
776
777/* COMA */
778#define RRC_RR BIT(0)
779#define RRC_RR_CLR 0
780#define RCEC_ACE_DEFAULT (BIT(0) | BIT(AGENT_INDEX_GWCA))
781#define RCEC_RCE BIT(16)
782#define RCDC_RCD BIT(16)
783
784#define CABPIRM_BPIOG BIT(0)
785#define CABPIRM_BPR BIT(1)
786
787/* MFWD */
788#define FWPC0_LTHTA BIT(0)
789#define FWPC0_IP4UE BIT(3)
790#define FWPC0_IP4TE BIT(4)
791#define FWPC0_IP4OE BIT(5)
792#define FWPC0_L2SE BIT(9)
793#define FWPC0_IP4EA BIT(10)
794#define FWPC0_IPDSA BIT(12)
795#define FWPC0_IPHLA BIT(18)
796#define FWPC0_MACSDA BIT(20)
797#define FWPC0_MACHLA BIT(26)
798#define FWPC0_MACHMA BIT(27)
799#define FWPC0_VLANSA BIT(28)
800
801#define FWPC0(i) (FWPC00 + (i) * 0x10)
802#define FWPC0_DEFAULT (FWPC0_LTHTA | FWPC0_IP4UE | FWPC0_IP4TE | \
803 FWPC0_IP4OE | FWPC0_L2SE | FWPC0_IP4EA | \
804 FWPC0_IPDSA | FWPC0_IPHLA | FWPC0_MACSDA | \
805 FWPC0_MACHLA | FWPC0_MACHMA | FWPC0_VLANSA)
806#define FWPC1(i) (FWPC10 + (i) * 0x10)
807#define FWPC1_DDE BIT(0)
808
809#define FWPBFC(i) (FWPBFC0 + (i) * 0x10)
810
811#define FWPBFCSDC(j, i) (FWPBFCSDC00 + (i) * 0x10 + (j) * 0x04)
812
813/* TOP */
814#define TPEMIMC7(queue) (TPEMIMC70 + (queue) * 4)
815
816/* Descriptors */
817enum RX_DS_CC_BIT {
818 RX_DS = 0x0fff, /* Data size */
819 RX_TR = 0x1000, /* Truncation indication */
820 RX_EI = 0x2000, /* Error indication */
821 RX_PS = 0xc000, /* Padding selection */
822};
823
824enum TX_DS_TAGL_BIT {
825 TX_DS = 0x0fff, /* Data size */
826 TX_TAGL = 0xf000, /* Frame tag LSBs */
827};
828
829enum DIE_DT {
830 /* Frame data */
831 DT_FSINGLE = 0x80,
832 DT_FSTART = 0x90,
833 DT_FMID = 0xa0,
834 DT_FEND = 0xb8,
835
836 /* Chain control */
837 DT_LEMPTY = 0xc0,
838 DT_EEMPTY = 0xd0,
839 DT_LINKFIX = 0x00,
840 DT_LINK = 0xe0,
841 DT_EOS = 0xf0,
842 /* HW/SW arbitration */
843 DT_FEMPTY = 0x40,
844 DT_FEMPTY_IS = 0x10,
845 DT_FEMPTY_IC = 0x20,
846 DT_FEMPTY_ND = 0x38,
847 DT_FEMPTY_START = 0x50,
848 DT_FEMPTY_MID = 0x60,
849 DT_FEMPTY_END = 0x70,
850
851 DT_MASK = 0xf0,
852 DIE = 0x08, /* Descriptor Interrupt Enable */
853};
854
855/* Both transmission and reception */
856#define INFO1_FMT BIT(2)
857#define INFO1_TXC BIT(3)
858
859/* For transmission */
860#define INFO1_TSUN(val) ((u64)(val) << 8ULL)
861#define INFO1_CSD0(index) ((u64)(index) << 32ULL)
862#define INFO1_CSD1(index) ((u64)(index) << 40ULL)
863#define INFO1_DV(port_vector) ((u64)(port_vector) << 48ULL)
864
865/* For reception */
866#define INFO1_SPN(port) ((u64)(port) << 36ULL)
867
868struct rswitch_desc {
869 __le16 info_ds; /* Descriptor size */
870 u8 die_dt; /* Descriptor interrupt enable and type */
871 __u8 dptrh; /* Descriptor pointer MSB */
872 __le32 dptrl; /* Descriptor pointer LSW */
873} __packed;
874
875struct rswitch_ts_desc {
876 struct rswitch_desc desc;
877 __le32 ts_nsec;
878 __le32 ts_sec;
879} __packed;
880
881struct rswitch_ext_desc {
882 struct rswitch_desc desc;
883 __le64 info1;
884} __packed;
885
886struct rswitch_ext_ts_desc {
887 struct rswitch_desc desc;
888 __le64 info1;
889 __le32 ts_nsec;
890 __le32 ts_sec;
891} __packed;
892
893struct rswitch_etha {
894 int index;
895 void __iomem *addr;
896 void __iomem *coma_addr;
897 bool external_phy;
898 struct mii_bus *mii;
899 phy_interface_t phy_interface;
900 u8 mac_addr[MAX_ADDR_LEN];
901 int link;
902 int speed;
903
904 /* This hardware could not be initialized twice so that marked
905 * this flag to avoid multiple initialization.
906 */
907 bool operated;
908};
909
910/* The datasheet said descriptor "chain" and/or "queue". For consistency of
911 * name, this driver calls "queue".
912 */
913struct rswitch_gwca_queue {
914 int index;
915 bool dir_tx;
916 bool gptp;
917 union {
918 struct rswitch_ext_desc *ring;
919 struct rswitch_ext_ts_desc *ts_ring;
920 };
921 dma_addr_t ring_dma;
922 int ring_size;
923 int cur;
924 int dirty;
925 struct sk_buff **skbs;
926
927 struct net_device *ndev; /* queue to ndev for irq */
928};
929
930#define RSWITCH_NUM_IRQ_REGS (RSWITCH_MAX_NUM_QUEUES / BITS_PER_TYPE(u32))
931struct rswitch_gwca {
932 int index;
933 struct rswitch_gwca_queue *queues;
934 int num_queues;
935 DECLARE_BITMAP(used, RSWITCH_MAX_NUM_QUEUES);
936 u32 tx_irq_bits[RSWITCH_NUM_IRQ_REGS];
937 u32 rx_irq_bits[RSWITCH_NUM_IRQ_REGS];
938 int speed;
939};
940
941#define NUM_QUEUES_PER_NDEV 2
942struct rswitch_device {
943 struct rswitch_private *priv;
944 struct net_device *ndev;
945 struct napi_struct napi;
946 struct phylink *phylink;
947 struct phylink_config phylink_config;
948 void __iomem *addr;
949 struct rswitch_gwca_queue *tx_queue;
950 struct rswitch_gwca_queue *rx_queue;
951 u8 ts_tag;
952 bool disabled;
953
954 int port;
955 struct rswitch_etha *etha;
956};
957
958struct rswitch_mfwd_mac_table_entry {
959 int queue_index;
960 unsigned char addr[MAX_ADDR_LEN];
961};
962
963struct rswitch_mfwd {
964 struct rswitch_mac_table_entry *mac_table_entries;
965 int num_mac_table_entries;
966};
967
968struct rswitch_private {
969 struct platform_device *pdev;
970 void __iomem *addr;
971 struct rcar_gen4_ptp_private *ptp_priv;
972 struct rswitch_desc *linkfix_table;
973 dma_addr_t linkfix_table_dma;
974 u32 linkfix_table_size;
975
976 struct rswitch_device *rdev[RSWITCH_NUM_PORTS];
977
978 struct rswitch_gwca gwca;
979 struct rswitch_etha etha[RSWITCH_NUM_PORTS];
980 struct rswitch_mfwd mfwd;
981
982 bool gwca_halt;
983};
984
985#endif /* #ifndef __RSWITCH_H__ */