xref: /linux/drivers/net/dsa/lantiq/lantiq_gswip.h (revision cb477c30512db29325c0503ba96a6158a61b7e7c)
1*cb477c30SDaniel Golle // SPDX-License-Identifier: GPL-2.0
2*cb477c30SDaniel Golle #ifndef __LANTIQ_GSWIP_H
3*cb477c30SDaniel Golle #define __LANTIQ_GSWIP_H
4*cb477c30SDaniel Golle 
5*cb477c30SDaniel Golle #include <linux/clk.h>
6*cb477c30SDaniel Golle #include <linux/mutex.h>
7*cb477c30SDaniel Golle #include <linux/platform_device.h>
8*cb477c30SDaniel Golle #include <linux/regmap.h>
9*cb477c30SDaniel Golle #include <linux/reset.h>
10*cb477c30SDaniel Golle #include <linux/swab.h>
11*cb477c30SDaniel Golle #include <net/dsa.h>
12*cb477c30SDaniel Golle 
13*cb477c30SDaniel Golle /* GSWIP MDIO Registers */
14*cb477c30SDaniel Golle #define GSWIP_MDIO_GLOB			0x00
15*cb477c30SDaniel Golle #define  GSWIP_MDIO_GLOB_ENABLE		BIT(15)
16*cb477c30SDaniel Golle #define GSWIP_MDIO_CTRL			0x08
17*cb477c30SDaniel Golle #define  GSWIP_MDIO_CTRL_BUSY		BIT(12)
18*cb477c30SDaniel Golle #define  GSWIP_MDIO_CTRL_RD		BIT(11)
19*cb477c30SDaniel Golle #define  GSWIP_MDIO_CTRL_WR		BIT(10)
20*cb477c30SDaniel Golle #define  GSWIP_MDIO_CTRL_PHYAD_MASK	0x1f
21*cb477c30SDaniel Golle #define  GSWIP_MDIO_CTRL_PHYAD_SHIFT	5
22*cb477c30SDaniel Golle #define  GSWIP_MDIO_CTRL_REGAD_MASK	0x1f
23*cb477c30SDaniel Golle #define GSWIP_MDIO_READ			0x09
24*cb477c30SDaniel Golle #define GSWIP_MDIO_WRITE		0x0A
25*cb477c30SDaniel Golle #define GSWIP_MDIO_MDC_CFG0		0x0B
26*cb477c30SDaniel Golle #define GSWIP_MDIO_MDC_CFG1		0x0C
27*cb477c30SDaniel Golle #define GSWIP_MDIO_PHYp(p)		(0x15 - (p))
28*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_LINK_MASK	0x6000
29*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_LINK_AUTO	0x0000
30*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_LINK_DOWN	0x4000
31*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_LINK_UP		0x2000
32*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_SPEED_MASK	0x1800
33*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_SPEED_AUTO	0x1800
34*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_SPEED_M10	0x0000
35*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_SPEED_M100	0x0800
36*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_SPEED_G1	0x1000
37*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FDUP_MASK	0x0600
38*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FDUP_AUTO	0x0000
39*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FDUP_EN		0x0200
40*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FDUP_DIS	0x0600
41*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FCONTX_MASK	0x0180
42*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FCONTX_AUTO	0x0000
43*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FCONTX_EN	0x0100
44*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FCONTX_DIS	0x0180
45*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FCONRX_MASK	0x0060
46*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FCONRX_AUTO	0x0000
47*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FCONRX_EN	0x0020
48*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_FCONRX_DIS	0x0060
49*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_ADDR_MASK	0x001f
50*cb477c30SDaniel Golle #define  GSWIP_MDIO_PHY_MASK		(GSWIP_MDIO_PHY_ADDR_MASK | \
51*cb477c30SDaniel Golle 					 GSWIP_MDIO_PHY_FCONRX_MASK | \
52*cb477c30SDaniel Golle 					 GSWIP_MDIO_PHY_FCONTX_MASK | \
53*cb477c30SDaniel Golle 					 GSWIP_MDIO_PHY_LINK_MASK | \
54*cb477c30SDaniel Golle 					 GSWIP_MDIO_PHY_SPEED_MASK | \
55*cb477c30SDaniel Golle 					 GSWIP_MDIO_PHY_FDUP_MASK)
56*cb477c30SDaniel Golle 
57*cb477c30SDaniel Golle /* GSWIP MII Registers */
58*cb477c30SDaniel Golle #define GSWIP_MII_CFGp(p)		(0x2 * (p))
59*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_RESET		BIT(15)
60*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_EN		BIT(14)
61*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_ISOLATE		BIT(13)
62*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_LDCLKDIS		BIT(12)
63*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_RGMII_IBS	BIT(8)
64*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_RMII_CLK		BIT(7)
65*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_MODE_MIIP	0x0
66*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_MODE_MIIM	0x1
67*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_MODE_RMIIP	0x2
68*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_MODE_RMIIM	0x3
69*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_MODE_RGMII	0x4
70*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_MODE_GMII	0x9
71*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_MODE_MASK	0xf
72*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_RATE_M2P5	0x00
73*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_RATE_M25	0x10
74*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_RATE_M125	0x20
75*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_RATE_M50	0x30
76*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_RATE_AUTO	0x40
77*cb477c30SDaniel Golle #define  GSWIP_MII_CFG_RATE_MASK	0x70
78*cb477c30SDaniel Golle #define GSWIP_MII_PCDU0			0x01
79*cb477c30SDaniel Golle #define GSWIP_MII_PCDU1			0x03
80*cb477c30SDaniel Golle #define GSWIP_MII_PCDU5			0x05
81*cb477c30SDaniel Golle #define  GSWIP_MII_PCDU_TXDLY_MASK	GENMASK(2, 0)
82*cb477c30SDaniel Golle #define  GSWIP_MII_PCDU_RXDLY_MASK	GENMASK(9, 7)
83*cb477c30SDaniel Golle 
84*cb477c30SDaniel Golle /* GSWIP Core Registers */
85*cb477c30SDaniel Golle #define GSWIP_SWRES			0x000
86*cb477c30SDaniel Golle #define  GSWIP_SWRES_R1			BIT(1)	/* GSWIP Software reset */
87*cb477c30SDaniel Golle #define  GSWIP_SWRES_R0			BIT(0)	/* GSWIP Hardware reset */
88*cb477c30SDaniel Golle #define GSWIP_VERSION			0x013
89*cb477c30SDaniel Golle #define  GSWIP_VERSION_REV_MASK		GENMASK(7, 0)
90*cb477c30SDaniel Golle #define  GSWIP_VERSION_MOD_MASK		GENMASK(15, 8)
91*cb477c30SDaniel Golle #define  GSWIP_VERSION_REV(v)		FIELD_GET(GSWIP_VERSION_REV_MASK, v)
92*cb477c30SDaniel Golle #define  GSWIP_VERSION_MOD(v)		FIELD_GET(GSWIP_VERSION_MOD_MASK, v)
93*cb477c30SDaniel Golle #define   GSWIP_VERSION_2_0		0x100
94*cb477c30SDaniel Golle #define   GSWIP_VERSION_2_1		0x021
95*cb477c30SDaniel Golle #define   GSWIP_VERSION_2_2		0x122
96*cb477c30SDaniel Golle #define   GSWIP_VERSION_2_2_ETC		0x022
97*cb477c30SDaniel Golle /* The hardware has the 'major/minor' version bytes in the wrong order
98*cb477c30SDaniel Golle  * preventing numerical comparisons. Swap the bytes of the 16-bit value
99*cb477c30SDaniel Golle  * to end up with REV being the most significant byte and MOD being the
100*cb477c30SDaniel Golle  * least significant byte, which then allows comparing it with the
101*cb477c30SDaniel Golle  * value stored in struct gswip_priv.
102*cb477c30SDaniel Golle  */
103*cb477c30SDaniel Golle #define GSWIP_VERSION_GE(priv, ver)	((priv)->version >= swab16(ver))
104*cb477c30SDaniel Golle 
105*cb477c30SDaniel Golle #define GSWIP_BM_RAM_VAL(x)		(0x043 - (x))
106*cb477c30SDaniel Golle #define GSWIP_BM_RAM_ADDR		0x044
107*cb477c30SDaniel Golle #define GSWIP_BM_RAM_CTRL		0x045
108*cb477c30SDaniel Golle #define  GSWIP_BM_RAM_CTRL_BAS		BIT(15)
109*cb477c30SDaniel Golle #define  GSWIP_BM_RAM_CTRL_OPMOD	BIT(5)
110*cb477c30SDaniel Golle #define  GSWIP_BM_RAM_CTRL_ADDR_MASK	GENMASK(4, 0)
111*cb477c30SDaniel Golle #define GSWIP_BM_QUEUE_GCTRL		0x04A
112*cb477c30SDaniel Golle #define  GSWIP_BM_QUEUE_GCTRL_GL_MOD	BIT(10)
113*cb477c30SDaniel Golle /* buffer management Port Configuration Register */
114*cb477c30SDaniel Golle #define GSWIP_BM_PCFGp(p)		(0x080 + ((p) * 2))
115*cb477c30SDaniel Golle #define  GSWIP_BM_PCFG_CNTEN		BIT(0)	/* RMON Counter Enable */
116*cb477c30SDaniel Golle #define  GSWIP_BM_PCFG_IGCNT		BIT(1)	/* Ingres Special Tag RMON count */
117*cb477c30SDaniel Golle /* buffer management Port Control Register */
118*cb477c30SDaniel Golle #define GSWIP_BM_RMON_CTRLp(p)		(0x81 + ((p) * 2))
119*cb477c30SDaniel Golle #define  GSWIP_BM_CTRL_RMON_RAM1_RES	BIT(0)	/* Software Reset for RMON RAM 1 */
120*cb477c30SDaniel Golle #define  GSWIP_BM_CTRL_RMON_RAM2_RES	BIT(1)	/* Software Reset for RMON RAM 2 */
121*cb477c30SDaniel Golle 
122*cb477c30SDaniel Golle /* PCE */
123*cb477c30SDaniel Golle #define GSWIP_PCE_TBL_KEY(x)		(0x447 - (x))
124*cb477c30SDaniel Golle #define GSWIP_PCE_TBL_MASK		0x448
125*cb477c30SDaniel Golle #define GSWIP_PCE_TBL_VAL(x)		(0x44D - (x))
126*cb477c30SDaniel Golle #define GSWIP_PCE_TBL_ADDR		0x44E
127*cb477c30SDaniel Golle #define GSWIP_PCE_TBL_CTRL		0x44F
128*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_BAS		BIT(15)
129*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_TYPE	BIT(13)
130*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_VLD		BIT(12)
131*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_KEYFORM	BIT(11)
132*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_GMAP_MASK	GENMASK(10, 7)
133*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_OPMOD_MASK	GENMASK(6, 5)
134*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_OPMOD_ADRD	0x00
135*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_OPMOD_ADWR	0x20
136*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_OPMOD_KSRD	0x40
137*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_OPMOD_KSWR	0x60
138*cb477c30SDaniel Golle #define  GSWIP_PCE_TBL_CTRL_ADDR_MASK	GENMASK(4, 0)
139*cb477c30SDaniel Golle #define GSWIP_PCE_PMAP1			0x453	/* Monitoring port map */
140*cb477c30SDaniel Golle #define GSWIP_PCE_PMAP2			0x454	/* Default Multicast port map */
141*cb477c30SDaniel Golle #define GSWIP_PCE_PMAP3			0x455	/* Default Unknown Unicast port map */
142*cb477c30SDaniel Golle #define GSWIP_PCE_GCTRL_0		0x456
143*cb477c30SDaniel Golle #define  GSWIP_PCE_GCTRL_0_MTFL		BIT(0)  /* MAC Table Flushing */
144*cb477c30SDaniel Golle #define  GSWIP_PCE_GCTRL_0_MC_VALID	BIT(3)
145*cb477c30SDaniel Golle #define  GSWIP_PCE_GCTRL_0_VLAN		BIT(14) /* VLAN aware Switching */
146*cb477c30SDaniel Golle #define GSWIP_PCE_GCTRL_1		0x457
147*cb477c30SDaniel Golle #define  GSWIP_PCE_GCTRL_1_MAC_GLOCK	BIT(2)	/* MAC Address table lock */
148*cb477c30SDaniel Golle #define  GSWIP_PCE_GCTRL_1_MAC_GLOCK_MOD	BIT(3) /* Mac address table lock forwarding mode */
149*cb477c30SDaniel Golle #define GSWIP_PCE_PCTRL_0p(p)		(0x480 + ((p) * 0xA))
150*cb477c30SDaniel Golle #define  GSWIP_PCE_PCTRL_0_TVM		BIT(5)	/* Transparent VLAN mode */
151*cb477c30SDaniel Golle #define  GSWIP_PCE_PCTRL_0_VREP		BIT(6)	/* VLAN Replace Mode */
152*cb477c30SDaniel Golle #define  GSWIP_PCE_PCTRL_0_INGRESS	BIT(11)	/* Accept special tag in ingress */
153*cb477c30SDaniel Golle #define  GSWIP_PCE_PCTRL_0_PSTATE_LISTEN	0x0
154*cb477c30SDaniel Golle #define  GSWIP_PCE_PCTRL_0_PSTATE_RX		0x1
155*cb477c30SDaniel Golle #define  GSWIP_PCE_PCTRL_0_PSTATE_TX		0x2
156*cb477c30SDaniel Golle #define  GSWIP_PCE_PCTRL_0_PSTATE_LEARNING	0x3
157*cb477c30SDaniel Golle #define  GSWIP_PCE_PCTRL_0_PSTATE_FORWARDING	0x7
158*cb477c30SDaniel Golle #define  GSWIP_PCE_PCTRL_0_PSTATE_MASK	GENMASK(2, 0)
159*cb477c30SDaniel Golle #define GSWIP_PCE_VCTRL(p)		(0x485 + ((p) * 0xA))
160*cb477c30SDaniel Golle #define  GSWIP_PCE_VCTRL_UVR		BIT(0)	/* Unknown VLAN Rule */
161*cb477c30SDaniel Golle #define  GSWIP_PCE_VCTRL_VIMR		BIT(3)	/* VLAN Ingress Member violation rule */
162*cb477c30SDaniel Golle #define  GSWIP_PCE_VCTRL_VEMR		BIT(4)	/* VLAN Egress Member violation rule */
163*cb477c30SDaniel Golle #define  GSWIP_PCE_VCTRL_VSR		BIT(5)	/* VLAN Security */
164*cb477c30SDaniel Golle #define  GSWIP_PCE_VCTRL_VID0		BIT(6)	/* Priority Tagged Rule */
165*cb477c30SDaniel Golle #define GSWIP_PCE_DEFPVID(p)		(0x486 + ((p) * 0xA))
166*cb477c30SDaniel Golle 
167*cb477c30SDaniel Golle #define GSWIP_MAC_FLEN			0x8C5
168*cb477c30SDaniel Golle #define GSWIP_MAC_CTRL_0p(p)		(0x903 + ((p) * 0xC))
169*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_PADEN		BIT(8)
170*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FCS_EN	BIT(7)
171*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FCON_MASK	0x0070
172*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FCON_AUTO	0x0000
173*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FCON_RX	0x0010
174*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FCON_TX	0x0020
175*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FCON_RXTX	0x0030
176*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FCON_NONE	0x0040
177*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FDUP_MASK	0x000C
178*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FDUP_AUTO	0x0000
179*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FDUP_EN	0x0004
180*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_FDUP_DIS	0x000C
181*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_GMII_MASK	0x0003
182*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_GMII_AUTO	0x0000
183*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_GMII_MII	0x0001
184*cb477c30SDaniel Golle #define  GSWIP_MAC_CTRL_0_GMII_RGMII	0x0002
185*cb477c30SDaniel Golle #define GSWIP_MAC_CTRL_2p(p)		(0x905 + ((p) * 0xC))
186*cb477c30SDaniel Golle #define GSWIP_MAC_CTRL_2_LCHKL		BIT(2) /* Frame Length Check Long Enable */
187*cb477c30SDaniel Golle #define GSWIP_MAC_CTRL_2_MLEN		BIT(3) /* Maximum Untagged Frame Lnegth */
188*cb477c30SDaniel Golle 
189*cb477c30SDaniel Golle /* Ethernet Switch Fetch DMA Port Control Register */
190*cb477c30SDaniel Golle #define GSWIP_FDMA_PCTRLp(p)		(0xA80 + ((p) * 0x6))
191*cb477c30SDaniel Golle #define  GSWIP_FDMA_PCTRL_EN		BIT(0)	/* FDMA Port Enable */
192*cb477c30SDaniel Golle #define  GSWIP_FDMA_PCTRL_STEN		BIT(1)	/* Special Tag Insertion Enable */
193*cb477c30SDaniel Golle #define  GSWIP_FDMA_PCTRL_VLANMOD_MASK	GENMASK(4, 3)	/* VLAN Modification Control */
194*cb477c30SDaniel Golle #define  GSWIP_FDMA_PCTRL_VLANMOD_SHIFT	3	/* VLAN Modification Control */
195*cb477c30SDaniel Golle #define  GSWIP_FDMA_PCTRL_VLANMOD_DIS	(0x0 << GSWIP_FDMA_PCTRL_VLANMOD_SHIFT)
196*cb477c30SDaniel Golle #define  GSWIP_FDMA_PCTRL_VLANMOD_PRIO	(0x1 << GSWIP_FDMA_PCTRL_VLANMOD_SHIFT)
197*cb477c30SDaniel Golle #define  GSWIP_FDMA_PCTRL_VLANMOD_ID	(0x2 << GSWIP_FDMA_PCTRL_VLANMOD_SHIFT)
198*cb477c30SDaniel Golle #define  GSWIP_FDMA_PCTRL_VLANMOD_BOTH	(0x3 << GSWIP_FDMA_PCTRL_VLANMOD_SHIFT)
199*cb477c30SDaniel Golle 
200*cb477c30SDaniel Golle /* Ethernet Switch Store DMA Port Control Register */
201*cb477c30SDaniel Golle #define GSWIP_SDMA_PCTRLp(p)		(0xBC0 + ((p) * 0x6))
202*cb477c30SDaniel Golle #define  GSWIP_SDMA_PCTRL_EN		BIT(0)	/* SDMA Port Enable */
203*cb477c30SDaniel Golle #define  GSWIP_SDMA_PCTRL_FCEN		BIT(1)	/* Flow Control Enable */
204*cb477c30SDaniel Golle #define  GSWIP_SDMA_PCTRL_PAUFWD	BIT(3)	/* Pause Frame Forwarding */
205*cb477c30SDaniel Golle 
206*cb477c30SDaniel Golle #define GSWIP_TABLE_ACTIVE_VLAN		0x01
207*cb477c30SDaniel Golle #define GSWIP_TABLE_VLAN_MAPPING	0x02
208*cb477c30SDaniel Golle #define GSWIP_TABLE_MAC_BRIDGE		0x0b
209*cb477c30SDaniel Golle #define  GSWIP_TABLE_MAC_BRIDGE_KEY3_FID	GENMASK(5, 0)	/* Filtering identifier */
210*cb477c30SDaniel Golle #define  GSWIP_TABLE_MAC_BRIDGE_VAL0_PORT	GENMASK(7, 4)	/* Port on learned entries */
211*cb477c30SDaniel Golle #define  GSWIP_TABLE_MAC_BRIDGE_VAL1_STATIC	BIT(0)		/* Static, non-aging entry */
212*cb477c30SDaniel Golle 
213*cb477c30SDaniel Golle #define XRX200_GPHY_FW_ALIGN	(16 * 1024)
214*cb477c30SDaniel Golle 
215*cb477c30SDaniel Golle /* Maximum packet size supported by the switch. In theory this should be 10240,
216*cb477c30SDaniel Golle  * but long packets currently cause lock-ups with an MTU of over 2526. Medium
217*cb477c30SDaniel Golle  * packets are sometimes dropped (e.g. TCP over 2477, UDP over 2516-2519, ICMP
218*cb477c30SDaniel Golle  * over 2526), hence an MTU value of 2400 seems safe. This issue only affects
219*cb477c30SDaniel Golle  * packet reception. This is probably caused by the PPA engine, which is on the
220*cb477c30SDaniel Golle  * RX part of the device. Packet transmission works properly up to 10240.
221*cb477c30SDaniel Golle  */
222*cb477c30SDaniel Golle #define GSWIP_MAX_PACKET_LENGTH	2400
223*cb477c30SDaniel Golle 
224*cb477c30SDaniel Golle struct gswip_pce_microcode {
225*cb477c30SDaniel Golle 	u16 val_3;
226*cb477c30SDaniel Golle 	u16 val_2;
227*cb477c30SDaniel Golle 	u16 val_1;
228*cb477c30SDaniel Golle 	u16 val_0;
229*cb477c30SDaniel Golle };
230*cb477c30SDaniel Golle 
231*cb477c30SDaniel Golle struct gswip_hw_info {
232*cb477c30SDaniel Golle 	int max_ports;
233*cb477c30SDaniel Golle 	unsigned int allowed_cpu_ports;
234*cb477c30SDaniel Golle 	unsigned int mii_ports;
235*cb477c30SDaniel Golle 	const struct gswip_pce_microcode (*pce_microcode)[];
236*cb477c30SDaniel Golle 	size_t pce_microcode_size;
237*cb477c30SDaniel Golle 	enum dsa_tag_protocol tag_protocol;
238*cb477c30SDaniel Golle 	void (*phylink_get_caps)(struct dsa_switch *ds, int port,
239*cb477c30SDaniel Golle 				 struct phylink_config *config);
240*cb477c30SDaniel Golle };
241*cb477c30SDaniel Golle 
242*cb477c30SDaniel Golle struct gswip_gphy_fw {
243*cb477c30SDaniel Golle 	struct clk *clk_gate;
244*cb477c30SDaniel Golle 	struct reset_control *reset;
245*cb477c30SDaniel Golle 	u32 fw_addr_offset;
246*cb477c30SDaniel Golle 	char *fw_name;
247*cb477c30SDaniel Golle };
248*cb477c30SDaniel Golle 
249*cb477c30SDaniel Golle struct gswip_vlan {
250*cb477c30SDaniel Golle 	struct net_device *bridge;
251*cb477c30SDaniel Golle 	u16 vid;
252*cb477c30SDaniel Golle 	u8 fid;
253*cb477c30SDaniel Golle };
254*cb477c30SDaniel Golle 
255*cb477c30SDaniel Golle struct gswip_priv {
256*cb477c30SDaniel Golle 	__iomem void *gswip;
257*cb477c30SDaniel Golle 	__iomem void *mdio;
258*cb477c30SDaniel Golle 	__iomem void *mii;
259*cb477c30SDaniel Golle 	const struct gswip_hw_info *hw_info;
260*cb477c30SDaniel Golle 	const struct xway_gphy_match_data *gphy_fw_name_cfg;
261*cb477c30SDaniel Golle 	struct dsa_switch *ds;
262*cb477c30SDaniel Golle 	struct device *dev;
263*cb477c30SDaniel Golle 	struct regmap *rcu_regmap;
264*cb477c30SDaniel Golle 	struct gswip_vlan vlans[64];
265*cb477c30SDaniel Golle 	int num_gphy_fw;
266*cb477c30SDaniel Golle 	struct gswip_gphy_fw *gphy_fw;
267*cb477c30SDaniel Golle 	u32 port_vlan_filter;
268*cb477c30SDaniel Golle 	struct mutex pce_table_lock;
269*cb477c30SDaniel Golle 	u16 version;
270*cb477c30SDaniel Golle };
271*cb477c30SDaniel Golle 
272*cb477c30SDaniel Golle #endif /* __LANTIQ_GSWIP_H */
273