upgrade to linux 2.6.10-1.12_FC2
[linux-2.6.git] / drivers / usb / class / audio.c
index 17a6dd7..675b5ff 100644 (file)
@@ -509,7 +509,10 @@ static int dmabuf_mmap(struct vm_area_struct *vma, struct dmabuf *db, unsigned l
                        return -EINVAL;
        db->mapped = 1;
        for(nr = 0; nr < size; nr++) {
-               if (remap_page_range(vma, start, virt_to_phys(db->sgbuf[nr]), PAGE_SIZE, prot))
+               unsigned long pfn;
+
+               pfn = virt_to_phys(db->sgbuf[nr]) >> PAGE_SHIFT;
+               if (remap_pfn_range(vma, start, pfn, PAGE_SIZE, prot))
                        return -EAGAIN;
                start += PAGE_SIZE;
        }
@@ -635,13 +638,13 @@ static void usbin_stop(struct usb_audiodev *as)
                spin_unlock_irqrestore(&as->lock, flags);
                if (notkilled && signal_pending(current)) {
                        if (i & FLG_URB0RUNNING)
-                               usb_unlink_urb(u->durb[0].urb);
+                               usb_kill_urb(u->durb[0].urb);
                        if (i & FLG_URB1RUNNING)
-                               usb_unlink_urb(u->durb[1].urb);
+                               usb_kill_urb(u->durb[1].urb);
                        if (i & FLG_SYNC0RUNNING)
-                               usb_unlink_urb(u->surb[0].urb);
+                               usb_kill_urb(u->surb[0].urb);
                        if (i & FLG_SYNC1RUNNING)
-                               usb_unlink_urb(u->surb[1].urb);
+                               usb_kill_urb(u->surb[1].urb);
                        notkilled = 0;
                }
        }
@@ -1114,13 +1117,13 @@ static void usbout_stop(struct usb_audiodev *as)
                spin_unlock_irqrestore(&as->lock, flags);
                if (notkilled && signal_pending(current)) {
                        if (i & FLG_URB0RUNNING)
-                               usb_unlink_urb(u->durb[0].urb);
+                               usb_kill_urb(u->durb[0].urb);
                        if (i & FLG_URB1RUNNING)
-                               usb_unlink_urb(u->durb[1].urb);
+                               usb_kill_urb(u->durb[1].urb);
                        if (i & FLG_SYNC0RUNNING)
-                               usb_unlink_urb(u->surb[0].urb);
+                               usb_kill_urb(u->surb[0].urb);
                        if (i & FLG_SYNC1RUNNING)
-                               usb_unlink_urb(u->surb[1].urb);
+                               usb_kill_urb(u->surb[1].urb);
                        notkilled = 0;
                }
        }
@@ -1949,15 +1952,12 @@ static inline int prog_dmabuf_out(struct usb_audiodev *as)
 static int usb_audio_open_mixdev(struct inode *inode, struct file *file)
 {
        unsigned int minor = iminor(inode);
-       struct list_head *devs, *mdevs;
        struct usb_mixerdev *ms;
        struct usb_audio_state *s;
 
        down(&open_sem);
-       list_for_each(devs, &audiodevs) {
-               s = list_entry(devs, struct usb_audio_state, audiodev);
-               list_for_each(mdevs, &s->mixerlist) {
-                       ms = list_entry(mdevs, struct usb_mixerdev, list);
+       list_for_each_entry(s, &audiodevs, audiodev) {
+               list_for_each_entry(ms, &s->mixerlist, list) {
                        if (ms->dev_mixer == minor)
                                goto mixer_found;
                }
@@ -2634,16 +2634,13 @@ static int usb_audio_open(struct inode *inode, struct file *file)
 {
        unsigned int minor = iminor(inode);
        DECLARE_WAITQUEUE(wait, current);
-       struct list_head *devs, *adevs;
        struct usb_audiodev *as;
        struct usb_audio_state *s;
 
        for (;;) {
                down(&open_sem);
-               list_for_each(devs, &audiodevs) {
-                       s = list_entry(devs, struct usb_audio_state, audiodev);
-                       list_for_each(adevs, &s->audiolist) {
-                               as = list_entry(adevs, struct usb_audiodev, list);
+               list_for_each_entry(s, &audiodevs, audiodev) {
+                       list_for_each_entry(as, &s->audiolist, list) {
                                if (!((as->dev_audio ^ minor) & ~0xf))
                                        goto device_found;
                        }
@@ -3122,12 +3119,18 @@ static void prepmixch(struct consmixstate *state)
 {
        struct usb_device *dev = state->s->usbdev;
        struct mixerchannel *ch;
-       unsigned char buf[2];
+       unsigned char *buf;
        __s16 v1;
        unsigned int v2, v3;
 
        if (!state->nrmixch || state->nrmixch > SOUND_MIXER_NRDEVICES)
                return;
+       buf = kmalloc(sizeof(*buf) * 2, GFP_KERNEL);
+       if (!buf) {
+               printk(KERN_ERR "prepmixch: out of memory\n") ;
+               return;
+       }
+
        ch = &state->mixch[state->nrmixch-1];
        switch (ch->selector) {
        case 0:  /* mixer unit request */
@@ -3239,13 +3242,16 @@ static void prepmixch(struct consmixstate *state)
        default:
                goto err;
        }
-       return;
 
+ freebuf:
+       kfree(buf);
+       return;
  err:
        printk(KERN_ERR "usbaudio: mixer request device %u if %u unit %u ch %u selector %u failed\n", 
               dev->devnum, state->ctrlif, ch->unitid, ch->chnum, ch->selector);
        if (state->nrmixch)
                state->nrmixch--;
+       goto freebuf;
 }
 
 
@@ -3809,7 +3815,6 @@ static int usb_audio_probe(struct usb_interface *intf,
 static void usb_audio_disconnect(struct usb_interface *intf)
 {
        struct usb_audio_state *s = usb_get_intfdata (intf);
-       struct list_head *list;
        struct usb_audiodev *as;
        struct usb_mixerdev *ms;
 
@@ -3831,8 +3836,7 @@ static void usb_audio_disconnect(struct usb_interface *intf)
        usb_set_intfdata (intf, NULL);
 
        /* deregister all audio and mixer devices, so no new processes can open this device */
-       list_for_each(list, &s->audiolist) {
-               as = list_entry(list, struct usb_audiodev, list);
+       list_for_each_entry(as, &s->audiolist, list) {
                usbin_disc(as);
                usbout_disc(as);
                wake_up(&as->usbin.dma.wait);
@@ -3843,8 +3847,7 @@ static void usb_audio_disconnect(struct usb_interface *intf)
                }
                as->dev_audio = -1;
        }
-       list_for_each(list, &s->mixerlist) {
-               ms = list_entry(list, struct usb_mixerdev, list);
+       list_for_each_entry(ms, &s->mixerlist, list) {
                if (ms->dev_mixer >= 0) {
                        unregister_sound_mixer(ms->dev_mixer);
                        printk(KERN_INFO "usbaudio: unregister mixer 14,%d\n", ms->dev_mixer);