Skip site navigation (1)Skip section navigation (2)
Date:      Sat,  7 Jan 2006 23:17:00 +0000 (GMT)
From:      Nate Nielsen <nielsen-list@memberwebs.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Polling for devices other than NICs [patch]
Message-ID:  <20060107231659.DD05BDCA9A5@mail.npubs.com>
References:  <20060106022920.BF7DADCA990@mail.npubs.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------060508080200040308080909
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Nate Nielsen wrote:
> The polling functionality in FreeBSD is currently a bit NIC centric.
> With a few changes other types devices can use the polling subsystem.
> Attached is my first whack at this.
> 
> This is some of my first hacking on the FreeBSD kernel. It'd be great if
> there was someone who could take a look and help me get it right.

Attached is a patch against HEAD.

Cheers,
Nate

--------------060508080200040308080909
Content-Type: text/x-patch;
 name="device-polling-7.0-2.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="device-polling-7.0-2.patch"

Index: dev/dc/if_dc.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/dc/if_dc.c,v
retrieving revision 1.178
diff -p -U5 -r1.178 if_dc.c
--- dev/dc/if_dc.c	28 Dec 2005 18:00:37 -0000	1.178
+++ dev/dc/if_dc.c	7 Jan 2006 22:20:46 -0000
@@ -2346,11 +2346,11 @@ dc_detach(device_t dev)
 
 	ifp = sc->dc_ifp;
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 
 	/* These should only be active if attach succeeded */
 	if (device_is_attached(dev)) {
 		DC_LOCK(sc);
@@ -3045,12 +3045,13 @@ dc_tx_underrun(struct dc_softc *sc)
 
 #ifdef DEVICE_POLLING
 static poll_handler_t dc_poll;
 
 static void
-dc_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+dc_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct dc_softc *sc = ifp->if_softc;
 
 	DC_LOCK(sc);
 
 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
@@ -3691,11 +3692,11 @@ dc_ioctl(struct ifnet *ifp, u_long comma
 		break;
 	case SIOCSIFCAP:
 #ifdef DEVICE_POLLING
 		if (ifr->ifr_reqcap & IFCAP_POLLING &&
 		    !(ifp->if_capenable & IFCAP_POLLING)) {
-			error = ether_poll_register(dc_poll, ifp);
+			error = device_poll_register(dc_poll, ifp, ifp->if_xname);
 			if (error)
 				return(error);
 			DC_LOCK(sc);
 			/* Disable interrupts */
 			CSR_WRITE_4(sc, DC_IMR, 0x00000000);
@@ -3704,11 +3705,11 @@ dc_ioctl(struct ifnet *ifp, u_long comma
 			return (error);
 			
 		}
 		if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
 		    ifp->if_capenable & IFCAP_POLLING) {
-			error = ether_poll_deregister(ifp);
+			error = device_poll_deregister(ifp, ifp->if_xname);
 			/* Enable interrupts. */
 			DC_LOCK(sc);
 			CSR_WRITE_4(sc, DC_IMR, DC_INTRS);
 			ifp->if_capenable &= ~IFCAP_POLLING;
 			DC_UNLOCK(sc);
Index: dev/em/if_em.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/em/if_em.c,v
retrieving revision 1.97
diff -p -U5 -r1.97 if_em.c
--- dev/em/if_em.c	28 Dec 2005 09:37:04 -0000	1.97
+++ dev/em/if_em.c	7 Jan 2006 22:21:04 -0000
@@ -803,19 +803,19 @@ em_ioctl(struct ifnet *ifp, u_long comma
 		reinit = 0;
 		mask = ifr->ifr_reqcap ^ ifp->if_capenable;
 #ifdef DEVICE_POLLING
 		if (mask & IFCAP_POLLING) {
 			if (ifr->ifr_reqcap & IFCAP_POLLING) {
-				error = ether_poll_register(em_poll, ifp);
+				error = device_poll_register(em_poll, ifp, ifp->if_xname);
 				if (error)
 					return(error);
 				EM_LOCK(adapter);
 				em_disable_intr(adapter);
 				ifp->if_capenable |= IFCAP_POLLING;
 				EM_UNLOCK(adapter);
 			} else {
-				error = ether_poll_deregister(ifp);
+				error = device_poll_deregister(ifp, ifp->if_xname);
 				/* Enable interrupt even in error case */
 				EM_LOCK(adapter);
 				em_enable_intr(adapter);
 				ifp->if_capenable &= ~IFCAP_POLLING;
 				EM_UNLOCK(adapter);
@@ -1039,12 +1039,13 @@ em_poll_locked(struct ifnet *ifp, enum p
         if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
                 em_start_locked(ifp);
 }
         
 static void     
-em_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+em_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
         struct adapter *adapter = ifp->if_softc;
 
 	EM_LOCK(adapter);
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
 		em_poll_locked(ifp, cmd, count);
Index: dev/firewire/if_fwe.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/firewire/if_fwe.c,v
retrieving revision 1.41
diff -p -U5 -r1.41 if_fwe.c
--- dev/firewire/if_fwe.c	11 Oct 2005 07:30:06 -0000	1.41
+++ dev/firewire/if_fwe.c	7 Jan 2006 22:21:04 -0000
@@ -104,12 +104,13 @@ TUNABLE_INT("hw.firewire.fwe.rx_queue_le
 
 #ifdef DEVICE_POLLING
 static poll_handler_t fwe_poll;
 
 static void
-fwe_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+fwe_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct fwe_softc *fwe;
 	struct firewire_comm *fc;
 
 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
 		return;
@@ -290,11 +291,11 @@ fwe_detach(device_t dev)
 	fwe = device_get_softc(dev);
 	ifp = fwe->eth_softc.ifp;
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 	s = splimp();
 
 	fwe_stop(fwe);
 #if defined(__DragonFly__) || __FreeBSD_version < 500000
@@ -462,21 +463,21 @@ fwe_ioctl(struct ifnet *ifp, u_long cmd,
 			struct ifreq *ifr = (struct ifreq *) data;
 			struct firewire_comm *fc = fc = fwe->fd.fc;
 
 			if (ifr->ifr_reqcap & IFCAP_POLLING &&
 			    !(ifp->if_capenable & IFCAP_POLLING)) {
-				error = ether_poll_register(fwe_poll, ifp);
+				error = device_poll_register(fwe_poll, ifp);
 				if (error)
 					return(error);
 				/* Disable interrupts */
 				fc->set_intr(fc, 0);
 				ifp->if_capenable |= IFCAP_POLLING;
 				return (error);
 			}
 			if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
 			    ifp->if_capenable & IFCAP_POLLING) {
-				error = ether_poll_deregister(ifp);
+				error = device_poll_deregister(ifp);
 				/* Enable interrupts. */
 				fc->set_intr(fc, 1);
 				ifp->if_capenable &= ~IFCAP_POLLING;
 				return (error);
 			}
Index: dev/firewire/if_fwip.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/firewire/if_fwip.c,v
retrieving revision 1.11
diff -p -U5 -r1.11 if_fwip.c
--- dev/firewire/if_fwip.c	5 Oct 2005 10:09:14 -0000	1.11
+++ dev/firewire/if_fwip.c	7 Jan 2006 22:21:05 -0000
@@ -111,12 +111,13 @@ TUNABLE_INT("hw.firewire.fwip.rx_queue_l
 
 #ifdef DEVICE_POLLING
 static poll_handler_t fwip_poll;
 
 static void
-fwip_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+fwip_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct fwip_softc *fwip;
 	struct firewire_comm *fc;
 
 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
 		return;
@@ -272,11 +273,11 @@ fwip_detach(device_t dev)
 	fwip = (struct fwip_softc *)device_get_softc(dev);
 	ifp = fwip->fw_softc.fwip_ifp;
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 
 	s = splimp();
 
 	fwip_stop(fwip);
@@ -444,22 +445,22 @@ fwip_ioctl(struct ifnet *ifp, u_long cmd
 		struct ifreq *ifr = (struct ifreq *) data;
 		struct firewire_comm *fc = fc = fwip->fd.fc;
 
 		if (ifr->ifr_reqcap & IFCAP_POLLING &&
 		    !(ifp->if_capenable & IFCAP_POLLING)) {
-			error = ether_poll_register(fwip_poll, ifp);
+			error = device_poll_register(fwip_poll, ifp, ifp->if_xname);
 			if (error)
 				return(error);
 			/* Disable interrupts */
 			fc->set_intr(fc, 0);
 			ifp->if_capenable |= IFCAP_POLLING;
 			return (error);
 			
 		}
 		if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
 		    ifp->if_capenable & IFCAP_POLLING) {
-			error = ether_poll_deregister(ifp);
+			error = device_poll_deregister(ifp, ifp->if_xname);
 			/* Enable interrupts. */
 			fc->set_intr(fc, 1);
 			ifp->if_capenable &= ~IFCAP_POLLING;
 			return (error);
 		}
Index: dev/fxp/if_fxp.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/fxp/if_fxp.c,v
retrieving revision 1.252
diff -p -U5 -r1.252 if_fxp.c
--- dev/fxp/if_fxp.c	12 Dec 2005 14:30:13 -0000	1.252
+++ dev/fxp/if_fxp.c	7 Jan 2006 22:21:06 -0000
@@ -45,10 +45,11 @@ __FBSDID("$FreeBSD: src/sys/dev/fxp/if_f
 		/* #include <sys/mutex.h> */
 #include <sys/kernel.h>
 #include <sys/module.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>
+#include <sys/bus.h>
 
 #include <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_media.h>
 
@@ -895,11 +896,11 @@ fxp_detach(device_t dev)
 {
 	struct fxp_softc *sc = device_get_softc(dev);
 
 #ifdef DEVICE_POLLING
 	if (sc->ifp->if_capenable & IFCAP_POLLING)   
-		ether_poll_deregister(sc->ifp);
+		device_poll_deregister(sc->ifp, sc->ifp->if_xname);
 #endif
 
 	FXP_LOCK(sc);
 	sc->suspended = 1;	/* Do same thing as we do for suspend */
 	/*
@@ -1449,12 +1450,13 @@ fxp_encap(struct fxp_softc *sc, struct m
 
 #ifdef DEVICE_POLLING
 static poll_handler_t fxp_poll;
 
 static void
-fxp_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+fxp_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct fxp_softc *sc = ifp->if_softc;
 	uint8_t statack;
 
 	FXP_LOCK(sc);
 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
@@ -2413,20 +2415,20 @@ fxp_ioctl(struct ifnet *ifp, u_long comm
 	case SIOCSIFCAP:
 		mask = ifp->if_capenable ^ ifr->ifr_reqcap;
 #ifdef DEVICE_POLLING
 		if (mask & IFCAP_POLLING) {
 			if (ifr->ifr_reqcap & IFCAP_POLLING) {
-				error = ether_poll_register(fxp_poll, ifp);
+				error = device_poll_register(fxp_poll, ifp, ifp->if_xname);
 				if (error)
 					return(error);
 				FXP_LOCK(sc);
 				CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL,
 				    FXP_SCB_INTR_DISABLE);
 				ifp->if_capenable |= IFCAP_POLLING;
 				FXP_UNLOCK(sc);
 			} else {
-				error = ether_poll_deregister(ifp);
+				error = device_poll_deregister(ifp, ifp->if_xname);
 				/* Enable interrupts in any case */
 				FXP_LOCK(sc);
 				CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, 0);
 				ifp->if_capenable &= ~IFCAP_POLLING;
 				FXP_UNLOCK(sc);
Index: dev/ixgb/if_ixgb.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ixgb/if_ixgb.c,v
retrieving revision 1.18
diff -p -U5 -r1.18 if_ixgb.c
--- dev/ixgb/if_ixgb.c	18 Dec 2005 18:24:26 -0000	1.18
+++ dev/ixgb/if_ixgb.c	7 Jan 2006 22:21:07 -0000
@@ -375,11 +375,11 @@ ixgb_detach(device_t dev)
 
 	INIT_DEBUGOUT("ixgb_detach: begin");
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 
 	IXGB_LOCK(adapter);
 	adapter->in_detach = 1;
 
@@ -570,19 +570,19 @@ ixgb_ioctl(struct ifnet * ifp, IOCTL_CMD
 		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFCAP (Set Capabilities)");
 		mask = ifr->ifr_reqcap ^ ifp->if_capenable;
 #ifdef DEVICE_POLLING
 		if (mask & IFCAP_POLLING) {
 			if (ifr->ifr_reqcap & IFCAP_POLLING) {
-				error = ether_poll_register(ixgb_poll, ifp);
+				error = device_poll_register(ixgb_poll, ifp, ifp->if_xname);
 				if (error)
 					return(error);
 				IXGB_LOCK(adapter);
 				ixgb_disable_intr(adapter);
 				ifp->if_capenable |= IFCAP_POLLING;
 				IXGB_UNLOCK(adapter);
 			} else {
-				error = ether_poll_deregister(ifp);
+				error = device_poll_deregister(ifp, ifp->if_xname);
 				/* Enable interrupt even in error case */
 				IXGB_LOCK(adapter);
 				ixgb_enable_intr(adapter);
 				ifp->if_capenable &= ~IFCAP_POLLING;
 				IXGB_UNLOCK(adapter);
@@ -772,12 +772,13 @@ ixgb_poll_locked(struct ifnet * ifp, enu
 	if (ifp->if_snd.ifq_head != NULL)
 		ixgb_start_locked(ifp);
 }
 
 static void
-ixgb_poll(struct ifnet * ifp, enum poll_cmd cmd, int count)
+ixgb_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct adapter *adapter = ifp->if_softc;
 
 	IXGB_LOCK(adapter);
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
 		ixgb_poll_locked(ifp, cmd, count);
Index: dev/nge/if_nge.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/nge/if_nge.c,v
retrieving revision 1.85
diff -p -U5 -r1.85 if_nge.c
--- dev/nge/if_nge.c	18 Dec 2005 18:24:26 -0000	1.85
+++ dev/nge/if_nge.c	7 Jan 2006 22:21:08 -0000
@@ -948,11 +948,11 @@ nge_detach(dev)
 	sc = device_get_softc(dev);
 	ifp = sc->nge_ifp;
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 	NGE_LOCK(sc);
 	nge_reset(sc);
 	nge_stop(sc);
 	NGE_UNLOCK(sc);
@@ -1355,12 +1355,13 @@ nge_tick(xsc)
 
 #ifdef DEVICE_POLLING
 static poll_handler_t nge_poll;
 
 static void
-nge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+nge_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct  nge_softc *sc = ifp->if_softc;
 
 	NGE_LOCK(sc);
 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
 		NGE_UNLOCK(sc);
@@ -2039,11 +2040,11 @@ nge_ioctl(ifp, command, data)
 		break;
 	case SIOCSIFCAP:
 #ifdef DEVICE_POLLING
 		if (ifr->ifr_reqcap & IFCAP_POLLING &&
 		    !(ifp->if_capenable & IFCAP_POLLING)) {
-			error = ether_poll_register(nge_poll, ifp);
+			error = device_poll_register(nge_poll, ifp, ifp->if_xname);
 			if (error)
 				return(error);
 			NGE_LOCK(sc);
 			/* Disable interrupts */
 			CSR_WRITE_4(sc, NGE_IER, 0);
@@ -2052,11 +2053,11 @@ nge_ioctl(ifp, command, data)
 			return (error);
 			
 		}
 		if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
 		    ifp->if_capenable & IFCAP_POLLING) {
-			error = ether_poll_deregister(ifp);
+			error = device_poll_deregister(ifp, ifp->if_xname);
 			/* Enable interrupts. */
 			NGE_LOCK(sc);
 			CSR_WRITE_4(sc, NGE_IER, 1);
 			ifp->if_capenable &= ~IFCAP_POLLING;
 			NGE_UNLOCK(sc);
Index: dev/re/if_re.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/re/if_re.c,v
retrieving revision 1.62
diff -p -U5 -r1.62 if_re.c
--- dev/re/if_re.c	18 Dec 2005 18:24:26 -0000	1.62
+++ dev/re/if_re.c	7 Jan 2006 22:21:17 -0000
@@ -218,11 +218,11 @@ static __inline void re_fixup_rx
 				(struct mbuf *);
 #endif
 static void re_rxeof		(struct rl_softc *);
 static void re_txeof		(struct rl_softc *);
 #ifdef DEVICE_POLLING
-static void re_poll		(struct ifnet *, enum poll_cmd, int);
+static void re_poll		(void *arg, enum poll_cmd, int);
 static void re_poll_locked	(struct ifnet *, enum poll_cmd, int);
 #endif
 static void re_intr		(void *);
 static void re_tick		(void *);
 static void re_start		(struct ifnet *);
@@ -1281,11 +1281,11 @@ re_detach(dev)
 	ifp = sc->rl_ifp;
 	KASSERT(mtx_initialized(&sc->rl_mtx), ("re mutex not initialized"));
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 
 	/* These should only be active if attach succeeded */
 	if (device_is_attached(dev)) {
 		RL_LOCK(sc);
@@ -1774,12 +1774,13 @@ re_tick(xsc)
 	callout_reset(&sc->rl_stat_callout, hz, re_tick, sc);
 }
 
 #ifdef DEVICE_POLLING
 static void
-re_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+re_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct rl_softc *sc = ifp->if_softc;
 
 	RL_LOCK(sc);
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
 		re_poll_locked(ifp, cmd, count);
@@ -2335,21 +2336,21 @@ re_ioctl(ifp, command, data)
 	    {
 		int mask = ifr->ifr_reqcap ^ ifp->if_capenable;
 #ifdef DEVICE_POLLING
 		if (mask & IFCAP_POLLING) {
 			if (ifr->ifr_reqcap & IFCAP_POLLING) {
-				error = ether_poll_register(re_poll, ifp);
+				error = device_poll_register(re_poll, ifp, ifp->if_xname);
 				if (error)
 					return(error);
 				RL_LOCK(sc);
 				/* Disable interrupts */
 				CSR_WRITE_2(sc, RL_IMR, 0x0000);
 				ifp->if_capenable |= IFCAP_POLLING;
 				RL_UNLOCK(sc);
 				
 			} else {
-				error = ether_poll_deregister(ifp);
+				error = device_poll_deregister(ifp, ifp->if_xname);
 				/* Enable interrupts. */
 				RL_LOCK(sc);
 				CSR_WRITE_2(sc, RL_IMR, RL_INTRS_CPLUS);
 				ifp->if_capenable &= ~IFCAP_POLLING;
 				RL_UNLOCK(sc);
Index: dev/vge/if_vge.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/vge/if_vge.c,v
retrieving revision 1.23
diff -p -U5 -r1.23 if_vge.c
--- dev/vge/if_vge.c	18 Dec 2005 18:24:27 -0000	1.23
+++ dev/vge/if_vge.c	7 Jan 2006 22:21:18 -0000
@@ -1107,11 +1107,11 @@ vge_detach(dev)
 	KASSERT(mtx_initialized(&sc->vge_mtx), ("vge mutex not initialized"));
 	ifp = sc->vge_ifp;
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 
 	/* These should only be active if attach succeeded */
 	if (device_is_attached(dev)) {
 		vge_stop(sc);
@@ -1620,12 +1620,13 @@ vge_tick(xsc)
 	return;
 }
 
 #ifdef DEVICE_POLLING
 static void
-vge_poll (struct ifnet *ifp, enum poll_cmd cmd, int count)
+vge_poll (void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct vge_softc *sc = ifp->if_softc;
 
 	VGE_LOCK(sc);
 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
 		goto done;
@@ -2259,21 +2260,21 @@ vge_ioctl(ifp, command, data)
 	    {
 		int mask = ifr->ifr_reqcap ^ ifp->if_capenable;
 #ifdef DEVICE_POLLING
 		if (mask & IFCAP_POLLING) {
 			if (ifr->ifr_reqcap & IFCAP_POLLING) {
-				error = ether_poll_register(vge_poll, ifp);
+				error = device_poll_register(vge_poll, ifp, ifp->if_xname);
 				if (error)
 					return(error);
 				VGE_LOCK(sc);
 					/* Disable interrupts */
 				CSR_WRITE_4(sc, VGE_IMR, 0);
 				CSR_WRITE_1(sc, VGE_CRC3, VGE_CR3_INT_GMSK);
 				ifp->if_capenable |= IFCAP_POLLING;
 				VGE_UNLOCK(sc);
 			} else {
-				error = ether_poll_deregister(ifp);
+				error = device_poll_deregister(ifp, ifp->if_xname);
 				/* Enable interrupts. */
 				VGE_LOCK(sc);
 				CSR_WRITE_4(sc, VGE_IMR, VGE_INTRS);
 				CSR_WRITE_4(sc, VGE_ISR, 0xFFFFFFFF);
 				CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK);
Index: kern/kern_poll.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_poll.c,v
retrieving revision 1.25
diff -p -U5 -r1.25 kern_poll.c
--- kern/kern_poll.c	5 Oct 2005 10:09:16 -0000	1.25
+++ kern/kern_poll.c	7 Jan 2006 22:21:19 -0000
@@ -35,10 +35,11 @@ __FBSDID("$FreeBSD: src/sys/kern/kern_po
 #include <sys/kernel.h>
 #include <sys/socket.h>			/* needed by net/if.h		*/
 #include <sys/sockio.h>
 #include <sys/sysctl.h>
 #include <sys/syslog.h>
+#include <sys/bus.h>
 
 #include <net/if.h>			/* for IFF_* flags		*/
 #include <net/netisr.h>			/* for NETISR_POLL		*/
 
 #include <sys/proc.h>
@@ -48,11 +49,11 @@ __FBSDID("$FreeBSD: src/sys/kern/kern_po
 static void netisr_poll(void);		/* the two netisr handlers      */
 static void netisr_pollmore(void);
 static int poll_switch(SYSCTL_HANDLER_ARGS);
 
 void hardclock_device_poll(void);	/* hook from hardclock		*/
-void ether_poll(int);			/* polling in idle loop		*/
+void device_poll(int);			/* polling in idle loop		*/
 
 static struct mtx	poll_mtx;
 
 /*
  * Polling support for [network] device drivers.
@@ -61,11 +62,12 @@ static struct mtx	poll_mtx;
  * polling code.
  *
  * If registration is successful, the driver must disable interrupts,
  * and further I/O is performed through the handler, which is invoked
  * (at least once per clock tick) with 3 arguments: the "arg" passed at
- * register time (a struct ifnet pointer), a command, and a "count" limit.
+ * register time (a softc, device, or ifnet pointer), a command, 
+ * and a "count" limit.
  *
  * The command can be one of the following:
  *  POLL_ONLY: quick move of "count" packets from input/output queues.
  *  POLL_AND_CHECK_STATUS: as above, plus check status registers or do
  *	other more expensive operations. This command is issued periodically
@@ -250,11 +252,11 @@ SYSCTL_UINT(_kern_polling, OID_AUTO, idl
 
 
 #define POLL_LIST_LEN  128
 struct pollrec {
 	poll_handler_t	*handler;
-	struct ifnet	*ifp;
+	void            *arg;
 };
 
 static struct pollrec pr[POLL_LIST_LEN];
 
 static void
@@ -320,25 +322,25 @@ hardclock_device_poll(void)
 	if (pending_polls++ > 0)
 		lost_polls++;
 }
 
 /*
- * ether_poll is called from the idle loop.
+ * device_poll is called from the idle loop.
  */
 void
-ether_poll(int count)
+device_poll(int count)
 {
 	int i;
 
 	NET_LOCK_GIANT();
 	mtx_lock(&poll_mtx);
 
 	if (count > poll_each_burst)
 		count = poll_each_burst;
 
 	for (i = 0 ; i < poll_handlers ; i++)
-		pr[i].handler(pr[i].ifp, POLL_ONLY, count);
+		pr[i].handler(pr[i].arg, POLL_ONLY, count);
 
 	mtx_unlock(&poll_mtx);
 	NET_UNLOCK_GIANT();
 }
 
@@ -433,30 +435,30 @@ netisr_poll(void)
 	cycles = (residual_burst < poll_each_burst) ?
 		residual_burst : poll_each_burst;
 	residual_burst -= cycles;
 
 	for (i = 0 ; i < poll_handlers ; i++)
-		pr[i].handler(pr[i].ifp, arg, cycles);
+		pr[i].handler(pr[i].arg, arg, cycles);
 
 	phase = 4;
 	mtx_unlock(&poll_mtx);
 }
 
 /*
  * Try to register routine for polling. Returns 0 if successful
  * (and polling should be enabled), error code otherwise.
  * A device is not supposed to register itself multiple times.
  *
- * This is called from within the *_ioctl() functions.
+ * This is called from within the interface *_ioctl() functions.
  */
 int
-ether_poll_register(poll_handler_t *h, struct ifnet *ifp)
+device_poll_register(poll_handler_t *h, void *arg, const char *devname)
 {
 	int i;
 
 	KASSERT(h != NULL, ("%s: handler is NULL", __func__));
-	KASSERT(ifp != NULL, ("%s: ifp is NULL", __func__));
+	KASSERT(arg != NULL, ("%s: arg is NULL", __func__));
 
 	NET_ASSERT_GIANT();
 
 	mtx_lock(&poll_mtx);
 	if (poll_handlers >= POLL_LIST_LEN) {
@@ -476,58 +478,73 @@ ether_poll_register(poll_handler_t *h, s
 		mtx_unlock(&poll_mtx);
 		return (ENOMEM); /* no polling for you */
 	}
 
 	for (i = 0 ; i < poll_handlers ; i++)
-		if (pr[i].ifp == ifp && pr[i].handler != NULL) {
+		if (pr[i].arg == arg && pr[i].handler != NULL) {
 			mtx_unlock(&poll_mtx);
-			log(LOG_DEBUG, "ether_poll_register: %s: handler"
-			    " already registered\n", ifp->if_xname);
+			log(LOG_DEBUG, "device_poll_register: %s: handler"
+			    " already registered\n", devname ? devname : "UNKNOWN");
 			return (EEXIST);
 		}
 
 	pr[poll_handlers].handler = h;
-	pr[poll_handlers].ifp = ifp;
+	pr[poll_handlers].arg = arg;
 	poll_handlers++;
 	mtx_unlock(&poll_mtx);
 	if (idlepoll_sleeping)
 		wakeup(&idlepoll_sleeping);
 	return (0);
 }
 
 /*
- * Remove interface from the polling list. Called from *_ioctl(), too.
+ * Remove device from the polling list. Called from *_ioctl(), too.
  */
 int
-ether_poll_deregister(struct ifnet *ifp)
+device_poll_deregister(void *arg, const char *devname)
 {
 	int i;
 
-	KASSERT(ifp != NULL, ("%s: ifp is NULL", __func__));
+	KASSERT(arg != NULL, ("%s: arg is NULL", __func__));
 
 	NET_ASSERT_GIANT();
 	mtx_lock(&poll_mtx);
 
 	for (i = 0 ; i < poll_handlers ; i++)
-		if (pr[i].ifp == ifp) /* found it */
+		if (pr[i].arg == arg) /* found it */
 			break;
 	if (i == poll_handlers) {
-		log(LOG_DEBUG, "ether_poll_deregister: %s: not found!\n",
-		    ifp->if_xname);
+		log(LOG_DEBUG, "device_poll_deregister: %s: not found!\n",
+		    devname ? devname : "UNKNOWN");
 		mtx_unlock(&poll_mtx);
 		return (ENOENT);
 	}
 	poll_handlers--;
 	if (i < poll_handlers) { /* Last entry replaces this one. */
 		pr[i].handler = pr[poll_handlers].handler;
-		pr[i].ifp = pr[poll_handlers].ifp;
+		pr[i].arg = pr[poll_handlers].arg;
 	}
 	mtx_unlock(&poll_mtx);
 	return (0);
 }
 
 /*
+ * Deprecated compatibility functions for external drivers.
+ */
+int
+ether_poll_register(void *h, struct ifnet *ifp)
+{
+        return device_poll_register((poll_handler_t*)h, ifp, ifp->if_xname);
+}
+
+int    
+ether_poll_deregister(struct ifnet *ifp)
+{
+        return device_poll_deregister(ifp, ifp->if_xname);
+}
+
+/*
  * Legacy interface for turning polling on all interfaces at one time.
  */
 static int
 poll_switch(SYSCTL_HANDLER_ARGS)
 {
@@ -565,11 +582,12 @@ poll_switch(SYSCTL_HANDLER_ARGS)
 		}
 	}
 	IFNET_RUNLOCK();
 	NET_UNLOCK_GIANT();
 
-	log(LOG_ERR, "kern.polling.enable is deprecated. Use ifconfig(8)");
+	log(LOG_ERR, "kern.polling.enable (which enables polling on all interfaces) "
+                        "is deprecated. Use ifconfig(8)");
 
 	return (0);
 }
 
 static void
@@ -587,11 +605,11 @@ poll_idle(void)
 	mtx_unlock_spin(&sched_lock);
 
 	for (;;) {
 		if (poll_in_idle_loop && poll_handlers > 0) {
 			idlepoll_sleeping = 0;
-			ether_poll(poll_each_burst);
+			device_poll(poll_each_burst);
 			mtx_lock_spin(&sched_lock);
 			mi_switch(SW_VOL, NULL);
 			mtx_unlock_spin(&sched_lock);
 		} else {
 			idlepoll_sleeping = 1;
Index: net/if_var.h
===================================================================
RCS file: /home/ncvs/src/sys/net/if_var.h,v
retrieving revision 1.105
diff -p -U5 -r1.105 if_var.h
--- net/if_var.h	11 Nov 2005 16:04:48 -0000	1.105
+++ net/if_var.h	7 Jan 2006 22:21:23 -0000
@@ -658,14 +658,12 @@ void	if_deregister_com_alloc(u_char type
 
 #define IF_LLADDR(ifp)							\
     LLADDR((struct sockaddr_dl *)((ifp)->if_addr->ifa_addr))
 
 #ifdef DEVICE_POLLING
-enum poll_cmd {	POLL_ONLY, POLL_AND_CHECK_STATUS };
-
-typedef	void poll_handler_t(struct ifnet *ifp, enum poll_cmd cmd, int count);
-int    ether_poll_register(poll_handler_t *h, struct ifnet *ifp);
+/* DEPRECATED: For compatibility only. Use device_poll_register/deregister */
+int    ether_poll_register(void*, struct ifnet *ifp);
 int    ether_poll_deregister(struct ifnet *ifp);
 #endif /* DEVICE_POLLING */
 
 #endif /* _KERNEL */
 
Index: pci/if_rl.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_rl.c,v
retrieving revision 1.162
diff -p -U5 -r1.162 if_rl.c
--- pci/if_rl.c	11 Nov 2005 16:04:58 -0000	1.162
+++ pci/if_rl.c	7 Jan 2006 22:21:34 -0000
@@ -197,11 +197,11 @@ static int rl_mii_readreg(struct rl_soft
 static int rl_mii_writereg(struct rl_softc *, struct rl_mii_frame *);
 static int rl_miibus_readreg(device_t, int, int);
 static void rl_miibus_statchg(device_t);
 static int rl_miibus_writereg(device_t, int, int, int);
 #ifdef DEVICE_POLLING
-static void rl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count);
+static void rl_poll(void *arg, enum poll_cmd cmd, int count);
 static void rl_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count);
 #endif
 static int rl_probe(device_t);
 static void rl_read_eeprom(struct rl_softc *, uint8_t *, int, int, int);
 static void rl_reset(struct rl_softc *);
@@ -1004,11 +1004,11 @@ rl_detach(device_t dev)
 
 	KASSERT(mtx_initialized(&sc->rl_mtx), ("rl mutex not initialized"));
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 	/* These should only be active if attach succeeded */
 	if (device_is_attached(dev)) {
 		RL_LOCK(sc);
 		rl_stop(sc);
@@ -1283,12 +1283,13 @@ rl_tick(void *xsc)
 	callout_reset(&sc->rl_stat_callout, hz, rl_tick, sc);
 }
 
 #ifdef DEVICE_POLLING
 static void
-rl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+rl_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct rl_softc *sc = ifp->if_softc;
 
 	RL_LOCK(sc);
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
 		rl_poll_locked(ifp, cmd, count);
@@ -1659,11 +1660,11 @@ rl_ioctl(struct ifnet *ifp, u_long comma
 		break;
 	case SIOCSIFCAP:
 #ifdef DEVICE_POLLING
 		if (ifr->ifr_reqcap & IFCAP_POLLING &&
 		    !(ifp->if_capenable & IFCAP_POLLING)) {
-			error = ether_poll_register(rl_poll, ifp);
+			error = device_poll_register(rl_poll, ifp, ifp->if_xname);
 			if (error)
 				return(error);
 			RL_LOCK(sc);
 			/* Disable interrupts */
 			CSR_WRITE_2(sc, RL_IMR, 0x0000);
@@ -1672,11 +1673,11 @@ rl_ioctl(struct ifnet *ifp, u_long comma
 			return (error);
 			
 		}
 		if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
 		    ifp->if_capenable & IFCAP_POLLING) {
-			error = ether_poll_deregister(ifp);
+			error = device_poll_deregister(ifp, ifp->if_xname);
 			/* Enable interrupts. */
 			RL_LOCK(sc);
 			CSR_WRITE_2(sc, RL_IMR, RL_INTRS);
 			ifp->if_capenable &= ~IFCAP_POLLING;
 			RL_UNLOCK(sc);
Index: pci/if_sf.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_sf.c,v
retrieving revision 1.92
diff -p -U5 -r1.92 if_sf.c
--- pci/if_sf.c	11 Nov 2005 16:04:58 -0000	1.92
+++ pci/if_sf.c	7 Jan 2006 22:21:35 -0000
@@ -167,11 +167,11 @@ static u_int8_t sf_read_eeprom(struct sf
 
 static int sf_miibus_readreg(device_t, int, int);
 static int sf_miibus_writereg(device_t, int, int, int);
 static void sf_miibus_statchg(device_t);
 #ifdef DEVICE_POLLING
-static void sf_poll(struct ifnet *ifp, enum poll_cmd cmd, int count);
+static void sf_poll(void *arg, enum poll_cmd cmd, int count);
 static void sf_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count);
 #endif
 
 static u_int32_t csr_read_4(struct sf_softc *, int);
 static void csr_write_4(struct sf_softc *, int, u_int32_t);
@@ -563,11 +563,11 @@ sf_ioctl(ifp, command, data)
 		break;
 	case SIOCSIFCAP:
 #ifdef DEVICE_POLLING
 		if (ifr->ifr_reqcap & IFCAP_POLLING &&
 		    !(ifp->if_capenable & IFCAP_POLLING)) {
-			error = ether_poll_register(sf_poll, ifp);
+			error = device_poll_register(sf_poll, ifp, ifp->if_xname);
 			if (error)
 				return(error);
 			SF_LOCK(sc);
 			/* Disable interrupts */
 			csr_write_4(sc, SF_IMR, 0x00000000);
@@ -576,11 +576,11 @@ sf_ioctl(ifp, command, data)
 			return (error);
 			
 		}
 		if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
 		    ifp->if_capenable & IFCAP_POLLING) {
-			error = ether_poll_deregister(ifp);
+			error = device_poll_deregister(ifp, ifp->if_xname);
 			/* Enable interrupts. */
 			SF_LOCK(sc);
 			csr_write_4(sc, SF_IMR, SF_INTRS);
 			ifp->if_capenable &= ~IFCAP_POLLING;
 			SF_UNLOCK(sc);
@@ -817,11 +817,11 @@ sf_detach(dev)
 	KASSERT(mtx_initialized(&sc->sf_mtx), ("sf mutex not initialized"));
 	ifp = sc->sf_ifp;
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 	
 	/* These should only be active if attach succeeded */
 	if (device_is_attached(dev)) {
 		SF_LOCK(sc);
@@ -1090,12 +1090,13 @@ sf_txthresh_adjust(sc)
 	}
 }
 
 #ifdef DEVICE_POLLING
 static void
-sf_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+sf_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct sf_softc *sc = ifp->if_softc;
 
 	SF_LOCK(sc);
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
 		sf_poll_locked(ifp, cmd, count);
Index: pci/if_sis.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_sis.c,v
retrieving revision 1.144
diff -p -U5 -r1.144 if_sis.c
--- pci/if_sis.c	11 Nov 2005 16:04:58 -0000	1.144
+++ pci/if_sis.c	7 Jan 2006 22:21:36 -0000
@@ -1260,11 +1260,11 @@ sis_detach(device_t dev)
 	KASSERT(mtx_initialized(&sc->sis_mtx), ("sis mutex not initialized"));
 	ifp = sc->sis_ifp;
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 
 	/* These should only be active if attach succeeded. */
 	if (device_is_attached(dev)) {
 		SIS_LOCK(sc);
@@ -1576,12 +1576,13 @@ sis_tick(void *xsc)
 
 #ifdef DEVICE_POLLING
 static poll_handler_t sis_poll;
 
 static void
-sis_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+sis_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct	sis_softc *sc = ifp->if_softc;
 
 	SIS_LOCK(sc);
 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
 		SIS_UNLOCK(sc);
@@ -2134,11 +2135,11 @@ sis_ioctl(struct ifnet *ifp, u_long comm
 	case SIOCSIFCAP:
 		/* ok, disable interrupts */
 #ifdef DEVICE_POLLING
 		if (ifr->ifr_reqcap & IFCAP_POLLING &&
 		    !(ifp->if_capenable & IFCAP_POLLING)) {
-			error = ether_poll_register(sis_poll, ifp);
+			error = device_poll_register(sis_poll, ifp, ifp->if_xname);
 			if (error)
 				return(error);
 			SIS_LOCK(sc);
 			/* Disable interrupts */
 			CSR_WRITE_4(sc, SIS_IER, 0);
@@ -2147,11 +2148,11 @@ sis_ioctl(struct ifnet *ifp, u_long comm
 			return (error);
 			
 		}
 		if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
 		    ifp->if_capenable & IFCAP_POLLING) {
-			error = ether_poll_deregister(ifp);
+			error = device_poll_deregister(ifp, ifp->if_xname);
 			/* Enable interrupts. */
 			SIS_LOCK(sc);
 			CSR_WRITE_4(sc, SIS_IER, 1);
 			ifp->if_capenable &= ~IFCAP_POLLING;
 			SIS_UNLOCK(sc);
Index: pci/if_ste.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_ste.c,v
retrieving revision 1.94
diff -p -U5 -r1.94 if_ste.c
--- pci/if_ste.c	11 Nov 2005 16:04:58 -0000	1.94
+++ pci/if_ste.c	7 Jan 2006 22:21:37 -0000
@@ -615,22 +615,11 @@ ste_setmulti(sc)
 
 	return;
 }
 
 #ifdef DEVICE_POLLING
-static poll_handler_t ste_poll, ste_poll_locked;
-
-static void
-ste_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
-{
-	struct ste_softc *sc = ifp->if_softc;
-
-	STE_LOCK(sc);
-	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
-		ste_poll_locked(ifp, cmd, count);
-	STE_UNLOCK(sc);
-}
+static poll_handler_t ste_poll;
 
 static void
 ste_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
 {
 	struct ste_softc *sc = ifp->if_softc;
@@ -665,10 +654,23 @@ ste_poll_locked(struct ifnet *ifp, enum 
 			ste_reset(sc);
 			ste_init_locked(sc);
 		}
 	}
 }
+
+static void
+ste_poll(void *arg, enum poll_cmd cmd, int count)
+{
+	struct ifnet *ifp = arg;
+	struct ste_softc *sc = ifp->if_softc;
+
+	STE_LOCK(sc);
+	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+		ste_poll_locked(ifp, cmd, count);
+	STE_UNLOCK(sc);
+}
+
 #endif /* DEVICE_POLLING */
 
 static void
 ste_intr(xsc)
 	void			*xsc;
@@ -1145,11 +1147,11 @@ ste_detach(dev)
 	KASSERT(mtx_initialized(&sc->ste_mtx), ("ste mutex not initialized"));
 	ifp = sc->ste_ifp;
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 
 	/* These should only be active if attach succeeded */
 	if (device_is_attached(dev)) {
 		STE_LOCK(sc);
@@ -1533,11 +1535,11 @@ ste_ioctl(ifp, command, data)
 		break;
 	case SIOCSIFCAP:
 #ifdef DEVICE_POLLING
 		if (ifr->ifr_reqcap & IFCAP_POLLING &&
 		    !(ifp->if_capenable & IFCAP_POLLING)) {
-			error = ether_poll_register(ste_poll, ifp);
+			error = device_poll_register(ste_poll, ifp, ifp->if_xname);
 			if (error)
 				return(error);
 			STE_LOCK(sc);
 			/* Disable interrupts */
 			CSR_WRITE_2(sc, STE_IMR, 0);
@@ -1546,11 +1548,11 @@ ste_ioctl(ifp, command, data)
 			return (error);
 			
 		}
 		if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
 		    ifp->if_capenable & IFCAP_POLLING) {
-			error = ether_poll_deregister(ifp);
+			error = device_poll_deregister(ifp, ifp->if_xname);
 			/* Enable interrupts. */
 			STE_LOCK(sc);
 			CSR_WRITE_2(sc, STE_IMR, STE_INTRS);
 			ifp->if_capenable &= ~IFCAP_POLLING;
 			STE_UNLOCK(sc);
Index: pci/if_vr.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_vr.c,v
retrieving revision 1.114
diff -p -U5 -r1.114 if_vr.c
--- pci/if_vr.c	11 Nov 2005 16:04:58 -0000	1.114
+++ pci/if_vr.c	7 Jan 2006 22:21:38 -0000
@@ -794,11 +794,11 @@ vr_detach(device_t dev)
 
 	KASSERT(mtx_initialized(&sc->vr_mtx), ("vr mutex not initialized"));
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 
 	/* These should only be active if attach succeeded */
 	if (device_is_attached(dev)) {
 		VR_LOCK(sc);
@@ -1140,22 +1140,10 @@ vr_tick(void *xsc)
 	callout_reset(&sc->vr_stat_callout, hz, vr_tick, sc);
 }
 
 #ifdef DEVICE_POLLING
 static poll_handler_t vr_poll;
-static poll_handler_t vr_poll_locked;
-
-static void
-vr_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
-{
-	struct vr_softc *sc = ifp->if_softc;
-
-	VR_LOCK(sc);
-	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
-		vr_poll_locked(ifp, cmd, count);
-	VR_UNLOCK(sc);
-}
 
 static void
 vr_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
 {
 	struct vr_softc *sc = ifp->if_softc;
@@ -1213,10 +1201,23 @@ vr_poll_locked(struct ifnet *ifp, enum p
 				VR_SETBIT16(sc, VR_COMMAND, VR_CMD_TX_GO);
 			}
 		}
 	}
 }
+
+static void
+vr_poll(void *arg, enum poll_cmd cmd, int count)
+{
+	struct ifnet *ifp = arg;
+	struct vr_softc *sc = ifp->if_softc;
+
+	VR_LOCK(sc);
+	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+		vr_poll_locked(ifp, cmd, count);
+	VR_UNLOCK(sc);
+}
+
 #endif /* DEVICE_POLLING */
 
 static void
 vr_intr(void *arg)
 {
@@ -1595,11 +1596,11 @@ vr_ioctl(struct ifnet *ifp, u_long comma
 		break;
 	case SIOCSIFCAP:
 #ifdef DEVICE_POLLING
 		if (ifr->ifr_reqcap & IFCAP_POLLING &&
 		    !(ifp->if_capenable & IFCAP_POLLING)) {
-			error = ether_poll_register(vr_poll, ifp);
+			error = device_poll_register(vr_poll, ifp, ifp->if_xname);
 			if (error)
 				return(error);
 			VR_LOCK(sc);
 			/* Disable interrupts */
 			CSR_WRITE_2(sc, VR_IMR, 0x0000);
@@ -1608,11 +1609,11 @@ vr_ioctl(struct ifnet *ifp, u_long comma
 			return (error);
 			
 		}
 		if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
 		    ifp->if_capenable & IFCAP_POLLING) {
-			error = ether_poll_deregister(ifp);
+			error = device_poll_deregister(ifp, ifp->if_xname);
 			/* Enable interrupts. */
 			VR_LOCK(sc);
 			CSR_WRITE_2(sc, VR_IMR, VR_INTRS);
 			ifp->if_capenable &= ~IFCAP_POLLING;
 			VR_UNLOCK(sc);
Index: pci/if_xl.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_xl.c,v
retrieving revision 1.201
diff -p -U5 -r1.201 if_xl.c
--- pci/if_xl.c	11 Nov 2005 16:04:58 -0000	1.201
+++ pci/if_xl.c	7 Jan 2006 22:21:39 -0000
@@ -249,11 +249,11 @@ static void xl_watchdog(struct ifnet *);
 static void xl_shutdown(device_t);
 static int xl_suspend(device_t);
 static int xl_resume(device_t);
 
 #ifdef DEVICE_POLLING
-static void xl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count);
+static void xl_poll(void *arg, enum poll_cmd cmd, int count);
 static void xl_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count);
 #endif
 
 static int xl_ifmedia_upd(struct ifnet *);
 static void xl_ifmedia_sts(struct ifnet *, struct ifmediareq *);
@@ -1694,11 +1694,11 @@ xl_detach(device_t dev)
 
 	KASSERT(mtx_initialized(&sc->xl_mtx), ("xl mutex not initialized"));
 
 #ifdef DEVICE_POLLING
 	if (ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(ifp);
+		device_poll_deregister(ifp, ifp->if_xname);
 #endif
 
 	if (sc->xl_flags & XL_FLAG_USE_MMIO) {
 		rid = XL_PCI_LOMEM;
 		res = SYS_RES_MEMORY;
@@ -2341,12 +2341,13 @@ xl_intr(void *arg)
 	XL_UNLOCK(sc);
 }
 
 #ifdef DEVICE_POLLING
 static void
-xl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+xl_poll(void *arg, enum poll_cmd cmd, int count)
 {
+	struct ifnet *ifp = arg;
 	struct xl_softc *sc = ifp->if_softc;
 
 	XL_LOCK(sc);
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
 		xl_poll_locked(ifp, cmd, count);
@@ -3188,11 +3189,11 @@ xl_ioctl(struct ifnet *ifp, u_long comma
 		break;
 	case SIOCSIFCAP:
 #ifdef DEVICE_POLLING
 		if (ifr->ifr_reqcap & IFCAP_POLLING &&
 		    !(ifp->if_capenable & IFCAP_POLLING)) {
-			error = ether_poll_register(xl_poll, ifp);
+			error = device_poll_register(xl_poll, ifp, ifp->if_xname);
 			if (error)
 				return(error);
 			XL_LOCK(sc);
 			/* Disable interrupts */
 			CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ENB|0);
@@ -3201,11 +3202,11 @@ xl_ioctl(struct ifnet *ifp, u_long comma
 			return (error);
 			
 		}
 		if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
 		    ifp->if_capenable & IFCAP_POLLING) {
-			error = ether_poll_deregister(ifp);
+			error = device_poll_deregister(ifp, ifp->if_xname);
 			/* Enable interrupts. */
 			XL_LOCK(sc);
 			CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ACK|0xFF);
 			CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ENB|XL_INTRS);
 			if (sc->xl_flags & XL_FLAG_FUNCREG)
Index: sys/bus.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/bus.h,v
retrieving revision 1.73
diff -p -U5 -r1.73 bus.h
--- sys/bus.h	24 Sep 2005 20:11:06 -0000	1.73
+++ sys/bus.h	7 Jan 2006 22:21:40 -0000
@@ -459,10 +459,20 @@ void	bus_data_generation_update(void);
 /**
  * Shorthand for constructing method tables.
  */
 #define	DEVMETHOD	KOBJMETHOD
 
+/* Device polling functionality */
+#ifdef DEVICE_POLLING
+
+enum poll_cmd {	POLL_ONLY, POLL_AND_CHECK_STATUS };
+typedef	void poll_handler_t(void *arg, enum poll_cmd cmd, int count);
+int    device_poll_register(poll_handler_t *h, void *arg, const char *devname);
+int    device_poll_deregister(void *arg, const char *devname);
+
+#endif /* DEVICE_POLLING */
+
 /*
  * Some common device interfaces.
  */
 #include "device_if.h"
 #include "bus_if.h"

--------------060508080200040308080909--




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060107231659.DD05BDCA9A5>