svn commit: r278670 - head/sys/dev/dwc
Ruslan Bukin
br at FreeBSD.org
Fri Feb 13 11:00:14 UTC 2015
Author: br
Date: Fri Feb 13 11:00:13 2015
New Revision: 278670
URL: https://svnweb.freebsd.org/changeset/base/278670
Log:
o Correct the condition in reset procedure
o Setup interrupt hander after reset, not before
This fixes operation on ODROID-C1 (Amlogic S805)
Submitted by: John Wehle <john at feith.com>
Modified:
head/sys/dev/dwc/if_dwc.c
Modified: head/sys/dev/dwc/if_dwc.c
==============================================================================
--- head/sys/dev/dwc/if_dwc.c Fri Feb 13 09:02:15 2015 (r278669)
+++ head/sys/dev/dwc/if_dwc.c Fri Feb 13 11:00:13 2015 (r278670)
@@ -84,6 +84,7 @@ __FBSDID("$FreeBSD$");
#define WRITE4(_sc, _reg, _val) \
bus_write_4((_sc)->res[0], _reg, _val)
+#define MAC_RESET_TIMEOUT 100
#define WATCHDOG_TIMEOUT_SECS 5
#define STATS_HARVEST_INTERVAL 2
#define MII_CLK_VAL 2
@@ -1103,19 +1104,6 @@ dwc_attach(device_t dev)
sc->bst = rman_get_bustag(sc->res[0]);
sc->bsh = rman_get_bushandle(sc->res[0]);
- mtx_init(&sc->mtx, device_get_nameunit(sc->dev),
- MTX_NETWORK_LOCK, MTX_DEF);
-
- callout_init_mtx(&sc->dwc_callout, &sc->mtx, 0);
-
- /* Setup interrupt handler. */
- error = bus_setup_intr(dev, sc->res[1], INTR_TYPE_NET | INTR_MPSAFE,
- NULL, dwc_intr, sc, &sc->intr_cookie);
- if (error != 0) {
- device_printf(dev, "could not setup interrupt handler.\n");
- return (ENXIO);
- }
-
/* Read MAC before reset */
if (dwc_get_hwaddr(sc, macaddr)) {
device_printf(sc->dev, "can't get mac\n");
@@ -1127,12 +1115,12 @@ dwc_attach(device_t dev)
reg |= (BUS_MODE_SWR);
WRITE4(sc, BUS_MODE, reg);
- for (i = 0; i < 100; i++) {
+ for (i = 0; i < MAC_RESET_TIMEOUT; i++) {
if ((READ4(sc, BUS_MODE) & BUS_MODE_SWR) == 0)
break;
DELAY(10);
}
- if (i == 0) {
+ if (i >= MAC_RESET_TIMEOUT) {
device_printf(sc->dev, "Can't reset DWC.\n");
return (ENXIO);
}
@@ -1156,6 +1144,19 @@ dwc_attach(device_t dev)
WRITE4(sc, RX_DESCR_LIST_ADDR, sc->rxdesc_ring_paddr);
WRITE4(sc, TX_DESCR_LIST_ADDR, sc->txdesc_ring_paddr);
+ mtx_init(&sc->mtx, device_get_nameunit(sc->dev),
+ MTX_NETWORK_LOCK, MTX_DEF);
+
+ callout_init_mtx(&sc->dwc_callout, &sc->mtx, 0);
+
+ /* Setup interrupt handler. */
+ error = bus_setup_intr(dev, sc->res[1], INTR_TYPE_NET | INTR_MPSAFE,
+ NULL, dwc_intr, sc, &sc->intr_cookie);
+ if (error != 0) {
+ device_printf(dev, "could not setup interrupt handler.\n");
+ return (ENXIO);
+ }
+
/* Set up the ethernet interface. */
sc->ifp = ifp = if_alloc(IFT_ETHER);
More information about the svn-src-all
mailing list