diff options
-rwxr-xr-x | wcfxsusb.c | 77 | ||||
-rwxr-xr-x | wcusb.c | 59 |
2 files changed, 127 insertions, 9 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; @@ -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)) { |