Index: if_ep.c =================================================================== RCS file: /cache/ncvs/src/sys/dev/ep/if_ep.c,v retrieving revision 1.106 diff -u -r1.106 if_ep.c --- if_ep.c 2000/10/15 14:18:11 1.106 +++ if_ep.c 2001/06/04 22:39:45 @@ -346,7 +346,15 @@ */ s = splimp(); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + i = 1000; /* 1 second */ + while ((i--) && (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)) + continue; + if (i == 0) { + printf("ep%d: Command In Porgress Stuck: %x\n", sc->unit, + inw(BASE + EP_STATUS)); + splx(s); + return; + } GO_WINDOW(0); outw(BASE + EP_COMMAND, STOP_TRANSCEIVER); @@ -368,7 +376,15 @@ outw(BASE + EP_COMMAND, RX_RESET); outw(BASE + EP_COMMAND, TX_RESET); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + i = 1000; /* 1 second */ + while ((i--) && (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)) + continue; + if (i == 0) { + printf("ep%d: Command In Porgress Stuck: %x\n", sc->unit, + inw(BASE + EP_STATUS)); + splx(s); + return; + } /* Window 1 is operating window */ GO_WINDOW(1); @@ -431,13 +447,20 @@ u_int len; struct mbuf *m; struct mbuf *top; - int s, pad; + int i, s, pad; if (sc->gone) { return; } - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + i = 1000; /* 1 second */ + while ((i--) && (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)) + continue; + if (i == 0) { + printf("ep%d: Command In Porgress Stuck: %x\n", sc->unit, + inw(BASE + EP_STATUS)); + return; + } if (ifp->if_flags & IFF_OACTIVE) { return; } @@ -550,6 +573,8 @@ if (sc->gone) return; + if (inw(BASE + EP_STATUS) == 0xffff) + return; ifp = &sc->arpcom.ac_if; @@ -657,7 +682,7 @@ struct ether_header *eh; struct mbuf *top, *mcur, *m; struct ifnet *ifp; - int lenthisone; + int lenthisone, i; short rx_fifo2, status; register short rx_fifo; @@ -766,7 +791,14 @@ m_adj(top, sizeof(struct ether_header)); ether_input(ifp, eh, top); sc->top = 0; - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + i = 1000; /* 1 second */ + while ((i--) && (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)) + continue; + if (i == 0) { + printf("ep%d: Command In Porgress Stuck: %x\n", sc->unit, + inw(BASE + EP_STATUS)); + return; + } outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); return; @@ -780,7 +812,14 @@ #endif } EP_FSET(sc, F_RX_FIRST); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + i = 1000; /* 1 second */ + while ((i--) && (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)) + continue; + if (i == 0) { + printf("ep%d: Command In Porgress Stuck: %x\n", sc->unit, + inw(BASE + EP_STATUS)); + return; + } outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); } @@ -931,22 +970,45 @@ epstop(sc) struct ep_softc *sc; { + int i; + if (sc->gone) { return; } outw(BASE + EP_COMMAND, RX_DISABLE); outw(BASE + EP_COMMAND, RX_DISCARD_TOP_PACK); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + i = 1000; /* 1 second */ + while ((i--) && (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)) + continue; + if (i == 0) { + printf("ep%d: Command In Porgress Stuck: %x\n", sc->unit, + inw(BASE + EP_STATUS)); + return; + } outw(BASE + EP_COMMAND, TX_DISABLE); outw(BASE + EP_COMMAND, STOP_TRANSCEIVER); DELAY(800); outw(BASE + EP_COMMAND, RX_RESET); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + i = 1000; /* 1 second */ + while ((i--) && (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)) + continue; + if (i == 0) { + printf("ep%d: Command In Porgress Stuck: %x\n", sc->unit, + inw(BASE + EP_STATUS)); + return; + } outw(BASE + EP_COMMAND, TX_RESET); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + i = 1000; /* 1 second */ + while ((i--) && (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS)) + continue; + if (i == 0) { + printf("ep%d: Command In Porgress Stuck: %x\n", sc->unit, + inw(BASE + EP_STATUS)); + return; + } outw(BASE + EP_COMMAND, C_INTR_LATCH); outw(BASE + EP_COMMAND, SET_RD_0_MASK);