From owner-freebsd-current Mon Feb 12 09:31:19 1996 Return-Path: owner-current Received: (from root@localhost) by freefall.freebsd.org (8.7.3/8.7.3) id JAA13166 for current-outgoing; Mon, 12 Feb 1996 09:31:19 -0800 (PST) Received: from localhost.cdrom.com (localhost.cdrom.com [127.0.0.1]) by freefall.freebsd.org (8.7.3/8.7.3) with SMTP id JAA13159 for ; Mon, 12 Feb 1996 09:31:17 -0800 (PST) Message-Id: <199602121731.JAA13159@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: Host localhost.cdrom.com [127.0.0.1] didn't use HELO protocol To: current Subject: 3c509 patches. Date: Mon, 12 Feb 1996 09:31:17 -0800 From: "Justin T. Gibbs" Sender: owner-current@FreeBSD.ORG Precedence: bulk These patches re-enable the watchdog timer and do some other cleanup in how we access our ifp. Can someone test these please so I can commit them? I have a 3c509, but no network at the moment. Thanks -- Justin T. Gibbs =========================================== FreeBSD: Turning PCs into workstations =========================================== Index: if_ep.c =================================================================== RCS file: /usr/cvs/src/sys/i386/isa/if_ep.c,v retrieving revision 1.40 diff -c -r1.40 if_ep.c *** if_ep.c 1996/02/06 18:50:41 1.40 --- if_ep.c 1996/02/12 17:25:47 *************** *** 689,701 **** int s, pad; s = splimp(); ! if (sc->arpcom.ac_if.if_flags & IFF_OACTIVE) { splx(s); return; } startagain: /* Sneak a peek at the next packet */ ! m = sc->arpcom.ac_if.if_snd.ifq_head; if (m == 0) { splx(s); return; --- 689,701 ---- int s, pad; s = splimp(); ! if (ifp->if_flags & IFF_OACTIVE) { splx(s); return; } startagain: /* Sneak a peek at the next packet */ ! m = ifp->if_snd.ifq_head; if (m == 0) { splx(s); return; *************** *** 712,730 **** */ if (len + pad > ETHER_MAX_LEN) { /* packet is obviously too large: toss it */ ! ++sc->arpcom.ac_if.if_oerrors; ! IF_DEQUEUE(&sc->arpcom.ac_if.if_snd, m); m_freem(m); goto readcheck; } if (inw(BASE + EP_W1_FREE_TX) < len + pad + 4) { /* no room in FIFO */ outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | (len + pad + 4)); ! sc->arpcom.ac_if.if_flags |= IFF_OACTIVE; splx(s); return; } ! IF_DEQUEUE(&sc->arpcom.ac_if.if_snd, m); outw(BASE + EP_W1_TX_PIO_WR_1, len); outw(BASE + EP_W1_TX_PIO_WR_1, 0x0); /* Second dword meaningless */ --- 712,730 ---- */ if (len + pad > ETHER_MAX_LEN) { /* packet is obviously too large: toss it */ ! ++ifp->if_oerrors; ! IF_DEQUEUE(&ifp->if_snd, m); m_freem(m); goto readcheck; } if (inw(BASE + EP_W1_FREE_TX) < len + pad + 4) { /* no room in FIFO */ outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | (len + pad + 4)); ! ifp->if_flags |= IFF_OACTIVE; splx(s); return; } ! IF_DEQUEUE(&ifp->if_snd, m); outw(BASE + EP_W1_TX_PIO_WR_1, len); outw(BASE + EP_W1_TX_PIO_WR_1, 0x0); /* Second dword meaningless */ *************** *** 761,772 **** outb(BASE + EP_W1_TX_PIO_WR_1, 0); /* Padding */ #if NBPFILTER > 0 ! if (sc->arpcom.ac_if.if_bpf) { ! bpf_mtap(&sc->arpcom.ac_if, top); } #endif ! sc->arpcom.ac_if.if_opackets++; m_freem(top); /* * Every 1024*4 packets we increment the tx_rate if we haven't had --- 761,773 ---- outb(BASE + EP_W1_TX_PIO_WR_1, 0); /* Padding */ #if NBPFILTER > 0 ! if (ifp->if_bpf) { ! bpf_mtap(ifp, top); } #endif ! ifp->if_timer=2; ! ifp->if_opackets++; m_freem(top); /* * Every 1024*4 packets we increment the tx_rate if we haven't had *************** *** 786,792 **** * we check if we have packets left, in that case we prepare to come * back later */ ! if (sc->arpcom.ac_if.if_snd.ifq_head) { outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | sc->tx_start_thresh); } --- 787,793 ---- * we check if we have packets left, in that case we prepare to come * back later */ ! if (ifp->if_snd.ifq_head) { outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | sc->tx_start_thresh); } *************** *** 802,811 **** --- 803,815 ---- { register int status; register struct ep_softc *sc = &ep_softc[unit]; + struct ifnet *ifp; int x; x=splbio(); + ifp = &sc->arpcom.ac_if; + outw(BASE + EP_COMMAND, SET_INTR_MASK); /* disable all Ints */ rescan: *************** *** 821,839 **** } if (status & S_TX_AVAIL) { /* we need ACK */ ! sc->arpcom.ac_if.if_flags &= ~IFF_OACTIVE; GO_WINDOW(1); inw(BASE + EP_W1_FREE_TX); ! epstart(&sc->arpcom.ac_if); } if (status & S_CARD_FAILURE) { #ifdef EP_LOCAL_STATS printf("\nep%d:\n\tStatus: %x\n", unit, status); GO_WINDOW(4); printf("\tFIFO Diagnostic: %x\n", inw(BASE + EP_W4_FIFO_DIAG)); printf("\tStat: %x\n", sc->stat); printf("\tIpackets=%d, Opackets=%d\n", ! sc->arpcom.ac_if.if_ipackets, sc->arpcom.ac_if.if_opackets); printf("\tNOF=%d, NOMB=%d, BPFD=%d, RXOF=%d, RXOL=%d, TXU=%d\n", sc->rx_no_first, sc->rx_no_mbuf, sc->rx_bpf_disc, sc->rx_overrunf, sc->rx_overrunl, sc->tx_underrun); --- 825,845 ---- } if (status & S_TX_AVAIL) { /* we need ACK */ ! ifp->if_timer=0; ! ifp->if_flags &= ~IFF_OACTIVE; GO_WINDOW(1); inw(BASE + EP_W1_FREE_TX); ! epstart(ifp); } if (status & S_CARD_FAILURE) { + ifp->if_timer=0; #ifdef EP_LOCAL_STATS printf("\nep%d:\n\tStatus: %x\n", unit, status); GO_WINDOW(4); printf("\tFIFO Diagnostic: %x\n", inw(BASE + EP_W4_FIFO_DIAG)); printf("\tStat: %x\n", sc->stat); printf("\tIpackets=%d, Opackets=%d\n", ! ifp->if_ipackets, ifp->if_opackets); printf("\tNOF=%d, NOMB=%d, BPFD=%d, RXOF=%d, RXOL=%d, TXU=%d\n", sc->rx_no_first, sc->rx_no_mbuf, sc->rx_bpf_disc, sc->rx_overrunf, sc->rx_overrunl, sc->tx_underrun); *************** *** 842,848 **** #ifdef DIAGNOSTIC printf("ep%d: Status: %x (input buffer overflow)\n", unit, status); #else ! ++sc->arpcom.ac_if.if_ierrors; #endif #endif --- 848,854 ---- #ifdef DIAGNOSTIC printf("ep%d: Status: %x (input buffer overflow)\n", unit, status); #else ! ++ifp->if_ierrors; #endif #endif *************** *** 851,856 **** --- 857,863 ---- return; } if (status & S_TX_COMPLETE) { + ifp->if_timer=0; /* we need ACK. we do it at the end */ /* * We need to read TX_STATUS until we get a 0 status in order to *************** *** 871,895 **** } else { if (status & TXS_JABBER); else /* TXS_MAX_COLLISION - we shouldn't get here */ ! ++sc->arpcom.ac_if.if_collisions; } ! ++sc->arpcom.ac_if.if_oerrors; outw(BASE + EP_COMMAND, TX_ENABLE); /* * To have a tx_avail_int but giving the chance to the * Reception */ ! if (sc->arpcom.ac_if.if_snd.ifq_head) { outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | 8); } } outb(BASE + EP_W1_TX_STATUS, 0x0); /* pops up the next * status */ } /* while */ ! sc->arpcom.ac_if.if_flags &= ~IFF_OACTIVE; GO_WINDOW(1); inw(BASE + EP_W1_FREE_TX); ! epstart(&sc->arpcom.ac_if); } /* end TX_COMPLETE */ } --- 878,902 ---- } else { if (status & TXS_JABBER); else /* TXS_MAX_COLLISION - we shouldn't get here */ ! ++ifp->if_collisions; } ! ++ifp->if_oerrors; outw(BASE + EP_COMMAND, TX_ENABLE); /* * To have a tx_avail_int but giving the chance to the * Reception */ ! if (ifp->if_snd.ifq_head) { outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | 8); } } outb(BASE + EP_W1_TX_STATUS, 0x0); /* pops up the next * status */ } /* while */ ! ifp->if_flags &= ~IFF_OACTIVE; GO_WINDOW(1); inw(BASE + EP_W1_FREE_TX); ! epstart(ifp); } /* end TX_COMPLETE */ } *************** *** 910,927 **** { struct ether_header *eh; struct mbuf *top, *mcur, *m; int lenthisone; short rx_fifo2, status; register short delta; register short rx_fifo; status = inw(BASE + EP_W1_RX_STATUS); read_again: if (status & ERR_RX) { ! ++sc->arpcom.ac_if.if_ierrors; if (status & ERR_RX_OVERRUN) { /* * we can think the rx latency is actually greather than we --- 917,936 ---- { struct ether_header *eh; struct mbuf *top, *mcur, *m; + struct ifnet *ifp; int lenthisone; short rx_fifo2, status; register short delta; register short rx_fifo; + ifp = &sc->arpcom.ac_if; status = inw(BASE + EP_W1_RX_STATUS); read_again: if (status & ERR_RX) { ! ++ifp->if_ierrors; if (status & ERR_RX_OVERRUN) { /* * we can think the rx latency is actually greather than we *************** *** 1078,1092 **** if (delta < MIN_RX_EARLY_THRESHF) delta = MIN_RX_EARLY_THRESHF; sc->rx_early_thresh = delta; ! ++sc->arpcom.ac_if.if_ipackets; ep_fset(F_RX_FIRST); ep_frst(F_RX_TRAILER); top->m_pkthdr.rcvif = &sc->arpcom.ac_if; top->m_pkthdr.len = sc->cur_len; #if NBPFILTER > 0 ! if (sc->arpcom.ac_if.if_bpf) { ! bpf_mtap(&sc->arpcom.ac_if, top); /* * Note that the interface cannot be in promiscuous mode if there are --- 1087,1101 ---- if (delta < MIN_RX_EARLY_THRESHF) delta = MIN_RX_EARLY_THRESHF; sc->rx_early_thresh = delta; ! ++ifp->if_ipackets; ep_fset(F_RX_FIRST); ep_frst(F_RX_TRAILER); top->m_pkthdr.rcvif = &sc->arpcom.ac_if; top->m_pkthdr.len = sc->cur_len; #if NBPFILTER > 0 ! if (ifp->if_bpf) { ! bpf_mtap(ifp, top); /* * Note that the interface cannot be in promiscuous mode if there are *************** *** 1094,1100 **** * check if this packet is really ours. */ eh = mtod(top, struct ether_header *); ! if ((sc->arpcom.ac_if.if_flags & IFF_PROMISC) && (eh->ether_dhost[0] & 1) == 0 && bcmp(eh->ether_dhost, sc->arpcom.ac_enaddr, sizeof(eh->ether_dhost)) != 0 && --- 1103,1109 ---- * check if this packet is really ours. */ eh = mtod(top, struct ether_header *); ! if ((ifp->if_flags & IFF_PROMISC) && (eh->ether_dhost[0] & 1) == 0 && bcmp(eh->ether_dhost, sc->arpcom.ac_enaddr, sizeof(eh->ether_dhost)) != 0 && *************** *** 1118,1124 **** eh = mtod(top, struct ether_header *); m_adj(top, sizeof(struct ether_header)); ! ether_input(&sc->arpcom.ac_if, eh, top); if (!sc->mb[sc->next_mb]) epmbuffill((caddr_t) sc, 0); sc->top = 0; --- 1127,1133 ---- eh = mtod(top, struct ether_header *); m_adj(top, sizeof(struct ether_header)); ! ether_input(ifp, eh, top); if (!sc->mb[sc->next_mb]) epmbuffill((caddr_t) sc, 0); sc->top = 0;