]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
[PATCH] ALSA: Repair snd-usb-usx2y for usb 2.6.18
authorKarsten Wiese <annabellesgarden@yahoo.de>
Mon, 16 Oct 2006 12:46:53 +0000 (14:46 +0200)
committerChris Wright <chrisw@sous-sol.org>
Sat, 4 Nov 2006 01:33:45 +0000 (17:33 -0800)
ALSA: Repair snd-usb-usx2y for usb 2.6.18

urb->start_frame rolls over beyond MAX_INT now.
This is for stable kernel and stable alsa.

From: Karsten Wiese <annabellesgarden@yahoo.de>
Signed-off-by: Karsten Wiese <annabellesgarden@yahoo.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
sound/usb/usx2y/usbusx2yaudio.c
sound/usb/usx2y/usx2yhwdeppcm.c

index f6bd0dee563ce3a7f7b242315e1f766ae26988c2..8d2f26db58ac113e44d6d0412a475034a67eb5d7 100644 (file)
@@ -322,7 +322,7 @@ static void i_usX2Y_urb_complete(struct urb *urb, struct pt_regs *regs)
                usX2Y_error_urb_status(usX2Y, subs, urb);
                return;
        }
-       if (likely((0xFFFF & urb->start_frame) == usX2Y->wait_iso_frame))
+       if (likely(urb->start_frame == usX2Y->wait_iso_frame))
                subs->completed_urb = urb;
        else {
                usX2Y_error_sequence(usX2Y, subs, urb);
@@ -335,13 +335,9 @@ static void i_usX2Y_urb_complete(struct urb *urb, struct pt_regs *regs)
                    atomic_read(&capsubs->state) >= state_PREPARED &&
                    (playbacksubs->completed_urb ||
                     atomic_read(&playbacksubs->state) < state_PREPARED)) {
-                       if (!usX2Y_usbframe_complete(capsubs, playbacksubs, urb->start_frame)) {
-                               if (nr_of_packs() <= urb->start_frame &&
-                                   urb->start_frame <= (2 * nr_of_packs() - 1))        // uhci and ohci
-                                       usX2Y->wait_iso_frame = urb->start_frame - nr_of_packs();
-                               else
-                                       usX2Y->wait_iso_frame +=  nr_of_packs();
-                       } else {
+                       if (!usX2Y_usbframe_complete(capsubs, playbacksubs, urb->start_frame))
+                               usX2Y->wait_iso_frame += nr_of_packs();
+                       else {
                                snd_printdd("\n");
                                usX2Y_clients_stop(usX2Y);
                        }
@@ -495,7 +491,6 @@ static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs)
                if (subs != NULL && atomic_read(&subs->state) >= state_PREPARED)
                        goto start;
        }
-       usX2Y->wait_iso_frame = -1;
 
  start:
        usX2Y_subs_startup(subs);
@@ -516,10 +511,9 @@ static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs)
                                snd_printk (KERN_ERR "cannot submit datapipe for urb %d, err = %d\n", i, err);
                                err = -EPIPE;
                                goto cleanup;
-                       } else {
-                               if (0 > usX2Y->wait_iso_frame)
+                       } else
+                               if (i == 0)
                                        usX2Y->wait_iso_frame = urb->start_frame;
-                       }
                        urb->transfer_flags = 0;
                } else {
                        atomic_set(&subs->state, state_STARTING1);
index 605ac5bb9255ab66e27e6a9541868398d0785b81..3bda17de25bf54258ebac9f91e0bdc4e6a59d483 100644 (file)
@@ -243,7 +243,7 @@ static void i_usX2Y_usbpcm_urb_complete(struct urb *urb, struct pt_regs *regs)
                usX2Y_error_urb_status(usX2Y, subs, urb);
                return;
        }
-       if (likely((0xFFFF & urb->start_frame) == usX2Y->wait_iso_frame))
+       if (likely(urb->start_frame == usX2Y->wait_iso_frame))
                subs->completed_urb = urb;
        else {
                usX2Y_error_sequence(usX2Y, subs, urb);
@@ -256,13 +256,9 @@ static void i_usX2Y_usbpcm_urb_complete(struct urb *urb, struct pt_regs *regs)
        if (capsubs->completed_urb && atomic_read(&capsubs->state) >= state_PREPARED &&
            (NULL == capsubs2 || capsubs2->completed_urb) &&
            (playbacksubs->completed_urb || atomic_read(&playbacksubs->state) < state_PREPARED)) {
-               if (!usX2Y_usbpcm_usbframe_complete(capsubs, capsubs2, playbacksubs, urb->start_frame)) {
-                       if (nr_of_packs() <= urb->start_frame &&
-                           urb->start_frame <= (2 * nr_of_packs() - 1))        // uhci and ohci
-                               usX2Y->wait_iso_frame = urb->start_frame - nr_of_packs();
-                       else
-                               usX2Y->wait_iso_frame +=  nr_of_packs();
-               } else {
+               if (!usX2Y_usbpcm_usbframe_complete(capsubs, capsubs2, playbacksubs, urb->start_frame))
+                       usX2Y->wait_iso_frame += nr_of_packs();
+               else {
                        snd_printdd("\n");
                        usX2Y_clients_stop(usX2Y);
                }
@@ -433,7 +429,6 @@ static int usX2Y_usbpcm_urbs_start(struct snd_usX2Y_substream *subs)
                if (subs != NULL && atomic_read(&subs->state) >= state_PREPARED)
                        goto start;
        }
-       usX2Y->wait_iso_frame = -1;
 
  start:
        usX2Y_usbpcm_subs_startup(subs);
@@ -459,7 +454,7 @@ static int usX2Y_usbpcm_urbs_start(struct snd_usX2Y_substream *subs)
                                                goto cleanup;
                                        }  else {
                                                snd_printdd("%i\n", urb->start_frame);
-                                               if (0 > usX2Y->wait_iso_frame)
+                                               if (u == 0)
                                                        usX2Y->wait_iso_frame = urb->start_frame;
                                        }
                                        urb->transfer_flags = 0;