Update of /cvsroot/alsa/alsa-driver/usb/usx2y
In directory sc8-pr-cvs1:/tmp/cvs-serv14280/usx2y

Modified Files:
        usX2Yhwdep.c usbusx2y.c usbusx2y.h usbusx2yaudio.c 
Log Message:
Karsten Wiese <[EMAIL PROTECTED]>:

- this lets it work on kernel 2.6.1.



Index: usX2Yhwdep.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usx2y/usX2Yhwdep.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- usX2Yhwdep.c        13 Jan 2004 17:19:30 -0000      1.3
+++ usX2Yhwdep.c        19 Jan 2004 18:43:28 -0000      1.4
@@ -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: usbusx2y.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usx2y/usbusx2y.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- usbusx2y.c  30 Dec 2003 16:33:44 -0000      1.5
+++ usbusx2y.c  19 Jan 2004 18:43:28 -0000      1.6
@@ -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: usbusx2y.h
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usx2y/usbusx2y.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- usbusx2y.h  2 Dec 2003 10:15:02 -0000       1.2
+++ usbusx2y.h  19 Jan 2004 18:43:28 -0000      1.3
@@ -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: usbusx2yaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usx2y/usbusx2yaudio.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- usbusx2yaudio.c     13 Jan 2004 17:19:30 -0000      1.6
+++ usbusx2yaudio.c     19 Jan 2004 18:43:28 -0000      1.7
@@ -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,10 +974,15 @@
                        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;
        }



-------------------------------------------------------
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
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to