1e78d499992b82ddcdc4a27777e825473d2295be
[openwrt/staging/dedeckeh.git] / target / linux / mediatek / patches-4.4 / 0057-net-mediatek-out-of-tree-fixes.patch
1 From cee958b55f35f953481c2ddf9609dbd018ef5979 Mon Sep 17 00:00:00 2001
2 From: John Crispin <blogic@openwrt.org>
3 Date: Mon, 21 Mar 2016 16:36:22 +0100
4 Subject: [PATCH 57/66] net: mediatek: out of tree fixes
5
6 Signed-off-by: John Crispin <blogic@openwrt.org>
7 ---
8 arch/arm/boot/dts/mt7623-evb.dts | 1 -
9 arch/arm/boot/dts/mt7623.dtsi | 40 +-
10 drivers/net/ethernet/mediatek/Makefile | 2 +-
11 drivers/net/ethernet/mediatek/gsw_mt7620.h | 250 +++++++
12 drivers/net/ethernet/mediatek/gsw_mt7623.c | 1058 +++++++++++++++++++++++++++
13 drivers/net/ethernet/mediatek/mt7530.c | 808 ++++++++++++++++++++
14 drivers/net/ethernet/mediatek/mt7530.h | 20 +
15 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 41 +-
16 drivers/net/ethernet/mediatek/mtk_eth_soc.h | 5 +
17 9 files changed, 2202 insertions(+), 23 deletions(-)
18 create mode 100644 drivers/net/ethernet/mediatek/gsw_mt7620.h
19 create mode 100644 drivers/net/ethernet/mediatek/gsw_mt7623.c
20 create mode 100644 drivers/net/ethernet/mediatek/mt7530.c
21 create mode 100644 drivers/net/ethernet/mediatek/mt7530.h
22
23 diff --git a/arch/arm/boot/dts/mt7623-evb.dts b/arch/arm/boot/dts/mt7623-evb.dts
24 index 5e9381d..bc2b3f1 100644
25 --- a/arch/arm/boot/dts/mt7623-evb.dts
26 +++ b/arch/arm/boot/dts/mt7623-evb.dts
27 @@ -425,7 +425,6 @@
28 &usb1 {
29 vusb33-supply = <&mt6323_vusb_reg>;
30 vbus-supply = <&usb_p1_vbus>;
31 -// mediatek,wakeup-src = <1>;
32 status = "okay";
33 };
34
35 diff --git a/arch/arm/boot/dts/mt7623.dtsi b/arch/arm/boot/dts/mt7623.dtsi
36 index ec19283..0c65045 100644
37 --- a/arch/arm/boot/dts/mt7623.dtsi
38 +++ b/arch/arm/boot/dts/mt7623.dtsi
39 @@ -452,23 +452,30 @@
40 };
41
42 ethsys: syscon@1b000000 {
43 - #address-cells = <1>;
44 - #size-cells = <1>;
45 compatible = "mediatek,mt2701-ethsys", "syscon";
46 reg = <0 0x1b000000 0 0x1000>;
47 + #reset-cells = <1>;
48 #clock-cells = <1>;
49 };
50
51 eth: ethernet@1b100000 {
52 compatible = "mediatek,mt7623-eth";
53 - reg = <0 0x1b100000 0 0x10000>;
54 + reg = <0 0x1b100000 0 0x20000>;
55
56 - clocks = <&topckgen CLK_TOP_ETHIF_SEL>;
57 - clock-names = "ethif";
58 + clocks = <&topckgen CLK_TOP_ETHIF_SEL>,
59 + <&ethsys CLK_ETHSYS_ESW>,
60 + <&ethsys CLK_ETHSYS_GP2>,
61 + <&ethsys CLK_ETHSYS_GP1>;
62 + clock-names = "ethif", "esw", "gp2", "gp1";
63 interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW>;
64 power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
65
66 + resets = <&ethsys 6>;
67 + reset-names = "eth";
68 +
69 mediatek,ethsys = <&ethsys>;
70 + mediatek,pctl = <&syscfg_pctl_a>;
71 +
72 mediatek,switch = <&gsw>;
73
74 #address-cells = <1>;
75 @@ -480,6 +487,8 @@
76 compatible = "mediatek,eth-mac";
77 reg = <0>;
78
79 + phy-handle = <&phy4>;
80 +
81 status = "disabled";
82 };
83
84 @@ -487,6 +496,7 @@
85 compatible = "mediatek,eth-mac";
86 reg = <1>;
87
88 + phy-handle = <&phy5>;
89 status = "disabled";
90 };
91
92 @@ -494,6 +504,16 @@
93 #address-cells = <1>;
94 #size-cells = <0>;
95
96 + phy4: ethernet-phy@4 {
97 + reg = <4>;
98 + phy-mode = "rgmii";
99 + };
100 +
101 + phy5: ethernet-phy@5 {
102 + reg = <5>;
103 + phy-mode = "rgmii";
104 + };
105 +
106 phy1f: ethernet-phy@1f {
107 reg = <0x1f>;
108 phy-mode = "rgmii";
109 @@ -503,14 +523,12 @@
110
111 gsw: switch@1b100000 {
112 compatible = "mediatek,mt7623-gsw";
113 - reg = <0 0x1b110000 0 0x300000>;
114 interrupt-parent = <&pio>;
115 interrupts = <168 IRQ_TYPE_EDGE_RISING>;
116 - clocks = <&apmixedsys CLK_APMIXED_TRGPLL>,
117 - <&ethsys CLK_ETHSYS_ESW>,
118 - <&ethsys CLK_ETHSYS_GP2>,
119 - <&ethsys CLK_ETHSYS_GP1>;
120 - clock-names = "trgpll", "esw", "gp2", "gp1";
121 + resets = <&ethsys 2>;
122 + reset-names = "eth";
123 + clocks = <&apmixedsys CLK_APMIXED_TRGPLL>;
124 + clock-names = "trgpll";
125 mt7530-supply = <&mt6323_vpa_reg>;
126 mediatek,pctl-regmap = <&syscfg_pctl_a>;
127 mediatek,ethsys = <&ethsys>;
128 diff --git a/drivers/net/ethernet/mediatek/Makefile b/drivers/net/ethernet/mediatek/Makefile
129 index aa3f1c8..82001c4 100644
130 --- a/drivers/net/ethernet/mediatek/Makefile
131 +++ b/drivers/net/ethernet/mediatek/Makefile
132 @@ -2,4 +2,4 @@
133 # Makefile for the Mediatek SoCs built-in ethernet macs
134 #
135
136 -obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth_soc.o
137 +obj-$(CONFIG_NET_MEDIATEK_SOC) += mt7530.o gsw_mt7623.o mtk_eth_soc.o
138 diff --git a/drivers/net/ethernet/mediatek/gsw_mt7620.h b/drivers/net/ethernet/mediatek/gsw_mt7620.h
139 new file mode 100644
140 index 0000000..7013803
141 --- /dev/null
142 +++ b/drivers/net/ethernet/mediatek/gsw_mt7620.h
143 @@ -0,0 +1,250 @@
144 +/* This program is free software; you can redistribute it and/or modify
145 + * it under the terms of the GNU General Public License as published by
146 + * the Free Software Foundation; version 2 of the License
147 + *
148 + * This program is distributed in the hope that it will be useful,
149 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
150 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
151 + * GNU General Public License for more details.
152 + *
153 + * Copyright (C) 2009-2016 John Crispin <blogic@openwrt.org>
154 + * Copyright (C) 2009-2016 Felix Fietkau <nbd@openwrt.org>
155 + * Copyright (C) 2013-2016 Michael Lee <igvtee@gmail.com>
156 + */
157 +
158 +#ifndef _RALINK_GSW_MT7620_H__
159 +#define _RALINK_GSW_MT7620_H__
160 +
161 +#define GSW_REG_PHY_TIMEOUT (5 * HZ)
162 +
163 +#define MT7620_GSW_REG_PIAC 0x0004
164 +
165 +#define GSW_NUM_VLANS 16
166 +#define GSW_NUM_VIDS 4096
167 +#define GSW_NUM_PORTS 7
168 +#define GSW_PORT6 6
169 +
170 +#define GSW_MDIO_ACCESS BIT(31)
171 +#define GSW_MDIO_READ BIT(19)
172 +#define GSW_MDIO_WRITE BIT(18)
173 +#define GSW_MDIO_START BIT(16)
174 +#define GSW_MDIO_ADDR_SHIFT 20
175 +#define GSW_MDIO_REG_SHIFT 25
176 +
177 +#define GSW_REG_PORT_PMCR(x) (0x3000 + (x * 0x100))
178 +#define GSW_REG_PORT_STATUS(x) (0x3008 + (x * 0x100))
179 +#define GSW_REG_SMACCR0 0x3fE4
180 +#define GSW_REG_SMACCR1 0x3fE8
181 +#define GSW_REG_CKGCR 0x3ff0
182 +
183 +#define GSW_REG_IMR 0x7008
184 +#define GSW_REG_ISR 0x700c
185 +#define GSW_REG_GPC1 0x7014
186 +
187 +#define SYSC_REG_CHIP_REV_ID 0x0c
188 +#define SYSC_REG_CFG 0x10
189 +#define SYSC_REG_CFG1 0x14
190 +#define RST_CTRL_MCM BIT(2)
191 +#define SYSC_PAD_RGMII2_MDIO 0x58
192 +#define SYSC_GPIO_MODE 0x60
193 +
194 +#define PORT_IRQ_ST_CHG 0x7f
195 +
196 +#define MT7621_ESW_PHY_POLLING 0x0000
197 +#define MT7620_ESW_PHY_POLLING 0x7000
198 +
199 +#define PMCR_IPG BIT(18)
200 +#define PMCR_MAC_MODE BIT(16)
201 +#define PMCR_FORCE BIT(15)
202 +#define PMCR_TX_EN BIT(14)
203 +#define PMCR_RX_EN BIT(13)
204 +#define PMCR_BACKOFF BIT(9)
205 +#define PMCR_BACKPRES BIT(8)
206 +#define PMCR_RX_FC BIT(5)
207 +#define PMCR_TX_FC BIT(4)
208 +#define PMCR_SPEED(_x) (_x << 2)
209 +#define PMCR_DUPLEX BIT(1)
210 +#define PMCR_LINK BIT(0)
211 +
212 +#define PHY_AN_EN BIT(31)
213 +#define PHY_PRE_EN BIT(30)
214 +#define PMY_MDC_CONF(_x) ((_x & 0x3f) << 24)
215 +
216 +/* ethernet subsystem config register */
217 +#define ETHSYS_SYSCFG0 0x14
218 +/* ethernet subsystem clock register */
219 +#define ETHSYS_CLKCFG0 0x2c
220 +#define ETHSYS_TRGMII_CLK_SEL362_5 BIT(11)
221 +
222 +/* p5 RGMII wrapper TX clock control register */
223 +#define MT7530_P5RGMIITXCR 0x7b04
224 +/* p5 RGMII wrapper RX clock control register */
225 +#define MT7530_P5RGMIIRXCR 0x7b00
226 +/* TRGMII TDX ODT registers */
227 +#define MT7530_TRGMII_TD0_ODT 0x7a54
228 +#define MT7530_TRGMII_TD1_ODT 0x7a5c
229 +#define MT7530_TRGMII_TD2_ODT 0x7a64
230 +#define MT7530_TRGMII_TD3_ODT 0x7a6c
231 +#define MT7530_TRGMII_TD4_ODT 0x7a74
232 +#define MT7530_TRGMII_TD5_ODT 0x7a7c
233 +/* TRGMII TCK ctrl register */
234 +#define MT7530_TRGMII_TCK_CTRL 0x7a78
235 +/* TRGMII Tx ctrl register */
236 +#define MT7530_TRGMII_TXCTRL 0x7a40
237 +/* port 6 extended control register */
238 +#define MT7530_P6ECR 0x7830
239 +/* IO driver control register */
240 +#define MT7530_IO_DRV_CR 0x7810
241 +/* top signal control register */
242 +#define MT7530_TOP_SIG_CTRL 0x7808
243 +/* modified hwtrap register */
244 +#define MT7530_MHWTRAP 0x7804
245 +/* hwtrap status register */
246 +#define MT7530_HWTRAP 0x7800
247 +/* status interrupt register */
248 +#define MT7530_SYS_INT_STS 0x700c
249 +/* system nterrupt register */
250 +#define MT7530_SYS_INT_EN 0x7008
251 +/* system control register */
252 +#define MT7530_SYS_CTRL 0x7000
253 +/* port MAC status register */
254 +#define MT7530_PMSR_P(x) (0x3008 + (x * 0x100))
255 +/* port MAC control register */
256 +#define MT7530_PMCR_P(x) (0x3000 + (x * 0x100))
257 +
258 +#define MT7621_XTAL_SHIFT 6
259 +#define MT7621_XTAL_MASK 0x7
260 +#define MT7621_XTAL_25 6
261 +#define MT7621_XTAL_40 3
262 +#define MT7621_MDIO_DRV_MASK (3 << 4)
263 +#define MT7621_GE1_MODE_MASK (3 << 12)
264 +
265 +#define TRGMII_TXCTRL_TXC_INV BIT(30)
266 +#define P6ECR_INTF_MODE_RGMII BIT(1)
267 +#define P5RGMIIRXCR_C_ALIGN BIT(8)
268 +#define P5RGMIIRXCR_DELAY_2 BIT(1)
269 +#define P5RGMIITXCR_DELAY_2 (BIT(8) | BIT(2))
270 +
271 +/* TOP_SIG_CTRL bits */
272 +#define TOP_SIG_CTRL_NORMAL (BIT(17) | BIT(16))
273 +
274 +/* MHWTRAP bits */
275 +#define MHWTRAP_MANUAL BIT(16)
276 +#define MHWTRAP_P5_MAC_SEL BIT(13)
277 +#define MHWTRAP_P6_DIS BIT(8)
278 +#define MHWTRAP_P5_RGMII_MODE BIT(7)
279 +#define MHWTRAP_P5_DIS BIT(6)
280 +#define MHWTRAP_PHY_ACCESS BIT(5)
281 +
282 +/* HWTRAP bits */
283 +#define HWTRAP_XTAL_SHIFT 9
284 +#define HWTRAP_XTAL_MASK 0x3
285 +
286 +/* SYS_CTRL bits */
287 +#define SYS_CTRL_SW_RST BIT(1)
288 +#define SYS_CTRL_REG_RST BIT(0)
289 +
290 +/* PMCR bits */
291 +#define PMCR_IFG_XMIT_96 BIT(18)
292 +#define PMCR_MAC_MODE BIT(16)
293 +#define PMCR_FORCE_MODE BIT(15)
294 +#define PMCR_TX_EN BIT(14)
295 +#define PMCR_RX_EN BIT(13)
296 +#define PMCR_BACK_PRES_EN BIT(9)
297 +#define PMCR_BACKOFF_EN BIT(8)
298 +#define PMCR_TX_FC_EN BIT(5)
299 +#define PMCR_RX_FC_EN BIT(4)
300 +#define PMCR_FORCE_SPEED_1000 BIT(3)
301 +#define PMCR_FORCE_FDX BIT(1)
302 +#define PMCR_FORCE_LNK BIT(0)
303 +#define PMCR_FIXED_LINK (PMCR_IFG_XMIT_96 | PMCR_MAC_MODE | \
304 + PMCR_FORCE_MODE | PMCR_TX_EN | PMCR_RX_EN | \
305 + PMCR_BACK_PRES_EN | PMCR_BACKOFF_EN | \
306 + PMCR_FORCE_SPEED_1000 | PMCR_FORCE_FDX | \
307 + PMCR_FORCE_LNK)
308 +
309 +#define PMCR_FIXED_LINK_FC (PMCR_FIXED_LINK | \
310 + PMCR_TX_FC_EN | PMCR_RX_FC_EN)
311 +
312 +/* TRGMII control registers */
313 +#define GSW_INTF_MODE 0x390
314 +#define GSW_TRGMII_TD0_ODT 0x354
315 +#define GSW_TRGMII_TD1_ODT 0x35c
316 +#define GSW_TRGMII_TD2_ODT 0x364
317 +#define GSW_TRGMII_TD3_ODT 0x36c
318 +#define GSW_TRGMII_TXCTL_ODT 0x374
319 +#define GSW_TRGMII_TCK_ODT 0x37c
320 +#define GSW_TRGMII_RCK_CTRL 0x300
321 +
322 +#define INTF_MODE_TRGMII BIT(1)
323 +#define TRGMII_RCK_CTRL_RX_RST BIT(31)
324 +
325 +
326 +/* possible XTAL speed */
327 +#define MT7623_XTAL_40 0
328 +#define MT7623_XTAL_20 1
329 +#define MT7623_XTAL_25 3
330 +
331 +/* GPIO port control registers */
332 +#define GPIO_OD33_CTRL8 0x4c0
333 +#define GPIO_BIAS_CTRL 0xed0
334 +#define GPIO_DRV_SEL10 0xf00
335 +
336 +/* on MT7620 the functio of port 4 can be software configured */
337 +enum {
338 + PORT4_EPHY = 0,
339 + PORT4_EXT,
340 +};
341 +
342 +/* struct mt7620_gsw - the structure that holds the SoC specific data
343 + * @dev: The Device struct
344 + * @base: The base address
345 + * @piac_offset: The PIAC base may change depending on SoC
346 + * @irq: The IRQ we are using
347 + * @port4: The port4 mode on MT7620
348 + * @autopoll: Is MDIO autopolling enabled
349 + * @ethsys: The ethsys register map
350 + * @pctl: The pin control register map
351 + * @clk_trgpll: The trgmii pll clock
352 + */
353 +struct mt7620_gsw {
354 + struct mtk_eth *eth;
355 + struct device *dev;
356 + void __iomem *base;
357 + u32 piac_offset;
358 + int irq;
359 + int port4;
360 + unsigned long int autopoll;
361 +
362 + struct regmap *ethsys;
363 + struct regmap *pctl;
364 +
365 + struct clk *clk_trgpll;
366 +
367 + int trgmii_force;
368 +};
369 +
370 +/* switch register I/O wrappers */
371 +void mtk_switch_w32(struct mt7620_gsw *gsw, u32 val, unsigned reg);
372 +u32 mtk_switch_r32(struct mt7620_gsw *gsw, unsigned reg);
373 +
374 +/* the callback used by the driver core to bringup the switch */
375 +int mtk_gsw_init(struct mtk_eth *eth);
376 +
377 +/* MDIO access wrappers */
378 +int mt7620_mdio_write(struct mii_bus *bus, int phy_addr, int phy_reg, u16 val);
379 +int mt7620_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg);
380 +void mt7620_mdio_link_adjust(struct mtk_eth *eth, int port);
381 +int mt7620_has_carrier(struct mtk_eth *eth);
382 +void mt7620_print_link_state(struct mtk_eth *eth, int port, int link,
383 + int speed, int duplex);
384 +void mt7530_mdio_w32(struct mt7620_gsw *gsw, u32 reg, u32 val);
385 +u32 mt7530_mdio_r32(struct mt7620_gsw *gsw, u32 reg);
386 +void mt7530_mdio_m32(struct mt7620_gsw *gsw, u32 mask, u32 set, u32 reg);
387 +
388 +u32 _mtk_mdio_write(struct mtk_eth *eth, u32 phy_addr,
389 + u32 phy_register, u32 write_data);
390 +u32 _mtk_mdio_read(struct mtk_eth *eth, int phy_addr, int phy_reg);
391 +void mt7620_handle_carrier(struct mtk_eth *eth);
392 +
393 +#endif
394 diff --git a/drivers/net/ethernet/mediatek/gsw_mt7623.c b/drivers/net/ethernet/mediatek/gsw_mt7623.c
395 new file mode 100644
396 index 0000000..4e486af
397 --- /dev/null
398 +++ b/drivers/net/ethernet/mediatek/gsw_mt7623.c
399 @@ -0,0 +1,1058 @@
400 +/* This program is free software; you can redistribute it and/or modify
401 + * it under the terms of the GNU General Public License as published by
402 + * the Free Software Foundation; version 2 of the License
403 + *
404 + * This program is distributed in the hope that it will be useful,
405 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
406 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
407 + * GNU General Public License for more details.
408 + *
409 + * Copyright (C) 2009-2016 John Crispin <blogic@openwrt.org>
410 + * Copyright (C) 2009-2016 Felix Fietkau <nbd@openwrt.org>
411 + * Copyright (C) 2013-2016 Michael Lee <igvtee@gmail.com>
412 + */
413 +
414 +#include <linux/module.h>
415 +#include <linux/kernel.h>
416 +#include <linux/types.h>
417 +#include <linux/platform_device.h>
418 +#include <linux/of_device.h>
419 +#include <linux/of_irq.h>
420 +#include <linux/of_gpio.h>
421 +#include <linux/clk.h>
422 +#include <linux/mfd/syscon.h>
423 +#include <linux/regulator/consumer.h>
424 +#include <linux/pm_runtime.h>
425 +#include <linux/regmap.h>
426 +#include <linux/reset.h>
427 +#include <linux/mii.h>
428 +#include <linux/interrupt.h>
429 +#include <linux/netdevice.h>
430 +#include <linux/dma-mapping.h>
431 +#include <linux/phy.h>
432 +#include <linux/ethtool.h>
433 +#include <linux/version.h>
434 +#include <linux/atomic.h>
435 +
436 +#include "mtk_eth_soc.h"
437 +#include "gsw_mt7620.h"
438 +#include "mt7530.h"
439 +
440 +#define ETHSYS_CLKCFG0 0x2c
441 +#define ETHSYS_TRGMII_CLK_SEL362_5 BIT(11)
442 +
443 +void mt7530_mdio_w32(struct mt7620_gsw *gsw, u32 reg, u32 val)
444 +{
445 + _mtk_mdio_write(gsw->eth, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
446 + _mtk_mdio_write(gsw->eth, 0x1f, (reg >> 2) & 0xf, val & 0xffff);
447 + _mtk_mdio_write(gsw->eth, 0x1f, 0x10, val >> 16);
448 +}
449 +
450 +u32 mt7530_mdio_r32(struct mt7620_gsw *gsw, u32 reg)
451 +{
452 + u16 high, low;
453 +
454 + _mtk_mdio_write(gsw->eth, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
455 + low = _mtk_mdio_read(gsw->eth, 0x1f, (reg >> 2) & 0xf);
456 + high = _mtk_mdio_read(gsw->eth, 0x1f, 0x10);
457 +
458 + return (high << 16) | (low & 0xffff);
459 +}
460 +
461 +void mt7530_mdio_m32(struct mt7620_gsw *gsw, u32 mask, u32 set, u32 reg)
462 +{
463 + u32 val = mt7530_mdio_r32(gsw, reg);
464 +
465 + val &= mask;
466 + val |= set;
467 + mt7530_mdio_w32(gsw, reg, val);
468 +}
469 +
470 +void mtk_switch_w32(struct mt7620_gsw *gsw, u32 val, unsigned reg)
471 +{
472 + mtk_w32(gsw->eth, val, reg + 0x10000);
473 +}
474 +
475 +u32 mtk_switch_r32(struct mt7620_gsw *gsw, unsigned reg)
476 +{
477 + return mtk_r32(gsw->eth, reg + 0x10000);
478 +}
479 +
480 +void mtk_switch_m32(struct mt7620_gsw *gsw, u32 mask, u32 set, unsigned reg)
481 +{
482 + u32 val = mtk_switch_r32(gsw, reg);
483 +
484 + val &= mask;
485 + val |= set;
486 +
487 + mtk_switch_w32(gsw, val, reg);
488 +}
489 +
490 +int mt7623_gsw_config(struct mtk_eth *eth)
491 +{
492 + if (eth->mii_bus && eth->mii_bus->phy_map[0x1f])
493 + mt7530_probe(eth->dev, NULL, eth->mii_bus, 1);
494 +
495 + return 0;
496 +}
497 +
498 +static irqreturn_t gsw_interrupt_mt7623(int irq, void *_eth)
499 +{
500 + struct mtk_eth *eth = (struct mtk_eth *)_eth;
501 + struct mt7620_gsw *gsw = (struct mt7620_gsw *)eth->sw_priv;
502 + u32 reg, i;
503 +
504 + reg = mt7530_mdio_r32(gsw, 0x700c);
505 +
506 + for (i = 0; i < 5; i++)
507 + if (reg & BIT(i)) {
508 + unsigned int link;
509 +
510 + link = mt7530_mdio_r32(gsw,
511 + 0x3008 + (i * 0x100)) & 0x1;
512 +
513 + if (link)
514 + dev_info(gsw->dev,
515 + "port %d link up\n", i);
516 + else
517 + dev_info(gsw->dev,
518 + "port %d link down\n", i);
519 + }
520 +
521 +// mt7620_handle_carrier(eth);
522 + mt7530_mdio_w32(gsw, 0x700c, 0x1f);
523 +
524 + return IRQ_HANDLED;
525 +}
526 +
527 +static void wait_loop(struct mt7620_gsw *gsw)
528 +{
529 + int i;
530 + int read_data;
531 +
532 + for (i = 0; i < 320; i = i + 1)
533 + read_data = mtk_switch_r32(gsw, 0x610);
534 +}
535 +
536 +static void trgmii_calibration_7623(struct mt7620_gsw *gsw)
537 +{
538 +
539 + unsigned int tap_a[5] = { 0, 0, 0, 0, 0 }; /* minumum delay for all correct */
540 + unsigned int tap_b[5] = { 0, 0, 0, 0, 0 }; /* maximum delay for all correct */
541 + unsigned int final_tap[5];
542 + unsigned int rxc_step_size;
543 + unsigned int rxd_step_size;
544 + unsigned int read_data;
545 + unsigned int tmp;
546 + unsigned int rd_wd;
547 + int i;
548 + unsigned int err_cnt[5];
549 + unsigned int init_toggle_data;
550 + unsigned int err_flag[5];
551 + unsigned int err_total_flag;
552 + unsigned int training_word;
553 + unsigned int rd_tap;
554 + u32 val;
555 +
556 + u32 TRGMII_7623_base;
557 + u32 TRGMII_7623_RD_0;
558 + u32 TRGMII_RCK_CTRL;
559 +
560 + TRGMII_7623_base = 0x300; /* 0xFB110300 */
561 + TRGMII_7623_RD_0 = TRGMII_7623_base + 0x10;
562 + TRGMII_RCK_CTRL = TRGMII_7623_base;
563 + rxd_step_size = 0x1;
564 + rxc_step_size = 0x4;
565 + init_toggle_data = 0x00000055;
566 + training_word = 0x000000AC;
567 +
568 + /* RX clock gating in MT7623 */
569 + mtk_switch_m32(gsw, 0x3fffffff, 0, TRGMII_7623_base + 0x04);
570 +
571 + /* Assert RX reset in MT7623 */
572 + mtk_switch_m32(gsw, 0, 0x80000000, TRGMII_7623_base + 0x00);
573 +
574 + /* Set TX OE edge in MT7623 */
575 + mtk_switch_m32(gsw, 0, 0x00002000, TRGMII_7623_base + 0x78);
576 +
577 + /* Disable RX clock gating in MT7623 */
578 + mtk_switch_m32(gsw, 0, 0xC0000000, TRGMII_7623_base + 0x04);
579 +
580 + /* Release RX reset in MT7623 */
581 + mtk_switch_m32(gsw, 0x7fffffff, 0, TRGMII_7623_base);
582 +
583 + for (i = 0; i < 5; i++)
584 + mtk_switch_m32(gsw, 0, 0x80000000, TRGMII_7623_RD_0 + i * 8);
585 +
586 + pr_err("Enable Training Mode in MT7530\n");
587 + read_data = mt7530_mdio_r32(gsw, 0x7A40);
588 + read_data |= 0xC0000000;
589 + mt7530_mdio_w32(gsw, 0x7A40, read_data); /* Enable Training Mode in MT7530 */
590 + err_total_flag = 0;
591 + pr_err("Adjust RXC delay in MT7623\n");
592 + read_data = 0x0;
593 + while (err_total_flag == 0 && read_data != 0x68) {
594 + pr_err("2nd Enable EDGE CHK in MT7623\n");
595 + /* Enable EDGE CHK in MT7623 */
596 + for (i = 0; i < 5; i++)
597 + mtk_switch_m32(gsw, 0x4fffffff, 0x40000000, TRGMII_7623_RD_0 + i * 8);
598 +
599 + wait_loop(gsw);
600 + err_total_flag = 1;
601 + for (i = 0; i < 5; i++) {
602 + err_cnt[i] =
603 + mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8) >> 8;
604 + err_cnt[i] &= 0x0000000f;
605 + rd_wd = mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8) >> 16;
606 + rd_wd &= 0x000000ff;
607 + val = mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8);
608 + pr_err("ERR_CNT = %d, RD_WD =%x, TRGMII_7623_RD_0=%x\n",
609 + err_cnt[i], rd_wd, val);
610 + if (err_cnt[i] != 0) {
611 + err_flag[i] = 1;
612 + } else if (rd_wd != 0x55) {
613 + err_flag[i] = 1;
614 + } else {
615 + err_flag[i] = 0;
616 + }
617 + err_total_flag = err_flag[i] & err_total_flag;
618 + }
619 +
620 + pr_err("2nd Disable EDGE CHK in MT7623\n");
621 + /* Disable EDGE CHK in MT7623 */
622 + for (i = 0; i < 5; i++)
623 + mtk_switch_m32(gsw, 0x4fffffff, 0x40000000, TRGMII_7623_RD_0 + i * 8);
624 + wait_loop(gsw);
625 + pr_err("2nd Disable EDGE CHK in MT7623\n");
626 + /* Adjust RXC delay */
627 + /* RX clock gating in MT7623 */
628 + mtk_switch_m32(gsw, 0x3fffffff, 0, TRGMII_7623_base + 0x04);
629 + read_data = mtk_switch_r32(gsw, TRGMII_7623_base);
630 + if (err_total_flag == 0) {
631 + tmp = (read_data & 0x0000007f) + rxc_step_size;
632 + pr_err(" RXC delay = %d\n", tmp);
633 + read_data >>= 8;
634 + read_data &= 0xffffff80;
635 + read_data |= tmp;
636 + read_data <<= 8;
637 + read_data &= 0xffffff80;
638 + read_data |= tmp;
639 + mtk_switch_w32(gsw, read_data, TRGMII_7623_base);
640 + } else {
641 + tmp = (read_data & 0x0000007f) + 16;
642 + pr_err(" RXC delay = %d\n", tmp);
643 + read_data >>= 8;
644 + read_data &= 0xffffff80;
645 + read_data |= tmp;
646 + read_data <<= 8;
647 + read_data &= 0xffffff80;
648 + read_data |= tmp;
649 + mtk_switch_w32(gsw, read_data, TRGMII_7623_base);
650 + }
651 + read_data &= 0x000000ff;
652 +
653 + /* Disable RX clock gating in MT7623 */
654 + mtk_switch_m32(gsw, 0, 0xC0000000, TRGMII_7623_base + 0x04);
655 + for (i = 0; i < 5; i++)
656 + mtk_switch_m32(gsw, 0, 0x80000000, TRGMII_7623_RD_0 + i * 8);
657 + }
658 +
659 + /* Read RD_WD MT7623 */
660 + for (i = 0; i < 5; i++) {
661 + rd_tap = 0;
662 + while (err_flag[i] != 0 && rd_tap != 128) {
663 + /* Enable EDGE CHK in MT7623 */
664 + mtk_switch_m32(gsw, 0x4fffffff, 0x40000000, TRGMII_7623_RD_0 + i * 8);
665 + wait_loop(gsw);
666 +
667 + read_data = mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8);
668 + err_cnt[i] = (read_data >> 8) & 0x0000000f; /* Read MT7623 Errcnt */
669 + rd_wd = (read_data >> 16) & 0x000000ff;
670 + if (err_cnt[i] != 0 || rd_wd != 0x55) {
671 + err_flag[i] = 1;
672 + } else {
673 + err_flag[i] = 0;
674 + }
675 + /* Disable EDGE CHK in MT7623 */
676 + mtk_switch_m32(gsw, 0x4fffffff, 0x40000000, TRGMII_7623_RD_0 + i * 8);
677 + wait_loop(gsw);
678 + if (err_flag[i] != 0) {
679 + rd_tap = (read_data & 0x0000007f) + rxd_step_size; /* Add RXD delay in MT7623 */
680 + read_data = (read_data & 0xffffff80) | rd_tap;
681 + mtk_switch_w32(gsw, read_data,
682 + TRGMII_7623_RD_0 + i * 8);
683 + tap_a[i] = rd_tap;
684 + } else {
685 + rd_tap = (read_data & 0x0000007f) + 48;
686 + read_data = (read_data & 0xffffff80) | rd_tap;
687 + mtk_switch_w32(gsw, read_data,
688 + TRGMII_7623_RD_0 + i * 8);
689 + }
690 +
691 + }
692 + pr_err("MT7623 %dth bit Tap_a = %d\n", i, tap_a[i]);
693 + }
694 + /* pr_err("Last While Loop\n"); */
695 + for (i = 0; i < 5; i++) {
696 + while ((err_flag[i] == 0) && (rd_tap != 128)) {
697 + read_data = mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8);
698 + rd_tap = (read_data & 0x0000007f) + rxd_step_size; /* Add RXD delay in MT7623 */
699 + read_data = (read_data & 0xffffff80) | rd_tap;
700 + mtk_switch_w32(gsw, read_data, TRGMII_7623_RD_0 + i * 8);
701 + /* Enable EDGE CHK in MT7623 */
702 + val =
703 + mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8) | 0x40000000;
704 + val &= 0x4fffffff;
705 + mtk_switch_w32(gsw, val, TRGMII_7623_RD_0 + i * 8);
706 + wait_loop(gsw);
707 + read_data = mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8);
708 + err_cnt[i] = (read_data >> 8) & 0x0000000f; /* Read MT7623 Errcnt */
709 + rd_wd = (read_data >> 16) & 0x000000ff;
710 + if (err_cnt[i] != 0 || rd_wd != 0x55) {
711 + err_flag[i] = 1;
712 + } else {
713 + err_flag[i] = 0;
714 + }
715 +
716 + /* Disable EDGE CHK in MT7623 */
717 + mtk_switch_m32(gsw, 0x4fffffff, 0x40000000, TRGMII_7623_RD_0 + i * 8);
718 + wait_loop(gsw);
719 +
720 + }
721 +
722 + tap_b[i] = rd_tap; /* -rxd_step_size; */
723 + pr_err("MT7623 %dth bit Tap_b = %d\n", i, tap_b[i]);
724 + final_tap[i] = (tap_a[i] + tap_b[i]) / 2; /* Calculate RXD delay = (TAP_A + TAP_B)/2 */
725 + read_data = (read_data & 0xffffff80) | final_tap[i];
726 + mtk_switch_w32(gsw, read_data, TRGMII_7623_RD_0 + i * 8);
727 + }
728 +
729 + read_data = mt7530_mdio_r32(gsw, 0x7A40);
730 + read_data &= 0x3fffffff;
731 + mt7530_mdio_w32(gsw, 0x7A40, read_data);
732 +}
733 +
734 +static void trgmii_calibration_7530(struct mt7620_gsw *gsw)
735 +{
736 +
737 + unsigned int tap_a[5] = { 0, 0, 0, 0, 0 };
738 + unsigned int tap_b[5] = { 0, 0, 0, 0, 0 };
739 + unsigned int final_tap[5];
740 + unsigned int rxc_step_size;
741 + unsigned int rxd_step_size;
742 + unsigned int read_data;
743 + unsigned int tmp = 0;
744 + int i;
745 + unsigned int err_cnt[5];
746 + unsigned int rd_wd;
747 + unsigned int init_toggle_data;
748 + unsigned int err_flag[5];
749 + unsigned int err_total_flag;
750 + unsigned int training_word;
751 + unsigned int rd_tap;
752 +
753 + u32 TRGMII_7623_base;
754 + u32 TRGMII_7530_RD_0;
755 + u32 TRGMII_RCK_CTRL;
756 + u32 TRGMII_7530_base;
757 + u32 TRGMII_7530_TX_base;
758 + u32 val;
759 +
760 + TRGMII_7623_base = 0x300;
761 + TRGMII_7530_base = 0x7A00;
762 + TRGMII_7530_RD_0 = TRGMII_7530_base + 0x10;
763 + TRGMII_RCK_CTRL = TRGMII_7623_base;
764 + rxd_step_size = 0x1;
765 + rxc_step_size = 0x8;
766 + init_toggle_data = 0x00000055;
767 + training_word = 0x000000AC;
768 +
769 + TRGMII_7530_TX_base = TRGMII_7530_base + 0x50;
770 +
771 + /* pr_err("Calibration begin ........\n"); */
772 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x40) | 0x80000000;
773 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x40);
774 + read_data = mt7530_mdio_r32(gsw, 0x7a10);
775 + /* pr_err("TRGMII_7530_RD_0 is %x\n", read_data); */
776 +
777 + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base + 0x04);
778 + read_data &= 0x3fffffff;
779 + mt7530_mdio_w32(gsw, TRGMII_7530_base + 0x04, read_data); /* RX clock gating in MT7530 */
780 +
781 + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base + 0x78);
782 + read_data |= 0x00002000;
783 + mt7530_mdio_w32(gsw, TRGMII_7530_base + 0x78, read_data); /* Set TX OE edge in MT7530 */
784 +
785 + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base);
786 + read_data |= 0x80000000;
787 + mt7530_mdio_w32(gsw, TRGMII_7530_base, read_data); /* Assert RX reset in MT7530 */
788 +
789 + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base);
790 + read_data &= 0x7fffffff;
791 + mt7530_mdio_w32(gsw, TRGMII_7530_base, read_data); /* Release RX reset in MT7530 */
792 +
793 + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base + 0x04);
794 + read_data |= 0xC0000000;
795 + mt7530_mdio_w32(gsw, TRGMII_7530_base + 0x04, read_data); /* Disable RX clock gating in MT7530 */
796 +
797 + /* pr_err("Enable Training Mode in MT7623\n"); */
798 + /*Enable Training Mode in MT7623 */
799 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x40) | 0x80000000;
800 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x40);
801 + if (gsw->trgmii_force == 2000) {
802 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x40) | 0xC0000000;
803 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x40);
804 + } else {
805 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x40) | 0x80000000;
806 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x40);
807 + }
808 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x078) & 0xfffff0ff;
809 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x078);
810 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x50) & 0xfffff0ff;
811 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x50);
812 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x58) & 0xfffff0ff;
813 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x58);
814 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x60) & 0xfffff0ff;
815 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x60);
816 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x68) & 0xfffff0ff;
817 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x68);
818 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x70) & 0xfffff0ff;
819 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x70);
820 + val = mtk_switch_r32(gsw, TRGMII_7623_base + 0x78) & 0x00000800;
821 + mtk_switch_w32(gsw, val, TRGMII_7623_base + 0x78);
822 + err_total_flag = 0;
823 + /* pr_err("Adjust RXC delay in MT7530\n"); */
824 + read_data = 0x0;
825 + while (err_total_flag == 0 && (read_data != 0x68)) {
826 + /* pr_err("2nd Enable EDGE CHK in MT7530\n"); */
827 + /* Enable EDGE CHK in MT7530 */
828 + for (i = 0; i < 5; i++) {
829 + read_data =
830 + mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
831 + read_data |= 0x40000000;
832 + read_data &= 0x4fffffff;
833 + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
834 + read_data);
835 + wait_loop(gsw);
836 + /* pr_err("2nd Disable EDGE CHK in MT7530\n"); */
837 + err_cnt[i] =
838 + mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
839 + /* pr_err("***** MT7530 %dth bit ERR_CNT =%x\n",i, err_cnt[i]); */
840 + /* pr_err("MT7530 %dth bit ERR_CNT =%x\n",i, err_cnt[i]); */
841 + err_cnt[i] >>= 8;
842 + err_cnt[i] &= 0x0000ff0f;
843 + rd_wd = err_cnt[i] >> 8;
844 + rd_wd &= 0x000000ff;
845 + err_cnt[i] &= 0x0000000f;
846 + /* read_data = mt7530_mdio_r32(gsw,0x7a10,&read_data); */
847 + if (err_cnt[i] != 0) {
848 + err_flag[i] = 1;
849 + } else if (rd_wd != 0x55) {
850 + err_flag[i] = 1;
851 + } else {
852 + err_flag[i] = 0;
853 + }
854 + if (i == 0) {
855 + err_total_flag = err_flag[i];
856 + } else {
857 + err_total_flag = err_flag[i] & err_total_flag;
858 + }
859 + /* Disable EDGE CHK in MT7530 */
860 + read_data =
861 + mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
862 + read_data |= 0x40000000;
863 + read_data &= 0x4fffffff;
864 + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
865 + read_data);
866 + wait_loop(gsw);
867 + }
868 + /*Adjust RXC delay */
869 + if (err_total_flag == 0) {
870 + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base);
871 + read_data |= 0x80000000;
872 + mt7530_mdio_w32(gsw, TRGMII_7530_base, read_data); /* Assert RX reset in MT7530 */
873 +
874 + read_data =
875 + mt7530_mdio_r32(gsw, TRGMII_7530_base + 0x04);
876 + read_data &= 0x3fffffff;
877 + mt7530_mdio_w32(gsw, TRGMII_7530_base + 0x04, read_data); /* RX clock gating in MT7530 */
878 +
879 + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base);
880 + tmp = read_data;
881 + tmp &= 0x0000007f;
882 + tmp += rxc_step_size;
883 + /* pr_err("Current rxc delay = %d\n", tmp); */
884 + read_data &= 0xffffff80;
885 + read_data |= tmp;
886 + mt7530_mdio_w32(gsw, TRGMII_7530_base, read_data);
887 + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base);
888 + /* pr_err("Current RXC delay = %x\n", read_data); */
889 +
890 + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base);
891 + read_data &= 0x7fffffff;
892 + mt7530_mdio_w32(gsw, TRGMII_7530_base, read_data); /* Release RX reset in MT7530 */
893 +
894 + read_data =
895 + mt7530_mdio_r32(gsw, TRGMII_7530_base + 0x04);
896 + read_data |= 0xc0000000;
897 + mt7530_mdio_w32(gsw, TRGMII_7530_base + 0x04, read_data); /* Disable RX clock gating in MT7530 */
898 + pr_err("####### MT7530 RXC delay is %d\n", tmp);
899 + }
900 + read_data = tmp;
901 + }
902 + pr_err("Finish RXC Adjustment while loop\n");
903 +
904 + /* pr_err("Read RD_WD MT7530\n"); */
905 + /* Read RD_WD MT7530 */
906 + for (i = 0; i < 5; i++) {
907 + rd_tap = 0;
908 + while (err_flag[i] != 0 && rd_tap != 128) {
909 + /* Enable EDGE CHK in MT7530 */
910 + read_data =
911 + mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
912 + read_data |= 0x40000000;
913 + read_data &= 0x4fffffff;
914 + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
915 + read_data);
916 + wait_loop(gsw);
917 + err_cnt[i] = (read_data >> 8) & 0x0000000f;
918 + rd_wd = (read_data >> 16) & 0x000000ff;
919 + if (err_cnt[i] != 0 || rd_wd != 0x55) {
920 + err_flag[i] = 1;
921 + } else {
922 + err_flag[i] = 0;
923 + }
924 + if (err_flag[i] != 0) {
925 + rd_tap = (read_data & 0x0000007f) + rxd_step_size; /* Add RXD delay in MT7530 */
926 + read_data = (read_data & 0xffffff80) | rd_tap;
927 + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
928 + read_data);
929 + tap_a[i] = rd_tap;
930 + } else {
931 + tap_a[i] = (read_data & 0x0000007f); /* Record the min delay TAP_A */
932 + rd_tap = tap_a[i] + 0x4;
933 + read_data = (read_data & 0xffffff80) | rd_tap;
934 + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
935 + read_data);
936 + }
937 +
938 + /* Disable EDGE CHK in MT7530 */
939 + read_data =
940 + mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
941 + read_data |= 0x40000000;
942 + read_data &= 0x4fffffff;
943 + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
944 + read_data);
945 + wait_loop(gsw);
946 +
947 + }
948 + pr_err("MT7530 %dth bit Tap_a = %d\n", i, tap_a[i]);
949 + }
950 +
951 + /* pr_err("Last While Loop\n"); */
952 + for (i = 0; i < 5; i++) {
953 + rd_tap = 0;
954 + while (err_flag[i] == 0 && (rd_tap != 128)) {
955 + /* Enable EDGE CHK in MT7530 */
956 + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
957 + read_data |= 0x40000000;
958 + read_data &= 0x4fffffff;
959 + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
960 + read_data);
961 + wait_loop(gsw);
962 + err_cnt[i] = (read_data >> 8) & 0x0000000f;
963 + rd_wd = (read_data >> 16) & 0x000000ff;
964 + if (err_cnt[i] != 0 || rd_wd != 0x55)
965 + err_flag[i] = 1;
966 + else
967 + err_flag[i] = 0;
968 +
969 + if (err_flag[i] == 0 && (rd_tap != 128)) {
970 + /* Add RXD delay in MT7530 */
971 + rd_tap = (read_data & 0x0000007f) + rxd_step_size;
972 + read_data = (read_data & 0xffffff80) | rd_tap;
973 + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
974 + read_data);
975 + }
976 + /* Disable EDGE CHK in MT7530 */
977 + read_data =
978 + mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
979 + read_data |= 0x40000000;
980 + read_data &= 0x4fffffff;
981 + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
982 + read_data);
983 + wait_loop(gsw);
984 + }
985 + tap_b[i] = rd_tap; /* - rxd_step_size; */
986 + pr_err("MT7530 %dth bit Tap_b = %d\n", i, tap_b[i]);
987 + /* Calculate RXD delay = (TAP_A + TAP_B)/2 */
988 + final_tap[i] = (tap_a[i] + tap_b[i]) / 2;
989 + /* pr_err("########****** MT7530 %dth bit Final Tap = %d\n", i, final_tap[i]); */
990 +
991 + read_data = (read_data & 0xffffff80) | final_tap[i];
992 + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8, read_data);
993 + }
994 +
995 + if (gsw->trgmii_force == 2000)
996 + mtk_switch_m32(gsw, 0x7fffffff, 0, TRGMII_7623_base + 0x40);
997 + else
998 + mtk_switch_m32(gsw, 0x3fffffff, 0, TRGMII_7623_base + 0x40);
999 +
1000 +}
1001 +
1002 +static void mt7530_trgmii_clock_setting(struct mt7620_gsw *gsw, u32 xtal_mode)
1003 +{
1004 +
1005 + u32 regValue;
1006 +
1007 + /* TRGMII Clock */
1008 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1009 + _mtk_mdio_write(gsw->eth, 0, 14, 0x410);
1010 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1011 + _mtk_mdio_write(gsw->eth, 0, 14, 0x1);
1012 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1013 + _mtk_mdio_write(gsw->eth, 0, 14, 0x404);
1014 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1015 +
1016 + if (xtal_mode == 1) {
1017 + /* 25MHz */
1018 + if (gsw->trgmii_force == 2600)
1019 + /* 325MHz */
1020 + _mtk_mdio_write(gsw->eth, 0, 14, 0x1a00);
1021 + else if (gsw->trgmii_force == 2000)
1022 + /* 250MHz */
1023 + _mtk_mdio_write(gsw->eth, 0, 14, 0x1400);
1024 + } else if (xtal_mode == 2) {
1025 + /* 40MHz */
1026 + if (gsw->trgmii_force == 2600)
1027 + /* 325MHz */
1028 + _mtk_mdio_write(gsw->eth, 0, 14, 0x1040);
1029 + else if (gsw->trgmii_force == 2000)
1030 + /* 250MHz */
1031 + _mtk_mdio_write(gsw->eth, 0, 14, 0x0c80);
1032 + }
1033 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1034 + _mtk_mdio_write(gsw->eth, 0, 14, 0x405);
1035 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1036 + _mtk_mdio_write(gsw->eth, 0, 14, 0x0);
1037 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1038 + _mtk_mdio_write(gsw->eth, 0, 14, 0x409);
1039 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1040 + if (xtal_mode == 1)
1041 + /* 25MHz */
1042 + _mtk_mdio_write(gsw->eth, 0, 14, 0x0057);
1043 + else
1044 + /* 40MHz */
1045 + _mtk_mdio_write(gsw->eth, 0, 14, 0x0087);
1046 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1047 + _mtk_mdio_write(gsw->eth, 0, 14, 0x40a);
1048 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1049 + if (xtal_mode == 1)
1050 + /* 25MHz */
1051 + _mtk_mdio_write(gsw->eth, 0, 14, 0x0057);
1052 + else
1053 + /* 40MHz */
1054 + _mtk_mdio_write(gsw->eth, 0, 14, 0x0087);
1055 +
1056 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1057 + _mtk_mdio_write(gsw->eth, 0, 14, 0x403);
1058 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1059 + _mtk_mdio_write(gsw->eth, 0, 14, 0x1800);
1060 +
1061 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1062 + _mtk_mdio_write(gsw->eth, 0, 14, 0x403);
1063 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1064 + _mtk_mdio_write(gsw->eth, 0, 14, 0x1c00);
1065 +
1066 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1067 + _mtk_mdio_write(gsw->eth, 0, 14, 0x401);
1068 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1069 + _mtk_mdio_write(gsw->eth, 0, 14, 0xc020);
1070 +
1071 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1072 + _mtk_mdio_write(gsw->eth, 0, 14, 0x406);
1073 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1074 + _mtk_mdio_write(gsw->eth, 0, 14, 0xa030);
1075 +
1076 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1077 + _mtk_mdio_write(gsw->eth, 0, 14, 0x406);
1078 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1079 + _mtk_mdio_write(gsw->eth, 0, 14, 0xa038);
1080 +
1081 +// udelay(120); /* for MT7623 bring up test */
1082 +
1083 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1084 + _mtk_mdio_write(gsw->eth, 0, 14, 0x410);
1085 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1086 + _mtk_mdio_write(gsw->eth, 0, 14, 0x3);
1087 +
1088 + regValue = mt7530_mdio_r32(gsw, 0x7830);
1089 + regValue &= 0xFFFFFFFC;
1090 + regValue |= 0x00000001;
1091 + mt7530_mdio_w32(gsw, 0x7830, regValue);
1092 +
1093 + regValue = mt7530_mdio_r32(gsw, 0x7a40);
1094 + regValue &= ~(0x1 << 30);
1095 + regValue &= ~(0x1 << 28);
1096 + mt7530_mdio_w32(gsw, 0x7a40, regValue);
1097 +
1098 + mt7530_mdio_w32(gsw, 0x7a78, 0x55);
1099 +// udelay(100); /* for mt7623 bring up test */
1100 +
1101 + mtk_switch_m32(gsw, 0x7fffffff, 0, 0x300);
1102 +
1103 + trgmii_calibration_7623(gsw);
1104 + trgmii_calibration_7530(gsw);
1105 +
1106 + mtk_switch_m32(gsw, 0, 0x80000000, 0x300);
1107 + mtk_switch_m32(gsw, 0, 0x7fffffff, 0x300);
1108 +
1109 + /*MT7530 RXC reset */
1110 + regValue = mt7530_mdio_r32(gsw, 0x7a00);
1111 + regValue |= (0x1 << 31);
1112 + mt7530_mdio_w32(gsw, 0x7a00, regValue);
1113 + mdelay(1);
1114 + regValue &= ~(0x1 << 31);
1115 + mt7530_mdio_w32(gsw, 0x7a00, regValue);
1116 + mdelay(100);
1117 +}
1118 +
1119 +static void mt7623_hw_init(struct mtk_eth *eth, struct mt7620_gsw *gsw, struct device_node *np)
1120 +{
1121 + u32 i;
1122 + u32 val;
1123 + u32 xtal_mode;
1124 +
1125 + regmap_update_bits(gsw->ethsys, ETHSYS_CLKCFG0,
1126 + ETHSYS_TRGMII_CLK_SEL362_5,
1127 + ETHSYS_TRGMII_CLK_SEL362_5);
1128 +
1129 + /* reset the TRGMII core */
1130 + mtk_switch_m32(gsw, 0, INTF_MODE_TRGMII, GSW_INTF_MODE);
1131 + mtk_switch_m32(gsw, 0, TRGMII_RCK_CTRL_RX_RST, GSW_TRGMII_RCK_CTRL);
1132 +
1133 + /* Hardware reset Switch */
1134 + device_reset(eth->dev);
1135 +
1136 + /* Wait for Switch Reset Completed*/
1137 + for (i = 0; i < 100; i++) {
1138 + mdelay(10);
1139 + if (mt7530_mdio_r32(gsw, MT7530_HWTRAP))
1140 + break;
1141 + }
1142 +
1143 + /* turn off all PHYs */
1144 + for (i = 0; i <= 4; i++) {
1145 + val = _mtk_mdio_read(gsw->eth, i, 0x0);
1146 + val |= BIT(11);
1147 + _mtk_mdio_write(gsw->eth, i, 0x0, val);
1148 + }
1149 +
1150 + /* reset the switch */
1151 + mt7530_mdio_w32(gsw, MT7530_SYS_CTRL,
1152 + SYS_CTRL_SW_RST | SYS_CTRL_REG_RST);
1153 + udelay(100);
1154 +
1155 + /* GE1, Force 1000M/FD, FC ON */
1156 + mt7530_mdio_w32(gsw, MT7530_PMCR_P(6), PMCR_FIXED_LINK_FC);
1157 +
1158 + /* GE2, Force 1000M/FD, FC ON */
1159 + mt7530_mdio_w32(gsw, MT7530_PMCR_P(5), PMCR_FIXED_LINK_FC);
1160 +
1161 + /* Enable Port 6, P5 as GMAC5, P5 disable */
1162 + val = mt7530_mdio_r32(gsw, MT7530_MHWTRAP);
1163 + /* Enable Port 6 */
1164 + val &= ~MHWTRAP_P6_DIS;
1165 + /* Enable Port 5 */
1166 + val &= ~MHWTRAP_P5_DIS;
1167 + /* Port 5 as GMAC */
1168 + val |= MHWTRAP_P5_MAC_SEL;
1169 + /* Port 5 Interface mode */
1170 + val |= MHWTRAP_P5_RGMII_MODE;
1171 + /* Set MT7530 phy direct access mode**/
1172 + val &= ~MHWTRAP_PHY_ACCESS;
1173 + /* manual override of HW-Trap */
1174 + val |= MHWTRAP_MANUAL;
1175 + mt7530_mdio_w32(gsw, MT7530_MHWTRAP, val);
1176 +
1177 + val = mt7530_mdio_r32(gsw, 0x7800);
1178 + val = (val >> 9) & 0x3;
1179 + pr_err("!!%s: Mhz value= %d\n", __func__, val);
1180 + if (val == 0x3) {
1181 + xtal_mode = 1;
1182 + /* 25Mhz Xtal - do nothing */
1183 + } else if (val == 0x2) {
1184 + /* 40Mhz */
1185 + xtal_mode = 2;
1186 +
1187 + /* disable MT7530 core clock */
1188 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1189 + _mtk_mdio_write(gsw->eth, 0, 14, 0x410);
1190 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1191 + _mtk_mdio_write(gsw->eth, 0, 14, 0x0);
1192 +
1193 + /* disable MT7530 PLL */
1194 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1195 + _mtk_mdio_write(gsw->eth, 0, 14, 0x40d);
1196 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1197 + _mtk_mdio_write(gsw->eth, 0, 14, 0x2020);
1198 +
1199 + /* for MT7530 core clock = 500Mhz */
1200 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1201 + _mtk_mdio_write(gsw->eth, 0, 14, 0x40e);
1202 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1203 + _mtk_mdio_write(gsw->eth, 0, 14, 0x119);
1204 +
1205 + /* enable MT7530 PLL */
1206 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1207 + _mtk_mdio_write(gsw->eth, 0, 14, 0x40d);
1208 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1209 + _mtk_mdio_write(gsw->eth, 0, 14, 0x2820);
1210 +
1211 + udelay(20);
1212 +
1213 + /* enable MT7530 core clock */
1214 + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
1215 + _mtk_mdio_write(gsw->eth, 0, 14, 0x410);
1216 + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
1217 + } else {
1218 + xtal_mode = 3;
1219 + /* 20Mhz Xtal - TODO */
1220 + }
1221 +
1222 + /* RGMII */
1223 + _mtk_mdio_write(gsw->eth, 0, 14, 0x1);
1224 +
1225 + /* set MT7530 central align */
1226 + val = mt7530_mdio_r32(gsw, 0x7830);
1227 + val &= ~1;
1228 + val |= 1<<1;
1229 + mt7530_mdio_w32(gsw, 0x7830, val);
1230 +
1231 + val = mt7530_mdio_r32(gsw, 0x7a40);
1232 + val &= ~(1<<30);
1233 + mt7530_mdio_w32(gsw, 0x7a40, val);
1234 +
1235 + mt7530_mdio_w32(gsw, 0x7a78, 0x855);
1236 +
1237 + /* delay setting for 10/1000M */
1238 + mt7530_mdio_w32(gsw, 0x7b00, 0x104);
1239 + mt7530_mdio_w32(gsw, 0x7b04, 0x10);
1240 +
1241 + /* lower Tx Driving */
1242 + mt7530_mdio_w32(gsw, 0x7a54, 0x88);
1243 + mt7530_mdio_w32(gsw, 0x7a5c, 0x88);
1244 + mt7530_mdio_w32(gsw, 0x7a64, 0x88);
1245 + mt7530_mdio_w32(gsw, 0x7a6c, 0x88);
1246 + mt7530_mdio_w32(gsw, 0x7a74, 0x88);
1247 + mt7530_mdio_w32(gsw, 0x7a7c, 0x88);
1248 + mt7530_mdio_w32(gsw, 0x7810, 0x11);
1249 +
1250 + /* Set MT7623/MT7683 TX Driving */
1251 + mtk_switch_w32(gsw, 0x88, 0x354);
1252 + mtk_switch_w32(gsw, 0x88, 0x35c);
1253 + mtk_switch_w32(gsw, 0x88, 0x364);
1254 + mtk_switch_w32(gsw, 0x88, 0x36c);
1255 + mtk_switch_w32(gsw, 0x88, 0x374);
1256 + mtk_switch_w32(gsw, 0x88, 0x37c);
1257 +
1258 +#if defined (CONFIG_GE2_RGMII_AN)
1259 +// *(volatile u_long *)(0xf0005f00) = 0xe00; //Set GE2 driving and slew rate
1260 +#else
1261 + // *(volatile u_long *)(0xf0005f00) = 0xa00; //Set GE2 driving and slew rate
1262 +#endif
1263 + // *(volatile u_long *)(0xf00054c0) = 0x5; //set GE2 TDSEL
1264 + // *(volatile u_long *)(0xf0005ed0) = 0; //set GE2 TUNE
1265 +
1266 + mt7530_trgmii_clock_setting(gsw, xtal_mode);
1267 +
1268 + //LANWANPartition(gsw);
1269 +
1270 + /* disable EEE */
1271 + for (i = 0; i <= 4; i++) {
1272 + _mtk_mdio_write(gsw->eth, i, 13, 0x7);
1273 + _mtk_mdio_write(gsw->eth, i, 14, 0x3C);
1274 + _mtk_mdio_write(gsw->eth, i, 13, 0x4007);
1275 + _mtk_mdio_write(gsw->eth, i, 14, 0x0);
1276 +
1277 + /* Increase SlvDPSready time */
1278 + _mtk_mdio_write(gsw->eth, i, 31, 0x52b5);
1279 + _mtk_mdio_write(gsw->eth, i, 16, 0xafae);
1280 + _mtk_mdio_write(gsw->eth, i, 18, 0x2f);
1281 + _mtk_mdio_write(gsw->eth, i, 16, 0x8fae);
1282 +
1283 + /* Incease post_update_timer */
1284 + _mtk_mdio_write(gsw->eth, i, 31, 0x3);
1285 + _mtk_mdio_write(gsw->eth, i, 17, 0x4b);
1286 +
1287 + /* Adjust 100_mse_threshold */
1288 + _mtk_mdio_write(gsw->eth, i, 13, 0x1e);
1289 + _mtk_mdio_write(gsw->eth, i, 14, 0x123);
1290 + _mtk_mdio_write(gsw->eth, i, 13, 0x401e);
1291 + _mtk_mdio_write(gsw->eth, i, 14, 0xffff);
1292 +
1293 + /* Disable mcc */
1294 + _mtk_mdio_write(gsw->eth, i, 13, 0x1e);
1295 + _mtk_mdio_write(gsw->eth, i, 14, 0xa6);
1296 + _mtk_mdio_write(gsw->eth, i, 13, 0x401e);
1297 + _mtk_mdio_write(gsw->eth, i, 14, 0x300);
1298 +
1299 + /* Disable HW auto downshift*/
1300 + _mtk_mdio_write(gsw->eth, i, 31, 0x1);
1301 + val = _mtk_mdio_read(gsw->eth, i, 0x14);
1302 + val &= ~(1<<4);
1303 + _mtk_mdio_write(gsw->eth, i, 0x14, val);
1304 + }
1305 +
1306 + /* turn on all PHYs */
1307 + for (i = 0; i <= 4; i++) {
1308 + val = _mtk_mdio_read(gsw->eth, i, 0);
1309 + val &= ~BIT(11);
1310 + _mtk_mdio_write(gsw->eth, i, 0, val);
1311 + }
1312 +
1313 + /* enable irq */
1314 + mt7530_mdio_m32(gsw, 0, TOP_SIG_CTRL_NORMAL, MT7530_TOP_SIG_CTRL);
1315 +}
1316 +
1317 +static const struct of_device_id mediatek_gsw_match[] = {
1318 + { .compatible = "mediatek,mt7623-gsw" },
1319 + {},
1320 +};
1321 +MODULE_DEVICE_TABLE(of, mediatek_gsw_match);
1322 +
1323 +int mtk_gsw_init(struct mtk_eth *eth)
1324 +{
1325 + struct device_node *np = eth->switch_np;
1326 + struct platform_device *pdev = of_find_device_by_node(np);
1327 + struct mt7620_gsw *gsw;
1328 +
1329 + if (!pdev)
1330 + return -ENODEV;
1331 +
1332 + if (!of_device_is_compatible(np, mediatek_gsw_match->compatible))
1333 + return -EINVAL;
1334 +
1335 + gsw = platform_get_drvdata(pdev);
1336 + if (!gsw)
1337 + return -ENODEV;
1338 + gsw->eth = eth;
1339 + eth->sw_priv = gsw;
1340 +
1341 + mt7623_hw_init(eth, gsw, np);
1342 +
1343 + request_threaded_irq(gsw->irq, gsw_interrupt_mt7623, NULL, 0,
1344 + "gsw", eth);
1345 + mt7530_mdio_w32(gsw, 0x7008, 0x1f);
1346 +
1347 + return 0;
1348 +}
1349 +
1350 +static int mt7623_gsw_probe(struct platform_device *pdev)
1351 +{
1352 + struct device_node *np = pdev->dev.of_node;
1353 + struct device_node *pctl;
1354 + int reset_pin, ret;
1355 + struct mt7620_gsw *gsw;
1356 + struct regulator *supply;
1357 +
1358 + gsw = devm_kzalloc(&pdev->dev, sizeof(struct mt7620_gsw), GFP_KERNEL);
1359 + if (!gsw)
1360 + return -ENOMEM;
1361 +
1362 + gsw->dev = &pdev->dev;
1363 + gsw->trgmii_force = 2000;
1364 + gsw->irq = irq_of_parse_and_map(np, 0);
1365 + if (gsw->irq < 0)
1366 + return -EINVAL;
1367 +
1368 + gsw->ethsys = syscon_regmap_lookup_by_phandle(np, "mediatek,ethsys");
1369 + if (IS_ERR(gsw->ethsys))
1370 + return PTR_ERR(gsw->ethsys);
1371 +
1372 + reset_pin = of_get_named_gpio(np, "mediatek,reset-pin", 0);
1373 + if (reset_pin < 0)
1374 + return reset_pin;
1375 +
1376 + pctl = of_parse_phandle(np, "mediatek,pctl-regmap", 0);
1377 + if (IS_ERR(pctl))
1378 + return PTR_ERR(pctl);
1379 +
1380 + gsw->pctl = syscon_node_to_regmap(pctl);
1381 + if (IS_ERR(pctl))
1382 + return PTR_ERR(pctl);
1383 +
1384 + ret = devm_gpio_request(&pdev->dev, reset_pin, "mt7530-reset");
1385 + if (ret)
1386 + return ret;
1387 +
1388 + gsw->clk_trgpll = devm_clk_get(&pdev->dev, "trgpll");
1389 +
1390 + if (IS_ERR(gsw->clk_trgpll))
1391 + return -ENODEV;
1392 +
1393 + supply = devm_regulator_get(&pdev->dev, "mt7530");
1394 + if (IS_ERR(supply))
1395 + return PTR_ERR(supply);
1396 +
1397 + regulator_set_voltage(supply, 1000000, 1000000);
1398 + ret = regulator_enable(supply);
1399 + if (ret) {
1400 + dev_err(&pdev->dev, "Failed to enable reg-7530: %d\n", ret);
1401 + return ret;
1402 + }
1403 + pm_runtime_enable(&pdev->dev);
1404 + pm_runtime_get_sync(&pdev->dev);
1405 +
1406 + ret = clk_set_rate(gsw->clk_trgpll, 500000000);
1407 + if (ret)
1408 + return ret;
1409 +
1410 + clk_prepare_enable(gsw->clk_trgpll);
1411 +
1412 + gpio_direction_output(reset_pin, 0);
1413 + udelay(1000);
1414 + gpio_set_value(reset_pin, 1);
1415 + mdelay(100);
1416 +
1417 + /* Set GE2 driving and slew rate */
1418 + regmap_write(gsw->pctl, 0xF00, 0xa00);
1419 + /* set GE2 TDSEL */
1420 + regmap_write(gsw->pctl, 0x4C0, 0x5);
1421 + /* set GE2 TUNE */
1422 + regmap_write(gsw->pctl, 0xED0, 0x0);
1423 +
1424 + platform_set_drvdata(pdev, gsw);
1425 +
1426 + return 0;
1427 +}
1428 +
1429 +static int mt7623_gsw_remove(struct platform_device *pdev)
1430 +{
1431 + struct mt7620_gsw *gsw = platform_get_drvdata(pdev);
1432 +
1433 + clk_disable_unprepare(gsw->clk_trgpll);
1434 +
1435 + pm_runtime_put_sync(&pdev->dev);
1436 + pm_runtime_disable(&pdev->dev);
1437 +
1438 + platform_set_drvdata(pdev, NULL);
1439 +
1440 + return 0;
1441 +}
1442 +
1443 +static struct platform_driver gsw_driver = {
1444 + .probe = mt7623_gsw_probe,
1445 + .remove = mt7623_gsw_remove,
1446 + .driver = {
1447 + .name = "mt7623-gsw",
1448 + .owner = THIS_MODULE,
1449 + .of_match_table = mediatek_gsw_match,
1450 + },
1451 +};
1452 +
1453 +module_platform_driver(gsw_driver);
1454 +
1455 +MODULE_LICENSE("GPL");
1456 +MODULE_AUTHOR("John Crispin <blogic@openwrt.org>");
1457 +MODULE_DESCRIPTION("GBit switch driver for Mediatek MT7623 SoC");
1458 diff --git a/drivers/net/ethernet/mediatek/mt7530.c b/drivers/net/ethernet/mediatek/mt7530.c
1459 new file mode 100644
1460 index 0000000..2e9d280
1461 --- /dev/null
1462 +++ b/drivers/net/ethernet/mediatek/mt7530.c
1463 @@ -0,0 +1,808 @@
1464 +/*
1465 + * This program is free software; you can redistribute it and/or
1466 + * modify it under the terms of the GNU General Public License
1467 + * as published by the Free Software Foundation; either version 2
1468 + * of the License, or (at your option) any later version.
1469 + *
1470 + * This program is distributed in the hope that it will be useful,
1471 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1472 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1473 + * GNU General Public License for more details.
1474 + *
1475 + * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
1476 + */
1477 +
1478 +#include <linux/if.h>
1479 +#include <linux/module.h>
1480 +#include <linux/init.h>
1481 +#include <linux/list.h>
1482 +#include <linux/if_ether.h>
1483 +#include <linux/skbuff.h>
1484 +#include <linux/netdevice.h>
1485 +#include <linux/netlink.h>
1486 +#include <linux/bitops.h>
1487 +#include <net/genetlink.h>
1488 +#include <linux/switch.h>
1489 +#include <linux/delay.h>
1490 +#include <linux/phy.h>
1491 +#include <linux/netdevice.h>
1492 +#include <linux/etherdevice.h>
1493 +#include <linux/lockdep.h>
1494 +#include <linux/workqueue.h>
1495 +#include <linux/of_device.h>
1496 +
1497 +#include "mt7530.h"
1498 +
1499 +#define MT7530_CPU_PORT 6
1500 +#define MT7530_NUM_PORTS 8
1501 +#define MT7530_NUM_VLANS 16
1502 +#define MT7530_MAX_VID 4095
1503 +#define MT7530_MIN_VID 0
1504 +
1505 +/* registers */
1506 +#define REG_ESW_VLAN_VTCR 0x90
1507 +#define REG_ESW_VLAN_VAWD1 0x94
1508 +#define REG_ESW_VLAN_VAWD2 0x98
1509 +#define REG_ESW_VLAN_VTIM(x) (0x100 + 4 * ((x) / 2))
1510 +
1511 +#define REG_ESW_VLAN_VAWD1_IVL_MAC BIT(30)
1512 +#define REG_ESW_VLAN_VAWD1_VTAG_EN BIT(28)
1513 +#define REG_ESW_VLAN_VAWD1_VALID BIT(0)
1514 +
1515 +/* vlan egress mode */
1516 +enum {
1517 + ETAG_CTRL_UNTAG = 0,
1518 + ETAG_CTRL_TAG = 2,
1519 + ETAG_CTRL_SWAP = 1,
1520 + ETAG_CTRL_STACK = 3,
1521 +};
1522 +
1523 +#define REG_ESW_PORT_PCR(x) (0x2004 | ((x) << 8))
1524 +#define REG_ESW_PORT_PVC(x) (0x2010 | ((x) << 8))
1525 +#define REG_ESW_PORT_PPBV1(x) (0x2014 | ((x) << 8))
1526 +
1527 +#define REG_HWTRAP 0x7804
1528 +
1529 +#define MIB_DESC(_s , _o, _n) \
1530 + { \
1531 + .size = (_s), \
1532 + .offset = (_o), \
1533 + .name = (_n), \
1534 + }
1535 +
1536 +struct mt7xxx_mib_desc {
1537 + unsigned int size;
1538 + unsigned int offset;
1539 + const char *name;
1540 +};
1541 +
1542 +#define MT7621_MIB_COUNTER_BASE 0x4000
1543 +#define MT7621_MIB_COUNTER_PORT_OFFSET 0x100
1544 +#define MT7621_STATS_TDPC 0x00
1545 +#define MT7621_STATS_TCRC 0x04
1546 +#define MT7621_STATS_TUPC 0x08
1547 +#define MT7621_STATS_TMPC 0x0C
1548 +#define MT7621_STATS_TBPC 0x10
1549 +#define MT7621_STATS_TCEC 0x14
1550 +#define MT7621_STATS_TSCEC 0x18
1551 +#define MT7621_STATS_TMCEC 0x1C
1552 +#define MT7621_STATS_TDEC 0x20
1553 +#define MT7621_STATS_TLCEC 0x24
1554 +#define MT7621_STATS_TXCEC 0x28
1555 +#define MT7621_STATS_TPPC 0x2C
1556 +#define MT7621_STATS_TL64PC 0x30
1557 +#define MT7621_STATS_TL65PC 0x34
1558 +#define MT7621_STATS_TL128PC 0x38
1559 +#define MT7621_STATS_TL256PC 0x3C
1560 +#define MT7621_STATS_TL512PC 0x40
1561 +#define MT7621_STATS_TL1024PC 0x44
1562 +#define MT7621_STATS_TOC 0x48
1563 +#define MT7621_STATS_RDPC 0x60
1564 +#define MT7621_STATS_RFPC 0x64
1565 +#define MT7621_STATS_RUPC 0x68
1566 +#define MT7621_STATS_RMPC 0x6C
1567 +#define MT7621_STATS_RBPC 0x70
1568 +#define MT7621_STATS_RAEPC 0x74
1569 +#define MT7621_STATS_RCEPC 0x78
1570 +#define MT7621_STATS_RUSPC 0x7C
1571 +#define MT7621_STATS_RFEPC 0x80
1572 +#define MT7621_STATS_ROSPC 0x84
1573 +#define MT7621_STATS_RJEPC 0x88
1574 +#define MT7621_STATS_RPPC 0x8C
1575 +#define MT7621_STATS_RL64PC 0x90
1576 +#define MT7621_STATS_RL65PC 0x94
1577 +#define MT7621_STATS_RL128PC 0x98
1578 +#define MT7621_STATS_RL256PC 0x9C
1579 +#define MT7621_STATS_RL512PC 0xA0
1580 +#define MT7621_STATS_RL1024PC 0xA4
1581 +#define MT7621_STATS_ROC 0xA8
1582 +#define MT7621_STATS_RDPC_CTRL 0xB0
1583 +#define MT7621_STATS_RDPC_ING 0xB4
1584 +#define MT7621_STATS_RDPC_ARL 0xB8
1585 +
1586 +static const struct mt7xxx_mib_desc mt7621_mibs[] = {
1587 + MIB_DESC(1, MT7621_STATS_TDPC, "TxDrop"),
1588 + MIB_DESC(1, MT7621_STATS_TCRC, "TxCRC"),
1589 + MIB_DESC(1, MT7621_STATS_TUPC, "TxUni"),
1590 + MIB_DESC(1, MT7621_STATS_TMPC, "TxMulti"),
1591 + MIB_DESC(1, MT7621_STATS_TBPC, "TxBroad"),
1592 + MIB_DESC(1, MT7621_STATS_TCEC, "TxCollision"),
1593 + MIB_DESC(1, MT7621_STATS_TSCEC, "TxSingleCol"),
1594 + MIB_DESC(1, MT7621_STATS_TMCEC, "TxMultiCol"),
1595 + MIB_DESC(1, MT7621_STATS_TDEC, "TxDefer"),
1596 + MIB_DESC(1, MT7621_STATS_TLCEC, "TxLateCol"),
1597 + MIB_DESC(1, MT7621_STATS_TXCEC, "TxExcCol"),
1598 + MIB_DESC(1, MT7621_STATS_TPPC, "TxPause"),
1599 + MIB_DESC(1, MT7621_STATS_TL64PC, "Tx64Byte"),
1600 + MIB_DESC(1, MT7621_STATS_TL65PC, "Tx65Byte"),
1601 + MIB_DESC(1, MT7621_STATS_TL128PC, "Tx128Byte"),
1602 + MIB_DESC(1, MT7621_STATS_TL256PC, "Tx256Byte"),
1603 + MIB_DESC(1, MT7621_STATS_TL512PC, "Tx512Byte"),
1604 + MIB_DESC(1, MT7621_STATS_TL1024PC, "Tx1024Byte"),
1605 + MIB_DESC(2, MT7621_STATS_TOC, "TxByte"),
1606 + MIB_DESC(1, MT7621_STATS_RDPC, "RxDrop"),
1607 + MIB_DESC(1, MT7621_STATS_RFPC, "RxFiltered"),
1608 + MIB_DESC(1, MT7621_STATS_RUPC, "RxUni"),
1609 + MIB_DESC(1, MT7621_STATS_RMPC, "RxMulti"),
1610 + MIB_DESC(1, MT7621_STATS_RBPC, "RxBroad"),
1611 + MIB_DESC(1, MT7621_STATS_RAEPC, "RxAlignErr"),
1612 + MIB_DESC(1, MT7621_STATS_RCEPC, "RxCRC"),
1613 + MIB_DESC(1, MT7621_STATS_RUSPC, "RxUnderSize"),
1614 + MIB_DESC(1, MT7621_STATS_RFEPC, "RxFragment"),
1615 + MIB_DESC(1, MT7621_STATS_ROSPC, "RxOverSize"),
1616 + MIB_DESC(1, MT7621_STATS_RJEPC, "RxJabber"),
1617 + MIB_DESC(1, MT7621_STATS_RPPC, "RxPause"),
1618 + MIB_DESC(1, MT7621_STATS_RL64PC, "Rx64Byte"),
1619 + MIB_DESC(1, MT7621_STATS_RL65PC, "Rx65Byte"),
1620 + MIB_DESC(1, MT7621_STATS_RL128PC, "Rx128Byte"),
1621 + MIB_DESC(1, MT7621_STATS_RL256PC, "Rx256Byte"),
1622 + MIB_DESC(1, MT7621_STATS_RL512PC, "Rx512Byte"),
1623 + MIB_DESC(1, MT7621_STATS_RL1024PC, "Rx1024Byte"),
1624 + MIB_DESC(2, MT7621_STATS_ROC, "RxByte"),
1625 + MIB_DESC(1, MT7621_STATS_RDPC_CTRL, "RxCtrlDrop"),
1626 + MIB_DESC(1, MT7621_STATS_RDPC_ING, "RxIngDrop"),
1627 + MIB_DESC(1, MT7621_STATS_RDPC_ARL, "RxARLDrop")
1628 +};
1629 +
1630 +enum {
1631 + /* Global attributes. */
1632 + MT7530_ATTR_ENABLE_VLAN,
1633 +};
1634 +
1635 +struct mt7530_port_entry {
1636 + u16 pvid;
1637 +};
1638 +
1639 +struct mt7530_vlan_entry {
1640 + u16 vid;
1641 + u8 member;
1642 + u8 etags;
1643 +};
1644 +
1645 +struct mt7530_priv {
1646 + void __iomem *base;
1647 + struct mii_bus *bus;
1648 + struct switch_dev swdev;
1649 +
1650 + bool global_vlan_enable;
1651 + struct mt7530_vlan_entry vlan_entries[MT7530_NUM_VLANS];
1652 + struct mt7530_port_entry port_entries[MT7530_NUM_PORTS];
1653 +};
1654 +
1655 +struct mt7530_mapping {
1656 + char *name;
1657 + u16 pvids[MT7530_NUM_PORTS];
1658 + u8 members[MT7530_NUM_VLANS];
1659 + u8 etags[MT7530_NUM_VLANS];
1660 + u16 vids[MT7530_NUM_VLANS];
1661 +} mt7530_defaults[] = {
1662 + {
1663 + .name = "llllw",
1664 + .pvids = { 1, 1, 1, 1, 2, 1, 1 },
1665 + .members = { 0, 0x6f, 0x50 },
1666 + .etags = { 0, 0x40, 0x40 },
1667 + .vids = { 0, 1, 2 },
1668 + }, {
1669 + .name = "wllll",
1670 + .pvids = { 2, 1, 1, 1, 1, 1, 1 },
1671 + .members = { 0, 0x7e, 0x41 },
1672 + .etags = { 0, 0x40, 0x40 },
1673 + .vids = { 0, 1, 2 },
1674 + },
1675 +};
1676 +
1677 +struct mt7530_mapping*
1678 +mt7530_find_mapping(struct device_node *np)
1679 +{
1680 + const char *map;
1681 + int i;
1682 +
1683 + if (of_property_read_string(np, "mediatek,portmap", &map))
1684 + return NULL;
1685 +
1686 + for (i = 0; i < ARRAY_SIZE(mt7530_defaults); i++)
1687 + if (!strcmp(map, mt7530_defaults[i].name))
1688 + return &mt7530_defaults[i];
1689 +
1690 + return NULL;
1691 +}
1692 +
1693 +static void
1694 +mt7530_apply_mapping(struct mt7530_priv *mt7530, struct mt7530_mapping *map)
1695 +{
1696 + int i = 0;
1697 +
1698 + for (i = 0; i < MT7530_NUM_PORTS; i++)
1699 + mt7530->port_entries[i].pvid = map->pvids[i];
1700 +
1701 + for (i = 0; i < MT7530_NUM_VLANS; i++) {
1702 + mt7530->vlan_entries[i].member = map->members[i];
1703 + mt7530->vlan_entries[i].etags = map->etags[i];
1704 + mt7530->vlan_entries[i].vid = map->vids[i];
1705 + }
1706 +}
1707 +
1708 +static int
1709 +mt7530_reset_switch(struct switch_dev *dev)
1710 +{
1711 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
1712 + int i;
1713 +
1714 + memset(eth->port_entries, 0, sizeof(eth->port_entries));
1715 + memset(eth->vlan_entries, 0, sizeof(eth->vlan_entries));
1716 +
1717 + /* set default vid of each vlan to the same number of vlan, so the vid
1718 + * won't need be set explicitly.
1719 + */
1720 + for (i = 0; i < MT7530_NUM_VLANS; i++) {
1721 + eth->vlan_entries[i].vid = i;
1722 + }
1723 +
1724 + return 0;
1725 +}
1726 +
1727 +static int
1728 +mt7530_get_vlan_enable(struct switch_dev *dev,
1729 + const struct switch_attr *attr,
1730 + struct switch_val *val)
1731 +{
1732 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
1733 +
1734 + val->value.i = eth->global_vlan_enable;
1735 +
1736 + return 0;
1737 +}
1738 +
1739 +static int
1740 +mt7530_set_vlan_enable(struct switch_dev *dev,
1741 + const struct switch_attr *attr,
1742 + struct switch_val *val)
1743 +{
1744 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
1745 +
1746 + eth->global_vlan_enable = val->value.i != 0;
1747 +
1748 + return 0;
1749 +}
1750 +
1751 +static u32
1752 +mt7530_r32(struct mt7530_priv *eth, u32 reg)
1753 +{
1754 + u32 val;
1755 + if (eth->bus) {
1756 + u16 high, low;
1757 +
1758 + mdiobus_write(eth->bus, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
1759 + low = mdiobus_read(eth->bus, 0x1f, (reg >> 2) & 0xf);
1760 + high = mdiobus_read(eth->bus, 0x1f, 0x10);
1761 +
1762 + return (high << 16) | (low & 0xffff);
1763 + }
1764 +
1765 + val = ioread32(eth->base + reg);
1766 + pr_debug("MT7530 MDIO Read [%04x]=%08x\n", reg, val);
1767 +
1768 + return val;
1769 +}
1770 +
1771 +static void
1772 +mt7530_w32(struct mt7530_priv *eth, u32 reg, u32 val)
1773 +{
1774 + if (eth->bus) {
1775 + mdiobus_write(eth->bus, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
1776 + mdiobus_write(eth->bus, 0x1f, (reg >> 2) & 0xf, val & 0xffff);
1777 + mdiobus_write(eth->bus, 0x1f, 0x10, val >> 16);
1778 + return;
1779 + }
1780 +
1781 + pr_debug("MT7530 MDIO Write[%04x]=%08x\n", reg, val);
1782 + iowrite32(val, eth->base + reg);
1783 +}
1784 +
1785 +static void
1786 +mt7530_vtcr(struct mt7530_priv *eth, u32 cmd, u32 val)
1787 +{
1788 + int i;
1789 +
1790 + mt7530_w32(eth, REG_ESW_VLAN_VTCR, BIT(31) | (cmd << 12) | val);
1791 +
1792 + for (i = 0; i < 20; i++) {
1793 + u32 val = mt7530_r32(eth, REG_ESW_VLAN_VTCR);
1794 +
1795 + if ((val & BIT(31)) == 0)
1796 + break;
1797 +
1798 + udelay(1000);
1799 + }
1800 + if (i == 20)
1801 + printk("mt7530: vtcr timeout\n");
1802 +}
1803 +
1804 +static int
1805 +mt7530_get_port_pvid(struct switch_dev *dev, int port, int *val)
1806 +{
1807 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
1808 +
1809 + if (port >= MT7530_NUM_PORTS)
1810 + return -EINVAL;
1811 +
1812 + *val = mt7530_r32(eth, REG_ESW_PORT_PPBV1(port));
1813 + *val &= 0xfff;
1814 +
1815 + return 0;
1816 +}
1817 +
1818 +static int
1819 +mt7530_set_port_pvid(struct switch_dev *dev, int port, int pvid)
1820 +{
1821 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
1822 +
1823 + if (port >= MT7530_NUM_PORTS)
1824 + return -EINVAL;
1825 +
1826 + if (pvid < MT7530_MIN_VID || pvid > MT7530_MAX_VID)
1827 + return -EINVAL;
1828 +
1829 + eth->port_entries[port].pvid = pvid;
1830 +
1831 + return 0;
1832 +}
1833 +
1834 +static int
1835 +mt7530_get_vlan_ports(struct switch_dev *dev, struct switch_val *val)
1836 +{
1837 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
1838 + u32 member;
1839 + u32 etags;
1840 + int i;
1841 +
1842 + val->len = 0;
1843 +
1844 + if (val->port_vlan < 0 || val->port_vlan >= MT7530_NUM_VLANS)
1845 + return -EINVAL;
1846 +
1847 + mt7530_vtcr(eth, 0, val->port_vlan);
1848 +
1849 + member = mt7530_r32(eth, REG_ESW_VLAN_VAWD1);
1850 + member >>= 16;
1851 + member &= 0xff;
1852 +
1853 + etags = mt7530_r32(eth, REG_ESW_VLAN_VAWD2);
1854 +
1855 + for (i = 0; i < MT7530_NUM_PORTS; i++) {
1856 + struct switch_port *p;
1857 + int etag;
1858 +
1859 + if (!(member & BIT(i)))
1860 + continue;
1861 +
1862 + p = &val->value.ports[val->len++];
1863 + p->id = i;
1864 +
1865 + etag = (etags >> (i * 2)) & 0x3;
1866 +
1867 + if (etag == ETAG_CTRL_TAG)
1868 + p->flags |= BIT(SWITCH_PORT_FLAG_TAGGED);
1869 + else if (etag != ETAG_CTRL_UNTAG)
1870 + printk("vlan egress tag control neither untag nor tag.\n");
1871 + }
1872 +
1873 + return 0;
1874 +}
1875 +
1876 +static int
1877 +mt7530_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
1878 +{
1879 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
1880 + u8 member = 0;
1881 + u8 etags = 0;
1882 + int i;
1883 +
1884 + if (val->port_vlan < 0 || val->port_vlan >= MT7530_NUM_VLANS ||
1885 + val->len > MT7530_NUM_PORTS)
1886 + return -EINVAL;
1887 +
1888 + for (i = 0; i < val->len; i++) {
1889 + struct switch_port *p = &val->value.ports[i];
1890 +
1891 + if (p->id >= MT7530_NUM_PORTS)
1892 + return -EINVAL;
1893 +
1894 + member |= BIT(p->id);
1895 +
1896 + if (p->flags & BIT(SWITCH_PORT_FLAG_TAGGED))
1897 + etags |= BIT(p->id);
1898 + }
1899 + eth->vlan_entries[val->port_vlan].member = member;
1900 + eth->vlan_entries[val->port_vlan].etags = etags;
1901 +
1902 + return 0;
1903 +}
1904 +
1905 +static int
1906 +mt7530_set_vid(struct switch_dev *dev, const struct switch_attr *attr,
1907 + struct switch_val *val)
1908 +{
1909 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
1910 + int vlan;
1911 + u16 vid;
1912 +
1913 + vlan = val->port_vlan;
1914 + vid = (u16)val->value.i;
1915 +
1916 + if (vlan < 0 || vlan >= MT7530_NUM_VLANS)
1917 + return -EINVAL;
1918 +
1919 + if (vid < MT7530_MIN_VID || vid > MT7530_MAX_VID)
1920 + return -EINVAL;
1921 +
1922 + eth->vlan_entries[vlan].vid = vid;
1923 + return 0;
1924 +}
1925 +
1926 +static int
1927 +mt7530_get_vid(struct switch_dev *dev, const struct switch_attr *attr,
1928 + struct switch_val *val)
1929 +{
1930 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
1931 + u32 vid;
1932 + int vlan;
1933 +
1934 + vlan = val->port_vlan;
1935 +
1936 + vid = mt7530_r32(eth, REG_ESW_VLAN_VTIM(vlan));
1937 + if (vlan & 1)
1938 + vid = vid >> 12;
1939 + vid &= 0xfff;
1940 +
1941 + val->value.i = vid;
1942 + return 0;
1943 +}
1944 +
1945 +static int
1946 +mt7530_apply_config(struct switch_dev *dev)
1947 +{
1948 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
1949 + int i, j;
1950 + u8 tag_ports;
1951 + u8 untag_ports;
1952 +
1953 + if (!eth->global_vlan_enable) {
1954 + for (i = 0; i < MT7530_NUM_PORTS; i++)
1955 + mt7530_w32(eth, REG_ESW_PORT_PCR(i), 0x00ff0000);
1956 +
1957 + for (i = 0; i < MT7530_NUM_PORTS; i++)
1958 + mt7530_w32(eth, REG_ESW_PORT_PVC(i), 0x810000c0);
1959 +
1960 + return 0;
1961 + }
1962 +
1963 + /* set all ports as security mode */
1964 + for (i = 0; i < MT7530_NUM_PORTS; i++)
1965 + mt7530_w32(eth, REG_ESW_PORT_PCR(i), 0x00ff0003);
1966 +
1967 + /* check if a port is used in tag/untag vlan egress mode */
1968 + tag_ports = 0;
1969 + untag_ports = 0;
1970 +
1971 + for (i = 0; i < MT7530_NUM_VLANS; i++) {
1972 + u8 member = eth->vlan_entries[i].member;
1973 + u8 etags = eth->vlan_entries[i].etags;
1974 +
1975 + if (!member)
1976 + continue;
1977 +
1978 + for (j = 0; j < MT7530_NUM_PORTS; j++) {
1979 + if (!(member & BIT(j)))
1980 + continue;
1981 +
1982 + if (etags & BIT(j))
1983 + tag_ports |= 1u << j;
1984 + else
1985 + untag_ports |= 1u << j;
1986 + }
1987 + }
1988 +
1989 + /* set all untag-only ports as transparent and the rest as user port */
1990 + for (i = 0; i < MT7530_NUM_PORTS; i++) {
1991 + u32 pvc_mode = 0x81000000;
1992 +
1993 + if (untag_ports & BIT(i) && !(tag_ports & BIT(i)))
1994 + pvc_mode = 0x810000c0;
1995 +
1996 + mt7530_w32(eth, REG_ESW_PORT_PVC(i), pvc_mode);
1997 + }
1998 +
1999 + for (i = 0; i < MT7530_NUM_VLANS; i++) {
2000 + u16 vid = eth->vlan_entries[i].vid;
2001 + u8 member = eth->vlan_entries[i].member;
2002 + u8 etags = eth->vlan_entries[i].etags;
2003 + u32 val;
2004 +
2005 + /* vid of vlan */
2006 + val = mt7530_r32(eth, REG_ESW_VLAN_VTIM(i));
2007 + if (i % 2 == 0) {
2008 + val &= 0xfff000;
2009 + val |= vid;
2010 + } else {
2011 + val &= 0xfff;
2012 + val |= (vid << 12);
2013 + }
2014 + mt7530_w32(eth, REG_ESW_VLAN_VTIM(i), val);
2015 +
2016 + /* vlan port membership */
2017 + if (member)
2018 + mt7530_w32(eth, REG_ESW_VLAN_VAWD1, REG_ESW_VLAN_VAWD1_IVL_MAC |
2019 + REG_ESW_VLAN_VAWD1_VTAG_EN | (member << 16) |
2020 + REG_ESW_VLAN_VAWD1_VALID);
2021 + else
2022 + mt7530_w32(eth, REG_ESW_VLAN_VAWD1, 0);
2023 +
2024 + /* egress mode */
2025 + val = 0;
2026 + for (j = 0; j < MT7530_NUM_PORTS; j++) {
2027 + if (etags & BIT(j))
2028 + val |= ETAG_CTRL_TAG << (j * 2);
2029 + else
2030 + val |= ETAG_CTRL_UNTAG << (j * 2);
2031 + }
2032 + mt7530_w32(eth, REG_ESW_VLAN_VAWD2, val);
2033 +
2034 + /* write to vlan table */
2035 + mt7530_vtcr(eth, 1, i);
2036 + }
2037 +
2038 + /* Port Default PVID */
2039 + for (i = 0; i < MT7530_NUM_PORTS; i++) {
2040 + u32 val;
2041 + val = mt7530_r32(eth, REG_ESW_PORT_PPBV1(i));
2042 + val &= ~0xfff;
2043 + val |= eth->port_entries[i].pvid;
2044 + mt7530_w32(eth, REG_ESW_PORT_PPBV1(i), val);
2045 + }
2046 +
2047 + return 0;
2048 +}
2049 +
2050 +static int
2051 +mt7530_get_port_link(struct switch_dev *dev, int port,
2052 + struct switch_port_link *link)
2053 +{
2054 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
2055 + u32 speed, pmsr;
2056 +
2057 + if (port < 0 || port >= MT7530_NUM_PORTS)
2058 + return -EINVAL;
2059 +
2060 + pmsr = mt7530_r32(eth, 0x3008 + (0x100 * port));
2061 +
2062 + link->link = pmsr & 1;
2063 + link->duplex = (pmsr >> 1) & 1;
2064 + speed = (pmsr >> 2) & 3;
2065 +
2066 + switch (speed) {
2067 + case 0:
2068 + link->speed = SWITCH_PORT_SPEED_10;
2069 + break;
2070 + case 1:
2071 + link->speed = SWITCH_PORT_SPEED_100;
2072 + break;
2073 + case 2:
2074 + case 3: /* forced gige speed can be 2 or 3 */
2075 + link->speed = SWITCH_PORT_SPEED_1000;
2076 + break;
2077 + default:
2078 + link->speed = SWITCH_PORT_SPEED_UNKNOWN;
2079 + break;
2080 + }
2081 +
2082 + return 0;
2083 +}
2084 +
2085 +static const struct switch_attr mt7530_global[] = {
2086 + {
2087 + .type = SWITCH_TYPE_INT,
2088 + .name = "enable_vlan",
2089 + .description = "VLAN mode (1:enabled)",
2090 + .max = 1,
2091 + .id = MT7530_ATTR_ENABLE_VLAN,
2092 + .get = mt7530_get_vlan_enable,
2093 + .set = mt7530_set_vlan_enable,
2094 + },
2095 +};
2096 +
2097 +static u64 get_mib_counter(struct mt7530_priv *eth, int i, int port)
2098 +{
2099 + unsigned int port_base;
2100 + u64 t;
2101 +
2102 + port_base = MT7621_MIB_COUNTER_BASE +
2103 + MT7621_MIB_COUNTER_PORT_OFFSET * port;
2104 +
2105 + t = mt7530_r32(eth, port_base + mt7621_mibs[i].offset);
2106 + if (mt7621_mibs[i].size == 2) {
2107 + u64 hi;
2108 +
2109 + hi = mt7530_r32(eth, port_base + mt7621_mibs[i].offset + 4);
2110 + t |= hi << 32;
2111 + }
2112 +
2113 + return t;
2114 +}
2115 +
2116 +static int mt7621_sw_get_port_mib(struct switch_dev *dev,
2117 + const struct switch_attr *attr,
2118 + struct switch_val *val)
2119 +{
2120 + static char buf[4096];
2121 + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
2122 + int i, len = 0;
2123 +
2124 + if (val->port_vlan >= MT7530_NUM_PORTS)
2125 + return -EINVAL;
2126 +
2127 + len += snprintf(buf + len, sizeof(buf) - len,
2128 + "Port %d MIB counters\n", val->port_vlan);
2129 +
2130 + for (i = 0; i < sizeof(mt7621_mibs) / sizeof(*mt7621_mibs); ++i) {
2131 + u64 counter;
2132 + len += snprintf(buf + len, sizeof(buf) - len,
2133 + "%-11s: ", mt7621_mibs[i].name);
2134 + counter = get_mib_counter(eth, i, val->port_vlan);
2135 + len += snprintf(buf + len, sizeof(buf) - len, "%llu\n",
2136 + counter);
2137 + }
2138 +
2139 + val->value.s = buf;
2140 + val->len = len;
2141 + return 0;
2142 +}
2143 +
2144 +static const struct switch_attr mt7621_port[] = {
2145 + {
2146 + .type = SWITCH_TYPE_STRING,
2147 + .name = "mib",
2148 + .description = "Get MIB counters for port",
2149 + .get = mt7621_sw_get_port_mib,
2150 + .set = NULL,
2151 + },
2152 +};
2153 +
2154 +static const struct switch_attr mt7530_port[] = {
2155 +};
2156 +
2157 +static const struct switch_attr mt7530_vlan[] = {
2158 + {
2159 + .type = SWITCH_TYPE_INT,
2160 + .name = "vid",
2161 + .description = "VLAN ID (0-4094)",
2162 + .set = mt7530_set_vid,
2163 + .get = mt7530_get_vid,
2164 + .max = 4094,
2165 + },
2166 +};
2167 +
2168 +static const struct switch_dev_ops mt7621_ops = {
2169 + .attr_global = {
2170 + .attr = mt7530_global,
2171 + .n_attr = ARRAY_SIZE(mt7530_global),
2172 + },
2173 +/* .attr_port = {
2174 + .attr = mt7621_port,
2175 + .n_attr = ARRAY_SIZE(mt7621_port),
2176 + },*/
2177 + .attr_vlan = {
2178 + .attr = mt7530_vlan,
2179 + .n_attr = ARRAY_SIZE(mt7530_vlan),
2180 + },
2181 + .get_vlan_ports = mt7530_get_vlan_ports,
2182 + .set_vlan_ports = mt7530_set_vlan_ports,
2183 + .get_port_pvid = mt7530_get_port_pvid,
2184 + .set_port_pvid = mt7530_set_port_pvid,
2185 + .get_port_link = mt7530_get_port_link,
2186 + .apply_config = mt7530_apply_config,
2187 + .reset_switch = mt7530_reset_switch,
2188 +};
2189 +
2190 +static const struct switch_dev_ops mt7530_ops = {
2191 + .attr_global = {
2192 + .attr = mt7530_global,
2193 + .n_attr = ARRAY_SIZE(mt7530_global),
2194 + },
2195 + .attr_port = {
2196 + .attr = mt7530_port,
2197 + .n_attr = ARRAY_SIZE(mt7530_port),
2198 + },
2199 + .attr_vlan = {
2200 + .attr = mt7530_vlan,
2201 + .n_attr = ARRAY_SIZE(mt7530_vlan),
2202 + },
2203 + .get_vlan_ports = mt7530_get_vlan_ports,
2204 + .set_vlan_ports = mt7530_set_vlan_ports,
2205 + .get_port_pvid = mt7530_get_port_pvid,
2206 + .set_port_pvid = mt7530_set_port_pvid,
2207 + .get_port_link = mt7530_get_port_link,
2208 + .apply_config = mt7530_apply_config,
2209 + .reset_switch = mt7530_reset_switch,
2210 +};
2211 +
2212 +int
2213 +mt7530_probe(struct device *dev, void __iomem *base, struct mii_bus *bus, int vlan)
2214 +{
2215 + struct switch_dev *swdev;
2216 + struct mt7530_priv *mt7530;
2217 + struct mt7530_mapping *map;
2218 + int ret;
2219 +
2220 + mt7530 = devm_kzalloc(dev, sizeof(struct mt7530_priv), GFP_KERNEL);
2221 + if (!mt7530)
2222 + return -ENOMEM;
2223 +
2224 + mt7530->base = base;
2225 + mt7530->bus = bus;
2226 + mt7530->global_vlan_enable = vlan;
2227 +
2228 + swdev = &mt7530->swdev;
2229 + if (bus) {
2230 + swdev->alias = "mt7530";
2231 + swdev->name = "mt7530";
2232 + } else if (IS_ENABLED(CONFIG_MACH_MT7623)) {
2233 + swdev->alias = "mt7623";
2234 + swdev->name = "mt7623";
2235 + } else if (IS_ENABLED(CONFIG_SOC_MT7621)) {
2236 + swdev->alias = "mt7621";
2237 + swdev->name = "mt7621";
2238 + } else {
2239 + swdev->alias = "mt7620";
2240 + swdev->name = "mt7620";
2241 + }
2242 + swdev->cpu_port = MT7530_CPU_PORT;
2243 + swdev->ports = MT7530_NUM_PORTS;
2244 + swdev->vlans = MT7530_NUM_VLANS;
2245 + if (IS_ENABLED(CONFIG_SOC_MT7621) || IS_ENABLED(CONFIG_MACH_MT7623))
2246 + swdev->ops = &mt7621_ops;
2247 + else
2248 + swdev->ops = &mt7530_ops;
2249 +
2250 + ret = register_switch(swdev, NULL);
2251 + if (ret) {
2252 + dev_err(dev, "failed to register mt7530\n");
2253 + return ret;
2254 + }
2255 +
2256 + mt7530_reset_switch(swdev);
2257 +
2258 + map = mt7530_find_mapping(dev->of_node);
2259 + if (map)
2260 + mt7530_apply_mapping(mt7530, map);
2261 + mt7530_apply_config(swdev);
2262 +
2263 + /* magic vodoo */
2264 + if (!(IS_ENABLED(CONFIG_SOC_MT7621) || IS_ENABLED(CONFIG_MACH_MT7623)) && bus && mt7530_r32(mt7530, REG_HWTRAP) != 0x1117edf) {
2265 + dev_info(dev, "fixing up MHWTRAP register - bootloader probably played with it\n");
2266 + mt7530_w32(mt7530, REG_HWTRAP, 0x1117edf);
2267 + }
2268 + dev_info(dev, "loaded %s driver\n", swdev->name);
2269 +
2270 + return 0;
2271 +}
2272 diff --git a/drivers/net/ethernet/mediatek/mt7530.h b/drivers/net/ethernet/mediatek/mt7530.h
2273 new file mode 100644
2274 index 0000000..1fc8c62
2275 --- /dev/null
2276 +++ b/drivers/net/ethernet/mediatek/mt7530.h
2277 @@ -0,0 +1,20 @@
2278 +/*
2279 + * This program is free software; you can redistribute it and/or
2280 + * modify it under the terms of the GNU General Public License
2281 + * as published by the Free Software Foundation; either version 2
2282 + * of the License, or (at your option) any later version.
2283 + *
2284 + * This program is distributed in the hope that it will be useful,
2285 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2286 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2287 + * GNU General Public License for more details.
2288 + *
2289 + * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
2290 + */
2291 +
2292 +#ifndef _MT7530_H__
2293 +#define _MT7530_H__
2294 +
2295 +int mt7530_probe(struct device *dev, void __iomem *base, struct mii_bus *bus, int vlan);
2296 +
2297 +#endif
2298 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
2299 index 7f2126b..dd7f6e3 100644
2300 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
2301 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
2302 @@ -24,6 +24,9 @@
2303
2304 #include "mtk_eth_soc.h"
2305
2306 +/* the callback used by the driver core to bringup the switch */
2307 +int mtk_gsw_init(struct mtk_eth *eth);
2308 +
2309 static int mtk_msg_level = -1;
2310 module_param_named(msg_level, mtk_msg_level, int, 0);
2311 MODULE_PARM_DESC(msg_level, "Message level (-1=defaults,0=none,...,16=all)");
2312 @@ -69,7 +72,7 @@ static int mtk_mdio_busy_wait(struct mtk_eth *eth)
2313 return 0;
2314 if (time_after(jiffies, t_start + PHY_IAC_TIMEOUT))
2315 break;
2316 - usleep_range(10, 20);
2317 +// usleep_range(10, 20);
2318 }
2319
2320 dev_err(eth->dev, "mdio: MDIO timeout\n");
2321 @@ -138,6 +141,15 @@ static void mtk_phy_link_adjust(struct net_device *dev)
2322 MAC_MCR_RX_EN | MAC_MCR_BACKOFF_EN |
2323 MAC_MCR_BACKPR_EN;
2324
2325 + if (!mac->id) {
2326 + mcr |= MAC_MCR_SPEED_1000;
2327 + mcr |= MAC_MCR_FORCE_LINK;
2328 + mcr |= MAC_MCR_FORCE_DPX;
2329 + mcr |= MAC_MCR_FORCE_RX_FC | MAC_MCR_FORCE_TX_FC;
2330 + mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
2331 + return;
2332 + }
2333 +
2334 switch (mac->phy_dev->speed) {
2335 case SPEED_1000:
2336 mcr |= MAC_MCR_SPEED_1000;
2337 @@ -157,11 +169,12 @@ static void mtk_phy_link_adjust(struct net_device *dev)
2338 mcr |= MAC_MCR_FORCE_RX_FC | MAC_MCR_FORCE_TX_FC;
2339
2340 mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
2341 -
2342 if (mac->phy_dev->link)
2343 netif_carrier_on(dev);
2344 else
2345 netif_carrier_off(dev);
2346 +
2347 + return;
2348 }
2349
2350 static int mtk_phy_connect_node(struct mtk_eth *eth, struct mtk_mac *mac,
2351 @@ -193,7 +206,7 @@ static int mtk_phy_connect_node(struct mtk_eth *eth, struct mtk_mac *mac,
2352
2353 dev_info(eth->dev,
2354 "connected mac %d to PHY at %s [uid=%08x, driver=%s]\n",
2355 - mac->id, phydev_name(phydev), phydev->phy_id,
2356 + mac->id, dev_name(&phydev->dev), phydev->phy_id,
2357 phydev->drv->name);
2358
2359 mac->phy_dev = phydev;
2360 @@ -634,7 +647,6 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
2361
2362 spin_unlock_irqrestore(&eth->page_lock, flags);
2363
2364 - netdev_sent_queue(dev, skb->len);
2365 skb_tx_timestamp(skb);
2366
2367 ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2);
2368 @@ -884,7 +896,6 @@ static int mtk_poll_tx(struct mtk_eth *eth, int budget, bool *tx_again)
2369 for (i = 0; i < MTK_MAC_COUNT; i++) {
2370 if (!eth->netdev[i] || !done[i])
2371 continue;
2372 - netdev_completed_queue(eth->netdev[i], done[i], bytes[i]);
2373 total += done[i];
2374 }
2375
2376 @@ -1251,6 +1262,8 @@ static int mtk_open(struct net_device *dev)
2377 phy_start(mac->phy_dev);
2378 netif_start_queue(dev);
2379
2380 + netif_carrier_on(dev);
2381 +
2382 return 0;
2383 }
2384
2385 @@ -1283,6 +1296,7 @@ static int mtk_stop(struct net_device *dev)
2386 struct mtk_mac *mac = netdev_priv(dev);
2387 struct mtk_eth *eth = mac->hw;
2388
2389 + netif_carrier_off(dev);
2390 netif_tx_disable(dev);
2391 phy_stop(mac->phy_dev);
2392
2393 @@ -1328,6 +1342,7 @@ static int __init mtk_hw_init(struct mtk_eth *eth)
2394 /* Enable RX VLan Offloading */
2395 mtk_w32(eth, 1, MTK_CDMP_EG_CTRL);
2396
2397 + mtk_gsw_init(eth);
2398 err = devm_request_irq(eth->dev, eth->irq, mtk_handle_irq, 0,
2399 dev_name(eth->dev), eth);
2400 if (err)
2401 @@ -1360,6 +1375,8 @@ static int __init mtk_hw_init(struct mtk_eth *eth)
2402 mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i));
2403 }
2404
2405 + mt7623_gsw_config(eth);
2406 +
2407 return 0;
2408 }
2409
2410 @@ -1466,11 +1483,13 @@ static int mtk_set_settings(struct net_device *dev,
2411 {
2412 struct mtk_mac *mac = netdev_priv(dev);
2413
2414 - if (cmd->phy_address != mac->phy_dev->mdio.addr) {
2415 - mac->phy_dev = mdiobus_get_phy(mac->hw->mii_bus,
2416 - cmd->phy_address);
2417 - if (!mac->phy_dev)
2418 + if (cmd->phy_address != mac->phy_dev->addr) {
2419 + if (mac->hw->mii_bus->phy_map[cmd->phy_address]) {
2420 + mac->phy_dev =
2421 + mac->hw->mii_bus->phy_map[cmd->phy_address];
2422 + } else {
2423 return -ENODEV;
2424 + }
2425 }
2426
2427 return phy_ethtool_sset(mac->phy_dev, cmd);
2428 @@ -1563,7 +1582,6 @@ static void mtk_get_ethtool_stats(struct net_device *dev,
2429 data_src = (u64*)hwstats;
2430 data_dst = data;
2431 start = u64_stats_fetch_begin_irq(&hwstats->syncp);
2432 -
2433 for (i = 0; i < ARRAY_SIZE(mtk_ethtool_stats); i++)
2434 *data_dst++ = *(data_src + mtk_ethtool_stats[i].offset);
2435 } while (u64_stats_fetch_retry_irq(&hwstats->syncp, start));
2436 @@ -1734,6 +1752,9 @@ static int mtk_probe(struct platform_device *pdev)
2437 clk_prepare_enable(eth->clk_gp1);
2438 clk_prepare_enable(eth->clk_gp2);
2439
2440 + eth->switch_np = of_parse_phandle(pdev->dev.of_node,
2441 + "mediatek,switch", 0);
2442 +
2443 eth->dev = &pdev->dev;
2444 eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE);
2445
2446 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
2447 index 48a5292..d737d61 100644
2448 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
2449 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
2450 @@ -389,6 +389,9 @@ struct mtk_eth {
2451 struct clk *clk_gp1;
2452 struct clk *clk_gp2;
2453 struct mii_bus *mii_bus;
2454 +
2455 + struct device_node *switch_np;
2456 + void *sw_priv;
2457 };
2458
2459 /* struct mtk_mac - the structure that holds the info about the MACs of the
2460 @@ -418,4 +421,6 @@ void mtk_stats_update_mac(struct mtk_mac *mac);
2461 void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg);
2462 u32 mtk_r32(struct mtk_eth *eth, unsigned reg);
2463
2464 +int mt7623_gsw_config(struct mtk_eth *eth);
2465 +
2466 #endif /* MTK_ETH_H */
2467 --
2468 1.7.10.4
2469