1299910Ssgalabov/*-
2299910Ssgalabov * Copyright (c) 2016 Stanislav Galabov.
3299910Ssgalabov * All rights reserved.
4299910Ssgalabov *
5299910Ssgalabov * Redistribution and use in source and binary forms, with or without
6299910Ssgalabov * modification, are permitted provided that the following conditions
7299910Ssgalabov * are met:
8299910Ssgalabov * 1. Redistributions of source code must retain the above copyright
9299910Ssgalabov *    notice, this list of conditions and the following disclaimer.
10299910Ssgalabov * 2. Redistributions in binary form must reproduce the above copyright
11299910Ssgalabov *    notice, this list of conditions and the following disclaimer in the
12299910Ssgalabov *    documentation and/or other materials provided with the distribution.
13299910Ssgalabov *
14299910Ssgalabov * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15299910Ssgalabov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16299910Ssgalabov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17299910Ssgalabov * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18299910Ssgalabov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19299910Ssgalabov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20299910Ssgalabov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21299910Ssgalabov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22299910Ssgalabov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23299910Ssgalabov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24299910Ssgalabov * SUCH DAMAGE.
25299910Ssgalabov *
26299910Ssgalabov * $FreeBSD$
27299910Ssgalabov */
28299910Ssgalabov
29299910Ssgalabov#ifndef	__MTKSWITCHVAR_H__
30299910Ssgalabov#define	__MTKSWITCHVAR_H__
31299910Ssgalabov
32299910Ssgalabovtypedef enum {
33299910Ssgalabov	MTK_SWITCH_NONE,
34299910Ssgalabov	MTK_SWITCH_RT3050,
35299910Ssgalabov	MTK_SWITCH_RT3352,
36299910Ssgalabov	MTK_SWITCH_RT5350,
37299910Ssgalabov	MTK_SWITCH_MT7620,
38299910Ssgalabov	MTK_SWITCH_MT7621,
39299910Ssgalabov	MTK_SWITCH_MT7628,
40299910Ssgalabov} mtk_switch_type;
41299910Ssgalabov
42299910Ssgalabov#define	MTK_IS_SWITCH(_sc, _type)		\
43299910Ssgalabov	    (!!((_sc)->sc_switchtype == MTK_SWITCH_ ## _type))
44299910Ssgalabov
45299910Ssgalabov#define	MTKSWITCH_MAX_PORTS	7
46299910Ssgalabov#define MTKSWITCH_MAX_PHYS	7
47299910Ssgalabov#define	MTKSWITCH_CPU_PORT	6
48299910Ssgalabov
49299910Ssgalabov#define	MTKSWITCH_LINK_UP	(1<<0)
50299910Ssgalabov#define	MTKSWITCH_SPEED_MASK	(3<<1)
51299910Ssgalabov#define	MTKSWITCH_SPEED_10	(0<<1)
52299910Ssgalabov#define MTKSWITCH_SPEED_100	(1<<1)
53299910Ssgalabov#define	MTKSWITCH_SPEED_1000	(2<<1)
54299910Ssgalabov#define	MTKSWITCH_DUPLEX	(1<<3)
55299910Ssgalabov#define MTKSWITCH_TXFLOW	(1<<4)
56299910Ssgalabov#define MTKSWITCH_RXFLOW	(1<<5)
57299910Ssgalabov
58299910Ssgalabovstruct mtkswitch_softc {
59299910Ssgalabov	struct mtx	sc_mtx;
60299910Ssgalabov	device_t	sc_dev;
61299910Ssgalabov	struct resource *sc_res;
62299910Ssgalabov	int		numphys;
63299910Ssgalabov	uint32_t	phymap;
64299910Ssgalabov	int		numports;
65299910Ssgalabov	uint32_t	portmap;
66299910Ssgalabov	int		cpuport;
67299910Ssgalabov	uint32_t	valid_vlans;
68299910Ssgalabov	mtk_switch_type	sc_switchtype;
69299910Ssgalabov	char		*ifname[MTKSWITCH_MAX_PHYS];
70299910Ssgalabov	device_t	miibus[MTKSWITCH_MAX_PHYS];
71299910Ssgalabov	struct ifnet	*ifp[MTKSWITCH_MAX_PHYS];
72299910Ssgalabov	struct callout	callout_tick;
73299910Ssgalabov	etherswitch_info_t info;
74299910Ssgalabov
75299910Ssgalabov	uint32_t	vlan_mode;
76299910Ssgalabov
77299910Ssgalabov	struct {
78299910Ssgalabov		/* Global setup */
79299910Ssgalabov		int (* mtkswitch_reset) (struct mtkswitch_softc *);
80299910Ssgalabov		int (* mtkswitch_hw_setup) (struct mtkswitch_softc *);
81299910Ssgalabov		int (* mtkswitch_hw_global_setup) (struct mtkswitch_softc *);
82299910Ssgalabov
83299910Ssgalabov		/* Port functions */
84299910Ssgalabov		void (* mtkswitch_port_init) (struct mtkswitch_softc *, int);
85299910Ssgalabov		uint32_t (* mtkswitch_get_port_status)
86299910Ssgalabov		    (struct mtkswitch_softc *, int);
87299910Ssgalabov
88299910Ssgalabov		/* ATU functions */
89299910Ssgalabov		int (* mtkswitch_atu_flush) (struct mtkswitch_softc *);
90299910Ssgalabov
91299910Ssgalabov		/* VLAN functions */
92299910Ssgalabov		int (* mtkswitch_port_vlan_setup) (struct mtkswitch_softc *,
93299910Ssgalabov		    etherswitch_port_t *);
94299910Ssgalabov		int (* mtkswitch_port_vlan_get) (struct mtkswitch_softc *,
95299910Ssgalabov		    etherswitch_port_t *);
96299910Ssgalabov		void (* mtkswitch_vlan_init_hw) (struct mtkswitch_softc *);
97299910Ssgalabov		int (* mtkswitch_vlan_getvgroup) (struct mtkswitch_softc *,
98299910Ssgalabov		    etherswitch_vlangroup_t *);
99299910Ssgalabov		int (* mtkswitch_vlan_setvgroup) (struct mtkswitch_softc *,
100299910Ssgalabov		    etherswitch_vlangroup_t *);
101299910Ssgalabov		int (* mtkswitch_vlan_get_pvid) (struct mtkswitch_softc *,
102299910Ssgalabov		    int, int *);
103299910Ssgalabov		int (* mtkswitch_vlan_set_pvid) (struct mtkswitch_softc *,
104299910Ssgalabov		    int, int);
105299910Ssgalabov
106299910Ssgalabov		/* PHY functions */
107299910Ssgalabov		int (* mtkswitch_phy_read) (device_t, int, int);
108299910Ssgalabov		int (* mtkswitch_phy_write) (device_t, int, int, int);
109299910Ssgalabov
110299910Ssgalabov		/* Register functions */
111299910Ssgalabov		int (* mtkswitch_reg_read) (device_t, int);
112299910Ssgalabov		int (* mtkswitch_reg_write) (device_t, int, int);
113299910Ssgalabov
114299910Ssgalabov		/* Internal register access functions */
115299910Ssgalabov		uint32_t (* mtkswitch_read) (struct mtkswitch_softc *, int);
116299910Ssgalabov		uint32_t (* mtkswitch_write) (struct mtkswitch_softc *, int,
117299910Ssgalabov		    uint32_t);
118299910Ssgalabov	} hal;
119299910Ssgalabov};
120299910Ssgalabov
121299910Ssgalabov#define	MTKSWITCH_LOCK(_sc)			\
122299910Ssgalabov	    mtx_lock(&(_sc)->sc_mtx)
123299910Ssgalabov#define	MTKSWITCH_UNLOCK(_sc)			\
124299910Ssgalabov	    mtx_unlock(&(_sc)->sc_mtx)
125299910Ssgalabov#define	MTKSWITCH_LOCK_ASSERT(_sc, _what)	\
126299910Ssgalabov	    mtx_assert(&(_sc)->sc_mtx, (_what))
127299910Ssgalabov#define	MTKSWITCH_TRYLOCK(_sc)			\
128299910Ssgalabov	    mtx_trylock(&(_sc)->sc_mtx)
129299910Ssgalabov
130299910Ssgalabov#define	MTKSWITCH_READ(_sc, _reg)		\
131299910Ssgalabov	    bus_read_4((_sc)->sc_res, (_reg))
132299910Ssgalabov#define MTKSWITCH_WRITE(_sc, _reg, _val)	\
133299910Ssgalabov	    bus_write_4((_sc)->sc_res, (_reg), (_val))
134299910Ssgalabov#define	MTKSWITCH_MOD(_sc, _reg, _clr, _set)	\
135299910Ssgalabov	    MTKSWITCH_WRITE((_sc), (_reg),	\
136299910Ssgalabov	        ((MTKSWITCH_READ((_sc), (_reg)) & ~(_clr)) | (_set))
137299910Ssgalabov
138299910Ssgalabov#define	MTKSWITCH_REG32(addr)	((addr) & ~(0x3))
139299910Ssgalabov#define	MTKSWITCH_IS_HI16(addr)	(((addr) & 0x3) > 0x1)
140299910Ssgalabov#define	MTKSWITCH_HI16(x)	(((x) >> 16) & 0xffff)
141299910Ssgalabov#define	MTKSWITCH_LO16(x)	((x) & 0xffff)
142299910Ssgalabov#define	MTKSWITCH_TO_HI16(x)	(((x) & 0xffff) << 16)
143299910Ssgalabov#define	MTKSWITCH_TO_LO16(x)	((x) & 0xffff)
144299910Ssgalabov#define	MTKSWITCH_HI16_MSK	0xffff0000
145299910Ssgalabov#define MTKSWITCH_LO16_MSK	0x0000ffff
146299910Ssgalabov
147299910Ssgalabov#if defined(DEBUG)
148299910Ssgalabov#define	DPRINTF(dev, args...)	device_printf(dev, args)
149299910Ssgalabov#define	DEVERR(dev, err, fmt, args...)	do {	\
150299910Ssgalabov	    if (err != 0) device_printf(dev, fmt, err, args);	\
151299910Ssgalabov	} while (0)
152299910Ssgalabov#define	DEBUG_INCRVAR(var)		do {	\
153299910Ssgalabov	    var++;				\
154299910Ssgalabov	} while (0)
155299910Ssgalabov#else
156299910Ssgalabov#define	DPRINTF(dev, args...)
157299910Ssgalabov#define	DEVERR(dev, err, fmt, args...)
158299910Ssgalabov#define	DEBUG_INCRVAR(var)
159299910Ssgalabov#endif
160299910Ssgalabov
161299910Ssgalabovextern void mtk_attach_switch_rt3050(struct mtkswitch_softc *);
162299910Ssgalabovextern void mtk_attach_switch_mt7620(struct mtkswitch_softc *);
163299910Ssgalabov
164299910Ssgalabov#endif	/* __MTKSWITCHVAR_H__ */
165