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@feith.com>
This commit is contained in:
parent
5c5b28d0d7
commit
d8e5258da2
@ -84,6 +84,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#define WRITE4(_sc, _reg, _val) \
|
#define WRITE4(_sc, _reg, _val) \
|
||||||
bus_write_4((_sc)->res[0], _reg, _val)
|
bus_write_4((_sc)->res[0], _reg, _val)
|
||||||
|
|
||||||
|
#define MAC_RESET_TIMEOUT 100
|
||||||
#define WATCHDOG_TIMEOUT_SECS 5
|
#define WATCHDOG_TIMEOUT_SECS 5
|
||||||
#define STATS_HARVEST_INTERVAL 2
|
#define STATS_HARVEST_INTERVAL 2
|
||||||
#define MII_CLK_VAL 2
|
#define MII_CLK_VAL 2
|
||||||
@ -1103,19 +1104,6 @@ dwc_attach(device_t dev)
|
|||||||
sc->bst = rman_get_bustag(sc->res[0]);
|
sc->bst = rman_get_bustag(sc->res[0]);
|
||||||
sc->bsh = rman_get_bushandle(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 */
|
/* Read MAC before reset */
|
||||||
if (dwc_get_hwaddr(sc, macaddr)) {
|
if (dwc_get_hwaddr(sc, macaddr)) {
|
||||||
device_printf(sc->dev, "can't get mac\n");
|
device_printf(sc->dev, "can't get mac\n");
|
||||||
@ -1127,12 +1115,12 @@ dwc_attach(device_t dev)
|
|||||||
reg |= (BUS_MODE_SWR);
|
reg |= (BUS_MODE_SWR);
|
||||||
WRITE4(sc, BUS_MODE, reg);
|
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)
|
if ((READ4(sc, BUS_MODE) & BUS_MODE_SWR) == 0)
|
||||||
break;
|
break;
|
||||||
DELAY(10);
|
DELAY(10);
|
||||||
}
|
}
|
||||||
if (i == 0) {
|
if (i >= MAC_RESET_TIMEOUT) {
|
||||||
device_printf(sc->dev, "Can't reset DWC.\n");
|
device_printf(sc->dev, "Can't reset DWC.\n");
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
@ -1156,6 +1144,19 @@ dwc_attach(device_t dev)
|
|||||||
WRITE4(sc, RX_DESCR_LIST_ADDR, sc->rxdesc_ring_paddr);
|
WRITE4(sc, RX_DESCR_LIST_ADDR, sc->rxdesc_ring_paddr);
|
||||||
WRITE4(sc, TX_DESCR_LIST_ADDR, sc->txdesc_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. */
|
/* Set up the ethernet interface. */
|
||||||
sc->ifp = ifp = if_alloc(IFT_ETHER);
|
sc->ifp = ifp = if_alloc(IFT_ETHER);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user