Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
  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		dev_dbg(&rio->rio_dev->dev,
157			"sending command:reqtype=%0x req=%0x value=%0x index=%0x len=%0x\n",
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				dev_err(&rio->rio_dev->dev,
175					"Error executing ioctrl. code = %d\n",
176					result);
177				retries = 0;
178			} else {
179				dev_dbg(&rio->rio_dev->dev,
180					"Executed ioctl. Result = %d (data=%02x)\n",
181					result, buffer[0]);
182				if (copy_to_user(rio_cmd.buffer, buffer,
183						 rio_cmd.length)) {
184					free_page((unsigned long) buffer);
185					retval = -EFAULT;
186					goto err_out;
187				}
188				retries = 0;
189			}
190
191			/* rio_cmd.buffer contains a raw stream of single byte
192			   data which has been returned from rio.  Data is
193			   interpreted at application level.  For data that
194			   will be cast to data types longer than 1 byte, data
195			   will be little_endian and will potentially need to
196			   be swapped at the app level */
197
198		}
199		free_page((unsigned long) buffer);
200		break;
201
202	case RIO_SEND_COMMAND:
203		data = (void __user *) arg;
204		if (data == NULL)
205			break;
206		if (copy_from_user(&rio_cmd, data, sizeof(struct RioCommand))) {
207			retval = -EFAULT;
208			goto err_out;
209		}
210		if (rio_cmd.length < 0 || rio_cmd.length > PAGE_SIZE) {
211			retval = -EINVAL;
212			goto err_out;
213		}
214		buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
215		if (buffer == NULL) {
216			retval = -ENOMEM;
217			goto err_out;
218		}
219		if (copy_from_user(buffer, rio_cmd.buffer, rio_cmd.length)) {
220			free_page((unsigned long)buffer);
221			retval = -EFAULT;
222			goto err_out;
223		}
224
225		requesttype = rio_cmd.requesttype | USB_DIR_OUT |
226		    USB_TYPE_VENDOR | USB_RECIP_DEVICE;
227		dev_dbg(&rio->rio_dev->dev,
228			"sending command: reqtype=%0x req=%0x value=%0x index=%0x len=%0x\n",
229			requesttype, rio_cmd.request, rio_cmd.value,
230			rio_cmd.index, rio_cmd.length);
231		/* Send rio control message */
232		retries = 3;
233		while (retries) {
234			result = usb_control_msg(rio->rio_dev,
235						 usb_sndctrlpipe(rio-> rio_dev, 0),
236						 rio_cmd.request,
237						 requesttype,
238						 rio_cmd.value,
239						 rio_cmd.index, buffer,
240						 rio_cmd.length,
241						 jiffies_to_msecs(rio_cmd.timeout));
242			if (result == -ETIMEDOUT)
243				retries--;
244			else if (result < 0) {
245				dev_err(&rio->rio_dev->dev,
246					"Error executing ioctrl. code = %d\n",
247					result);
248				retries = 0;
249			} else {
250				dev_dbg(&rio->rio_dev->dev,
251					"Executed ioctl. Result = %d\n", result);
252				retries = 0;
253
254			}
255
256		}
257		free_page((unsigned long) buffer);
258		break;
259
260	default:
261		retval = -ENOTTY;
262		break;
263	}
264
265
266err_out:
267	mutex_unlock(&(rio->lock));
268	return retval;
269}
270
271static ssize_t
272write_rio(struct file *file, const char __user *buffer,
273	  size_t count, loff_t * ppos)
274{
275	DEFINE_WAIT(wait);
276	struct rio_usb_data *rio = &rio_instance;
277
278	unsigned long copy_size;
279	unsigned long bytes_written = 0;
280	unsigned int partial;
281
282	int result = 0;
283	int maxretry;
284	int errn = 0;
285	int intr;
286
287	intr = mutex_lock_interruptible(&(rio->lock));
288	if (intr)
289		return -EINTR;
290        /* Sanity check to make sure rio is connected, powered, etc */
291        if (rio->present == 0 || rio->rio_dev == NULL) {
292		mutex_unlock(&(rio->lock));
293		return -ENODEV;
294	}
295
296
297
298	do {
299		unsigned long thistime;
300		char *obuf = rio->obuf;
301
302		thistime = copy_size =
303		    (count >= OBUF_SIZE) ? OBUF_SIZE : count;
304		if (copy_from_user(rio->obuf, buffer, copy_size)) {
305			errn = -EFAULT;
306			goto error;
307		}
308		maxretry = 5;
309		while (thistime) {
310			if (!rio->rio_dev) {
311				errn = -ENODEV;
312				goto error;
313			}
314			if (signal_pending(current)) {
315				mutex_unlock(&(rio->lock));
316				return bytes_written ? bytes_written : -EINTR;
317			}
318
319			result = usb_bulk_msg(rio->rio_dev,
320					 usb_sndbulkpipe(rio->rio_dev, 2),
321					 obuf, thistime, &partial, 5000);
322
323			dev_dbg(&rio->rio_dev->dev,
324				"write stats: result:%d thistime:%lu partial:%u\n",
325				result, thistime, partial);
326
327			if (result == -ETIMEDOUT) {	/* NAK - so hold for a while */
328				if (!maxretry--) {
329					errn = -ETIME;
330					goto error;
331				}
332				prepare_to_wait(&rio->wait_q, &wait, TASK_INTERRUPTIBLE);
333				schedule_timeout(NAK_TIMEOUT);
334				finish_wait(&rio->wait_q, &wait);
335				continue;
336			} else if (!result && partial) {
337				obuf += partial;
338				thistime -= partial;
339			} else
340				break;
341		};
342		if (result) {
343			dev_err(&rio->rio_dev->dev, "Write Whoops - %x\n",
344				result);
345			errn = -EIO;
346			goto error;
347		}
348		bytes_written += copy_size;
349		count -= copy_size;
350		buffer += copy_size;
351	} while (count > 0);
352
353	mutex_unlock(&(rio->lock));
354
355	return bytes_written ? bytes_written : -EIO;
356
357error:
358	mutex_unlock(&(rio->lock));
359	return errn;
360}
361
362static ssize_t
363read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
364{
365	DEFINE_WAIT(wait);
366	struct rio_usb_data *rio = &rio_instance;
367	ssize_t read_count;
368	unsigned int partial;
369	int this_read;
370	int result;
371	int maxretry = 10;
372	char *ibuf;
373	int intr;
374
375	intr = mutex_lock_interruptible(&(rio->lock));
376	if (intr)
377		return -EINTR;
378	/* Sanity check to make sure rio is connected, powered, etc */
379        if (rio->present == 0 || rio->rio_dev == NULL) {
380		mutex_unlock(&(rio->lock));
381		return -ENODEV;
382	}
383
384	ibuf = rio->ibuf;
385
386	read_count = 0;
387
388
389	while (count > 0) {
390		if (signal_pending(current)) {
391			mutex_unlock(&(rio->lock));
392			return read_count ? read_count : -EINTR;
393		}
394		if (!rio->rio_dev) {
395			mutex_unlock(&(rio->lock));
396			return -ENODEV;
397		}
398		this_read = (count >= IBUF_SIZE) ? IBUF_SIZE : count;
399
400		result = usb_bulk_msg(rio->rio_dev,
401				      usb_rcvbulkpipe(rio->rio_dev, 1),
402				      ibuf, this_read, &partial,
403				      8000);
404
405		dev_dbg(&rio->rio_dev->dev,
406			"read stats: result:%d this_read:%u partial:%u\n",
407			result, this_read, partial);
408
409		if (partial) {
410			count = this_read = partial;
411		} else if (result == -ETIMEDOUT || result == 15) {	/* FIXME: 15 ??? */
412			if (!maxretry--) {
413				mutex_unlock(&(rio->lock));
414				dev_err(&rio->rio_dev->dev,
415					"read_rio: maxretry timeout\n");
416				return -ETIME;
417			}
418			prepare_to_wait(&rio->wait_q, &wait, TASK_INTERRUPTIBLE);
419			schedule_timeout(NAK_TIMEOUT);
420			finish_wait(&rio->wait_q, &wait);
421			continue;
422		} else if (result != -EREMOTEIO) {
423			mutex_unlock(&(rio->lock));
424			dev_err(&rio->rio_dev->dev,
425				"Read Whoops - result:%u partial:%u this_read:%u\n",
426				result, partial, this_read);
427			return -EIO;
428		} else {
429			mutex_unlock(&(rio->lock));
430			return (0);
431		}
432
433		if (this_read) {
434			if (copy_to_user(buffer, ibuf, this_read)) {
435				mutex_unlock(&(rio->lock));
436				return -EFAULT;
437			}
438			count -= this_read;
439			read_count += this_read;
440			buffer += this_read;
441		}
442	}
443	mutex_unlock(&(rio->lock));
444	return read_count;
445}
446
447static const struct file_operations usb_rio_fops = {
448	.owner =	THIS_MODULE,
449	.read =		read_rio,
450	.write =	write_rio,
451	.unlocked_ioctl = ioctl_rio,
452	.open =		open_rio,
453	.release =	close_rio,
454	.llseek =	noop_llseek,
455};
456
457static struct usb_class_driver usb_rio_class = {
458	.name =		"rio500%d",
459	.fops =		&usb_rio_fops,
460	.minor_base =	RIO_MINOR,
461};
462
463static int probe_rio(struct usb_interface *intf,
464		     const struct usb_device_id *id)
465{
466	struct usb_device *dev = interface_to_usbdev(intf);
467	struct rio_usb_data *rio = &rio_instance;
468	int retval;
469
470	dev_info(&intf->dev, "USB Rio found at address %d\n", dev->devnum);
471
472	retval = usb_register_dev(intf, &usb_rio_class);
473	if (retval) {
474		dev_err(&dev->dev,
475			"Not able to get a minor for this device.\n");
476		return -ENOMEM;
477	}
478
479	rio->rio_dev = dev;
480
481	if (!(rio->obuf = kmalloc(OBUF_SIZE, GFP_KERNEL))) {
482		dev_err(&dev->dev,
483			"probe_rio: Not enough memory for the output buffer\n");
484		usb_deregister_dev(intf, &usb_rio_class);
485		return -ENOMEM;
486	}
487	dev_dbg(&intf->dev, "obuf address:%p\n", rio->obuf);
488
489	if (!(rio->ibuf = kmalloc(IBUF_SIZE, GFP_KERNEL))) {
490		dev_err(&dev->dev,
491			"probe_rio: Not enough memory for the input buffer\n");
492		usb_deregister_dev(intf, &usb_rio_class);
493		kfree(rio->obuf);
494		return -ENOMEM;
495	}
496	dev_dbg(&intf->dev, "ibuf address:%p\n", rio->ibuf);
497
498	mutex_init(&(rio->lock));
499
500	usb_set_intfdata (intf, rio);
501	rio->present = 1;
502
503	return 0;
504}
505
506static void disconnect_rio(struct usb_interface *intf)
507{
508	struct rio_usb_data *rio = usb_get_intfdata (intf);
509
510	usb_set_intfdata (intf, NULL);
511	mutex_lock(&rio500_mutex);
512	if (rio) {
513		usb_deregister_dev(intf, &usb_rio_class);
514
515		mutex_lock(&(rio->lock));
516		if (rio->isopen) {
517			rio->isopen = 0;
518			/* better let it finish - the release will do whats needed */
519			rio->rio_dev = NULL;
520			mutex_unlock(&(rio->lock));
521			mutex_unlock(&rio500_mutex);
522			return;
523		}
524		kfree(rio->ibuf);
525		kfree(rio->obuf);
526
527		dev_info(&intf->dev, "USB Rio disconnected.\n");
528
529		rio->present = 0;
530		mutex_unlock(&(rio->lock));
531	}
532	mutex_unlock(&rio500_mutex);
533}
534
535static const struct usb_device_id rio_table[] = {
536	{ USB_DEVICE(0x0841, 1) }, 		/* Rio 500 */
537	{ }					/* Terminating entry */
538};
539
540MODULE_DEVICE_TABLE (usb, rio_table);
541
542static struct usb_driver rio_driver = {
543	.name =		"rio500",
544	.probe =	probe_rio,
545	.disconnect =	disconnect_rio,
546	.id_table =	rio_table,
547};
548
549module_usb_driver(rio_driver);
550
551MODULE_AUTHOR( DRIVER_AUTHOR );
552MODULE_DESCRIPTION( DRIVER_DESC );
553MODULE_LICENSE("GPL");
554