Loading drivers/staging/dabusb/dabusb.c +175 −163 Original line number Diff line number Diff line Loading @@ -33,8 +33,8 @@ #include <linux/vmalloc.h> #include <linux/slab.h> #include <linux/init.h> #include <asm/uaccess.h> #include <asm/atomic.h> #include <linux/uaccess.h> #include <linux/atomic.h> #include <linux/delay.h> #include <linux/usb.h> #include <linux/mutex.h> Loading Loading @@ -66,7 +66,8 @@ static struct usb_driver dabusb_driver; /*-------------------------------------------------------------------*/ static int dabusb_add_buf_tail (pdabusb_t s, struct list_head *dst, struct list_head *src) static int dabusb_add_buf_tail(pdabusb_t s, struct list_head *dst, struct list_head *src) { unsigned long flags; struct list_head *tmp; Loading @@ -75,7 +76,7 @@ static int dabusb_add_buf_tail (pdabusb_t s, struct list_head *dst, struct list_ spin_lock_irqsave(&s->lock, flags); if (list_empty(src)) { // no elements in source buffer /* no elements in source buffer */ ret = -1; goto err; } Loading Loading @@ -177,30 +178,33 @@ static void dabusb_iso_complete (struct urb *purb) dbg("dabusb_iso_complete"); // process if URB was not killed /* process if URB was not killed */ if (purb->status != -ENOENT) { unsigned int pipe = usb_rcvisocpipe(purb->dev, _DABUSB_ISOPIPE); int pipesize = usb_maxpacket (purb->dev, pipe, usb_pipeout (pipe)); int pipesize = usb_maxpacket(purb->dev, pipe, usb_pipeout(pipe)); for (i = 0; i < purb->number_of_packets; i++) if (!purb->iso_frame_desc[i].status) { len = purb->iso_frame_desc[i].actual_length; if (len <= pipesize) { memcpy(buf + dst, buf + purb->iso_frame_desc[i].offset, len); dst += len; } else } else dev_err(&purb->dev->dev, "dabusb_iso_complete: invalid len %d\n", len); } else dev_warn(&purb->dev->dev, "dabusb_iso_complete: corrupted packet status: %d\n", purb->iso_frame_desc[i].status); "dabusb_iso_complete: invalid len %d\n", len); } else dev_warn(&purb->dev->dev, "dabusb_iso_complete: corrupted packet status: %d\n", purb->iso_frame_desc[i].status); if (dst != purb->actual_length) dev_err(&purb->dev->dev, "dst!=purb->actual_length:%d!=%d\n", dst, purb->actual_length); } if (atomic_dec_and_test (&s->pending_io) && !s->remove_pending && s->state != _stopped) { if (atomic_dec_and_test(&s->pending_io) && !s->remove_pending && s->state != _stopped) { s->overruns++; dev_err(&purb->dev->dev, "overrun (%d)\n", s->overruns); } Loading Loading @@ -235,7 +239,8 @@ static int dabusb_alloc_buffers (pdabusb_t s) goto err; } b->purb->transfer_buffer = kmalloc (transfer_buffer_length, GFP_KERNEL); b->purb->transfer_buffer = kmalloc(transfer_buffer_length, GFP_KERNEL); if (!b->purb->transfer_buffer) { kfree(b->purb); kfree(b); Loading Loading @@ -282,7 +287,8 @@ static int dabusb_bulk (pdabusb_t s, pbulk_transfer_t pb) else pipe = usb_sndbulkpipe(s->usbdev, 2); ret=usb_bulk_msg(s->usbdev, pipe, pb->data, pb->size, &actual_length, 100); ret = usb_bulk_msg(s->usbdev, pipe, pb->data, pb->size, &actual_length, 100); if (ret < 0) { dev_err(&s->usbdev->dev, "usb_bulk_msg failed(%d)\n", ret); Loading Loading @@ -318,7 +324,8 @@ static int dabusb_writemem (pdabusb_t s, int pos, const unsigned char *data, memcpy(transfer_buffer, data, len); ret=usb_control_msg(s->usbdev, usb_sndctrlpipe( s->usbdev, 0 ), 0xa0, 0x40, pos, 0, transfer_buffer, len, 300); ret = usb_control_msg(s->usbdev, usb_sndctrlpipe(s->usbdev, 0), 0xa0, 0x40, pos, 0, transfer_buffer, len, 300); kfree(transfer_buffer); return ret; Loading Loading @@ -431,7 +438,7 @@ static int dabusb_fpga_download (pdabusb_t s, const char *fname) b->data[3] = 60; for (n = 0; n <= blen + 60; n += 60) { // some cclks for startup /* some cclks for startup */ b->size = 64; memcpy(b->data + 4, fw->data + 74 + n, 60); ret = dabusb_bulk(s, b); Loading Loading @@ -483,20 +490,22 @@ static int dabusb_startrek (pdabusb_t s) while (!dabusb_add_buf_tail(s, &s->rec_buff_list, &s->free_buff_list)) { dbg("submitting: end:%p s->rec_buff_list:%p", s->rec_buff_list.prev, &s->rec_buff_list); dbg("submitting: end:%p s->rec_buff_list:%p", s->rec_buff_list.prev, &s->rec_buff_list); end = list_entry (s->rec_buff_list.prev, buff_t, buff_list); end = list_entry(s->rec_buff_list.prev, buff_t, buff_list); ret = usb_submit_urb(end->purb, GFP_KERNEL); if (ret) { dev_err(&s->usbdev->dev, "usb_submit_urb returned:%d\n", ret); if (dabusb_add_buf_tail (s, &s->free_buff_list, &s->rec_buff_list)) if (dabusb_add_buf_tail(s, &s->free_buff_list, &s->rec_buff_list)) dev_err(&s->usbdev->dev, "startrek: dabusb_add_buf_tail failed\n"); break; } else } else atomic_inc(&s->pending_io); } dbg("pending_io: %d", s->pending_io.counter); Loading @@ -505,7 +514,8 @@ static int dabusb_startrek (pdabusb_t s) return 0; } static ssize_t dabusb_read (struct file *file, char __user *buf, size_t count, loff_t * ppos) static ssize_t dabusb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { pdabusb_t s = (pdabusb_t)file->private_data; unsigned long flags; Loading Loading @@ -547,8 +557,8 @@ static ssize_t dabusb_read (struct file *file, char __user *buf, size_t count, l spin_unlock_irqrestore(&s->lock, flags); if (purb->status == -EINPROGRESS) { if (file->f_flags & O_NONBLOCK) // return nonblocking { /* return nonblocking */ if (file->f_flags & O_NONBLOCK) { if (!ret) ret = -EAGAIN; goto err; Loading Loading @@ -578,16 +588,20 @@ static ssize_t dabusb_read (struct file *file, char __user *buf, size_t count, l goto err; } rem = purb->actual_length - s->readptr; // set remaining bytes to copy /* set remaining bytes to copy */ rem = purb->actual_length - s->readptr; if (count >= rem) cnt = rem; else cnt = count; dbg("copy_to_user:%p %p %d",buf, purb->transfer_buffer + s->readptr, cnt); dbg("copy_to_user:%p %p %d", buf, purb->transfer_buffer + s->readptr, cnt); if (copy_to_user (buf, purb->transfer_buffer + s->readptr, cnt)) { if (copy_to_user(buf, purb->transfer_buffer + s->readptr, cnt)) { dev_err(&s->usbdev->dev, "read: copy_to_user failed\n"); if (!ret) ret = -EFAULT; Loading @@ -600,14 +614,15 @@ static ssize_t dabusb_read (struct file *file, char __user *buf, size_t count, l ret += cnt; if (s->readptr == purb->actual_length) { // finished, take next buffer if (dabusb_add_buf_tail (s, &s->free_buff_list, &s->rec_buff_list)) /* finished, take next buffer */ if (dabusb_add_buf_tail(s, &s->free_buff_list, &s->rec_buff_list)) dev_err(&s->usbdev->dev, "read: dabusb_add_buf_tail failed\n"); s->readptr = 0; } } err: //mutex_unlock(&s->mutex); err: /*mutex_unlock(&s->mutex);*/ return ret; } Loading Loading @@ -665,8 +680,7 @@ static int dabusb_release (struct inode *inode, struct file *file) if (!s->remove_pending) { if (usb_set_interface(s->usbdev, _DABUSB_IF, 0) < 0) dev_err(&s->usbdev->dev, "set_interface failed\n"); } else } else wake_up(&s->remove_ok); s->opened = 0; Loading Loading @@ -727,8 +741,7 @@ static long dabusb_ioctl (struct file *file, unsigned int cmd, unsigned long arg return ret; } static const struct file_operations dabusb_fops = { static const struct file_operations dabusb_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .read = dabusb_read, Loading Loading @@ -787,8 +800,7 @@ static int dabusb_probe (struct usb_interface *intf, if (le16_to_cpu(usbdev->descriptor.idProduct) == 0x2131) { dabusb_loadmem(s, NULL); goto reject; } else { } else { dabusb_fpga_download(s, NULL); if (usb_set_interface(s->usbdev, _DABUSB_IF, 0) < 0) { Loading Loading @@ -841,7 +853,7 @@ static void dabusb_disconnect (struct usb_interface *intf) } static struct usb_device_id dabusb_ids[] = { // { USB_DEVICE(0x0547, 0x2131) }, /* An2131 chip, no boot ROM */ /* { USB_DEVICE(0x0547, 0x2131) },*/ /* An2131 chip, no boot ROM */ { USB_DEVICE(0x0547, 0x9999) }, { } /* Terminating entry */ }; Loading drivers/staging/dabusb/dabusb.h +18 −23 Original line number Diff line number Diff line #define _BULK_DATA_LEN 64 typedef struct { typedef struct { unsigned char data[_BULK_DATA_LEN]; unsigned int size; unsigned int pipe; Loading @@ -16,8 +15,7 @@ typedef struct typedef enum { _stopped = 0, _started } driver_state_t; typedef struct { typedef struct { struct mutex mutex; struct usb_device *usbdev; wait_queue_head_t wait; Loading @@ -36,15 +34,13 @@ typedef struct struct list_head rec_buff_list; } dabusb_t, *pdabusb_t; typedef struct { typedef struct { pdabusb_t s; struct urb *purb; struct list_head buff_list; } buff_t, *pbuff_t; typedef struct { typedef struct { wait_queue_head_t wait; } bulk_completion_context_t, *pbulk_completion_context_t; Loading @@ -54,11 +50,11 @@ typedef struct #define _ISOPIPESIZE 16384 #define _BULK_DATA_LEN 64 // Vendor specific request code for Anchor Upload/Download // This one is implemented in the core /* Vendor specific request code for Anchor Upload/Download *This one is implemented in the core */ #define ANCHOR_LOAD_INTERNAL 0xA0 // EZ-USB Control and Status Register. Bit 0 controls 8051 reset /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ #define CPUCS_REG 0x7F92 #define _TOTAL_BUFFERS 384 Loading @@ -67,15 +63,14 @@ typedef struct #ifndef _BYTE_DEFINED #define _BYTE_DEFINED typedef unsigned char BYTE; #endif // !_BYTE_DEFINED #endif /* !_BYTE_DEFINED */ #ifndef _WORD_DEFINED #define _WORD_DEFINED typedef unsigned short WORD; #endif // !_WORD_DEFINED #endif /* !_WORD_DEFINED */ typedef struct _INTEL_HEX_RECORD { typedef struct _INTEL_HEX_RECORD { BYTE Length; WORD Address; BYTE Type; Loading Loading
drivers/staging/dabusb/dabusb.c +175 −163 Original line number Diff line number Diff line Loading @@ -33,8 +33,8 @@ #include <linux/vmalloc.h> #include <linux/slab.h> #include <linux/init.h> #include <asm/uaccess.h> #include <asm/atomic.h> #include <linux/uaccess.h> #include <linux/atomic.h> #include <linux/delay.h> #include <linux/usb.h> #include <linux/mutex.h> Loading Loading @@ -66,7 +66,8 @@ static struct usb_driver dabusb_driver; /*-------------------------------------------------------------------*/ static int dabusb_add_buf_tail (pdabusb_t s, struct list_head *dst, struct list_head *src) static int dabusb_add_buf_tail(pdabusb_t s, struct list_head *dst, struct list_head *src) { unsigned long flags; struct list_head *tmp; Loading @@ -75,7 +76,7 @@ static int dabusb_add_buf_tail (pdabusb_t s, struct list_head *dst, struct list_ spin_lock_irqsave(&s->lock, flags); if (list_empty(src)) { // no elements in source buffer /* no elements in source buffer */ ret = -1; goto err; } Loading Loading @@ -177,30 +178,33 @@ static void dabusb_iso_complete (struct urb *purb) dbg("dabusb_iso_complete"); // process if URB was not killed /* process if URB was not killed */ if (purb->status != -ENOENT) { unsigned int pipe = usb_rcvisocpipe(purb->dev, _DABUSB_ISOPIPE); int pipesize = usb_maxpacket (purb->dev, pipe, usb_pipeout (pipe)); int pipesize = usb_maxpacket(purb->dev, pipe, usb_pipeout(pipe)); for (i = 0; i < purb->number_of_packets; i++) if (!purb->iso_frame_desc[i].status) { len = purb->iso_frame_desc[i].actual_length; if (len <= pipesize) { memcpy(buf + dst, buf + purb->iso_frame_desc[i].offset, len); dst += len; } else } else dev_err(&purb->dev->dev, "dabusb_iso_complete: invalid len %d\n", len); } else dev_warn(&purb->dev->dev, "dabusb_iso_complete: corrupted packet status: %d\n", purb->iso_frame_desc[i].status); "dabusb_iso_complete: invalid len %d\n", len); } else dev_warn(&purb->dev->dev, "dabusb_iso_complete: corrupted packet status: %d\n", purb->iso_frame_desc[i].status); if (dst != purb->actual_length) dev_err(&purb->dev->dev, "dst!=purb->actual_length:%d!=%d\n", dst, purb->actual_length); } if (atomic_dec_and_test (&s->pending_io) && !s->remove_pending && s->state != _stopped) { if (atomic_dec_and_test(&s->pending_io) && !s->remove_pending && s->state != _stopped) { s->overruns++; dev_err(&purb->dev->dev, "overrun (%d)\n", s->overruns); } Loading Loading @@ -235,7 +239,8 @@ static int dabusb_alloc_buffers (pdabusb_t s) goto err; } b->purb->transfer_buffer = kmalloc (transfer_buffer_length, GFP_KERNEL); b->purb->transfer_buffer = kmalloc(transfer_buffer_length, GFP_KERNEL); if (!b->purb->transfer_buffer) { kfree(b->purb); kfree(b); Loading Loading @@ -282,7 +287,8 @@ static int dabusb_bulk (pdabusb_t s, pbulk_transfer_t pb) else pipe = usb_sndbulkpipe(s->usbdev, 2); ret=usb_bulk_msg(s->usbdev, pipe, pb->data, pb->size, &actual_length, 100); ret = usb_bulk_msg(s->usbdev, pipe, pb->data, pb->size, &actual_length, 100); if (ret < 0) { dev_err(&s->usbdev->dev, "usb_bulk_msg failed(%d)\n", ret); Loading Loading @@ -318,7 +324,8 @@ static int dabusb_writemem (pdabusb_t s, int pos, const unsigned char *data, memcpy(transfer_buffer, data, len); ret=usb_control_msg(s->usbdev, usb_sndctrlpipe( s->usbdev, 0 ), 0xa0, 0x40, pos, 0, transfer_buffer, len, 300); ret = usb_control_msg(s->usbdev, usb_sndctrlpipe(s->usbdev, 0), 0xa0, 0x40, pos, 0, transfer_buffer, len, 300); kfree(transfer_buffer); return ret; Loading Loading @@ -431,7 +438,7 @@ static int dabusb_fpga_download (pdabusb_t s, const char *fname) b->data[3] = 60; for (n = 0; n <= blen + 60; n += 60) { // some cclks for startup /* some cclks for startup */ b->size = 64; memcpy(b->data + 4, fw->data + 74 + n, 60); ret = dabusb_bulk(s, b); Loading Loading @@ -483,20 +490,22 @@ static int dabusb_startrek (pdabusb_t s) while (!dabusb_add_buf_tail(s, &s->rec_buff_list, &s->free_buff_list)) { dbg("submitting: end:%p s->rec_buff_list:%p", s->rec_buff_list.prev, &s->rec_buff_list); dbg("submitting: end:%p s->rec_buff_list:%p", s->rec_buff_list.prev, &s->rec_buff_list); end = list_entry (s->rec_buff_list.prev, buff_t, buff_list); end = list_entry(s->rec_buff_list.prev, buff_t, buff_list); ret = usb_submit_urb(end->purb, GFP_KERNEL); if (ret) { dev_err(&s->usbdev->dev, "usb_submit_urb returned:%d\n", ret); if (dabusb_add_buf_tail (s, &s->free_buff_list, &s->rec_buff_list)) if (dabusb_add_buf_tail(s, &s->free_buff_list, &s->rec_buff_list)) dev_err(&s->usbdev->dev, "startrek: dabusb_add_buf_tail failed\n"); break; } else } else atomic_inc(&s->pending_io); } dbg("pending_io: %d", s->pending_io.counter); Loading @@ -505,7 +514,8 @@ static int dabusb_startrek (pdabusb_t s) return 0; } static ssize_t dabusb_read (struct file *file, char __user *buf, size_t count, loff_t * ppos) static ssize_t dabusb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { pdabusb_t s = (pdabusb_t)file->private_data; unsigned long flags; Loading Loading @@ -547,8 +557,8 @@ static ssize_t dabusb_read (struct file *file, char __user *buf, size_t count, l spin_unlock_irqrestore(&s->lock, flags); if (purb->status == -EINPROGRESS) { if (file->f_flags & O_NONBLOCK) // return nonblocking { /* return nonblocking */ if (file->f_flags & O_NONBLOCK) { if (!ret) ret = -EAGAIN; goto err; Loading Loading @@ -578,16 +588,20 @@ static ssize_t dabusb_read (struct file *file, char __user *buf, size_t count, l goto err; } rem = purb->actual_length - s->readptr; // set remaining bytes to copy /* set remaining bytes to copy */ rem = purb->actual_length - s->readptr; if (count >= rem) cnt = rem; else cnt = count; dbg("copy_to_user:%p %p %d",buf, purb->transfer_buffer + s->readptr, cnt); dbg("copy_to_user:%p %p %d", buf, purb->transfer_buffer + s->readptr, cnt); if (copy_to_user (buf, purb->transfer_buffer + s->readptr, cnt)) { if (copy_to_user(buf, purb->transfer_buffer + s->readptr, cnt)) { dev_err(&s->usbdev->dev, "read: copy_to_user failed\n"); if (!ret) ret = -EFAULT; Loading @@ -600,14 +614,15 @@ static ssize_t dabusb_read (struct file *file, char __user *buf, size_t count, l ret += cnt; if (s->readptr == purb->actual_length) { // finished, take next buffer if (dabusb_add_buf_tail (s, &s->free_buff_list, &s->rec_buff_list)) /* finished, take next buffer */ if (dabusb_add_buf_tail(s, &s->free_buff_list, &s->rec_buff_list)) dev_err(&s->usbdev->dev, "read: dabusb_add_buf_tail failed\n"); s->readptr = 0; } } err: //mutex_unlock(&s->mutex); err: /*mutex_unlock(&s->mutex);*/ return ret; } Loading Loading @@ -665,8 +680,7 @@ static int dabusb_release (struct inode *inode, struct file *file) if (!s->remove_pending) { if (usb_set_interface(s->usbdev, _DABUSB_IF, 0) < 0) dev_err(&s->usbdev->dev, "set_interface failed\n"); } else } else wake_up(&s->remove_ok); s->opened = 0; Loading Loading @@ -727,8 +741,7 @@ static long dabusb_ioctl (struct file *file, unsigned int cmd, unsigned long arg return ret; } static const struct file_operations dabusb_fops = { static const struct file_operations dabusb_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .read = dabusb_read, Loading Loading @@ -787,8 +800,7 @@ static int dabusb_probe (struct usb_interface *intf, if (le16_to_cpu(usbdev->descriptor.idProduct) == 0x2131) { dabusb_loadmem(s, NULL); goto reject; } else { } else { dabusb_fpga_download(s, NULL); if (usb_set_interface(s->usbdev, _DABUSB_IF, 0) < 0) { Loading Loading @@ -841,7 +853,7 @@ static void dabusb_disconnect (struct usb_interface *intf) } static struct usb_device_id dabusb_ids[] = { // { USB_DEVICE(0x0547, 0x2131) }, /* An2131 chip, no boot ROM */ /* { USB_DEVICE(0x0547, 0x2131) },*/ /* An2131 chip, no boot ROM */ { USB_DEVICE(0x0547, 0x9999) }, { } /* Terminating entry */ }; Loading
drivers/staging/dabusb/dabusb.h +18 −23 Original line number Diff line number Diff line #define _BULK_DATA_LEN 64 typedef struct { typedef struct { unsigned char data[_BULK_DATA_LEN]; unsigned int size; unsigned int pipe; Loading @@ -16,8 +15,7 @@ typedef struct typedef enum { _stopped = 0, _started } driver_state_t; typedef struct { typedef struct { struct mutex mutex; struct usb_device *usbdev; wait_queue_head_t wait; Loading @@ -36,15 +34,13 @@ typedef struct struct list_head rec_buff_list; } dabusb_t, *pdabusb_t; typedef struct { typedef struct { pdabusb_t s; struct urb *purb; struct list_head buff_list; } buff_t, *pbuff_t; typedef struct { typedef struct { wait_queue_head_t wait; } bulk_completion_context_t, *pbulk_completion_context_t; Loading @@ -54,11 +50,11 @@ typedef struct #define _ISOPIPESIZE 16384 #define _BULK_DATA_LEN 64 // Vendor specific request code for Anchor Upload/Download // This one is implemented in the core /* Vendor specific request code for Anchor Upload/Download *This one is implemented in the core */ #define ANCHOR_LOAD_INTERNAL 0xA0 // EZ-USB Control and Status Register. Bit 0 controls 8051 reset /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ #define CPUCS_REG 0x7F92 #define _TOTAL_BUFFERS 384 Loading @@ -67,15 +63,14 @@ typedef struct #ifndef _BYTE_DEFINED #define _BYTE_DEFINED typedef unsigned char BYTE; #endif // !_BYTE_DEFINED #endif /* !_BYTE_DEFINED */ #ifndef _WORD_DEFINED #define _WORD_DEFINED typedef unsigned short WORD; #endif // !_WORD_DEFINED #endif /* !_WORD_DEFINED */ typedef struct _INTEL_HEX_RECORD { typedef struct _INTEL_HEX_RECORD { BYTE Length; WORD Address; BYTE Type; Loading