4 * Driver for USB Rio 500
6 * Cesar Miquel (miquel@df.uba.ar)
8 * based on hp_scanner.c by David E. Nelson (dnelson@jump.net)
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.
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.
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.
24 * Based upon mouse.c (Brad Keryan) and printer.c (Michael Gee).
27 * 30/05/2003 replaced lock/unlock kernel with up/down
28 * Daniele Bellucci bellucda@tiscali.it
31 #include <linux/module.h>
32 #include <linux/kernel.h>
33 #include <linux/signal.h>
34 #include <linux/sched.h>
35 #include <linux/errno.h>
36 #include <linux/random.h>
37 #include <linux/poll.h>
38 #include <linux/init.h>
39 #include <linux/slab.h>
40 #include <linux/spinlock.h>
41 #include <linux/usb.h>
42 #include <linux/wait.h>
44 #include "rio500_usb.h"
49 #define DRIVER_VERSION "v1.1"
50 #define DRIVER_AUTHOR "Cesar Miquel <miquel@df.uba.ar>"
51 #define DRIVER_DESC "USB Rio 500 driver"
55 /* stall/wait timeout for rio */
56 #define NAK_TIMEOUT (HZ)
58 #define IBUF_SIZE 0x1000
60 /* Size of the rio buffer */
61 #define OBUF_SIZE 0x10000
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 */
74 static struct rio_usb_data rio_instance;
76 static int open_rio(struct inode *inode, struct file *file)
78 struct rio_usb_data *rio = &rio_instance;
80 mutex_lock(&(rio->lock));
82 if (rio->isopen || !rio->present) {
83 mutex_unlock(&(rio->lock));
88 init_waitqueue_head(&rio->wait_q);
90 mutex_unlock(&(rio->lock));
92 dev_info(&rio->rio_dev->dev, "Rio opened.\n");
97 static int close_rio(struct inode *inode, struct file *file)
99 struct rio_usb_data *rio = &rio_instance;
103 dev_info(&rio->rio_dev->dev, "Rio closed.\n");
107 static long ioctl_rio(struct file *file, unsigned int cmd, unsigned long arg)
109 struct RioCommand rio_cmd;
110 struct rio_usb_data *rio = &rio_instance;
112 unsigned char *buffer;
113 int result, requesttype;
118 mutex_lock(&(rio->lock));
119 /* Sanity check to make sure rio is connected, powered, etc */
120 if (rio->present == 0 || rio->rio_dev == NULL) {
126 case RIO_RECV_COMMAND:
127 data = (void __user *) arg;
130 if (copy_from_user(&rio_cmd, data, sizeof(struct RioCommand))) {
134 if (rio_cmd.length < 0 || rio_cmd.length > PAGE_SIZE) {
138 buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
139 if (buffer == NULL) {
143 if (copy_from_user(buffer, rio_cmd.buffer, rio_cmd.length)) {
145 free_page((unsigned long) buffer);
149 requesttype = rio_cmd.requesttype | USB_DIR_IN |
150 USB_TYPE_VENDOR | USB_RECIP_DEVICE;
152 ("sending command:reqtype=%0x req=%0x value=%0x index=%0x len=%0x",
153 requesttype, rio_cmd.request, rio_cmd.value,
154 rio_cmd.index, rio_cmd.length);
155 /* Send rio control message */
158 result = usb_control_msg(rio->rio_dev,
159 usb_rcvctrlpipe(rio-> rio_dev, 0),
163 rio_cmd.index, buffer,
165 jiffies_to_msecs(rio_cmd.timeout));
166 if (result == -ETIMEDOUT)
168 else if (result < 0) {
169 err("Error executing ioctrl. code = %d", result);
172 dbg("Executed ioctl. Result = %d (data=%02x)",
174 if (copy_to_user(rio_cmd.buffer, buffer,
176 free_page((unsigned long) buffer);
183 /* rio_cmd.buffer contains a raw stream of single byte
184 data which has been returned from rio. Data is
185 interpreted at application level. For data that
186 will be cast to data types longer than 1 byte, data
187 will be little_endian and will potentially need to
188 be swapped at the app level */
191 free_page((unsigned long) buffer);
194 case RIO_SEND_COMMAND:
195 data = (void __user *) arg;
198 if (copy_from_user(&rio_cmd, data, sizeof(struct RioCommand))) {
202 if (rio_cmd.length < 0 || rio_cmd.length > PAGE_SIZE) {
206 buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
207 if (buffer == NULL) {
211 if (copy_from_user(buffer, rio_cmd.buffer, rio_cmd.length)) {
212 free_page((unsigned long)buffer);
217 requesttype = rio_cmd.requesttype | USB_DIR_OUT |
218 USB_TYPE_VENDOR | USB_RECIP_DEVICE;
219 dbg("sending command: reqtype=%0x req=%0x value=%0x index=%0x len=%0x",
220 requesttype, rio_cmd.request, rio_cmd.value,
221 rio_cmd.index, rio_cmd.length);
222 /* Send rio control message */
225 result = usb_control_msg(rio->rio_dev,
226 usb_sndctrlpipe(rio-> rio_dev, 0),
230 rio_cmd.index, buffer,
232 jiffies_to_msecs(rio_cmd.timeout));
233 if (result == -ETIMEDOUT)
235 else if (result < 0) {
236 err("Error executing ioctrl. code = %d", result);
239 dbg("Executed ioctl. Result = %d", result);
245 free_page((unsigned long) buffer);
255 mutex_unlock(&(rio->lock));
261 write_rio(struct file *file, const char __user *buffer,
262 size_t count, loff_t * ppos)
265 struct rio_usb_data *rio = &rio_instance;
267 unsigned long copy_size;
268 unsigned long bytes_written = 0;
269 unsigned int partial;
276 intr = mutex_lock_interruptible(&(rio->lock));
279 /* Sanity check to make sure rio is connected, powered, etc */
280 if (rio->present == 0 || rio->rio_dev == NULL) {
281 mutex_unlock(&(rio->lock));
288 unsigned long thistime;
289 char *obuf = rio->obuf;
291 thistime = copy_size =
292 (count >= OBUF_SIZE) ? OBUF_SIZE : count;
293 if (copy_from_user(rio->obuf, buffer, copy_size)) {
303 if (signal_pending(current)) {
304 mutex_unlock(&(rio->lock));
305 return bytes_written ? bytes_written : -EINTR;
308 result = usb_bulk_msg(rio->rio_dev,
309 usb_sndbulkpipe(rio->rio_dev, 2),
310 obuf, thistime, &partial, 5000);
312 dbg("write stats: result:%d thistime:%lu partial:%u",
313 result, thistime, partial);
315 if (result == -ETIMEDOUT) { /* NAK - so hold for a while */
320 prepare_to_wait(&rio->wait_q, &wait, TASK_INTERRUPTIBLE);
321 schedule_timeout(NAK_TIMEOUT);
322 finish_wait(&rio->wait_q, &wait);
324 } else if (!result && partial) {
331 err("Write Whoops - %x", result);
335 bytes_written += copy_size;
340 mutex_unlock(&(rio->lock));
342 return bytes_written ? bytes_written : -EIO;
345 mutex_unlock(&(rio->lock));
350 read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
353 struct rio_usb_data *rio = &rio_instance;
355 unsigned int partial;
362 intr = mutex_lock_interruptible(&(rio->lock));
365 /* Sanity check to make sure rio is connected, powered, etc */
366 if (rio->present == 0 || rio->rio_dev == NULL) {
367 mutex_unlock(&(rio->lock));
377 if (signal_pending(current)) {
378 mutex_unlock(&(rio->lock));
379 return read_count ? read_count : -EINTR;
382 mutex_unlock(&(rio->lock));
385 this_read = (count >= IBUF_SIZE) ? IBUF_SIZE : count;
387 result = usb_bulk_msg(rio->rio_dev,
388 usb_rcvbulkpipe(rio->rio_dev, 1),
389 ibuf, this_read, &partial,
392 dbg("read stats: result:%d this_read:%u partial:%u",
393 result, this_read, partial);
396 count = this_read = partial;
397 } else if (result == -ETIMEDOUT || result == 15) { /* FIXME: 15 ??? */
399 mutex_unlock(&(rio->lock));
400 err("read_rio: maxretry timeout");
403 prepare_to_wait(&rio->wait_q, &wait, TASK_INTERRUPTIBLE);
404 schedule_timeout(NAK_TIMEOUT);
405 finish_wait(&rio->wait_q, &wait);
407 } else if (result != -EREMOTEIO) {
408 mutex_unlock(&(rio->lock));
409 err("Read Whoops - result:%u partial:%u this_read:%u",
410 result, partial, this_read);
413 mutex_unlock(&(rio->lock));
418 if (copy_to_user(buffer, ibuf, this_read)) {
419 mutex_unlock(&(rio->lock));
423 read_count += this_read;
427 mutex_unlock(&(rio->lock));
432 file_operations usb_rio_fops = {
433 .owner = THIS_MODULE,
436 .unlocked_ioctl = ioctl_rio,
438 .release = close_rio,
441 static struct usb_class_driver usb_rio_class = {
443 .fops = &usb_rio_fops,
444 .minor_base = RIO_MINOR,
447 static int probe_rio(struct usb_interface *intf,
448 const struct usb_device_id *id)
450 struct usb_device *dev = interface_to_usbdev(intf);
451 struct rio_usb_data *rio = &rio_instance;
454 dev_info(&intf->dev, "USB Rio found at address %d\n", dev->devnum);
456 retval = usb_register_dev(intf, &usb_rio_class);
458 err("Not able to get a minor for this device.");
464 if (!(rio->obuf = kmalloc(OBUF_SIZE, GFP_KERNEL))) {
465 err("probe_rio: Not enough memory for the output buffer");
466 usb_deregister_dev(intf, &usb_rio_class);
469 dbg("probe_rio: obuf address:%p", rio->obuf);
471 if (!(rio->ibuf = kmalloc(IBUF_SIZE, GFP_KERNEL))) {
472 err("probe_rio: Not enough memory for the input buffer");
473 usb_deregister_dev(intf, &usb_rio_class);
477 dbg("probe_rio: ibuf address:%p", rio->ibuf);
479 mutex_init(&(rio->lock));
481 usb_set_intfdata (intf, rio);
487 static void disconnect_rio(struct usb_interface *intf)
489 struct rio_usb_data *rio = usb_get_intfdata (intf);
491 usb_set_intfdata (intf, NULL);
493 usb_deregister_dev(intf, &usb_rio_class);
495 mutex_lock(&(rio->lock));
498 /* better let it finish - the release will do whats needed */
500 mutex_unlock(&(rio->lock));
506 dev_info(&intf->dev, "USB Rio disconnected.\n");
509 mutex_unlock(&(rio->lock));
513 static struct usb_device_id rio_table [] = {
514 { USB_DEVICE(0x0841, 1) }, /* Rio 500 */
515 { } /* Terminating entry */
518 MODULE_DEVICE_TABLE (usb, rio_table);
520 static struct usb_driver rio_driver = {
523 .disconnect = disconnect_rio,
524 .id_table = rio_table,
527 static int __init usb_rio_init(void)
530 retval = usb_register(&rio_driver);
534 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
542 static void __exit usb_rio_cleanup(void)
544 struct rio_usb_data *rio = &rio_instance;
547 usb_deregister(&rio_driver);
552 module_init(usb_rio_init);
553 module_exit(usb_rio_cleanup);
555 MODULE_AUTHOR( DRIVER_AUTHOR );
556 MODULE_DESCRIPTION( DRIVER_DESC );
557 MODULE_LICENSE("GPL");