1 // SPDX-License-Identifier: GPL-2.0+
5 * Driver for USB Rio 500
7 * Cesar Miquel (miquel@df.uba.ar)
9 * based on hp_scanner.c by David E. Nelson (dnelson@jump.net)
11 * Based upon mouse.c (Brad Keryan) and printer.c (Michael Gee).
14 * 30/05/2003 replaced lock/unlock kernel with up/down
15 * Daniele Bellucci bellucda@tiscali.it
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>
31 #include "rio500_usb.h"
33 #define DRIVER_AUTHOR "Cesar Miquel <miquel@df.uba.ar>"
34 #define DRIVER_DESC "USB Rio 500 driver"
38 /* stall/wait timeout for rio */
39 #define NAK_TIMEOUT (HZ)
41 #define IBUF_SIZE 0x1000
43 /* Size of the rio buffer */
44 #define OBUF_SIZE 0x10000
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 */
56 static DEFINE_MUTEX(rio500_mutex
);
57 static struct rio_usb_data rio_instance
;
59 static int open_rio(struct inode
*inode
, struct file
*file
)
61 struct rio_usb_data
*rio
= &rio_instance
;
63 /* against disconnect() */
64 mutex_lock(&rio500_mutex
);
66 if (rio
->isopen
|| !rio
->present
) {
67 mutex_unlock(&rio500_mutex
);
72 init_waitqueue_head(&rio
->wait_q
);
75 dev_info(&rio
->rio_dev
->dev
, "Rio opened.\n");
76 mutex_unlock(&rio500_mutex
);
81 static int close_rio(struct inode
*inode
, struct file
*file
)
83 struct rio_usb_data
*rio
= &rio_instance
;
85 /* against disconnect() */
86 mutex_lock(&rio500_mutex
);
90 /* cleanup has been delayed */
96 dev_info(&rio
->rio_dev
->dev
, "Rio closed.\n");
98 mutex_unlock(&rio500_mutex
);
102 static long ioctl_rio(struct file
*file
, unsigned int cmd
, unsigned long arg
)
104 struct RioCommand rio_cmd
;
105 struct rio_usb_data
*rio
= &rio_instance
;
107 unsigned char *buffer
;
108 int result
, requesttype
;
112 mutex_lock(&rio500_mutex
);
113 /* Sanity check to make sure rio is connected, powered, etc */
114 if (rio
->present
== 0 || rio
->rio_dev
== NULL
) {
120 case RIO_RECV_COMMAND
:
121 data
= (void __user
*) arg
;
124 if (copy_from_user(&rio_cmd
, data
, sizeof(struct RioCommand
))) {
128 if (rio_cmd
.length
< 0 || rio_cmd
.length
> PAGE_SIZE
) {
132 buffer
= (unsigned char *) __get_free_page(GFP_KERNEL
);
133 if (buffer
== NULL
) {
137 if (copy_from_user(buffer
, rio_cmd
.buffer
, rio_cmd
.length
)) {
139 free_page((unsigned long) buffer
);
143 requesttype
= rio_cmd
.requesttype
| USB_DIR_IN
|
144 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
;
145 dev_dbg(&rio
->rio_dev
->dev
,
146 "sending command:reqtype=%0x req=%0x value=%0x index=%0x len=%0x\n",
147 requesttype
, rio_cmd
.request
, rio_cmd
.value
,
148 rio_cmd
.index
, rio_cmd
.length
);
149 /* Send rio control message */
152 result
= usb_control_msg(rio
->rio_dev
,
153 usb_rcvctrlpipe(rio
-> rio_dev
, 0),
157 rio_cmd
.index
, buffer
,
159 jiffies_to_msecs(rio_cmd
.timeout
));
160 if (result
== -ETIMEDOUT
)
162 else if (result
< 0) {
163 dev_err(&rio
->rio_dev
->dev
,
164 "Error executing ioctrl. code = %d\n",
168 dev_dbg(&rio
->rio_dev
->dev
,
169 "Executed ioctl. Result = %d (data=%02x)\n",
171 if (copy_to_user(rio_cmd
.buffer
, buffer
,
173 free_page((unsigned long) buffer
);
180 /* rio_cmd.buffer contains a raw stream of single byte
181 data which has been returned from rio. Data is
182 interpreted at application level. For data that
183 will be cast to data types longer than 1 byte, data
184 will be little_endian and will potentially need to
185 be swapped at the app level */
188 free_page((unsigned long) buffer
);
191 case RIO_SEND_COMMAND
:
192 data
= (void __user
*) arg
;
195 if (copy_from_user(&rio_cmd
, data
, sizeof(struct RioCommand
))) {
199 if (rio_cmd
.length
< 0 || rio_cmd
.length
> PAGE_SIZE
) {
203 buffer
= (unsigned char *) __get_free_page(GFP_KERNEL
);
204 if (buffer
== NULL
) {
208 if (copy_from_user(buffer
, rio_cmd
.buffer
, rio_cmd
.length
)) {
209 free_page((unsigned long)buffer
);
214 requesttype
= rio_cmd
.requesttype
| USB_DIR_OUT
|
215 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
;
216 dev_dbg(&rio
->rio_dev
->dev
,
217 "sending command: reqtype=%0x req=%0x value=%0x index=%0x len=%0x\n",
218 requesttype
, rio_cmd
.request
, rio_cmd
.value
,
219 rio_cmd
.index
, rio_cmd
.length
);
220 /* Send rio control message */
223 result
= usb_control_msg(rio
->rio_dev
,
224 usb_sndctrlpipe(rio
-> rio_dev
, 0),
228 rio_cmd
.index
, buffer
,
230 jiffies_to_msecs(rio_cmd
.timeout
));
231 if (result
== -ETIMEDOUT
)
233 else if (result
< 0) {
234 dev_err(&rio
->rio_dev
->dev
,
235 "Error executing ioctrl. code = %d\n",
239 dev_dbg(&rio
->rio_dev
->dev
,
240 "Executed ioctl. Result = %d\n", result
);
246 free_page((unsigned long) buffer
);
256 mutex_unlock(&rio500_mutex
);
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(&rio500_mutex
);
279 /* Sanity check to make sure rio is connected, powered, etc */
280 if (rio
->present
== 0 || rio
->rio_dev
== NULL
) {
281 mutex_unlock(&rio500_mutex
);
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(&rio500_mutex
);
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 dev_dbg(&rio
->rio_dev
->dev
,
313 "write stats: result:%d thistime:%lu partial:%u\n",
314 result
, thistime
, partial
);
316 if (result
== -ETIMEDOUT
) { /* NAK - so hold for a while */
321 prepare_to_wait(&rio
->wait_q
, &wait
, TASK_INTERRUPTIBLE
);
322 schedule_timeout(NAK_TIMEOUT
);
323 finish_wait(&rio
->wait_q
, &wait
);
325 } else if (!result
&& partial
) {
332 dev_err(&rio
->rio_dev
->dev
, "Write Whoops - %x\n",
337 bytes_written
+= copy_size
;
342 mutex_unlock(&rio500_mutex
);
344 return bytes_written
? bytes_written
: -EIO
;
347 mutex_unlock(&rio500_mutex
);
352 read_rio(struct file
*file
, char __user
*buffer
, size_t count
, loff_t
* ppos
)
355 struct rio_usb_data
*rio
= &rio_instance
;
357 unsigned int partial
;
364 intr
= mutex_lock_interruptible(&rio500_mutex
);
367 /* Sanity check to make sure rio is connected, powered, etc */
368 if (rio
->present
== 0 || rio
->rio_dev
== NULL
) {
369 mutex_unlock(&rio500_mutex
);
379 if (signal_pending(current
)) {
380 mutex_unlock(&rio500_mutex
);
381 return read_count
? read_count
: -EINTR
;
384 mutex_unlock(&rio500_mutex
);
387 this_read
= (count
>= IBUF_SIZE
) ? IBUF_SIZE
: count
;
389 result
= usb_bulk_msg(rio
->rio_dev
,
390 usb_rcvbulkpipe(rio
->rio_dev
, 1),
391 ibuf
, this_read
, &partial
,
394 dev_dbg(&rio
->rio_dev
->dev
,
395 "read stats: result:%d this_read:%u partial:%u\n",
396 result
, this_read
, partial
);
399 count
= this_read
= partial
;
400 } else if (result
== -ETIMEDOUT
|| result
== 15) { /* FIXME: 15 ??? */
402 mutex_unlock(&rio500_mutex
);
403 dev_err(&rio
->rio_dev
->dev
,
404 "read_rio: maxretry timeout\n");
407 prepare_to_wait(&rio
->wait_q
, &wait
, TASK_INTERRUPTIBLE
);
408 schedule_timeout(NAK_TIMEOUT
);
409 finish_wait(&rio
->wait_q
, &wait
);
411 } else if (result
!= -EREMOTEIO
) {
412 mutex_unlock(&rio500_mutex
);
413 dev_err(&rio
->rio_dev
->dev
,
414 "Read Whoops - result:%d partial:%u this_read:%u\n",
415 result
, partial
, this_read
);
418 mutex_unlock(&rio500_mutex
);
423 if (copy_to_user(buffer
, ibuf
, this_read
)) {
424 mutex_unlock(&rio500_mutex
);
428 read_count
+= this_read
;
432 mutex_unlock(&rio500_mutex
);
436 static const struct file_operations usb_rio_fops
= {
437 .owner
= THIS_MODULE
,
440 .unlocked_ioctl
= ioctl_rio
,
442 .release
= close_rio
,
443 .llseek
= noop_llseek
,
446 static struct usb_class_driver usb_rio_class
= {
448 .fops
= &usb_rio_fops
,
449 .minor_base
= RIO_MINOR
,
452 static int probe_rio(struct usb_interface
*intf
,
453 const struct usb_device_id
*id
)
455 struct usb_device
*dev
= interface_to_usbdev(intf
);
456 struct rio_usb_data
*rio
= &rio_instance
;
459 mutex_lock(&rio500_mutex
);
461 dev_info(&intf
->dev
, "Second USB Rio at address %d refused\n", dev
->devnum
);
465 dev_info(&intf
->dev
, "USB Rio found at address %d\n", dev
->devnum
);
468 retval
= usb_register_dev(intf
, &usb_rio_class
);
471 "Not able to get a minor for this device.\n");
478 if (!(rio
->obuf
= kmalloc(OBUF_SIZE
, GFP_KERNEL
))) {
480 "probe_rio: Not enough memory for the output buffer\n");
481 usb_deregister_dev(intf
, &usb_rio_class
);
485 dev_dbg(&intf
->dev
, "obuf address:%p\n", rio
->obuf
);
487 if (!(rio
->ibuf
= kmalloc(IBUF_SIZE
, GFP_KERNEL
))) {
489 "probe_rio: Not enough memory for the input buffer\n");
490 usb_deregister_dev(intf
, &usb_rio_class
);
495 dev_dbg(&intf
->dev
, "ibuf address:%p\n", rio
->ibuf
);
497 usb_set_intfdata (intf
, rio
);
500 mutex_unlock(&rio500_mutex
);
505 static void disconnect_rio(struct usb_interface
*intf
)
507 struct rio_usb_data
*rio
= usb_get_intfdata (intf
);
509 usb_set_intfdata (intf
, NULL
);
510 mutex_lock(&rio500_mutex
);
512 usb_deregister_dev(intf
, &usb_rio_class
);
516 /* better let it finish - the release will do whats needed */
518 mutex_unlock(&rio500_mutex
);
524 dev_info(&intf
->dev
, "USB Rio disconnected.\n");
528 mutex_unlock(&rio500_mutex
);
531 static const struct usb_device_id rio_table
[] = {
532 { USB_DEVICE(0x0841, 1) }, /* Rio 500 */
533 { } /* Terminating entry */
536 MODULE_DEVICE_TABLE (usb
, rio_table
);
538 static struct usb_driver rio_driver
= {
541 .disconnect
= disconnect_rio
,
542 .id_table
= rio_table
,
545 module_usb_driver(rio_driver
);
547 MODULE_AUTHOR( DRIVER_AUTHOR
);
548 MODULE_DESCRIPTION( DRIVER_DESC
);
549 MODULE_LICENSE("GPL");