int uscannerkqfilter(dev_t dev, struct knote *kn) { struct uscanner_softc *sc; struct klist *klist; sc = device_lookup_private(&uscanner_cd, USCANNERUNIT(dev)); if (sc->sc_dying) return (ENXIO); switch (kn->kn_filter) { case EVFILT_READ: case EVFILT_WRITE: /* * We have no easy way of determining if a read will * yield any data or a write will happen. * Pretend they will. */ klist = &sc->sc_selq.sel_klist; kn->kn_fop = &uscanner_seltrue_filtops; break; default: return (EINVAL); } kn->kn_hook = sc; SLIST_INSERT_HEAD(klist, kn, kn_selnext); return (0); }
int uscannerclose(dev_t dev, int flag, int mode, usb_proc_ptr p) { struct uscanner_softc *sc; USB_GET_SC(uscanner, USCANNERUNIT(dev), sc); DPRINTFN(5, ("uscannerclose: flag=%d, mode=%d, unit=%d\n", flag, mode, USCANNERUNIT(dev))); #ifdef DIAGNOSTIC if (!(sc->sc_state & USCANNER_OPEN)) { printf("uscannerclose: not open\n"); return (EINVAL); } #endif uscanner_do_close(sc); return (0); }
int uscannerclose(dev_t dev, int flag, int mode, struct lwp *l) { struct uscanner_softc *sc; sc = device_lookup_private(&uscanner_cd, USCANNERUNIT(dev)); DPRINTFN(5, ("uscannerclose: flag=%d, mode=%d, unit=%"PRId32"\n", flag, mode, USCANNERUNIT(dev))); #ifdef DIAGNOSTIC if (!(sc->sc_state & USCANNER_OPEN)) { printf("uscannerclose: not open\n"); return (EINVAL); } #endif uscanner_do_close(sc); return (0); }
int uscannerwrite(dev_t dev, struct uio *uio, int flag) { struct uscanner_softc *sc; int error; sc = device_lookup_private(&uscanner_cd, USCANNERUNIT(dev)); sc->sc_refcnt++; error = uscanner_do_write(sc, uio, flag); if (--sc->sc_refcnt < 0) usb_detach_wakeupold(sc->sc_dev); return (error); }
int uscannerwrite(dev_t dev, struct uio *uio, int flag) { struct uscanner_softc *sc; int error; USB_GET_SC(uscanner, USCANNERUNIT(dev), sc); sc->sc_refcnt++; error = uscanner_do_write(sc, uio, flag); if (--sc->sc_refcnt < 0) usb_detach_wakeup(USBDEV(sc->sc_dev)); return (error); }
int uscannerpoll(dev_t dev, int events, struct lwp *l) { struct uscanner_softc *sc; int revents = 0; sc = device_lookup_private(&uscanner_cd, USCANNERUNIT(dev)); if (sc->sc_dying) return (POLLHUP); /* * We have no easy way of determining if a read will * yield any data or a write will happen. * Pretend they will. */ revents |= events & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM); return (revents); }
int uscannerpoll(dev_t dev, int events, usb_proc_ptr p) { struct uscanner_softc *sc; int revents = 0; USB_GET_SC(uscanner, USCANNERUNIT(dev), sc); if (sc->sc_dying) return (EIO); /* * We have no easy way of determining if a read will * yield any data or a write will happen. * Pretend they will. */ revents |= events & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM); return (revents); }
int uscanneropen(dev_t dev, int flag, int mode, struct lwp *l) { struct uscanner_softc *sc; int unit = USCANNERUNIT(dev); usbd_status err; sc = device_lookup_private(&uscanner_cd, unit); if (sc == NULL) return ENXIO; DPRINTFN(5, ("uscanneropen: flag=%d, mode=%d, unit=%d\n", flag, mode, unit)); if (sc->sc_dying) return (ENXIO); if (sc->sc_state & USCANNER_OPEN) return (EBUSY); sc->sc_state |= USCANNER_OPEN; sc->sc_bulkin_buffer = malloc(USCANNER_BUFFERSIZE, M_USBDEV, M_WAITOK); sc->sc_bulkout_buffer = malloc(USCANNER_BUFFERSIZE, M_USBDEV, M_WAITOK); /* No need to check buffers for NULL since we have WAITOK */ sc->sc_bulkin_bufferlen = USCANNER_BUFFERSIZE; sc->sc_bulkout_bufferlen = USCANNER_BUFFERSIZE; /* We have decided on which endpoints to use, now open the pipes */ if (sc->sc_bulkin_pipe == NULL) { err = usbd_open_pipe(sc->sc_iface, sc->sc_bulkin, USBD_EXCLUSIVE_USE, &sc->sc_bulkin_pipe); if (err) { printf("%s: cannot open bulk-in pipe (addr %d)\n", device_xname(sc->sc_dev), sc->sc_bulkin); uscanner_do_close(sc); return (EIO); } } if (sc->sc_bulkout_pipe == NULL) { err = usbd_open_pipe(sc->sc_iface, sc->sc_bulkout, USBD_EXCLUSIVE_USE, &sc->sc_bulkout_pipe); if (err) { printf("%s: cannot open bulk-out pipe (addr %d)\n", device_xname(sc->sc_dev), sc->sc_bulkout); uscanner_do_close(sc); return (EIO); } } sc->sc_bulkin_xfer = usbd_alloc_xfer(sc->sc_udev); if (sc->sc_bulkin_xfer == NULL) { uscanner_do_close(sc); return (ENOMEM); } sc->sc_bulkout_xfer = usbd_alloc_xfer(sc->sc_udev); if (sc->sc_bulkout_xfer == NULL) { uscanner_do_close(sc); return (ENOMEM); } return (0); /* success */ }