• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

linux-3.0.x for AP-SH4A-0A Board


Commit MetaInfo

Revision8adf76d75e7ed6d30c4aa598bf8ac51de50f3adb (tree)
Time2011-08-18 02:55:53
AuthorDaniel Mack <zonque@gmai...>
CommiterGreg Kroah-Hartman

Log Message

ALSA: snd-usb-caiaq: Correct offset fields of outbound iso_frame_desc

commit 15439bde3af7ff88459ea2b5520b77312e958df2 upstream.

This fixes faulty outbount packets in case the inbound packets
received from the hardware are fragmented and contain bogus input
iso frames. The bug has been there for ages, but for some strange
reasons, it was only triggered by newer machines in 64bit mode.

Signed-off-by: Daniel Mack <zonque@gmail.com>
Reported-and-tested-by: William Light <wrl@illest.net>
Reported-by: Pedro Ribeiro <pedrib@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

Change Summary

Incremental Difference

--- a/sound/usb/caiaq/audio.c
+++ b/sound/usb/caiaq/audio.c
@@ -614,6 +614,7 @@ static void read_completed(struct urb *urb)
614614 struct snd_usb_caiaqdev *dev;
615615 struct urb *out;
616616 int frame, len, send_it = 0, outframe = 0;
617+ size_t offset = 0;
617618
618619 if (urb->status || !info)
619620 return;
@@ -634,7 +635,8 @@ static void read_completed(struct urb *urb)
634635 len = urb->iso_frame_desc[outframe].actual_length;
635636 out->iso_frame_desc[outframe].length = len;
636637 out->iso_frame_desc[outframe].actual_length = 0;
637- out->iso_frame_desc[outframe].offset = BYTES_PER_FRAME * frame;
638+ out->iso_frame_desc[outframe].offset = offset;
639+ offset += len;
638640
639641 if (len > 0) {
640642 spin_lock(&dev->spinlock);
@@ -650,7 +652,7 @@ static void read_completed(struct urb *urb)
650652 }
651653
652654 if (send_it) {
653- out->number_of_packets = FRAMES_PER_URB;
655+ out->number_of_packets = outframe;
654656 out->transfer_flags = URB_ISO_ASAP;
655657 usb_submit_urb(out, GFP_ATOMIC);
656658 }