Index: sys/dev/etherswitch/mtkswitch/mtkswitch_rt3050.h =================================================================== --- sys/dev/etherswitch/mtkswitch/mtkswitch_rt3050.h +++ sys/dev/etherswitch/mtkswitch/mtkswitch_rt3050.h @@ -57,6 +57,17 @@ #define MTKSWITCH_FPA 0x0084 #define FPA_ALL_AUTO 0x00000000 +#define MTKSWITCH_SOCPC 0x008c +#define SOCPC_DISUN2C(x) (1 << (x)) +#define SOCPC_DISMC2C(x) ((1 << (x)) << 8) +#define SOCPC_DISBC2C(x) ((1 << (x)) << 16) +#define SOCPC_CRC_PADDING 0x02000000 + +#define MTKSWITCH_POC0 0x0090 +#define POC0_DIS_PORT_MSK 0x0f800000 +#define POC0_DIS_GPORT1_MSK 0x10000000 +#define POC0_DIS_GPORT2_MSK 0x20000000 + #define MTKSWITCH_POC2 0x0098 #define POC2_UNTAG_PORT(x) (1 << (x)) #define POC2_UNTAG_VLAN (1 << 15) @@ -76,6 +87,9 @@ #define PCR1_DATA_OFF 16 #define PCR1_DATA_MASK 0xffff +#define MTKSWITCH_FPA2 0x00c8 +#define MTKSWITCH_FCT2 0x00cc + #define MTKSWITCH_SGC2 0x00e4 #define SGC2_DOUBLE_TAG_PORT(x) (1 << (x)) Index: sys/dev/etherswitch/mtkswitch/mtkswitch_rt3050.c =================================================================== --- sys/dev/etherswitch/mtkswitch/mtkswitch_rt3050.c +++ sys/dev/etherswitch/mtkswitch/mtkswitch_rt3050.c @@ -51,6 +51,9 @@ #include #include +#include +#include + #include #include #include @@ -124,7 +127,16 @@ static int mtkswitch_reset(struct mtkswitch_softc *sc) { + phandle_t node; + int val; + + node = ofw_bus_get_node(sc->sc_dev); + if (OF_getencprop(node, "ralink,noreset", &val, + sizeof(val)) >= 0) { + if(val == 1) + return (0); + } MTKSWITCH_LOCK_ASSERT(sc, MA_NOTOWNED); MTKSWITCH_LOCK(sc); MTKSWITCH_WRITE(sc, MTKSWITCH_STRT, STRT_RESET); @@ -137,12 +149,33 @@ static int mtkswitch_hw_setup(struct mtkswitch_softc *sc) { + phandle_t node; + int val; + + node = ofw_bus_get_node(sc->sc_dev); /* * TODO: parse the device tree and see if we need to configure * ports, etc. differently. For now we fallback to defaults. */ + if (OF_getencprop(node, "ralink,fct2", &val, + sizeof(val)) >= 0) { + MTKSWITCH_WRITE(sc, MTKSWITCH_FCT2, val); + } + if (OF_getencprop(node, "ralink,fpa2", &val, + sizeof(val)) >= 0) { + MTKSWITCH_WRITE(sc, MTKSWITCH_FPA2, val); + } + val = MTKSWITCH_READ(sc, MTKSWITCH_POC0); + val = val & ~(POC0_DIS_PORT_MSK | POC0_DIS_GPORT1_MSK | + POC0_DIS_GPORT2_MSK); + MTKSWITCH_WRITE(sc, MTKSWITCH_POC0, val); + MTKSWITCH_WRITE(sc, MTKSWITCH_SOCPC, (SOCPC_CRC_PADDING | + SOCPC_DISBC2C(MTKSWITCH_CPU_PORT) | + SOCPC_DISMC2C(MTKSWITCH_CPU_PORT) | + SOCPC_DISUN2C(MTKSWITCH_CPU_PORT))); + /* Called early and hence unlocked */ /* Set ports 0-4 to auto negotiation */ MTKSWITCH_WRITE(sc, MTKSWITCH_FPA, FPA_ALL_AUTO);