diff options
author | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2003-01-30 19:12:01 +0000 |
---|---|---|
committer | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2003-01-30 19:12:01 +0000 |
commit | eafd604d74acd879c8ee1208115d4abf8100228b (patch) | |
tree | d10abdc535a26a5f0ab27b31734174afe6244d9d /wcfxsusb.c | |
parent | 53f0cc03561b24992fc7554778a301bbe96ebe95 (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-x | wcfxsusb.c | 77 |
1 files changed, 72 insertions, 5 deletions
@@ -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; |