diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ic/dc.c | 15 | ||||
-rw-r--r-- | sys/dev/ic/dcreg.h | 6 |
2 files changed, 16 insertions, 5 deletions
diff --git a/sys/dev/ic/dc.c b/sys/dev/ic/dc.c index 7686db16fce..366fb99ce4c 100644 --- a/sys/dev/ic/dc.c +++ b/sys/dev/ic/dc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dc.c,v 1.99 2007/11/26 17:45:14 brad Exp $ */ +/* $OpenBSD: dc.c,v 1.100 2008/09/03 19:29:48 brad Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -1264,9 +1264,16 @@ dc_setcfg(sc, media) DELAY(10); } - if (i == DC_TIMEOUT) - printf("%s: failed to force tx and " - "rx to idle state\n", sc->sc_dev.dv_xname); + if (i == DC_TIMEOUT) { + if (!(isr & DC_ISR_TX_IDLE) && !DC_IS_ASIX(sc)) + printf("%s: failed to force tx to idle state\n", + sc->sc_dev.dv_xname); + if (!((isr & DC_ISR_RX_STATE) == DC_RXSTATE_STOPPED || + (isr & DC_ISR_RX_STATE) == DC_RXSTATE_WAIT) && + !DC_HAS_BROKEN_RXSTATE(sc)) + printf("%s: failed to force rx to idle state\n", + sc->sc_dev.dv_xname); + } } if (IFM_SUBTYPE(media) == IFM_100_TX) { diff --git a/sys/dev/ic/dcreg.h b/sys/dev/ic/dcreg.h index 94938182f44..d86887ea2f7 100644 --- a/sys/dev/ic/dcreg.h +++ b/sys/dev/ic/dcreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dcreg.h,v 1.43 2008/07/21 04:12:21 kevlo Exp $ */ +/* $OpenBSD: dcreg.h,v 1.44 2008/09/03 19:29:48 brad Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -195,6 +195,10 @@ #define DC_RXSTATE_FLUSH 0x000C0000 /* 110 - flush from FIFO */ #define DC_RXSTATE_DEQUEUE 0x000E0000 /* 111 - dequeue from FIFO */ +#define DC_HAS_BROKEN_RXSTATE(x) \ + (DC_IS_CENTAUR(x) || DC_IS_CONEXANT(x) || (DC_IS_DAVICOM(x) && \ + sc->dc_revision >= DC_REVISION_DM9102A)) + #define DC_TXSTATE_RESET 0x00000000 /* 000 - reset */ #define DC_TXSTATE_FETCH 0x00100000 /* 001 - fetching descriptor */ #define DC_TXSTATE_WAITEND 0x00200000 /* 010 - wait for tx end */ |