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