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-head mailing list