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