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