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

Reply via email to