1
--- ../../alsa-kernel/usb/usx2y/usx2yhwdeppcm.c 2009-09-28 12:02:26.000000000 +0200
2
+++ usx2yhwdeppcm.c 2009-09-28 14:51:08.000000000 +0200
5
+#ifdef CONFIG_HAVE_DEPRECATED_CONFIG_H
6
+#include <linux/autoconf.h>
8
+#include <linux/config.h>
10
+#include <linux/version.h>
12
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5)
13
+#define SND_NEED_USB_SET_INTERFACE
14
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
15
+#define SND_NEED_USB_WRAPPER
17
+#define __NO_VERSION__
20
+#define USB_2_6_18 (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18))
22
+#define USX2Y_URB_FRAME_MASK -1
24
+#define USX2Y_URB_FRAME_MASK 0xffff
28
+#include "../usbcompat.h"
31
* This program is free software; you can redistribute it and/or modify
32
* it under the terms of the GNU General Public License as published by
36
for (pack = 0; pack < nr_of_packs(); ++pack) {
37
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 20)
38
struct usb_iso_packet_descriptor *desc = urb->iso_frame_desc + pack;
40
+ iso_packet_descriptor_t *desc = urb->iso_frame_desc + pack;
43
struct snd_usX2Y_hwdep_pcm_shm *shm = subs->usX2Y->hwdep_pcm_shm;
44
int head = shm->captured_iso_head + 1;
49
+#if !defined(OLD_USB) && !defined(CONFIG_SND_NEW_IRQ_HANDLER)
50
+static void i_usX2Y_usbpcm_urb_complete(struct urb *urb, struct pt_regs *regs)
52
static void i_usX2Y_usbpcm_urb_complete(struct urb *urb)
55
struct snd_usX2Y_substream *subs = urb->context;
56
struct usX2Ydev *usX2Y = subs->usX2Y;
58
if (capsubs->completed_urb && atomic_read(&capsubs->state) >= state_PREPARED &&
59
(NULL == capsubs2 || capsubs2->completed_urb) &&
60
(playbacksubs->completed_urb || atomic_read(&playbacksubs->state) < state_PREPARED)) {
61
- if (!usX2Y_usbpcm_usbframe_complete(capsubs, capsubs2, playbacksubs, urb->start_frame))
62
- usX2Y->wait_iso_frame += nr_of_packs();
64
+ if (!usX2Y_usbpcm_usbframe_complete(capsubs, capsubs2, playbacksubs, urb->start_frame)) {
66
+ if (nr_of_packs() <= urb->start_frame &&
67
+ urb->start_frame <= (2 * nr_of_packs() - 1)) // uhci and ohci
68
+ usX2Y->wait_iso_frame = urb->start_frame - nr_of_packs();
71
+ usX2Y->wait_iso_frame += nr_of_packs();
74
usX2Y_clients_stop(usX2Y);
77
usX2Y->prepare_subs = NULL;
80
+#if !defined(OLD_USB) && !defined(CONFIG_SND_NEW_IRQ_HANDLER)
81
+static void i_usX2Y_usbpcm_subs_startup(struct urb *urb, struct pt_regs *regs)
83
static void i_usX2Y_usbpcm_subs_startup(struct urb *urb)
86
struct snd_usX2Y_substream *subs = urb->context;
87
struct usX2Ydev *usX2Y = subs->usX2Y;
89
wake_up(&usX2Y->prepare_wait_queue);
92
+#if !defined(OLD_USB) && !defined(CONFIG_SND_NEW_IRQ_HANDLER)
93
+ i_usX2Y_usbpcm_urb_complete(urb, regs);
95
i_usX2Y_usbpcm_urb_complete(urb);
101
if (subs != NULL && atomic_read(&subs->state) >= state_PREPARED)
105
+ usX2Y->wait_iso_frame = -1;
109
usX2Y_usbpcm_subs_startup(subs);
113
snd_printdd("%i\n", urb->start_frame);
117
+ if (0 > usX2Y->wait_iso_frame)
119
usX2Y->wait_iso_frame = urb->start_frame;
121
urb->transfer_flags = 0;
126
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
127
static int snd_usX2Y_hwdep_pcm_vm_fault(struct vm_area_struct *area,
128
struct vm_fault *vmf)
130
@@ -695,12 +751,60 @@
135
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
136
+static struct page * snd_usX2Y_hwdep_pcm_vm_nopage(struct vm_area_struct *area,
137
+ unsigned long address, int *type)
138
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
139
+static struct page * snd_usX2Y_hwdep_pcm_vm_nopage(struct vm_area_struct *area,
140
+ unsigned long address, int no_share)
142
+static unsigned long snd_usX2Y_hwdep_pcm_vm_nopage(struct vm_area_struct *area,
143
+ unsigned long address, int no_share)
146
+ unsigned long offset;
150
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 25)
151
+ offset = area->vm_pgoff << PAGE_SHIFT;
153
+ offset = area->vm_offset;
155
+ offset += address - area->vm_start;
156
+ if (snd_BUG_ON(offset % PAGE_SIZE))
158
+ vaddr = (char*)((struct usX2Ydev *)
159
+ area->vm_private_data)->hwdep_pcm_shm + offset;
160
+ page = virt_to_page(vaddr);
161
+#ifndef CONFIG_SND_REMOVE_PAGE_RESERVE
162
+ if (!PageReserved(page))
166
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
168
+ *type = VM_FAULT_MINOR;
175
+ return page_address(page);
178
+#endif /* >= 2.6.24 */
180
static const struct vm_operations_struct snd_usX2Y_hwdep_pcm_vm_ops = {
181
.open = snd_usX2Y_hwdep_pcm_vm_open,
182
.close = snd_usX2Y_hwdep_pcm_vm_close,
183
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
184
.fault = snd_usX2Y_hwdep_pcm_vm_fault,
186
+ .nopage = snd_usX2Y_hwdep_pcm_vm_nopage,
194
area->vm_ops = &snd_usX2Y_hwdep_pcm_vm_ops;
196
area->vm_flags |= VM_RESERVED | VM_DONTEXPAND;
199
area->vm_private_data = hw->private_data;
201
+ area->vm_private_data = (long)hw->private_data;