xref: /linux/drivers/net/dsa/vitesse-vsc73xx-core.c (revision 550ee90ac61c1f0cd987c68a9ac6c4c9833925d7)
1 // SPDX-License-Identifier: GPL-2.0
2 /* DSA driver for:
3  * Vitesse VSC7385 SparX-G5 5+1-port Integrated Gigabit Ethernet Switch
4  * Vitesse VSC7388 SparX-G8 8-port Integrated Gigabit Ethernet Switch
5  * Vitesse VSC7395 SparX-G5e 5+1-port Integrated Gigabit Ethernet Switch
6  * Vitesse VSC7398 SparX-G8e 8-port Integrated Gigabit Ethernet Switch
7  *
8  * These switches have a built-in 8051 CPU and can download and execute a
9  * firmware in this CPU. They can also be configured to use an external CPU
10  * handling the switch in a memory-mapped manner by connecting to that external
11  * CPU's memory bus.
12  *
13  * Copyright (C) 2018 Linus Wallej <linus.walleij@linaro.org>
14  * Includes portions of code from the firmware uploader by:
15  * Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
16  */
17 #include <linux/kernel.h>
18 #include <linux/module.h>
19 #include <linux/device.h>
20 #include <linux/iopoll.h>
21 #include <linux/of.h>
22 #include <linux/of_mdio.h>
23 #include <linux/bitops.h>
24 #include <linux/bitfield.h>
25 #include <linux/if_bridge.h>
26 #include <linux/if_vlan.h>
27 #include <linux/etherdevice.h>
28 #include <linux/gpio/consumer.h>
29 #include <linux/gpio/driver.h>
30 #include <linux/dsa/8021q.h>
31 #include <linux/random.h>
32 #include <net/dsa.h>
33 
34 #include "vitesse-vsc73xx.h"
35 
36 #define VSC73XX_BLOCK_MAC	0x1 /* Subblocks 0-4, 6 (CPU port) */
37 #define VSC73XX_BLOCK_ANALYZER	0x2 /* Only subblock 0 */
38 #define VSC73XX_BLOCK_MII	0x3 /* Subblocks 0 and 1 */
39 #define VSC73XX_BLOCK_MEMINIT	0x3 /* Only subblock 2 */
40 #define VSC73XX_BLOCK_CAPTURE	0x4 /* Only subblock 2 */
41 #define VSC73XX_BLOCK_ARBITER	0x5 /* Only subblock 0 */
42 #define VSC73XX_BLOCK_SYSTEM	0x7 /* Only subblock 0 */
43 
44 /* MII Block subblock */
45 #define VSC73XX_BLOCK_MII_INTERNAL	0x0 /* Internal MDIO subblock */
46 #define VSC73XX_BLOCK_MII_EXTERNAL	0x1 /* External MDIO subblock */
47 
48 #define CPU_PORT	6 /* CPU port */
49 
50 /* MAC Block registers */
51 #define VSC73XX_MAC_CFG		0x00
52 #define VSC73XX_MACHDXGAP	0x02
53 #define VSC73XX_FCCONF		0x04
54 #define VSC73XX_FCMACHI		0x08
55 #define VSC73XX_FCMACLO		0x0c
56 #define VSC73XX_MAXLEN		0x10
57 #define VSC73XX_ADVPORTM	0x19
58 #define VSC73XX_TXUPDCFG	0x24
59 #define VSC73XX_TXQ_SELECT_CFG	0x28
60 #define VSC73XX_RXOCT		0x50
61 #define VSC73XX_TXOCT		0x51
62 #define VSC73XX_C_RX0		0x52
63 #define VSC73XX_C_RX1		0x53
64 #define VSC73XX_C_RX2		0x54
65 #define VSC73XX_C_TX0		0x55
66 #define VSC73XX_C_TX1		0x56
67 #define VSC73XX_C_TX2		0x57
68 #define VSC73XX_C_CFG		0x58
69 #define VSC73XX_CAT_DROP	0x6e
70 #define VSC73XX_CAT_PR_MISC_L2	0x6f
71 #define VSC73XX_CAT_PR_USR_PRIO	0x75
72 #define VSC73XX_CAT_VLAN_MISC	0x79
73 #define VSC73XX_CAT_PORT_VLAN	0x7a
74 #define VSC73XX_Q_MISC_CONF	0xdf
75 
76 /* MAC_CFG register bits */
77 #define VSC73XX_MAC_CFG_WEXC_DIS	BIT(31)
78 #define VSC73XX_MAC_CFG_PORT_RST	BIT(29)
79 #define VSC73XX_MAC_CFG_TX_EN		BIT(28)
80 #define VSC73XX_MAC_CFG_SEED_LOAD	BIT(27)
81 #define VSC73XX_MAC_CFG_SEED_MASK	GENMASK(26, 19)
82 #define VSC73XX_MAC_CFG_SEED_OFFSET	19
83 #define VSC73XX_MAC_CFG_FDX		BIT(18)
84 #define VSC73XX_MAC_CFG_GIGA_MODE	BIT(17)
85 #define VSC73XX_MAC_CFG_RX_EN		BIT(16)
86 #define VSC73XX_MAC_CFG_VLAN_DBLAWR	BIT(15)
87 #define VSC73XX_MAC_CFG_VLAN_AWR	BIT(14)
88 #define VSC73XX_MAC_CFG_100_BASE_T	BIT(13) /* Not in manual */
89 #define VSC73XX_MAC_CFG_TX_IPG_MASK	GENMASK(10, 6)
90 #define VSC73XX_MAC_CFG_TX_IPG_OFFSET	6
91 #define VSC73XX_MAC_CFG_TX_IPG_1000M	(6 << VSC73XX_MAC_CFG_TX_IPG_OFFSET)
92 #define VSC73XX_MAC_CFG_TX_IPG_100_10M	(17 << VSC73XX_MAC_CFG_TX_IPG_OFFSET)
93 #define VSC73XX_MAC_CFG_MAC_RX_RST	BIT(5)
94 #define VSC73XX_MAC_CFG_MAC_TX_RST	BIT(4)
95 #define VSC73XX_MAC_CFG_CLK_SEL_MASK	GENMASK(2, 0)
96 #define VSC73XX_MAC_CFG_CLK_SEL_OFFSET	0
97 #define VSC73XX_MAC_CFG_CLK_SEL_1000M	1
98 #define VSC73XX_MAC_CFG_CLK_SEL_100M	2
99 #define VSC73XX_MAC_CFG_CLK_SEL_10M	3
100 #define VSC73XX_MAC_CFG_CLK_SEL_EXT	4
101 
102 #define VSC73XX_MAC_CFG_1000M_F_PHY	(VSC73XX_MAC_CFG_FDX | \
103 					 VSC73XX_MAC_CFG_GIGA_MODE | \
104 					 VSC73XX_MAC_CFG_TX_IPG_1000M | \
105 					 VSC73XX_MAC_CFG_CLK_SEL_EXT)
106 #define VSC73XX_MAC_CFG_100_10M_F_PHY	(VSC73XX_MAC_CFG_FDX | \
107 					 VSC73XX_MAC_CFG_TX_IPG_100_10M | \
108 					 VSC73XX_MAC_CFG_CLK_SEL_EXT)
109 #define VSC73XX_MAC_CFG_100_10M_H_PHY	(VSC73XX_MAC_CFG_TX_IPG_100_10M | \
110 					 VSC73XX_MAC_CFG_CLK_SEL_EXT)
111 #define VSC73XX_MAC_CFG_1000M_F_RGMII	(VSC73XX_MAC_CFG_FDX | \
112 					 VSC73XX_MAC_CFG_GIGA_MODE | \
113 					 VSC73XX_MAC_CFG_TX_IPG_1000M | \
114 					 VSC73XX_MAC_CFG_CLK_SEL_1000M)
115 #define VSC73XX_MAC_CFG_RESET		(VSC73XX_MAC_CFG_PORT_RST | \
116 					 VSC73XX_MAC_CFG_MAC_RX_RST | \
117 					 VSC73XX_MAC_CFG_MAC_TX_RST)
118 
119 /* Flow control register bits */
120 #define VSC73XX_FCCONF_ZERO_PAUSE_EN	BIT(17)
121 #define VSC73XX_FCCONF_FLOW_CTRL_OBEY	BIT(16)
122 #define VSC73XX_FCCONF_PAUSE_VAL_MASK	GENMASK(15, 0)
123 
124 /* ADVPORTM advanced port setup register bits */
125 #define VSC73XX_ADVPORTM_IFG_PPM	BIT(7)
126 #define VSC73XX_ADVPORTM_EXC_COL_CONT	BIT(6)
127 #define VSC73XX_ADVPORTM_EXT_PORT	BIT(5)
128 #define VSC73XX_ADVPORTM_INV_GTX	BIT(4)
129 #define VSC73XX_ADVPORTM_ENA_GTX	BIT(3)
130 #define VSC73XX_ADVPORTM_DDR_MODE	BIT(2)
131 #define VSC73XX_ADVPORTM_IO_LOOPBACK	BIT(1)
132 #define VSC73XX_ADVPORTM_HOST_LOOPBACK	BIT(0)
133 
134 /*  TXUPDCFG transmit modify setup bits */
135 #define VSC73XX_TXUPDCFG_DSCP_REWR_MODE	GENMASK(20, 19)
136 #define VSC73XX_TXUPDCFG_DSCP_REWR_ENA	BIT(18)
137 #define VSC73XX_TXUPDCFG_TX_INT_TO_USRPRIO_ENA	BIT(17)
138 #define VSC73XX_TXUPDCFG_TX_UNTAGGED_VID	GENMASK(15, 4)
139 #define VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_ENA	BIT(3)
140 #define VSC73XX_TXUPDCFG_TX_UPDATE_CRC_CPU_ENA	BIT(1)
141 #define VSC73XX_TXUPDCFG_TX_INSERT_TAG	BIT(0)
142 
143 #define VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_SHIFT	4
144 
145 /* CAT_DROP categorizer frame dropping register bits */
146 #define VSC73XX_CAT_DROP_DROP_MC_SMAC_ENA	BIT(6)
147 #define VSC73XX_CAT_DROP_FWD_CTRL_ENA		BIT(4)
148 #define VSC73XX_CAT_DROP_FWD_PAUSE_ENA		BIT(3)
149 #define VSC73XX_CAT_DROP_UNTAGGED_ENA		BIT(2)
150 #define VSC73XX_CAT_DROP_TAGGED_ENA		BIT(1)
151 #define VSC73XX_CAT_DROP_NULL_MAC_ENA		BIT(0)
152 
153 #define VSC73XX_Q_MISC_CONF_EXTENT_MEM		BIT(31)
154 #define VSC73XX_Q_MISC_CONF_EARLY_TX_MASK	GENMASK(4, 1)
155 #define VSC73XX_Q_MISC_CONF_EARLY_TX_512	(1 << 1)
156 #define VSC73XX_Q_MISC_CONF_MAC_PAUSE_MODE	BIT(0)
157 
158 /* CAT_VLAN_MISC categorizer VLAN miscellaneous bits */
159 #define VSC73XX_CAT_VLAN_MISC_VLAN_TCI_IGNORE_ENA BIT(8)
160 #define VSC73XX_CAT_VLAN_MISC_VLAN_KEEP_TAG_ENA BIT(7)
161 
162 /* CAT_PORT_VLAN categorizer port VLAN */
163 #define VSC73XX_CAT_PORT_VLAN_VLAN_CFI BIT(15)
164 #define VSC73XX_CAT_PORT_VLAN_VLAN_USR_PRIO GENMASK(14, 12)
165 #define VSC73XX_CAT_PORT_VLAN_VLAN_VID GENMASK(11, 0)
166 
167 /* Frame analyzer block 2 registers */
168 #define VSC73XX_STORMLIMIT	0x02
169 #define VSC73XX_ADVLEARN	0x03
170 #define VSC73XX_IFLODMSK	0x04
171 #define VSC73XX_VLANMASK	0x05
172 #define VSC73XX_MACHDATA	0x06
173 #define VSC73XX_MACLDATA	0x07
174 #define VSC73XX_ANMOVED		0x08
175 #define VSC73XX_ANAGEFIL	0x09
176 #define VSC73XX_ANEVENTS	0x0a
177 #define VSC73XX_ANCNTMASK	0x0b
178 #define VSC73XX_ANCNTVAL	0x0c
179 #define VSC73XX_LEARNMASK	0x0d
180 #define VSC73XX_UFLODMASK	0x0e
181 #define VSC73XX_MFLODMASK	0x0f
182 #define VSC73XX_RECVMASK	0x10
183 #define VSC73XX_AGGRCTRL	0x20
184 #define VSC73XX_AGGRMSKS	0x30 /* Until 0x3f */
185 #define VSC73XX_DSTMASKS	0x40 /* Until 0x7f */
186 #define VSC73XX_SRCMASKS	0x80 /* Until 0x87 */
187 #define VSC73XX_CAPENAB		0xa0
188 #define VSC73XX_MACACCESS	0xb0
189 #define VSC73XX_IPMCACCESS	0xb1
190 #define VSC73XX_MACTINDX	0xc0
191 #define VSC73XX_VLANACCESS	0xd0
192 #define VSC73XX_VLANTIDX	0xe0
193 #define VSC73XX_AGENCTRL	0xf0
194 #define VSC73XX_CAPRST		0xff
195 
196 #define VSC73XX_SRCMASKS_CPU_COPY		BIT(27)
197 #define VSC73XX_SRCMASKS_MIRROR			BIT(26)
198 #define VSC73XX_SRCMASKS_PORTS_MASK		GENMASK(7, 0)
199 
200 #define VSC73XX_MACACCESS_CPU_COPY		BIT(14)
201 #define VSC73XX_MACACCESS_FWD_KILL		BIT(13)
202 #define VSC73XX_MACACCESS_IGNORE_VLAN		BIT(12)
203 #define VSC73XX_MACACCESS_AGED_FLAG		BIT(11)
204 #define VSC73XX_MACACCESS_VALID			BIT(10)
205 #define VSC73XX_MACACCESS_LOCKED		BIT(9)
206 #define VSC73XX_MACACCESS_DEST_IDX_MASK		GENMASK(8, 3)
207 #define VSC73XX_MACACCESS_CMD_MASK		GENMASK(2, 0)
208 #define VSC73XX_MACACCESS_CMD_IDLE		0
209 #define VSC73XX_MACACCESS_CMD_LEARN		1
210 #define VSC73XX_MACACCESS_CMD_FORGET		2
211 #define VSC73XX_MACACCESS_CMD_AGE_TABLE		3
212 #define VSC73XX_MACACCESS_CMD_FLUSH_TABLE	4
213 #define VSC73XX_MACACCESS_CMD_CLEAR_TABLE	5
214 #define VSC73XX_MACACCESS_CMD_READ_ENTRY	6
215 #define VSC73XX_MACACCESS_CMD_WRITE_ENTRY	7
216 
217 #define VSC73XX_VLANACCESS_LEARN_DISABLED	BIT(30)
218 #define VSC73XX_VLANACCESS_VLAN_MIRROR		BIT(29)
219 #define VSC73XX_VLANACCESS_VLAN_SRC_CHECK	BIT(28)
220 #define VSC73XX_VLANACCESS_VLAN_PORT_MASK	GENMASK(9, 2)
221 #define VSC73XX_VLANACCESS_VLAN_PORT_MASK_SHIFT	2
222 #define VSC73XX_VLANACCESS_VLAN_TBL_CMD_MASK	GENMASK(1, 0)
223 #define VSC73XX_VLANACCESS_VLAN_TBL_CMD_IDLE	0
224 #define VSC73XX_VLANACCESS_VLAN_TBL_CMD_READ_ENTRY	1
225 #define VSC73XX_VLANACCESS_VLAN_TBL_CMD_WRITE_ENTRY	2
226 #define VSC73XX_VLANACCESS_VLAN_TBL_CMD_CLEAR_TABLE	3
227 
228 /* MII block 3 registers */
229 #define VSC73XX_MII_STAT		0x0
230 #define VSC73XX_MII_CMD			0x1
231 #define VSC73XX_MII_DATA		0x2
232 #define VSC73XX_MII_MPRES		0x3
233 
234 #define VSC73XX_MII_STAT_BUSY		BIT(3)
235 #define VSC73XX_MII_STAT_READ		BIT(2)
236 #define VSC73XX_MII_STAT_WRITE		BIT(1)
237 
238 #define VSC73XX_MII_CMD_SCAN		BIT(27)
239 #define VSC73XX_MII_CMD_OPERATION	BIT(26)
240 #define VSC73XX_MII_CMD_PHY_ADDR	GENMASK(25, 21)
241 #define VSC73XX_MII_CMD_PHY_REG		GENMASK(20, 16)
242 #define VSC73XX_MII_CMD_WRITE_DATA	GENMASK(15, 0)
243 
244 #define VSC73XX_MII_DATA_FAILURE	BIT(16)
245 #define VSC73XX_MII_DATA_READ_DATA	GENMASK(15, 0)
246 
247 #define VSC73XX_MII_MPRES_NOPREAMBLE	BIT(6)
248 #define VSC73XX_MII_MPRES_PRESCALEVAL	GENMASK(5, 0)
249 #define VSC73XX_MII_PRESCALEVAL_MIN	3 /* min allowed mdio clock prescaler */
250 
251 #define VSC73XX_MII_STAT_BUSY	BIT(3)
252 
253 /* Arbiter block 5 registers */
254 #define VSC73XX_ARBEMPTY		0x0c
255 #define VSC73XX_ARBDISC			0x0e
256 #define VSC73XX_SBACKWDROP		0x12
257 #define VSC73XX_DBACKWDROP		0x13
258 #define VSC73XX_ARBBURSTPROB		0x15
259 
260 /* System block 7 registers */
261 #define VSC73XX_ICPU_SIPAD		0x01
262 #define VSC73XX_GMIIDELAY		0x05
263 #define VSC73XX_ICPU_CTRL		0x10
264 #define VSC73XX_ICPU_ADDR		0x11
265 #define VSC73XX_ICPU_SRAM		0x12
266 #define VSC73XX_HWSEM			0x13
267 #define VSC73XX_GLORESET		0x14
268 #define VSC73XX_ICPU_MBOX_VAL		0x15
269 #define VSC73XX_ICPU_MBOX_SET		0x16
270 #define VSC73XX_ICPU_MBOX_CLR		0x17
271 #define VSC73XX_CHIPID			0x18
272 #define VSC73XX_GPIO			0x34
273 
274 #define VSC73XX_GMIIDELAY_GMII0_GTXDELAY_NONE	0
275 #define VSC73XX_GMIIDELAY_GMII0_GTXDELAY_1_4_NS	1
276 #define VSC73XX_GMIIDELAY_GMII0_GTXDELAY_1_7_NS	2
277 #define VSC73XX_GMIIDELAY_GMII0_GTXDELAY_2_0_NS	3
278 
279 #define VSC73XX_GMIIDELAY_GMII0_RXDELAY_NONE	(0 << 4)
280 #define VSC73XX_GMIIDELAY_GMII0_RXDELAY_1_4_NS	(1 << 4)
281 #define VSC73XX_GMIIDELAY_GMII0_RXDELAY_1_7_NS	(2 << 4)
282 #define VSC73XX_GMIIDELAY_GMII0_RXDELAY_2_0_NS	(3 << 4)
283 
284 #define VSC73XX_ICPU_CTRL_WATCHDOG_RST	BIT(31)
285 #define VSC73XX_ICPU_CTRL_CLK_DIV_MASK	GENMASK(12, 8)
286 #define VSC73XX_ICPU_CTRL_SRST_HOLD	BIT(7)
287 #define VSC73XX_ICPU_CTRL_ICPU_PI_EN	BIT(6)
288 #define VSC73XX_ICPU_CTRL_BOOT_EN	BIT(3)
289 #define VSC73XX_ICPU_CTRL_EXT_ACC_EN	BIT(2)
290 #define VSC73XX_ICPU_CTRL_CLK_EN	BIT(1)
291 #define VSC73XX_ICPU_CTRL_SRST		BIT(0)
292 
293 #define VSC73XX_CHIPID_ID_SHIFT		12
294 #define VSC73XX_CHIPID_ID_MASK		0xffff
295 #define VSC73XX_CHIPID_REV_SHIFT	28
296 #define VSC73XX_CHIPID_REV_MASK		0xf
297 #define VSC73XX_CHIPID_ID_7385		0x7385
298 #define VSC73XX_CHIPID_ID_7388		0x7388
299 #define VSC73XX_CHIPID_ID_7395		0x7395
300 #define VSC73XX_CHIPID_ID_7398		0x7398
301 
302 #define VSC73XX_GLORESET_STROBE		BIT(4)
303 #define VSC73XX_GLORESET_ICPU_LOCK	BIT(3)
304 #define VSC73XX_GLORESET_MEM_LOCK	BIT(2)
305 #define VSC73XX_GLORESET_PHY_RESET	BIT(1)
306 #define VSC73XX_GLORESET_MASTER_RESET	BIT(0)
307 
308 #define VSC7385_CLOCK_DELAY		((3 << 4) | 3)
309 #define VSC7385_CLOCK_DELAY_MASK	((3 << 4) | 3)
310 
311 #define VSC73XX_ICPU_CTRL_STOP	(VSC73XX_ICPU_CTRL_SRST_HOLD | \
312 				 VSC73XX_ICPU_CTRL_BOOT_EN | \
313 				 VSC73XX_ICPU_CTRL_EXT_ACC_EN)
314 
315 #define VSC73XX_ICPU_CTRL_START	(VSC73XX_ICPU_CTRL_CLK_DIV | \
316 				 VSC73XX_ICPU_CTRL_BOOT_EN | \
317 				 VSC73XX_ICPU_CTRL_CLK_EN | \
318 				 VSC73XX_ICPU_CTRL_SRST)
319 
320 #define IS_7385(a) ((a)->chipid == VSC73XX_CHIPID_ID_7385)
321 #define IS_7388(a) ((a)->chipid == VSC73XX_CHIPID_ID_7388)
322 #define IS_7395(a) ((a)->chipid == VSC73XX_CHIPID_ID_7395)
323 #define IS_7398(a) ((a)->chipid == VSC73XX_CHIPID_ID_7398)
324 #define IS_739X(a) (IS_7395(a) || IS_7398(a))
325 
326 #define VSC73XX_POLL_SLEEP_US		1000
327 #define VSC73XX_MDIO_POLL_SLEEP_US	5
328 #define VSC73XX_POLL_TIMEOUT_US		10000
329 
330 struct vsc73xx_counter {
331 	u8 counter;
332 	const char *name;
333 };
334 
335 /* Counters are named according to the MIB standards where applicable.
336  * Some counters are custom, non-standard. The standard counters are
337  * named in accordance with RFC2819, RFC2021 and IEEE Std 802.3-2002 Annex
338  * 30A Counters.
339  */
340 static const struct vsc73xx_counter vsc73xx_rx_counters[] = {
341 	{ 0, "RxEtherStatsPkts" },
342 	{ 1, "RxBroadcast+MulticastPkts" }, /* non-standard counter */
343 	{ 2, "RxTotalErrorPackets" }, /* non-standard counter */
344 	{ 3, "RxEtherStatsBroadcastPkts" },
345 	{ 4, "RxEtherStatsMulticastPkts" },
346 	{ 5, "RxEtherStatsPkts64Octets" },
347 	{ 6, "RxEtherStatsPkts65to127Octets" },
348 	{ 7, "RxEtherStatsPkts128to255Octets" },
349 	{ 8, "RxEtherStatsPkts256to511Octets" },
350 	{ 9, "RxEtherStatsPkts512to1023Octets" },
351 	{ 10, "RxEtherStatsPkts1024to1518Octets" },
352 	{ 11, "RxJumboFrames" }, /* non-standard counter */
353 	{ 12, "RxaPauseMACControlFramesTransmitted" },
354 	{ 13, "RxFIFODrops" }, /* non-standard counter */
355 	{ 14, "RxBackwardDrops" }, /* non-standard counter */
356 	{ 15, "RxClassifierDrops" }, /* non-standard counter */
357 	{ 16, "RxEtherStatsCRCAlignErrors" },
358 	{ 17, "RxEtherStatsUndersizePkts" },
359 	{ 18, "RxEtherStatsOversizePkts" },
360 	{ 19, "RxEtherStatsFragments" },
361 	{ 20, "RxEtherStatsJabbers" },
362 	{ 21, "RxaMACControlFramesReceived" },
363 	/* 22-24 are undefined */
364 	{ 25, "RxaFramesReceivedOK" },
365 	{ 26, "RxQoSClass0" }, /* non-standard counter */
366 	{ 27, "RxQoSClass1" }, /* non-standard counter */
367 	{ 28, "RxQoSClass2" }, /* non-standard counter */
368 	{ 29, "RxQoSClass3" }, /* non-standard counter */
369 };
370 
371 static const struct vsc73xx_counter vsc73xx_tx_counters[] = {
372 	{ 0, "TxEtherStatsPkts" },
373 	{ 1, "TxBroadcast+MulticastPkts" }, /* non-standard counter */
374 	{ 2, "TxTotalErrorPackets" }, /* non-standard counter */
375 	{ 3, "TxEtherStatsBroadcastPkts" },
376 	{ 4, "TxEtherStatsMulticastPkts" },
377 	{ 5, "TxEtherStatsPkts64Octets" },
378 	{ 6, "TxEtherStatsPkts65to127Octets" },
379 	{ 7, "TxEtherStatsPkts128to255Octets" },
380 	{ 8, "TxEtherStatsPkts256to511Octets" },
381 	{ 9, "TxEtherStatsPkts512to1023Octets" },
382 	{ 10, "TxEtherStatsPkts1024to1518Octets" },
383 	{ 11, "TxJumboFrames" }, /* non-standard counter */
384 	{ 12, "TxaPauseMACControlFramesTransmitted" },
385 	{ 13, "TxFIFODrops" }, /* non-standard counter */
386 	{ 14, "TxDrops" }, /* non-standard counter */
387 	{ 15, "TxEtherStatsCollisions" },
388 	{ 16, "TxEtherStatsCRCAlignErrors" },
389 	{ 17, "TxEtherStatsUndersizePkts" },
390 	{ 18, "TxEtherStatsOversizePkts" },
391 	{ 19, "TxEtherStatsFragments" },
392 	{ 20, "TxEtherStatsJabbers" },
393 	/* 21-24 are undefined */
394 	{ 25, "TxaFramesReceivedOK" },
395 	{ 26, "TxQoSClass0" }, /* non-standard counter */
396 	{ 27, "TxQoSClass1" }, /* non-standard counter */
397 	{ 28, "TxQoSClass2" }, /* non-standard counter */
398 	{ 29, "TxQoSClass3" }, /* non-standard counter */
399 };
400 
401 struct vsc73xx_vlan_summary {
402 	size_t num_tagged;
403 	size_t num_untagged;
404 };
405 
406 enum vsc73xx_port_vlan_conf {
407 	VSC73XX_VLAN_FILTER,
408 	VSC73XX_VLAN_FILTER_UNTAG_ALL,
409 	VSC73XX_VLAN_IGNORE,
410 };
411 
412 int vsc73xx_is_addr_valid(u8 block, u8 subblock)
413 {
414 	switch (block) {
415 	case VSC73XX_BLOCK_MAC:
416 		switch (subblock) {
417 		case 0 ... 4:
418 		case 6:
419 			return 1;
420 		}
421 		break;
422 
423 	case VSC73XX_BLOCK_ANALYZER:
424 	case VSC73XX_BLOCK_SYSTEM:
425 		switch (subblock) {
426 		case 0:
427 			return 1;
428 		}
429 		break;
430 
431 	case VSC73XX_BLOCK_MII:
432 	case VSC73XX_BLOCK_CAPTURE:
433 	case VSC73XX_BLOCK_ARBITER:
434 		switch (subblock) {
435 		case 0 ... 1:
436 			return 1;
437 		}
438 		break;
439 	}
440 
441 	return 0;
442 }
443 EXPORT_SYMBOL(vsc73xx_is_addr_valid);
444 
445 static int vsc73xx_read(struct vsc73xx *vsc, u8 block, u8 subblock, u8 reg,
446 			u32 *val)
447 {
448 	return vsc->ops->read(vsc, block, subblock, reg, val);
449 }
450 
451 static int vsc73xx_write(struct vsc73xx *vsc, u8 block, u8 subblock, u8 reg,
452 			 u32 val)
453 {
454 	return vsc->ops->write(vsc, block, subblock, reg, val);
455 }
456 
457 static int vsc73xx_update_bits(struct vsc73xx *vsc, u8 block, u8 subblock,
458 			       u8 reg, u32 mask, u32 val)
459 {
460 	u32 tmp, orig;
461 	int ret;
462 
463 	/* Same read-modify-write algorithm as e.g. regmap */
464 	ret = vsc73xx_read(vsc, block, subblock, reg, &orig);
465 	if (ret)
466 		return ret;
467 	tmp = orig & ~mask;
468 	tmp |= val & mask;
469 	return vsc73xx_write(vsc, block, subblock, reg, tmp);
470 }
471 
472 static int vsc73xx_detect(struct vsc73xx *vsc)
473 {
474 	bool icpu_si_boot_en;
475 	bool icpu_pi_en;
476 	u32 val;
477 	u32 rev;
478 	int ret;
479 	u32 id;
480 
481 	ret = vsc73xx_read(vsc, VSC73XX_BLOCK_SYSTEM, 0,
482 			   VSC73XX_ICPU_MBOX_VAL, &val);
483 	if (ret) {
484 		dev_err(vsc->dev, "unable to read mailbox (%d)\n", ret);
485 		return ret;
486 	}
487 
488 	if (val == 0xffffffff) {
489 		dev_info(vsc->dev, "chip seems dead.\n");
490 		return -EAGAIN;
491 	}
492 
493 	ret = vsc73xx_read(vsc, VSC73XX_BLOCK_SYSTEM, 0,
494 			   VSC73XX_CHIPID, &val);
495 	if (ret) {
496 		dev_err(vsc->dev, "unable to read chip id (%d)\n", ret);
497 		return ret;
498 	}
499 
500 	id = (val >> VSC73XX_CHIPID_ID_SHIFT) &
501 		VSC73XX_CHIPID_ID_MASK;
502 	switch (id) {
503 	case VSC73XX_CHIPID_ID_7385:
504 	case VSC73XX_CHIPID_ID_7388:
505 	case VSC73XX_CHIPID_ID_7395:
506 	case VSC73XX_CHIPID_ID_7398:
507 		break;
508 	default:
509 		dev_err(vsc->dev, "unsupported chip, id=%04x\n", id);
510 		return -ENODEV;
511 	}
512 
513 	vsc->chipid = id;
514 	rev = (val >> VSC73XX_CHIPID_REV_SHIFT) &
515 		VSC73XX_CHIPID_REV_MASK;
516 	dev_info(vsc->dev, "VSC%04X (rev: %d) switch found\n", id, rev);
517 
518 	ret = vsc73xx_read(vsc, VSC73XX_BLOCK_SYSTEM, 0,
519 			   VSC73XX_ICPU_CTRL, &val);
520 	if (ret) {
521 		dev_err(vsc->dev, "unable to read iCPU control\n");
522 		return ret;
523 	}
524 
525 	/* The iCPU can always be used but can boot in different ways.
526 	 * If it is initially disabled and has no external memory,
527 	 * we are in control and can do whatever we like, else we
528 	 * are probably in trouble (we need some way to communicate
529 	 * with the running firmware) so we bail out for now.
530 	 */
531 	icpu_pi_en = !!(val & VSC73XX_ICPU_CTRL_ICPU_PI_EN);
532 	icpu_si_boot_en = !!(val & VSC73XX_ICPU_CTRL_BOOT_EN);
533 	if (icpu_si_boot_en && icpu_pi_en) {
534 		dev_err(vsc->dev,
535 			"iCPU enabled boots from SI, has external memory\n");
536 		dev_err(vsc->dev, "no idea how to deal with this\n");
537 		return -ENODEV;
538 	}
539 	if (icpu_si_boot_en && !icpu_pi_en) {
540 		dev_err(vsc->dev,
541 			"iCPU enabled boots from PI/SI, no external memory\n");
542 		return -EAGAIN;
543 	}
544 	if (!icpu_si_boot_en && icpu_pi_en) {
545 		dev_err(vsc->dev,
546 			"iCPU enabled, boots from PI external memory\n");
547 		dev_err(vsc->dev, "no idea how to deal with this\n");
548 		return -ENODEV;
549 	}
550 	/* !icpu_si_boot_en && !cpu_pi_en */
551 	dev_info(vsc->dev, "iCPU disabled, no external memory\n");
552 
553 	return 0;
554 }
555 
556 static int vsc73xx_mdio_busy_check(struct vsc73xx *vsc)
557 {
558 	int ret, err;
559 	u32 val;
560 
561 	ret = read_poll_timeout(vsc73xx_read, err,
562 				err < 0 || !(val & VSC73XX_MII_STAT_BUSY),
563 				VSC73XX_MDIO_POLL_SLEEP_US,
564 				VSC73XX_POLL_TIMEOUT_US, false, vsc,
565 				VSC73XX_BLOCK_MII, VSC73XX_BLOCK_MII_INTERNAL,
566 				VSC73XX_MII_STAT, &val);
567 	if (ret)
568 		return ret;
569 	return err;
570 }
571 
572 static int vsc73xx_phy_read(struct dsa_switch *ds, int phy, int regnum)
573 {
574 	struct vsc73xx *vsc = ds->priv;
575 	u32 cmd;
576 	u32 val;
577 	int ret;
578 
579 	ret = vsc73xx_mdio_busy_check(vsc);
580 	if (ret)
581 		return ret;
582 
583 	/* Setting bit 26 means "read" */
584 	cmd = VSC73XX_MII_CMD_OPERATION |
585 	      FIELD_PREP(VSC73XX_MII_CMD_PHY_ADDR, phy) |
586 	      FIELD_PREP(VSC73XX_MII_CMD_PHY_REG, regnum);
587 	ret = vsc73xx_write(vsc, VSC73XX_BLOCK_MII, VSC73XX_BLOCK_MII_INTERNAL,
588 			    VSC73XX_MII_CMD, cmd);
589 	if (ret)
590 		return ret;
591 
592 	ret = vsc73xx_mdio_busy_check(vsc);
593 	if (ret)
594 		return ret;
595 
596 	ret = vsc73xx_read(vsc, VSC73XX_BLOCK_MII, VSC73XX_BLOCK_MII_INTERNAL,
597 			   VSC73XX_MII_DATA, &val);
598 	if (ret)
599 		return ret;
600 	if (val & VSC73XX_MII_DATA_FAILURE) {
601 		dev_err(vsc->dev, "reading reg %02x from phy%d failed\n",
602 			regnum, phy);
603 		return -EIO;
604 	}
605 	val &= VSC73XX_MII_DATA_READ_DATA;
606 
607 	dev_dbg(vsc->dev, "read reg %02x from phy%d = %04x\n",
608 		regnum, phy, val);
609 
610 	return val;
611 }
612 
613 static int vsc73xx_phy_write(struct dsa_switch *ds, int phy, int regnum,
614 			     u16 val)
615 {
616 	struct vsc73xx *vsc = ds->priv;
617 	u32 cmd;
618 	int ret;
619 
620 	ret = vsc73xx_mdio_busy_check(vsc);
621 	if (ret)
622 		return ret;
623 
624 	cmd = FIELD_PREP(VSC73XX_MII_CMD_PHY_ADDR, phy) |
625 	      FIELD_PREP(VSC73XX_MII_CMD_PHY_REG, regnum) |
626 	      FIELD_PREP(VSC73XX_MII_CMD_WRITE_DATA, val);
627 	ret = vsc73xx_write(vsc, VSC73XX_BLOCK_MII, VSC73XX_BLOCK_MII_INTERNAL,
628 			    VSC73XX_MII_CMD, cmd);
629 	if (ret)
630 		return ret;
631 
632 	dev_dbg(vsc->dev, "write %04x to reg %02x in phy%d\n",
633 		val, regnum, phy);
634 	return 0;
635 }
636 
637 static enum dsa_tag_protocol vsc73xx_get_tag_protocol(struct dsa_switch *ds,
638 						      int port,
639 						      enum dsa_tag_protocol mp)
640 {
641 	/* The switch internally uses a 8 byte header with length,
642 	 * source port, tag, LPA and priority. This is supposedly
643 	 * only accessible when operating the switch using the internal
644 	 * CPU or with an external CPU mapping the device in, but not
645 	 * when operating the switch over SPI and putting frames in/out
646 	 * on port 6 (the CPU port). So far we must assume that we
647 	 * cannot access the tag. (See "Internal frame header" section
648 	 * 3.9.1 in the manual.)
649 	 */
650 	return DSA_TAG_PROTO_VSC73XX_8021Q;
651 }
652 
653 static int vsc73xx_wait_for_vlan_table_cmd(struct vsc73xx *vsc)
654 {
655 	int ret, err;
656 	u32 val;
657 
658 	ret = read_poll_timeout(vsc73xx_read, err,
659 				err < 0 ||
660 				((val & VSC73XX_VLANACCESS_VLAN_TBL_CMD_MASK) ==
661 				VSC73XX_VLANACCESS_VLAN_TBL_CMD_IDLE),
662 				VSC73XX_POLL_SLEEP_US, VSC73XX_POLL_TIMEOUT_US,
663 				false, vsc, VSC73XX_BLOCK_ANALYZER,
664 				0, VSC73XX_VLANACCESS, &val);
665 	if (ret)
666 		return ret;
667 	return err;
668 }
669 
670 static int
671 vsc73xx_read_vlan_table_entry(struct vsc73xx *vsc, u16 vid, u8 *portmap)
672 {
673 	u32 val;
674 	int ret;
675 
676 	vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANTIDX, vid);
677 
678 	ret = vsc73xx_wait_for_vlan_table_cmd(vsc);
679 	if (ret)
680 		return ret;
681 
682 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANACCESS,
683 			    VSC73XX_VLANACCESS_VLAN_TBL_CMD_MASK,
684 			    VSC73XX_VLANACCESS_VLAN_TBL_CMD_READ_ENTRY);
685 
686 	ret = vsc73xx_wait_for_vlan_table_cmd(vsc);
687 	if (ret)
688 		return ret;
689 
690 	vsc73xx_read(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANACCESS, &val);
691 	*portmap = (val & VSC73XX_VLANACCESS_VLAN_PORT_MASK) >>
692 		   VSC73XX_VLANACCESS_VLAN_PORT_MASK_SHIFT;
693 
694 	return 0;
695 }
696 
697 static int
698 vsc73xx_write_vlan_table_entry(struct vsc73xx *vsc, u16 vid, u8 portmap)
699 {
700 	int ret;
701 
702 	vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANTIDX, vid);
703 
704 	ret = vsc73xx_wait_for_vlan_table_cmd(vsc);
705 	if (ret)
706 		return ret;
707 
708 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANACCESS,
709 			    VSC73XX_VLANACCESS_VLAN_TBL_CMD_MASK |
710 			    VSC73XX_VLANACCESS_VLAN_SRC_CHECK |
711 			    VSC73XX_VLANACCESS_VLAN_PORT_MASK,
712 			    VSC73XX_VLANACCESS_VLAN_TBL_CMD_WRITE_ENTRY |
713 			    VSC73XX_VLANACCESS_VLAN_SRC_CHECK |
714 			    (portmap << VSC73XX_VLANACCESS_VLAN_PORT_MASK_SHIFT));
715 
716 	return vsc73xx_wait_for_vlan_table_cmd(vsc);
717 }
718 
719 static int
720 vsc73xx_update_vlan_table(struct vsc73xx *vsc, int port, u16 vid, bool set)
721 {
722 	u8 portmap;
723 	int ret;
724 
725 	ret = vsc73xx_read_vlan_table_entry(vsc, vid, &portmap);
726 	if (ret)
727 		return ret;
728 
729 	if (set)
730 		portmap |= BIT(port);
731 	else
732 		portmap &= ~BIT(port);
733 
734 	return vsc73xx_write_vlan_table_entry(vsc, vid, portmap);
735 }
736 
737 static int vsc73xx_configure_rgmii_port_delay(struct dsa_switch *ds)
738 {
739 	/* Keep 2.0 ns delay for backward complatibility */
740 	u32 tx_delay = VSC73XX_GMIIDELAY_GMII0_GTXDELAY_2_0_NS;
741 	u32 rx_delay = VSC73XX_GMIIDELAY_GMII0_RXDELAY_2_0_NS;
742 	struct dsa_port *dp = dsa_to_port(ds, CPU_PORT);
743 	struct device_node *port_dn = dp->dn;
744 	struct vsc73xx *vsc = ds->priv;
745 	u32 delay;
746 
747 	if (!of_property_read_u32(port_dn, "tx-internal-delay-ps", &delay)) {
748 		switch (delay) {
749 		case 0:
750 			tx_delay = VSC73XX_GMIIDELAY_GMII0_GTXDELAY_NONE;
751 			break;
752 		case 1400:
753 			tx_delay = VSC73XX_GMIIDELAY_GMII0_GTXDELAY_1_4_NS;
754 			break;
755 		case 1700:
756 			tx_delay = VSC73XX_GMIIDELAY_GMII0_GTXDELAY_1_7_NS;
757 			break;
758 		case 2000:
759 			break;
760 		default:
761 			dev_err(vsc->dev,
762 				"Unsupported RGMII Transmit Clock Delay\n");
763 			return -EINVAL;
764 		}
765 	} else {
766 		dev_dbg(vsc->dev,
767 			"RGMII Transmit Clock Delay isn't configured, set to 2.0 ns\n");
768 	}
769 
770 	if (!of_property_read_u32(port_dn, "rx-internal-delay-ps", &delay)) {
771 		switch (delay) {
772 		case 0:
773 			rx_delay = VSC73XX_GMIIDELAY_GMII0_RXDELAY_NONE;
774 			break;
775 		case 1400:
776 			rx_delay = VSC73XX_GMIIDELAY_GMII0_RXDELAY_1_4_NS;
777 			break;
778 		case 1700:
779 			rx_delay = VSC73XX_GMIIDELAY_GMII0_RXDELAY_1_7_NS;
780 			break;
781 		case 2000:
782 			break;
783 		default:
784 			dev_err(vsc->dev,
785 				"Unsupported RGMII Receive Clock Delay value\n");
786 			return -EINVAL;
787 		}
788 	} else {
789 		dev_dbg(vsc->dev,
790 			"RGMII Receive Clock Delay isn't configured, set to 2.0 ns\n");
791 	}
792 
793 	/* MII delay, set both GTX and RX delay */
794 	return vsc73xx_write(vsc, VSC73XX_BLOCK_SYSTEM, 0, VSC73XX_GMIIDELAY,
795 			     tx_delay | rx_delay);
796 }
797 
798 static int vsc73xx_setup(struct dsa_switch *ds)
799 {
800 	struct vsc73xx *vsc = ds->priv;
801 	int i, ret, val;
802 
803 	dev_info(vsc->dev, "set up the switch\n");
804 
805 	ds->untag_bridge_pvid = true;
806 	ds->max_num_bridges = DSA_TAG_8021Q_MAX_NUM_BRIDGES;
807 
808 	/* Issue RESET */
809 	vsc73xx_write(vsc, VSC73XX_BLOCK_SYSTEM, 0, VSC73XX_GLORESET,
810 		      VSC73XX_GLORESET_MASTER_RESET);
811 	usleep_range(125, 200);
812 
813 	/* Initialize memory, initialize RAM bank 0..15 except 6 and 7
814 	 * This sequence appears in the
815 	 * VSC7385 SparX-G5 datasheet section 6.6.1
816 	 * VSC7395 SparX-G5e datasheet section 6.6.1
817 	 * "initialization sequence".
818 	 * No explanation is given to the 0x1010400 magic number.
819 	 */
820 	for (i = 0; i <= 15; i++) {
821 		if (i != 6 && i != 7) {
822 			vsc73xx_write(vsc, VSC73XX_BLOCK_MEMINIT,
823 				      2,
824 				      0, 0x1010400 + i);
825 			mdelay(1);
826 		}
827 	}
828 	mdelay(30);
829 
830 	/* Clear MAC table */
831 	vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0,
832 		      VSC73XX_MACACCESS,
833 		      VSC73XX_MACACCESS_CMD_CLEAR_TABLE);
834 
835 	/* Set VLAN table to default values */
836 	vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0,
837 		      VSC73XX_VLANACCESS,
838 		      VSC73XX_VLANACCESS_VLAN_TBL_CMD_CLEAR_TABLE);
839 
840 	msleep(40);
841 
842 	/* Use 20KiB buffers on all ports on VSC7395
843 	 * The VSC7385 has 16KiB buffers and that is the
844 	 * default if we don't set this up explicitly.
845 	 * Port "31" is "all ports".
846 	 */
847 	if (IS_739X(vsc))
848 		vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, 0x1f,
849 			      VSC73XX_Q_MISC_CONF,
850 			      VSC73XX_Q_MISC_CONF_EXTENT_MEM);
851 
852 	/* Put all ports into reset until enabled */
853 	for (i = 0; i < 7; i++) {
854 		if (i == 5)
855 			continue;
856 		vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, 4,
857 			      VSC73XX_MAC_CFG, VSC73XX_MAC_CFG_RESET);
858 	}
859 
860 	/* Configure RGMII delay */
861 	ret = vsc73xx_configure_rgmii_port_delay(ds);
862 	if (ret)
863 		return ret;
864 
865 	/* Ingess VLAN reception mask (table 145) */
866 	vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANMASK,
867 		      0xff);
868 	/* IP multicast flood mask (table 144) */
869 	vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_IFLODMSK,
870 		      0xff);
871 
872 	mdelay(50);
873 
874 	/* Disable preamble and use maximum allowed clock for the internal
875 	 * mdio bus, used for communication with internal PHYs only.
876 	 */
877 	val = VSC73XX_MII_MPRES_NOPREAMBLE |
878 	      FIELD_PREP(VSC73XX_MII_MPRES_PRESCALEVAL,
879 			 VSC73XX_MII_PRESCALEVAL_MIN);
880 	vsc73xx_write(vsc, VSC73XX_BLOCK_MII, VSC73XX_BLOCK_MII_INTERNAL,
881 		      VSC73XX_MII_MPRES, val);
882 
883 	/* Release reset from the internal PHYs */
884 	vsc73xx_write(vsc, VSC73XX_BLOCK_SYSTEM, 0, VSC73XX_GLORESET,
885 		      VSC73XX_GLORESET_PHY_RESET);
886 
887 	udelay(4);
888 
889 	/* Clear VLAN table */
890 	for (i = 0; i < VLAN_N_VID; i++)
891 		vsc73xx_write_vlan_table_entry(vsc, i, 0);
892 
893 	INIT_LIST_HEAD(&vsc->vlans);
894 
895 	rtnl_lock();
896 	ret = dsa_tag_8021q_register(ds, htons(ETH_P_8021Q));
897 	rtnl_unlock();
898 
899 	return ret;
900 }
901 
902 static void vsc73xx_teardown(struct dsa_switch *ds)
903 {
904 	rtnl_lock();
905 	dsa_tag_8021q_unregister(ds);
906 	rtnl_unlock();
907 }
908 
909 static void vsc73xx_init_port(struct vsc73xx *vsc, int port)
910 {
911 	u32 val;
912 
913 	/* MAC configure, first reset the port and then write defaults */
914 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC,
915 		      port,
916 		      VSC73XX_MAC_CFG,
917 		      VSC73XX_MAC_CFG_RESET);
918 
919 	/* Take up the port in 1Gbit mode by default, this will be
920 	 * augmented after auto-negotiation on the PHY-facing
921 	 * ports.
922 	 */
923 	if (port == CPU_PORT)
924 		val = VSC73XX_MAC_CFG_1000M_F_RGMII;
925 	else
926 		val = VSC73XX_MAC_CFG_1000M_F_PHY;
927 
928 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC,
929 		      port,
930 		      VSC73XX_MAC_CFG,
931 		      val |
932 		      VSC73XX_MAC_CFG_TX_EN |
933 		      VSC73XX_MAC_CFG_RX_EN);
934 
935 	/* Flow control for the CPU port:
936 	 * Use a zero delay pause frame when pause condition is left
937 	 * Obey pause control frames
938 	 */
939 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC,
940 		      port,
941 		      VSC73XX_FCCONF,
942 		      VSC73XX_FCCONF_ZERO_PAUSE_EN |
943 		      VSC73XX_FCCONF_FLOW_CTRL_OBEY);
944 
945 	/* Issue pause control frames on PHY facing ports.
946 	 * Allow early initiation of MAC transmission if the amount
947 	 * of egress data is below 512 bytes on CPU port.
948 	 * FIXME: enable 20KiB buffers?
949 	 */
950 	if (port == CPU_PORT)
951 		val = VSC73XX_Q_MISC_CONF_EARLY_TX_512;
952 	else
953 		val = VSC73XX_Q_MISC_CONF_MAC_PAUSE_MODE;
954 	val |= VSC73XX_Q_MISC_CONF_EXTENT_MEM;
955 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC,
956 		      port,
957 		      VSC73XX_Q_MISC_CONF,
958 		      val);
959 
960 	/* Flow control MAC: a MAC address used in flow control frames */
961 	val = (vsc->addr[5] << 16) | (vsc->addr[4] << 8) | (vsc->addr[3]);
962 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC,
963 		      port,
964 		      VSC73XX_FCMACHI,
965 		      val);
966 	val = (vsc->addr[2] << 16) | (vsc->addr[1] << 8) | (vsc->addr[0]);
967 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC,
968 		      port,
969 		      VSC73XX_FCMACLO,
970 		      val);
971 
972 	/* Tell the categorizer to forward pause frames, not control
973 	 * frame. Do not drop anything.
974 	 */
975 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC,
976 		      port,
977 		      VSC73XX_CAT_DROP,
978 		      VSC73XX_CAT_DROP_FWD_PAUSE_ENA);
979 
980 	/* Clear all counters */
981 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC,
982 		      port, VSC73XX_C_RX0, 0);
983 }
984 
985 static void vsc73xx_reset_port(struct vsc73xx *vsc, int port, u32 initval)
986 {
987 	int ret, err;
988 	u32 val;
989 
990 	/* Disable RX on this port */
991 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port,
992 			    VSC73XX_MAC_CFG,
993 			    VSC73XX_MAC_CFG_RX_EN, 0);
994 
995 	/* Discard packets */
996 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0,
997 			    VSC73XX_ARBDISC, BIT(port), BIT(port));
998 
999 	/* Wait until queue is empty */
1000 	ret = read_poll_timeout(vsc73xx_read, err,
1001 				err < 0 || (val & BIT(port)),
1002 				VSC73XX_POLL_SLEEP_US,
1003 				VSC73XX_POLL_TIMEOUT_US, false,
1004 				vsc, VSC73XX_BLOCK_ARBITER, 0,
1005 				VSC73XX_ARBEMPTY, &val);
1006 	if (ret)
1007 		dev_err(vsc->dev,
1008 			"timeout waiting for block arbiter\n");
1009 	else if (err < 0)
1010 		dev_err(vsc->dev, "error reading arbiter\n");
1011 
1012 	/* Put this port into reset */
1013 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG,
1014 		      VSC73XX_MAC_CFG_RESET | initval);
1015 }
1016 
1017 static void vsc73xx_mac_config(struct phylink_config *config, unsigned int mode,
1018 			       const struct phylink_link_state *state)
1019 {
1020 	struct dsa_port *dp = dsa_phylink_to_port(config);
1021 	struct vsc73xx *vsc = dp->ds->priv;
1022 	int port = dp->index;
1023 
1024 	/* Special handling of the CPU-facing port */
1025 	if (port == CPU_PORT) {
1026 		/* Other ports are already initialized but not this one */
1027 		vsc73xx_init_port(vsc, CPU_PORT);
1028 		/* Select the external port for this interface (EXT_PORT)
1029 		 * Enable the GMII GTX external clock
1030 		 * Use double data rate (DDR mode)
1031 		 */
1032 		vsc73xx_write(vsc, VSC73XX_BLOCK_MAC,
1033 			      CPU_PORT,
1034 			      VSC73XX_ADVPORTM,
1035 			      VSC73XX_ADVPORTM_EXT_PORT |
1036 			      VSC73XX_ADVPORTM_ENA_GTX |
1037 			      VSC73XX_ADVPORTM_DDR_MODE);
1038 	}
1039 }
1040 
1041 static void vsc73xx_mac_link_down(struct phylink_config *config,
1042 				  unsigned int mode, phy_interface_t interface)
1043 {
1044 	struct dsa_port *dp = dsa_phylink_to_port(config);
1045 	struct vsc73xx *vsc = dp->ds->priv;
1046 	int port = dp->index;
1047 
1048 	/* This routine is described in the datasheet (below ARBDISC register
1049 	 * description)
1050 	 */
1051 	vsc73xx_reset_port(vsc, port, 0);
1052 
1053 	/* Allow backward dropping of frames from this port */
1054 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0,
1055 			    VSC73XX_SBACKWDROP, BIT(port), BIT(port));
1056 }
1057 
1058 static void vsc73xx_mac_link_up(struct phylink_config *config,
1059 				struct phy_device *phy, unsigned int mode,
1060 				phy_interface_t interface, int speed,
1061 				int duplex, bool tx_pause, bool rx_pause)
1062 {
1063 	struct dsa_port *dp = dsa_phylink_to_port(config);
1064 	struct vsc73xx *vsc = dp->ds->priv;
1065 	int port = dp->index;
1066 	u32 val;
1067 	u8 seed;
1068 
1069 	if (speed == SPEED_1000)
1070 		val = VSC73XX_MAC_CFG_GIGA_MODE | VSC73XX_MAC_CFG_TX_IPG_1000M;
1071 	else
1072 		val = VSC73XX_MAC_CFG_TX_IPG_100_10M;
1073 
1074 	if (phy_interface_mode_is_rgmii(interface))
1075 		val |= VSC73XX_MAC_CFG_CLK_SEL_1000M;
1076 	else
1077 		val |= VSC73XX_MAC_CFG_CLK_SEL_EXT;
1078 
1079 	if (duplex == DUPLEX_FULL)
1080 		val |= VSC73XX_MAC_CFG_FDX;
1081 	else
1082 		/* In datasheet description ("Port Mode Procedure" in 5.6.2)
1083 		 * this bit is configured only for half duplex.
1084 		 */
1085 		val |= VSC73XX_MAC_CFG_WEXC_DIS;
1086 
1087 	/* This routine is described in the datasheet (below ARBDISC register
1088 	 * description)
1089 	 */
1090 	vsc73xx_reset_port(vsc, port, val);
1091 
1092 	/* Seed the port randomness with randomness */
1093 	get_random_bytes(&seed, 1);
1094 	val |= seed << VSC73XX_MAC_CFG_SEED_OFFSET;
1095 	val |= VSC73XX_MAC_CFG_SEED_LOAD;
1096 
1097 	/* Those bits are responsible for MTU only. Kernel takes care about MTU,
1098 	 * let's enable +8 bytes frame length unconditionally.
1099 	 */
1100 	val |= VSC73XX_MAC_CFG_VLAN_AWR | VSC73XX_MAC_CFG_VLAN_DBLAWR;
1101 
1102 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG, val);
1103 
1104 	/* Flow control for the PHY facing ports:
1105 	 * Use a zero delay pause frame when pause condition is left
1106 	 * Obey pause control frames
1107 	 * When generating pause frames, use 0xff as pause value
1108 	 */
1109 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_FCCONF,
1110 		      VSC73XX_FCCONF_ZERO_PAUSE_EN |
1111 		      VSC73XX_FCCONF_FLOW_CTRL_OBEY |
1112 		      0xff);
1113 
1114 	/* Accept packets again */
1115 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0,
1116 			    VSC73XX_ARBDISC, BIT(port), 0);
1117 
1118 	/* Disallow backward dropping of frames from this port */
1119 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0,
1120 			    VSC73XX_SBACKWDROP, BIT(port), 0);
1121 
1122 	/* Enable TX, RX, deassert reset, stop loading seed */
1123 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port,
1124 			    VSC73XX_MAC_CFG,
1125 			    VSC73XX_MAC_CFG_RESET | VSC73XX_MAC_CFG_SEED_LOAD |
1126 			    VSC73XX_MAC_CFG_TX_EN | VSC73XX_MAC_CFG_RX_EN,
1127 			    VSC73XX_MAC_CFG_TX_EN | VSC73XX_MAC_CFG_RX_EN);
1128 }
1129 
1130 static bool vsc73xx_tag_8021q_active(struct dsa_port *dp)
1131 {
1132 	return !dsa_port_is_vlan_filtering(dp);
1133 }
1134 
1135 static struct vsc73xx_bridge_vlan *
1136 vsc73xx_bridge_vlan_find(struct vsc73xx *vsc, u16 vid)
1137 {
1138 	struct vsc73xx_bridge_vlan *vlan;
1139 
1140 	list_for_each_entry(vlan, &vsc->vlans, list)
1141 		if (vlan->vid == vid)
1142 			return vlan;
1143 
1144 	return NULL;
1145 }
1146 
1147 static void
1148 vsc73xx_bridge_vlan_remove_port(struct vsc73xx_bridge_vlan *vsc73xx_vlan,
1149 				int port)
1150 {
1151 	vsc73xx_vlan->portmask &= ~BIT(port);
1152 
1153 	if (vsc73xx_vlan->portmask)
1154 		return;
1155 
1156 	list_del(&vsc73xx_vlan->list);
1157 	kfree(vsc73xx_vlan);
1158 }
1159 
1160 static void vsc73xx_bridge_vlan_summary(struct vsc73xx *vsc, int port,
1161 					struct vsc73xx_vlan_summary *summary,
1162 					u16 ignored_vid)
1163 {
1164 	size_t num_tagged = 0, num_untagged = 0;
1165 	struct vsc73xx_bridge_vlan *vlan;
1166 
1167 	list_for_each_entry(vlan, &vsc->vlans, list) {
1168 		if (!(vlan->portmask & BIT(port)) || vlan->vid == ignored_vid)
1169 			continue;
1170 
1171 		if (vlan->untagged & BIT(port))
1172 			num_untagged++;
1173 		else
1174 			num_tagged++;
1175 	}
1176 
1177 	summary->num_untagged = num_untagged;
1178 	summary->num_tagged = num_tagged;
1179 }
1180 
1181 static u16 vsc73xx_find_first_vlan_untagged(struct vsc73xx *vsc, int port)
1182 {
1183 	struct vsc73xx_bridge_vlan *vlan;
1184 
1185 	list_for_each_entry(vlan, &vsc->vlans, list)
1186 		if ((vlan->portmask & BIT(port)) &&
1187 		    (vlan->untagged & BIT(port)))
1188 			return vlan->vid;
1189 
1190 	return VLAN_N_VID;
1191 }
1192 
1193 static int vsc73xx_set_vlan_conf(struct vsc73xx *vsc, int port,
1194 				 enum vsc73xx_port_vlan_conf port_vlan_conf)
1195 {
1196 	u32 val = 0;
1197 	int ret;
1198 
1199 	if (port_vlan_conf == VSC73XX_VLAN_IGNORE)
1200 		val = VSC73XX_CAT_VLAN_MISC_VLAN_TCI_IGNORE_ENA |
1201 		      VSC73XX_CAT_VLAN_MISC_VLAN_KEEP_TAG_ENA;
1202 
1203 	ret = vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port,
1204 				  VSC73XX_CAT_VLAN_MISC,
1205 				  VSC73XX_CAT_VLAN_MISC_VLAN_TCI_IGNORE_ENA |
1206 				  VSC73XX_CAT_VLAN_MISC_VLAN_KEEP_TAG_ENA, val);
1207 	if (ret)
1208 		return ret;
1209 
1210 	val = (port_vlan_conf == VSC73XX_VLAN_FILTER) ?
1211 	      VSC73XX_TXUPDCFG_TX_INSERT_TAG : 0;
1212 
1213 	return vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port,
1214 				   VSC73XX_TXUPDCFG,
1215 				   VSC73XX_TXUPDCFG_TX_INSERT_TAG, val);
1216 }
1217 
1218 /**
1219  * vsc73xx_vlan_commit_conf - Update VLAN configuration of a port
1220  * @vsc: Switch private data structure
1221  * @port: Port index on which to operate
1222  *
1223  * Update the VLAN behavior of a port to make sure that when it is under
1224  * a VLAN filtering bridge, the port is either filtering with tag
1225  * preservation, or filtering with all VLANs egress-untagged. Otherwise,
1226  * the port ignores VLAN tags from packets and applies the port-based
1227  * VID.
1228  *
1229  * Must be called when changes are made to:
1230  * - the bridge VLAN filtering state of the port
1231  * - the number or attributes of VLANs from the bridge VLAN table,
1232  *   while the port is currently VLAN-aware
1233  *
1234  * Return: 0 on success, or negative errno on error.
1235  */
1236 static int vsc73xx_vlan_commit_conf(struct vsc73xx *vsc, int port)
1237 {
1238 	enum vsc73xx_port_vlan_conf port_vlan_conf = VSC73XX_VLAN_IGNORE;
1239 	struct dsa_port *dp = dsa_to_port(vsc->ds, port);
1240 
1241 	if (port == CPU_PORT) {
1242 		port_vlan_conf = VSC73XX_VLAN_FILTER;
1243 	} else if (dsa_port_is_vlan_filtering(dp)) {
1244 		struct vsc73xx_vlan_summary summary;
1245 
1246 		port_vlan_conf = VSC73XX_VLAN_FILTER;
1247 
1248 		vsc73xx_bridge_vlan_summary(vsc, port, &summary, VLAN_N_VID);
1249 		if (summary.num_tagged == 0)
1250 			port_vlan_conf = VSC73XX_VLAN_FILTER_UNTAG_ALL;
1251 	}
1252 
1253 	return vsc73xx_set_vlan_conf(vsc, port, port_vlan_conf);
1254 }
1255 
1256 static int
1257 vsc73xx_vlan_change_untagged(struct vsc73xx *vsc, int port, u16 vid, bool set)
1258 {
1259 	u32 val = 0;
1260 
1261 	if (set)
1262 		val = VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_ENA |
1263 		      ((vid << VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_SHIFT) &
1264 		       VSC73XX_TXUPDCFG_TX_UNTAGGED_VID);
1265 
1266 	return vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port,
1267 				   VSC73XX_TXUPDCFG,
1268 				   VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_ENA |
1269 				   VSC73XX_TXUPDCFG_TX_UNTAGGED_VID, val);
1270 }
1271 
1272 /**
1273  * vsc73xx_vlan_commit_untagged - Update native VLAN of a port
1274  * @vsc: Switch private data structure
1275  * @port: Port index on which to operate
1276  *
1277  * Update the native VLAN of a port (the one VLAN which is transmitted
1278  * as egress-tagged on a trunk port) when port is in VLAN filtering mode and
1279  * only one untagged vid is configured.
1280  * In other cases no need to configure it because switch can untag all vlans on
1281  * the port.
1282  *
1283  * Return: 0 on success, or negative errno on error.
1284  */
1285 static int vsc73xx_vlan_commit_untagged(struct vsc73xx *vsc, int port)
1286 {
1287 	struct dsa_port *dp = dsa_to_port(vsc->ds, port);
1288 	struct vsc73xx_vlan_summary summary;
1289 	u16 vid = 0;
1290 	bool valid;
1291 
1292 	if (!dsa_port_is_vlan_filtering(dp))
1293 		/* Port is configured to untag all vlans in that case.
1294 		 * No need to commit untagged config change.
1295 		 */
1296 		return 0;
1297 
1298 	vsc73xx_bridge_vlan_summary(vsc, port, &summary, VLAN_N_VID);
1299 
1300 	if (summary.num_untagged > 1)
1301 		/* Port must untag all vlans in that case.
1302 		 * No need to commit untagged config change.
1303 		 */
1304 		return 0;
1305 
1306 	valid = (summary.num_untagged == 1);
1307 	if (valid)
1308 		vid = vsc73xx_find_first_vlan_untagged(vsc, port);
1309 
1310 	return vsc73xx_vlan_change_untagged(vsc, port, vid, valid);
1311 }
1312 
1313 static int
1314 vsc73xx_vlan_change_pvid(struct vsc73xx *vsc, int port, u16 vid, bool set)
1315 {
1316 	u32 val = 0;
1317 	int ret;
1318 
1319 	val = set ? 0 : VSC73XX_CAT_DROP_UNTAGGED_ENA;
1320 
1321 	ret = vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port,
1322 				  VSC73XX_CAT_DROP,
1323 				  VSC73XX_CAT_DROP_UNTAGGED_ENA, val);
1324 	if (!set || ret)
1325 		return ret;
1326 
1327 	return vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port,
1328 				   VSC73XX_CAT_PORT_VLAN,
1329 				   VSC73XX_CAT_PORT_VLAN_VLAN_VID,
1330 				   vid & VSC73XX_CAT_PORT_VLAN_VLAN_VID);
1331 }
1332 
1333 /**
1334  * vsc73xx_vlan_commit_pvid - Update port-based default VLAN of a port
1335  * @vsc: Switch private data structure
1336  * @port: Port index on which to operate
1337  *
1338  * Update the PVID of a port so that it follows either the bridge PVID
1339  * configuration, when the bridge is currently VLAN-aware, or the PVID
1340  * from tag_8021q, when the port is standalone or under a VLAN-unaware
1341  * bridge. A port with no PVID drops all untagged and VID 0 tagged
1342  * traffic.
1343  *
1344  * Must be called when changes are made to:
1345  * - the bridge VLAN filtering state of the port
1346  * - the number or attributes of VLANs from the bridge VLAN table,
1347  *   while the port is currently VLAN-aware
1348  *
1349  * Return: 0 on success, or negative errno on error.
1350  */
1351 static int vsc73xx_vlan_commit_pvid(struct vsc73xx *vsc, int port)
1352 {
1353 	struct vsc73xx_portinfo *portinfo = &vsc->portinfo[port];
1354 	bool valid = portinfo->pvid_tag_8021q_configured;
1355 	struct dsa_port *dp = dsa_to_port(vsc->ds, port);
1356 	u16 vid = portinfo->pvid_tag_8021q;
1357 
1358 	if (dsa_port_is_vlan_filtering(dp)) {
1359 		vid = portinfo->pvid_vlan_filtering;
1360 		valid = portinfo->pvid_vlan_filtering_configured;
1361 	}
1362 
1363 	return vsc73xx_vlan_change_pvid(vsc, port, vid, valid);
1364 }
1365 
1366 static int vsc73xx_vlan_commit_settings(struct vsc73xx *vsc, int port)
1367 {
1368 	int ret;
1369 
1370 	ret = vsc73xx_vlan_commit_untagged(vsc, port);
1371 	if (ret)
1372 		return ret;
1373 
1374 	ret = vsc73xx_vlan_commit_pvid(vsc, port);
1375 	if (ret)
1376 		return ret;
1377 
1378 	return vsc73xx_vlan_commit_conf(vsc, port);
1379 }
1380 
1381 static int vsc73xx_port_enable(struct dsa_switch *ds, int port,
1382 			       struct phy_device *phy)
1383 {
1384 	struct vsc73xx *vsc = ds->priv;
1385 
1386 	dev_info(vsc->dev, "enable port %d\n", port);
1387 	vsc73xx_init_port(vsc, port);
1388 
1389 	return vsc73xx_vlan_commit_settings(vsc, port);
1390 }
1391 
1392 static void vsc73xx_port_disable(struct dsa_switch *ds, int port)
1393 {
1394 	struct vsc73xx *vsc = ds->priv;
1395 
1396 	/* Just put the port into reset */
1397 	vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port,
1398 		      VSC73XX_MAC_CFG, VSC73XX_MAC_CFG_RESET);
1399 }
1400 
1401 static const struct vsc73xx_counter *
1402 vsc73xx_find_counter(struct vsc73xx *vsc,
1403 		     u8 counter,
1404 		     bool tx)
1405 {
1406 	const struct vsc73xx_counter *cnts;
1407 	int num_cnts;
1408 	int i;
1409 
1410 	if (tx) {
1411 		cnts = vsc73xx_tx_counters;
1412 		num_cnts = ARRAY_SIZE(vsc73xx_tx_counters);
1413 	} else {
1414 		cnts = vsc73xx_rx_counters;
1415 		num_cnts = ARRAY_SIZE(vsc73xx_rx_counters);
1416 	}
1417 
1418 	for (i = 0; i < num_cnts; i++) {
1419 		const struct vsc73xx_counter *cnt;
1420 
1421 		cnt = &cnts[i];
1422 		if (cnt->counter == counter)
1423 			return cnt;
1424 	}
1425 
1426 	return NULL;
1427 }
1428 
1429 static void vsc73xx_get_strings(struct dsa_switch *ds, int port, u32 stringset,
1430 				uint8_t *data)
1431 {
1432 	const struct vsc73xx_counter *cnt;
1433 	struct vsc73xx *vsc = ds->priv;
1434 	u8 indices[6];
1435 	u8 *buf = data;
1436 	int i;
1437 	u32 val;
1438 	int ret;
1439 
1440 	if (stringset != ETH_SS_STATS)
1441 		return;
1442 
1443 	ret = vsc73xx_read(vsc, VSC73XX_BLOCK_MAC, port,
1444 			   VSC73XX_C_CFG, &val);
1445 	if (ret)
1446 		return;
1447 
1448 	indices[0] = (val & 0x1f); /* RX counter 0 */
1449 	indices[1] = ((val >> 5) & 0x1f); /* RX counter 1 */
1450 	indices[2] = ((val >> 10) & 0x1f); /* RX counter 2 */
1451 	indices[3] = ((val >> 16) & 0x1f); /* TX counter 0 */
1452 	indices[4] = ((val >> 21) & 0x1f); /* TX counter 1 */
1453 	indices[5] = ((val >> 26) & 0x1f); /* TX counter 2 */
1454 
1455 	/* The first counters is the RX octets */
1456 	ethtool_puts(&buf, "RxEtherStatsOctets");
1457 
1458 	/* Each port supports recording 3 RX counters and 3 TX counters,
1459 	 * figure out what counters we use in this set-up and return the
1460 	 * names of them. The hardware default counters will be number of
1461 	 * packets on RX/TX, combined broadcast+multicast packets RX/TX and
1462 	 * total error packets RX/TX.
1463 	 */
1464 	for (i = 0; i < 3; i++) {
1465 		cnt = vsc73xx_find_counter(vsc, indices[i], false);
1466 		ethtool_puts(&buf, cnt ? cnt->name : "");
1467 	}
1468 
1469 	/* TX stats begins with the number of TX octets */
1470 	ethtool_puts(&buf, "TxEtherStatsOctets");
1471 
1472 	for (i = 3; i < 6; i++) {
1473 		cnt = vsc73xx_find_counter(vsc, indices[i], true);
1474 		ethtool_puts(&buf, cnt ? cnt->name : "");
1475 
1476 	}
1477 }
1478 
1479 static int vsc73xx_get_sset_count(struct dsa_switch *ds, int port, int sset)
1480 {
1481 	/* We only support SS_STATS */
1482 	if (sset != ETH_SS_STATS)
1483 		return 0;
1484 	/* RX and TX packets, then 3 RX counters, 3 TX counters */
1485 	return 8;
1486 }
1487 
1488 static void vsc73xx_get_ethtool_stats(struct dsa_switch *ds, int port,
1489 				      uint64_t *data)
1490 {
1491 	struct vsc73xx *vsc = ds->priv;
1492 	u8 regs[] = {
1493 		VSC73XX_RXOCT,
1494 		VSC73XX_C_RX0,
1495 		VSC73XX_C_RX1,
1496 		VSC73XX_C_RX2,
1497 		VSC73XX_TXOCT,
1498 		VSC73XX_C_TX0,
1499 		VSC73XX_C_TX1,
1500 		VSC73XX_C_TX2,
1501 	};
1502 	u32 val;
1503 	int ret;
1504 	int i;
1505 
1506 	for (i = 0; i < ARRAY_SIZE(regs); i++) {
1507 		ret = vsc73xx_read(vsc, VSC73XX_BLOCK_MAC, port,
1508 				   regs[i], &val);
1509 		if (ret) {
1510 			dev_err(vsc->dev, "error reading counter %d\n", i);
1511 			return;
1512 		}
1513 		data[i] = val;
1514 	}
1515 }
1516 
1517 static int vsc73xx_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
1518 {
1519 	struct vsc73xx *vsc = ds->priv;
1520 
1521 	return vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port,
1522 			     VSC73XX_MAXLEN, new_mtu + ETH_HLEN + ETH_FCS_LEN);
1523 }
1524 
1525 /* According to application not "VSC7398 Jumbo Frames" setting
1526  * up the frame size to 9.6 KB does not affect the performance on standard
1527  * frames. It is clear from the application note that
1528  * "9.6 kilobytes" == 9600 bytes.
1529  */
1530 static int vsc73xx_get_max_mtu(struct dsa_switch *ds, int port)
1531 {
1532 	return 9600 - ETH_HLEN - ETH_FCS_LEN;
1533 }
1534 
1535 static void vsc73xx_phylink_get_caps(struct dsa_switch *dsa, int port,
1536 				     struct phylink_config *config)
1537 {
1538 	unsigned long *interfaces = config->supported_interfaces;
1539 
1540 	if (port == 5)
1541 		return;
1542 
1543 	if (port == CPU_PORT) {
1544 		__set_bit(PHY_INTERFACE_MODE_MII, interfaces);
1545 		__set_bit(PHY_INTERFACE_MODE_REVMII, interfaces);
1546 		__set_bit(PHY_INTERFACE_MODE_GMII, interfaces);
1547 		__set_bit(PHY_INTERFACE_MODE_RGMII, interfaces);
1548 	}
1549 
1550 	if (port <= 4) {
1551 		/* Internal PHYs */
1552 		__set_bit(PHY_INTERFACE_MODE_INTERNAL, interfaces);
1553 		/* phylib default */
1554 		__set_bit(PHY_INTERFACE_MODE_GMII, interfaces);
1555 	}
1556 
1557 	config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | MAC_1000;
1558 }
1559 
1560 static int
1561 vsc73xx_port_vlan_filtering(struct dsa_switch *ds, int port,
1562 			    bool vlan_filtering, struct netlink_ext_ack *extack)
1563 {
1564 	struct vsc73xx *vsc = ds->priv;
1565 
1566 	/* The commit to hardware processed below is required because vsc73xx
1567 	 * is using tag_8021q. When vlan_filtering is disabled, tag_8021q uses
1568 	 * pvid/untagged vlans for port recognition. The values configured for
1569 	 * vlans and pvid/untagged states are stored in portinfo structure.
1570 	 * When vlan_filtering is enabled, we need to restore pvid/untagged from
1571 	 * portinfo structure. Analogous routine is processed when
1572 	 * vlan_filtering is disabled, but values used for tag_8021q are
1573 	 * restored.
1574 	 */
1575 
1576 	return vsc73xx_vlan_commit_settings(vsc, port);
1577 }
1578 
1579 static int vsc73xx_port_vlan_add(struct dsa_switch *ds, int port,
1580 				 const struct switchdev_obj_port_vlan *vlan,
1581 				 struct netlink_ext_ack *extack)
1582 {
1583 	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1584 	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
1585 	struct dsa_port *dp = dsa_to_port(ds, port);
1586 	struct vsc73xx_bridge_vlan *vsc73xx_vlan;
1587 	struct vsc73xx_vlan_summary summary;
1588 	struct vsc73xx_portinfo *portinfo;
1589 	struct vsc73xx *vsc = ds->priv;
1590 	bool commit_to_hardware;
1591 	int ret = 0;
1592 
1593 	/* Be sure to deny alterations to the configuration done by tag_8021q.
1594 	 */
1595 	if (vid_is_dsa_8021q(vlan->vid)) {
1596 		NL_SET_ERR_MSG_MOD(extack,
1597 				   "Range 3072-4095 reserved for dsa_8021q operation");
1598 		return -EBUSY;
1599 	}
1600 
1601 	/* The processed vlan->vid is excluded from the search because the VLAN
1602 	 * can be re-added with a different set of flags, so it's easiest to
1603 	 * ignore its old flags from the VLAN database software copy.
1604 	 */
1605 	vsc73xx_bridge_vlan_summary(vsc, port, &summary, vlan->vid);
1606 
1607 	/* VSC73XX allows only three untagged states: none, one or all */
1608 	if ((untagged && summary.num_tagged > 0 && summary.num_untagged > 0) ||
1609 	    (!untagged && summary.num_untagged > 1)) {
1610 		NL_SET_ERR_MSG_MOD(extack,
1611 				   "Port can have only none, one or all untagged vlan");
1612 		return -EBUSY;
1613 	}
1614 
1615 	vsc73xx_vlan = vsc73xx_bridge_vlan_find(vsc, vlan->vid);
1616 
1617 	if (!vsc73xx_vlan) {
1618 		vsc73xx_vlan = kzalloc(sizeof(*vsc73xx_vlan), GFP_KERNEL);
1619 		if (!vsc73xx_vlan)
1620 			return -ENOMEM;
1621 
1622 		vsc73xx_vlan->vid = vlan->vid;
1623 
1624 		list_add_tail(&vsc73xx_vlan->list, &vsc->vlans);
1625 	}
1626 
1627 	vsc73xx_vlan->portmask |= BIT(port);
1628 
1629 	/* CPU port must be always tagged because source port identification is
1630 	 * based on tag_8021q.
1631 	 */
1632 	if (port == CPU_PORT)
1633 		goto update_vlan_table;
1634 
1635 	if (untagged)
1636 		vsc73xx_vlan->untagged |= BIT(port);
1637 	else
1638 		vsc73xx_vlan->untagged &= ~BIT(port);
1639 
1640 	portinfo = &vsc->portinfo[port];
1641 
1642 	if (pvid) {
1643 		portinfo->pvid_vlan_filtering_configured = true;
1644 		portinfo->pvid_vlan_filtering = vlan->vid;
1645 	} else if (portinfo->pvid_vlan_filtering_configured &&
1646 		   portinfo->pvid_vlan_filtering == vlan->vid) {
1647 		portinfo->pvid_vlan_filtering_configured = false;
1648 	}
1649 
1650 	commit_to_hardware = !vsc73xx_tag_8021q_active(dp);
1651 	if (commit_to_hardware) {
1652 		ret = vsc73xx_vlan_commit_settings(vsc, port);
1653 		if (ret)
1654 			goto err;
1655 	}
1656 
1657 update_vlan_table:
1658 	ret = vsc73xx_update_vlan_table(vsc, port, vlan->vid, true);
1659 	if (!ret)
1660 		return 0;
1661 err:
1662 	vsc73xx_bridge_vlan_remove_port(vsc73xx_vlan, port);
1663 	return ret;
1664 }
1665 
1666 static int vsc73xx_port_vlan_del(struct dsa_switch *ds, int port,
1667 				 const struct switchdev_obj_port_vlan *vlan)
1668 {
1669 	struct vsc73xx_bridge_vlan *vsc73xx_vlan;
1670 	struct vsc73xx_portinfo *portinfo;
1671 	struct vsc73xx *vsc = ds->priv;
1672 	bool commit_to_hardware;
1673 	int ret;
1674 
1675 	ret = vsc73xx_update_vlan_table(vsc, port, vlan->vid, false);
1676 	if (ret)
1677 		return ret;
1678 
1679 	portinfo = &vsc->portinfo[port];
1680 
1681 	if (portinfo->pvid_vlan_filtering_configured &&
1682 	    portinfo->pvid_vlan_filtering == vlan->vid)
1683 		portinfo->pvid_vlan_filtering_configured = false;
1684 
1685 	vsc73xx_vlan = vsc73xx_bridge_vlan_find(vsc, vlan->vid);
1686 
1687 	if (vsc73xx_vlan)
1688 		vsc73xx_bridge_vlan_remove_port(vsc73xx_vlan, port);
1689 
1690 	commit_to_hardware = !vsc73xx_tag_8021q_active(dsa_to_port(ds, port));
1691 
1692 	if (commit_to_hardware)
1693 		return vsc73xx_vlan_commit_settings(vsc, port);
1694 
1695 	return 0;
1696 }
1697 
1698 static int vsc73xx_tag_8021q_vlan_add(struct dsa_switch *ds, int port, u16 vid,
1699 				      u16 flags)
1700 {
1701 	bool pvid = flags & BRIDGE_VLAN_INFO_PVID;
1702 	struct vsc73xx_portinfo *portinfo;
1703 	struct vsc73xx *vsc = ds->priv;
1704 	bool commit_to_hardware;
1705 	int ret;
1706 
1707 	portinfo = &vsc->portinfo[port];
1708 
1709 	if (pvid) {
1710 		portinfo->pvid_tag_8021q_configured = true;
1711 		portinfo->pvid_tag_8021q = vid;
1712 	}
1713 
1714 	commit_to_hardware = vsc73xx_tag_8021q_active(dsa_to_port(ds, port));
1715 	if (commit_to_hardware) {
1716 		ret = vsc73xx_vlan_commit_settings(vsc, port);
1717 		if (ret)
1718 			return ret;
1719 	}
1720 
1721 	return vsc73xx_update_vlan_table(vsc, port, vid, true);
1722 }
1723 
1724 static int vsc73xx_tag_8021q_vlan_del(struct dsa_switch *ds, int port, u16 vid)
1725 {
1726 	struct vsc73xx_portinfo *portinfo;
1727 	struct vsc73xx *vsc = ds->priv;
1728 
1729 	portinfo = &vsc->portinfo[port];
1730 
1731 	if (portinfo->pvid_tag_8021q_configured &&
1732 	    portinfo->pvid_tag_8021q == vid) {
1733 		struct dsa_port *dp = dsa_to_port(ds, port);
1734 		bool commit_to_hardware;
1735 		int err;
1736 
1737 		portinfo->pvid_tag_8021q_configured = false;
1738 
1739 		commit_to_hardware = vsc73xx_tag_8021q_active(dp);
1740 		if (commit_to_hardware) {
1741 			err = vsc73xx_vlan_commit_settings(vsc, port);
1742 			if (err)
1743 				return err;
1744 		}
1745 	}
1746 
1747 	return vsc73xx_update_vlan_table(vsc, port, vid, false);
1748 }
1749 
1750 static int vsc73xx_port_pre_bridge_flags(struct dsa_switch *ds, int port,
1751 					 struct switchdev_brport_flags flags,
1752 					 struct netlink_ext_ack *extack)
1753 {
1754 	if (flags.mask & ~BR_LEARNING)
1755 		return -EINVAL;
1756 
1757 	return 0;
1758 }
1759 
1760 static int vsc73xx_port_bridge_flags(struct dsa_switch *ds, int port,
1761 				     struct switchdev_brport_flags flags,
1762 				     struct netlink_ext_ack *extack)
1763 {
1764 	if (flags.mask & BR_LEARNING) {
1765 		u32 val = flags.val & BR_LEARNING ? BIT(port) : 0;
1766 		struct vsc73xx *vsc = ds->priv;
1767 
1768 		return vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0,
1769 					   VSC73XX_LEARNMASK, BIT(port), val);
1770 	}
1771 
1772 	return 0;
1773 }
1774 
1775 static void vsc73xx_refresh_fwd_map(struct dsa_switch *ds, int port, u8 state)
1776 {
1777 	struct dsa_port *other_dp, *dp = dsa_to_port(ds, port);
1778 	struct vsc73xx *vsc = ds->priv;
1779 	u16 mask;
1780 
1781 	if (state != BR_STATE_FORWARDING) {
1782 		/* Ports that aren't in the forwarding state must not
1783 		 * forward packets anywhere.
1784 		 */
1785 		vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0,
1786 				    VSC73XX_SRCMASKS + port,
1787 				    VSC73XX_SRCMASKS_PORTS_MASK, 0);
1788 
1789 		dsa_switch_for_each_available_port(other_dp, ds) {
1790 			if (other_dp == dp)
1791 				continue;
1792 			vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0,
1793 					    VSC73XX_SRCMASKS + other_dp->index,
1794 					    BIT(port), 0);
1795 		}
1796 
1797 		return;
1798 	}
1799 
1800 	/* Forwarding ports must forward to the CPU and to other ports
1801 	 * in the same bridge
1802 	 */
1803 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0,
1804 			    VSC73XX_SRCMASKS + CPU_PORT, BIT(port), BIT(port));
1805 
1806 	mask = BIT(CPU_PORT);
1807 
1808 	dsa_switch_for_each_user_port(other_dp, ds) {
1809 		int other_port = other_dp->index;
1810 
1811 		if (port == other_port || !dsa_port_bridge_same(dp, other_dp) ||
1812 		    other_dp->stp_state != BR_STATE_FORWARDING)
1813 			continue;
1814 
1815 		mask |= BIT(other_port);
1816 
1817 		vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0,
1818 				    VSC73XX_SRCMASKS + other_port,
1819 				    BIT(port), BIT(port));
1820 	}
1821 
1822 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0,
1823 			    VSC73XX_SRCMASKS + port,
1824 			    VSC73XX_SRCMASKS_PORTS_MASK, mask);
1825 }
1826 
1827 /* FIXME: STP frames aren't forwarded at this moment. BPDU frames are
1828  * forwarded only from and to PI/SI interface. For more info see chapter
1829  * 2.7.1 (CPU Forwarding) in datasheet.
1830  * This function is required for tag_8021q operations.
1831  */
1832 static void vsc73xx_port_stp_state_set(struct dsa_switch *ds, int port,
1833 				       u8 state)
1834 {
1835 	struct dsa_port *dp = dsa_to_port(ds, port);
1836 	struct vsc73xx *vsc = ds->priv;
1837 	u32 val = 0;
1838 
1839 	if (state == BR_STATE_LEARNING || state == BR_STATE_FORWARDING)
1840 		val = dp->learning ? BIT(port) : 0;
1841 
1842 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0,
1843 			    VSC73XX_LEARNMASK, BIT(port), val);
1844 
1845 	val = (state == BR_STATE_BLOCKING || state == BR_STATE_DISABLED) ?
1846 	      0 : BIT(port);
1847 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0,
1848 			    VSC73XX_RECVMASK, BIT(port), val);
1849 
1850 	/* CPU Port should always forward packets when user ports are forwarding
1851 	 * so let's configure it from other ports only.
1852 	 */
1853 	if (port != CPU_PORT)
1854 		vsc73xx_refresh_fwd_map(ds, port, state);
1855 }
1856 
1857 static const struct phylink_mac_ops vsc73xx_phylink_mac_ops = {
1858 	.mac_config = vsc73xx_mac_config,
1859 	.mac_link_down = vsc73xx_mac_link_down,
1860 	.mac_link_up = vsc73xx_mac_link_up,
1861 };
1862 
1863 static const struct dsa_switch_ops vsc73xx_ds_ops = {
1864 	.get_tag_protocol = vsc73xx_get_tag_protocol,
1865 	.setup = vsc73xx_setup,
1866 	.teardown = vsc73xx_teardown,
1867 	.phy_read = vsc73xx_phy_read,
1868 	.phy_write = vsc73xx_phy_write,
1869 	.get_strings = vsc73xx_get_strings,
1870 	.get_ethtool_stats = vsc73xx_get_ethtool_stats,
1871 	.get_sset_count = vsc73xx_get_sset_count,
1872 	.port_enable = vsc73xx_port_enable,
1873 	.port_disable = vsc73xx_port_disable,
1874 	.port_pre_bridge_flags = vsc73xx_port_pre_bridge_flags,
1875 	.port_bridge_flags = vsc73xx_port_bridge_flags,
1876 	.port_bridge_join = dsa_tag_8021q_bridge_join,
1877 	.port_bridge_leave = dsa_tag_8021q_bridge_leave,
1878 	.port_change_mtu = vsc73xx_change_mtu,
1879 	.port_max_mtu = vsc73xx_get_max_mtu,
1880 	.port_stp_state_set = vsc73xx_port_stp_state_set,
1881 	.port_vlan_filtering = vsc73xx_port_vlan_filtering,
1882 	.port_vlan_add = vsc73xx_port_vlan_add,
1883 	.port_vlan_del = vsc73xx_port_vlan_del,
1884 	.phylink_get_caps = vsc73xx_phylink_get_caps,
1885 	.tag_8021q_vlan_add = vsc73xx_tag_8021q_vlan_add,
1886 	.tag_8021q_vlan_del = vsc73xx_tag_8021q_vlan_del,
1887 };
1888 
1889 static int vsc73xx_gpio_get(struct gpio_chip *chip, unsigned int offset)
1890 {
1891 	struct vsc73xx *vsc = gpiochip_get_data(chip);
1892 	u32 val;
1893 	int ret;
1894 
1895 	ret = vsc73xx_read(vsc, VSC73XX_BLOCK_SYSTEM, 0,
1896 			   VSC73XX_GPIO, &val);
1897 	if (ret)
1898 		return ret;
1899 
1900 	return !!(val & BIT(offset));
1901 }
1902 
1903 static void vsc73xx_gpio_set(struct gpio_chip *chip, unsigned int offset,
1904 			     int val)
1905 {
1906 	struct vsc73xx *vsc = gpiochip_get_data(chip);
1907 	u32 tmp = val ? BIT(offset) : 0;
1908 
1909 	vsc73xx_update_bits(vsc, VSC73XX_BLOCK_SYSTEM, 0,
1910 			    VSC73XX_GPIO, BIT(offset), tmp);
1911 }
1912 
1913 static int vsc73xx_gpio_direction_output(struct gpio_chip *chip,
1914 					 unsigned int offset, int val)
1915 {
1916 	struct vsc73xx *vsc = gpiochip_get_data(chip);
1917 	u32 tmp = val ? BIT(offset) : 0;
1918 
1919 	return vsc73xx_update_bits(vsc, VSC73XX_BLOCK_SYSTEM, 0,
1920 				   VSC73XX_GPIO, BIT(offset + 4) | BIT(offset),
1921 				   BIT(offset + 4) | tmp);
1922 }
1923 
1924 static int vsc73xx_gpio_direction_input(struct gpio_chip *chip,
1925 					unsigned int offset)
1926 {
1927 	struct vsc73xx *vsc = gpiochip_get_data(chip);
1928 
1929 	return  vsc73xx_update_bits(vsc, VSC73XX_BLOCK_SYSTEM, 0,
1930 				    VSC73XX_GPIO, BIT(offset + 4),
1931 				    0);
1932 }
1933 
1934 static int vsc73xx_gpio_get_direction(struct gpio_chip *chip,
1935 				      unsigned int offset)
1936 {
1937 	struct vsc73xx *vsc = gpiochip_get_data(chip);
1938 	u32 val;
1939 	int ret;
1940 
1941 	ret = vsc73xx_read(vsc, VSC73XX_BLOCK_SYSTEM, 0,
1942 			   VSC73XX_GPIO, &val);
1943 	if (ret)
1944 		return ret;
1945 
1946 	return !(val & BIT(offset + 4));
1947 }
1948 
1949 static int vsc73xx_gpio_probe(struct vsc73xx *vsc)
1950 {
1951 	int ret;
1952 
1953 	vsc->gc.label = devm_kasprintf(vsc->dev, GFP_KERNEL, "VSC%04x",
1954 				       vsc->chipid);
1955 	if (!vsc->gc.label)
1956 		return -ENOMEM;
1957 	vsc->gc.ngpio = 4;
1958 	vsc->gc.owner = THIS_MODULE;
1959 	vsc->gc.parent = vsc->dev;
1960 	vsc->gc.base = -1;
1961 	vsc->gc.get = vsc73xx_gpio_get;
1962 	vsc->gc.set = vsc73xx_gpio_set;
1963 	vsc->gc.direction_input = vsc73xx_gpio_direction_input;
1964 	vsc->gc.direction_output = vsc73xx_gpio_direction_output;
1965 	vsc->gc.get_direction = vsc73xx_gpio_get_direction;
1966 	vsc->gc.can_sleep = true;
1967 	ret = devm_gpiochip_add_data(vsc->dev, &vsc->gc, vsc);
1968 	if (ret) {
1969 		dev_err(vsc->dev, "unable to register GPIO chip\n");
1970 		return ret;
1971 	}
1972 	return 0;
1973 }
1974 
1975 int vsc73xx_probe(struct vsc73xx *vsc)
1976 {
1977 	struct device *dev = vsc->dev;
1978 	int ret;
1979 
1980 	/* Release reset, if any */
1981 	vsc->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
1982 	if (IS_ERR(vsc->reset)) {
1983 		dev_err(dev, "failed to get RESET GPIO\n");
1984 		return PTR_ERR(vsc->reset);
1985 	}
1986 	if (vsc->reset)
1987 		/* Wait 20ms according to datasheet table 245 */
1988 		msleep(20);
1989 
1990 	ret = vsc73xx_detect(vsc);
1991 	if (ret == -EAGAIN) {
1992 		dev_err(vsc->dev,
1993 			"Chip seems to be out of control. Assert reset and try again.\n");
1994 		gpiod_set_value_cansleep(vsc->reset, 1);
1995 		/* Reset pulse should be 20ns minimum, according to datasheet
1996 		 * table 245, so 10us should be fine
1997 		 */
1998 		usleep_range(10, 100);
1999 		gpiod_set_value_cansleep(vsc->reset, 0);
2000 		/* Wait 20ms according to datasheet table 245 */
2001 		msleep(20);
2002 		ret = vsc73xx_detect(vsc);
2003 	}
2004 	if (ret) {
2005 		dev_err(dev, "no chip found (%d)\n", ret);
2006 		return -ENODEV;
2007 	}
2008 
2009 	eth_random_addr(vsc->addr);
2010 	dev_info(vsc->dev,
2011 		 "MAC for control frames: %02X:%02X:%02X:%02X:%02X:%02X\n",
2012 		 vsc->addr[0], vsc->addr[1], vsc->addr[2],
2013 		 vsc->addr[3], vsc->addr[4], vsc->addr[5]);
2014 
2015 	vsc->ds = devm_kzalloc(dev, sizeof(*vsc->ds), GFP_KERNEL);
2016 	if (!vsc->ds)
2017 		return -ENOMEM;
2018 
2019 	vsc->ds->dev = dev;
2020 	vsc->ds->num_ports = VSC73XX_MAX_NUM_PORTS;
2021 	vsc->ds->priv = vsc;
2022 
2023 	vsc->ds->ops = &vsc73xx_ds_ops;
2024 	vsc->ds->phylink_mac_ops = &vsc73xx_phylink_mac_ops;
2025 	ret = dsa_register_switch(vsc->ds);
2026 	if (ret) {
2027 		dev_err(dev, "unable to register switch (%d)\n", ret);
2028 		return ret;
2029 	}
2030 
2031 	ret = vsc73xx_gpio_probe(vsc);
2032 	if (ret) {
2033 		dsa_unregister_switch(vsc->ds);
2034 		return ret;
2035 	}
2036 
2037 	return 0;
2038 }
2039 EXPORT_SYMBOL(vsc73xx_probe);
2040 
2041 void vsc73xx_remove(struct vsc73xx *vsc)
2042 {
2043 	dsa_unregister_switch(vsc->ds);
2044 	gpiod_set_value(vsc->reset, 1);
2045 }
2046 EXPORT_SYMBOL(vsc73xx_remove);
2047 
2048 void vsc73xx_shutdown(struct vsc73xx *vsc)
2049 {
2050 	dsa_switch_shutdown(vsc->ds);
2051 }
2052 EXPORT_SYMBOL(vsc73xx_shutdown);
2053 
2054 MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");
2055 MODULE_DESCRIPTION("Vitesse VSC7385/7388/7395/7398 driver");
2056 MODULE_LICENSE("GPL v2");
2057