xref: /freebsd/sys/dev/etherswitch/mtkswitch/mtkswitchvar.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1dfb5178fSStanislav Galabov /*-
2dfb5178fSStanislav Galabov  * Copyright (c) 2016 Stanislav Galabov.
3dfb5178fSStanislav Galabov  * All rights reserved.
4dfb5178fSStanislav Galabov  *
5dfb5178fSStanislav Galabov  * Redistribution and use in source and binary forms, with or without
6dfb5178fSStanislav Galabov  * modification, are permitted provided that the following conditions
7dfb5178fSStanislav Galabov  * are met:
8dfb5178fSStanislav Galabov  * 1. Redistributions of source code must retain the above copyright
9dfb5178fSStanislav Galabov  *    notice, this list of conditions and the following disclaimer.
10dfb5178fSStanislav Galabov  * 2. Redistributions in binary form must reproduce the above copyright
11dfb5178fSStanislav Galabov  *    notice, this list of conditions and the following disclaimer in the
12dfb5178fSStanislav Galabov  *    documentation and/or other materials provided with the distribution.
13dfb5178fSStanislav Galabov  *
14dfb5178fSStanislav Galabov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15dfb5178fSStanislav Galabov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16dfb5178fSStanislav Galabov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17dfb5178fSStanislav Galabov  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18dfb5178fSStanislav Galabov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19dfb5178fSStanislav Galabov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20dfb5178fSStanislav Galabov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21dfb5178fSStanislav Galabov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22dfb5178fSStanislav Galabov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23dfb5178fSStanislav Galabov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24dfb5178fSStanislav Galabov  * SUCH DAMAGE.
25dfb5178fSStanislav Galabov  */
26dfb5178fSStanislav Galabov 
27dfb5178fSStanislav Galabov #ifndef	__MTKSWITCHVAR_H__
28dfb5178fSStanislav Galabov #define	__MTKSWITCHVAR_H__
29dfb5178fSStanislav Galabov 
30dfb5178fSStanislav Galabov typedef enum {
31dfb5178fSStanislav Galabov 	MTK_SWITCH_NONE,
32dfb5178fSStanislav Galabov 	MTK_SWITCH_RT3050,
33dfb5178fSStanislav Galabov 	MTK_SWITCH_RT3352,
34dfb5178fSStanislav Galabov 	MTK_SWITCH_RT5350,
35dfb5178fSStanislav Galabov 	MTK_SWITCH_MT7620,
36dfb5178fSStanislav Galabov 	MTK_SWITCH_MT7621,
37dfb5178fSStanislav Galabov 	MTK_SWITCH_MT7628,
38dfb5178fSStanislav Galabov } mtk_switch_type;
39dfb5178fSStanislav Galabov 
40dfb5178fSStanislav Galabov #define	MTK_IS_SWITCH(_sc, _type)		\
41dfb5178fSStanislav Galabov 	    (!!((_sc)->sc_switchtype == MTK_SWITCH_ ## _type))
42dfb5178fSStanislav Galabov 
43dfb5178fSStanislav Galabov #define	MTKSWITCH_MAX_PORTS	7
44dfb5178fSStanislav Galabov #define MTKSWITCH_MAX_PHYS	7
45dfb5178fSStanislav Galabov #define	MTKSWITCH_CPU_PORT	6
46dfb5178fSStanislav Galabov 
47dfb5178fSStanislav Galabov #define	MTKSWITCH_LINK_UP	(1<<0)
48dfb5178fSStanislav Galabov #define	MTKSWITCH_SPEED_MASK	(3<<1)
49dfb5178fSStanislav Galabov #define	MTKSWITCH_SPEED_10	(0<<1)
50dfb5178fSStanislav Galabov #define MTKSWITCH_SPEED_100	(1<<1)
51dfb5178fSStanislav Galabov #define	MTKSWITCH_SPEED_1000	(2<<1)
52dfb5178fSStanislav Galabov #define	MTKSWITCH_DUPLEX	(1<<3)
53dfb5178fSStanislav Galabov #define MTKSWITCH_TXFLOW	(1<<4)
54dfb5178fSStanislav Galabov #define MTKSWITCH_RXFLOW	(1<<5)
55dfb5178fSStanislav Galabov 
56dfb5178fSStanislav Galabov struct mtkswitch_softc {
57dfb5178fSStanislav Galabov 	struct mtx	sc_mtx;
58dfb5178fSStanislav Galabov 	device_t	sc_dev;
59dfb5178fSStanislav Galabov 	struct resource *sc_res;
60dfb5178fSStanislav Galabov 	int		numphys;
61dfb5178fSStanislav Galabov 	uint32_t	phymap;
62dfb5178fSStanislav Galabov 	int		numports;
63dfb5178fSStanislav Galabov 	uint32_t	portmap;
64dfb5178fSStanislav Galabov 	int		cpuport;
65dfb5178fSStanislav Galabov 	uint32_t	valid_vlans;
66dfb5178fSStanislav Galabov 	mtk_switch_type	sc_switchtype;
67dfb5178fSStanislav Galabov 	char		*ifname[MTKSWITCH_MAX_PHYS];
68dfb5178fSStanislav Galabov 	device_t	miibus[MTKSWITCH_MAX_PHYS];
69*2e6a8c1aSJustin Hibbits 	if_t ifp[MTKSWITCH_MAX_PHYS];
70dfb5178fSStanislav Galabov 	struct callout	callout_tick;
71dfb5178fSStanislav Galabov 	etherswitch_info_t info;
72dfb5178fSStanislav Galabov 
73dfb5178fSStanislav Galabov 	uint32_t	vlan_mode;
74dfb5178fSStanislav Galabov 
75dfb5178fSStanislav Galabov 	struct {
76dfb5178fSStanislav Galabov 		/* Global setup */
77dfb5178fSStanislav Galabov 		int (* mtkswitch_reset) (struct mtkswitch_softc *);
78dfb5178fSStanislav Galabov 		int (* mtkswitch_hw_setup) (struct mtkswitch_softc *);
79dfb5178fSStanislav Galabov 		int (* mtkswitch_hw_global_setup) (struct mtkswitch_softc *);
80dfb5178fSStanislav Galabov 
81dfb5178fSStanislav Galabov 		/* Port functions */
82dfb5178fSStanislav Galabov 		void (* mtkswitch_port_init) (struct mtkswitch_softc *, int);
83dfb5178fSStanislav Galabov 		uint32_t (* mtkswitch_get_port_status)
84dfb5178fSStanislav Galabov 		    (struct mtkswitch_softc *, int);
85dfb5178fSStanislav Galabov 
86dfb5178fSStanislav Galabov 		/* ATU functions */
87dfb5178fSStanislav Galabov 		int (* mtkswitch_atu_flush) (struct mtkswitch_softc *);
88dfb5178fSStanislav Galabov 
89dfb5178fSStanislav Galabov 		/* VLAN functions */
90dfb5178fSStanislav Galabov 		int (* mtkswitch_port_vlan_setup) (struct mtkswitch_softc *,
91dfb5178fSStanislav Galabov 		    etherswitch_port_t *);
92dfb5178fSStanislav Galabov 		int (* mtkswitch_port_vlan_get) (struct mtkswitch_softc *,
93dfb5178fSStanislav Galabov 		    etherswitch_port_t *);
94dfb5178fSStanislav Galabov 		void (* mtkswitch_vlan_init_hw) (struct mtkswitch_softc *);
95dfb5178fSStanislav Galabov 		int (* mtkswitch_vlan_getvgroup) (struct mtkswitch_softc *,
96dfb5178fSStanislav Galabov 		    etherswitch_vlangroup_t *);
97dfb5178fSStanislav Galabov 		int (* mtkswitch_vlan_setvgroup) (struct mtkswitch_softc *,
98dfb5178fSStanislav Galabov 		    etherswitch_vlangroup_t *);
99dfb5178fSStanislav Galabov 		int (* mtkswitch_vlan_get_pvid) (struct mtkswitch_softc *,
100dfb5178fSStanislav Galabov 		    int, int *);
101dfb5178fSStanislav Galabov 		int (* mtkswitch_vlan_set_pvid) (struct mtkswitch_softc *,
102dfb5178fSStanislav Galabov 		    int, int);
103dfb5178fSStanislav Galabov 
104dfb5178fSStanislav Galabov 		/* PHY functions */
105dfb5178fSStanislav Galabov 		int (* mtkswitch_phy_read) (device_t, int, int);
106dfb5178fSStanislav Galabov 		int (* mtkswitch_phy_write) (device_t, int, int, int);
107dfb5178fSStanislav Galabov 
108dfb5178fSStanislav Galabov 		/* Register functions */
109dfb5178fSStanislav Galabov 		int (* mtkswitch_reg_read) (device_t, int);
110dfb5178fSStanislav Galabov 		int (* mtkswitch_reg_write) (device_t, int, int);
111dfb5178fSStanislav Galabov 
112dfb5178fSStanislav Galabov 		/* Internal register access functions */
113dfb5178fSStanislav Galabov 		uint32_t (* mtkswitch_read) (struct mtkswitch_softc *, int);
114dfb5178fSStanislav Galabov 		uint32_t (* mtkswitch_write) (struct mtkswitch_softc *, int,
115dfb5178fSStanislav Galabov 		    uint32_t);
116dfb5178fSStanislav Galabov 	} hal;
117dfb5178fSStanislav Galabov };
118dfb5178fSStanislav Galabov 
119dfb5178fSStanislav Galabov #define	MTKSWITCH_LOCK(_sc)			\
120dfb5178fSStanislav Galabov 	    mtx_lock(&(_sc)->sc_mtx)
121dfb5178fSStanislav Galabov #define	MTKSWITCH_UNLOCK(_sc)			\
122dfb5178fSStanislav Galabov 	    mtx_unlock(&(_sc)->sc_mtx)
123dfb5178fSStanislav Galabov #define	MTKSWITCH_LOCK_ASSERT(_sc, _what)	\
124dfb5178fSStanislav Galabov 	    mtx_assert(&(_sc)->sc_mtx, (_what))
125dfb5178fSStanislav Galabov #define	MTKSWITCH_TRYLOCK(_sc)			\
126dfb5178fSStanislav Galabov 	    mtx_trylock(&(_sc)->sc_mtx)
127dfb5178fSStanislav Galabov 
128dfb5178fSStanislav Galabov #define	MTKSWITCH_READ(_sc, _reg)		\
129dfb5178fSStanislav Galabov 	    bus_read_4((_sc)->sc_res, (_reg))
130dfb5178fSStanislav Galabov #define MTKSWITCH_WRITE(_sc, _reg, _val)	\
131dfb5178fSStanislav Galabov 	    bus_write_4((_sc)->sc_res, (_reg), (_val))
132dfb5178fSStanislav Galabov #define	MTKSWITCH_MOD(_sc, _reg, _clr, _set)	\
133dfb5178fSStanislav Galabov 	    MTKSWITCH_WRITE((_sc), (_reg),	\
134dfb5178fSStanislav Galabov 	        ((MTKSWITCH_READ((_sc), (_reg)) & ~(_clr)) | (_set))
135dfb5178fSStanislav Galabov 
136dfb5178fSStanislav Galabov #define	MTKSWITCH_REG32(addr)	((addr) & ~(0x3))
137dfb5178fSStanislav Galabov #define	MTKSWITCH_IS_HI16(addr)	(((addr) & 0x3) > 0x1)
138dfb5178fSStanislav Galabov #define	MTKSWITCH_HI16(x)	(((x) >> 16) & 0xffff)
139dfb5178fSStanislav Galabov #define	MTKSWITCH_LO16(x)	((x) & 0xffff)
140dfb5178fSStanislav Galabov #define	MTKSWITCH_TO_HI16(x)	(((x) & 0xffff) << 16)
141dfb5178fSStanislav Galabov #define	MTKSWITCH_TO_LO16(x)	((x) & 0xffff)
142dfb5178fSStanislav Galabov #define	MTKSWITCH_HI16_MSK	0xffff0000
143dfb5178fSStanislav Galabov #define MTKSWITCH_LO16_MSK	0x0000ffff
144dfb5178fSStanislav Galabov 
145dfb5178fSStanislav Galabov #if defined(DEBUG)
146dfb5178fSStanislav Galabov #define	DPRINTF(dev, args...)	device_printf(dev, args)
147dfb5178fSStanislav Galabov #define	DEVERR(dev, err, fmt, args...)	do {	\
148dfb5178fSStanislav Galabov 	    if (err != 0) device_printf(dev, fmt, err, args);	\
149dfb5178fSStanislav Galabov 	} while (0)
150dfb5178fSStanislav Galabov #define	DEBUG_INCRVAR(var)		do {	\
151dfb5178fSStanislav Galabov 	    var++;				\
152dfb5178fSStanislav Galabov 	} while (0)
153dfb5178fSStanislav Galabov #else
154dfb5178fSStanislav Galabov #define	DPRINTF(dev, args...)
155dfb5178fSStanislav Galabov #define	DEVERR(dev, err, fmt, args...)
156dfb5178fSStanislav Galabov #define	DEBUG_INCRVAR(var)
157dfb5178fSStanislav Galabov #endif
158dfb5178fSStanislav Galabov 
159dfb5178fSStanislav Galabov extern void mtk_attach_switch_rt3050(struct mtkswitch_softc *);
160dfb5178fSStanislav Galabov extern void mtk_attach_switch_mt7620(struct mtkswitch_softc *);
161dfb5178fSStanislav Galabov 
162dfb5178fSStanislav Galabov #endif	/* __MTKSWITCHVAR_H__ */
163