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  */
318 struct rtl8366rb {
319 	unsigned int max_mtu[RTL8366RB_NUM_PORTS];
320 };
321 
322 static 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 
rtl8366rb_get_mib_counter(struct realtek_smi * smi,int port,struct rtl8366_mib_counter * mib,u64 * mibvalue)358 static 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 
rtl8366rb_get_irqmask(struct irq_data * d)400 static 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 
rtl8366rb_mask_irq(struct irq_data * d)415 static 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 
rtl8366rb_unmask_irq(struct irq_data * d)426 static 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 
rtl8366rb_irq(int irq,void * data)438 static 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 
470 static struct irq_chip rtl8366rb_irq_chip = {
471 	.name = "RTL8366RB",
472 	.irq_mask = rtl8366rb_mask_irq,
473 	.irq_unmask = rtl8366rb_unmask_irq,
474 };
475 
rtl8366rb_irq_map(struct irq_domain * domain,unsigned int irq,irq_hw_number_t hwirq)476 static 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 
rtl8366rb_irq_unmap(struct irq_domain * d,unsigned int irq)487 static 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 
494 static 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 
rtl8366rb_setup_cascaded_irq(struct realtek_smi * smi)500 static 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 
571 out_put_node:
572 	of_node_put(intc);
573 	return ret;
574 }
575 
rtl8366rb_set_addr(struct realtek_smi * smi)576 static 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 */
605 static 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 */
638 static 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 */
653 static 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 */
668 static 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" */
689 static 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" */
702 static 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  */
713 static 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 
rtl8366rb_setup(struct dsa_switch * ds)719 static 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 
rtl8366_get_tag_protocol(struct dsa_switch * ds,int port,enum dsa_tag_protocol mp)978 static 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 
986 static void
rtl8366rb_mac_link_up(struct dsa_switch * ds,int port,unsigned int mode,phy_interface_t interface,struct phy_device * phydev,int speed,int duplex,bool tx_pause,bool rx_pause)987 rtl8366rb_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 
1024 static void
rtl8366rb_mac_link_down(struct dsa_switch * ds,int port,unsigned int mode,phy_interface_t interface)1025 rtl8366rb_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 
rb8366rb_set_port_led(struct realtek_smi * smi,int port,bool enable)1045 static 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 
1091 static int
rtl8366rb_port_enable(struct dsa_switch * ds,int port,struct phy_device * phy)1092 rtl8366rb_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 
1108 static void
rtl8366rb_port_disable(struct dsa_switch * ds,int port)1109 rtl8366rb_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 
rtl8366rb_change_mtu(struct dsa_switch * ds,int port,int new_mtu)1123 static 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 
rtl8366rb_max_mtu(struct dsa_switch * ds,int port)1165 static 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 
rtl8366rb_get_vlan_4k(struct realtek_smi * smi,u32 vid,struct rtl8366_vlan_4k * vlan4k)1173 static 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 
rtl8366rb_set_vlan_4k(struct realtek_smi * smi,const struct rtl8366_vlan_4k * vlan4k)1214 static 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 
rtl8366rb_get_vlan_mc(struct realtek_smi * smi,u32 index,struct rtl8366_vlan_mc * vlanmc)1248 static 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 
rtl8366rb_set_vlan_mc(struct realtek_smi * smi,u32 index,const struct rtl8366_vlan_mc * vlanmc)1279 static 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 
rtl8366rb_get_mc_index(struct realtek_smi * smi,int port,int * val)1313 static 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 
rtl8366rb_set_mc_index(struct realtek_smi * smi,int port,int index)1332 static 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 
rtl8366rb_is_vlan_valid(struct realtek_smi * smi,unsigned int vlan)1344 static bool rtl8366rb_is_vlan_valid(struct realtek_smi *smi, unsigned int vlan)
1345 {
1346 	unsigned int max = RTL8366RB_NUM_VLANS;
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 
rtl8366rb_enable_vlan(struct realtek_smi * smi,bool enable)1357 static 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 
rtl8366rb_enable_vlan4k(struct realtek_smi * smi,bool enable)1365 static 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 
rtl8366rb_phy_read(struct realtek_smi * smi,int phy,int regnum)1373 static 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 
rtl8366rb_phy_write(struct realtek_smi * smi,int phy,int regnum,u16 val)1407 static 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 
rtl8366rb_reset_chip(struct realtek_smi * smi)1433 static 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 
rtl8366rb_detect(struct realtek_smi * smi)1459 static 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 
1498 static 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 
1516 static 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 
1532 const 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 };
1540 EXPORT_SYMBOL_GPL(rtl8366rb_variant);
1541