All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Edirol UA-20 PCM support
@ 2003-02-24 10:24 Clemens Ladisch
  2003-02-24 12:23 ` Frank Barknecht
  0 siblings, 1 reply; 18+ messages in thread
From: Clemens Ladisch @ 2003-02-24 10:24 UTC (permalink / raw)
  To: alsa-devel; +Cc: Frank Barknecht


This adds support for the UA-20's PCM interfaces in "Advanced Driver"
mode. The device has all standard descriptors, so the normal descriptor
parsing code can be used, but the interface class is set to "vendor
specific".

The entry in usbquirks.h is there so that the driver is loaded for the
device, but .driver_info isn't set so that the standard code is used.

usbaudio.c has been modified to accept both CLASS_AUDIO and
CLASS_VENDOR_SPEC as valid interface classes.



Index: alsa-kernel/usb/usbaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.c,v
retrieving revision 1.44
diff -u -r1.44 usbaudio.c
--- alsa-kernel/usb/usbaudio.c	17 Feb 2003 10:37:40 -0000	1.44
+++ alsa-kernel/usb/usbaudio.c	24 Feb 2003 10:11:40 -0000
@@ -1971,7 +1971,8 @@
 		alts = &iface->altsetting[i];
 		altsd = get_iface_desc(alts);
 		/* skip invalid one */
-		if (altsd->bInterfaceClass != USB_CLASS_AUDIO ||
+		if ((altsd->bInterfaceClass != USB_CLASS_AUDIO &&
+		     altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
 		    altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING ||
 		    altsd->bNumEndpoints < 1)
 			continue;
@@ -2158,7 +2159,8 @@
 		}
 		alts = &iface->altsetting[0];
 		altsd = get_iface_desc(alts);
-		if (altsd->bInterfaceClass == USB_CLASS_AUDIO &&
+		if ((altsd->bInterfaceClass == USB_CLASS_AUDIO ||
+		     altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) &&
 		    altsd->bInterfaceSubClass == USB_SUBCLASS_MIDI_STREAMING) {
 			if (snd_usb_create_midi_interface(chip, iface, NULL) < 0) {
 				snd_printk(KERN_ERR "%d:%u:%d: cannot create sequencer device\n", dev->devnum, ctrlif, j);
@@ -2167,7 +2169,8 @@
 			usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L);
 			continue;
 		}
-		if (altsd->bInterfaceClass != USB_CLASS_AUDIO ||
+		if ((altsd->bInterfaceClass != USB_CLASS_AUDIO &&
+		     altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
 		    altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING) {
 			snd_printdd(KERN_ERR "%d:%u:%d: skipping non-supported interface %d\n", dev->devnum, ctrlif, j, altsd->bInterfaceClass);
 			/* skip non-supported classes */
Index: alsa-kernel/usb/usbquirks.h
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbquirks.h,v
retrieving revision 1.16
diff -u -r1.16 usbquirks.h
--- alsa-kernel/usb/usbquirks.h	13 Feb 2003 17:18:10 -0000	1.16
+++ alsa-kernel/usb/usbquirks.h	24 Feb 2003 10:11:40 -0000
@@ -226,16 +226,10 @@
 },

 /*
- * Once upon a time people thought, "Wouldn't it be nice if there was a
- * standard for USB MIDI devices, so that device drivers would not be forced
- * to know about the quirks of specific devices?"  So Roland went ahead and
- * wrote the USB Device Class Definition for MIDI Devices, and the USB-IF
- * endorsed it, and now everybody designing USB MIDI devices does so in
- * agreement with this standard (or at least tries to).
+ * Roland/RolandED/Edirol devices
  *
- * And if you prefer a happy end, you can imagine that Roland devices set a
- * good example. Instead of being completely fucked up due to the lack of
- * class-specific descriptors.
+ * The USB MIDI Specification has been written by Roland,
+ * but a 100% conforming Roland device has yet to be found.
  */
 {
 	USB_DEVICE(0x0582, 0x0000),
@@ -507,17 +501,11 @@
 	}
 },
 {
-	USB_DEVICE_VENDOR_SPEC(0x0582, 0x0025),
-	.driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
-		.vendor_name = "EDIROL",
-		.product_name = "UA-20",
-		.ifnum = 3,
-		.type = QUIRK_MIDI_FIXED_ENDPOINT,
-		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.out_cables = 0x0001,
-			.in_cables  = 0x0001
-		}
-	}
+	/*
+	 * Edirol UA-20 in "Advanced Driver" mode.
+	 * Standard descriptors, but vendor-specific interfaces.
+	 */
+	USB_DEVICE(0x0582, 0x0025)
 },
 {
 	USB_DEVICE(0x0582, 0x0027),




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: [PATCH] Edirol UA-20 PCM support
  2003-02-24 10:24 [PATCH] Edirol UA-20 PCM support Clemens Ladisch
@ 2003-02-24 12:23 ` Frank Barknecht
  2003-02-24 12:58   ` Frank Barknecht
  2003-02-24 13:12   ` Clemens Ladisch
  0 siblings, 2 replies; 18+ messages in thread
From: Frank Barknecht @ 2003-02-24 12:23 UTC (permalink / raw)
  To: alsa-devel

Hallo Clemens,
Clemens Ladisch hat gesagt: // Clemens Ladisch wrote:

> This adds support for the UA-20's PCM interfaces in "Advanced Driver"
> mode. The device has all standard descriptors, so the normal descriptor
> parsing code can be used, but the interface class is set to "vendor
> specific".

I compiled alsa-driver from CVS with you patch applied. alsalib still
is rc7. I can get audio-out with alsaplayer or ecasound in Advanced
Mode using the plugin layer. OSS-emulation doesn't work. Starting Pd
hangs my laptop.  Its last messages are that Pd cannot open
/dev/snd/pcmX. I don't know, if the crash is caused by ALSA or by a
conflict between A. Mortons lowlatency patch and ext3 on 2.4.20. Pd
crashes the box even if lowlatency is disabled.

I cannot use or see the midi devices (anymore). 

ciao
-- 
 Frank Barknecht                               _ ______footils.org__


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: [PATCH] Edirol UA-20 PCM support
  2003-02-24 12:23 ` Frank Barknecht
@ 2003-02-24 12:58   ` Frank Barknecht
  2003-02-24 13:12   ` Clemens Ladisch
  1 sibling, 0 replies; 18+ messages in thread
From: Frank Barknecht @ 2003-02-24 12:58 UTC (permalink / raw)
  To: alsa-devel

Hallo,
Frank Barknecht hat gesagt: // Frank Barknecht wrote:

> Starting Pd hangs my laptop.  

I was stupid here: my laptop didn't crash, only my USB-mouse was
killed. 

ciao
-- 
 Frank Barknecht                               _ ______footils.org__


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: [PATCH] Edirol UA-20 PCM support
  2003-02-24 12:23 ` Frank Barknecht
  2003-02-24 12:58   ` Frank Barknecht
@ 2003-02-24 13:12   ` Clemens Ladisch
  2003-02-24 14:39     ` Frank Barknecht
  1 sibling, 1 reply; 18+ messages in thread
From: Clemens Ladisch @ 2003-02-24 13:12 UTC (permalink / raw)
  To: Frank Barknecht; +Cc: alsa-devel

Frank Barknecht wrote:
> Clemens Ladisch wrote:
> I compiled alsa-driver from CVS with you patch applied. alsalib still
> is rc7. I can get audio-out with alsaplayer or ecasound in Advanced
> Mode using the plugin layer.

So PCM works.  :-)

> OSS-emulation doesn't work.

OSS doesn't support 24-bit sample formats.

> I cannot use or see the midi devices (anymore).

Are there any messages in /var/log/messages? Is interface #3 in use by the
snd-usb-audio driver (see /proc/bus/usb/devices)?


Clemens




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: [PATCH] Edirol UA-20 PCM support
  2003-02-24 13:12   ` Clemens Ladisch
@ 2003-02-24 14:39     ` Frank Barknecht
  2003-02-24 17:17       ` Clemens Ladisch
  0 siblings, 1 reply; 18+ messages in thread
From: Frank Barknecht @ 2003-02-24 14:39 UTC (permalink / raw)
  To: alsa-devel

Hallo,

before I go on, I must say: I decided to send the UA-20 back to my
dealer and probably buy a Quattro instead. This seems to be the more
flexible device with the only drawback, that it's not USB-powered and
more expensive. I'm getting a bit tired from being Edirol's laboratory
animal. Why didn't they implement the standard they wrote? But what's
more important, I discovered, that I might need 4-channel output soon.
4-channel and 4-channel and midi seems to be supported best on the
Quattro. 

And what's the most important thing to me: Pd doesn't seem to like the
24-bit-depth or so either, and it doesn't support the plugin layer of
ALSA yet. So I cannot use Pd, which is the audio software that is
running here 12/7.

Clemens Ladisch hat gesagt: // Clemens Ladisch wrote:

> So PCM works.  :-)

Yep. 

> > OSS-emulation doesn't work.
> 
> OSS doesn't support 24-bit sample formats.

I suspected that. Might be one more reason to get a Quattro. 

> > I cannot use or see the midi devices (anymore).
> 
> Are there any messages in /var/log/messages? Is interface #3 in use by the
> snd-usb-audio driver (see /proc/bus/usb/devices)?

It says: "Sub=03 Prot=00 Driver=(None)" at the Edirol, whereas the
other interfaces are claimed by snd-usb-audio. I have a kernel without
any OSS sound modules besides soundcore. 

ciao
-- 
 Frank Barknecht                               _ ______footils.org__


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: [PATCH] Edirol UA-20 PCM support
  2003-02-24 14:39     ` Frank Barknecht
@ 2003-02-24 17:17       ` Clemens Ladisch
  2003-02-25 10:24         ` Takashi Iwai
  0 siblings, 1 reply; 18+ messages in thread
From: Clemens Ladisch @ 2003-02-24 17:17 UTC (permalink / raw)
  To: Frank Barknecht; +Cc: alsa-devel

Frank Barknecht wrote:
> I'm getting a bit tired from being Edirol's laboratory animal. Why
> didn't they implement the standard they wrote?

The Windows USB audio driver (tries to) handle all devices marked as
standard compatible. If a device offers capabilities which are implemented
buggily or not at all in Microsoft's driver (such as MIDI in Win2K), it
has to be marked as "vendor-specific" to prevent the Microsoft driver from
loading so that the vendor's bug-free driver can access the device.

> It says: "Sub=03 Prot=00 Driver=(None)" at the Edirol, whereas the
> other interfaces are claimed by snd-usb-audio.

That's a bug in my patch. I'll have to rewrite it.


HTH
Clemens




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: [PATCH] Edirol UA-20 PCM support
  2003-02-24 17:17       ` Clemens Ladisch
@ 2003-02-25 10:24         ` Takashi Iwai
  2003-02-25 11:53           ` Clemens Ladisch
  2003-02-28 11:33           ` Clemens Ladisch
  0 siblings, 2 replies; 18+ messages in thread
From: Takashi Iwai @ 2003-02-25 10:24 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: Frank Barknecht, alsa-devel

Hi Clemens,

At Mon, 24 Feb 2003 18:17:45 +0100 (MET),
Clemens Ladisch wrote:
> 
> Frank Barknecht wrote:
> > I'm getting a bit tired from being Edirol's laboratory animal. Why
> > didn't they implement the standard they wrote?
> 
> The Windows USB audio driver (tries to) handle all devices marked as
> standard compatible. If a device offers capabilities which are implemented
> buggily or not at all in Microsoft's driver (such as MIDI in Win2K), it
> has to be marked as "vendor-specific" to prevent the Microsoft driver from
> loading so that the vendor's bug-free driver can access the device.
> 
> > It says: "Sub=03 Prot=00 Driver=(None)" at the Edirol, whereas the
> > other interfaces are claimed by snd-usb-audio.
> 
> That's a bug in my patch. I'll have to rewrite it.

could you resend the patch if finished?
or, the previous patch is enough?


thanks,

Takashi


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: [PATCH] Edirol UA-20 PCM support
  2003-02-25 10:24         ` Takashi Iwai
@ 2003-02-25 11:53           ` Clemens Ladisch
  2003-02-28 11:33           ` Clemens Ladisch
  1 sibling, 0 replies; 18+ messages in thread
From: Clemens Ladisch @ 2003-02-25 11:53 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: Frank Barknecht, alsa-devel

Takashi Iwai wrote:
> Clemens Ladisch wrote:
> > That's a bug in my patch. I'll have to rewrite it.

The header descriptor in if #0 doesn't mention if#3, so we'd need a
composite quirk and a new quirk type to call snd_usb_create_streams.
That code would be cleaner if the descriptorss would be read from
host_if->extra instead of the seperately allocated buffer.

> could you resend the patch if finished?
> or, the previous patch is enough?

In the current CVS, we get MIDI but no PCM.
With my previous patch, we get PCM but not MIDI.

I don't have time today for this, but I think I'll have finished it
Thursday.


Clemens




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: [PATCH] Edirol UA-20 PCM support
  2003-02-25 10:24         ` Takashi Iwai
  2003-02-25 11:53           ` Clemens Ladisch
@ 2003-02-28 11:33           ` Clemens Ladisch
  2003-02-28 14:55             ` Takashi Iwai
  2003-02-28 22:23             ` [PATCH] Edirol UA-20 PCM support Frank Barknecht
  1 sibling, 2 replies; 18+ messages in thread
From: Clemens Ladisch @ 2003-02-28 11:33 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel

Takashi Iwai wrote:
> could you resend the patch if finished?

The new parsing code works with my device (UA-1A), but I couldn't test the
changes for the mixer and the UA-20.


- removed buffer allocation for class-specific descriptors; get them from
  intf->extra and ep->extra.
- accept USB_CLASS_VENDOR_SPECIFIC when parsing audio interfaces
- added quirk type for interfaces having standard descriptors
- added quirk for UA-20


Index: alsa-kernel/usb/usbaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.c,v
retrieving revision 1.45
diff -u -r1.45 usbaudio.c
--- alsa-kernel/usb/usbaudio.c	25 Feb 2003 12:35:45 -0000	1.45
+++ alsa-kernel/usb/usbaudio.c	28 Feb 2003 10:34:19 -0000
@@ -1556,15 +1556,11 @@

 /*
  * parse descriptor buffer and return the pointer starting the given
- * descriptor type and interface.
- * if altsetting is not -1, seek the buffer until the matching alternate
- * setting is found.
+ * descriptor type.
  */
-void *snd_usb_find_desc(void *descstart, int desclen, void *after,
-			u8 dtype, int iface, int altsetting)
+void *snd_usb_find_desc(void *descstart, int desclen, void *after, u8 dtype)
 {
 	u8 *p, *end, *next;
-	int ifc = -1, as = -1;

 	p = descstart;
 	end = p + desclen;
@@ -1574,15 +1570,7 @@
 		next = p + p[0];
 		if (next > end)
 			return NULL;
-		if (p[1] == USB_DT_INTERFACE) {
-			/* minimum length of interface descriptor */
-			if (p[0] < 9)
-				return NULL;
-			ifc = p[2];
-			as = p[3];
-		}
-		if (p[1] == dtype && (!after || (void *)p > after) &&
-		    (iface == -1 || iface == ifc) && (altsetting == -1 || altsetting == as)) {
+		if (p[1] == dtype && (!after || (void *)p > after)) {
 			return p;
 		}
 		p = next;
@@ -1593,12 +1581,12 @@
 /*
  * find a class-specified interface descriptor with the given subtype.
  */
-void *snd_usb_find_csint_desc(void *buffer, int buflen, void *after, u8 dsubtype, int iface, int altsetting)
+void *snd_usb_find_csint_desc(void *buffer, int buflen, void *after, u8 dsubtype)
 {
 	unsigned char *p = after;

 	while ((p = snd_usb_find_desc(buffer, buflen, p,
-				      USB_DT_CS_INTERFACE, iface, altsetting)) != NULL) {
+				      USB_DT_CS_INTERFACE)) != NULL) {
 		if (p[0] >= 3 && p[2] == dsubtype)
 			return p;
 	}
@@ -1950,7 +1938,7 @@
 }


-static int parse_audio_endpoints(snd_usb_audio_t *chip, unsigned char *buffer, int buflen, int iface_no)
+static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no)
 {
 	struct usb_device *dev;
 	struct usb_host_config *config;
@@ -1971,7 +1959,8 @@
 		alts = &iface->altsetting[i];
 		altsd = get_iface_desc(alts);
 		/* skip invalid one */
-		if (altsd->bInterfaceClass != USB_CLASS_AUDIO ||
+		if ((altsd->bInterfaceClass != USB_CLASS_AUDIO &&
+		     altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
 		    altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING ||
 		    altsd->bNumEndpoints < 1)
 			continue;
@@ -1985,7 +1974,7 @@
 		altno = altsd->bAlternateSetting;

 		/* get audio formats */
-		fmt = snd_usb_find_csint_desc(buffer, buflen, NULL, AS_GENERAL, iface_no, altno);
+		fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, AS_GENERAL);
 		if (!fmt) {
 			snd_printk(KERN_ERR "%d:%u:%d : AS_GENERAL descriptor not found\n",
 				   dev->devnum, iface_no, altno);
@@ -2001,7 +1990,7 @@
 		format = (fmt[6] << 8) | fmt[5]; /* remember the format value */

 		/* get format type */
-		fmt = snd_usb_find_csint_desc(buffer, buflen, NULL, FORMAT_TYPE, iface_no, altno);
+		fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, FORMAT_TYPE);
 		if (!fmt) {
 			snd_printk(KERN_ERR "%d:%u:%d : no FORMAT_TYPE desc\n",
 				   dev->devnum, iface_no, altno);
@@ -2031,7 +2020,7 @@
 			continue;
 		}

-		csep = snd_usb_find_desc(buffer, buflen, NULL, USB_DT_CS_ENDPOINT, iface_no, altno);
+		csep = snd_usb_find_desc(alts->endpoint[0].extra, alts->endpoint[0].extralen, NULL, USB_DT_CS_ENDPOINT);
 		if (!csep || csep[0] < 7 || csep[2] != EP_GENERAL) {
 			snd_printk(KERN_ERR "%d:%u:%d : no or invalid class specific endpoint descriptor\n",
 				   dev->devnum, iface_no, altno);
@@ -2119,17 +2108,19 @@
 /*
  * parse audio control descriptor and create pcm/midi streams
  */
-static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif,
-				  unsigned char *buffer, int buflen)
+static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif)
 {
 	struct usb_device *dev = chip->dev;
 	struct usb_host_config *config;
+	struct usb_host_interface *host_iface;
 	struct usb_interface *iface;
 	unsigned char *p1;
 	int i, j;

 	/* find audiocontrol interface */
-	if (!(p1 = snd_usb_find_csint_desc(buffer, buflen, NULL, HEADER, ctrlif, -1))) {
+	config = dev->actconfig;
+	host_iface = &config->interface[ctrlif].altsetting[0];
+	if (!(p1 = snd_usb_find_csint_desc(host_iface->extra, host_iface->extralen, NULL, HEADER))) {
 		snd_printk(KERN_ERR "cannot find HEADER\n");
 		return -EINVAL;
 	}
@@ -2141,7 +2132,6 @@
 	/*
 	 * parse all USB audio streaming interfaces
 	 */
-	config = dev->actconfig;
 	for (i = 0; i < p1[7]; i++) {
 		struct usb_host_interface *alts;
 		struct usb_interface_descriptor *altsd;
@@ -2158,7 +2148,8 @@
 		}
 		alts = &iface->altsetting[0];
 		altsd = get_iface_desc(alts);
-		if (altsd->bInterfaceClass == USB_CLASS_AUDIO &&
+		if ((altsd->bInterfaceClass == USB_CLASS_AUDIO ||
+		     altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) &&
 		    altsd->bInterfaceSubClass == USB_SUBCLASS_MIDI_STREAMING) {
 			if (snd_usb_create_midi_interface(chip, iface, NULL) < 0) {
 				snd_printk(KERN_ERR "%d:%u:%d: cannot create sequencer device\n", dev->devnum, ctrlif, j);
@@ -2167,13 +2158,14 @@
 			usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L);
 			continue;
 		}
-		if (altsd->bInterfaceClass != USB_CLASS_AUDIO ||
+		if ((altsd->bInterfaceClass != USB_CLASS_AUDIO &&
+		     altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
 		    altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING) {
 			snd_printdd(KERN_ERR "%d:%u:%d: skipping non-supported interface %d\n", dev->devnum, ctrlif, j, altsd->bInterfaceClass);
 			/* skip non-supported classes */
 			continue;
 		}
-		if (! parse_audio_endpoints(chip, buffer, buflen, j)) {
+		if (! parse_audio_endpoints(chip, j)) {
 			usb_set_interface(dev, j, 0); /* reset the current interface */
 			usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L);
 		}
@@ -2213,6 +2205,40 @@
 	return 0;
 }

+/*
+ * create a stream for an interface with proper descriptors
+ */
+static int create_standard_interface_quirk(snd_usb_audio_t *chip,
+					   struct usb_interface *iface)
+{
+	struct usb_host_interface *alts;
+	struct usb_interface_descriptor *altsd;
+	int err;
+
+	alts = &iface->altsetting[0];
+	altsd = get_iface_desc(alts);
+	switch (altsd->bInterfaceSubClass) {
+	case USB_SUBCLASS_AUDIO_STREAMING:
+		err = parse_audio_endpoints(chip, altsd->bInterfaceNumber);
+		if (!err)
+			usb_set_interface(chip->dev, altsd->bInterfaceNumber, 0); /* reset the current interface */
+		break;
+	case USB_SUBCLASS_MIDI_STREAMING:
+		err = snd_usb_create_midi_interface(chip, iface, NULL);
+		break;
+	default:
+		snd_printk(KERN_ERR "if %d: non-supported subclass %d\n",
+			   altsd->bInterfaceNumber, altsd->bInterfaceSubClass);
+		return -ENODEV;
+	}
+	if (err < 0) {
+		snd_printk(KERN_ERR "cannot setup if %d: error %d\n",
+			   altsd->bInterfaceNumber, err);
+		return err;
+	}
+	return 0;
+}
+
 static int snd_usb_create_quirk(snd_usb_audio_t *chip,
 				struct usb_interface *iface,
 				const snd_usb_audio_quirk_t *quirk);
@@ -2296,6 +2322,8 @@
 		return create_composite_quirk(chip, iface, quirk);
 	case QUIRK_AUDIO_FIXED_ENDPOINT:
 		return create_fixed_stream_quirk(chip, iface, quirk);
+	case QUIRK_STANDARD_INTERFACE:
+		return create_standard_interface_quirk(chip, iface);
 	default:
 		snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type);
 		return -ENXIO;
@@ -2413,42 +2441,6 @@


 /*
- * allocate and get description buffer
- * must be freed later.
- */
-static int alloc_desc_buffer(struct usb_device *dev, int index, unsigned char **bufptr)
-{
-	int err, buflen;
-	unsigned char buf[8];
-	unsigned char *buffer;
-
-	*bufptr = 0;
-	err = usb_get_descriptor(dev, USB_DT_CONFIG, index, buf, 8);
-	if (err < 0) {
-		snd_printk(KERN_ERR "%d:%d: cannot get first 8 bytes\n", index, dev->devnum);
-		return err;
-	}
-	if (buf[1] != USB_DT_CONFIG || buf[0] < 9) {
-		snd_printk(KERN_ERR "%d:%d: invalid config desc\n", index, dev->devnum);
-		return -EINVAL;
-	}
-	buflen = combine_word(&buf[2]);
-	if (!(buffer = kmalloc(buflen, GFP_KERNEL))) {
-		snd_printk(KERN_ERR "cannot malloc descriptor (size = %d)\n", buflen);
-		return -ENOMEM;
-	}
-	err = usb_get_descriptor(dev, USB_DT_CONFIG, index, buffer, buflen);
-	if (err < 0) {
-		snd_printk(KERN_ERR "%d:%d: cannot get DT_CONFIG: error %d\n", index, dev->devnum, err);
-		kfree(buffer);
-		return err;
-	}
-	*bufptr = buffer;
-	return buflen;
-}
-
-
-/*
  * probe the active usb device
  *
  * note that this can be called multiple times per a device, when it
@@ -2540,20 +2532,10 @@

 	if (err > 0) {
 		/* create normal USB audio interfaces */
-		unsigned char *buffer;
-		unsigned int index;
-		int buflen;
-
-		index = dev->actconfig - config;
-		buflen = alloc_desc_buffer(dev, index, &buffer);
-		if (buflen <= 0)
-			goto __error;
-		if (snd_usb_create_streams(chip, ifnum, buffer, buflen) < 0 ||
-		    snd_usb_create_mixer(chip, ifnum, buffer, buflen) < 0) {
-			kfree(buffer);
+		if (snd_usb_create_streams(chip, ifnum) < 0 ||
+		    snd_usb_create_mixer(chip, ifnum) < 0) {
 			goto __error;
 		}
-		kfree(buffer);
 	}

 	/* we are allowed to call snd_card_register() many times */
Index: alsa-kernel/usb/usbaudio.h
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.h,v
retrieving revision 1.15
diff -u -r1.15 usbaudio.h
--- alsa-kernel/usb/usbaudio.h	10 Feb 2003 17:59:50 -0000	1.15
+++ alsa-kernel/usb/usbaudio.h	28 Feb 2003 10:34:19 -0000
@@ -146,6 +146,7 @@
 /*
  * Information about devices with broken descriptors
  */
+
 #define QUIRK_ANY_INTERFACE -1

 #define QUIRK_MIDI_FIXED_ENDPOINT	0
@@ -153,6 +154,7 @@
 #define QUIRK_MIDI_MIDIMAN		2
 #define QUIRK_COMPOSITE			3
 #define QUIRK_AUDIO_FIXED_ENDPOINT	4
+#define QUIRK_STANDARD_INTERFACE	5

 #define QUIRK_BOOT_MASK			0x80
 #define QUIRK_BOOT_EXTIGY		(QUIRK_BOOT_MASK | 0)
@@ -185,6 +187,8 @@

 /* for QUIRK_AUDIO_FIXED_ENDPOINT, data points to an audioformat structure */

+/* for QUIRK_STANDARD_INTERFACE, data is NULL */
+
 /*
  */

@@ -194,10 +198,10 @@

 unsigned int snd_usb_combine_bytes(unsigned char *bytes, int size);

-void *snd_usb_find_desc(void *descstart, int desclen, void *after, u8 dtype, int iface, int altsetting);
-void *snd_usb_find_csint_desc(void *descstart, int desclen, void *after, u8 dsubtype, int iface, int altsetting);
+void *snd_usb_find_desc(void *descstart, int desclen, void *after, u8 dtype);
+void *snd_usb_find_csint_desc(void *descstart, int desclen, void *after, u8 dsubtype);

-int snd_usb_create_mixer(snd_usb_audio_t *chip, int ctrlif, unsigned char *buffer, int buflen);
+int snd_usb_create_mixer(snd_usb_audio_t *chip, int ctrlif);

 int snd_usb_create_midi_interface(snd_usb_audio_t *chip, struct usb_interface *iface, const snd_usb_audio_quirk_t *quirk);
 void snd_usbmidi_disconnect(struct list_head *p);
Index: alsa-kernel/usb/usbquirks.h
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbquirks.h,v
retrieving revision 1.17
diff -u -r1.17 usbquirks.h
--- alsa-kernel/usb/usbquirks.h	25 Feb 2003 17:04:43 -0000	1.17
+++ alsa-kernel/usb/usbquirks.h	28 Feb 2003 10:34:19 -0000
@@ -26,6 +26,11 @@
  * In a perfect world, this file would be empty.
  */

+/*
+ * Use this for devices where other interfaces are standard compliant,
+ * to prevent the quirk being applied to those interfaces. (To work with
+ * hotplugging, bDeviceClass must be set to USB_CLASS_PER_INTERFACE.)
+ */
 #define USB_DEVICE_VENDOR_SPEC(vend, prod) \
 	.match_flags = USB_DEVICE_ID_MATCH_VENDOR | \
 		       USB_DEVICE_ID_MATCH_PRODUCT | \
@@ -226,16 +231,10 @@
 },

 /*
- * Once upon a time people thought, "Wouldn't it be nice if there was a
- * standard for USB MIDI devices, so that device drivers would not be forced
- * to know about the quirks of specific devices?"  So Roland went ahead and
- * wrote the USB Device Class Definition for MIDI Devices, and the USB-IF
- * endorsed it, and now everybody designing USB MIDI devices does so in
- * agreement with this standard (or at least tries to).
+ * Roland/RolandED/Edirol devices
  *
- * And if you prefer a happy end, you can imagine that Roland devices set a
- * good example. Instead of being completely fucked up due to the lack of
- * class-specific descriptors.
+ * The USB MIDI Specification has been written by Roland,
+ * but a 100% conforming Roland device has yet to be found.
  */
 {
 	USB_DEVICE(0x0582, 0x0000),
@@ -507,15 +506,33 @@
 	}
 },
 {
-	USB_DEVICE_VENDOR_SPEC(0x0582, 0x0025),
+	/*
+	 * This quirk is for the "Advanced Driver" mode. If off, the UA-20
+	 * has ID 0x0026 and is standard compliant, but has only 16-bit PCM
+	 * and no MIDI.
+	 */
+	USB_DEVICE(0x0582, 0x0025),
 	.driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
 		.vendor_name = "EDIROL",
 		.product_name = "UA-20",
-		.ifnum = 3,
-		.type = QUIRK_MIDI_FIXED_ENDPOINT,
-		.data = & (const snd_usb_midi_endpoint_info_t) {
-			.out_cables = 0x0001,
-			.in_cables  = 0x0001
+		.ifnum = QUIRK_ANY_INTERFACE,
+		.type = QUIRK_COMPOSITE,
+		.data = & (const snd_usb_audio_quirk_t[]) {
+			{
+				.ifnum = 1,
+				.type = QUIRK_STANDARD_INTERFACE
+			},
+			{
+				.ifnum = 2,
+				.type = QUIRK_STANDARD_INTERFACE
+			},
+			{
+				.ifnum = 3,
+				.type = QUIRK_STANDARD_INTERFACE
+			},
+			{
+				.ifnum = -1
+			}
 		}
 	}
 },
Index: alsa-kernel/usb/usbmixer.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbmixer.c,v
retrieving revision 1.16
diff -u -r1.16 usbmixer.c
--- alsa-kernel/usb/usbmixer.c	31 Jan 2003 15:21:32 -0000	1.16
+++ alsa-kernel/usb/usbmixer.c	28 Feb 2003 11:28:08 -0000
@@ -182,7 +182,7 @@

 	p = NULL;
 	while ((p = snd_usb_find_desc(state->buffer, state->buflen, p,
-				      USB_DT_CS_INTERFACE, state->ctrlif, -1)) != NULL) {
+				      USB_DT_CS_INTERFACE)) != NULL) {
 		if (p[0] >= 4 && p[2] >= INPUT_TERMINAL && p[2] <= EXTENSION_UNIT && p[3] == unit)
 			return p;
 	}
@@ -1462,20 +1462,21 @@
  *
  * walk through all OUTPUT_TERMINAL descriptors to search for mixers
  */
-int snd_usb_create_mixer(snd_usb_audio_t *chip, int ctrlif, unsigned char *buffer, int buflen)
+int snd_usb_create_mixer(snd_usb_audio_t *chip, int ctrlif)
 {
 	unsigned char *desc;
 	mixer_build_t state;
 	int err;
 	const struct usbmix_ctl_map *map;
 	struct usb_device_descriptor *dev = &chip->dev->descriptor;
+	struct usb_host_interface *hostif = &chip->dev->actconfig->interface[ctrlif].altsetting[0];

 	strcpy(chip->card->mixername, "USB Mixer");

 	memset(&state, 0, sizeof(state));
 	state.chip = chip;
-	state.buffer = buffer;
-	state.buflen = buflen;
+	state.buffer = hostif->extra;
+	state.buflen = hostif->extralen;
 	state.ctrlif = ctrlif;
 	state.vendor = dev->idVendor;
 	state.product = dev->idProduct;
@@ -1489,7 +1490,7 @@
 	}

 	desc = NULL;
-	while ((desc = snd_usb_find_csint_desc(buffer, buflen, desc, OUTPUT_TERMINAL, ctrlif, -1)) != NULL) {
+	while ((desc = snd_usb_find_csint_desc(hostif->extra, hostif->extralen, desc, OUTPUT_TERMINAL)) != NULL) {
 		if (desc[0] < 9)
 			continue; /* invalid descriptor? */
 		set_bit(desc[3], state.unitbitmap);  /* mark terminal ID as visited */




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: [PATCH] Edirol UA-20 PCM support
  2003-02-28 11:33           ` Clemens Ladisch
@ 2003-02-28 14:55             ` Takashi Iwai
  2003-03-01 14:31               ` C++ driver ? Giuliano Pochini
  2003-02-28 22:23             ` [PATCH] Edirol UA-20 PCM support Frank Barknecht
  1 sibling, 1 reply; 18+ messages in thread
From: Takashi Iwai @ 2003-02-28 14:55 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: alsa-devel

At Fri, 28 Feb 2003 12:33:02 +0100 (MET),
Clemens Ladisch wrote:
> 
> Takashi Iwai wrote:
> > could you resend the patch if finished?
> 
> The new parsing code works with my device (UA-1A), but I couldn't test the
> changes for the mixer and the UA-20.
> 
> 
> - removed buffer allocation for class-specific descriptors; get them from
>   intf->extra and ep->extra.

that's nice.

> - accept USB_CLASS_VENDOR_SPECIFIC when parsing audio interfaces
> - added quirk type for interfaces having standard descriptors
> - added quirk for UA-20

thanks, applied to cvs.
seems working fine with my usb-speaker.


Takashi


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: [PATCH] Edirol UA-20 PCM support
  2003-02-28 11:33           ` Clemens Ladisch
  2003-02-28 14:55             ` Takashi Iwai
@ 2003-02-28 22:23             ` Frank Barknecht
  1 sibling, 0 replies; 18+ messages in thread
From: Frank Barknecht @ 2003-02-28 22:23 UTC (permalink / raw)
  To: alsa-devel

Hallo,
Clemens Ladisch hat gesagt: // Clemens Ladisch wrote:
> The new parsing code works with my device (UA-1A), but I couldn't test the
> changes for the mixer and the UA-20.

I'm sorry, that I cannot test this anymore on the UA-20 that was mine until
today, 11:00 :( when I sent it back.

But I'd still like to thank you Clemens, for the work you did on that
driver. I hope, the next buyer can use the UA-20 which in general
seemed to be a nice interface - but it's just 2-channel...

ciao
-- 
 Frank Barknecht                               _ ______footils.org__


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* C++ driver ?
  2003-02-28 14:55             ` Takashi Iwai
@ 2003-03-01 14:31               ` Giuliano Pochini
  2003-03-01 22:36                 ` David Olofson
  0 siblings, 1 reply; 18+ messages in thread
From: Giuliano Pochini @ 2003-03-01 14:31 UTC (permalink / raw)
  To: alsa-devel

Is there any chance to write a driver in C++ ?  I'll get an Echoaudio
card soon, so I started to study the "Writing an ALSA driver" tutorial
by T.Iwai and the C++ sources of the generic driver by Echoaudio. That
drivers do not use exceptions (VVindos don't like it), but things as
simple as a "new" do not work in kernel context. Did someone write a C++
support library or I have to convert everything to C ? Suggestions are
welcome...


Bye.




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: C++ driver ?
  2003-03-01 14:31               ` C++ driver ? Giuliano Pochini
@ 2003-03-01 22:36                 ` David Olofson
  2003-03-02 16:25                   ` Giuliano Pochini
  2003-03-02 18:07                   ` How to compile ? Giuliano Pochini
  0 siblings, 2 replies; 18+ messages in thread
From: David Olofson @ 2003-03-01 22:36 UTC (permalink / raw)
  To: alsa-devel

On Saturday 01 March 2003 15.31, Giuliano Pochini wrote:
> Is there any chance to write a driver in C++ ?  I'll get an
> Echoaudio card soon, so I started to study the "Writing an ALSA
> driver" tutorial by T.Iwai and the C++ sources of the generic
> driver by Echoaudio. That drivers do not use exceptions (VVindos
> don't like it), but things as simple as a "new" do not work in
> kernel context. Did someone write a C++ support library or I have
> to convert everything to C ? Suggestions are welcome...

I've done some C++ in kernel space (RTLinux), but the short story: I 
wouldn't recommend it, and I don't think anything complex enough to 
really warrant the use of C++ should live in kernel space anyway.

Either way, I've been looking at that driver too, and intend to turn 
it into an ALSA driver, one way or another. There will be no C++; 
I'll either convert the code, or write a new driver.

I only have a Layla20, so I'm not sure what to do with the rest. Seems 
like the code for all of the cards is very similar, but I'll have to 
look harder to be sure, since each driver is a separate subclass, 
with lots of code that appears to be pretty much copy/pasted.


Of course, I don't know how much longer Real Life and other projects 
will keep me from getting started with this. I just won't start yet 
another project with a bunch of others in a state of "to be released 
RSN". Too much task switching overhead. ;-)

If someone beats me to it, I'll do what I can to help out.


//David Olofson - Programmer, Composer, Open Source Advocate

.- The Return of Audiality! --------------------------------.
| Free/Open Source Audio Engine for use in Games or Studio. |
| RT and off-line synth. Scripting. Sample accurate timing. |
`-----------------------------------> http://audiality.org -'
   --- http://olofson.net --- http://www.reologica.se ---



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: C++ driver ?
  2003-03-01 22:36                 ` David Olofson
@ 2003-03-02 16:25                   ` Giuliano Pochini
  2003-03-02 18:07                   ` How to compile ? Giuliano Pochini
  1 sibling, 0 replies; 18+ messages in thread
From: Giuliano Pochini @ 2003-03-02 16:25 UTC (permalink / raw)
  To: David Olofson; +Cc: alsa-devel

On sab, 2003-03-01 at 22:36, David Olofson wrote:
> I've done some C++ in kernel space (RTLinux), but the short story: I
> wouldn't recommend it, and I don't think anything complex enough to
> really warrant the use of C++ should live in kernel space anyway.

Yes, I know, but possibly I would like to use that drivers, at least to
make my card work in acceptable amount of time. I cannot convert 740KB
of code quickly. I had a look at the code and it's mostly usable, IF
there are no C/C++link problems. Are there any ? That generic driver is
not completely generic because ::operator new/delete is not defined in
all objects.

> Of course, I don't know how much longer Real Life and other projects
> will keep me from getting started with this. I just won't start yet
> another project with a bunch of others in a state of "to be released
> RSN". Too much task switching overhead. ;-)
>
> If someone beats me to it, I'll do what I can to help out.

I already started working on it... ehm, take into account I've never
written a line of alsa code before yearstday :). But I want to make my
new expensive toy work asap.

Bye.




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* How to compile ?
  2003-03-01 22:36                 ` David Olofson
  2003-03-02 16:25                   ` Giuliano Pochini
@ 2003-03-02 18:07                   ` Giuliano Pochini
  2003-03-02 19:24                     ` Jaroslav Kysela
  1 sibling, 1 reply; 18+ messages in thread
From: Giuliano Pochini @ 2003-03-02 18:07 UTC (permalink / raw)
  To: alsa-devel

I wrote a very minimal driver that does nothing and I put it
in /pci directory. How do I compile it ?

Bye.




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: How to compile ?
  2003-03-02 18:07                   ` How to compile ? Giuliano Pochini
@ 2003-03-02 19:24                     ` Jaroslav Kysela
  2003-03-03  8:21                       ` Giuliano Pochini
  0 siblings, 1 reply; 18+ messages in thread
From: Jaroslav Kysela @ 2003-03-02 19:24 UTC (permalink / raw)
  To: Giuliano Pochini; +Cc: alsa-devel@lists.sourceforge.net

On 2 Mar 2003, Giuliano Pochini wrote:

> I wrote a very minimal driver that does nothing and I put it
> in /pci directory. How do I compile it ?

alsa-driver or alsa-kernel ? I recommend using alsa-driver directory for 
tests.

1) update Makefile (see ALSA extra code section)
2) add module dependency definition to alsa-driver/utils/Modules.dep
3) check alsa-driver/acore/Makefile to add missing dependencies

						Jaroslav

-----
Jaroslav Kysela <perex@suse.cz>
Linux Kernel Sound Maintainer
ALSA Project, SuSE Labs



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: How to compile ?
  2003-03-02 19:24                     ` Jaroslav Kysela
@ 2003-03-03  8:21                       ` Giuliano Pochini
  2003-03-03  9:32                         ` Martin Langer
  0 siblings, 1 reply; 18+ messages in thread
From: Giuliano Pochini @ 2003-03-03  8:21 UTC (permalink / raw)
  To: Jaroslav Kysela; +Cc: alsa-devel@lists.sourceforge.net


On 02-Mar-2003 Jaroslav Kysela wrote:
> On 2 Mar 2003, Giuliano Pochini wrote:
> 
>> I wrote a very minimal driver that does nothing and I put it
>> in /pci directory. How do I compile it ?
> 
> alsa-driver or alsa-kernel ? I recommend using alsa-driver directory for 
> tests.

Driver. What is alsa-kernel ? :))

> 1) update Makefile (see ALSA extra code section)
> 2) add module dependency definition to alsa-driver/utils/Modules.dep
> 3) check alsa-driver/acore/Makefile to add missing dependencies

Tnx.



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

* Re: How to compile ?
  2003-03-03  8:21                       ` Giuliano Pochini
@ 2003-03-03  9:32                         ` Martin Langer
  0 siblings, 0 replies; 18+ messages in thread
From: Martin Langer @ 2003-03-03  9:32 UTC (permalink / raw)
  To: Giuliano Pochini, alsa-devel

On Mon, Mar 03, 2003 at 09:21:24AM +0100, Giuliano Pochini wrote:
> 
> 
> What is alsa-kernel ? :))
> 

alsa soundcard drivers, which are also part of the linux-2.5.x kernel tree


bye,
martin


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

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

end of thread, other threads:[~2003-03-03  9:32 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-02-24 10:24 [PATCH] Edirol UA-20 PCM support Clemens Ladisch
2003-02-24 12:23 ` Frank Barknecht
2003-02-24 12:58   ` Frank Barknecht
2003-02-24 13:12   ` Clemens Ladisch
2003-02-24 14:39     ` Frank Barknecht
2003-02-24 17:17       ` Clemens Ladisch
2003-02-25 10:24         ` Takashi Iwai
2003-02-25 11:53           ` Clemens Ladisch
2003-02-28 11:33           ` Clemens Ladisch
2003-02-28 14:55             ` Takashi Iwai
2003-03-01 14:31               ` C++ driver ? Giuliano Pochini
2003-03-01 22:36                 ` David Olofson
2003-03-02 16:25                   ` Giuliano Pochini
2003-03-02 18:07                   ` How to compile ? Giuliano Pochini
2003-03-02 19:24                     ` Jaroslav Kysela
2003-03-03  8:21                       ` Giuliano Pochini
2003-03-03  9:32                         ` Martin Langer
2003-02-28 22:23             ` [PATCH] Edirol UA-20 PCM support Frank Barknecht

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.