1// SPDX-License-Identifier: GPL-2.0
2/* Realtek SMI subdriver for the Realtek RTL8366RB ethernet switch
3 *
4 * This is a sparsely documented chip, the only viable documentation seems
5 * to be a patched up code drop from the vendor that appear in various
6 * GPL source trees.
7 *
8 * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org>
9 * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
10 * Copyright (C) 2010 Antti Seppälä <a.seppala@gmail.com>
11 * Copyright (C) 2010 Roman Yeryomin <roman@advem.lv>
12 * Copyright (C) 2011 Colin Leitner <colin.leitner@googlemail.com>
13 */
14
15#include <linux/bitops.h>
16#include <linux/etherdevice.h>
17#include <linux/interrupt.h>
18#include <linux/irqdomain.h>
19#include <linux/irqchip/chained_irq.h>
20#include <linux/of_irq.h>
21#include <linux/regmap.h>
22
23#include "realtek-smi-core.h"
24
25#define RTL8366RB_PORT_NUM_CPU		5
26#define RTL8366RB_NUM_PORTS		6
27#define RTL8366RB_PHY_NO_MAX		4
28#define RTL8366RB_PHY_ADDR_MAX		31
29
30/* Switch Global Configuration register */
31#define RTL8366RB_SGCR				0x0000
32#define RTL8366RB_SGCR_EN_BC_STORM_CTRL		BIT(0)
33#define RTL8366RB_SGCR_MAX_LENGTH(a)		((a) << 4)
34#define RTL8366RB_SGCR_MAX_LENGTH_MASK		RTL8366RB_SGCR_MAX_LENGTH(0x3)
35#define RTL8366RB_SGCR_MAX_LENGTH_1522		RTL8366RB_SGCR_MAX_LENGTH(0x0)
36#define RTL8366RB_SGCR_MAX_LENGTH_1536		RTL8366RB_SGCR_MAX_LENGTH(0x1)
37#define RTL8366RB_SGCR_MAX_LENGTH_1552		RTL8366RB_SGCR_MAX_LENGTH(0x2)
38#define RTL8366RB_SGCR_MAX_LENGTH_16000		RTL8366RB_SGCR_MAX_LENGTH(0x3)
39#define RTL8366RB_SGCR_EN_VLAN			BIT(13)
40#define RTL8366RB_SGCR_EN_VLAN_4KTB		BIT(14)
41
42/* Port Enable Control register */
43#define RTL8366RB_PECR				0x0001
44
45/* Switch Security Control registers */
46#define RTL8366RB_SSCR0				0x0002
47#define RTL8366RB_SSCR1				0x0003
48#define RTL8366RB_SSCR2				0x0004
49#define RTL8366RB_SSCR2_DROP_UNKNOWN_DA		BIT(0)
50
51/* Port Mode Control registers */
52#define RTL8366RB_PMC0				0x0005
53#define RTL8366RB_PMC0_SPI			BIT(0)
54#define RTL8366RB_PMC0_EN_AUTOLOAD		BIT(1)
55#define RTL8366RB_PMC0_PROBE			BIT(2)
56#define RTL8366RB_PMC0_DIS_BISR			BIT(3)
57#define RTL8366RB_PMC0_ADCTEST			BIT(4)
58#define RTL8366RB_PMC0_SRAM_DIAG		BIT(5)
59#define RTL8366RB_PMC0_EN_SCAN			BIT(6)
60#define RTL8366RB_PMC0_P4_IOMODE_SHIFT		7
61#define RTL8366RB_PMC0_P4_IOMODE_MASK		GENMASK(9, 7)
62#define RTL8366RB_PMC0_P5_IOMODE_SHIFT		10
63#define RTL8366RB_PMC0_P5_IOMODE_MASK		GENMASK(12, 10)
64#define RTL8366RB_PMC0_SDSMODE_SHIFT		13
65#define RTL8366RB_PMC0_SDSMODE_MASK		GENMASK(15, 13)
66#define RTL8366RB_PMC1				0x0006
67
68/* Port Mirror Control Register */
69#define RTL8366RB_PMCR				0x0007
70#define RTL8366RB_PMCR_SOURCE_PORT(a)		(a)
71#define RTL8366RB_PMCR_SOURCE_PORT_MASK		0x000f
72#define RTL8366RB_PMCR_MONITOR_PORT(a)		((a) << 4)
73#define RTL8366RB_PMCR_MONITOR_PORT_MASK	0x00f0
74#define RTL8366RB_PMCR_MIRROR_RX		BIT(8)
75#define RTL8366RB_PMCR_MIRROR_TX		BIT(9)
76#define RTL8366RB_PMCR_MIRROR_SPC		BIT(10)
77#define RTL8366RB_PMCR_MIRROR_ISO		BIT(11)
78
79/* bits 0..7 = port 0, bits 8..15 = port 1 */
80#define RTL8366RB_PAACR0		0x0010
81/* bits 0..7 = port 2, bits 8..15 = port 3 */
82#define RTL8366RB_PAACR1		0x0011
83/* bits 0..7 = port 4, bits 8..15 = port 5 */
84#define RTL8366RB_PAACR2		0x0012
85#define RTL8366RB_PAACR_SPEED_10M	0
86#define RTL8366RB_PAACR_SPEED_100M	1
87#define RTL8366RB_PAACR_SPEED_1000M	2
88#define RTL8366RB_PAACR_FULL_DUPLEX	BIT(2)
89#define RTL8366RB_PAACR_LINK_UP		BIT(4)
90#define RTL8366RB_PAACR_TX_PAUSE	BIT(5)
91#define RTL8366RB_PAACR_RX_PAUSE	BIT(6)
92#define RTL8366RB_PAACR_AN		BIT(7)
93
94#define RTL8366RB_PAACR_CPU_PORT	(RTL8366RB_PAACR_SPEED_1000M | \
95					 RTL8366RB_PAACR_FULL_DUPLEX | \
96					 RTL8366RB_PAACR_LINK_UP | \
97					 RTL8366RB_PAACR_TX_PAUSE | \
98					 RTL8366RB_PAACR_RX_PAUSE)
99
100/* bits 0..7 = port 0, bits 8..15 = port 1 */
101#define RTL8366RB_PSTAT0		0x0014
102/* bits 0..7 = port 2, bits 8..15 = port 3 */
103#define RTL8366RB_PSTAT1		0x0015
104/* bits 0..7 = port 4, bits 8..15 = port 5 */
105#define RTL8366RB_PSTAT2		0x0016
106
107#define RTL8366RB_POWER_SAVING_REG	0x0021
108
109/* CPU port control reg */
110#define RTL8368RB_CPU_CTRL_REG		0x0061
111#define RTL8368RB_CPU_PORTS_MSK		0x00FF
112/* Disables inserting custom tag length/type 0x8899 */
113#define RTL8368RB_CPU_NO_TAG		BIT(15)
114
115#define RTL8366RB_SMAR0			0x0070 /* bits 0..15 */
116#define RTL8366RB_SMAR1			0x0071 /* bits 16..31 */
117#define RTL8366RB_SMAR2			0x0072 /* bits 32..47 */
118
119#define RTL8366RB_RESET_CTRL_REG		0x0100
120#define RTL8366RB_CHIP_CTRL_RESET_HW		BIT(0)
121#define RTL8366RB_CHIP_CTRL_RESET_SW		BIT(1)
122
123#define RTL8366RB_CHIP_ID_REG			0x0509
124#define RTL8366RB_CHIP_ID_8366			0x5937
125#define RTL8366RB_CHIP_VERSION_CTRL_REG		0x050A
126#define RTL8366RB_CHIP_VERSION_MASK		0xf
127
128/* PHY registers control */
129#define RTL8366RB_PHY_ACCESS_CTRL_REG		0x8000
130#define RTL8366RB_PHY_CTRL_READ			BIT(0)
131#define RTL8366RB_PHY_CTRL_WRITE		0
132#define RTL8366RB_PHY_ACCESS_BUSY_REG		0x8001
133#define RTL8366RB_PHY_INT_BUSY			BIT(0)
134#define RTL8366RB_PHY_EXT_BUSY			BIT(4)
135#define RTL8366RB_PHY_ACCESS_DATA_REG		0x8002
136#define RTL8366RB_PHY_EXT_CTRL_REG		0x8010
137#define RTL8366RB_PHY_EXT_WRDATA_REG		0x8011
138#define RTL8366RB_PHY_EXT_RDDATA_REG		0x8012
139
140#define RTL8366RB_PHY_REG_MASK			0x1f
141#define RTL8366RB_PHY_PAGE_OFFSET		5
142#define RTL8366RB_PHY_PAGE_MASK			(0xf << 5)
143#define RTL8366RB_PHY_NO_OFFSET			9
144#define RTL8366RB_PHY_NO_MASK			(0x1f << 9)
145
146#define RTL8366RB_VLAN_INGRESS_CTRL2_REG	0x037f
147
148/* LED control registers */
149#define RTL8366RB_LED_BLINKRATE_REG		0x0430
150#define RTL8366RB_LED_BLINKRATE_MASK		0x0007
151#define RTL8366RB_LED_BLINKRATE_28MS		0x0000
152#define RTL8366RB_LED_BLINKRATE_56MS		0x0001
153#define RTL8366RB_LED_BLINKRATE_84MS		0x0002
154#define RTL8366RB_LED_BLINKRATE_111MS		0x0003
155#define RTL8366RB_LED_BLINKRATE_222MS		0x0004
156#define RTL8366RB_LED_BLINKRATE_446MS		0x0005
157
158#define RTL8366RB_LED_CTRL_REG			0x0431
159#define RTL8366RB_LED_OFF			0x0
160#define RTL8366RB_LED_DUP_COL			0x1
161#define RTL8366RB_LED_LINK_ACT			0x2
162#define RTL8366RB_LED_SPD1000			0x3
163#define RTL8366RB_LED_SPD100			0x4
164#define RTL8366RB_LED_SPD10			0x5
165#define RTL8366RB_LED_SPD1000_ACT		0x6
166#define RTL8366RB_LED_SPD100_ACT		0x7
167#define RTL8366RB_LED_SPD10_ACT			0x8
168#define RTL8366RB_LED_SPD100_10_ACT		0x9
169#define RTL8366RB_LED_FIBER			0xa
170#define RTL8366RB_LED_AN_FAULT			0xb
171#define RTL8366RB_LED_LINK_RX			0xc
172#define RTL8366RB_LED_LINK_TX			0xd
173#define RTL8366RB_LED_MASTER			0xe
174#define RTL8366RB_LED_FORCE			0xf
175#define RTL8366RB_LED_0_1_CTRL_REG		0x0432
176#define RTL8366RB_LED_1_OFFSET			6
177#define RTL8366RB_LED_2_3_CTRL_REG		0x0433
178#define RTL8366RB_LED_3_OFFSET			6
179
180#define RTL8366RB_MIB_COUNT			33
181#define RTL8366RB_GLOBAL_MIB_COUNT		1
182#define RTL8366RB_MIB_COUNTER_PORT_OFFSET	0x0050
183#define RTL8366RB_MIB_COUNTER_BASE		0x1000
184#define RTL8366RB_MIB_CTRL_REG			0x13F0
185#define RTL8366RB_MIB_CTRL_USER_MASK		0x0FFC
186#define RTL8366RB_MIB_CTRL_BUSY_MASK		BIT(0)
187#define RTL8366RB_MIB_CTRL_RESET_MASK		BIT(1)
188#define RTL8366RB_MIB_CTRL_PORT_RESET(_p)	BIT(2 + (_p))
189#define RTL8366RB_MIB_CTRL_GLOBAL_RESET		BIT(11)
190
191#define RTL8366RB_PORT_VLAN_CTRL_BASE		0x0063
192#define RTL8366RB_PORT_VLAN_CTRL_REG(_p)  \
193		(RTL8366RB_PORT_VLAN_CTRL_BASE + (_p) / 4)
194#define RTL8366RB_PORT_VLAN_CTRL_MASK		0xf
195#define RTL8366RB_PORT_VLAN_CTRL_SHIFT(_p)	(4 * ((_p) % 4))
196
197#define RTL8366RB_VLAN_TABLE_READ_BASE		0x018C
198#define RTL8366RB_VLAN_TABLE_WRITE_BASE		0x0185
199
200#define RTL8366RB_TABLE_ACCESS_CTRL_REG		0x0180
201#define RTL8366RB_TABLE_VLAN_READ_CTRL		0x0E01
202#define RTL8366RB_TABLE_VLAN_WRITE_CTRL		0x0F01
203
204#define RTL8366RB_VLAN_MC_BASE(_x)		(0x0020 + (_x) * 3)
205
206#define RTL8366RB_PORT_LINK_STATUS_BASE		0x0014
207#define RTL8366RB_PORT_STATUS_SPEED_MASK	0x0003
208#define RTL8366RB_PORT_STATUS_DUPLEX_MASK	0x0004
209#define RTL8366RB_PORT_STATUS_LINK_MASK		0x0010
210#define RTL8366RB_PORT_STATUS_TXPAUSE_MASK	0x0020
211#define RTL8366RB_PORT_STATUS_RXPAUSE_MASK	0x0040
212#define RTL8366RB_PORT_STATUS_AN_MASK		0x0080
213
214#define RTL8366RB_NUM_VLANS		16
215#define RTL8366RB_NUM_LEDGROUPS		4
216#define RTL8366RB_NUM_VIDS		4096
217#define RTL8366RB_PRIORITYMAX		7
218#define RTL8366RB_FIDMAX		7
219
220#define RTL8366RB_PORT_1		BIT(0) /* In userspace port 0 */
221#define RTL8366RB_PORT_2		BIT(1) /* In userspace port 1 */
222#define RTL8366RB_PORT_3		BIT(2) /* In userspace port 2 */
223#define RTL8366RB_PORT_4		BIT(3) /* In userspace port 3 */
224#define RTL8366RB_PORT_5		BIT(4) /* In userspace port 4 */
225
226#define RTL8366RB_PORT_CPU		BIT(5) /* CPU port */
227
228#define RTL8366RB_PORT_ALL		(RTL8366RB_PORT_1 |	\
229					 RTL8366RB_PORT_2 |	\
230					 RTL8366RB_PORT_3 |	\
231					 RTL8366RB_PORT_4 |	\
232					 RTL8366RB_PORT_5 |	\
233					 RTL8366RB_PORT_CPU)
234
235#define RTL8366RB_PORT_ALL_BUT_CPU	(RTL8366RB_PORT_1 |	\
236					 RTL8366RB_PORT_2 |	\
237					 RTL8366RB_PORT_3 |	\
238					 RTL8366RB_PORT_4 |	\
239					 RTL8366RB_PORT_5)
240
241#define RTL8366RB_PORT_ALL_EXTERNAL	(RTL8366RB_PORT_1 |	\
242					 RTL8366RB_PORT_2 |	\
243					 RTL8366RB_PORT_3 |	\
244					 RTL8366RB_PORT_4)
245
246#define RTL8366RB_PORT_ALL_INTERNAL	 RTL8366RB_PORT_CPU
247
248/* First configuration word per member config, VID and prio */
249#define RTL8366RB_VLAN_VID_MASK		0xfff
250#define RTL8366RB_VLAN_PRIORITY_SHIFT	12
251#define RTL8366RB_VLAN_PRIORITY_MASK	0x7
252/* Second configuration word per member config, member and untagged */
253#define RTL8366RB_VLAN_UNTAG_SHIFT	8
254#define RTL8366RB_VLAN_UNTAG_MASK	0xff
255#define RTL8366RB_VLAN_MEMBER_MASK	0xff
256/* Third config word per member config, STAG currently unused */
257#define RTL8366RB_VLAN_STAG_MBR_MASK	0xff
258#define RTL8366RB_VLAN_STAG_MBR_SHIFT	8
259#define RTL8366RB_VLAN_STAG_IDX_MASK	0x7
260#define RTL8366RB_VLAN_STAG_IDX_SHIFT	5
261#define RTL8366RB_VLAN_FID_MASK		0x7
262
263/* Port ingress bandwidth control */
264#define RTL8366RB_IB_BASE		0x0200
265#define RTL8366RB_IB_REG(pnum)		(RTL8366RB_IB_BASE + (pnum))
266#define RTL8366RB_IB_BDTH_MASK		0x3fff
267#define RTL8366RB_IB_PREIFG		BIT(14)
268
269/* Port egress bandwidth control */
270#define RTL8366RB_EB_BASE		0x02d1
271#define RTL8366RB_EB_REG(pnum)		(RTL8366RB_EB_BASE + (pnum))
272#define RTL8366RB_EB_BDTH_MASK		0x3fff
273#define RTL8366RB_EB_PREIFG_REG		0x02f8
274#define RTL8366RB_EB_PREIFG		BIT(9)
275
276#define RTL8366RB_BDTH_SW_MAX		1048512 /* 1048576? */
277#define RTL8366RB_BDTH_UNIT		64
278#define RTL8366RB_BDTH_REG_DEFAULT	16383
279
280/* QOS */
281#define RTL8366RB_QOS			BIT(15)
282/* Include/Exclude Preamble and IFG (20 bytes). 0:Exclude, 1:Include. */
283#define RTL8366RB_QOS_DEFAULT_PREIFG	1
284
285/* Interrupt handling */
286#define RTL8366RB_INTERRUPT_CONTROL_REG	0x0440
287#define RTL8366RB_INTERRUPT_POLARITY	BIT(0)
288#define RTL8366RB_P4_RGMII_LED		BIT(2)
289#define RTL8366RB_INTERRUPT_MASK_REG	0x0441
290#define RTL8366RB_INTERRUPT_LINK_CHGALL	GENMASK(11, 0)
291#define RTL8366RB_INTERRUPT_ACLEXCEED	BIT(8)
292#define RTL8366RB_INTERRUPT_STORMEXCEED	BIT(9)
293#define RTL8366RB_INTERRUPT_P4_FIBER	BIT(12)
294#define RTL8366RB_INTERRUPT_P4_UTP	BIT(13)
295#define RTL8366RB_INTERRUPT_VALID	(RTL8366RB_INTERRUPT_LINK_CHGALL | \
296					 RTL8366RB_INTERRUPT_ACLEXCEED | \
297					 RTL8366RB_INTERRUPT_STORMEXCEED | \
298					 RTL8366RB_INTERRUPT_P4_FIBER | \
299					 RTL8366RB_INTERRUPT_P4_UTP)
300#define RTL8366RB_INTERRUPT_STATUS_REG	0x0442
301#define RTL8366RB_NUM_INTERRUPT		14 /* 0..13 */
302
303/* bits 0..5 enable force when cleared */
304#define RTL8366RB_MAC_FORCE_CTRL_REG	0x0F11
305
306#define RTL8366RB_OAM_PARSER_REG	0x0F14
307#define RTL8366RB_OAM_MULTIPLEXER_REG	0x0F15
308
309#define RTL8366RB_GREEN_FEATURE_REG	0x0F51
310#define RTL8366RB_GREEN_FEATURE_MSK	0x0007
311#define RTL8366RB_GREEN_FEATURE_TX	BIT(0)
312#define RTL8366RB_GREEN_FEATURE_RX	BIT(2)
313
314/**
315 * struct rtl8366rb - RTL8366RB-specific data
316 * @max_mtu: per-port max MTU setting
317 */
318struct rtl8366rb {
319	unsigned int max_mtu[RTL8366RB_NUM_PORTS];
320};
321
322static struct rtl8366_mib_counter rtl8366rb_mib_counters[] = {
323	{ 0,  0, 4, "IfInOctets"				},
324	{ 0,  4, 4, "EtherStatsOctets"				},
325	{ 0,  8, 2, "EtherStatsUnderSizePkts"			},
326	{ 0, 10, 2, "EtherFragments"				},
327	{ 0, 12, 2, "EtherStatsPkts64Octets"			},
328	{ 0, 14, 2, "EtherStatsPkts65to127Octets"		},
329	{ 0, 16, 2, "EtherStatsPkts128to255Octets"		},
330	{ 0, 18, 2, "EtherStatsPkts256to511Octets"		},
331	{ 0, 20, 2, "EtherStatsPkts512to1023Octets"		},
332	{ 0, 22, 2, "EtherStatsPkts1024to1518Octets"		},
333	{ 0, 24, 2, "EtherOversizeStats"			},
334	{ 0, 26, 2, "EtherStatsJabbers"				},
335	{ 0, 28, 2, "IfInUcastPkts"				},
336	{ 0, 30, 2, "EtherStatsMulticastPkts"			},
337	{ 0, 32, 2, "EtherStatsBroadcastPkts"			},
338	{ 0, 34, 2, "EtherStatsDropEvents"			},
339	{ 0, 36, 2, "Dot3StatsFCSErrors"			},
340	{ 0, 38, 2, "Dot3StatsSymbolErrors"			},
341	{ 0, 40, 2, "Dot3InPauseFrames"				},
342	{ 0, 42, 2, "Dot3ControlInUnknownOpcodes"		},
343	{ 0, 44, 4, "IfOutOctets"				},
344	{ 0, 48, 2, "Dot3StatsSingleCollisionFrames"		},
345	{ 0, 50, 2, "Dot3StatMultipleCollisionFrames"		},
346	{ 0, 52, 2, "Dot3sDeferredTransmissions"		},
347	{ 0, 54, 2, "Dot3StatsLateCollisions"			},
348	{ 0, 56, 2, "EtherStatsCollisions"			},
349	{ 0, 58, 2, "Dot3StatsExcessiveCollisions"		},
350	{ 0, 60, 2, "Dot3OutPauseFrames"			},
351	{ 0, 62, 2, "Dot1dBasePortDelayExceededDiscards"	},
352	{ 0, 64, 2, "Dot1dTpPortInDiscards"			},
353	{ 0, 66, 2, "IfOutUcastPkts"				},
354	{ 0, 68, 2, "IfOutMulticastPkts"			},
355	{ 0, 70, 2, "IfOutBroadcastPkts"			},
356};
357
358static int rtl8366rb_get_mib_counter(struct realtek_smi *smi,
359				     int port,
360				     struct rtl8366_mib_counter *mib,
361				     u64 *mibvalue)
362{
363	u32 addr, val;
364	int ret;
365	int i;
366
367	addr = RTL8366RB_MIB_COUNTER_BASE +
368		RTL8366RB_MIB_COUNTER_PORT_OFFSET * (port) +
369		mib->offset;
370
371	/* Writing access counter address first
372	 * then ASIC will prepare 64bits counter wait for being retrived
373	 */
374	ret = regmap_write(smi->map, addr, 0); /* Write whatever */
375	if (ret)
376		return ret;
377
378	/* Read MIB control register */
379	ret = regmap_read(smi->map, RTL8366RB_MIB_CTRL_REG, &val);
380	if (ret)
381		return -EIO;
382
383	if (val & RTL8366RB_MIB_CTRL_BUSY_MASK)
384		return -EBUSY;
385
386	if (val & RTL8366RB_MIB_CTRL_RESET_MASK)
387		return -EIO;
388
389	/* Read each individual MIB 16 bits at the time */
390	*mibvalue = 0;
391	for (i = mib->length; i > 0; i--) {
392		ret = regmap_read(smi->map, addr + (i - 1), &val);
393		if (ret)
394			return ret;
395		*mibvalue = (*mibvalue << 16) | (val & 0xFFFF);
396	}
397	return 0;
398}
399
400static u32 rtl8366rb_get_irqmask(struct irq_data *d)
401{
402	int line = irqd_to_hwirq(d);
403	u32 val;
404
405	/* For line interrupts we combine link down in bits
406	 * 6..11 with link up in bits 0..5 into one interrupt.
407	 */
408	if (line < 12)
409		val = BIT(line) | BIT(line + 6);
410	else
411		val = BIT(line);
412	return val;
413}
414
415static void rtl8366rb_mask_irq(struct irq_data *d)
416{
417	struct realtek_smi *smi = irq_data_get_irq_chip_data(d);
418	int ret;
419
420	ret = regmap_update_bits(smi->map, RTL8366RB_INTERRUPT_MASK_REG,
421				 rtl8366rb_get_irqmask(d), 0);
422	if (ret)
423		dev_err(smi->dev, "could not mask IRQ\n");
424}
425
426static void rtl8366rb_unmask_irq(struct irq_data *d)
427{
428	struct realtek_smi *smi = irq_data_get_irq_chip_data(d);
429	int ret;
430
431	ret = regmap_update_bits(smi->map, RTL8366RB_INTERRUPT_MASK_REG,
432				 rtl8366rb_get_irqmask(d),
433				 rtl8366rb_get_irqmask(d));
434	if (ret)
435		dev_err(smi->dev, "could not unmask IRQ\n");
436}
437
438static irqreturn_t rtl8366rb_irq(int irq, void *data)
439{
440	struct realtek_smi *smi = data;
441	u32 stat;
442	int ret;
443
444	/* This clears the IRQ status register */
445	ret = regmap_read(smi->map, RTL8366RB_INTERRUPT_STATUS_REG,
446			  &stat);
447	if (ret) {
448		dev_err(smi->dev, "can't read interrupt status\n");
449		return IRQ_NONE;
450	}
451	stat &= RTL8366RB_INTERRUPT_VALID;
452	if (!stat)
453		return IRQ_NONE;
454	while (stat) {
455		int line = __ffs(stat);
456		int child_irq;
457
458		stat &= ~BIT(line);
459		/* For line interrupts we combine link down in bits
460		 * 6..11 with link up in bits 0..5 into one interrupt.
461		 */
462		if (line < 12 && line > 5)
463			line -= 5;
464		child_irq = irq_find_mapping(smi->irqdomain, line);
465		handle_nested_irq(child_irq);
466	}
467	return IRQ_HANDLED;
468}
469
470static struct irq_chip rtl8366rb_irq_chip = {
471	.name = "RTL8366RB",
472	.irq_mask = rtl8366rb_mask_irq,
473	.irq_unmask = rtl8366rb_unmask_irq,
474};
475
476static int rtl8366rb_irq_map(struct irq_domain *domain, unsigned int irq,
477			     irq_hw_number_t hwirq)
478{
479	irq_set_chip_data(irq, domain->host_data);
480	irq_set_chip_and_handler(irq, &rtl8366rb_irq_chip, handle_simple_irq);
481	irq_set_nested_thread(irq, 1);
482	irq_set_noprobe(irq);
483
484	return 0;
485}
486
487static void rtl8366rb_irq_unmap(struct irq_domain *d, unsigned int irq)
488{
489	irq_set_nested_thread(irq, 0);
490	irq_set_chip_and_handler(irq, NULL, NULL);
491	irq_set_chip_data(irq, NULL);
492}
493
494static const struct irq_domain_ops rtl8366rb_irqdomain_ops = {
495	.map = rtl8366rb_irq_map,
496	.unmap = rtl8366rb_irq_unmap,
497	.xlate  = irq_domain_xlate_onecell,
498};
499
500static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi)
501{
502	struct device_node *intc;
503	unsigned long irq_trig;
504	int irq;
505	int ret;
506	u32 val;
507	int i;
508
509	intc = of_get_child_by_name(smi->dev->of_node, "interrupt-controller");
510	if (!intc) {
511		dev_err(smi->dev, "missing child interrupt-controller node\n");
512		return -EINVAL;
513	}
514	/* RB8366RB IRQs cascade off this one */
515	irq = of_irq_get(intc, 0);
516	if (irq <= 0) {
517		dev_err(smi->dev, "failed to get parent IRQ\n");
518		ret = irq ? irq : -EINVAL;
519		goto out_put_node;
520	}
521
522	/* This clears the IRQ status register */
523	ret = regmap_read(smi->map, RTL8366RB_INTERRUPT_STATUS_REG,
524			  &val);
525	if (ret) {
526		dev_err(smi->dev, "can't read interrupt status\n");
527		goto out_put_node;
528	}
529
530	/* Fetch IRQ edge information from the descriptor */
531	irq_trig = irqd_get_trigger_type(irq_get_irq_data(irq));
532	switch (irq_trig) {
533	case IRQF_TRIGGER_RISING:
534	case IRQF_TRIGGER_HIGH:
535		dev_info(smi->dev, "active high/rising IRQ\n");
536		val = 0;
537		break;
538	case IRQF_TRIGGER_FALLING:
539	case IRQF_TRIGGER_LOW:
540		dev_info(smi->dev, "active low/falling IRQ\n");
541		val = RTL8366RB_INTERRUPT_POLARITY;
542		break;
543	}
544	ret = regmap_update_bits(smi->map, RTL8366RB_INTERRUPT_CONTROL_REG,
545				 RTL8366RB_INTERRUPT_POLARITY,
546				 val);
547	if (ret) {
548		dev_err(smi->dev, "could not configure IRQ polarity\n");
549		goto out_put_node;
550	}
551
552	ret = devm_request_threaded_irq(smi->dev, irq, NULL,
553					rtl8366rb_irq, IRQF_ONESHOT,
554					"RTL8366RB", smi);
555	if (ret) {
556		dev_err(smi->dev, "unable to request irq: %d\n", ret);
557		goto out_put_node;
558	}
559	smi->irqdomain = irq_domain_add_linear(intc,
560					       RTL8366RB_NUM_INTERRUPT,
561					       &rtl8366rb_irqdomain_ops,
562					       smi);
563	if (!smi->irqdomain) {
564		dev_err(smi->dev, "failed to create IRQ domain\n");
565		ret = -EINVAL;
566		goto out_put_node;
567	}
568	for (i = 0; i < smi->num_ports; i++)
569		irq_set_parent(irq_create_mapping(smi->irqdomain, i), irq);
570
571out_put_node:
572	of_node_put(intc);
573	return ret;
574}
575
576static int rtl8366rb_set_addr(struct realtek_smi *smi)
577{
578	u8 addr[ETH_ALEN];
579	u16 val;
580	int ret;
581
582	eth_random_addr(addr);
583
584	dev_info(smi->dev, "set MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
585		 addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
586	val = addr[0] << 8 | addr[1];
587	ret = regmap_write(smi->map, RTL8366RB_SMAR0, val);
588	if (ret)
589		return ret;
590	val = addr[2] << 8 | addr[3];
591	ret = regmap_write(smi->map, RTL8366RB_SMAR1, val);
592	if (ret)
593		return ret;
594	val = addr[4] << 8 | addr[5];
595	ret = regmap_write(smi->map, RTL8366RB_SMAR2, val);
596	if (ret)
597		return ret;
598
599	return 0;
600}
601
602/* Found in a vendor driver */
603
604/* For the "version 0" early silicon, appear in most source releases */
605static const u16 rtl8366rb_init_jam_ver_0[] = {
606	0x000B, 0x0001, 0x03A6, 0x0100, 0x03A7, 0x0001, 0x02D1, 0x3FFF,
607	0x02D2, 0x3FFF, 0x02D3, 0x3FFF, 0x02D4, 0x3FFF, 0x02D5, 0x3FFF,
608	0x02D6, 0x3FFF, 0x02D7, 0x3FFF, 0x02D8, 0x3FFF, 0x022B, 0x0688,
609	0x022C, 0x0FAC, 0x03D0, 0x4688, 0x03D1, 0x01F5, 0x0000, 0x0830,
610	0x02F9, 0x0200, 0x02F7, 0x7FFF, 0x02F8, 0x03FF, 0x0080, 0x03E8,
611	0x0081, 0x00CE, 0x0082, 0x00DA, 0x0083, 0x0230, 0xBE0F, 0x2000,
612	0x0231, 0x422A, 0x0232, 0x422A, 0x0233, 0x422A, 0x0234, 0x422A,
613	0x0235, 0x422A, 0x0236, 0x422A, 0x0237, 0x422A, 0x0238, 0x422A,
614	0x0239, 0x422A, 0x023A, 0x422A, 0x023B, 0x422A, 0x023C, 0x422A,
615	0x023D, 0x422A, 0x023E, 0x422A, 0x023F, 0x422A, 0x0240, 0x422A,
616	0x0241, 0x422A, 0x0242, 0x422A, 0x0243, 0x422A, 0x0244, 0x422A,
617	0x0245, 0x422A, 0x0246, 0x422A, 0x0247, 0x422A, 0x0248, 0x422A,
618	0x0249, 0x0146, 0x024A, 0x0146, 0x024B, 0x0146, 0xBE03, 0xC961,
619	0x024D, 0x0146, 0x024E, 0x0146, 0x024F, 0x0146, 0x0250, 0x0146,
620	0xBE64, 0x0226, 0x0252, 0x0146, 0x0253, 0x0146, 0x024C, 0x0146,
621	0x0251, 0x0146, 0x0254, 0x0146, 0xBE62, 0x3FD0, 0x0084, 0x0320,
622	0x0255, 0x0146, 0x0256, 0x0146, 0x0257, 0x0146, 0x0258, 0x0146,
623	0x0259, 0x0146, 0x025A, 0x0146, 0x025B, 0x0146, 0x025C, 0x0146,
624	0x025D, 0x0146, 0x025E, 0x0146, 0x025F, 0x0146, 0x0260, 0x0146,
625	0x0261, 0xA23F, 0x0262, 0x0294, 0x0263, 0xA23F, 0x0264, 0x0294,
626	0x0265, 0xA23F, 0x0266, 0x0294, 0x0267, 0xA23F, 0x0268, 0x0294,
627	0x0269, 0xA23F, 0x026A, 0x0294, 0x026B, 0xA23F, 0x026C, 0x0294,
628	0x026D, 0xA23F, 0x026E, 0x0294, 0x026F, 0xA23F, 0x0270, 0x0294,
629	0x02F5, 0x0048, 0xBE09, 0x0E00, 0xBE1E, 0x0FA0, 0xBE14, 0x8448,
630	0xBE15, 0x1007, 0xBE4A, 0xA284, 0xC454, 0x3F0B, 0xC474, 0x3F0B,
631	0xBE48, 0x3672, 0xBE4B, 0x17A7, 0xBE4C, 0x0B15, 0xBE52, 0x0EDD,
632	0xBE49, 0x8C00, 0xBE5B, 0x785C, 0xBE5C, 0x785C, 0xBE5D, 0x785C,
633	0xBE61, 0x368A, 0xBE63, 0x9B84, 0xC456, 0xCC13, 0xC476, 0xCC13,
634	0xBE65, 0x307D, 0xBE6D, 0x0005, 0xBE6E, 0xE120, 0xBE2E, 0x7BAF,
635};
636
637/* This v1 init sequence is from Belkin F5D8235 U-Boot release */
638static const u16 rtl8366rb_init_jam_ver_1[] = {
639	0x0000, 0x0830, 0x0001, 0x8000, 0x0400, 0x8130, 0xBE78, 0x3C3C,
640	0x0431, 0x5432, 0xBE37, 0x0CE4, 0x02FA, 0xFFDF, 0x02FB, 0xFFE0,
641	0xC44C, 0x1585, 0xC44C, 0x1185, 0xC44C, 0x1585, 0xC46C, 0x1585,
642	0xC46C, 0x1185, 0xC46C, 0x1585, 0xC451, 0x2135, 0xC471, 0x2135,
643	0xBE10, 0x8140, 0xBE15, 0x0007, 0xBE6E, 0xE120, 0xBE69, 0xD20F,
644	0xBE6B, 0x0320, 0xBE24, 0xB000, 0xBE23, 0xFF51, 0xBE22, 0xDF20,
645	0xBE21, 0x0140, 0xBE20, 0x00BB, 0xBE24, 0xB800, 0xBE24, 0x0000,
646	0xBE24, 0x7000, 0xBE23, 0xFF51, 0xBE22, 0xDF60, 0xBE21, 0x0140,
647	0xBE20, 0x0077, 0xBE24, 0x7800, 0xBE24, 0x0000, 0xBE2E, 0x7B7A,
648	0xBE36, 0x0CE4, 0x02F5, 0x0048, 0xBE77, 0x2940, 0x000A, 0x83E0,
649	0xBE79, 0x3C3C, 0xBE00, 0x1340,
650};
651
652/* This v2 init sequence is from Belkin F5D8235 U-Boot release */
653static const u16 rtl8366rb_init_jam_ver_2[] = {
654	0x0450, 0x0000, 0x0400, 0x8130, 0x000A, 0x83ED, 0x0431, 0x5432,
655	0xC44F, 0x6250, 0xC46F, 0x6250, 0xC456, 0x0C14, 0xC476, 0x0C14,
656	0xC44C, 0x1C85, 0xC44C, 0x1885, 0xC44C, 0x1C85, 0xC46C, 0x1C85,
657	0xC46C, 0x1885, 0xC46C, 0x1C85, 0xC44C, 0x0885, 0xC44C, 0x0881,
658	0xC44C, 0x0885, 0xC46C, 0x0885, 0xC46C, 0x0881, 0xC46C, 0x0885,
659	0xBE2E, 0x7BA7, 0xBE36, 0x1000, 0xBE37, 0x1000, 0x8000, 0x0001,
660	0xBE69, 0xD50F, 0x8000, 0x0000, 0xBE69, 0xD50F, 0xBE6E, 0x0320,
661	0xBE77, 0x2940, 0xBE78, 0x3C3C, 0xBE79, 0x3C3C, 0xBE6E, 0xE120,
662	0x8000, 0x0001, 0xBE15, 0x1007, 0x8000, 0x0000, 0xBE15, 0x1007,
663	0xBE14, 0x0448, 0xBE1E, 0x00A0, 0xBE10, 0x8160, 0xBE10, 0x8140,
664	0xBE00, 0x1340, 0x0F51, 0x0010,
665};
666
667/* Appears in a DDWRT code dump */
668static const u16 rtl8366rb_init_jam_ver_3[] = {
669	0x0000, 0x0830, 0x0400, 0x8130, 0x000A, 0x83ED, 0x0431, 0x5432,
670	0x0F51, 0x0017, 0x02F5, 0x0048, 0x02FA, 0xFFDF, 0x02FB, 0xFFE0,
671	0xC456, 0x0C14, 0xC476, 0x0C14, 0xC454, 0x3F8B, 0xC474, 0x3F8B,
672	0xC450, 0x2071, 0xC470, 0x2071, 0xC451, 0x226B, 0xC471, 0x226B,
673	0xC452, 0xA293, 0xC472, 0xA293, 0xC44C, 0x1585, 0xC44C, 0x1185,
674	0xC44C, 0x1585, 0xC46C, 0x1585, 0xC46C, 0x1185, 0xC46C, 0x1585,
675	0xC44C, 0x0185, 0xC44C, 0x0181, 0xC44C, 0x0185, 0xC46C, 0x0185,
676	0xC46C, 0x0181, 0xC46C, 0x0185, 0xBE24, 0xB000, 0xBE23, 0xFF51,
677	0xBE22, 0xDF20, 0xBE21, 0x0140, 0xBE20, 0x00BB, 0xBE24, 0xB800,
678	0xBE24, 0x0000, 0xBE24, 0x7000, 0xBE23, 0xFF51, 0xBE22, 0xDF60,
679	0xBE21, 0x0140, 0xBE20, 0x0077, 0xBE24, 0x7800, 0xBE24, 0x0000,
680	0xBE2E, 0x7BA7, 0xBE36, 0x1000, 0xBE37, 0x1000, 0x8000, 0x0001,
681	0xBE69, 0xD50F, 0x8000, 0x0000, 0xBE69, 0xD50F, 0xBE6B, 0x0320,
682	0xBE77, 0x2800, 0xBE78, 0x3C3C, 0xBE79, 0x3C3C, 0xBE6E, 0xE120,
683	0x8000, 0x0001, 0xBE10, 0x8140, 0x8000, 0x0000, 0xBE10, 0x8140,
684	0xBE15, 0x1007, 0xBE14, 0x0448, 0xBE1E, 0x00A0, 0xBE10, 0x8160,
685	0xBE10, 0x8140, 0xBE00, 0x1340, 0x0450, 0x0000, 0x0401, 0x0000,
686};
687
688/* Belkin F5D8235 v1, "belkin,f5d8235-v1" */
689static const u16 rtl8366rb_init_jam_f5d8235[] = {
690	0x0242, 0x02BF, 0x0245, 0x02BF, 0x0248, 0x02BF, 0x024B, 0x02BF,
691	0x024E, 0x02BF, 0x0251, 0x02BF, 0x0254, 0x0A3F, 0x0256, 0x0A3F,
692	0x0258, 0x0A3F, 0x025A, 0x0A3F, 0x025C, 0x0A3F, 0x025E, 0x0A3F,
693	0x0263, 0x007C, 0x0100, 0x0004, 0xBE5B, 0x3500, 0x800E, 0x200F,
694	0xBE1D, 0x0F00, 0x8001, 0x5011, 0x800A, 0xA2F4, 0x800B, 0x17A3,
695	0xBE4B, 0x17A3, 0xBE41, 0x5011, 0xBE17, 0x2100, 0x8000, 0x8304,
696	0xBE40, 0x8304, 0xBE4A, 0xA2F4, 0x800C, 0xA8D5, 0x8014, 0x5500,
697	0x8015, 0x0004, 0xBE4C, 0xA8D5, 0xBE59, 0x0008, 0xBE09, 0x0E00,
698	0xBE36, 0x1036, 0xBE37, 0x1036, 0x800D, 0x00FF, 0xBE4D, 0x00FF,
699};
700
701/* DGN3500, "netgear,dgn3500", "netgear,dgn3500b" */
702static const u16 rtl8366rb_init_jam_dgn3500[] = {
703	0x0000, 0x0830, 0x0400, 0x8130, 0x000A, 0x83ED, 0x0F51, 0x0017,
704	0x02F5, 0x0048, 0x02FA, 0xFFDF, 0x02FB, 0xFFE0, 0x0450, 0x0000,
705	0x0401, 0x0000, 0x0431, 0x0960,
706};
707
708/* This jam table activates "green ethernet", which means low power mode
709 * and is claimed to detect the cable length and not use more power than
710 * necessary, and the ports should enter power saving mode 10 seconds after
711 * a cable is disconnected. Seems to always be the same.
712 */
713static const u16 rtl8366rb_green_jam[][2] = {
714	{0xBE78, 0x323C}, {0xBE77, 0x5000}, {0xBE2E, 0x7BA7},
715	{0xBE59, 0x3459}, {0xBE5A, 0x745A}, {0xBE5B, 0x785C},
716	{0xBE5C, 0x785C}, {0xBE6E, 0xE120}, {0xBE79, 0x323C},
717};
718
719static int rtl8366rb_setup(struct dsa_switch *ds)
720{
721	struct realtek_smi *smi = ds->priv;
722	const u16 *jam_table;
723	struct rtl8366rb *rb;
724	u32 chip_ver = 0;
725	u32 chip_id = 0;
726	int jam_size;
727	u32 val;
728	int ret;
729	int i;
730
731	rb = smi->chip_data;
732
733	ret = regmap_read(smi->map, RTL8366RB_CHIP_ID_REG, &chip_id);
734	if (ret) {
735		dev_err(smi->dev, "unable to read chip id\n");
736		return ret;
737	}
738
739	switch (chip_id) {
740	case RTL8366RB_CHIP_ID_8366:
741		break;
742	default:
743		dev_err(smi->dev, "unknown chip id (%04x)\n", chip_id);
744		return -ENODEV;
745	}
746
747	ret = regmap_read(smi->map, RTL8366RB_CHIP_VERSION_CTRL_REG,
748			  &chip_ver);
749	if (ret) {
750		dev_err(smi->dev, "unable to read chip version\n");
751		return ret;
752	}
753
754	dev_info(smi->dev, "RTL%04x ver %u chip found\n",
755		 chip_id, chip_ver & RTL8366RB_CHIP_VERSION_MASK);
756
757	/* Do the init dance using the right jam table */
758	switch (chip_ver) {
759	case 0:
760		jam_table = rtl8366rb_init_jam_ver_0;
761		jam_size = ARRAY_SIZE(rtl8366rb_init_jam_ver_0);
762		break;
763	case 1:
764		jam_table = rtl8366rb_init_jam_ver_1;
765		jam_size = ARRAY_SIZE(rtl8366rb_init_jam_ver_1);
766		break;
767	case 2:
768		jam_table = rtl8366rb_init_jam_ver_2;
769		jam_size = ARRAY_SIZE(rtl8366rb_init_jam_ver_2);
770		break;
771	default:
772		jam_table = rtl8366rb_init_jam_ver_3;
773		jam_size = ARRAY_SIZE(rtl8366rb_init_jam_ver_3);
774		break;
775	}
776
777	/* Special jam tables for special routers
778	 * TODO: are these necessary? Maintainers, please test
779	 * without them, using just the off-the-shelf tables.
780	 */
781	if (of_machine_is_compatible("belkin,f5d8235-v1")) {
782		jam_table = rtl8366rb_init_jam_f5d8235;
783		jam_size = ARRAY_SIZE(rtl8366rb_init_jam_f5d8235);
784	}
785	if (of_machine_is_compatible("netgear,dgn3500") ||
786	    of_machine_is_compatible("netgear,dgn3500b")) {
787		jam_table = rtl8366rb_init_jam_dgn3500;
788		jam_size = ARRAY_SIZE(rtl8366rb_init_jam_dgn3500);
789	}
790
791	i = 0;
792	while (i < jam_size) {
793		if ((jam_table[i] & 0xBE00) == 0xBE00) {
794			ret = regmap_read(smi->map,
795					  RTL8366RB_PHY_ACCESS_BUSY_REG,
796					  &val);
797			if (ret)
798				return ret;
799			if (!(val & RTL8366RB_PHY_INT_BUSY)) {
800				ret = regmap_write(smi->map,
801						RTL8366RB_PHY_ACCESS_CTRL_REG,
802						RTL8366RB_PHY_CTRL_WRITE);
803				if (ret)
804					return ret;
805			}
806		}
807		dev_dbg(smi->dev, "jam %04x into register %04x\n",
808			jam_table[i + 1],
809			jam_table[i]);
810		ret = regmap_write(smi->map,
811				   jam_table[i],
812				   jam_table[i + 1]);
813		if (ret)
814			return ret;
815		i += 2;
816	}
817
818	/* Set up the "green ethernet" feature */
819	i = 0;
820	while (i < ARRAY_SIZE(rtl8366rb_green_jam)) {
821		ret = regmap_read(smi->map, RTL8366RB_PHY_ACCESS_BUSY_REG,
822				  &val);
823		if (ret)
824			return ret;
825		if (!(val & RTL8366RB_PHY_INT_BUSY)) {
826			ret = regmap_write(smi->map,
827					   RTL8366RB_PHY_ACCESS_CTRL_REG,
828					   RTL8366RB_PHY_CTRL_WRITE);
829			if (ret)
830				return ret;
831			ret = regmap_write(smi->map,
832					   rtl8366rb_green_jam[i][0],
833					   rtl8366rb_green_jam[i][1]);
834			if (ret)
835				return ret;
836			i++;
837		}
838	}
839	ret = regmap_write(smi->map,
840			   RTL8366RB_GREEN_FEATURE_REG,
841			   (chip_ver == 1) ? 0x0007 : 0x0003);
842	if (ret)
843		return ret;
844
845	/* Vendor driver sets 0x240 in registers 0xc and 0xd (undocumented) */
846	ret = regmap_write(smi->map, 0x0c, 0x240);
847	if (ret)
848		return ret;
849	ret = regmap_write(smi->map, 0x0d, 0x240);
850	if (ret)
851		return ret;
852
853	/* Set some random MAC address */
854	ret = rtl8366rb_set_addr(smi);
855	if (ret)
856		return ret;
857
858	/* Enable CPU port with custom DSA tag 8899.
859	 *
860	 * If you set RTL8368RB_CPU_NO_TAG (bit 15) in this registers
861	 * the custom tag is turned off.
862	 */
863	ret = regmap_update_bits(smi->map, RTL8368RB_CPU_CTRL_REG,
864				 0xFFFF,
865				 BIT(smi->cpu_port));
866	if (ret)
867		return ret;
868
869	/* Make sure we default-enable the fixed CPU port */
870	ret = regmap_update_bits(smi->map, RTL8366RB_PECR,
871				 BIT(smi->cpu_port),
872				 0);
873	if (ret)
874		return ret;
875
876	/* Set maximum packet length to 1536 bytes */
877	ret = regmap_update_bits(smi->map, RTL8366RB_SGCR,
878				 RTL8366RB_SGCR_MAX_LENGTH_MASK,
879				 RTL8366RB_SGCR_MAX_LENGTH_1536);
880	if (ret)
881		return ret;
882	for (i = 0; i < RTL8366RB_NUM_PORTS; i++)
883		/* layer 2 size, see rtl8366rb_change_mtu() */
884		rb->max_mtu[i] = 1532;
885
886	/* Enable learning for all ports */
887	ret = regmap_write(smi->map, RTL8366RB_SSCR0, 0);
888	if (ret)
889		return ret;
890
891	/* Enable auto ageing for all ports */
892	ret = regmap_write(smi->map, RTL8366RB_SSCR1, 0);
893	if (ret)
894		return ret;
895
896	/* Port 4 setup: this enables Port 4, usually the WAN port,
897	 * common PHY IO mode is apparently mode 0, and this is not what
898	 * the port is initialized to. There is no explanation of the
899	 * IO modes in the Realtek source code, if your WAN port is
900	 * connected to something exotic such as fiber, then this might
901	 * be worth experimenting with.
902	 */
903	ret = regmap_update_bits(smi->map, RTL8366RB_PMC0,
904				 RTL8366RB_PMC0_P4_IOMODE_MASK,
905				 0 << RTL8366RB_PMC0_P4_IOMODE_SHIFT);
906	if (ret)
907		return ret;
908
909	/* Discard VLAN tagged packets if the port is not a member of
910	 * the VLAN with which the packets is associated.
911	 */
912	ret = regmap_write(smi->map, RTL8366RB_VLAN_INGRESS_CTRL2_REG,
913			   RTL8366RB_PORT_ALL);
914	if (ret)
915		return ret;
916
917	/* Don't drop packets whose DA has not been learned */
918	ret = regmap_update_bits(smi->map, RTL8366RB_SSCR2,
919				 RTL8366RB_SSCR2_DROP_UNKNOWN_DA, 0);
920	if (ret)
921		return ret;
922
923	/* Set blinking, TODO: make this configurable */
924	ret = regmap_update_bits(smi->map, RTL8366RB_LED_BLINKRATE_REG,
925				 RTL8366RB_LED_BLINKRATE_MASK,
926				 RTL8366RB_LED_BLINKRATE_56MS);
927	if (ret)
928		return ret;
929
930	/* Set up LED activity:
931	 * Each port has 4 LEDs, we configure all ports to the same
932	 * behaviour (no individual config) but we can set up each
933	 * LED separately.
934	 */
935	if (smi->leds_disabled) {
936		/* Turn everything off */
937		regmap_update_bits(smi->map,
938				   RTL8366RB_LED_0_1_CTRL_REG,
939				   0x0FFF, 0);
940		regmap_update_bits(smi->map,
941				   RTL8366RB_LED_2_3_CTRL_REG,
942				   0x0FFF, 0);
943		regmap_update_bits(smi->map,
944				   RTL8366RB_INTERRUPT_CONTROL_REG,
945				   RTL8366RB_P4_RGMII_LED,
946				   0);
947		val = RTL8366RB_LED_OFF;
948	} else {
949		/* TODO: make this configurable per LED */
950		val = RTL8366RB_LED_FORCE;
951	}
952	for (i = 0; i < 4; i++) {
953		ret = regmap_update_bits(smi->map,
954					 RTL8366RB_LED_CTRL_REG,
955					 0xf << (i * 4),
956					 val << (i * 4));
957		if (ret)
958			return ret;
959	}
960
961	ret = rtl8366_init_vlan(smi);
962	if (ret)
963		return ret;
964
965	ret = rtl8366rb_setup_cascaded_irq(smi);
966	if (ret)
967		dev_info(smi->dev, "no interrupt support\n");
968
969	ret = realtek_smi_setup_mdio(smi);
970	if (ret) {
971		dev_info(smi->dev, "could not set up MDIO bus\n");
972		return -ENODEV;
973	}
974
975	return 0;
976}
977
978static enum dsa_tag_protocol rtl8366_get_tag_protocol(struct dsa_switch *ds,
979						      int port,
980						      enum dsa_tag_protocol mp)
981{
982	/* This switch uses the 4 byte protocol A Realtek DSA tag */
983	return DSA_TAG_PROTO_RTL4_A;
984}
985
986static void
987rtl8366rb_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode,
988		      phy_interface_t interface, struct phy_device *phydev,
989		      int speed, int duplex, bool tx_pause, bool rx_pause)
990{
991	struct realtek_smi *smi = ds->priv;
992	int ret;
993
994	if (port != smi->cpu_port)
995		return;
996
997	dev_dbg(smi->dev, "MAC link up on CPU port (%d)\n", port);
998
999	/* Force the fixed CPU port into 1Gbit mode, no autonegotiation */
1000	ret = regmap_update_bits(smi->map, RTL8366RB_MAC_FORCE_CTRL_REG,
1001				 BIT(port), BIT(port));
1002	if (ret) {
1003		dev_err(smi->dev, "failed to force 1Gbit on CPU port\n");
1004		return;
1005	}
1006
1007	ret = regmap_update_bits(smi->map, RTL8366RB_PAACR2,
1008				 0xFF00U,
1009				 RTL8366RB_PAACR_CPU_PORT << 8);
1010	if (ret) {
1011		dev_err(smi->dev, "failed to set PAACR on CPU port\n");
1012		return;
1013	}
1014
1015	/* Enable the CPU port */
1016	ret = regmap_update_bits(smi->map, RTL8366RB_PECR, BIT(port),
1017				 0);
1018	if (ret) {
1019		dev_err(smi->dev, "failed to enable the CPU port\n");
1020		return;
1021	}
1022}
1023
1024static void
1025rtl8366rb_mac_link_down(struct dsa_switch *ds, int port, unsigned int mode,
1026			phy_interface_t interface)
1027{
1028	struct realtek_smi *smi = ds->priv;
1029	int ret;
1030
1031	if (port != smi->cpu_port)
1032		return;
1033
1034	dev_dbg(smi->dev, "MAC link down on CPU port (%d)\n", port);
1035
1036	/* Disable the CPU port */
1037	ret = regmap_update_bits(smi->map, RTL8366RB_PECR, BIT(port),
1038				 BIT(port));
1039	if (ret) {
1040		dev_err(smi->dev, "failed to disable the CPU port\n");
1041		return;
1042	}
1043}
1044
1045static void rb8366rb_set_port_led(struct realtek_smi *smi,
1046				  int port, bool enable)
1047{
1048	u16 val = enable ? 0x3f : 0;
1049	int ret;
1050
1051	if (smi->leds_disabled)
1052		return;
1053
1054	switch (port) {
1055	case 0:
1056		ret = regmap_update_bits(smi->map,
1057					 RTL8366RB_LED_0_1_CTRL_REG,
1058					 0x3F, val);
1059		break;
1060	case 1:
1061		ret = regmap_update_bits(smi->map,
1062					 RTL8366RB_LED_0_1_CTRL_REG,
1063					 0x3F << RTL8366RB_LED_1_OFFSET,
1064					 val << RTL8366RB_LED_1_OFFSET);
1065		break;
1066	case 2:
1067		ret = regmap_update_bits(smi->map,
1068					 RTL8366RB_LED_2_3_CTRL_REG,
1069					 0x3F, val);
1070		break;
1071	case 3:
1072		ret = regmap_update_bits(smi->map,
1073					 RTL8366RB_LED_2_3_CTRL_REG,
1074					 0x3F << RTL8366RB_LED_3_OFFSET,
1075					 val << RTL8366RB_LED_3_OFFSET);
1076		break;
1077	case 4:
1078		ret = regmap_update_bits(smi->map,
1079					 RTL8366RB_INTERRUPT_CONTROL_REG,
1080					 RTL8366RB_P4_RGMII_LED,
1081					 enable ? RTL8366RB_P4_RGMII_LED : 0);
1082		break;
1083	default:
1084		dev_err(smi->dev, "no LED for port %d\n", port);
1085		return;
1086	}
1087	if (ret)
1088		dev_err(smi->dev, "error updating LED on port %d\n", port);
1089}
1090
1091static int
1092rtl8366rb_port_enable(struct dsa_switch *ds, int port,
1093		      struct phy_device *phy)
1094{
1095	struct realtek_smi *smi = ds->priv;
1096	int ret;
1097
1098	dev_dbg(smi->dev, "enable port %d\n", port);
1099	ret = regmap_update_bits(smi->map, RTL8366RB_PECR, BIT(port),
1100				 0);
1101	if (ret)
1102		return ret;
1103
1104	rb8366rb_set_port_led(smi, port, true);
1105	return 0;
1106}
1107
1108static void
1109rtl8366rb_port_disable(struct dsa_switch *ds, int port)
1110{
1111	struct realtek_smi *smi = ds->priv;
1112	int ret;
1113
1114	dev_dbg(smi->dev, "disable port %d\n", port);
1115	ret = regmap_update_bits(smi->map, RTL8366RB_PECR, BIT(port),
1116				 BIT(port));
1117	if (ret)
1118		return;
1119
1120	rb8366rb_set_port_led(smi, port, false);
1121}
1122
1123static int rtl8366rb_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
1124{
1125	struct realtek_smi *smi = ds->priv;
1126	struct rtl8366rb *rb;
1127	unsigned int max_mtu;
1128	u32 len;
1129	int i;
1130
1131	/* Cache the per-port MTU setting */
1132	rb = smi->chip_data;
1133	rb->max_mtu[port] = new_mtu;
1134
1135	/* Roof out the MTU for the entire switch to the greatest
1136	 * common denominator: the biggest set for any one port will
1137	 * be the biggest MTU for the switch.
1138	 *
1139	 * The first setting, 1522 bytes, is max IP packet 1500 bytes,
1140	 * plus ethernet header, 1518 bytes, plus CPU tag, 4 bytes.
1141	 * This function should consider the parameter an SDU, so the
1142	 * MTU passed for this setting is 1518 bytes. The same logic
1143	 * of subtracting the DSA tag of 4 bytes apply to the other
1144	 * settings.
1145	 */
1146	max_mtu = 1518;
1147	for (i = 0; i < RTL8366RB_NUM_PORTS; i++) {
1148		if (rb->max_mtu[i] > max_mtu)
1149			max_mtu = rb->max_mtu[i];
1150	}
1151	if (max_mtu <= 1518)
1152		len = RTL8366RB_SGCR_MAX_LENGTH_1522;
1153	else if (max_mtu > 1518 && max_mtu <= 1532)
1154		len = RTL8366RB_SGCR_MAX_LENGTH_1536;
1155	else if (max_mtu > 1532 && max_mtu <= 1548)
1156		len = RTL8366RB_SGCR_MAX_LENGTH_1552;
1157	else
1158		len = RTL8366RB_SGCR_MAX_LENGTH_16000;
1159
1160	return regmap_update_bits(smi->map, RTL8366RB_SGCR,
1161				  RTL8366RB_SGCR_MAX_LENGTH_MASK,
1162				  len);
1163}
1164
1165static int rtl8366rb_max_mtu(struct dsa_switch *ds, int port)
1166{
1167	/* The max MTU is 16000 bytes, so we subtract the CPU tag
1168	 * and the max presented to the system is 15996 bytes.
1169	 */
1170	return 15996;
1171}
1172
1173static int rtl8366rb_get_vlan_4k(struct realtek_smi *smi, u32 vid,
1174				 struct rtl8366_vlan_4k *vlan4k)
1175{
1176	u32 data[3];
1177	int ret;
1178	int i;
1179
1180	memset(vlan4k, '\0', sizeof(struct rtl8366_vlan_4k));
1181
1182	if (vid >= RTL8366RB_NUM_VIDS)
1183		return -EINVAL;
1184
1185	/* write VID */
1186	ret = regmap_write(smi->map, RTL8366RB_VLAN_TABLE_WRITE_BASE,
1187			   vid & RTL8366RB_VLAN_VID_MASK);
1188	if (ret)
1189		return ret;
1190
1191	/* write table access control word */
1192	ret = regmap_write(smi->map, RTL8366RB_TABLE_ACCESS_CTRL_REG,
1193			   RTL8366RB_TABLE_VLAN_READ_CTRL);
1194	if (ret)
1195		return ret;
1196
1197	for (i = 0; i < 3; i++) {
1198		ret = regmap_read(smi->map,
1199				  RTL8366RB_VLAN_TABLE_READ_BASE + i,
1200				  &data[i]);
1201		if (ret)
1202			return ret;
1203	}
1204
1205	vlan4k->vid = vid;
1206	vlan4k->untag = (data[1] >> RTL8366RB_VLAN_UNTAG_SHIFT) &
1207			RTL8366RB_VLAN_UNTAG_MASK;
1208	vlan4k->member = data[1] & RTL8366RB_VLAN_MEMBER_MASK;
1209	vlan4k->fid = data[2] & RTL8366RB_VLAN_FID_MASK;
1210
1211	return 0;
1212}
1213
1214static int rtl8366rb_set_vlan_4k(struct realtek_smi *smi,
1215				 const struct rtl8366_vlan_4k *vlan4k)
1216{
1217	u32 data[3];
1218	int ret;
1219	int i;
1220
1221	if (vlan4k->vid >= RTL8366RB_NUM_VIDS ||
1222	    vlan4k->member > RTL8366RB_VLAN_MEMBER_MASK ||
1223	    vlan4k->untag > RTL8366RB_VLAN_UNTAG_MASK ||
1224	    vlan4k->fid > RTL8366RB_FIDMAX)
1225		return -EINVAL;
1226
1227	data[0] = vlan4k->vid & RTL8366RB_VLAN_VID_MASK;
1228	data[1] = (vlan4k->member & RTL8366RB_VLAN_MEMBER_MASK) |
1229		  ((vlan4k->untag & RTL8366RB_VLAN_UNTAG_MASK) <<
1230			RTL8366RB_VLAN_UNTAG_SHIFT);
1231	data[2] = vlan4k->fid & RTL8366RB_VLAN_FID_MASK;
1232
1233	for (i = 0; i < 3; i++) {
1234		ret = regmap_write(smi->map,
1235				   RTL8366RB_VLAN_TABLE_WRITE_BASE + i,
1236				   data[i]);
1237		if (ret)
1238			return ret;
1239	}
1240
1241	/* write table access control word */
1242	ret = regmap_write(smi->map, RTL8366RB_TABLE_ACCESS_CTRL_REG,
1243			   RTL8366RB_TABLE_VLAN_WRITE_CTRL);
1244
1245	return ret;
1246}
1247
1248static int rtl8366rb_get_vlan_mc(struct realtek_smi *smi, u32 index,
1249				 struct rtl8366_vlan_mc *vlanmc)
1250{
1251	u32 data[3];
1252	int ret;
1253	int i;
1254
1255	memset(vlanmc, '\0', sizeof(struct rtl8366_vlan_mc));
1256
1257	if (index >= RTL8366RB_NUM_VLANS)
1258		return -EINVAL;
1259
1260	for (i = 0; i < 3; i++) {
1261		ret = regmap_read(smi->map,
1262				  RTL8366RB_VLAN_MC_BASE(index) + i,
1263				  &data[i]);
1264		if (ret)
1265			return ret;
1266	}
1267
1268	vlanmc->vid = data[0] & RTL8366RB_VLAN_VID_MASK;
1269	vlanmc->priority = (data[0] >> RTL8366RB_VLAN_PRIORITY_SHIFT) &
1270		RTL8366RB_VLAN_PRIORITY_MASK;
1271	vlanmc->untag = (data[1] >> RTL8366RB_VLAN_UNTAG_SHIFT) &
1272		RTL8366RB_VLAN_UNTAG_MASK;
1273	vlanmc->member = data[1] & RTL8366RB_VLAN_MEMBER_MASK;
1274	vlanmc->fid = data[2] & RTL8366RB_VLAN_FID_MASK;
1275
1276	return 0;
1277}
1278
1279static int rtl8366rb_set_vlan_mc(struct realtek_smi *smi, u32 index,
1280				 const struct rtl8366_vlan_mc *vlanmc)
1281{
1282	u32 data[3];
1283	int ret;
1284	int i;
1285
1286	if (index >= RTL8366RB_NUM_VLANS ||
1287	    vlanmc->vid >= RTL8366RB_NUM_VIDS ||
1288	    vlanmc->priority > RTL8366RB_PRIORITYMAX ||
1289	    vlanmc->member > RTL8366RB_VLAN_MEMBER_MASK ||
1290	    vlanmc->untag > RTL8366RB_VLAN_UNTAG_MASK ||
1291	    vlanmc->fid > RTL8366RB_FIDMAX)
1292		return -EINVAL;
1293
1294	data[0] = (vlanmc->vid & RTL8366RB_VLAN_VID_MASK) |
1295		  ((vlanmc->priority & RTL8366RB_VLAN_PRIORITY_MASK) <<
1296			RTL8366RB_VLAN_PRIORITY_SHIFT);
1297	data[1] = (vlanmc->member & RTL8366RB_VLAN_MEMBER_MASK) |
1298		  ((vlanmc->untag & RTL8366RB_VLAN_UNTAG_MASK) <<
1299			RTL8366RB_VLAN_UNTAG_SHIFT);
1300	data[2] = vlanmc->fid & RTL8366RB_VLAN_FID_MASK;
1301
1302	for (i = 0; i < 3; i++) {
1303		ret = regmap_write(smi->map,
1304				   RTL8366RB_VLAN_MC_BASE(index) + i,
1305				   data[i]);
1306		if (ret)
1307			return ret;
1308	}
1309
1310	return 0;
1311}
1312
1313static int rtl8366rb_get_mc_index(struct realtek_smi *smi, int port, int *val)
1314{
1315	u32 data;
1316	int ret;
1317
1318	if (port >= smi->num_ports)
1319		return -EINVAL;
1320
1321	ret = regmap_read(smi->map, RTL8366RB_PORT_VLAN_CTRL_REG(port),
1322			  &data);
1323	if (ret)
1324		return ret;
1325
1326	*val = (data >> RTL8366RB_PORT_VLAN_CTRL_SHIFT(port)) &
1327		RTL8366RB_PORT_VLAN_CTRL_MASK;
1328
1329	return 0;
1330}
1331
1332static int rtl8366rb_set_mc_index(struct realtek_smi *smi, int port, int index)
1333{
1334	if (port >= smi->num_ports || index >= RTL8366RB_NUM_VLANS)
1335		return -EINVAL;
1336
1337	return regmap_update_bits(smi->map, RTL8366RB_PORT_VLAN_CTRL_REG(port),
1338				RTL8366RB_PORT_VLAN_CTRL_MASK <<
1339					RTL8366RB_PORT_VLAN_CTRL_SHIFT(port),
1340				(index & RTL8366RB_PORT_VLAN_CTRL_MASK) <<
1341					RTL8366RB_PORT_VLAN_CTRL_SHIFT(port));
1342}
1343
1344static bool rtl8366rb_is_vlan_valid(struct realtek_smi *smi, unsigned int vlan)
1345{
1346	unsigned int max = RTL8366RB_NUM_VLANS - 1;
1347
1348	if (smi->vlan4k_enabled)
1349		max = RTL8366RB_NUM_VIDS - 1;
1350
1351	if (vlan == 0 || vlan > max)
1352		return false;
1353
1354	return true;
1355}
1356
1357static int rtl8366rb_enable_vlan(struct realtek_smi *smi, bool enable)
1358{
1359	dev_dbg(smi->dev, "%s VLAN\n", enable ? "enable" : "disable");
1360	return regmap_update_bits(smi->map,
1361				  RTL8366RB_SGCR, RTL8366RB_SGCR_EN_VLAN,
1362				  enable ? RTL8366RB_SGCR_EN_VLAN : 0);
1363}
1364
1365static int rtl8366rb_enable_vlan4k(struct realtek_smi *smi, bool enable)
1366{
1367	dev_dbg(smi->dev, "%s VLAN 4k\n", enable ? "enable" : "disable");
1368	return regmap_update_bits(smi->map, RTL8366RB_SGCR,
1369				  RTL8366RB_SGCR_EN_VLAN_4KTB,
1370				  enable ? RTL8366RB_SGCR_EN_VLAN_4KTB : 0);
1371}
1372
1373static int rtl8366rb_phy_read(struct realtek_smi *smi, int phy, int regnum)
1374{
1375	u32 val;
1376	u32 reg;
1377	int ret;
1378
1379	if (phy > RTL8366RB_PHY_NO_MAX)
1380		return -EINVAL;
1381
1382	ret = regmap_write(smi->map, RTL8366RB_PHY_ACCESS_CTRL_REG,
1383			   RTL8366RB_PHY_CTRL_READ);
1384	if (ret)
1385		return ret;
1386
1387	reg = 0x8000 | (1 << (phy + RTL8366RB_PHY_NO_OFFSET)) | regnum;
1388
1389	ret = regmap_write(smi->map, reg, 0);
1390	if (ret) {
1391		dev_err(smi->dev,
1392			"failed to write PHY%d reg %04x @ %04x, ret %d\n",
1393			phy, regnum, reg, ret);
1394		return ret;
1395	}
1396
1397	ret = regmap_read(smi->map, RTL8366RB_PHY_ACCESS_DATA_REG, &val);
1398	if (ret)
1399		return ret;
1400
1401	dev_dbg(smi->dev, "read PHY%d register 0x%04x @ %08x, val <- %04x\n",
1402		phy, regnum, reg, val);
1403
1404	return val;
1405}
1406
1407static int rtl8366rb_phy_write(struct realtek_smi *smi, int phy, int regnum,
1408			       u16 val)
1409{
1410	u32 reg;
1411	int ret;
1412
1413	if (phy > RTL8366RB_PHY_NO_MAX)
1414		return -EINVAL;
1415
1416	ret = regmap_write(smi->map, RTL8366RB_PHY_ACCESS_CTRL_REG,
1417			   RTL8366RB_PHY_CTRL_WRITE);
1418	if (ret)
1419		return ret;
1420
1421	reg = 0x8000 | (1 << (phy + RTL8366RB_PHY_NO_OFFSET)) | regnum;
1422
1423	dev_dbg(smi->dev, "write PHY%d register 0x%04x @ %04x, val -> %04x\n",
1424		phy, regnum, reg, val);
1425
1426	ret = regmap_write(smi->map, reg, val);
1427	if (ret)
1428		return ret;
1429
1430	return 0;
1431}
1432
1433static int rtl8366rb_reset_chip(struct realtek_smi *smi)
1434{
1435	int timeout = 10;
1436	u32 val;
1437	int ret;
1438
1439	realtek_smi_write_reg_noack(smi, RTL8366RB_RESET_CTRL_REG,
1440				    RTL8366RB_CHIP_CTRL_RESET_HW);
1441	do {
1442		usleep_range(20000, 25000);
1443		ret = regmap_read(smi->map, RTL8366RB_RESET_CTRL_REG, &val);
1444		if (ret)
1445			return ret;
1446
1447		if (!(val & RTL8366RB_CHIP_CTRL_RESET_HW))
1448			break;
1449	} while (--timeout);
1450
1451	if (!timeout) {
1452		dev_err(smi->dev, "timeout waiting for the switch to reset\n");
1453		return -EIO;
1454	}
1455
1456	return 0;
1457}
1458
1459static int rtl8366rb_detect(struct realtek_smi *smi)
1460{
1461	struct device *dev = smi->dev;
1462	int ret;
1463	u32 val;
1464
1465	/* Detect device */
1466	ret = regmap_read(smi->map, 0x5c, &val);
1467	if (ret) {
1468		dev_err(dev, "can't get chip ID (%d)\n", ret);
1469		return ret;
1470	}
1471
1472	switch (val) {
1473	case 0x6027:
1474		dev_info(dev, "found an RTL8366S switch\n");
1475		dev_err(dev, "this switch is not yet supported, submit patches!\n");
1476		return -ENODEV;
1477	case 0x5937:
1478		dev_info(dev, "found an RTL8366RB switch\n");
1479		smi->cpu_port = RTL8366RB_PORT_NUM_CPU;
1480		smi->num_ports = RTL8366RB_NUM_PORTS;
1481		smi->num_vlan_mc = RTL8366RB_NUM_VLANS;
1482		smi->mib_counters = rtl8366rb_mib_counters;
1483		smi->num_mib_counters = ARRAY_SIZE(rtl8366rb_mib_counters);
1484		break;
1485	default:
1486		dev_info(dev, "found an Unknown Realtek switch (id=0x%04x)\n",
1487			 val);
1488		break;
1489	}
1490
1491	ret = rtl8366rb_reset_chip(smi);
1492	if (ret)
1493		return ret;
1494
1495	return 0;
1496}
1497
1498static const struct dsa_switch_ops rtl8366rb_switch_ops = {
1499	.get_tag_protocol = rtl8366_get_tag_protocol,
1500	.setup = rtl8366rb_setup,
1501	.phylink_mac_link_up = rtl8366rb_mac_link_up,
1502	.phylink_mac_link_down = rtl8366rb_mac_link_down,
1503	.get_strings = rtl8366_get_strings,
1504	.get_ethtool_stats = rtl8366_get_ethtool_stats,
1505	.get_sset_count = rtl8366_get_sset_count,
1506	.port_vlan_filtering = rtl8366_vlan_filtering,
1507	.port_vlan_prepare = rtl8366_vlan_prepare,
1508	.port_vlan_add = rtl8366_vlan_add,
1509	.port_vlan_del = rtl8366_vlan_del,
1510	.port_enable = rtl8366rb_port_enable,
1511	.port_disable = rtl8366rb_port_disable,
1512	.port_change_mtu = rtl8366rb_change_mtu,
1513	.port_max_mtu = rtl8366rb_max_mtu,
1514};
1515
1516static const struct realtek_smi_ops rtl8366rb_smi_ops = {
1517	.detect		= rtl8366rb_detect,
1518	.get_vlan_mc	= rtl8366rb_get_vlan_mc,
1519	.set_vlan_mc	= rtl8366rb_set_vlan_mc,
1520	.get_vlan_4k	= rtl8366rb_get_vlan_4k,
1521	.set_vlan_4k	= rtl8366rb_set_vlan_4k,
1522	.get_mc_index	= rtl8366rb_get_mc_index,
1523	.set_mc_index	= rtl8366rb_set_mc_index,
1524	.get_mib_counter = rtl8366rb_get_mib_counter,
1525	.is_vlan_valid	= rtl8366rb_is_vlan_valid,
1526	.enable_vlan	= rtl8366rb_enable_vlan,
1527	.enable_vlan4k	= rtl8366rb_enable_vlan4k,
1528	.phy_read	= rtl8366rb_phy_read,
1529	.phy_write	= rtl8366rb_phy_write,
1530};
1531
1532const struct realtek_smi_variant rtl8366rb_variant = {
1533	.ds_ops = &rtl8366rb_switch_ops,
1534	.ops = &rtl8366rb_smi_ops,
1535	.clk_delay = 10,
1536	.cmd_read = 0xa9,
1537	.cmd_write = 0xa8,
1538	.chip_data_sz = sizeof(struct rtl8366rb),
1539};
1540EXPORT_SYMBOL_GPL(rtl8366rb_variant);
1541