diff options
author | 2003-06-27 16:57:14 +0000 | |
---|---|---|
committer | 2003-06-27 16:57:14 +0000 | |
commit | b6e65ec1433db2b0c4ff8b8ab6b603296818ea96 (patch) | |
tree | 3231b7ead41995af536cd5352f806a5936d4b11c /sys/dev/usb/usb.c | |
parent | filter event that simulates seltrue(). From NetBSD (diff) | |
download | wireguard-openbsd-b6e65ec1433db2b0c4ff8b8ab6b603296818ea96.tar.xz wireguard-openbsd-b6e65ec1433db2b0c4ff8b8ab6b603296818ea96.zip |
kqueue support for various usb devices including: usb, uhid, ugen,
and uscanner
From NetBSD
Diffstat (limited to 'sys/dev/usb/usb.c')
-rw-r--r-- | sys/dev/usb/usb.c | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/sys/dev/usb/usb.c b/sys/dev/usb/usb.c index 2d703ec4e33..1d6d14fa377 100644 --- a/sys/dev/usb/usb.c +++ b/sys/dev/usb/usb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: usb.c,v 1.23 2002/07/25 02:18:11 nate Exp $ */ +/* $OpenBSD: usb.c,v 1.24 2003/06/27 16:57:14 nate Exp $ */ /* $NetBSD: usb.c,v 1.53 2001/01/23 17:04:30 augustss Exp $ */ /* $FreeBSD: src/sys/dev/usb/usb.c,v 1.20 1999/11/17 22:33:46 n_hibma Exp $ */ @@ -515,6 +515,61 @@ usbpoll(dev_t dev, int events, struct proc *p) } } +Static void filt_usbrdetach(struct knote *); +Static int filt_usbread(struct knote *, long); +int usbkqfilter(dev_t, struct knote *); + +Static void +filt_usbrdetach(struct knote *kn) +{ + int s; + + s = splusb(); + SLIST_REMOVE(&usb_selevent.sel_klist, kn, knote, kn_selnext); + splx(s); +} + +Static int +filt_usbread(struct knote *kn, long hint) +{ + + if (usb_nevents == 0) + return (0); + + kn->kn_data = sizeof(struct usb_event); + return (1); +} + +Static struct filterops usbread_filtops = + { 1, NULL, filt_usbrdetach, filt_usbread }; + +int +usbkqfilter(dev_t dev, struct knote *kn) +{ + struct klist *klist; + int s; + + switch (kn->kn_filter) { + case EVFILT_READ: + if (minor(dev) != USB_DEV_MINOR) + return (1); + klist = &usb_selevent.sel_klist; + kn->kn_fop = &usbread_filtops; + break; + + default: + return (1); + } + + kn->kn_hook = NULL; + + s = splusb(); + SLIST_INSERT_HEAD(klist, kn, kn_selnext); + splx(s); + + return (0); +} + /* Explore device tree from the root. */ Static void usb_discover(void *v) |