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