Linux Audio

Check our new training course

Loading...
v3.1
  1/* -*- linux-c -*- */
  2
  3/* 
  4 * Driver for USB Rio 500
  5 *
  6 * Cesar Miquel (miquel@df.uba.ar)
  7 * 
  8 * based on hp_scanner.c by David E. Nelson (dnelson@jump.net)
  9 * 
 10 * This program is free software; you can redistribute it and/or
 11 * modify it under the terms of the GNU General Public License as
 12 * published by the Free Software Foundation; either version 2 of the
 13 * License, or (at your option) any later version.
 14 *
 15 * This program is distributed in the hope that it will be useful, but
 16 * WITHOUT ANY WARRANTY; without even the implied warranty of
 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 18 * General Public License for more details.
 19 *
 20 * You should have received a copy of the GNU General Public License
 21 * along with this program; if not, write to the Free Software
 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 23 *
 24 * Based upon mouse.c (Brad Keryan) and printer.c (Michael Gee).
 25 *
 26 * Changelog:
 27 * 30/05/2003  replaced lock/unlock kernel with up/down
 28 *             Daniele Bellucci  bellucda@tiscali.it
 29 * */
 30
 31#include <linux/module.h>
 32#include <linux/kernel.h>
 33#include <linux/signal.h>
 34#include <linux/sched.h>
 35#include <linux/mutex.h>
 36#include <linux/errno.h>
 37#include <linux/random.h>
 38#include <linux/poll.h>
 39#include <linux/init.h>
 40#include <linux/slab.h>
 41#include <linux/spinlock.h>
 42#include <linux/usb.h>
 43#include <linux/wait.h>
 44
 45#include "rio500_usb.h"
 46
 47/*
 48 * Version Information
 49 */
 50#define DRIVER_VERSION "v1.1"
 51#define DRIVER_AUTHOR "Cesar Miquel <miquel@df.uba.ar>"
 52#define DRIVER_DESC "USB Rio 500 driver"
 53
 54#define RIO_MINOR	64
 55
 56/* stall/wait timeout for rio */
 57#define NAK_TIMEOUT (HZ)
 58
 59#define IBUF_SIZE 0x1000
 60
 61/* Size of the rio buffer */
 62#define OBUF_SIZE 0x10000
 63
 64struct rio_usb_data {
 65        struct usb_device *rio_dev;     /* init: probe_rio */
 66        unsigned int ifnum;             /* Interface number of the USB device */
 67        int isopen;                     /* nz if open */
 68        int present;                    /* Device is present on the bus */
 69        char *obuf, *ibuf;              /* transfer buffers */
 70        char bulk_in_ep, bulk_out_ep;   /* Endpoint assignments */
 71        wait_queue_head_t wait_q;       /* for timeouts */
 72	struct mutex lock;          /* general race avoidance */
 73};
 74
 75static DEFINE_MUTEX(rio500_mutex);
 76static struct rio_usb_data rio_instance;
 77
 78static int open_rio(struct inode *inode, struct file *file)
 79{
 80	struct rio_usb_data *rio = &rio_instance;
 81
 82	/* against disconnect() */
 83	mutex_lock(&rio500_mutex);
 84	mutex_lock(&(rio->lock));
 85
 86	if (rio->isopen || !rio->present) {
 87		mutex_unlock(&(rio->lock));
 88		mutex_unlock(&rio500_mutex);
 89		return -EBUSY;
 90	}
 91	rio->isopen = 1;
 92
 93	init_waitqueue_head(&rio->wait_q);
 94
 95	mutex_unlock(&(rio->lock));
 96
 97	dev_info(&rio->rio_dev->dev, "Rio opened.\n");
 98	mutex_unlock(&rio500_mutex);
 99
100	return 0;
101}
102
103static int close_rio(struct inode *inode, struct file *file)
104{
105	struct rio_usb_data *rio = &rio_instance;
106
107	rio->isopen = 0;
108
109	dev_info(&rio->rio_dev->dev, "Rio closed.\n");
110	return 0;
111}
112
113static long ioctl_rio(struct file *file, unsigned int cmd, unsigned long arg)
114{
115	struct RioCommand rio_cmd;
116	struct rio_usb_data *rio = &rio_instance;
117	void __user *data;
118	unsigned char *buffer;
119	int result, requesttype;
120	int retries;
121	int retval=0;
122
123	mutex_lock(&(rio->lock));
124        /* Sanity check to make sure rio is connected, powered, etc */
125        if (rio->present == 0 || rio->rio_dev == NULL) {
126		retval = -ENODEV;
127		goto err_out;
128	}
129
130	switch (cmd) {
131	case RIO_RECV_COMMAND:
132		data = (void __user *) arg;
133		if (data == NULL)
134			break;
135		if (copy_from_user(&rio_cmd, data, sizeof(struct RioCommand))) {
136			retval = -EFAULT;
137			goto err_out;
138		}
139		if (rio_cmd.length < 0 || rio_cmd.length > PAGE_SIZE) {
140			retval = -EINVAL;
141			goto err_out;
142		}
143		buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
144		if (buffer == NULL) {
145			retval = -ENOMEM;
146			goto err_out;
147		}
148		if (copy_from_user(buffer, rio_cmd.buffer, rio_cmd.length)) {
149			retval = -EFAULT;
150			free_page((unsigned long) buffer);
151			goto err_out;
152		}
153
154		requesttype = rio_cmd.requesttype | USB_DIR_IN |
155		    USB_TYPE_VENDOR | USB_RECIP_DEVICE;
156		dbg
157		    ("sending command:reqtype=%0x req=%0x value=%0x index=%0x len=%0x",
158		     requesttype, rio_cmd.request, rio_cmd.value,
159		     rio_cmd.index, rio_cmd.length);
160		/* Send rio control message */
161		retries = 3;
162		while (retries) {
163			result = usb_control_msg(rio->rio_dev,
164						 usb_rcvctrlpipe(rio-> rio_dev, 0),
165						 rio_cmd.request,
166						 requesttype,
167						 rio_cmd.value,
168						 rio_cmd.index, buffer,
169						 rio_cmd.length,
170						 jiffies_to_msecs(rio_cmd.timeout));
171			if (result == -ETIMEDOUT)
172				retries--;
173			else if (result < 0) {
174				err("Error executing ioctrl. code = %d", result);
 
 
175				retries = 0;
176			} else {
177				dbg("Executed ioctl. Result = %d (data=%02x)",
178				     result, buffer[0]);
 
179				if (copy_to_user(rio_cmd.buffer, buffer,
180						 rio_cmd.length)) {
181					free_page((unsigned long) buffer);
182					retval = -EFAULT;
183					goto err_out;
184				}
185				retries = 0;
186			}
187
188			/* rio_cmd.buffer contains a raw stream of single byte
189			   data which has been returned from rio.  Data is
190			   interpreted at application level.  For data that
191			   will be cast to data types longer than 1 byte, data
192			   will be little_endian and will potentially need to
193			   be swapped at the app level */
194
195		}
196		free_page((unsigned long) buffer);
197		break;
198
199	case RIO_SEND_COMMAND:
200		data = (void __user *) arg;
201		if (data == NULL)
202			break;
203		if (copy_from_user(&rio_cmd, data, sizeof(struct RioCommand))) {
204			retval = -EFAULT;
205			goto err_out;
206		}
207		if (rio_cmd.length < 0 || rio_cmd.length > PAGE_SIZE) {
208			retval = -EINVAL;
209			goto err_out;
210		}
211		buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
212		if (buffer == NULL) {
213			retval = -ENOMEM;
214			goto err_out;
215		}
216		if (copy_from_user(buffer, rio_cmd.buffer, rio_cmd.length)) {
217			free_page((unsigned long)buffer);
218			retval = -EFAULT;
219			goto err_out;
220		}
221
222		requesttype = rio_cmd.requesttype | USB_DIR_OUT |
223		    USB_TYPE_VENDOR | USB_RECIP_DEVICE;
224		dbg("sending command: reqtype=%0x req=%0x value=%0x index=%0x len=%0x",
225		     requesttype, rio_cmd.request, rio_cmd.value,
226		     rio_cmd.index, rio_cmd.length);
 
227		/* Send rio control message */
228		retries = 3;
229		while (retries) {
230			result = usb_control_msg(rio->rio_dev,
231						 usb_sndctrlpipe(rio-> rio_dev, 0),
232						 rio_cmd.request,
233						 requesttype,
234						 rio_cmd.value,
235						 rio_cmd.index, buffer,
236						 rio_cmd.length,
237						 jiffies_to_msecs(rio_cmd.timeout));
238			if (result == -ETIMEDOUT)
239				retries--;
240			else if (result < 0) {
241				err("Error executing ioctrl. code = %d", result);
 
 
242				retries = 0;
243			} else {
244				dbg("Executed ioctl. Result = %d", result);
 
245				retries = 0;
246
247			}
248
249		}
250		free_page((unsigned long) buffer);
251		break;
252
253	default:
254		retval = -ENOTTY;
255		break;
256	}
257
258
259err_out:
260	mutex_unlock(&(rio->lock));
261	return retval;
262}
263
264static ssize_t
265write_rio(struct file *file, const char __user *buffer,
266	  size_t count, loff_t * ppos)
267{
268	DEFINE_WAIT(wait);
269	struct rio_usb_data *rio = &rio_instance;
270
271	unsigned long copy_size;
272	unsigned long bytes_written = 0;
273	unsigned int partial;
274
275	int result = 0;
276	int maxretry;
277	int errn = 0;
278	int intr;
279
280	intr = mutex_lock_interruptible(&(rio->lock));
281	if (intr)
282		return -EINTR;
283        /* Sanity check to make sure rio is connected, powered, etc */
284        if (rio->present == 0 || rio->rio_dev == NULL) {
285		mutex_unlock(&(rio->lock));
286		return -ENODEV;
287	}
288
289
290
291	do {
292		unsigned long thistime;
293		char *obuf = rio->obuf;
294
295		thistime = copy_size =
296		    (count >= OBUF_SIZE) ? OBUF_SIZE : count;
297		if (copy_from_user(rio->obuf, buffer, copy_size)) {
298			errn = -EFAULT;
299			goto error;
300		}
301		maxretry = 5;
302		while (thistime) {
303			if (!rio->rio_dev) {
304				errn = -ENODEV;
305				goto error;
306			}
307			if (signal_pending(current)) {
308				mutex_unlock(&(rio->lock));
309				return bytes_written ? bytes_written : -EINTR;
310			}
311
312			result = usb_bulk_msg(rio->rio_dev,
313					 usb_sndbulkpipe(rio->rio_dev, 2),
314					 obuf, thistime, &partial, 5000);
315
316			dbg("write stats: result:%d thistime:%lu partial:%u",
317			     result, thistime, partial);
 
318
319			if (result == -ETIMEDOUT) {	/* NAK - so hold for a while */
320				if (!maxretry--) {
321					errn = -ETIME;
322					goto error;
323				}
324				prepare_to_wait(&rio->wait_q, &wait, TASK_INTERRUPTIBLE);
325				schedule_timeout(NAK_TIMEOUT);
326				finish_wait(&rio->wait_q, &wait);
327				continue;
328			} else if (!result && partial) {
329				obuf += partial;
330				thistime -= partial;
331			} else
332				break;
333		};
334		if (result) {
335			err("Write Whoops - %x", result);
 
336			errn = -EIO;
337			goto error;
338		}
339		bytes_written += copy_size;
340		count -= copy_size;
341		buffer += copy_size;
342	} while (count > 0);
343
344	mutex_unlock(&(rio->lock));
345
346	return bytes_written ? bytes_written : -EIO;
347
348error:
349	mutex_unlock(&(rio->lock));
350	return errn;
351}
352
353static ssize_t
354read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
355{
356	DEFINE_WAIT(wait);
357	struct rio_usb_data *rio = &rio_instance;
358	ssize_t read_count;
359	unsigned int partial;
360	int this_read;
361	int result;
362	int maxretry = 10;
363	char *ibuf;
364	int intr;
365
366	intr = mutex_lock_interruptible(&(rio->lock));
367	if (intr)
368		return -EINTR;
369	/* Sanity check to make sure rio is connected, powered, etc */
370        if (rio->present == 0 || rio->rio_dev == NULL) {
371		mutex_unlock(&(rio->lock));
372		return -ENODEV;
373	}
374
375	ibuf = rio->ibuf;
376
377	read_count = 0;
378
379
380	while (count > 0) {
381		if (signal_pending(current)) {
382			mutex_unlock(&(rio->lock));
383			return read_count ? read_count : -EINTR;
384		}
385		if (!rio->rio_dev) {
386			mutex_unlock(&(rio->lock));
387			return -ENODEV;
388		}
389		this_read = (count >= IBUF_SIZE) ? IBUF_SIZE : count;
390
391		result = usb_bulk_msg(rio->rio_dev,
392				      usb_rcvbulkpipe(rio->rio_dev, 1),
393				      ibuf, this_read, &partial,
394				      8000);
395
396		dbg("read stats: result:%d this_read:%u partial:%u",
397		       result, this_read, partial);
 
398
399		if (partial) {
400			count = this_read = partial;
401		} else if (result == -ETIMEDOUT || result == 15) {	/* FIXME: 15 ??? */
402			if (!maxretry--) {
403				mutex_unlock(&(rio->lock));
404				err("read_rio: maxretry timeout");
 
405				return -ETIME;
406			}
407			prepare_to_wait(&rio->wait_q, &wait, TASK_INTERRUPTIBLE);
408			schedule_timeout(NAK_TIMEOUT);
409			finish_wait(&rio->wait_q, &wait);
410			continue;
411		} else if (result != -EREMOTEIO) {
412			mutex_unlock(&(rio->lock));
413			err("Read Whoops - result:%u partial:%u this_read:%u",
414			     result, partial, this_read);
 
415			return -EIO;
416		} else {
417			mutex_unlock(&(rio->lock));
418			return (0);
419		}
420
421		if (this_read) {
422			if (copy_to_user(buffer, ibuf, this_read)) {
423				mutex_unlock(&(rio->lock));
424				return -EFAULT;
425			}
426			count -= this_read;
427			read_count += this_read;
428			buffer += this_read;
429		}
430	}
431	mutex_unlock(&(rio->lock));
432	return read_count;
433}
434
435static const struct file_operations usb_rio_fops = {
436	.owner =	THIS_MODULE,
437	.read =		read_rio,
438	.write =	write_rio,
439	.unlocked_ioctl = ioctl_rio,
440	.open =		open_rio,
441	.release =	close_rio,
442	.llseek =	noop_llseek,
443};
444
445static struct usb_class_driver usb_rio_class = {
446	.name =		"rio500%d",
447	.fops =		&usb_rio_fops,
448	.minor_base =	RIO_MINOR,
449};
450
451static int probe_rio(struct usb_interface *intf,
452		     const struct usb_device_id *id)
453{
454	struct usb_device *dev = interface_to_usbdev(intf);
455	struct rio_usb_data *rio = &rio_instance;
456	int retval;
457
458	dev_info(&intf->dev, "USB Rio found at address %d\n", dev->devnum);
459
460	retval = usb_register_dev(intf, &usb_rio_class);
461	if (retval) {
462		err("Not able to get a minor for this device.");
 
463		return -ENOMEM;
464	}
465
466	rio->rio_dev = dev;
467
468	if (!(rio->obuf = kmalloc(OBUF_SIZE, GFP_KERNEL))) {
469		err("probe_rio: Not enough memory for the output buffer");
 
470		usb_deregister_dev(intf, &usb_rio_class);
471		return -ENOMEM;
472	}
473	dbg("probe_rio: obuf address:%p", rio->obuf);
474
475	if (!(rio->ibuf = kmalloc(IBUF_SIZE, GFP_KERNEL))) {
476		err("probe_rio: Not enough memory for the input buffer");
 
477		usb_deregister_dev(intf, &usb_rio_class);
478		kfree(rio->obuf);
479		return -ENOMEM;
480	}
481	dbg("probe_rio: ibuf address:%p", rio->ibuf);
482
483	mutex_init(&(rio->lock));
484
485	usb_set_intfdata (intf, rio);
486	rio->present = 1;
487
488	return 0;
489}
490
491static void disconnect_rio(struct usb_interface *intf)
492{
493	struct rio_usb_data *rio = usb_get_intfdata (intf);
494
495	usb_set_intfdata (intf, NULL);
496	mutex_lock(&rio500_mutex);
497	if (rio) {
498		usb_deregister_dev(intf, &usb_rio_class);
499
500		mutex_lock(&(rio->lock));
501		if (rio->isopen) {
502			rio->isopen = 0;
503			/* better let it finish - the release will do whats needed */
504			rio->rio_dev = NULL;
505			mutex_unlock(&(rio->lock));
506			mutex_unlock(&rio500_mutex);
507			return;
508		}
509		kfree(rio->ibuf);
510		kfree(rio->obuf);
511
512		dev_info(&intf->dev, "USB Rio disconnected.\n");
513
514		rio->present = 0;
515		mutex_unlock(&(rio->lock));
516	}
517	mutex_unlock(&rio500_mutex);
518}
519
520static const struct usb_device_id rio_table[] = {
521	{ USB_DEVICE(0x0841, 1) }, 		/* Rio 500 */
522	{ }					/* Terminating entry */
523};
524
525MODULE_DEVICE_TABLE (usb, rio_table);
526
527static struct usb_driver rio_driver = {
528	.name =		"rio500",
529	.probe =	probe_rio,
530	.disconnect =	disconnect_rio,
531	.id_table =	rio_table,
532};
533
534static int __init usb_rio_init(void)
535{
536	int retval;
537	retval = usb_register(&rio_driver);
538	if (retval)
539		goto out;
540
541	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
542	       DRIVER_DESC "\n");
543
544out:
545	return retval;
546}
547
548
549static void __exit usb_rio_cleanup(void)
550{
551	struct rio_usb_data *rio = &rio_instance;
552
553	rio->present = 0;
554	usb_deregister(&rio_driver);
555
556
557}
558
559module_init(usb_rio_init);
560module_exit(usb_rio_cleanup);
561
562MODULE_AUTHOR( DRIVER_AUTHOR );
563MODULE_DESCRIPTION( DRIVER_DESC );
564MODULE_LICENSE("GPL");
565
v4.6
  1/* -*- linux-c -*- */
  2
  3/* 
  4 * Driver for USB Rio 500
  5 *
  6 * Cesar Miquel (miquel@df.uba.ar)
  7 * 
  8 * based on hp_scanner.c by David E. Nelson (dnelson@jump.net)
  9 * 
 10 * This program is free software; you can redistribute it and/or
 11 * modify it under the terms of the GNU General Public License as
 12 * published by the Free Software Foundation; either version 2 of the
 13 * License, or (at your option) any later version.
 14 *
 15 * This program is distributed in the hope that it will be useful, but
 16 * WITHOUT ANY WARRANTY; without even the implied warranty of
 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 18 * General Public License for more details.
 19 *
 20 * You should have received a copy of the GNU General Public License
 21 * along with this program; if not, write to the Free Software
 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 23 *
 24 * Based upon mouse.c (Brad Keryan) and printer.c (Michael Gee).
 25 *
 26 * Changelog:
 27 * 30/05/2003  replaced lock/unlock kernel with up/down
 28 *             Daniele Bellucci  bellucda@tiscali.it
 29 * */
 30
 31#include <linux/module.h>
 32#include <linux/kernel.h>
 33#include <linux/signal.h>
 34#include <linux/sched.h>
 35#include <linux/mutex.h>
 36#include <linux/errno.h>
 37#include <linux/random.h>
 38#include <linux/poll.h>
 
 39#include <linux/slab.h>
 40#include <linux/spinlock.h>
 41#include <linux/usb.h>
 42#include <linux/wait.h>
 43
 44#include "rio500_usb.h"
 45
 46/*
 47 * Version Information
 48 */
 49#define DRIVER_VERSION "v1.1"
 50#define DRIVER_AUTHOR "Cesar Miquel <miquel@df.uba.ar>"
 51#define DRIVER_DESC "USB Rio 500 driver"
 52
 53#define RIO_MINOR	64
 54
 55/* stall/wait timeout for rio */
 56#define NAK_TIMEOUT (HZ)
 57
 58#define IBUF_SIZE 0x1000
 59
 60/* Size of the rio buffer */
 61#define OBUF_SIZE 0x10000
 62
 63struct rio_usb_data {
 64        struct usb_device *rio_dev;     /* init: probe_rio */
 65        unsigned int ifnum;             /* Interface number of the USB device */
 66        int isopen;                     /* nz if open */
 67        int present;                    /* Device is present on the bus */
 68        char *obuf, *ibuf;              /* transfer buffers */
 69        char bulk_in_ep, bulk_out_ep;   /* Endpoint assignments */
 70        wait_queue_head_t wait_q;       /* for timeouts */
 71	struct mutex lock;          /* general race avoidance */
 72};
 73
 74static DEFINE_MUTEX(rio500_mutex);
 75static struct rio_usb_data rio_instance;
 76
 77static int open_rio(struct inode *inode, struct file *file)
 78{
 79	struct rio_usb_data *rio = &rio_instance;
 80
 81	/* against disconnect() */
 82	mutex_lock(&rio500_mutex);
 83	mutex_lock(&(rio->lock));
 84
 85	if (rio->isopen || !rio->present) {
 86		mutex_unlock(&(rio->lock));
 87		mutex_unlock(&rio500_mutex);
 88		return -EBUSY;
 89	}
 90	rio->isopen = 1;
 91
 92	init_waitqueue_head(&rio->wait_q);
 93
 94	mutex_unlock(&(rio->lock));
 95
 96	dev_info(&rio->rio_dev->dev, "Rio opened.\n");
 97	mutex_unlock(&rio500_mutex);
 98
 99	return 0;
100}
101
102static int close_rio(struct inode *inode, struct file *file)
103{
104	struct rio_usb_data *rio = &rio_instance;
105
106	rio->isopen = 0;
107
108	dev_info(&rio->rio_dev->dev, "Rio closed.\n");
109	return 0;
110}
111
112static long ioctl_rio(struct file *file, unsigned int cmd, unsigned long arg)
113{
114	struct RioCommand rio_cmd;
115	struct rio_usb_data *rio = &rio_instance;
116	void __user *data;
117	unsigned char *buffer;
118	int result, requesttype;
119	int retries;
120	int retval=0;
121
122	mutex_lock(&(rio->lock));
123        /* Sanity check to make sure rio is connected, powered, etc */
124        if (rio->present == 0 || rio->rio_dev == NULL) {
125		retval = -ENODEV;
126		goto err_out;
127	}
128
129	switch (cmd) {
130	case RIO_RECV_COMMAND:
131		data = (void __user *) arg;
132		if (data == NULL)
133			break;
134		if (copy_from_user(&rio_cmd, data, sizeof(struct RioCommand))) {
135			retval = -EFAULT;
136			goto err_out;
137		}
138		if (rio_cmd.length < 0 || rio_cmd.length > PAGE_SIZE) {
139			retval = -EINVAL;
140			goto err_out;
141		}
142		buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
143		if (buffer == NULL) {
144			retval = -ENOMEM;
145			goto err_out;
146		}
147		if (copy_from_user(buffer, rio_cmd.buffer, rio_cmd.length)) {
148			retval = -EFAULT;
149			free_page((unsigned long) buffer);
150			goto err_out;
151		}
152
153		requesttype = rio_cmd.requesttype | USB_DIR_IN |
154		    USB_TYPE_VENDOR | USB_RECIP_DEVICE;
155		dev_dbg(&rio->rio_dev->dev,
156			"sending command:reqtype=%0x req=%0x value=%0x index=%0x len=%0x\n",
157			requesttype, rio_cmd.request, rio_cmd.value,
158			rio_cmd.index, rio_cmd.length);
159		/* Send rio control message */
160		retries = 3;
161		while (retries) {
162			result = usb_control_msg(rio->rio_dev,
163						 usb_rcvctrlpipe(rio-> rio_dev, 0),
164						 rio_cmd.request,
165						 requesttype,
166						 rio_cmd.value,
167						 rio_cmd.index, buffer,
168						 rio_cmd.length,
169						 jiffies_to_msecs(rio_cmd.timeout));
170			if (result == -ETIMEDOUT)
171				retries--;
172			else if (result < 0) {
173				dev_err(&rio->rio_dev->dev,
174					"Error executing ioctrl. code = %d\n",
175					result);
176				retries = 0;
177			} else {
178				dev_dbg(&rio->rio_dev->dev,
179					"Executed ioctl. Result = %d (data=%02x)\n",
180					result, buffer[0]);
181				if (copy_to_user(rio_cmd.buffer, buffer,
182						 rio_cmd.length)) {
183					free_page((unsigned long) buffer);
184					retval = -EFAULT;
185					goto err_out;
186				}
187				retries = 0;
188			}
189
190			/* rio_cmd.buffer contains a raw stream of single byte
191			   data which has been returned from rio.  Data is
192			   interpreted at application level.  For data that
193			   will be cast to data types longer than 1 byte, data
194			   will be little_endian and will potentially need to
195			   be swapped at the app level */
196
197		}
198		free_page((unsigned long) buffer);
199		break;
200
201	case RIO_SEND_COMMAND:
202		data = (void __user *) arg;
203		if (data == NULL)
204			break;
205		if (copy_from_user(&rio_cmd, data, sizeof(struct RioCommand))) {
206			retval = -EFAULT;
207			goto err_out;
208		}
209		if (rio_cmd.length < 0 || rio_cmd.length > PAGE_SIZE) {
210			retval = -EINVAL;
211			goto err_out;
212		}
213		buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
214		if (buffer == NULL) {
215			retval = -ENOMEM;
216			goto err_out;
217		}
218		if (copy_from_user(buffer, rio_cmd.buffer, rio_cmd.length)) {
219			free_page((unsigned long)buffer);
220			retval = -EFAULT;
221			goto err_out;
222		}
223
224		requesttype = rio_cmd.requesttype | USB_DIR_OUT |
225		    USB_TYPE_VENDOR | USB_RECIP_DEVICE;
226		dev_dbg(&rio->rio_dev->dev,
227			"sending command: reqtype=%0x req=%0x value=%0x index=%0x len=%0x\n",
228			requesttype, rio_cmd.request, rio_cmd.value,
229			rio_cmd.index, rio_cmd.length);
230		/* Send rio control message */
231		retries = 3;
232		while (retries) {
233			result = usb_control_msg(rio->rio_dev,
234						 usb_sndctrlpipe(rio-> rio_dev, 0),
235						 rio_cmd.request,
236						 requesttype,
237						 rio_cmd.value,
238						 rio_cmd.index, buffer,
239						 rio_cmd.length,
240						 jiffies_to_msecs(rio_cmd.timeout));
241			if (result == -ETIMEDOUT)
242				retries--;
243			else if (result < 0) {
244				dev_err(&rio->rio_dev->dev,
245					"Error executing ioctrl. code = %d\n",
246					result);
247				retries = 0;
248			} else {
249				dev_dbg(&rio->rio_dev->dev,
250					"Executed ioctl. Result = %d\n", result);
251				retries = 0;
252
253			}
254
255		}
256		free_page((unsigned long) buffer);
257		break;
258
259	default:
260		retval = -ENOTTY;
261		break;
262	}
263
264
265err_out:
266	mutex_unlock(&(rio->lock));
267	return retval;
268}
269
270static ssize_t
271write_rio(struct file *file, const char __user *buffer,
272	  size_t count, loff_t * ppos)
273{
274	DEFINE_WAIT(wait);
275	struct rio_usb_data *rio = &rio_instance;
276
277	unsigned long copy_size;
278	unsigned long bytes_written = 0;
279	unsigned int partial;
280
281	int result = 0;
282	int maxretry;
283	int errn = 0;
284	int intr;
285
286	intr = mutex_lock_interruptible(&(rio->lock));
287	if (intr)
288		return -EINTR;
289        /* Sanity check to make sure rio is connected, powered, etc */
290        if (rio->present == 0 || rio->rio_dev == NULL) {
291		mutex_unlock(&(rio->lock));
292		return -ENODEV;
293	}
294
295
296
297	do {
298		unsigned long thistime;
299		char *obuf = rio->obuf;
300
301		thistime = copy_size =
302		    (count >= OBUF_SIZE) ? OBUF_SIZE : count;
303		if (copy_from_user(rio->obuf, buffer, copy_size)) {
304			errn = -EFAULT;
305			goto error;
306		}
307		maxretry = 5;
308		while (thistime) {
309			if (!rio->rio_dev) {
310				errn = -ENODEV;
311				goto error;
312			}
313			if (signal_pending(current)) {
314				mutex_unlock(&(rio->lock));
315				return bytes_written ? bytes_written : -EINTR;
316			}
317
318			result = usb_bulk_msg(rio->rio_dev,
319					 usb_sndbulkpipe(rio->rio_dev, 2),
320					 obuf, thistime, &partial, 5000);
321
322			dev_dbg(&rio->rio_dev->dev,
323				"write stats: result:%d thistime:%lu partial:%u\n",
324				result, thistime, partial);
325
326			if (result == -ETIMEDOUT) {	/* NAK - so hold for a while */
327				if (!maxretry--) {
328					errn = -ETIME;
329					goto error;
330				}
331				prepare_to_wait(&rio->wait_q, &wait, TASK_INTERRUPTIBLE);
332				schedule_timeout(NAK_TIMEOUT);
333				finish_wait(&rio->wait_q, &wait);
334				continue;
335			} else if (!result && partial) {
336				obuf += partial;
337				thistime -= partial;
338			} else
339				break;
340		}
341		if (result) {
342			dev_err(&rio->rio_dev->dev, "Write Whoops - %x\n",
343				result);
344			errn = -EIO;
345			goto error;
346		}
347		bytes_written += copy_size;
348		count -= copy_size;
349		buffer += copy_size;
350	} while (count > 0);
351
352	mutex_unlock(&(rio->lock));
353
354	return bytes_written ? bytes_written : -EIO;
355
356error:
357	mutex_unlock(&(rio->lock));
358	return errn;
359}
360
361static ssize_t
362read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
363{
364	DEFINE_WAIT(wait);
365	struct rio_usb_data *rio = &rio_instance;
366	ssize_t read_count;
367	unsigned int partial;
368	int this_read;
369	int result;
370	int maxretry = 10;
371	char *ibuf;
372	int intr;
373
374	intr = mutex_lock_interruptible(&(rio->lock));
375	if (intr)
376		return -EINTR;
377	/* Sanity check to make sure rio is connected, powered, etc */
378        if (rio->present == 0 || rio->rio_dev == NULL) {
379		mutex_unlock(&(rio->lock));
380		return -ENODEV;
381	}
382
383	ibuf = rio->ibuf;
384
385	read_count = 0;
386
387
388	while (count > 0) {
389		if (signal_pending(current)) {
390			mutex_unlock(&(rio->lock));
391			return read_count ? read_count : -EINTR;
392		}
393		if (!rio->rio_dev) {
394			mutex_unlock(&(rio->lock));
395			return -ENODEV;
396		}
397		this_read = (count >= IBUF_SIZE) ? IBUF_SIZE : count;
398
399		result = usb_bulk_msg(rio->rio_dev,
400				      usb_rcvbulkpipe(rio->rio_dev, 1),
401				      ibuf, this_read, &partial,
402				      8000);
403
404		dev_dbg(&rio->rio_dev->dev,
405			"read stats: result:%d this_read:%u partial:%u\n",
406			result, this_read, partial);
407
408		if (partial) {
409			count = this_read = partial;
410		} else if (result == -ETIMEDOUT || result == 15) {	/* FIXME: 15 ??? */
411			if (!maxretry--) {
412				mutex_unlock(&(rio->lock));
413				dev_err(&rio->rio_dev->dev,
414					"read_rio: maxretry timeout\n");
415				return -ETIME;
416			}
417			prepare_to_wait(&rio->wait_q, &wait, TASK_INTERRUPTIBLE);
418			schedule_timeout(NAK_TIMEOUT);
419			finish_wait(&rio->wait_q, &wait);
420			continue;
421		} else if (result != -EREMOTEIO) {
422			mutex_unlock(&(rio->lock));
423			dev_err(&rio->rio_dev->dev,
424				"Read Whoops - result:%u partial:%u this_read:%u\n",
425				result, partial, this_read);
426			return -EIO;
427		} else {
428			mutex_unlock(&(rio->lock));
429			return (0);
430		}
431
432		if (this_read) {
433			if (copy_to_user(buffer, ibuf, this_read)) {
434				mutex_unlock(&(rio->lock));
435				return -EFAULT;
436			}
437			count -= this_read;
438			read_count += this_read;
439			buffer += this_read;
440		}
441	}
442	mutex_unlock(&(rio->lock));
443	return read_count;
444}
445
446static const struct file_operations usb_rio_fops = {
447	.owner =	THIS_MODULE,
448	.read =		read_rio,
449	.write =	write_rio,
450	.unlocked_ioctl = ioctl_rio,
451	.open =		open_rio,
452	.release =	close_rio,
453	.llseek =	noop_llseek,
454};
455
456static struct usb_class_driver usb_rio_class = {
457	.name =		"rio500%d",
458	.fops =		&usb_rio_fops,
459	.minor_base =	RIO_MINOR,
460};
461
462static int probe_rio(struct usb_interface *intf,
463		     const struct usb_device_id *id)
464{
465	struct usb_device *dev = interface_to_usbdev(intf);
466	struct rio_usb_data *rio = &rio_instance;
467	int retval;
468
469	dev_info(&intf->dev, "USB Rio found at address %d\n", dev->devnum);
470
471	retval = usb_register_dev(intf, &usb_rio_class);
472	if (retval) {
473		dev_err(&dev->dev,
474			"Not able to get a minor for this device.\n");
475		return -ENOMEM;
476	}
477
478	rio->rio_dev = dev;
479
480	if (!(rio->obuf = kmalloc(OBUF_SIZE, GFP_KERNEL))) {
481		dev_err(&dev->dev,
482			"probe_rio: Not enough memory for the output buffer\n");
483		usb_deregister_dev(intf, &usb_rio_class);
484		return -ENOMEM;
485	}
486	dev_dbg(&intf->dev, "obuf address:%p\n", rio->obuf);
487
488	if (!(rio->ibuf = kmalloc(IBUF_SIZE, GFP_KERNEL))) {
489		dev_err(&dev->dev,
490			"probe_rio: Not enough memory for the input buffer\n");
491		usb_deregister_dev(intf, &usb_rio_class);
492		kfree(rio->obuf);
493		return -ENOMEM;
494	}
495	dev_dbg(&intf->dev, "ibuf address:%p\n", rio->ibuf);
496
497	mutex_init(&(rio->lock));
498
499	usb_set_intfdata (intf, rio);
500	rio->present = 1;
501
502	return 0;
503}
504
505static void disconnect_rio(struct usb_interface *intf)
506{
507	struct rio_usb_data *rio = usb_get_intfdata (intf);
508
509	usb_set_intfdata (intf, NULL);
510	mutex_lock(&rio500_mutex);
511	if (rio) {
512		usb_deregister_dev(intf, &usb_rio_class);
513
514		mutex_lock(&(rio->lock));
515		if (rio->isopen) {
516			rio->isopen = 0;
517			/* better let it finish - the release will do whats needed */
518			rio->rio_dev = NULL;
519			mutex_unlock(&(rio->lock));
520			mutex_unlock(&rio500_mutex);
521			return;
522		}
523		kfree(rio->ibuf);
524		kfree(rio->obuf);
525
526		dev_info(&intf->dev, "USB Rio disconnected.\n");
527
528		rio->present = 0;
529		mutex_unlock(&(rio->lock));
530	}
531	mutex_unlock(&rio500_mutex);
532}
533
534static const struct usb_device_id rio_table[] = {
535	{ USB_DEVICE(0x0841, 1) }, 		/* Rio 500 */
536	{ }					/* Terminating entry */
537};
538
539MODULE_DEVICE_TABLE (usb, rio_table);
540
541static struct usb_driver rio_driver = {
542	.name =		"rio500",
543	.probe =	probe_rio,
544	.disconnect =	disconnect_rio,
545	.id_table =	rio_table,
546};
547
548module_usb_driver(rio_driver);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
549
550MODULE_AUTHOR( DRIVER_AUTHOR );
551MODULE_DESCRIPTION( DRIVER_DESC );
552MODULE_LICENSE("GPL");
553