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
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel