Update of /cvsroot/alsa/alsa-kernel/usb
In directory sc8-pr-cvs1:/tmp/cvs-serv22817/usb
Modified Files:
usbaudio.c
Log Message:
- added async_unlink option.
the default bahevior is not changed yet.
- added some comments.
Index: usbaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.c,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -r1.67 -r1.68
--- usbaudio.c 23 Oct 2003 14:34:53 -0000 1.67
+++ usbaudio.c 13 Nov 2003 11:20:20 -0000 1.68
@@ -23,6 +23,19 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ *
+ * NOTES:
+ *
+ * - async unlink should be used for avoiding the sleep inside lock.
+ * however, it causes oops by unknown reason on usb-uhci, and
+ * disabled as default. the feature is enabled by async_unlink=1
+ * option (especially when preempt is used).
+ * - the linked URBs would be preferred but not used so far because of
+ * the instability of unlinking.
+ * - type II is not supported properly. there is no device which supports
+ * this type *correctly*. SB extigy looks as if it supports, but it's
+ * indeed an AC3 stream packed in SPDIF frames (i.e. no real AC3 stream).
*/
@@ -56,6 +69,7 @@
static int vid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 }; /* Vendor ID for this
card */
static int pid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 }; /* Product ID for
this card */
static int nrpacks = 4; /* max. number of packets per urb */
+static int async_unlink = 0;
MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
MODULE_PARM_DESC(index, "Index value for the USB audio adapter.");
@@ -75,21 +89,9 @@
MODULE_PARM(nrpacks, "i");
MODULE_PARM_DESC(nrpacks, "Max. number of packets per URB.");
MODULE_PARM_SYNTAX(nrpacks, SNDRV_ENABLED ",allows:{{2,10}}");
-
-
-/*
- * for using ASYNC unlink mode, define the following.
- * this will make the driver quicker response for request to STOP-trigger,
- * but it may cause oops by some unknown reason (bug of usb driver?),
- * so turning off might be sure.
- */
-/* #define SND_USE_ASYNC_UNLINK */
-
-#ifdef SND_USB_ASYNC_UNLINK
-#define UNLINK_FLAGS URB_ASYNC_UNLINK
-#else
-#define UNLINK_FLAGS 0
-#endif
+MODULE_PARM(async_unlink, "i");
+MODULE_PARM_DESC(async_unlink, "Use async unlink mode.");
+MODULE_PARM_SYNTAX(async_unlink, SNDRV_BOOLEAN_TRUE_DESC);
/*
@@ -617,42 +619,51 @@
* unlink active urbs.
* return the number of active urbs.
*/
-static int deactivate_urbs(snd_usb_substream_t *subs, int force)
+static int deactivate_urbs(snd_usb_substream_t *subs, int force, int can_sleep)
{
unsigned int i;
- int alive;
+ int alive, async;
subs->running = 0;
if (!force && subs->stream->chip->shutdown) /* to be sure... */
return 0;
-#ifndef SND_USB_ASYNC_UNLINK
- if (in_interrupt())
+ async = !can_sleep && async_unlink;
+
+ if (! async && in_interrupt())
return 0;
-#endif
+
alive = 0;
for (i = 0; i < subs->nurbs; i++) {
if (test_bit(i, &subs->active_mask)) {
alive++;
- if (! test_and_set_bit(i, &subs->unlink_mask))
- usb_unlink_urb(subs->dataurb[i].urb);
+ if (! test_and_set_bit(i, &subs->unlink_mask)) {
+ struct urb *u = subs->dataurb[i].urb;
+ if (async)
+ u->transfer_flags |= URB_ASYNC_UNLINK;
+ else
+ u->transfer_flags &= ~URB_ASYNC_UNLINK;
+ usb_unlink_urb(u);
+ }
}
}
if (subs->syncpipe) {
for (i = 0; i < SYNC_URBS; i++) {
if (test_bit(i+16, &subs->active_mask)) {
alive++;
- if (! test_and_set_bit(i+16, &subs->unlink_mask))
- usb_unlink_urb(subs->syncurb[i].urb);
+ if (! test_and_set_bit(i+16, &subs->unlink_mask)) {
+ struct urb *u = subs->syncurb[i].urb;
+ if (async)
+ u->transfer_flags |= URB_ASYNC_UNLINK;
+ else
+ u->transfer_flags &= ~URB_ASYNC_UNLINK;
+ usb_unlink_urb(u);
+ }
}
}
}
-#ifdef SND_USB_ASYNC_UNLINK
- return alive;
-#else
- return 0;
-#endif
+ return async ? alive : 0;
}
@@ -702,7 +713,7 @@
__error:
// snd_pcm_stop(subs->pcm_substream, SNDRV_PCM_STATE_XRUN);
- deactivate_urbs(subs, 0);
+ deactivate_urbs(subs, 0, 0);
return -EPIPE;
}
@@ -762,7 +773,7 @@
err = start_urbs(subs, substream->runtime);
break;
case SNDRV_PCM_TRIGGER_STOP:
- err = deactivate_urbs(subs, 0);
+ err = deactivate_urbs(subs, 0, 0);
break;
default:
err = -EINVAL;
@@ -795,7 +806,8 @@
int i;
/* stop urbs (to be sure) */
- if (deactivate_urbs(subs, force) > 0)
+ deactivate_urbs(subs, force, 1);
+ if (async_unlink)
wait_clear_urbs(subs);
for (i = 0; i < MAX_URBS; i++)
@@ -914,7 +926,7 @@
}
u->urb->dev = subs->dev;
u->urb->pipe = subs->datapipe;
- u->urb->transfer_flags = URB_ISO_ASAP | UNLINK_FLAGS;
+ u->urb->transfer_flags = URB_ISO_ASAP;
u->urb->number_of_packets = u->packets;
u->urb->context = u;
u->urb->complete = snd_usb_complete_callback(snd_complete_urb);
@@ -936,7 +948,7 @@
u->urb->transfer_buffer_length = nrpacks * 3;
u->urb->dev = subs->dev;
u->urb->pipe = subs->syncpipe;
- u->urb->transfer_flags = URB_ISO_ASAP | UNLINK_FLAGS;
+ u->urb->transfer_flags = URB_ISO_ASAP;
u->urb->number_of_packets = u->packets;
u->urb->context = u;
u->urb->complete =
snd_usb_complete_callback(snd_complete_sync_urb);
-------------------------------------------------------
This SF.Net email sponsored by: ApacheCon 2003,
16-19 November in Las Vegas. Learn firsthand the latest
developments in Apache, PHP, Perl, XML, Java, MySQL,
WebDAV, and more! http://www.apachecon.com/
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog