summaryrefslogtreecommitdiff
path: root/wcusb.c
diff options
context:
space:
mode:
authormarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2003-01-30 19:12:01 +0000
committermarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2003-01-30 19:12:01 +0000
commiteafd604d74acd879c8ee1208115d4abf8100228b (patch)
treed10abdc535a26a5f0ab27b31734174afe6244d9d /wcusb.c
parent53f0cc03561b24992fc7554778a301bbe96ebe95 (diff)
Version 0.4.0 from FTP
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@145 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'wcusb.c')
-rwxr-xr-xwcusb.c59
1 files changed, 55 insertions, 4 deletions
diff --git a/wcusb.c b/wcusb.c
index cd51f32..5bed63b 100755
--- a/wcusb.c
+++ b/wcusb.c
@@ -38,6 +38,12 @@
#include <linux/init.h>
#include <linux/usb.h>
#include <linux/errno.h>
+
+#include <linux/version.h>
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,19)
+#define USB2420
+#endif
+
#ifdef STANDALONE_ZAPATA
#include "zaptel.h"
@@ -172,9 +178,15 @@ static int Wcusb_ReadWcRegs(struct usb_device *dev, unsigned char index,
return 0;
}
+#ifdef USB2420
+static int wcusb_async_read(struct wc_usb_pvt *p, unsigned char index, unsigned char *data, int len, int state, void (*complete)(struct urb *urb));
+static int wcusb_async_write(struct wc_usb_pvt *p, unsigned char index, unsigned char *data, int len, int state, void (*complete)(struct urb *urb));
+static void wcusb_async_control(struct urb *urb);
+#else
static int wcusb_async_read(struct wc_usb_pvt *p, unsigned char index, unsigned char *data, int len, int state, void (*complete)(urb_t *urb));
static int wcusb_async_write(struct wc_usb_pvt *p, unsigned char index, unsigned char *data, int len, int state, void (*complete)(urb_t *urb));
static void wcusb_async_control(urb_t *urb);
+#endif
static void proslic_read_direct_async(struct wc_usb_pvt *p, unsigned char address)
{
@@ -196,13 +208,19 @@ static void proslic_write_direct_async(struct wc_usb_pvt *p, unsigned char addre
wcusb_async_write(p, WCUSB_SPORT0, p->wcregbuf, 4, STATE_WCWRITE_WRITERES, wcusb_async_control);
}
+#ifdef USB2420
+static void wcusb_async_control(struct urb *urb)
+#else
static void wcusb_async_control(urb_t *urb)
+#endif
{
struct wc_usb_pvt *p = urb->context;
p->urbcount--;
if (urb->status) {
printk("Error in transfer...\n");
/* return is the "right thing", but don't... */
+ p->timer = 50;
+ return;
}
if (!(p->flags & FLAG_RUNNING)) {
return;
@@ -278,7 +296,11 @@ static void wcusb_async_control(urb_t *urb)
}
}
+#ifdef USB2420
+static void keypad_check_done(struct urb *urb)
+#else
static void keypad_check_done(urb_t *urb)
+#endif
{
struct wc_usb_pvt *p = urb->context;
struct wc_keypad_data *d = p->pvt_data;
@@ -387,12 +409,25 @@ static void wcusb_check_interrupt(struct wc_usb_pvt *p)
return;
}
+#ifdef USB2420
+static int wcusb_async_read(struct wc_usb_pvt *p, unsigned char index, unsigned char *data, int len, int state, void (*complete)(struct urb *urb))
+#else
static int wcusb_async_read(struct wc_usb_pvt *p, unsigned char index, unsigned char *data, int len, int state, void (*complete)(urb_t *urb))
+#endif
{
- urb_t *urb = &p->control;
__u16 size = len;
__u16 ind = index;
-
+#ifdef USB2420
+ struct urb *urb = &p->control;
+ memset(urb, 0, sizeof(struct urb));
+
+ p->dr.bRequestType = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE;
+ p->dr.bRequest = REQUEST_NORMAL;
+ p->dr.wValue = 0;
+ p->dr.wIndex = cpu_to_le16(ind);
+ p->dr.wLength = cpu_to_le16(size);
+#else
+ urb_t *urb = &p->control;
memset(urb, 0, sizeof(urb_t));
p->dr.requesttype = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE;
@@ -400,10 +435,12 @@ static int wcusb_async_read(struct wc_usb_pvt *p, unsigned char index, unsigned
p->dr.value = 0;
p->dr.index = cpu_to_le16(ind);
p->dr.length = cpu_to_le16(size);
+#endif
FILL_CONTROL_URB(urb, p->dev, usb_rcvctrlpipe(p->dev, 0), (unsigned char *)&p->dr, data, len, complete, p);
if (usb_submit_urb(urb)) {
printk("wcusb_async_read: control URB died\n");
+ p->timer = 50;
return -1;
}
p->controlstate = state;
@@ -411,12 +448,25 @@ static int wcusb_async_read(struct wc_usb_pvt *p, unsigned char index, unsigned
return 0;
}
+#ifdef USB2420
+static int wcusb_async_write(struct wc_usb_pvt *p, unsigned char index, unsigned char *data, int len, int state, void (*complete)(struct urb *urb))
+#else
static int wcusb_async_write(struct wc_usb_pvt *p, unsigned char index, unsigned char *data, int len, int state, void (*complete)(urb_t *urb))
+#endif
{
- urb_t *urb = &p->control;
__u16 size = len;
__u16 ind = index;
-
+#ifdef USB2420
+ struct urb *urb = &p->control;
+ memset(urb, 0, sizeof(struct urb));
+
+ p->dr.bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE;
+ p->dr.bRequest = REQUEST_NORMAL;
+ p->dr.wValue = 0;
+ p->dr.wIndex = cpu_to_le16(ind);
+ p->dr.wLength = cpu_to_le16(size);
+#else
+ urb_t *urb = &p->control;
memset(urb, 0, sizeof(urb_t));
p->dr.requesttype = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE;
@@ -424,6 +474,7 @@ static int wcusb_async_write(struct wc_usb_pvt *p, unsigned char index, unsigned
p->dr.value = 0;
p->dr.index = cpu_to_le16(ind);
p->dr.length = cpu_to_le16(size);
+#endif
FILL_CONTROL_URB(urb, p->dev, usb_sndctrlpipe(p->dev, 0), (unsigned char *)&p->dr, data, len, complete, p);
if (usb_submit_urb(urb)) {