From 15ccf24786723f0b76f78aa29afa4e0d17f0ddeb Mon Sep 17 00:00:00 2001 From: raj Date: Thu, 8 Jan 2009 11:09:27 +0000 Subject: Handle mge(4) chip revision differences at run-time rather then compile time, which is more flexible for future revisions, and lets eliminate some #defines and compile conditionals. Obtained from: Semihalf --- sys/dev/mge/if_mge.c | 106 +++++++++++++++++++++++++++++++++++++----------- sys/dev/mge/if_mgevar.h | 36 ++++------------ 2 files changed, 90 insertions(+), 52 deletions(-) (limited to 'sys/dev/mge') diff --git a/sys/dev/mge/if_mge.c b/sys/dev/mge/if_mge.c index 1d9bda5..8555090 100644 --- a/sys/dev/mge/if_mge.c +++ b/sys/dev/mge/if_mge.c @@ -69,14 +69,11 @@ __FBSDID("$FreeBSD$"); #include #include -#if defined(SOC_MV_KIRKWOOD) || defined(SOC_MV_DISCOVERY) -#define MGE_VER2 1 -#endif - #define MV_PHY_ADDR_BASE 8 #include #include +#include #include "miibus_if.h" @@ -103,6 +100,10 @@ static void mge_start_locked(struct ifnet *ifp); static void mge_watchdog(struct mge_softc *sc); static int mge_ioctl(struct ifnet *ifp, u_long command, caddr_t data); +static uint32_t mge_tfut_ipg(uint32_t val, int ver); +static uint32_t mge_rx_ipg(uint32_t val, int ver); +static void mge_ver_params(struct mge_softc *sc); + static void mge_intrs_ctrl(struct mge_softc *sc, int enable); static void mge_intr_rx(void *arg); static void mge_intr_rx_locked(struct mge_softc *sc, int count); @@ -206,6 +207,57 @@ mge_get_mac_address(struct mge_softc *sc, uint8_t *addr) addr[5] = (mac_l & 0x000000ff); } +static uint32_t +mge_tfut_ipg(uint32_t val, int ver) +{ + + switch (ver) { + case 1: + return ((val & 0x3fff) << 4); + case 2: + default: + return ((val & 0xffff) << 4); + } +} + +static uint32_t +mge_rx_ipg(uint32_t val, int ver) +{ + + switch (ver) { + case 1: + return ((val & 0x3fff) << 8); + case 2: + default: + return (((val & 0x8000) << 10) | ((val & 0x7fff) << 7)); + } +} + +static void +mge_ver_params(struct mge_softc *sc) +{ + uint32_t d, r; + + soc_id(&d, &r); + if (d == MV_DEV_88F6281 || d == MV_DEV_MV78100) { + sc->mge_ver = 2; + sc->mge_mtu = 0x4e8; + sc->mge_tfut_ipg_max = 0xFFFF; + sc->mge_rx_ipg_max = 0xFFFF; + sc->mge_tx_arb_cfg = 0xFC0000FF; + sc->mge_tx_tok_cfg = 0xFFFF7FFF; + sc->mge_tx_tok_cnt = 0x3FFFFFFF; + } else { + sc->mge_ver = 1; + sc->mge_mtu = 0x458; + sc->mge_tfut_ipg_max = 0x3FFF; + sc->mge_rx_ipg_max = 0x3FFF; + sc->mge_tx_arb_cfg = 0x000000FF; + sc->mge_tx_tok_cfg = 0x3FFFFFFF; + sc->mge_tx_tok_cnt = 0x3FFFFFFF; + } +} + static void mge_set_mac_address(struct mge_softc *sc) { @@ -564,6 +616,9 @@ mge_attach(device_t dev) if (device_get_unit(dev) == 0) sc_mge0 = sc; + /* Set chip version-dependent parameters */ + mge_ver_params(sc); + /* Initialize mutexes */ mtx_init(&sc->transmit_lock, device_get_nameunit(dev), "mge TX lock", MTX_DEF); mtx_init(&sc->receive_lock, device_get_nameunit(dev), "mge RX lock", MTX_DEF); @@ -797,23 +852,25 @@ mge_init_locked(void *arg) /* Setup multicast filters */ mge_setup_multicast(sc); -#if defined(MGE_VER2) - MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL1, MGE_RGMII_EN); - MGE_WRITE(sc, MGE_FIXED_PRIO_CONF, MGE_FIXED_PRIO_EN(0)); -#endif + if (sc->mge_ver == 2) { + MGE_WRITE(sc, MGE_PORT_SERIAL_CTRL1, MGE_RGMII_EN); + MGE_WRITE(sc, MGE_FIXED_PRIO_CONF, MGE_FIXED_PRIO_EN(0)); + } + /* Initialize TX queue configuration registers */ - MGE_WRITE(sc, MGE_TX_TOKEN_COUNT(0), MGE_TX_TOKEN_Q0_DFLT); - MGE_WRITE(sc, MGE_TX_TOKEN_CONF(0), MGE_TX_TOKEN_Q0_DFLT); - MGE_WRITE(sc, MGE_TX_ARBITER_CONF(0), MGE_TX_ARB_Q0_DFLT); + MGE_WRITE(sc, MGE_TX_TOKEN_COUNT(0), sc->mge_tx_tok_cnt); + MGE_WRITE(sc, MGE_TX_TOKEN_CONF(0), sc->mge_tx_tok_cfg); + MGE_WRITE(sc, MGE_TX_ARBITER_CONF(0), sc->mge_tx_arb_cfg); + /* Clear TX queue configuration registers for unused queues */ for (i = 1; i < 7; i++) { - MGE_WRITE(sc, MGE_TX_TOKEN_COUNT(i), MGE_TX_TOKEN_Q1_7_DFLT); - MGE_WRITE(sc, MGE_TX_TOKEN_CONF(i), MGE_TX_TOKEN_Q1_7_DFLT); - MGE_WRITE(sc, MGE_TX_ARBITER_CONF(i), MGE_TX_ARB_Q1_7_DFLT); + MGE_WRITE(sc, MGE_TX_TOKEN_COUNT(i), 0); + MGE_WRITE(sc, MGE_TX_TOKEN_CONF(i), 0); + MGE_WRITE(sc, MGE_TX_ARBITER_CONF(i), 0); } /* Set default MTU */ - MGE_WRITE(sc, MGE_MTU, MGE_MTU_DEFAULT); + MGE_WRITE(sc, sc->mge_mtu, 0); /* Port configuration */ MGE_WRITE(sc, MGE_PORT_CONFIG, @@ -1688,12 +1745,12 @@ mge_set_rxic(struct mge_softc *sc) { uint32_t reg; - if (sc->rx_ic_time > MGE_SDMA_RX_IPG_MAX) - sc->rx_ic_time = MGE_SDMA_RX_IPG_MAX; + if (sc->rx_ic_time > sc->mge_rx_ipg_max) + sc->rx_ic_time = sc->mge_rx_ipg_max; reg = MGE_READ(sc, MGE_SDMA_CONFIG); - reg &= ~MGE_SDMA_RX_IPG(MGE_SDMA_RX_IPG_MAX); - reg |= MGE_SDMA_RX_IPG(sc->rx_ic_time); + reg &= ~mge_rx_ipg(sc->mge_rx_ipg_max, sc->mge_ver); + reg |= mge_rx_ipg(sc->rx_ic_time, sc->mge_ver); MGE_WRITE(sc, MGE_SDMA_CONFIG, reg); } @@ -1702,12 +1759,12 @@ mge_set_txic(struct mge_softc *sc) { uint32_t reg; - if (sc->tx_ic_time > MGE_TX_FIFO_URGENT_TRSH_IPG_MAX) - sc->tx_ic_time = MGE_TX_FIFO_URGENT_TRSH_IPG_MAX; + if (sc->tx_ic_time > sc->mge_tfut_ipg_max) + sc->tx_ic_time = sc->mge_tfut_ipg_max; reg = MGE_READ(sc, MGE_TX_FIFO_URGENT_TRSH); - reg &= ~MGE_TX_FIFO_URGENT_TRSH_IPG(MGE_TX_FIFO_URGENT_TRSH_IPG_MAX); - reg |= MGE_TX_FIFO_URGENT_TRSH_IPG(sc->tx_ic_time); + reg &= ~mge_tfut_ipg(sc->mge_tfut_ipg_max, sc->mge_ver); + reg |= mge_tfut_ipg(sc->tx_ic_time, sc->mge_ver); MGE_WRITE(sc, MGE_TX_FIFO_URGENT_TRSH, reg); } @@ -1715,9 +1772,10 @@ static int mge_sysctl_ic(SYSCTL_HANDLER_ARGS) { struct mge_softc *sc = (struct mge_softc *)arg1; - uint32_t time = (arg2 == MGE_IC_RX) ? sc->rx_ic_time : sc->tx_ic_time; + uint32_t time; int error; + time = (arg2 == MGE_IC_RX) ? sc->rx_ic_time : sc->tx_ic_time; error = sysctl_handle_int(oidp, &time, 0, req); if (error != 0) return(error); diff --git a/sys/dev/mge/if_mgevar.h b/sys/dev/mge/if_mgevar.h index 652c254..90d702b 100644 --- a/sys/dev/mge/if_mgevar.h +++ b/sys/dev/mge/if_mgevar.h @@ -91,6 +91,14 @@ struct mge_softc { uint32_t tx_ic_time; struct mge_desc_wrapper mge_tx_desc[MGE_TX_DESC_NUM]; struct mge_desc_wrapper mge_rx_desc[MGE_RX_DESC_NUM]; + + uint32_t mge_tfut_ipg_max; /* TX FIFO Urgent Threshold */ + uint32_t mge_rx_ipg_max; + uint32_t mge_tx_arb_cfg; + uint32_t mge_tx_tok_cfg; + uint32_t mge_tx_tok_cnt; + uint16_t mge_mtu; + int mge_ver; }; @@ -183,15 +191,6 @@ struct mge_softc { #define MGE_SDMA_RX_BYTE_SWAP (1 << 4) #define MGE_SDMA_TX_BYTE_SWAP (1 << 5) #define MGE_SDMA_DESC_SWAP_MODE (1 << 6) -#if defined(MGE_VER2) -#define MGE_SDMA_RX_IPG_MAX 0xFFFF -#define MGE_SDMA_RX_IPG(val) ((((val) & 0x8000) << 10) | \ - (((val) & 0x7fff) << 7)) -#else -#define MGE_SDMA_RX_IPG_MAX 0x3FFF -#define MGE_SDMA_RX_IPG(val) (((val) & 0x3fff) << 8) -#endif - #define MGE_PORT_SERIAL_CTRL 0x43c #define PORT_SERIAL_ENABLE (1 << 0) /* serial port enable */ @@ -248,13 +247,6 @@ struct mge_softc { #define MGE_COLLISION_LIMIT(val) (((val) & 0x3f) << 16) #define MGE_DROP_ODD_PREAMBLE (1 << 22) -#if defined(MGE_VER2) -#define MGE_MTU 0x4e8 -#else -#define MGE_MTU 0x458 -#endif -#define MGE_MTU_DEFAULT 0x0 - #define MGE_PORT_INT_CAUSE 0x460 #define MGE_PORT_INT_MASK 0x468 #define MGE_PORT_INT_RX (1 << 0) @@ -277,13 +269,6 @@ struct mge_softc { #define MGE_RX_FIFO_URGENT_TRSH 0x470 #define MGE_TX_FIFO_URGENT_TRSH 0x474 -#if defined(MGE_VER2) -#define MGE_TX_FIFO_URGENT_TRSH_IPG_MAX 0xFFFF -#define MGE_TX_FIFO_URGENT_TRSH_IPG(vl) (((vl) & 0xFFFF) << 4) -#else -#define MGE_TX_FIFO_URGENT_TRSH_IPG_MAX 0x3FFF -#define MGE_TX_FIFO_URGENT_TRSH_IPG(vl) (((vl) & 0x3FFF) << 4) -#endif #define MGE_FIXED_PRIO_CONF 0x4dc #define MGE_FIXED_PRIO_EN(q) (1 << (q)) @@ -300,12 +285,7 @@ struct mge_softc { #define MGE_TX_TOKEN_COUNT(q) (0x700 + ((q)<<4)) #define MGE_TX_TOKEN_CONF(q) (0x704 + ((q)<<4)) -#define MGE_TX_TOKEN_Q0_DFLT 0x3fffffff -#define MGE_TX_TOKEN_Q1_7_DFLT 0x0 - #define MGE_TX_ARBITER_CONF(q) (0x704 + ((q)<<4)) -#define MGE_TX_ARB_Q0_DFLT 0xff -#define MGE_TX_ARB_Q1_7_DFLT 0x0 #define MGE_MCAST_REG_NUMBER 64 #define MGE_DA_FILTER_SPEC_MCAST(i) (0x1400 + ((i) << 2)) -- cgit v1.1