Date: Sat, 7 Jan 2006 06:30:09 GMT From: Nate Nielsen <nielsen@memberwebs.com> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/91414: Polling for devices other than NICs Message-ID: <200601070630.k076U9lE060347@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/91414; it has been noted by GNATS. From: Nate Nielsen <nielsen@memberwebs.com> To: bug-followup@freebsd.org Cc: Subject: Re: kern/91414: Polling for devices other than NICs Date: Sat, 7 Jan 2006 06:40:28 +0000 (GMT) This is a multi-part message in MIME format. --------------020200010600050800010009 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Whoops. This was stuck in my outbox. --------------020200010600050800010009 Content-Type: text/x-patch; name="device-polling.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="device-polling.patch" ? device-polling.patch Index: dev/em/if_em.c =================================================================== RCS file: /home/ncvs/src/sys/dev/em/if_em.c,v retrieving revision 1.65.2.5.2.1 diff -p -U5 -r1.65.2.5.2.1 if_em.c --- dev/em/if_em.c 22 Oct 2005 22:07:20 -0000 1.65.2.5.2.1 +++ dev/em/if_em.c 6 Jan 2006 01:37:28 -0000 @@ -716,19 +716,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); @@ -946,12 +946,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.37.2.2 diff -p -U5 -r1.37.2.2 if_fwe.c --- dev/firewire/if_fwe.c 7 Oct 2005 14:00:03 -0000 1.37.2.2 +++ dev/firewire/if_fwe.c 6 Jan 2006 01:37:28 -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,22 +463,22 @@ 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, 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/firewire/if_fwip.c =================================================================== RCS file: /home/ncvs/src/sys/dev/firewire/if_fwip.c,v retrieving revision 1.7.2.3 diff -p -U5 -r1.7.2.3 if_fwip.c --- dev/firewire/if_fwip.c 7 Oct 2005 14:00:03 -0000 1.7.2.3 +++ dev/firewire/if_fwip.c 6 Jan 2006 01:37:28 -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.240.2.5 diff -p -U5 -r1.240.2.5 if_fxp.c --- dev/fxp/if_fxp.c 7 Oct 2005 14:00:03 -0000 1.240.2.5 +++ dev/fxp/if_fxp.c 6 Jan 2006 01:37:29 -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> @@ -896,11 +897,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 */ /* @@ -1450,12 +1451,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)) { @@ -2415,20 +2417,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.10.2.4 diff -p -U5 -r1.10.2.4 if_ixgb.c --- dev/ixgb/if_ixgb.c 7 Oct 2005 14:00:04 -0000 1.10.2.4 +++ dev/ixgb/if_ixgb.c 6 Jan 2006 01:37:29 -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; @@ -569,19 +569,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); @@ -771,12 +771,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.75.2.3 diff -p -U5 -r1.75.2.3 if_nge.c --- dev/nge/if_nge.c 7 Oct 2005 14:00:04 -0000 1.75.2.3 +++ dev/nge/if_nge.c 6 Jan 2006 01:37:29 -0000 @@ -959,11 +959,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); @@ -1374,12 +1374,13 @@ nge_tick_locked(sc) #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); @@ -2041,11 +2042,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); @@ -2054,11 +2055,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.46.2.7 diff -p -U5 -r1.46.2.7 if_re.c --- dev/re/if_re.c 8 Oct 2005 07:35:10 -0000 1.46.2.7 +++ dev/re/if_re.c 6 Jan 2006 01:37:30 -0000 @@ -216,11 +216,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 *); @@ -1268,11 +1268,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); #if 0 @@ -1757,12 +1757,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); @@ -2316,21 +2317,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.14.2.4 diff -p -U5 -r1.14.2.4 if_vge.c --- dev/vge/if_vge.c 9 Oct 2005 04:15:12 -0000 1.14.2.4 +++ dev/vge/if_vge.c 6 Jan 2006 01:37:30 -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); @@ -1617,12 +1617,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; @@ -2256,21 +2257,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.19.2.2 diff -p -U5 -r1.19.2.2 kern_poll.c --- kern/kern_poll.c 7 Oct 2005 14:00:05 -0000 1.19.2.2 +++ kern/kern_poll.c 6 Jan 2006 01:37:30 -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.98.2.5 diff -p -U5 -r1.98.2.5 if_var.h --- net/if_var.h 7 Oct 2005 14:00:05 -0000 1.98.2.5 +++ net/if_var.h 6 Jan 2006 01:37:34 -0000 @@ -658,14 +658,12 @@ void if_deregister_com_alloc(u_char type #define IF_LLADDR(ifp) \ LLADDR((struct sockaddr_dl *) ifaddr_byindex((ifp)->if_index)->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_dc.c =================================================================== RCS file: /home/ncvs/src/sys/pci/Attic/if_dc.c,v retrieving revision 1.160.2.6 diff -p -U5 -r1.160.2.6 if_dc.c --- pci/if_dc.c 9 Oct 2005 04:11:19 -0000 1.160.2.6 +++ pci/if_dc.c 6 Jan 2006 01:37:34 -0000 @@ -2340,11 +2340,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); @@ -3038,12 +3038,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)) { @@ -3683,11 +3684,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); @@ -3696,11 +3697,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: pci/if_rl.c =================================================================== RCS file: /home/ncvs/src/sys/pci/if_rl.c,v retrieving revision 1.152.2.4 diff -p -U5 -r1.152.2.4 if_rl.c --- pci/if_rl.c 7 Oct 2005 14:00:06 -0000 1.152.2.4 +++ pci/if_rl.c 6 Jan 2006 01:37: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 *); @@ -1003,11 +1003,11 @@ rl_detach(device_t dev) ifp = sc->rl_ifp; 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); @@ -1281,12 +1281,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); @@ -1657,11 +1658,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); @@ -1670,11 +1671,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.82.2.5 diff -p -U5 -r1.82.2.5 if_sf.c --- pci/if_sf.c 9 Oct 2005 04:11:19 -0000 1.82.2.5 +++ pci/if_sf.c 6 Jan 2006 01:37:34 -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); @@ -1089,12 +1089,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.132.2.6 diff -p -U5 -r1.132.2.6 if_sis.c --- pci/if_sis.c 9 Oct 2005 04:11:19 -0000 1.132.2.6 +++ pci/if_sis.c 6 Jan 2006 01:37:34 -0000 @@ -1262,11 +1262,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); @@ -1580,12 +1580,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); @@ -2138,11 +2139,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); @@ -2151,11 +2152,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.84.2.6 diff -p -U5 -r1.84.2.6 if_ste.c --- pci/if_ste.c 9 Oct 2005 04:11:19 -0000 1.84.2.6 +++ pci/if_ste.c 6 Jan 2006 01:37:34 -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); @@ -1532,11 +1534,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); @@ -1545,11 +1547,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.104.2.4 diff -p -U5 -r1.104.2.4 if_vr.c --- pci/if_vr.c 9 Oct 2005 04:11:20 -0000 1.104.2.4 +++ pci/if_vr.c 6 Jan 2006 01:37:34 -0000 @@ -798,11 +798,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 VR_LOCK(sc); sc->suspended = 1; @@ -1150,22 +1150,10 @@ vr_tick(void *xsc) VR_UNLOCK(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; @@ -1224,10 +1212,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) { @@ -1607,11 +1608,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); @@ -1620,11 +1621,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.190.2.6 diff -p -U5 -r1.190.2.6 if_xl.c --- pci/if_xl.c 9 Oct 2005 04:11:20 -0000 1.190.2.6 +++ pci/if_xl.c 6 Jan 2006 01:37:34 -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 *); @@ -1689,11 +1689,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; @@ -2335,12 +2335,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); @@ -3182,11 +3183,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); @@ -3195,11 +3196,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.70 diff -p -U5 -r1.70 bus.h --- sys/bus.h 12 Apr 2005 15:20:36 -0000 1.70 +++ sys/bus.h 6 Jan 2006 01:37:34 -0000 @@ -453,10 +453,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" --------------020200010600050800010009--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200601070630.k076U9lE060347>