Module Name: src
Committed By: mrg
Date: Tue Nov 22 07:56:15 UTC 2011
Modified Files:
src/sys/dev/usb [jmcneill-audiomp3]: umidi.c umidivar.h
Log Message:
port umidi to audiomp: get_locks support, take locks in interrupts.
untested, and midi in this branch has general problems still anyway.
To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.44.4.1 src/sys/dev/usb/umidi.c
cvs rdiff -u -r1.14 -r1.14.10.1 src/sys/dev/usb/umidivar.h
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/umidi.c
diff -u src/sys/dev/usb/umidi.c:1.44 src/sys/dev/usb/umidi.c:1.44.4.1
--- src/sys/dev/usb/umidi.c:1.44 Fri Oct 7 19:41:03 2011
+++ src/sys/dev/usb/umidi.c Tue Nov 22 07:56:15 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: umidi.c,v 1.44 2011/10/07 19:41:03 jakllsch Exp $ */
+/* $NetBSD: umidi.c,v 1.44.4.1 2011/11/22 07:56:15 mrg Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umidi.c,v 1.44 2011/10/07 19:41:03 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umidi.c,v 1.44.4.1 2011/11/22 07:56:15 mrg Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -79,6 +79,7 @@ static int umidi_commonmsg(void *, int,
static int umidi_sysex(void *, u_char *, int);
static int umidi_rtmsg(void *, int);
static void umidi_getinfo(void *, struct midi_info *);
+static void umidi_get_locks(void *, kmutex_t **, kmutex_t **);
static usbd_status alloc_pipe(struct umidi_endpoint *);
static void free_pipe(struct umidi_endpoint *);
@@ -127,11 +128,11 @@ static void out_solicit(void *); /* stru
const struct midi_hw_if umidi_hw_if = {
- umidi_open,
- umidi_close,
- umidi_rtmsg,
- umidi_getinfo,
- 0, /* ioctl */
+ .open = umidi_open,
+ .close = umidi_close,
+ .output = umidi_rtmsg,
+ .getinfo = umidi_getinfo,
+ .get_locks = umidi_get_locks,
};
struct midi_hw_if_ext umidi_hw_if_ext = {
@@ -200,6 +201,8 @@ umidi_attach(device_t parent, device_t s
aprint_normal_dev(self, "");
umidi_print_quirk(sc->sc_quirk);
+ mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
+ mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_USB);
err = alloc_all_endpoints(sc);
if (err!=USBD_NORMAL_COMPLETION) {
@@ -297,6 +300,9 @@ umidi_detach(device_t self, int flags)
usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev,
sc->sc_dev);
+ mutex_destroy(&sc->sc_lock);
+ mutex_destroy(&sc->sc_intr_lock);
+
return 0;
}
@@ -436,6 +442,15 @@ umidi_getinfo(void *addr, struct midi_in
midi_register_hw_if_ext(mm? &umidi_hw_if_mm : &umidi_hw_if_ext);
}
+static void
+umidi_get_locks(void *addr, kmutex_t **intr, kmutex_t **thread)
+{
+ struct umidi_mididev *mididev = addr;
+ struct umidi_softc *sc = mididev->sc;
+
+ *intr = &sc->sc_intr_lock;
+ *thread = &sc->sc_lock;
+}
/*
* each endpoint stuffs
@@ -1547,6 +1562,7 @@ in_intr(usbd_xfer_handle xfer, usbd_priv
{
int cn, len, i;
struct umidi_endpoint *ep = (struct umidi_endpoint *)priv;
+ struct umidi_softc *sc = ep->sc;
struct umidi_jack *jack;
unsigned char *packet;
umidi_packet_bufp slot;
@@ -1557,6 +1573,7 @@ in_intr(usbd_xfer_handle xfer, usbd_priv
if (ep->sc->sc_dying || !ep->num_open)
return;
+ mutex_enter(&sc->sc_intr_lock);
usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL);
if ( 0 == count % UMIDI_PACKET_SIZE ) {
DPRINTFN(200,("%s: input endpoint %p transfer length %u\n",
@@ -1588,6 +1605,7 @@ in_intr(usbd_xfer_handle xfer, usbd_priv
(unsigned)data[0],
(unsigned)data[1],
(unsigned)data[2]));
+ mutex_exit(&sc->sc_intr_lock);
return;
}
@@ -1610,6 +1628,7 @@ in_intr(usbd_xfer_handle xfer, usbd_priv
}
(void)start_input_transfer(ep);
+ mutex_exit(&sc->sc_intr_lock);
}
static void
@@ -1623,6 +1642,7 @@ out_intr(usbd_xfer_handle xfer, usbd_pri
if (sc->sc_dying)
return;
+ mutex_enter(&sc->sc_intr_lock);
#ifdef UMIDI_DEBUG
if ( umididebug >= 200 )
microtime(&umidi_tv);
@@ -1657,6 +1677,7 @@ out_intr(usbd_xfer_handle xfer, usbd_pri
ep->soliciting = 1;
out_solicit(ep);
}
+ mutex_exit(&sc->sc_intr_lock);
}
/*
Index: src/sys/dev/usb/umidivar.h
diff -u src/sys/dev/usb/umidivar.h:1.14 src/sys/dev/usb/umidivar.h:1.14.10.1
--- src/sys/dev/usb/umidivar.h:1.14 Wed Nov 3 22:34:24 2010
+++ src/sys/dev/usb/umidivar.h Tue Nov 22 07:56:15 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: umidivar.h,v 1.14 2010/11/03 22:34:24 dyoung Exp $ */
+/* $NetBSD: umidivar.h,v 1.14.10.1 2011/11/22 07:56:15 mrg Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -119,4 +119,7 @@ struct umidi_softc {
struct umidi_endpoint *sc_in_ep;
struct umidi_endpoint *sc_endpoints;
int cblnums_global;
+
+ kmutex_t sc_lock;
+ kmutex_t sc_intr_lock;
};