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 
46 struct 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 
57 static DEFINE_MUTEX(rio500_mutex);
58 static struct rio_usb_data rio_instance;
59 
open_rio(struct inode * inode,struct file * file)60 static 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 
close_rio(struct inode * inode,struct file * file)85 static 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 
ioctl_rio(struct file * file,unsigned int cmd,unsigned long arg)95 static 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 
248 err_out:
249 	mutex_unlock(&(rio->lock));
250 	return retval;
251 }
252 
253 static ssize_t
write_rio(struct file * file,const char __user * buffer,size_t count,loff_t * ppos)254 write_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 
339 error:
340 	mutex_unlock(&(rio->lock));
341 	return errn;
342 }
343 
344 static ssize_t
read_rio(struct file * file,char __user * buffer,size_t count,loff_t * ppos)345 read_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 
429 static 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 
439 static struct usb_class_driver usb_rio_class = {
440 	.name =		"rio500%d",
441 	.fops =		&usb_rio_fops,
442 	.minor_base =	RIO_MINOR,
443 };
444 
probe_rio(struct usb_interface * intf,const struct usb_device_id * id)445 static 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 
disconnect_rio(struct usb_interface * intf)488 static 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 
517 static const struct usb_device_id rio_table[] = {
518 	{ USB_DEVICE(0x0841, 1) }, 		/* Rio 500 */
519 	{ }					/* Terminating entry */
520 };
521 
522 MODULE_DEVICE_TABLE (usb, rio_table);
523 
524 static struct usb_driver rio_driver = {
525 	.name =		"rio500",
526 	.probe =	probe_rio,
527 	.disconnect =	disconnect_rio,
528 	.id_table =	rio_table,
529 };
530 
531 module_usb_driver(rio_driver);
532 
533 MODULE_AUTHOR( DRIVER_AUTHOR );
534 MODULE_DESCRIPTION( DRIVER_DESC );
535 MODULE_LICENSE("GPL");
536 
537