summaryrefslogtreecommitdiff
path: root/wcfxsusb.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 /wcfxsusb.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 'wcfxsusb.c')
-rwxr-xr-xwcfxsusb.c77
1 files changed, 72 insertions, 5 deletions
diff --git a/wcfxsusb.c b/wcfxsusb.c
index 9985dbd..30c004d 100755
--- a/wcfxsusb.c
+++ b/wcfxsusb.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"
@@ -132,8 +138,14 @@ static alpha indirect_regs[] =
static int debug = 0;
struct stinky_urb {
+#ifdef USB2420
+ struct urb urb;
+ struct iso_packet_descriptor isoframe[1];
+#else
urb_t urb;
iso_packet_descriptor_t isoframe[1];
+#endif
+
};
typedef enum {
@@ -163,7 +175,11 @@ typedef enum {
struct wc_keypad_data {
/* Keypad state monitoring variables */
keypad_state_t state;
+#ifdef USB2420
+ struct urb urb;
+#else
urb_t urb;
+#endif
int running;
char data;
char data12;
@@ -195,9 +211,16 @@ struct wc_usb_pvt {
struct stinky_urb dataread[2];
struct stinky_urb datawrite[2];
int iostate; /* Whether reads/writes are complete */
+#ifdef USB2420
+ struct urb *pendingurb; /* Pending URB for transmission */
+ struct urb control;
+ struct usb_ctrlrequest dr;
+#else
+
urb_t *pendingurb; /* Pending URB for transmission */
urb_t control;
devrequest dr;
+#endif
control_state_t controlstate;
int urbcount;
int flags;
@@ -281,9 +304,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)
{
@@ -305,13 +334,18 @@ 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; */
+ p->timer = 50;
+ return;
}
if (!(p->flags & FLAG_RUNNING)) {
return;
@@ -387,7 +421,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;
@@ -496,12 +534,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 (*complyyete)(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;
@@ -509,6 +560,7 @@ 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)) {
@@ -520,12 +572,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;
@@ -533,10 +598,12 @@ 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)) {
printk("wcusb_async_write: control URB died\n");
+ p->timer = 50;
return -1;
}
p->controlstate = state;