Module Name:    src
Committed By:   jmcneill
Date:           Mon Jan  9 11:02:19 UTC 2012

Modified Files:
        src/sys/dev/usb: emdtv.c emdtv_dtv.c

Log Message:
make sure kernel lock is held when calling into usb stack


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/usb/emdtv.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/usb/emdtv_dtv.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.6 src/sys/dev/usb/emdtv.c:1.7
--- src/sys/dev/usb/emdtv.c:1.6	Fri Dec 23 00:51:43 2011
+++ src/sys/dev/usb/emdtv.c	Mon Jan  9 11:02:18 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: emdtv.c,v 1.6 2011/12/23 00:51:43 jakllsch Exp $ */
+/* $NetBSD: emdtv.c,v 1.7 2012/01/09 11:02:18 jmcneill 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.6 2011/12/23 00:51:43 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emdtv.c,v 1.7 2012/01/09 11:02:18 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -319,7 +319,10 @@ emdtv_read_multi_1(struct emdtv_softc *s
 	USETW(request.wIndex, index);
 	USETW(request.wLength, count);
 
+	KERNEL_LOCK(1, curlwp);
 	status = usbd_do_request(sc->sc_udev, &request, datap);
+	KERNEL_UNLOCK_ONE(curlwp);
+
 	if (status != USBD_NORMAL_COMPLETION)
 		aprint_error_dev(sc->sc_dev, "couldn't read %x/%x: %s\n",
 		    req, index, usbd_errstr(status));
@@ -347,7 +350,10 @@ emdtv_write_multi_1(struct emdtv_softc *
 	USETW(request.wIndex, index);
 	USETW(request.wLength, count);
 
+	KERNEL_LOCK(1, curlwp);
 	status = usbd_do_request(sc->sc_udev, &request, __UNCONST(datap));
+	KERNEL_UNLOCK_ONE(curlwp);
+
 	if (status != USBD_NORMAL_COMPLETION)
 		aprint_error_dev(sc->sc_dev, "couldn't read %x/%x: %s\n",
 		    req, index, usbd_errstr(status));

Index: src/sys/dev/usb/emdtv_dtv.c
diff -u src/sys/dev/usb/emdtv_dtv.c:1.7 src/sys/dev/usb/emdtv_dtv.c:1.8
--- src/sys/dev/usb/emdtv_dtv.c:1.7	Fri Dec 23 00:51:43 2011
+++ src/sys/dev/usb/emdtv_dtv.c	Mon Jan  9 11:02:18 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: emdtv_dtv.c,v 1.7 2011/12/23 00:51:43 jakllsch Exp $ */
+/* $NetBSD: emdtv_dtv.c,v 1.8 2012/01/09 11:02:18 jmcneill 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.7 2011/12/23 00:51:43 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emdtv_dtv.c,v 1.8 2012/01/09 11:02:18 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -306,6 +306,7 @@ emdtv_dtv_start_transfer(void *priv,
 	aprint_debug_dev(sc->sc_dev, "allocating isoc xfers (pktsz %d)\n",
 	    sc->sc_isoc_maxpacketsize);
 
+	KERNEL_LOCK(1, curlwp);
 	for (i = 0; i < EMDTV_NXFERS; i++) {
 		sc->sc_ix[i].ix_xfer = usbd_alloc_xfer(sc->sc_udev);
 		sc->sc_ix[i].ix_buf = usbd_alloc_buffer(sc->sc_ix[i].ix_xfer,
@@ -313,6 +314,7 @@ emdtv_dtv_start_transfer(void *priv,
 		aprint_debug_dev(sc->sc_dev, "  ix[%d] xfer %p buf %p\n",
 		    i, sc->sc_ix[i].ix_xfer, sc->sc_ix[i].ix_buf);
 	}
+	KERNEL_UNLOCK_ONE(curlwp);
 
 	aprint_debug_dev(sc->sc_dev, "starting isoc transactions\n");
 
@@ -332,6 +334,7 @@ emdtv_dtv_stop_transfer(void *priv)
 
 	sc->sc_streaming = false;
 
+	KERNEL_LOCK(1, curlwp);
 	if (sc->sc_isoc_pipe != NULL)
 		usbd_abort_pipe(sc->sc_isoc_pipe);
 
@@ -341,6 +344,7 @@ emdtv_dtv_stop_transfer(void *priv)
 			sc->sc_ix[i].ix_xfer = NULL;
 			sc->sc_ix[i].ix_buf = NULL;
 		}
+	KERNEL_UNLOCK_ONE(curlwp);
 
 	sc->sc_dtvsubmitcb = NULL;
 	sc->sc_dtvsubmitarg = NULL;
@@ -378,7 +382,10 @@ emdtv_dtv_isoc_start(struct emdtv_softc 
 			     EMDTV_NFRAMES,
 			     USBD_NO_COPY | USBD_SHORT_XFER_OK,
 			     emdtv_dtv_isoc);
+
+	KERNEL_LOCK(1, curlwp);
 	usbd_transfer(ix->ix_xfer);
+	KERNEL_UNLOCK_ONE(curlwp);
 
 	return 0;
 }

Reply via email to