summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/usb.c
diff options
context:
space:
mode:
authornate <nate@openbsd.org>2003-06-27 16:57:14 +0000
committernate <nate@openbsd.org>2003-06-27 16:57:14 +0000
commitb6e65ec1433db2b0c4ff8b8ab6b603296818ea96 (patch)
tree3231b7ead41995af536cd5352f806a5936d4b11c /sys/dev/usb/usb.c
parentfilter event that simulates seltrue(). From NetBSD (diff)
downloadwireguard-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.c57
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)