Index: sys/dev/usb/ugen.c =================================================================== RCS file: /cvsroot/src/sys/dev/usb/ugen.c,v retrieving revision 1.134 diff -p -u -r1.134 ugen.c --- sys/dev/usb/ugen.c 7 Jul 2016 06:55:42 -0000 1.134 +++ sys/dev/usb/ugen.c 26 Aug 2017 22:55:31 -0000 @@ -366,15 +366,12 @@ ugenopen(dev_t dev, int flag, int mode, int i, j; sc = device_lookup_private(&ugen_cd, unit); - if (sc == NULL) + if (sc == NULL || sc->sc_dying) return ENXIO; DPRINTFN(5, ("ugenopen: flag=%d, mode=%d, unit=%d endpt=%d\n", flag, mode, unit, endpt)); - if (sc == NULL || sc->sc_dying) - return ENXIO; - /* The control endpoint allows multiple opens. */ if (endpt == USB_CONTROL_ENDPOINT) { sc->sc_is_open[USB_CONTROL_ENDPOINT] = 1; @@ -513,7 +510,7 @@ ugenclose(dev_t dev, int flag, int mode, int i; sc = device_lookup_private(& ugen_cd, UGENUNIT(dev)); - if (sc == NULL) + if (sc == NULL || sc->sc_dying) return ENXIO; DPRINTFN(5, ("ugenclose: flag=%d, mode=%d, unit=%d, endpt=%d\n", @@ -589,9 +586,6 @@ ugen_do_read(struct ugen_softc *sc, int DPRINTFN(5, ("%s: ugenread: %d\n", device_xname(sc->sc_dev), endpt)); - if (sc->sc_dying) - return EIO; - if (endpt == USB_CONTROL_ENDPOINT) return ENODEV; @@ -801,7 +795,7 @@ ugenread(dev_t dev, struct uio *uio, int int error; sc = device_lookup_private(& ugen_cd, UGENUNIT(dev)); - if (sc == NULL) + if (sc == NULL || sc->sc_dying) return ENXIO; mutex_enter(&sc->sc_lock); @@ -832,9 +826,6 @@ ugen_do_write(struct ugen_softc *sc, int DPRINTFN(5, ("%s: ugenwrite: %d\n", device_xname(sc->sc_dev), endpt)); - if (sc->sc_dying) - return EIO; - if (endpt == USB_CONTROL_ENDPOINT) return ENODEV; @@ -995,7 +986,7 @@ ugenwrite(dev_t dev, struct uio *uio, in int error; sc = device_lookup_private(& ugen_cd, UGENUNIT(dev)); - if (sc == NULL) + if (sc == NULL || sc->sc_dying) return ENXIO; mutex_enter(&sc->sc_lock); @@ -1830,7 +1821,7 @@ ugenioctl(dev_t dev, u_long cmd, void *a int error; sc = device_lookup_private(& ugen_cd, UGENUNIT(dev)); - if (sc == NULL) + if (sc == NULL || sc->sc_dying) return ENXIO; sc->sc_refcnt++; @@ -1954,6 +1945,10 @@ static int filt_ugenread_intr(struct knote *kn, long hint) { struct ugen_endpoint *sce = kn->kn_hook; + struct ugen_softc *sc = sce->sc; + + if (sc->sc_dying) + return 0; kn->kn_data = sce->q.c_cc; return kn->kn_data > 0; @@ -1963,6 +1958,10 @@ static int filt_ugenread_isoc(struct knote *kn, long hint) { struct ugen_endpoint *sce = kn->kn_hook; + struct ugen_softc *sc = sce->sc; + + if (sc->sc_dying) + return 0; if (sce->cur == sce->fill) return 0; @@ -1980,6 +1979,10 @@ static int filt_ugenread_bulk(struct knote *kn, long hint) { struct ugen_endpoint *sce = kn->kn_hook; + struct ugen_softc *sc = sce->sc; + + if (sc->sc_dying) + return 0; if (!(sce->state & UGEN_BULK_RA)) /* @@ -2001,6 +2004,10 @@ static int filt_ugenwrite_bulk(struct knote *kn, long hint) { struct ugen_endpoint *sce = kn->kn_hook; + struct ugen_softc *sc = sce->sc; + + if (sc->sc_dying) + return 0; if (!(sce->state & UGEN_BULK_WB)) /* @@ -2038,10 +2045,7 @@ ugenkqfilter(dev_t dev, struct knote *kn struct klist *klist; sc = device_lookup_private(&ugen_cd, UGENUNIT(dev)); - if (sc == NULL) - return ENXIO; - - if (sc->sc_dying) + if (sc == NULL || sc->sc_dying) return ENXIO; if (UGENENDPOINT(dev) == USB_CONTROL_ENDPOINT)