[PATCH] Repair snd-usb-usx2y for usb 2.6.18; Take 2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Takashi,

In 2.6.18 urb->start_frame rolls over beyond INT_MAX.
Without this patch, snd-usb-usx2y can not work on 2.6.18.

Patch is split into two parts:
 1) usx2y_usb2-6-18_stable-kernel.patch for stable kernel and
    stable alsa-kernel.

 2) usx2y_usb2-6-18_stable-driver.patch for stable alsa-driver.

2) needs 1) to be applied first.

      Karsten
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.

Signed-off-by: Karsten Wiese <annabellesgarden@xxxxxxxx>



--- ./alsa-kernel/usb/usx2y/usbusx2yaudio.c_	2006-06-29 23:25:30.000000000 +0200
+++ ./alsa-kernel/usb/usx2y/usbusx2yaudio.c	2006-10-03 15:25:55.000000000 +0200
@@ -322,7 +322,7 @@
 		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 @@
 		    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 @@
 		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 @@
 				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);
--- ./alsa-kernel/usb/usx2y/usx2yhwdeppcm.c_	2006-10-03 14:05:12.000000000 +0200
+++ ./alsa-kernel/usb/usx2y/usx2yhwdeppcm.c	2006-10-03 15:27:18.000000000 +0200
@@ -243,7 +243,7 @@
 		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 @@
 	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 @@
 		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 @@
 						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;
Repair snd-usb-usx2y for usb 2.6.18

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

Signed-off-by: Karsten Wiese <annabellesgarden@xxxxxxxx>



--- ./alsa-driver/usb/usx2y/usx2yhwdeppcm.patch_	2006-06-29 23:22:39.000000000 +0200
+++ ./alsa-driver/usb/usx2y/usx2yhwdeppcm.patch	2006-10-03 15:57:26.000000000 +0200
@@ -1,6 +1,6 @@
---- ../../alsa-kernel/usb/usx2y/usx2yhwdeppcm.c	2005-11-22 14:37:40.000000000 +0100
-+++ usx2yhwdeppcm.c	2005-11-22 14:40:52.000000000 +0100
-@@ -1,3 +1,14 @@
+--- ../../../alsa-kernel/usb/usx2y/usx2yhwdeppcm.c	2006-10-03 15:27:18.000000000 +0200
++++ usx2yhwdeppcm.c	2006-10-03 15:48:04.000000000 +0200
+@@ -1,3 +1,16 @@
 +#include <linux/config.h>
 +#include <linux/version.h>
 +
@@ -12,10 +12,12 @@
 +#define __NO_VERSION__
 +#endif
 +
++#define USB_2_6_18 (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18))
++
  /*
   *   This program is free software; you can redistribute it and/or modify
   *   it under the terms of the GNU General Public License as published by
-@@ -150,7 +161,11 @@
+@@ -150,7 +163,11 @@
  {
  	int pack;
  	for (pack = 0; pack < nr_of_packs(); ++pack) {
@@ -27,7 +29,7 @@
  		if (NULL != subs) {
  			struct snd_usX2Y_hwdep_pcm_shm *shm = subs->usX2Y->hwdep_pcm_shm;
  			int head = shm->captured_iso_head + 1;
-@@ -226,7 +241,11 @@
+@@ -226,7 +243,11 @@
  }
  
  
@@ -39,7 +41,39 @@
  {
  	struct snd_usX2Y_substream *subs = urb->context;
  	struct usX2Ydev *usX2Y = subs->usX2Y;
-@@ -294,7 +313,11 @@
+@@ -243,7 +264,11 @@
+ 		usX2Y_error_urb_status(usX2Y, subs, urb);
+ 		return;
+ 	}
+-	if (likely(urb->start_frame == usX2Y->wait_iso_frame))
++	if (likely((
++#if !USB_2_6_18
++			   0xFFFF &
++#endif
++			   urb->start_frame) == usX2Y->wait_iso_frame))
+ 		subs->completed_urb = urb;
+ 	else {
+ 		usX2Y_error_sequence(usX2Y, subs, urb);
+@@ -256,9 +281,15 @@
+ 	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))
+-			usX2Y->wait_iso_frame += nr_of_packs();
+-		else {
++		if (!usX2Y_usbpcm_usbframe_complete(capsubs, capsubs2, playbacksubs, urb->start_frame)) {
++#if !USB_2_6_18
++			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
++#endif
++				usX2Y->wait_iso_frame +=  nr_of_packs();
++		} else {
+ 			snd_printdd("\n");
+ 			usX2Y_clients_stop(usX2Y);
+ 		}
+@@ -290,7 +321,11 @@
  	usX2Y->prepare_subs = NULL;
  }
  
@@ -51,7 +85,7 @@
  {
  	struct snd_usX2Y_substream *subs = urb->context;
  	struct usX2Ydev *usX2Y = subs->usX2Y;
-@@ -311,7 +334,11 @@
+@@ -307,7 +342,11 @@
  		wake_up(&usX2Y->prepare_wait_queue);
  	}
  
@@ -63,7 +97,29 @@
  }
  
  /*
-@@ -688,23 +715,43 @@
+@@ -429,6 +468,9 @@
+ 		if (subs != NULL && atomic_read(&subs->state) >= state_PREPARED)
+ 			goto start;
+ 	}
++#if !USB_2_6_18
++	usX2Y->wait_iso_frame = -1;
++#endif
+ 
+  start:
+ 	usX2Y_usbpcm_subs_startup(subs);
+@@ -454,7 +496,11 @@
+ 						goto cleanup;
+ 					}  else {
+ 						snd_printdd("%i\n", urb->start_frame);
++#if USB_2_6_18
+ 						if (u == 0)
++#else
++						if (0 > usX2Y->wait_iso_frame)
++#endif
+ 							usX2Y->wait_iso_frame = urb->start_frame;
+ 					}
+ 					urb->transfer_flags = 0;
+@@ -683,23 +729,43 @@
  }
  
  
@@ -108,7 +164,7 @@
  }
  
  
-@@ -733,8 +780,14 @@
+@@ -728,8 +794,14 @@
  		return -ENODEV;
  	}
  	area->vm_ops = &snd_usX2Y_hwdep_pcm_vm_ops;
--- ./alsa-driver/usb/usx2y/usbusx2yaudio.patch_	2006-06-29 23:22:39.000000000 +0200
+++ ./alsa-driver/usb/usx2y/usbusx2yaudio.patch	2006-10-03 15:54:50.000000000 +0200
@@ -1,6 +1,16 @@
---- ../../alsa-kernel/usb/usx2y/usbusx2yaudio.c	2005-11-13 15:20:50.000000000 +0100
-+++ usbusx2yaudio.c	2005-11-13 19:07:00.000000000 +0100
-@@ -306,7 +306,11 @@
+--- ../../../alsa-kernel/usb/usx2y/usbusx2yaudio.c	2006-10-03 15:25:55.000000000 +0200
++++ usbusx2yaudio.c	2006-10-03 15:40:49.000000000 +0200
+@@ -67,6 +67,9 @@
+ #endif
+ 
+ 
++#define USB_2_6_18 (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18))
++
++
+ static int usX2Y_urb_capt_retire(struct snd_usX2Y_substream *subs)
+ {
+ 	struct urb	*urb = subs->completed_urb;
+@@ -306,7 +309,11 @@
  	usX2Y_clients_stop(usX2Y);
  }
  
@@ -12,7 +22,39 @@
  {
  	struct snd_usX2Y_substream *subs = urb->context;
  	struct usX2Ydev *usX2Y = subs->usX2Y;
-@@ -349,8 +353,12 @@
+@@ -322,7 +329,11 @@
+ 		usX2Y_error_urb_status(usX2Y, subs, urb);
+ 		return;
+ 	}
+-	if (likely(urb->start_frame == usX2Y->wait_iso_frame))
++	if (likely((
++#if !USB_2_6_18
++			   0xFFFF &
++#endif
++			   urb->start_frame) == usX2Y->wait_iso_frame))
+ 		subs->completed_urb = urb;
+ 	else {
+ 		usX2Y_error_sequence(usX2Y, subs, urb);
+@@ -335,9 +346,15 @@
+ 		    atomic_read(&capsubs->state) >= state_PREPARED &&
+ 		    (playbacksubs->completed_urb ||
+ 		     atomic_read(&playbacksubs->state) < state_PREPARED)) {
+-			if (!usX2Y_usbframe_complete(capsubs, playbacksubs, urb->start_frame))
+-				usX2Y->wait_iso_frame += nr_of_packs();
+-			else {
++			if (!usX2Y_usbframe_complete(capsubs, playbacksubs, urb->start_frame)) {
++#if !USB_2_6_18
++				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
++#endif
++					usX2Y->wait_iso_frame +=  nr_of_packs();
++			} else {
+ 				snd_printdd("\n");
+ 				usX2Y_clients_stop(usX2Y);
+ 			}
+@@ -345,8 +362,12 @@
  	}
  }
  
@@ -25,7 +67,7 @@
  {
  	int s, u;
  	for (s = 0; s < 4; s++) {
-@@ -370,7 +378,11 @@
+@@ -366,7 +387,11 @@
  	usX2Y->prepare_subs = NULL;
  }
  
@@ -37,7 +79,7 @@
  {
  	struct snd_usX2Y_substream *subs = urb->context;
  	struct usX2Ydev *usX2Y = subs->usX2Y;
-@@ -382,7 +394,11 @@
+@@ -378,7 +403,11 @@
  			wake_up(&usX2Y->prepare_wait_queue);
  		}
  
@@ -49,7 +91,30 @@
  }
  
  static void usX2Y_subs_prepare(struct snd_usX2Y_substream *subs)
-@@ -663,7 +679,11 @@
+@@ -491,7 +520,9 @@
+ 		if (subs != NULL && atomic_read(&subs->state) >= state_PREPARED)
+ 			goto start;
+ 	}
+-
++#if !USB_2_6_18
++	usX2Y->wait_iso_frame = -1;
++#endif
+  start:
+ 	usX2Y_subs_startup(subs);
+ 	for (i = 0; i < NRURBS; i++) {
+@@ -512,7 +543,11 @@
+ 				err = -EPIPE;
+ 				goto cleanup;
+ 			} else
++#if USB_2_6_18
+ 				if (i == 0)
++#else
++				if (0 > usX2Y->wait_iso_frame)
++#endif
+ 					usX2Y->wait_iso_frame = urb->start_frame;
+ 			urb->transfer_flags = 0;
+ 		} else {
+@@ -657,7 +692,11 @@
  };
  #define NOOF_SETRATE_URBS ARRAY_SIZE(SetRate48000)
  
@@ -61,7 +126,7 @@
  {
  	struct usX2Ydev *usX2Y = urb->context;
  	
-@@ -1023,10 +1043,18 @@
+@@ -1017,10 +1056,18 @@
  
  	if (0 > (err = usX2Y_audio_stream_new(card, 0xA, 0x8)))
  		return err;
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux