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