Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-1-4]: src/sys/dev/ic Pull up revision 1.6 (requested by fvdl):



details:   https://anonhg.NetBSD.org/src/rev/34de6fe8f132
branches:  netbsd-1-4
changeset: 469965:34de6fe8f132
user:      he <he%NetBSD.org@localhost>
date:      Wed Jan 05 23:30:20 2000 +0000

description:
Pull up revision 1.6 (requested by fvdl):
  Fix interface hang which could happen in case of cable problems
  or if the cable was pulled and then reinserted.

diffstat:

 sys/dev/ic/tropic.c |  36 +++++++++++++++++++++++++++---------
 1 files changed, 27 insertions(+), 9 deletions(-)

diffs (112 lines):

diff -r 16ad8614c216 -r 34de6fe8f132 sys/dev/ic/tropic.c
--- a/sys/dev/ic/tropic.c       Wed Jan 05 23:24:39 2000 +0000
+++ b/sys/dev/ic/tropic.c       Wed Jan 05 23:30:20 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: tropic.c,v 1.2.2.1 1999/04/29 22:22:08 perry Exp $     */
+/*     $NetBSD: tropic.c,v 1.2.2.2 2000/01/05 23:30:20 he Exp $        */
 
 /* 
  * Ported to NetBSD by Onno van der Linden
@@ -97,6 +97,7 @@
 void   tr_mediastatus __P((struct ifnet *, struct ifmediareq *));
 int    tropic_mediachange __P((struct tr_softc *));
 void   tropic_mediastatus __P((struct tr_softc *, struct ifmediareq *));
+void   tr_reinit __P((void *));
 
 /*
  * TODO:
@@ -192,7 +193,7 @@
                        delay(100);
                }
 
-               if ((ACA_RDB(sc, ACA_ISRP_o) & SRB_RESP_INT) == 0) {
+               if (i == 30000 && sc->sc_srb == ACA_RDW(sc, ACA_WRBR)) {
                        printf("No response for fast path cfg\n");
                        return 1;
                }
@@ -499,7 +500,7 @@
 {
        int i;
 
-       tr_stop(sc);
+       sc->sc_srb = 0;
 
        /* 
         * Reset the card.
@@ -525,10 +526,11 @@
                delay(100);
        }
 
-       if ((ACA_RDB(sc, ACA_ISRP_o) & SRB_RESP_INT) == 0) {
+       if (i == 35000 && sc->sc_srb == 0) {
                printf("No response from adapter after reset\n");
                return 1;
        }
+
        ACA_RSTB(sc, ACA_ISRP_o, ~(SRB_RESP_INT));
 
        ACA_OUTB(sc, ACA_RRR_e, (sc->sc_maddr >> 12));
@@ -590,6 +592,17 @@
        tr_stop(sc);
 }
 
+void
+tr_reinit(arg)
+       void *arg;
+{
+       if (tr_reset((struct tr_softc *) arg))
+               return;
+       if (tr_config((struct tr_softc *) arg))
+               return;
+       tr_init(arg);
+}
+
 /*
  *  tr_init - initialize network interface, open adapter for packet
  *          reception and start any pending output
@@ -827,14 +840,19 @@
                 */
                else if (status & SRB_RESP_INT) { /* Adapter response in SRB? */
                        bus_size_t sap_srb;
+                       bus_size_t srb;
 #ifdef TROPICDEBUG
                        bus_size_t log_srb;
 #endif
-                       bus_size_t srb = sc->sc_srb; /* pointer to SRB */
+                       if (sc->sc_srb == 0)
+                               sc->sc_srb = ACA_RDW(sc, ACA_WRBR);
+                       srb = sc->sc_srb; /* pointer to SRB */
                        retcode = SRB_INB(sc, srb, SRB_RETCODE);
                        command = SRB_INB(sc, srb, SRB_CMD);
                        switch (command) {
-
+                       case 0x80: /* 0x80 == initialization complete */
+                       case DIR_CONFIG_FAST_PATH_RAM:
+                               break;
                        case XMIT_DIR_FRAME:    /* Response to xmit request */
                        case XMIT_UI_FRM:       /* Response to xmit request */
                                /* Response not valid? */
@@ -1018,7 +1036,8 @@
                                            sc->sc_dev.dv_xname);
                                        ifp->if_flags &= ~IFF_RUNNING;
                                        ifp->if_flags &= ~IFF_UP;
-                                       timeout(tr_init, sc ,hz*30);
+                                       if_qflush(&ifp->if_snd);
+                                       timeout(tr_reinit, sc ,hz*30);
                                }
                                else {
 #ifdef TROPICDEBUG
@@ -1033,12 +1052,11 @@
                                }
                                if (ARB_INW(sc, arb, ARB_RINGSTATUS) &
                                    LOG_OFLOW){
-                                       bus_size_t srb = sc->sc_srb;
 /*
  * XXX CMD_IN_SRB, handle with SRB_FREE_INT ?
  */
                                        ifp->if_flags |= IFF_OACTIVE;
-                                       SRB_OUTB(sc, srb, SRB_CMD,
+                                       SRB_OUTB(sc, sc->sc_srb, SRB_CMD,
                                            DIR_READ_LOG);
                                        /* Read & reset err log cmnd in SRB. */
                                        ACA_SETB(sc, ACA_ISRA_o, CMD_IN_SRB);



Home | Main Index | Thread Index | Old Index