All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] USB MIDI: fix endpoint detection
@ 2003-01-10  8:08 Clemens Ladisch
  2003-01-10 10:33 ` Takashi Iwai
  0 siblings, 1 reply; 2+ messages in thread
From: Clemens Ladisch @ 2003-01-10  8:08 UTC (permalink / raw)
  To: alsa-devel


This patch removes the implicit assumption that devices with
QUIRK_MIDI_FIXED_ENDPOINT use the same endpoint number for input and
output pipes. (This broke with the Edirol PCR-30/50.)


Index: alsa-kernel/usb/usbaudio.h
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.h,v
retrieving revision 1.11
diff -u -r1.11 usbaudio.h
--- alsa-kernel/usb/usbaudio.h	19 Dec 2002 12:15:23 -0000	1.11
+++ alsa-kernel/usb/usbaudio.h	10 Jan 2003 07:54:56 -0000
@@ -165,7 +165,7 @@

 /* data for QUIRK_MIDI_FIXED_ENDPOINT */
 struct snd_usb_midi_endpoint_info {
-	int16_t epnum;		/* ep number, -1 autodetect */
+	int8_t out_ep, in_ep;	/* ep number, 0 autodetect */
 	uint16_t out_cables;	/* bitmask */
 	uint16_t in_cables;	/* bitmask */
 };
Index: alsa-kernel/usb/usbaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.c,v
retrieving revision 1.33
diff -u -r1.33 usbaudio.c
--- alsa-kernel/usb/usbaudio.c	7 Jan 2003 10:36:32 -0000	1.33
+++ alsa-kernel/usb/usbaudio.c	10 Jan 2003 07:54:56 -0000
@@ -1953,7 +1953,6 @@
 static int snd_usb_roland_ua100_hack(snd_usb_audio_t *chip)
 {
 	static const snd_usb_midi_endpoint_info_t ep_quirk = {
-		.epnum = -1,
 		.out_cables = 0x0007,
 		.in_cables  = 0x0007
 	};
Index: alsa-kernel/usb/usbquirks.h
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbquirks.h,v
retrieving revision 1.10
diff -u -r1.10 usbquirks.h
--- alsa-kernel/usb/usbquirks.h	5 Dec 2002 19:54:44 -0000	1.10
+++ alsa-kernel/usb/usbquirks.h	10 Jan 2003 07:54:57 -0000
@@ -245,7 +245,6 @@
 		.ifnum = 2,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x000f,
 			.in_cables  = 0x000f
 		}
@@ -259,7 +258,6 @@
 		.ifnum = 2,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x003f,
 			.in_cables  = 0x003f
 		}
@@ -273,7 +271,6 @@
 		.ifnum = 2,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0003,
 			.in_cables  = 0x0003
 		}
@@ -287,7 +284,6 @@
 		.ifnum = 2,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0003,
 			.in_cables  = 0x0003
 		}
@@ -301,7 +297,6 @@
 		.ifnum = 2,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0013,
 			.in_cables  = 0x0013
 		}
@@ -315,7 +310,6 @@
 		.ifnum = 2,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0001,
 			.in_cables  = 0x0001
 		}
@@ -329,7 +323,6 @@
 		.ifnum = 2,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0001,
 			.in_cables  = 0x0001
 		}
@@ -343,7 +336,6 @@
 		.ifnum = 2,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0013,
 			.in_cables  = 0x0013
 		}
@@ -357,7 +349,6 @@
 		.ifnum = 2,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0007,
 			.in_cables  = 0x0007
 		}
@@ -371,7 +362,6 @@
 		.ifnum = 0,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0001,
 			.in_cables  = 0x0001
 		}
@@ -385,7 +375,6 @@
 		.ifnum = 0,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x01ff,
 			.in_cables  = 0x01ff
 		}
@@ -399,7 +388,6 @@
 		.ifnum = 2,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x000f,
 			.in_cables  = 0x000f
 		}
@@ -413,7 +401,6 @@
 		.ifnum = 0,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x003f,
 			.in_cables  = 0x003f
 		}
@@ -427,7 +414,6 @@
 		.ifnum = 3,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0001,
 			.in_cables  = 0x0001
 		}
@@ -441,7 +427,6 @@
 		.ifnum = 0,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0003,
 			.in_cables  = 0x0007
 		}
@@ -455,7 +440,6 @@
 		.ifnum = 0,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x000f,
 			.in_cables  = 0x000f
 		}
@@ -469,7 +453,6 @@
 		.ifnum = 3,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0003,
 			.in_cables  = 0x0003
 		}
@@ -483,7 +466,6 @@
 		.ifnum = 0,
 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.epnum = -1,
 			.out_cables = 0x0003,
 			.in_cables  = 0x0007
 		}
Index: alsa-kernel/usb/usbmidi.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbmidi.c,v
retrieving revision 1.16
diff -u -r1.16 usbmidi.c
--- alsa-kernel/usb/usbmidi.c	19 Dec 2002 12:15:23 -0000	1.16
+++ alsa-kernel/usb/usbmidi.c	10 Jan 2003 07:54:57 -0000
@@ -579,9 +579,9 @@
 		return -ENOMEM;
 	}
 	if (int_epd)
-		pipe = usb_rcvintpipe(umidi->chip->dev, ep_info->epnum);
+		pipe = usb_rcvintpipe(umidi->chip->dev, ep_info->in_ep);
 	else
-		pipe = usb_rcvbulkpipe(umidi->chip->dev, ep_info->epnum);
+		pipe = usb_rcvbulkpipe(umidi->chip->dev, ep_info->in_ep);
 	length = usb_maxpacket(umidi->chip->dev, pipe, 0);
 	buffer = kmalloc(length, GFP_KERNEL);
 	if (!buffer) {
@@ -652,7 +652,7 @@
 		snd_usbmidi_out_endpoint_delete(ep);
 		return -ENOMEM;
 	}
-	pipe = usb_sndbulkpipe(umidi->chip->dev, ep_info->epnum);
+	pipe = usb_sndbulkpipe(umidi->chip->dev, ep_info->out_ep);
 	ep->max_transfer = usb_maxpacket(umidi->chip->dev, pipe, 1) & ~3;
 	buffer = kmalloc(ep->max_transfer, GFP_KERNEL);
 	if (!buffer) {
@@ -737,8 +737,6 @@
 	int out_ports = 0, in_ports = 0;

 	for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) {
-		if (!endpoints[i].epnum)
-			continue;
 		if (endpoints[i].out_cables) {
 			err = snd_usbmidi_out_endpoint_create(umidi, &endpoints[i],
 							      &umidi->endpoints[i]);
@@ -812,50 +810,64 @@
 		    ms_ep->bDescriptorType != USB_DT_CS_ENDPOINT ||
 		    ms_ep->bDescriptorSubtype != MS_GENERAL)
 			continue;
-		if (endpoints[epidx].epnum != 0 &&
-		    endpoints[epidx].epnum != (ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK)) {
-			++epidx;
-			if (epidx >= MIDI_MAX_ENDPOINTS) {
-				printk(KERN_WARNING "snd-usb-midi: too many endpoints\n");
-				break;
+		if ((ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK) == USB_DIR_OUT) {
+			if (endpoints[epidx].out_ep) {
+				if (++epidx >= MIDI_MAX_ENDPOINTS) {
+					printk(KERN_WARNING "snd-usb-midi: too many endpoints\n");
+					break;
+				}
 			}
-		}
-		endpoints[epidx].epnum = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
-		if (ep->bEndpointAddress & USB_DIR_IN) {
-			endpoints[epidx].in_cables = (1 << ms_ep->bNumEmbMIDIJack) - 1;
-		} else {
+			endpoints[epidx].out_ep = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
 			endpoints[epidx].out_cables = (1 << ms_ep->bNumEmbMIDIJack) - 1;
+			printk(KERN_INFO "snd-usb-midi: EP %02X: %d jack(s)\n",
+			       ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack);
+		} else {
+			if (endpoints[epidx].in_ep) {
+				if (++epidx >= MIDI_MAX_ENDPOINTS) {
+					printk(KERN_WARNING "snd-usb-midi: too many endpoints\n");
+					break;
+				}
+			}
+			endpoints[epidx].in_ep = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+			endpoints[epidx].in_cables = (1 << ms_ep->bNumEmbMIDIJack) - 1;
+			printk(KERN_INFO "snd-usb-midi: EP %02X: %d jack(s)\n",
+			       ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack);
 		}
-		printk(KERN_INFO "snd-usb-midi: detected %d %s jack(s) on endpoint %d\n",
-		       ms_ep->bNumEmbMIDIJack,
-		       ep->bEndpointAddress & USB_DIR_IN ? "input" : "output",
-		       endpoints[epidx].epnum);
 	}
 	return 0;
 }

 /*
- * If the first endpoint isn't specified, use the first endpoint in the
+ * If the endpoints aren't specified, use the first bulk endpoints in the
  * first alternate setting of the interface.
  */
 static int snd_usbmidi_detect_endpoint(snd_usb_midi_t* umidi,
-			       	       snd_usb_midi_endpoint_info_t* endpoint)
+				       snd_usb_midi_endpoint_info_t* endpoint)
 {
 	struct usb_interface* intf;
 	struct usb_host_interface *hostif;
 	struct usb_interface_descriptor* intfd;
 	struct usb_endpoint_descriptor* epd;
+	int i;

-	if (endpoint->epnum == -1) {
-		intf = umidi->iface;
-		if (!intf || intf->num_altsetting < 1)
-			return -ENOENT;
-		hostif = intf->altsetting;
-		intfd = get_iface_desc(hostif);
-		if (intfd->bNumEndpoints < 1)
-			return -ENOENT;
-		epd = get_endpoint(hostif, 0);
-		endpoint->epnum = epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+	intf = umidi->iface;
+	if (!intf || intf->num_altsetting < 1)
+		return -ENOENT;
+	hostif = intf->altsetting;
+	intfd = get_iface_desc(hostif);
+	if (intfd->bNumEndpoints < 1)
+		return -ENOENT;
+
+	for (i = 0; i < intfd->bNumEndpoints; ++i) {
+		epd = get_endpoint(hostif, i);
+		if ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK)
+			continue;
+		if (!endpoint->out_ep && endpoint->out_cables &&
+		    (epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT)
+			endpoint->out_ep = epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+		if (!endpoint->in_ep && endpoint->in_cables &&
+		    (epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)
+			endpoint->in_ep = epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
 	}
 	return 0;
 }
@@ -892,7 +904,6 @@
 	if (!endpoint->in_cables && !endpoint->out_cables)
 		return -ENOENT;

-	endpoint->epnum = -1;
 	return snd_usbmidi_detect_endpoint(umidi, endpoint);
 }

@@ -940,13 +951,13 @@
 		}
 	}

-	ep_info.epnum = get_endpoint(hostif, 2)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+	ep_info.out_ep = get_endpoint(hostif, 2)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
 	ep_info.out_cables = endpoint->out_cables & 0x5555;
 	err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]);
 	if (err < 0)
 		return err;

-	ep_info.epnum = get_endpoint(hostif, 0)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+	ep_info.in_ep = get_endpoint(hostif, 0)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
 	ep_info.in_cables = endpoint->in_cables;
 	err = snd_usbmidi_in_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]);
 	if (err < 0)
@@ -954,7 +965,7 @@
 	umidi->endpoints[0].in->urb->complete = snd_usb_complete_callback(snd_usbmidi_in_midiman_complete);

 	if (endpoint->out_cables > 0x0001) {
-		ep_info.epnum = get_endpoint(hostif, 4)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+		ep_info.out_ep = get_endpoint(hostif, 4)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
 		ep_info.out_cables = endpoint->out_cables & 0xaaaa;
 		err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, &umidi->endpoints[1]);
 		if (err < 0)



-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] USB MIDI: fix endpoint detection
  2003-01-10  8:08 [PATCH] USB MIDI: fix endpoint detection Clemens Ladisch
@ 2003-01-10 10:33 ` Takashi Iwai
  0 siblings, 0 replies; 2+ messages in thread
From: Takashi Iwai @ 2003-01-10 10:33 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: alsa-devel

At Fri, 10 Jan 2003 09:08:47 +0100 (MET),
Clemens Ladisch wrote:
> 
> 
> This patch removes the implicit assumption that devices with
> QUIRK_MIDI_FIXED_ENDPOINT use the same endpoint number for input and
> output pipes. (This broke with the Edirol PCR-30/50.)

thanks, now committed to cvs.

the patch was rejected by some reason (whitespace?), so i did apply
manually.  please check whether it's ok for you.
 

Takashi


-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-01-10 10:33 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-01-10  8:08 [PATCH] USB MIDI: fix endpoint detection Clemens Ladisch
2003-01-10 10:33 ` Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.