Merge tag 'nfsd-5.3-1' of git://linux-nfs.org/~bfields/linux
[sfrench/cifs-2.6.git] / drivers / usb / misc / iowarrior.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *  Native support for the I/O-Warrior USB devices
4  *
5  *  Copyright (c) 2003-2005  Code Mercenaries GmbH
6  *  written by Christian Lucht <lucht@codemercs.com>
7  *
8  *  based on
9
10  *  usb-skeleton.c by Greg Kroah-Hartman  <greg@kroah.com>
11  *  brlvger.c by Stephane Dalton  <sdalton@videotron.ca>
12  *           and St�hane Doyon   <s.doyon@videotron.ca>
13  *
14  *  Released under the GPLv2.
15  */
16
17 #include <linux/module.h>
18 #include <linux/usb.h>
19 #include <linux/slab.h>
20 #include <linux/sched.h>
21 #include <linux/mutex.h>
22 #include <linux/poll.h>
23 #include <linux/usb/iowarrior.h>
24
25 #define DRIVER_AUTHOR "Christian Lucht <lucht@codemercs.com>"
26 #define DRIVER_DESC "USB IO-Warrior driver"
27
28 #define USB_VENDOR_ID_CODEMERCS         1984
29 /* low speed iowarrior */
30 #define USB_DEVICE_ID_CODEMERCS_IOW40   0x1500
31 #define USB_DEVICE_ID_CODEMERCS_IOW24   0x1501
32 #define USB_DEVICE_ID_CODEMERCS_IOWPV1  0x1511
33 #define USB_DEVICE_ID_CODEMERCS_IOWPV2  0x1512
34 /* full speed iowarrior */
35 #define USB_DEVICE_ID_CODEMERCS_IOW56   0x1503
36
37 /* Get a minor range for your devices from the usb maintainer */
38 #ifdef CONFIG_USB_DYNAMIC_MINORS
39 #define IOWARRIOR_MINOR_BASE    0
40 #else
41 #define IOWARRIOR_MINOR_BASE    208     // SKELETON_MINOR_BASE 192 + 16, not official yet
42 #endif
43
44 /* interrupt input queue size */
45 #define MAX_INTERRUPT_BUFFER 16
46 /*
47    maximum number of urbs that are submitted for writes at the same time,
48    this applies to the IOWarrior56 only!
49    IOWarrior24 and IOWarrior40 use synchronous usb_control_msg calls.
50 */
51 #define MAX_WRITES_IN_FLIGHT 4
52
53 MODULE_AUTHOR(DRIVER_AUTHOR);
54 MODULE_DESCRIPTION(DRIVER_DESC);
55 MODULE_LICENSE("GPL");
56
57 /* Module parameters */
58 static DEFINE_MUTEX(iowarrior_mutex);
59
60 static struct usb_driver iowarrior_driver;
61 static DEFINE_MUTEX(iowarrior_open_disc_lock);
62
63 /*--------------*/
64 /*     data     */
65 /*--------------*/
66
67 /* Structure to hold all of our device specific stuff */
68 struct iowarrior {
69         struct mutex mutex;                     /* locks this structure */
70         struct usb_device *udev;                /* save off the usb device pointer */
71         struct usb_interface *interface;        /* the interface for this device */
72         unsigned char minor;                    /* the starting minor number for this device */
73         struct usb_endpoint_descriptor *int_out_endpoint;       /* endpoint for reading (needed for IOW56 only) */
74         struct usb_endpoint_descriptor *int_in_endpoint;        /* endpoint for reading */
75         struct urb *int_in_urb;         /* the urb for reading data */
76         unsigned char *int_in_buffer;   /* buffer for data to be read */
77         unsigned char serial_number;    /* to detect lost packages */
78         unsigned char *read_queue;      /* size is MAX_INTERRUPT_BUFFER * packet size */
79         wait_queue_head_t read_wait;
80         wait_queue_head_t write_wait;   /* wait-queue for writing to the device */
81         atomic_t write_busy;            /* number of write-urbs submitted */
82         atomic_t read_idx;
83         atomic_t intr_idx;
84         atomic_t overflow_flag;         /* signals an index 'rollover' */
85         int present;                    /* this is 1 as long as the device is connected */
86         int opened;                     /* this is 1 if the device is currently open */
87         char chip_serial[9];            /* the serial number string of the chip connected */
88         int report_size;                /* number of bytes in a report */
89         u16 product_id;
90 };
91
92 /*--------------*/
93 /*    globals   */
94 /*--------------*/
95
96 /*
97  *  USB spec identifies 5 second timeouts.
98  */
99 #define GET_TIMEOUT 5
100 #define USB_REQ_GET_REPORT  0x01
101 //#if 0
102 static int usb_get_report(struct usb_device *dev,
103                           struct usb_host_interface *inter, unsigned char type,
104                           unsigned char id, void *buf, int size)
105 {
106         return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
107                                USB_REQ_GET_REPORT,
108                                USB_DIR_IN | USB_TYPE_CLASS |
109                                USB_RECIP_INTERFACE, (type << 8) + id,
110                                inter->desc.bInterfaceNumber, buf, size,
111                                GET_TIMEOUT*HZ);
112 }
113 //#endif
114
115 #define USB_REQ_SET_REPORT 0x09
116
117 static int usb_set_report(struct usb_interface *intf, unsigned char type,
118                           unsigned char id, void *buf, int size)
119 {
120         return usb_control_msg(interface_to_usbdev(intf),
121                                usb_sndctrlpipe(interface_to_usbdev(intf), 0),
122                                USB_REQ_SET_REPORT,
123                                USB_TYPE_CLASS | USB_RECIP_INTERFACE,
124                                (type << 8) + id,
125                                intf->cur_altsetting->desc.bInterfaceNumber, buf,
126                                size, HZ);
127 }
128
129 /*---------------------*/
130 /* driver registration */
131 /*---------------------*/
132 /* table of devices that work with this driver */
133 static const struct usb_device_id iowarrior_ids[] = {
134         {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW40)},
135         {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24)},
136         {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV1)},
137         {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV2)},
138         {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56)},
139         {}                      /* Terminating entry */
140 };
141 MODULE_DEVICE_TABLE(usb, iowarrior_ids);
142
143 /*
144  * USB callback handler for reading data
145  */
146 static void iowarrior_callback(struct urb *urb)
147 {
148         struct iowarrior *dev = urb->context;
149         int intr_idx;
150         int read_idx;
151         int aux_idx;
152         int offset;
153         int status = urb->status;
154         int retval;
155
156         switch (status) {
157         case 0:
158                 /* success */
159                 break;
160         case -ECONNRESET:
161         case -ENOENT:
162         case -ESHUTDOWN:
163                 return;
164         default:
165                 goto exit;
166         }
167
168         intr_idx = atomic_read(&dev->intr_idx);
169         /* aux_idx become previous intr_idx */
170         aux_idx = (intr_idx == 0) ? (MAX_INTERRUPT_BUFFER - 1) : (intr_idx - 1);
171         read_idx = atomic_read(&dev->read_idx);
172
173         /* queue is not empty and it's interface 0 */
174         if ((intr_idx != read_idx)
175             && (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0)) {
176                 /* + 1 for serial number */
177                 offset = aux_idx * (dev->report_size + 1);
178                 if (!memcmp
179                     (dev->read_queue + offset, urb->transfer_buffer,
180                      dev->report_size)) {
181                         /* equal values on interface 0 will be ignored */
182                         goto exit;
183                 }
184         }
185
186         /* aux_idx become next intr_idx */
187         aux_idx = (intr_idx == (MAX_INTERRUPT_BUFFER - 1)) ? 0 : (intr_idx + 1);
188         if (read_idx == aux_idx) {
189                 /* queue full, dropping oldest input */
190                 read_idx = (++read_idx == MAX_INTERRUPT_BUFFER) ? 0 : read_idx;
191                 atomic_set(&dev->read_idx, read_idx);
192                 atomic_set(&dev->overflow_flag, 1);
193         }
194
195         /* +1 for serial number */
196         offset = intr_idx * (dev->report_size + 1);
197         memcpy(dev->read_queue + offset, urb->transfer_buffer,
198                dev->report_size);
199         *(dev->read_queue + offset + (dev->report_size)) = dev->serial_number++;
200
201         atomic_set(&dev->intr_idx, aux_idx);
202         /* tell the blocking read about the new data */
203         wake_up_interruptible(&dev->read_wait);
204
205 exit:
206         retval = usb_submit_urb(urb, GFP_ATOMIC);
207         if (retval)
208                 dev_err(&dev->interface->dev, "%s - usb_submit_urb failed with result %d\n",
209                         __func__, retval);
210
211 }
212
213 /*
214  * USB Callback handler for write-ops
215  */
216 static void iowarrior_write_callback(struct urb *urb)
217 {
218         struct iowarrior *dev;
219         int status = urb->status;
220
221         dev = urb->context;
222         /* sync/async unlink faults aren't errors */
223         if (status &&
224             !(status == -ENOENT ||
225               status == -ECONNRESET || status == -ESHUTDOWN)) {
226                 dev_dbg(&dev->interface->dev,
227                         "nonzero write bulk status received: %d\n", status);
228         }
229         /* free up our allocated buffer */
230         usb_free_coherent(urb->dev, urb->transfer_buffer_length,
231                           urb->transfer_buffer, urb->transfer_dma);
232         /* tell a waiting writer the interrupt-out-pipe is available again */
233         atomic_dec(&dev->write_busy);
234         wake_up_interruptible(&dev->write_wait);
235 }
236
237 /**
238  *      iowarrior_delete
239  */
240 static inline void iowarrior_delete(struct iowarrior *dev)
241 {
242         dev_dbg(&dev->interface->dev, "minor %d\n", dev->minor);
243         kfree(dev->int_in_buffer);
244         usb_free_urb(dev->int_in_urb);
245         kfree(dev->read_queue);
246         kfree(dev);
247 }
248
249 /*---------------------*/
250 /* fops implementation */
251 /*---------------------*/
252
253 static int read_index(struct iowarrior *dev)
254 {
255         int intr_idx, read_idx;
256
257         read_idx = atomic_read(&dev->read_idx);
258         intr_idx = atomic_read(&dev->intr_idx);
259
260         return (read_idx == intr_idx ? -1 : read_idx);
261 }
262
263 /**
264  *  iowarrior_read
265  */
266 static ssize_t iowarrior_read(struct file *file, char __user *buffer,
267                               size_t count, loff_t *ppos)
268 {
269         struct iowarrior *dev;
270         int read_idx;
271         int offset;
272
273         dev = file->private_data;
274
275         /* verify that the device wasn't unplugged */
276         if (!dev || !dev->present)
277                 return -ENODEV;
278
279         dev_dbg(&dev->interface->dev, "minor %d, count = %zd\n",
280                 dev->minor, count);
281
282         /* read count must be packet size (+ time stamp) */
283         if ((count != dev->report_size)
284             && (count != (dev->report_size + 1)))
285                 return -EINVAL;
286
287         /* repeat until no buffer overrun in callback handler occur */
288         do {
289                 atomic_set(&dev->overflow_flag, 0);
290                 if ((read_idx = read_index(dev)) == -1) {
291                         /* queue empty */
292                         if (file->f_flags & O_NONBLOCK)
293                                 return -EAGAIN;
294                         else {
295                                 //next line will return when there is either new data, or the device is unplugged
296                                 int r = wait_event_interruptible(dev->read_wait,
297                                                                  (!dev->present
298                                                                   || (read_idx =
299                                                                       read_index
300                                                                       (dev)) !=
301                                                                   -1));
302                                 if (r) {
303                                         //we were interrupted by a signal
304                                         return -ERESTART;
305                                 }
306                                 if (!dev->present) {
307                                         //The device was unplugged
308                                         return -ENODEV;
309                                 }
310                                 if (read_idx == -1) {
311                                         // Can this happen ???
312                                         return 0;
313                                 }
314                         }
315                 }
316
317                 offset = read_idx * (dev->report_size + 1);
318                 if (copy_to_user(buffer, dev->read_queue + offset, count)) {
319                         return -EFAULT;
320                 }
321         } while (atomic_read(&dev->overflow_flag));
322
323         read_idx = ++read_idx == MAX_INTERRUPT_BUFFER ? 0 : read_idx;
324         atomic_set(&dev->read_idx, read_idx);
325         return count;
326 }
327
328 /*
329  * iowarrior_write
330  */
331 static ssize_t iowarrior_write(struct file *file,
332                                const char __user *user_buffer,
333                                size_t count, loff_t *ppos)
334 {
335         struct iowarrior *dev;
336         int retval = 0;
337         char *buf = NULL;       /* for IOW24 and IOW56 we need a buffer */
338         struct urb *int_out_urb = NULL;
339
340         dev = file->private_data;
341
342         mutex_lock(&dev->mutex);
343         /* verify that the device wasn't unplugged */
344         if (!dev->present) {
345                 retval = -ENODEV;
346                 goto exit;
347         }
348         dev_dbg(&dev->interface->dev, "minor %d, count = %zd\n",
349                 dev->minor, count);
350         /* if count is 0 we're already done */
351         if (count == 0) {
352                 retval = 0;
353                 goto exit;
354         }
355         /* We only accept full reports */
356         if (count != dev->report_size) {
357                 retval = -EINVAL;
358                 goto exit;
359         }
360         switch (dev->product_id) {
361         case USB_DEVICE_ID_CODEMERCS_IOW24:
362         case USB_DEVICE_ID_CODEMERCS_IOWPV1:
363         case USB_DEVICE_ID_CODEMERCS_IOWPV2:
364         case USB_DEVICE_ID_CODEMERCS_IOW40:
365                 /* IOW24 and IOW40 use a synchronous call */
366                 buf = memdup_user(user_buffer, count);
367                 if (IS_ERR(buf)) {
368                         retval = PTR_ERR(buf);
369                         goto exit;
370                 }
371                 retval = usb_set_report(dev->interface, 2, 0, buf, count);
372                 kfree(buf);
373                 goto exit;
374                 break;
375         case USB_DEVICE_ID_CODEMERCS_IOW56:
376                 /* The IOW56 uses asynchronous IO and more urbs */
377                 if (atomic_read(&dev->write_busy) == MAX_WRITES_IN_FLIGHT) {
378                         /* Wait until we are below the limit for submitted urbs */
379                         if (file->f_flags & O_NONBLOCK) {
380                                 retval = -EAGAIN;
381                                 goto exit;
382                         } else {
383                                 retval = wait_event_interruptible(dev->write_wait,
384                                                                   (!dev->present || (atomic_read (&dev-> write_busy) < MAX_WRITES_IN_FLIGHT)));
385                                 if (retval) {
386                                         /* we were interrupted by a signal */
387                                         retval = -ERESTART;
388                                         goto exit;
389                                 }
390                                 if (!dev->present) {
391                                         /* The device was unplugged */
392                                         retval = -ENODEV;
393                                         goto exit;
394                                 }
395                                 if (!dev->opened) {
396                                         /* We were closed while waiting for an URB */
397                                         retval = -ENODEV;
398                                         goto exit;
399                                 }
400                         }
401                 }
402                 atomic_inc(&dev->write_busy);
403                 int_out_urb = usb_alloc_urb(0, GFP_KERNEL);
404                 if (!int_out_urb) {
405                         retval = -ENOMEM;
406                         goto error_no_urb;
407                 }
408                 buf = usb_alloc_coherent(dev->udev, dev->report_size,
409                                          GFP_KERNEL, &int_out_urb->transfer_dma);
410                 if (!buf) {
411                         retval = -ENOMEM;
412                         dev_dbg(&dev->interface->dev,
413                                 "Unable to allocate buffer\n");
414                         goto error_no_buffer;
415                 }
416                 usb_fill_int_urb(int_out_urb, dev->udev,
417                                  usb_sndintpipe(dev->udev,
418                                                 dev->int_out_endpoint->bEndpointAddress),
419                                  buf, dev->report_size,
420                                  iowarrior_write_callback, dev,
421                                  dev->int_out_endpoint->bInterval);
422                 int_out_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
423                 if (copy_from_user(buf, user_buffer, count)) {
424                         retval = -EFAULT;
425                         goto error;
426                 }
427                 retval = usb_submit_urb(int_out_urb, GFP_KERNEL);
428                 if (retval) {
429                         dev_dbg(&dev->interface->dev,
430                                 "submit error %d for urb nr.%d\n",
431                                 retval, atomic_read(&dev->write_busy));
432                         goto error;
433                 }
434                 /* submit was ok */
435                 retval = count;
436                 usb_free_urb(int_out_urb);
437                 goto exit;
438                 break;
439         default:
440                 /* what do we have here ? An unsupported Product-ID ? */
441                 dev_err(&dev->interface->dev, "%s - not supported for product=0x%x\n",
442                         __func__, dev->product_id);
443                 retval = -EFAULT;
444                 goto exit;
445                 break;
446         }
447 error:
448         usb_free_coherent(dev->udev, dev->report_size, buf,
449                           int_out_urb->transfer_dma);
450 error_no_buffer:
451         usb_free_urb(int_out_urb);
452 error_no_urb:
453         atomic_dec(&dev->write_busy);
454         wake_up_interruptible(&dev->write_wait);
455 exit:
456         mutex_unlock(&dev->mutex);
457         return retval;
458 }
459
460 /**
461  *      iowarrior_ioctl
462  */
463 static long iowarrior_ioctl(struct file *file, unsigned int cmd,
464                                                         unsigned long arg)
465 {
466         struct iowarrior *dev = NULL;
467         __u8 *buffer;
468         __u8 __user *user_buffer;
469         int retval;
470         int io_res;             /* checks for bytes read/written and copy_to/from_user results */
471
472         dev = file->private_data;
473         if (!dev)
474                 return -ENODEV;
475
476         buffer = kzalloc(dev->report_size, GFP_KERNEL);
477         if (!buffer)
478                 return -ENOMEM;
479
480         /* lock this object */
481         mutex_lock(&iowarrior_mutex);
482         mutex_lock(&dev->mutex);
483
484         /* verify that the device wasn't unplugged */
485         if (!dev->present) {
486                 retval = -ENODEV;
487                 goto error_out;
488         }
489
490         dev_dbg(&dev->interface->dev, "minor %d, cmd 0x%.4x, arg %ld\n",
491                 dev->minor, cmd, arg);
492
493         retval = 0;
494         io_res = 0;
495         switch (cmd) {
496         case IOW_WRITE:
497                 if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24 ||
498                     dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV1 ||
499                     dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV2 ||
500                     dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW40) {
501                         user_buffer = (__u8 __user *)arg;
502                         io_res = copy_from_user(buffer, user_buffer,
503                                                 dev->report_size);
504                         if (io_res) {
505                                 retval = -EFAULT;
506                         } else {
507                                 io_res = usb_set_report(dev->interface, 2, 0,
508                                                         buffer,
509                                                         dev->report_size);
510                                 if (io_res < 0)
511                                         retval = io_res;
512                         }
513                 } else {
514                         retval = -EINVAL;
515                         dev_err(&dev->interface->dev,
516                                 "ioctl 'IOW_WRITE' is not supported for product=0x%x.\n",
517                                 dev->product_id);
518                 }
519                 break;
520         case IOW_READ:
521                 user_buffer = (__u8 __user *)arg;
522                 io_res = usb_get_report(dev->udev,
523                                         dev->interface->cur_altsetting, 1, 0,
524                                         buffer, dev->report_size);
525                 if (io_res < 0)
526                         retval = io_res;
527                 else {
528                         io_res = copy_to_user(user_buffer, buffer, dev->report_size);
529                         if (io_res)
530                                 retval = -EFAULT;
531                 }
532                 break;
533         case IOW_GETINFO:
534                 {
535                         /* Report available information for the device */
536                         struct iowarrior_info info;
537                         /* needed for power consumption */
538                         struct usb_config_descriptor *cfg_descriptor = &dev->udev->actconfig->desc;
539
540                         memset(&info, 0, sizeof(info));
541                         /* directly from the descriptor */
542                         info.vendor = le16_to_cpu(dev->udev->descriptor.idVendor);
543                         info.product = dev->product_id;
544                         info.revision = le16_to_cpu(dev->udev->descriptor.bcdDevice);
545
546                         /* 0==UNKNOWN, 1==LOW(usb1.1) ,2=FULL(usb1.1), 3=HIGH(usb2.0) */
547                         info.speed = dev->udev->speed;
548                         info.if_num = dev->interface->cur_altsetting->desc.bInterfaceNumber;
549                         info.report_size = dev->report_size;
550
551                         /* serial number string has been read earlier 8 chars or empty string */
552                         memcpy(info.serial, dev->chip_serial,
553                                sizeof(dev->chip_serial));
554                         if (cfg_descriptor == NULL) {
555                                 info.power = -1;        /* no information available */
556                         } else {
557                                 /* the MaxPower is stored in units of 2mA to make it fit into a byte-value */
558                                 info.power = cfg_descriptor->bMaxPower * 2;
559                         }
560                         io_res = copy_to_user((struct iowarrior_info __user *)arg, &info,
561                                          sizeof(struct iowarrior_info));
562                         if (io_res)
563                                 retval = -EFAULT;
564                         break;
565                 }
566         default:
567                 /* return that we did not understand this ioctl call */
568                 retval = -ENOTTY;
569                 break;
570         }
571 error_out:
572         /* unlock the device */
573         mutex_unlock(&dev->mutex);
574         mutex_unlock(&iowarrior_mutex);
575         kfree(buffer);
576         return retval;
577 }
578
579 /**
580  *      iowarrior_open
581  */
582 static int iowarrior_open(struct inode *inode, struct file *file)
583 {
584         struct iowarrior *dev = NULL;
585         struct usb_interface *interface;
586         int subminor;
587         int retval = 0;
588
589         mutex_lock(&iowarrior_mutex);
590         subminor = iminor(inode);
591
592         interface = usb_find_interface(&iowarrior_driver, subminor);
593         if (!interface) {
594                 mutex_unlock(&iowarrior_mutex);
595                 printk(KERN_ERR "%s - error, can't find device for minor %d\n",
596                        __func__, subminor);
597                 return -ENODEV;
598         }
599
600         mutex_lock(&iowarrior_open_disc_lock);
601         dev = usb_get_intfdata(interface);
602         if (!dev) {
603                 mutex_unlock(&iowarrior_open_disc_lock);
604                 mutex_unlock(&iowarrior_mutex);
605                 return -ENODEV;
606         }
607
608         mutex_lock(&dev->mutex);
609         mutex_unlock(&iowarrior_open_disc_lock);
610
611         /* Only one process can open each device, no sharing. */
612         if (dev->opened) {
613                 retval = -EBUSY;
614                 goto out;
615         }
616
617         /* setup interrupt handler for receiving values */
618         if ((retval = usb_submit_urb(dev->int_in_urb, GFP_KERNEL)) < 0) {
619                 dev_err(&interface->dev, "Error %d while submitting URB\n", retval);
620                 retval = -EFAULT;
621                 goto out;
622         }
623         /* increment our usage count for the driver */
624         ++dev->opened;
625         /* save our object in the file's private structure */
626         file->private_data = dev;
627         retval = 0;
628
629 out:
630         mutex_unlock(&dev->mutex);
631         mutex_unlock(&iowarrior_mutex);
632         return retval;
633 }
634
635 /**
636  *      iowarrior_release
637  */
638 static int iowarrior_release(struct inode *inode, struct file *file)
639 {
640         struct iowarrior *dev;
641         int retval = 0;
642
643         dev = file->private_data;
644         if (!dev)
645                 return -ENODEV;
646
647         dev_dbg(&dev->interface->dev, "minor %d\n", dev->minor);
648
649         /* lock our device */
650         mutex_lock(&dev->mutex);
651
652         if (dev->opened <= 0) {
653                 retval = -ENODEV;       /* close called more than once */
654                 mutex_unlock(&dev->mutex);
655         } else {
656                 dev->opened = 0;        /* we're closing now */
657                 retval = 0;
658                 if (dev->present) {
659                         /*
660                            The device is still connected so we only shutdown
661                            pending read-/write-ops.
662                          */
663                         usb_kill_urb(dev->int_in_urb);
664                         wake_up_interruptible(&dev->read_wait);
665                         wake_up_interruptible(&dev->write_wait);
666                         mutex_unlock(&dev->mutex);
667                 } else {
668                         /* The device was unplugged, cleanup resources */
669                         mutex_unlock(&dev->mutex);
670                         iowarrior_delete(dev);
671                 }
672         }
673         return retval;
674 }
675
676 static __poll_t iowarrior_poll(struct file *file, poll_table * wait)
677 {
678         struct iowarrior *dev = file->private_data;
679         __poll_t mask = 0;
680
681         if (!dev->present)
682                 return EPOLLERR | EPOLLHUP;
683
684         poll_wait(file, &dev->read_wait, wait);
685         poll_wait(file, &dev->write_wait, wait);
686
687         if (!dev->present)
688                 return EPOLLERR | EPOLLHUP;
689
690         if (read_index(dev) != -1)
691                 mask |= EPOLLIN | EPOLLRDNORM;
692
693         if (atomic_read(&dev->write_busy) < MAX_WRITES_IN_FLIGHT)
694                 mask |= EPOLLOUT | EPOLLWRNORM;
695         return mask;
696 }
697
698 /*
699  * File operations needed when we register this driver.
700  * This assumes that this driver NEEDS file operations,
701  * of course, which means that the driver is expected
702  * to have a node in the /dev directory. If the USB
703  * device were for a network interface then the driver
704  * would use "struct net_driver" instead, and a serial
705  * device would use "struct tty_driver".
706  */
707 static const struct file_operations iowarrior_fops = {
708         .owner = THIS_MODULE,
709         .write = iowarrior_write,
710         .read = iowarrior_read,
711         .unlocked_ioctl = iowarrior_ioctl,
712         .open = iowarrior_open,
713         .release = iowarrior_release,
714         .poll = iowarrior_poll,
715         .llseek = noop_llseek,
716 };
717
718 static char *iowarrior_devnode(struct device *dev, umode_t *mode)
719 {
720         return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev));
721 }
722
723 /*
724  * usb class driver info in order to get a minor number from the usb core,
725  * and to have the device registered with devfs and the driver core
726  */
727 static struct usb_class_driver iowarrior_class = {
728         .name = "iowarrior%d",
729         .devnode = iowarrior_devnode,
730         .fops = &iowarrior_fops,
731         .minor_base = IOWARRIOR_MINOR_BASE,
732 };
733
734 /*---------------------------------*/
735 /*  probe and disconnect functions */
736 /*---------------------------------*/
737 /**
738  *      iowarrior_probe
739  *
740  *      Called by the usb core when a new device is connected that it thinks
741  *      this driver might be interested in.
742  */
743 static int iowarrior_probe(struct usb_interface *interface,
744                            const struct usb_device_id *id)
745 {
746         struct usb_device *udev = interface_to_usbdev(interface);
747         struct iowarrior *dev = NULL;
748         struct usb_host_interface *iface_desc;
749         int retval = -ENOMEM;
750         int res;
751
752         /* allocate memory for our device state and initialize it */
753         dev = kzalloc(sizeof(struct iowarrior), GFP_KERNEL);
754         if (!dev)
755                 return retval;
756
757         mutex_init(&dev->mutex);
758
759         atomic_set(&dev->intr_idx, 0);
760         atomic_set(&dev->read_idx, 0);
761         atomic_set(&dev->overflow_flag, 0);
762         init_waitqueue_head(&dev->read_wait);
763         atomic_set(&dev->write_busy, 0);
764         init_waitqueue_head(&dev->write_wait);
765
766         dev->udev = udev;
767         dev->interface = interface;
768
769         iface_desc = interface->cur_altsetting;
770         dev->product_id = le16_to_cpu(udev->descriptor.idProduct);
771
772         res = usb_find_last_int_in_endpoint(iface_desc, &dev->int_in_endpoint);
773         if (res) {
774                 dev_err(&interface->dev, "no interrupt-in endpoint found\n");
775                 retval = res;
776                 goto error;
777         }
778
779         if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) {
780                 res = usb_find_last_int_out_endpoint(iface_desc,
781                                 &dev->int_out_endpoint);
782                 if (res) {
783                         dev_err(&interface->dev, "no interrupt-out endpoint found\n");
784                         retval = res;
785                         goto error;
786                 }
787         }
788
789         /* we have to check the report_size often, so remember it in the endianness suitable for our machine */
790         dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint);
791         if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) &&
792             (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56))
793                 /* IOWarrior56 has wMaxPacketSize different from report size */
794                 dev->report_size = 7;
795
796         /* create the urb and buffer for reading */
797         dev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);
798         if (!dev->int_in_urb)
799                 goto error;
800         dev->int_in_buffer = kmalloc(dev->report_size, GFP_KERNEL);
801         if (!dev->int_in_buffer)
802                 goto error;
803         usb_fill_int_urb(dev->int_in_urb, dev->udev,
804                          usb_rcvintpipe(dev->udev,
805                                         dev->int_in_endpoint->bEndpointAddress),
806                          dev->int_in_buffer, dev->report_size,
807                          iowarrior_callback, dev,
808                          dev->int_in_endpoint->bInterval);
809         /* create an internal buffer for interrupt data from the device */
810         dev->read_queue =
811             kmalloc_array(dev->report_size + 1, MAX_INTERRUPT_BUFFER,
812                           GFP_KERNEL);
813         if (!dev->read_queue)
814                 goto error;
815         /* Get the serial-number of the chip */
816         memset(dev->chip_serial, 0x00, sizeof(dev->chip_serial));
817         usb_string(udev, udev->descriptor.iSerialNumber, dev->chip_serial,
818                    sizeof(dev->chip_serial));
819         if (strlen(dev->chip_serial) != 8)
820                 memset(dev->chip_serial, 0x00, sizeof(dev->chip_serial));
821
822         /* Set the idle timeout to 0, if this is interface 0 */
823         if (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) {
824             usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
825                             0x0A,
826                             USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0,
827                             0, NULL, 0, USB_CTRL_SET_TIMEOUT);
828         }
829         /* allow device read and ioctl */
830         dev->present = 1;
831
832         /* we can register the device now, as it is ready */
833         usb_set_intfdata(interface, dev);
834
835         retval = usb_register_dev(interface, &iowarrior_class);
836         if (retval) {
837                 /* something prevented us from registering this driver */
838                 dev_err(&interface->dev, "Not able to get a minor for this device.\n");
839                 usb_set_intfdata(interface, NULL);
840                 goto error;
841         }
842
843         dev->minor = interface->minor;
844
845         /* let the user know what node this device is now attached to */
846         dev_info(&interface->dev, "IOWarrior product=0x%x, serial=%s interface=%d "
847                  "now attached to iowarrior%d\n", dev->product_id, dev->chip_serial,
848                  iface_desc->desc.bInterfaceNumber, dev->minor - IOWARRIOR_MINOR_BASE);
849         return retval;
850
851 error:
852         iowarrior_delete(dev);
853         return retval;
854 }
855
856 /**
857  *      iowarrior_disconnect
858  *
859  *      Called by the usb core when the device is removed from the system.
860  */
861 static void iowarrior_disconnect(struct usb_interface *interface)
862 {
863         struct iowarrior *dev;
864         int minor;
865
866         dev = usb_get_intfdata(interface);
867         mutex_lock(&iowarrior_open_disc_lock);
868         usb_set_intfdata(interface, NULL);
869         /* prevent device read, write and ioctl */
870         dev->present = 0;
871
872         minor = dev->minor;
873         mutex_unlock(&iowarrior_open_disc_lock);
874         /* give back our minor - this will call close() locks need to be dropped at this point*/
875
876         usb_deregister_dev(interface, &iowarrior_class);
877
878         mutex_lock(&dev->mutex);
879
880         /* prevent device read, write and ioctl */
881
882         mutex_unlock(&dev->mutex);
883
884         if (dev->opened) {
885                 /* There is a process that holds a filedescriptor to the device ,
886                    so we only shutdown read-/write-ops going on.
887                    Deleting the device is postponed until close() was called.
888                  */
889                 usb_kill_urb(dev->int_in_urb);
890                 wake_up_interruptible(&dev->read_wait);
891                 wake_up_interruptible(&dev->write_wait);
892         } else {
893                 /* no process is using the device, cleanup now */
894                 iowarrior_delete(dev);
895         }
896
897         dev_info(&interface->dev, "I/O-Warror #%d now disconnected\n",
898                  minor - IOWARRIOR_MINOR_BASE);
899 }
900
901 /* usb specific object needed to register this driver with the usb subsystem */
902 static struct usb_driver iowarrior_driver = {
903         .name = "iowarrior",
904         .probe = iowarrior_probe,
905         .disconnect = iowarrior_disconnect,
906         .id_table = iowarrior_ids,
907 };
908
909 module_usb_driver(iowarrior_driver);