- don't clear active_mask bits until it's clear that the URB is _not_
resubmitted, to prevent a race with unlinking
- initialize active_mask and unlink_mask each time before URBs are
started
- don't call sleeping functions in trigger callback
Index: alsa-kernel/usb/usbaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.c,v
retrieving revision 1.70
diff -u -r1.70 usbaudio.c
--- alsa-kernel/usb/usbaudio.c 20 Nov 2003 16:08:26 -0000 1.70
+++ alsa-kernel/usb/usbaudio.c 24 Nov 2003 07:40:19 -0000
@@ -573,21 +573,18 @@
snd_urb_ctx_t *ctx = (snd_urb_ctx_t *)urb->context;
snd_usb_substream_t *subs = ctx->subs;
snd_pcm_substream_t *substream = ctx->subs->pcm_substream;
- int err;
+ int err = 0;
- clear_bit(ctx->index, &subs->active_mask);
- clear_bit(ctx->index, &subs->unlink_mask);
- if (subs->running && subs->ops.retire(subs, substream->runtime, urb))
- return;
- if (! subs->running) /* can be stopped during retire callback */
- return;
- if ((err = subs->ops.prepare(subs, substream->runtime, urb)) < 0 ||
+ if ((subs->running && subs->ops.retire(subs, substream->runtime, urb)) ||
+ ! subs->running || /* can be stopped during retire callback */
+ (err = subs->ops.prepare(subs, substream->runtime, urb)) < 0 ||
(err = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
- snd_printd(KERN_ERR "cannot submit urb (err = %d)\n", err);
- snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
- return;
+ clear_bit(ctx->index, &subs->active_mask);
+ if (err < 0) {
+ snd_printd(KERN_ERR "cannot submit urb (err = %d)\n", err);
+ snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
+ }
}
- set_bit(ctx->index, &subs->active_mask);
}
@@ -599,21 +596,18 @@
snd_urb_ctx_t *ctx = (snd_urb_ctx_t *)urb->context;
snd_usb_substream_t *subs = ctx->subs;
snd_pcm_substream_t *substream = ctx->subs->pcm_substream;
- int err;
+ int err = 0;
- clear_bit(ctx->index + 16, &subs->active_mask);
- clear_bit(ctx->index + 16, &subs->unlink_mask);
- if (subs->running && subs->ops.retire_sync(subs, substream->runtime, urb))
- return;
- if (! subs->running) /* can be stopped during retire callback */
- return;
- if ((err = subs->ops.prepare_sync(subs, substream->runtime, urb)) < 0 ||
+ if ((subs->running && subs->ops.retire_sync(subs, substream->runtime, urb)) ||
+ ! subs->running || /* can be stopped during retire callback */
+ (err = subs->ops.prepare_sync(subs, substream->runtime, urb)) < 0 ||
(err = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
- snd_printd(KERN_ERR "cannot submit sync urb (err = %d)\n", err);
- snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
- return;
+ clear_bit(ctx->index + 16, &subs->active_mask);
+ if (err < 0) {
+ snd_printd(KERN_ERR "cannot submit sync urb (err = %d)\n",
err);
+ snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
+ }
}
- set_bit(ctx->index + 16, &subs->active_mask);
}
@@ -694,9 +688,11 @@
}
}
+ subs->active_mask = 0;
+ subs->unlink_mask = 0;
subs->running = 1;
for (i = 0; i < subs->nurbs; i++) {
- if ((err = usb_submit_urb(subs->dataurb[i].urb, GFP_KERNEL)) < 0) {
+ if ((err = usb_submit_urb(subs->dataurb[i].urb, GFP_ATOMIC)) < 0) {
snd_printk(KERN_ERR "cannot submit datapipe for urb %d, err =
%d\n", i, err);
goto __error;
}
@@ -704,7 +700,7 @@
}
if (subs->syncpipe) {
for (i = 0; i < SYNC_URBS; i++) {
- if ((err = usb_submit_urb(subs->syncurb[i].urb, GFP_KERNEL)) <
0) {
+ if ((err = usb_submit_urb(subs->syncurb[i].urb, GFP_ATOMIC)) <
0) {
snd_printk(KERN_ERR "cannot submit syncpipe for urb
%d, err = %d\n", i, err);
goto __error;
}
@@ -843,8 +839,6 @@
subs->hwptr_done = 0;
subs->transfer_sched = 0;
subs->transfer_done = 0;
- subs->active_mask = 0;
- subs->unlink_mask = 0;
/* calculate the max. size of packet */
maxsize = ((subs->freqmax + 0x3fff) * (frame_bits >> 3)) >> 14;
@@ -1282,9 +1276,6 @@
/* some unit conversions in runtime */
subs->maxframesize = bytes_to_frames(runtime, subs->maxpacksize);
subs->curframesize = bytes_to_frames(runtime, subs->curpacksize);
-
- /* deactivate urbs to be sure */
- deactivate_urbs(subs, 0, 0);
return 0;
}
-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive? Does it
help you create better code? SHARE THE LOVE, and help us help
YOU! Click Here: http://sourceforge.net/donate/
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel