blob: d55934521991ebbc2bfb9d53917cd177e776674c [file] [log] [blame]
--- ../../alsa-kernel/usb/usx2y/usbusx2yaudio.c 2009-11-16 13:18:14.000000000 +0100
+++ usbusx2yaudio.c 2009-12-16 19:58:57.000000000 +0100
@@ -1,3 +1,5 @@
+#include "adriver.h"
+#include "../usbcompat.h"
/*
* US-X2Y AUDIO
* Copyright (c) 2002-2004 by Karsten Wiese
@@ -66,6 +68,14 @@
#endif
+#define USB_2_6_18 (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18))
+#if USB_2_6_18
+#define USX2Y_URB_FRAME_MASK -1
+#else
+#define USX2Y_URB_FRAME_MASK 0xffff
+#endif
+
+
static int usX2Y_urb_capt_retire(struct snd_usX2Y_substream *subs)
{
struct urb *urb = subs->completed_urb;
@@ -306,7 +316,11 @@
usX2Y_clients_stop(usX2Y);
}
+#if !defined(OLD_USB) && !defined(CONFIG_SND_NEW_IRQ_HANDLER)
+static void i_usX2Y_urb_complete(struct urb *urb, struct pt_regs *regs)
+#else
static void i_usX2Y_urb_complete(struct urb *urb)
+#endif
{
struct snd_usX2Y_substream *subs = urb->context;
struct usX2Ydev *usX2Y = subs->usX2Y;
@@ -335,9 +349,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 +365,13 @@
}
}
+#if !defined(OLD_USB) && !defined(CONFIG_SND_NEW_IRQ_HANDLER)
+static void usX2Y_urbs_set_complete(struct usX2Ydev * usX2Y,
+ void (*complete)(struct urb *, struct pt_regs *))
+#else
static void usX2Y_urbs_set_complete(struct usX2Ydev * usX2Y,
void (*complete)(struct urb *))
+#endif
{
int s, u;
for (s = 0; s < 4; s++) {
@@ -366,7 +391,11 @@
usX2Y->prepare_subs = NULL;
}
+#if !defined(OLD_USB) && !defined(CONFIG_SND_NEW_IRQ_HANDLER)
+static void i_usX2Y_subs_startup(struct urb *urb, struct pt_regs *regs)
+#else
static void i_usX2Y_subs_startup(struct urb *urb)
+#endif
{
struct snd_usX2Y_substream *subs = urb->context;
struct usX2Ydev *usX2Y = subs->usX2Y;
@@ -378,7 +407,11 @@
wake_up(&usX2Y->prepare_wait_queue);
}
+#if !defined(OLD_USB) && !defined(CONFIG_SND_NEW_IRQ_HANDLER)
+ i_usX2Y_urb_complete(urb, regs);
+#else
i_usX2Y_urb_complete(urb);
+#endif
}
static void usX2Y_subs_prepare(struct snd_usX2Y_substream *subs)
@@ -491,7 +524,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 +547,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 +696,11 @@
};
#define NOOF_SETRATE_URBS ARRAY_SIZE(SetRate48000)
+#if !defined(OLD_USB) && !defined(CONFIG_SND_NEW_IRQ_HANDLER)
+static void i_usX2Y_04Int(struct urb *urb, struct pt_regs *regs)
+#else
static void i_usX2Y_04Int(struct urb *urb)
+#endif
{
struct usX2Ydev *usX2Y = urb->context;
@@ -1017,10 +1060,18 @@
if (0 > (err = usX2Y_audio_stream_new(card, 0xA, 0x8)))
return err;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
if (le16_to_cpu(usX2Y(card)->dev->descriptor.idProduct) == USB_ID_US428)
+#else
+ if (usX2Y(card)->dev->descriptor.idProduct == USB_ID_US428)
+#endif
if (0 > (err = usX2Y_audio_stream_new(card, 0, 0xA)))
return err;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
if (le16_to_cpu(usX2Y(card)->dev->descriptor.idProduct) != USB_ID_US122)
+#else
+ if (usX2Y(card)->dev->descriptor.idProduct != USB_ID_US122)
+#endif
err = usX2Y_rate_set(usX2Y(card), 44100); // Lets us428 recognize output-volume settings, disturbs us122.
return err;
}