Skip site navigation (1)Skip section navigation (2)
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>