Module Name: src Committed By: riastradh Date: Tue Mar 29 09:08:44 UTC 2022
Modified Files: src/sys/dev/usb: emdtv.c emdtv_dtv.c emdtv_ir.c Log Message: emdtv(4): Fix issues in detach. - Use config_detach_children, and do it up front, and handle failure (not relevant for yanking usb but relevant for drvctl which doesn't pass DETACH_FORCE). - Fix teardown order: stop interrupts so we stop issuing new work, and _then_ wait for pending work to drain and destroy the workqueue. - Omit needless empty mutex_enter(lock); mutex_exit(lock) dance which probably only appeared necessary because of the wrong teardown order. To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/dev/usb/emdtv.c \ src/sys/dev/usb/emdtv_dtv.c cvs rdiff -u -r1.4 -r1.5 src/sys/dev/usb/emdtv_ir.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/usb/emdtv.c diff -u src/sys/dev/usb/emdtv.c:1.16 src/sys/dev/usb/emdtv.c:1.17 --- src/sys/dev/usb/emdtv.c:1.16 Sat Mar 12 18:31:39 2022 +++ src/sys/dev/usb/emdtv.c Tue Mar 29 09:08:44 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: emdtv.c,v 1.16 2022/03/12 18:31:39 riastradh Exp $ */ +/* $NetBSD: emdtv.c,v 1.17 2022/03/29 09:08:44 riastradh Exp $ */ /*- * Copyright (c) 2008, 2011 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: emdtv.c,v 1.16 2022/03/12 18:31:39 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: emdtv.c,v 1.17 2022/03/29 09:08:44 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -155,9 +155,14 @@ emdtv_detach(device_t self, int flags) { struct emdtv_softc *sc = device_private(self); usbd_status status; + int error; sc->sc_dying = true; + error = config_detach_children(self, flags); + if (error) + return error; + emdtv_ir_detach(sc, flags); emdtv_dtv_detach(sc, flags); Index: src/sys/dev/usb/emdtv_dtv.c diff -u src/sys/dev/usb/emdtv_dtv.c:1.16 src/sys/dev/usb/emdtv_dtv.c:1.17 --- src/sys/dev/usb/emdtv_dtv.c:1.16 Sat Aug 7 16:19:16 2021 +++ src/sys/dev/usb/emdtv_dtv.c Tue Mar 29 09:08:44 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: emdtv_dtv.c,v 1.16 2021/08/07 16:19:16 thorpej Exp $ */ +/* $NetBSD: emdtv_dtv.c,v 1.17 2022/03/29 09:08:44 riastradh Exp $ */ /*- * Copyright (c) 2008, 2011 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: emdtv_dtv.c,v 1.16 2021/08/07 16:19:16 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: emdtv_dtv.c,v 1.17 2022/03/29 09:08:44 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -142,12 +142,8 @@ emdtv_dtv_free_xfers(struct emdtv_softc void emdtv_dtv_detach(struct emdtv_softc *sc, int flags) { - sc->sc_streaming = false; - if (sc->sc_dtvdev != NULL) { - config_detach(sc->sc_dtvdev, flags); - sc->sc_dtvdev = NULL; - } + sc->sc_streaming = false; if (sc->sc_xc3028) xc3028_close(sc->sc_xc3028); Index: src/sys/dev/usb/emdtv_ir.c diff -u src/sys/dev/usb/emdtv_ir.c:1.4 src/sys/dev/usb/emdtv_ir.c:1.5 --- src/sys/dev/usb/emdtv_ir.c:1.4 Sat Aug 7 16:19:16 2021 +++ src/sys/dev/usb/emdtv_ir.c Tue Mar 29 09:08:44 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: emdtv_ir.c,v 1.4 2021/08/07 16:19:16 thorpej Exp $ */ +/* $NetBSD: emdtv_ir.c,v 1.5 2022/03/29 09:08:44 riastradh Exp $ */ /*- * Copyright (c) 2008 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: emdtv_ir.c,v 1.4 2021/08/07 16:19:16 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: emdtv_ir.c,v 1.5 2022/03/29 09:08:44 riastradh Exp $"); #include <sys/select.h> #include <sys/param.h> @@ -108,8 +108,6 @@ emdtv_ir_attach(struct emdtv_softc *sc) void emdtv_ir_detach(struct emdtv_softc *sc, int flags) { - if (sc->sc_ir_wq != NULL) - workqueue_destroy(sc->sc_ir_wq); if (sc->sc_intr_pipe != NULL) { usbd_abort_pipe(sc->sc_intr_pipe); @@ -117,12 +115,10 @@ emdtv_ir_detach(struct emdtv_softc *sc, sc->sc_intr_pipe = NULL; } - mutex_enter(&sc->sc_ir_mutex); - mutex_exit(&sc->sc_ir_mutex); - mutex_destroy(&sc->sc_ir_mutex); + if (sc->sc_ir_wq != NULL) + workqueue_destroy(sc->sc_ir_wq); - if (sc->sc_cirdev != NULL) - config_detach(sc->sc_cirdev, flags); + mutex_destroy(&sc->sc_ir_mutex); } static void