All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH]snd-usb-usx2y 0.5.1
@ 2004-01-16 21:26 Karsten Wiese
  2004-01-19 19:02 ` Takashi Iwai
  0 siblings, 1 reply; 2+ messages in thread
From: Karsten Wiese @ 2004-01-16 21:26 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel

[-- Attachment #1: Type: text/plain, Size: 80 bytes --]

Hi Takashi,

this lets it work on kernel 2.6.1.

please commit, thanks,
karsten

[-- Attachment #2: snd-usb-usx2y.patch.0.5.1 --]
[-- Type: text/x-diff, Size: 8942 bytes --]

Index: alsa-driver/usb/usx2y/usX2Yhwdep.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usx2y/usX2Yhwdep.c,v
retrieving revision 1.3
diff -u -r1.3 usX2Yhwdep.c
--- alsa-driver/usb/usx2y/usX2Yhwdep.c	13 Jan 2004 17:19:30 -0000	1.3
+++ alsa-driver/usb/usx2y/usX2Yhwdep.c	15 Jan 2004 23:22:37 -0000
@@ -37,7 +37,9 @@
 {
 }
 
-#ifndef LINUX_2_2
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
+static struct page * us428ctls_vm_nopage(struct vm_area_struct *area, unsigned long address, int *type)
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
 static struct page * us428ctls_vm_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
 #else
 static unsigned long us428ctls_vm_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
@@ -47,12 +49,11 @@
 	struct page * page;
 	void *vaddr;
 
-	snd_printd("ENTER, start %lXh, ofs %lXh, pgoff %ld, addr %lXh, wr %d\n",
+	snd_printd("ENTER, start %lXh, ofs %lXh, pgoff %ld, addr %lXh\n",
 		   area->vm_start,
 		   address - area->vm_start,
 		   (address - area->vm_start) >> PAGE_SHIFT,
-		   address,
-		   no_share);
+		   address);
 	
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 25)
 	offset = area->vm_pgoff << PAGE_SHIFT;
@@ -65,6 +66,12 @@
 	page = virt_to_page(vaddr);
 	get_page(page);
 	snd_printd( "vaddr=%p made us428ctls_vm_nopage() return %p; offset=%lX\n", vaddr, page, offset);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
+	if (type)
+		*type = VM_FAULT_MINOR;
+#endif
+
 #ifndef LINUX_2_2
 	return page;
 #else
@@ -303,6 +310,8 @@
 	}
 	if (!err  &&  1 == dsp->index)
 		do {
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule_timeout(HZ/4);			// give the device some time 
 			if ((err = snd_usX2Y_AsyncSeq04_init((usX2Ydev_t*)hw->private_data))) {
 				snd_printk("snd_usX2Y_AsyncSeq04_init error \n");
 				break;
Index: alsa-driver/usb/usx2y/usbusx2y.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usx2y/usbusx2y.c,v
retrieving revision 1.5
diff -u -r1.5 usbusx2y.c
--- alsa-driver/usb/usx2y/usbusx2y.c	30 Dec 2003 16:33:44 -0000	1.5
+++ alsa-driver/usb/usx2y/usbusx2y.c	15 Jan 2004 23:22:37 -0000
@@ -1,6 +1,10 @@
 /*
  * usbus428.c - ALSA USB US-428 Driver
  *
+2004-01-14 Karsten Wiese
+	Version 0.5.1:
+	Runs with 2.6.1 kernel.
+
 2003-12-30 Karsten Wiese
 	Version 0.4.1:
 	Fix 24Bit 4Channel capturing for the us428.
@@ -142,7 +146,7 @@
 	int			err = 0;
 	usX2Ydev_t		*usX2Y = urb->context;
 	us428ctls_sharedmem_t	*us428ctls = usX2Y->us428ctls_sharedmem;
-	
+
 	usX2Y->In04IntCalls++;
 
 	if (urb->status) {
@@ -210,6 +214,11 @@
 	if (err) {
 		snd_printk("In04Int() usb_submit_urb err=%i\n", err);
 	}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
+	urb->dev = usX2Y->chip.dev;
+	usb_submit_urb(urb, GFP_ATOMIC);
+#endif
 }
 
 static void snd_usX2Y_unlinkSeq(snd_usX2Y_AsyncSeq_t* S)
@@ -361,14 +370,16 @@
 	if (ptr) {
 		usX2Ydev_t* usX2Y = usX2Y((snd_card_t*)ptr);
 		struct list_head* p;
+		if (usX2Y->chip_status == USX2Y_STAT_CHIP_HUP)	// on 2.6.1 kernel snd_usbmidi_disconnect()
+			return;					// calls us back. better leave :-) .
 		usX2Y->chip_status = USX2Y_STAT_CHIP_HUP;
 		snd_usX2Y_unlinkSeq(&usX2Y->AS04);
 		usb_unlink_urb(usX2Y->In04urb);
+		snd_card_disconnect((snd_card_t*)ptr);
 		/* release the midi resources */
 		list_for_each(p, &usX2Y->chip.midi_list) {
 			snd_usbmidi_disconnect(p, &snd_usX2Y_usb_driver);
 		}
-		snd_card_disconnect((snd_card_t*)ptr);
 		if (usX2Y->us428ctls_sharedmem) 
 			wake_up(&usX2Y->us428ctls_wait_queue_head);
 		snd_card_free_in_thread((snd_card_t*)ptr);
Index: alsa-driver/usb/usx2y/usbusx2y.h
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usx2y/usbusx2y.h,v
retrieving revision 1.2
diff -u -r1.2 usbusx2y.h
--- alsa-driver/usb/usx2y/usbusx2y.h	2 Dec 2003 10:15:02 -0000	1.2
+++ alsa-driver/usb/usx2y/usbusx2y.h	15 Jan 2004 23:22:37 -0000
@@ -5,7 +5,7 @@
 #include "usbus428ctldefs.h" 
 
 #define NRURBS	        2	/* */
-#define NRPACKS		1	/* usb-frames/ms per urb */
+#define NRPACKS		2	/* usb-frames/ms per urb: 1 and 2 are supported. set to 1 if you want lowest possible latency */
 
 #define URBS_AsyncSeq 10
 #define URB_DataLen_AsyncSeq 32
Index: alsa-driver/usb/usx2y/usbusx2yaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usx2y/usbusx2yaudio.c,v
retrieving revision 1.6
diff -u -r1.6 usbusx2yaudio.c
--- alsa-driver/usb/usx2y/usbusx2yaudio.c	13 Jan 2004 17:19:30 -0000	1.6
+++ alsa-driver/usb/usx2y/usbusx2yaudio.c	15 Jan 2004 23:22:40 -0000
@@ -122,7 +122,6 @@
 			       struct urb *urb)
 {
 	unsigned long flags, pack;
-
 	urb->dev = subs->stream->usX2Y->chip.dev; /* we need to set this at each time */
 	spin_lock_irqsave(&subs->lock, flags);
 	for (pack = 0; pack < NRPACKS; pack++) {
@@ -131,8 +130,6 @@
 	}
 	spin_unlock_irqrestore(&subs->lock, flags);
 	urb->transfer_buffer_length = subs->maxpacksize * NRPACKS; 
-	urb->interval = NRPACKS;
-
 	return 0;
 }
 /*
@@ -275,7 +272,6 @@
 	for (pack = 0; pack < NRPACKS; pack++) {
 		/* calculate the size of a packet */
 		count += (counts = usX2Y->pipe0Aframes[0][pack]);
-
 		if (counts < 43 || counts > 50) {
 			snd_printk("should not be here with counts=%i\n", counts);
 			spin_unlock_irqrestore(&subs->lock, flags);
@@ -285,10 +281,9 @@
 		usX2Y->pipe0Aframes[0][pack] = usX2Y->pipe0Aframes[1][pack];
 		usX2Y->pipe0Aframes[1][pack] = 0;
 		/* set up descriptor */
-		urb->iso_frame_desc[pack].offset = pack ? urb->iso_frame_desc[pack - 1].length : 0;
+		urb->iso_frame_desc[pack].offset = pack ? urb->iso_frame_desc[pack - 1].offset + urb->iso_frame_desc[pack - 1].length : 0;
 		urb->iso_frame_desc[pack].length = counts * usX2Y->stride;
 	}
-
 	if (subs->hwptr + count > runtime->buffer_size) {
 		/* err, the transferred area goes over buffer boundary.
 		 * copy the data to the temp buffer.
@@ -308,7 +303,6 @@
 	}
 	spin_unlock_irqrestore(&subs->lock, flags);
 	urb->transfer_buffer_length = count * usX2Y->stride;
-
 	return 0;
 }
 
@@ -484,7 +478,7 @@
 		for (i = 0; i < NRURBS; i++) {
 			if (0 == ep)
 				subs->dataurb[0][i]->transfer_flags = URB_ISO_ASAP;
-			else{
+			else {
 				subs->dataurb[ep][i]->transfer_flags = 0;
 				subs->dataurb[ep][i]->start_frame = subs->dataurb[0][i]->start_frame;
 			}
@@ -756,9 +750,9 @@
 			}
 			(*purb)->dev = subs->stream->usX2Y->chip.dev;
 			(*purb)->pipe = subs->datapipe[ep];
-			(*purb)->transfer_flags = URB_ISO_ASAP | URB_ASYNC_UNLINK;
 			(*purb)->number_of_packets = NRPACKS;
 			(*purb)->context = subs;
+			(*purb)->interval = 1;
 			(*purb)->complete = is_playback ?
 				snd_usb_complete_callback(snd_usX2Y_urb_play_complete) :
 				snd_usb_complete_callback(snd_usX2Y_urb_capt_complete);
@@ -946,7 +940,6 @@
 				usX2Y_stream->usX2Y->refframes = rate == 48000 ? 47 : 44;
 			} while (0);
 		
-			set_current_state(TASK_RUNNING);
 			remove_wait_queue(&usX2Y_stream->usX2Y->In04WaitQueue, &wait);
 		} while (0);
 
@@ -956,7 +949,7 @@
 				usb_unlink_urb(us->urb[i]);
 				usb_free_urb(us->urb[i]);
 			}
-			usX2Y_stream->usX2Y->US04 =NULL;
+			usX2Y_stream->usX2Y->US04 = NULL;
 			kfree(usbdata);
 			kfree(us);
 		}
@@ -973,7 +966,7 @@
 				format = params_format(hw_params);
  	snd_usX2Y_stream_t	*usX2Y_stream = snd_pcm_substream_chip(substream);
 	if (usX2Y_stream->usX2Y->format != format) {
-		int alternate;
+		int alternate, unlink_err;
 		if (format == SNDRV_PCM_FORMAT_S24_3LE) {
 			alternate = 2;
 			usX2Y_stream->usX2Y->stride = 6;
@@ -981,9 +974,14 @@
 			alternate = 1;
 			usX2Y_stream->usX2Y->stride = 4;
 		}
+		unlink_err = usb_unlink_urb(usX2Y_stream->usX2Y->In04urb);
 		if ((err = usb_set_interface(usX2Y_stream->usX2Y->chip.dev, 0, alternate))) {
 			snd_printk("usb_set_interface error \n");
 			return err;
+		}
+		if (0 == unlink_err) {
+			usX2Y_stream->usX2Y->In04urb->dev = usX2Y_stream->usX2Y->chip.dev;
+			err = usb_submit_urb(usX2Y_stream->usX2Y->In04urb, GFP_KERNEL);
 		}
 		usX2Y_stream->usX2Y->format = format;
 		usX2Y_stream->usX2Y->rate = 0;
Index: alsa-tools/usx2yloader/tascam_fpga.in
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/usx2yloader/tascam_fpga.in,v
retrieving revision 1.3
diff -u -r1.3 tascam_fpga.in
--- alsa-tools/usx2yloader/tascam_fpga.in	4 Dec 2003 09:41:10 -0000	1.3
+++ alsa-tools/usx2yloader/tascam_fpga.in	15 Jan 2004 23:22:45 -0000
@@ -6,7 +6,7 @@
 exec_prefix=@exec_prefix@
 
 LOADER=@bindir@/usx2yloader
-CONTROLLER=
+CONTROLLER=NOTUSED
 
 if [ -x $LOADER ]; then
 	if [ -x /usr/bin/logger ]; then
@@ -27,7 +27,7 @@
 	;;
 esac
 
-if [ -n $CONTROLLER ]; then
+if [ $CONTROLLER != NOTUSED ]; then
 	if [ -x $CONTROLLER ]; then
 		if [ -x /usr/bin/logger ]; then
 			/usr/bin/logger -t $0 "starting $CONTROLLER for $DEVICE"

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH]snd-usb-usx2y 0.5.1
  2004-01-16 21:26 [PATCH]snd-usb-usx2y 0.5.1 Karsten Wiese
@ 2004-01-19 19:02 ` Takashi Iwai
  0 siblings, 0 replies; 2+ messages in thread
From: Takashi Iwai @ 2004-01-19 19:02 UTC (permalink / raw)
  To: Karsten Wiese; +Cc: alsa-devel

At Fri, 16 Jan 2004 22:26:39 +0100,
Karsten Wiese wrote:
> 
> [1  <text/plain; us-ascii (7bit)>]
> Hi Takashi,
> 
> this lets it work on kernel 2.6.1.
> 
> please commit, thanks,

done.  thanks!


Takashi


-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2004-01-19 19:02 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-01-16 21:26 [PATCH]snd-usb-usx2y 0.5.1 Karsten Wiese
2004-01-19 19:02 ` Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.