Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Jul 2011 13:27:23 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r223736 - in head/sys/dev: sound/usb usb usb/quirk
Message-ID:  <201107031327.p63DRNOZ019920@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Sun Jul  3 13:27:23 2011
New Revision: 223736
URL: http://svn.freebsd.org/changeset/base/223736

Log:
  Introduce a quirk for broken USB MIDI hardware instead of limiting performance
  in general.
  
  MFC after:	1 week

Modified:
  head/sys/dev/sound/usb/uaudio.c
  head/sys/dev/usb/quirk/usb_quirk.c
  head/sys/dev/usb/quirk/usb_quirk.h
  head/sys/dev/usb/usbdevs

Modified: head/sys/dev/sound/usb/uaudio.c
==============================================================================
--- head/sys/dev/sound/usb/uaudio.c	Sun Jul  3 12:22:02 2011	(r223735)
+++ head/sys/dev/sound/usb/uaudio.c	Sun Jul  3 13:27:23 2011	(r223736)
@@ -192,7 +192,7 @@ struct uaudio_chan {
 };
 
 #define	UMIDI_CABLES_MAX   16		/* units */
-#define	UMIDI_TX_FRAMES	   64		/* units */
+#define	UMIDI_TX_FRAMES	   128		/* units */
 #define	UMIDI_TX_BUFFER    (UMIDI_TX_FRAMES * 4)	/* bytes */
 
 enum {
@@ -236,6 +236,7 @@ struct umidi_chan {
 	uint8_t	curr_cable;
 	uint8_t	max_cable;
 	uint8_t	valid;
+	uint8_t single_command;
 };
 
 struct uaudio_softc {
@@ -499,7 +500,6 @@ static const struct usb_config
 		.endpoint = UE_ADDR_ANY,
 		.direction = UE_DIR_OUT,
 		.bufsize = UMIDI_TX_BUFFER,
-		.frames = UMIDI_TX_FRAMES,
 		.callback = &umidi_bulk_write_callback,
 	},
 
@@ -3565,6 +3565,7 @@ tr_setup:
 		nframes = 0;	/* reset */
 		start_cable = chan->curr_cable;
 		tr_any = 0;
+		pc = usbd_xfer_get_frame(xfer, 0);
 
 		while (1) {
 
@@ -3592,15 +3593,11 @@ tr_setup:
 					    sub->temp_cmd[0], sub->temp_cmd[1],
 					    sub->temp_cmd[2], sub->temp_cmd[3]);
 
-					usbd_xfer_set_frame_offset(xfer, 4 * nframes, nframes);
-					usbd_xfer_set_frame_len(xfer, nframes, 4);
-
-					pc = usbd_xfer_get_frame(xfer, nframes);
-
-					usbd_copy_in(pc, 0, sub->temp_cmd, 4);
+					usbd_copy_in(pc, nframes * 4, sub->temp_cmd, 4);
 
 					nframes++;
-					if (nframes >= UMIDI_TX_FRAMES)
+
+					if ((nframes >= UMIDI_TX_FRAMES) || (chan->single_command != 0))
 						break;
 				} else {
 					continue;
@@ -3618,9 +3615,9 @@ tr_setup:
 			}
 		}
 
-		if (nframes > 0) {
+		if (nframes != 0) {
 			DPRINTF("Transferring %d frames\n", (int)nframes);
-			usbd_xfer_set_frames(xfer, nframes);
+			usbd_xfer_set_frame_len(xfer, 0, 4 * nframes);
 			usbd_transfer_submit(xfer);
 		}
 		break;
@@ -3792,6 +3789,9 @@ umidi_probe(device_t dev)
 	int error;
 	uint32_t n;
 
+	if (usb_test_quirk(uaa, UQ_SINGLE_CMD_MIDI))
+		chan->single_command = 1;
+
 	if (usbd_set_alt_interface_index(sc->sc_udev, chan->iface_index,
 	    chan->iface_alt_index)) {
 		DPRINTF("setting of alternate index failed!\n");

Modified: head/sys/dev/usb/quirk/usb_quirk.c
==============================================================================
--- head/sys/dev/usb/quirk/usb_quirk.c	Sun Jul  3 12:22:02 2011	(r223735)
+++ head/sys/dev/usb/quirk/usb_quirk.c	Sun Jul  3 13:27:23 2011	(r223736)
@@ -472,6 +472,7 @@ static struct usb_quirk_entry usb_quirks
 	USB_QUIRK(ROLAND, SD20, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
 	USB_QUIRK(ROLAND, SD80, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
 	USB_QUIRK(ROLAND, UA700, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(MEDELI, DD305, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI, UQ_MATCH_VENDOR_ONLY),
 };
 #undef USB_QUIRK_VP
 #undef USB_QUIRK
@@ -538,6 +539,7 @@ static const char *usb_quirk_str[USB_QUI
 	[UQ_MSC_EJECT_TCT]		= "UQ_MSC_EJECT_TCT",
 	[UQ_BAD_MIDI]			= "UQ_BAD_MIDI",
 	[UQ_AU_VENDOR_CLASS]		= "UQ_AU_VENDOR_CLASS",
+	[UQ_SINGLE_CMD_MIDI]		= "UQ_SINGLE_CMD_MIDI",
 };
 
 /*------------------------------------------------------------------------*

Modified: head/sys/dev/usb/quirk/usb_quirk.h
==============================================================================
--- head/sys/dev/usb/quirk/usb_quirk.h	Sun Jul  3 12:22:02 2011	(r223735)
+++ head/sys/dev/usb/quirk/usb_quirk.h	Sun Jul  3 13:27:23 2011	(r223736)
@@ -102,6 +102,7 @@ enum {
 
 	UQ_BAD_MIDI,		/* device claims MIDI class, but isn't */
 	UQ_AU_VENDOR_CLASS,	/* audio device uses vendor and not audio class */
+	UQ_SINGLE_CMD_MIDI,	/* at most one command per USB packet */
 
 	USB_QUIRK_MAX
 };

Modified: head/sys/dev/usb/usbdevs
==============================================================================
--- head/sys/dev/usb/usbdevs	Sun Jul  3 12:22:02 2011	(r223735)
+++ head/sys/dev/usb/usbdevs	Sun Jul  3 13:27:23 2011	(r223736)
@@ -484,6 +484,7 @@ vendor SHANTOU		0x0a46	ShanTou
 vendor MEDIAGEAR	0x0a48	MediaGear
 vendor BROADCOM		0x0a5c	Broadcom
 vendor GREENHOUSE	0x0a6b	GREENHOUSE
+vendor MEDELI		0x0a67	Medeli
 vendor GEOCAST		0x0a79	Geocast Network Systems
 vendor IDQUANTIQUE	0x0aba	id Quantique
 vendor ZYDAS		0x0ace	Zydas Technology Corporation
@@ -2130,6 +2131,9 @@ product MCT DU_H3SP_USB232	0x0200	D-Link
 product MCT USB232		0x0210	USB-232 Interface
 product MCT SITECOM_USB232	0x0230	Sitecom USB-232 Products
 
+/* Medeli */
+product MEDELI DD305		0x5011	DD305 Digital Drum Set
+
 /* MediaTek, Inc. */
 product MEDIATEK MTK3329	0x3329	MTK II GPS Receiver
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107031327.p63DRNOZ019920>