summaryrefslogtreecommitdiffstats
path: root/sys/dev/nge
diff options
context:
space:
mode:
authorru <ru@FreeBSD.org>2004-04-11 19:25:56 +0000
committerru <ru@FreeBSD.org>2004-04-11 19:25:56 +0000
commit3f9b8e99a0f8988f51e816f2970682f0854def1d (patch)
tree7650ad319be8082488f6a002694677d78ac1a5af /sys/dev/nge
parent7764e9e2f9a011c4950a736ef60ee0315def73e2 (diff)
downloadFreeBSD-src-3f9b8e99a0f8988f51e816f2970682f0854def1d.zip
FreeBSD-src-3f9b8e99a0f8988f51e816f2970682f0854def1d.tar.gz
Implemented per-interface polling(4) control.
Diffstat (limited to 'sys/dev/nge')
-rw-r--r--sys/dev/nge/if_nge.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/sys/dev/nge/if_nge.c b/sys/dev/nge/if_nge.c
index b281e87..01511ce 100644
--- a/sys/dev/nge/if_nge.c
+++ b/sys/dev/nge/if_nge.c
@@ -948,6 +948,9 @@ nge_attach(dev)
ifp->if_snd.ifq_maxlen = NGE_TX_LIST_CNT - 1;
ifp->if_hwassist = NGE_CSUM_FEATURES;
ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_VLAN_HWTAGGING;
+#ifdef DEVICE_POLLING
+ ifp->if_capabilities |= IFCAP_POLLING;
+#endif
ifp->if_capenable = ifp->if_capabilities;
/*
@@ -1523,6 +1526,10 @@ nge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
{
struct nge_softc *sc = ifp->if_softc;
+ if (!(ifp->if_capenable & IFCAP_POLLING)) {
+ ether_poll_deregister(ifp);
+ cmd = POLL_DEREGISTER;
+ }
if (cmd == POLL_DEREGISTER) { /* final call, enable interrupts */
CSR_WRITE_4(sc, NGE_IER, 1);
return;
@@ -1575,7 +1582,8 @@ nge_intr(arg)
#ifdef DEVICE_POLLING
if (ifp->if_flags & IFF_POLLING)
return;
- if (ether_poll_register(nge_poll, ifp)) { /* ok, disable interrupts */
+ if ((ifp->if_capenable & IFCAP_POLLING) &&
+ ether_poll_register(nge_poll, ifp)) { /* ok, disable interrupts */
CSR_WRITE_4(sc, NGE_IER, 0);
nge_poll(ifp, 0, 1);
return;
@@ -2156,6 +2164,9 @@ nge_ioctl(ifp, command, data)
command);
}
break;
+ case SIOCSIFCAP:
+ ifp->if_capenable = ifr->ifr_reqcap;
+ break;
default:
error = ether_ioctl(ifp, command, data);
break;
OpenPOWER on IntegriCloud