Date: Thu, 31 Oct 2002 13:14:06 +0900 (JST) From: Takashi Oono <takashi@yha.att.ne.jp> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/44772: Device polling support for nge(4) driver Message-ID: <200210310414.g9V4E6mZ003363@luna.wipeout.jp>
next in thread | raw e-mail | index | archive | help
>Number: 44772 >Category: kern >Synopsis: Device polling support for nge(4) driver >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Wed Oct 30 20:20:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Takashi Oono >Release: FreeBSD 4.7-STABLE i386 >Organization: AlphaNet Co.,LTD. >Environment: System: FreeBSD luna.wipeout.jp 4.7-STABLE FreeBSD 4.7-STABLE #0: Tue Oct 22 11:54:15 JST 2002 root@luna.wipeout.jp:/export/obj/export/src/sys/GENERIC i386 >Description: Device polling support for nge(4) driver >How-To-Repeat: nothing >Fix: *** if_nge.c.orig Fri Aug 16 01:38:55 2002 --- if_nge.c Thu Oct 31 10:33:49 2002 *************** *** 1380,1385 **** --- 1380,1393 ---- struct mbuf *m0 = NULL; u_int32_t extsts; + #ifdef DEVICE_POLLING + if (ifp->if_ipending & IFF_POLLING) { + if (sc->rxcycles <= 0) + break; + sc->rxcycles--; + } + #endif /* DEVICE_POLLING */ + cur_rx = &sc->nge_ldata->nge_rx_list[i]; rxstat = cur_rx->nge_rxstat; extsts = cur_rx->nge_extsts; *************** *** 1584,1589 **** --- 1592,1645 ---- return; } + #ifdef DEVICE_POLLING + static poll_handler_t nge_poll; + + static void + nge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) + { + struct nge_softc *sc = ifp->if_softc; + + if (cmd == POLL_DEREGISTER) { /* final call, enable interrupts */ + CSR_WRITE_4(sc, NGE_IER, 1); + return; + } + + /* + * On the nge, reading the status register also clears it. + * So before returning to intr mode we must make sure that all + * possible pending sources of interrupts have been served. + * In practice this means run to completion the *eof routines, + * and then call the interrupt routine + */ + sc->rxcycles = count; + nge_rxeof(sc); + nge_txeof(sc); + if (ifp->if_snd.ifq_head != NULL) + nge_start(ifp); + + if (sc->rxcycles > 0 || cmd == POLL_AND_CHECK_STATUS) { + u_int32_t status; + + /* Reading the ISR register clears all interrupts. */ + status = CSR_READ_4(sc, NGE_ISR); + + if (status & (NGE_ISR_RX_ERR|NGE_ISR_RX_OFLOW)) + nge_rxeof(sc); + + if (status & (NGE_ISR_RX_IDLE)) + NGE_SETBIT(sc, NGE_CSR, NGE_CSR_RX_ENABLE); + + if (status & NGE_ISR_SYSERR) { + nge_reset(sc); + nge_init(sc); + } + } + } + #endif /* DEVICE_POLLING */ + + + static void nge_intr(arg) void *arg; { *************** *** 1594,1599 **** --- 1650,1665 ---- sc = arg; ifp = &sc->arpcom.ac_if; + #ifdef DEVICE_POLLING + if (ifp->if_ipending & IFF_POLLING) + return; + if (ether_poll_register(nge_poll, ifp)) { /* ok, disable interrupts */ + CSR_WRITE_4(sc, NGE_IER, 0); + nge_poll(ifp, 0, 1); + return; + } + #endif /* DEVICE_POLLING */ + /* Supress unwanted interrupts */ if (!(ifp->if_flags & IFF_UP)) { nge_stop(sc); *************** *** 1957,1962 **** --- 2023,2037 ---- * Enable interrupts. */ CSR_WRITE_4(sc, NGE_IMR, NGE_INTRS); + #ifdef DEVICE_POLLING + /* + * ... only enable interrupts if we are not polling, make sure + * they are off otherwise. + */ + if (ifp->if_ipending & IFF_POLLING) + CSR_WRITE_4(sc, NGE_IER, 0); + else + #endif /* DEVICE_POLLING */ CSR_WRITE_4(sc, NGE_IER, 1); /* Enable receiver and transmitter. */ *************** *** 2210,2215 **** --- 2285,2293 ---- } untimeout(nge_tick, sc, sc->nge_stat_ch); + #ifdef DEVICE_POLLING + ether_poll_deregister(ifp); + #endif CSR_WRITE_4(sc, NGE_IER, 0); CSR_WRITE_4(sc, NGE_IMR, 0); NGE_SETBIT(sc, NGE_CSR, NGE_CSR_TX_DISABLE|NGE_CSR_RX_DISABLE); *** if_ngereg.h.orig Fri Aug 16 01:38:55 2002 --- if_ngereg.h Thu Oct 31 10:33:59 2002 *************** *** 664,669 **** --- 664,672 ---- SLIST_HEAD(__nge_jinusehead, nge_jpool_entry) nge_jinuse_listhead; u_int8_t nge_tbi; struct ifmedia nge_ifmedia; + #ifdef DEVICE_POLLING + int rxcycles; + #endif }; /* >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200210310414.g9V4E6mZ003363>