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 */
54 struct mutex lock
; /* general race avoidance */
57 static DEFINE_MUTEX(rio500_mutex
);
58 static struct rio_usb_data rio_instance
;
60 static int open_rio(struct inode
*inode
, struct file
*file
)
62 struct rio_usb_data
*rio
= &rio_instance
;
64 /* against disconnect() */
65 mutex_lock(&rio500_mutex
);
66 mutex_lock(&(rio
->lock
));
68 if (rio
->isopen
|| !rio
->present
) {
69 mutex_unlock(&(rio
->lock
));
70 mutex_unlock(&rio500_mutex
);
75 init_waitqueue_head(&rio
->wait_q
);
77 mutex_unlock(&(rio
->lock
));
79 dev_info(&rio
->rio_dev
->dev
, "Rio opened.\n");
80 mutex_unlock(&rio500_mutex
);
85 static int close_rio(struct inode
*inode
, struct file
*file
)
87 struct rio_usb_data
*rio
= &rio_instance
;
91 dev_info(&rio
->rio_dev
->dev
, "Rio closed.\n");
95 static long ioctl_rio(struct file
*file
, unsigned int cmd
, unsigned long arg
)
97 struct RioCommand rio_cmd
;
98 struct rio_usb_data
*rio
= &rio_instance
;
100 unsigned char *buffer
;
101 int result
, requesttype
;
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
) {
113 case RIO_RECV_COMMAND
:
114 data
= (void __user
*) arg
;
117 if (copy_from_user(&rio_cmd
, data
, sizeof(struct RioCommand
))) {
121 if (rio_cmd
.length
< 0 || rio_cmd
.length
> PAGE_SIZE
) {
125 buffer
= (unsigned char *) __get_free_page(GFP_KERNEL
);
126 if (buffer
== NULL
) {
130 if (copy_from_user(buffer
, rio_cmd
.buffer
, rio_cmd
.length
)) {
132 free_page((unsigned long) buffer
);
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 */
145 result
= usb_control_msg(rio
->rio_dev
,
146 usb_rcvctrlpipe(rio
-> rio_dev
, 0),
150 rio_cmd
.index
, buffer
,
152 jiffies_to_msecs(rio_cmd
.timeout
));
153 if (result
== -ETIMEDOUT
)
155 else if (result
< 0) {
156 dev_err(&rio
->rio_dev
->dev
,
157 "Error executing ioctrl. code = %d\n",
161 dev_dbg(&rio
->rio_dev
->dev
,
162 "Executed ioctl. Result = %d (data=%02x)\n",
164 if (copy_to_user(rio_cmd
.buffer
, buffer
,
166 free_page((unsigned long) buffer
);
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 */
181 free_page((unsigned long) buffer
);
184 case RIO_SEND_COMMAND
:
185 data
= (void __user
*) arg
;
188 if (copy_from_user(&rio_cmd
, data
, sizeof(struct RioCommand
))) {
192 if (rio_cmd
.length
< 0 || rio_cmd
.length
> PAGE_SIZE
) {
196 buffer
= (unsigned char *) __get_free_page(GFP_KERNEL
);
197 if (buffer
== NULL
) {
201 if (copy_from_user(buffer
, rio_cmd
.buffer
, rio_cmd
.length
)) {
202 free_page((unsigned long)buffer
);
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 */
216 result
= usb_control_msg(rio
->rio_dev
,
217 usb_sndctrlpipe(rio
-> rio_dev
, 0),
221 rio_cmd
.index
, buffer
,
223 jiffies_to_msecs(rio_cmd
.timeout
));
224 if (result
== -ETIMEDOUT
)
226 else if (result
< 0) {
227 dev_err(&rio
->rio_dev
->dev
,
228 "Error executing ioctrl. code = %d\n",
232 dev_dbg(&rio
->rio_dev
->dev
,
233 "Executed ioctl. Result = %d\n", result
);
239 free_page((unsigned long) buffer
);
249 mutex_unlock(&(rio
->lock
));
254 write_rio(struct file
*file
, const char __user
*buffer
,
255 size_t count
, loff_t
* ppos
)
258 struct rio_usb_data
*rio
= &rio_instance
;
260 unsigned long copy_size
;
261 unsigned long bytes_written
= 0;
262 unsigned int partial
;
269 intr
= mutex_lock_interruptible(&(rio
->lock
));
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
));
281 unsigned long thistime
;
282 char *obuf
= rio
->obuf
;
284 thistime
= copy_size
=
285 (count
>= OBUF_SIZE
) ? OBUF_SIZE
: count
;
286 if (copy_from_user(rio
->obuf
, buffer
, copy_size
)) {
296 if (signal_pending(current
)) {
297 mutex_unlock(&(rio
->lock
));
298 return bytes_written
? bytes_written
: -EINTR
;
301 result
= usb_bulk_msg(rio
->rio_dev
,
302 usb_sndbulkpipe(rio
->rio_dev
, 2),
303 obuf
, thistime
, &partial
, 5000);
305 dev_dbg(&rio
->rio_dev
->dev
,
306 "write stats: result:%d thistime:%lu partial:%u\n",
307 result
, thistime
, partial
);
309 if (result
== -ETIMEDOUT
) { /* NAK - so hold for a while */
314 prepare_to_wait(&rio
->wait_q
, &wait
, TASK_INTERRUPTIBLE
);
315 schedule_timeout(NAK_TIMEOUT
);
316 finish_wait(&rio
->wait_q
, &wait
);
318 } else if (!result
&& partial
) {
325 dev_err(&rio
->rio_dev
->dev
, "Write Whoops - %x\n",
330 bytes_written
+= copy_size
;
335 mutex_unlock(&(rio
->lock
));
337 return bytes_written
? bytes_written
: -EIO
;
340 mutex_unlock(&(rio
->lock
));
345 read_rio(struct file
*file
, char __user
*buffer
, size_t count
, loff_t
* ppos
)
348 struct rio_usb_data
*rio
= &rio_instance
;
350 unsigned int partial
;
357 intr
= mutex_lock_interruptible(&(rio
->lock
));
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
));
372 if (signal_pending(current
)) {
373 mutex_unlock(&(rio
->lock
));
374 return read_count
? read_count
: -EINTR
;
377 mutex_unlock(&(rio
->lock
));
380 this_read
= (count
>= IBUF_SIZE
) ? IBUF_SIZE
: count
;
382 result
= usb_bulk_msg(rio
->rio_dev
,
383 usb_rcvbulkpipe(rio
->rio_dev
, 1),
384 ibuf
, this_read
, &partial
,
387 dev_dbg(&rio
->rio_dev
->dev
,
388 "read stats: result:%d this_read:%u partial:%u\n",
389 result
, this_read
, partial
);
392 count
= this_read
= partial
;
393 } else if (result
== -ETIMEDOUT
|| result
== 15) { /* FIXME: 15 ??? */
395 mutex_unlock(&(rio
->lock
));
396 dev_err(&rio
->rio_dev
->dev
,
397 "read_rio: maxretry timeout\n");
400 prepare_to_wait(&rio
->wait_q
, &wait
, TASK_INTERRUPTIBLE
);
401 schedule_timeout(NAK_TIMEOUT
);
402 finish_wait(&rio
->wait_q
, &wait
);
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
);
411 mutex_unlock(&(rio
->lock
));
416 if (copy_to_user(buffer
, ibuf
, this_read
)) {
417 mutex_unlock(&(rio
->lock
));
421 read_count
+= this_read
;
425 mutex_unlock(&(rio
->lock
));
429 static const struct file_operations usb_rio_fops
= {
430 .owner
= THIS_MODULE
,
433 .unlocked_ioctl
= ioctl_rio
,
435 .release
= close_rio
,
436 .llseek
= noop_llseek
,
439 static struct usb_class_driver usb_rio_class
= {
441 .fops
= &usb_rio_fops
,
442 .minor_base
= RIO_MINOR
,
445 static int probe_rio(struct usb_interface
*intf
,
446 const struct usb_device_id
*id
)
448 struct usb_device
*dev
= interface_to_usbdev(intf
);
449 struct rio_usb_data
*rio
= &rio_instance
;
452 dev_info(&intf
->dev
, "USB Rio found at address %d\n", dev
->devnum
);
454 retval
= usb_register_dev(intf
, &usb_rio_class
);
457 "Not able to get a minor for this device.\n");
463 if (!(rio
->obuf
= kmalloc(OBUF_SIZE
, GFP_KERNEL
))) {
465 "probe_rio: Not enough memory for the output buffer\n");
466 usb_deregister_dev(intf
, &usb_rio_class
);
469 dev_dbg(&intf
->dev
, "obuf address:%p\n", rio
->obuf
);
471 if (!(rio
->ibuf
= kmalloc(IBUF_SIZE
, GFP_KERNEL
))) {
473 "probe_rio: Not enough memory for the input buffer\n");
474 usb_deregister_dev(intf
, &usb_rio_class
);
478 dev_dbg(&intf
->dev
, "ibuf address:%p\n", rio
->ibuf
);
480 mutex_init(&(rio
->lock
));
482 usb_set_intfdata (intf
, rio
);
488 static void disconnect_rio(struct usb_interface
*intf
)
490 struct rio_usb_data
*rio
= usb_get_intfdata (intf
);
492 usb_set_intfdata (intf
, NULL
);
493 mutex_lock(&rio500_mutex
);
495 usb_deregister_dev(intf
, &usb_rio_class
);
497 mutex_lock(&(rio
->lock
));
500 /* better let it finish - the release will do whats needed */
502 mutex_unlock(&(rio
->lock
));
503 mutex_unlock(&rio500_mutex
);
509 dev_info(&intf
->dev
, "USB Rio disconnected.\n");
512 mutex_unlock(&(rio
->lock
));
514 mutex_unlock(&rio500_mutex
);
517 static const struct usb_device_id rio_table
[] = {
518 { USB_DEVICE(0x0841, 1) }, /* Rio 500 */
519 { } /* Terminating entry */
522 MODULE_DEVICE_TABLE (usb
, rio_table
);
524 static struct usb_driver rio_driver
= {
527 .disconnect
= disconnect_rio
,
528 .id_table
= rio_table
,
531 module_usb_driver(rio_driver
);
533 MODULE_AUTHOR( DRIVER_AUTHOR
);
534 MODULE_DESCRIPTION( DRIVER_DESC
);
535 MODULE_LICENSE("GPL");