• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
64 struct 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 
75 static DEFINE_MUTEX(rio500_mutex);
76 static struct rio_usb_data rio_instance;
77 
open_rio(struct inode * inode,struct file * file)78 static 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 
close_rio(struct inode * inode,struct file * file)103 static 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 
ioctl_rio(struct file * file,unsigned int cmd,unsigned long arg)113 static 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 
266 err_out:
267 	mutex_unlock(&(rio->lock));
268 	return retval;
269 }
270 
271 static ssize_t
write_rio(struct file * file,const char __user * buffer,size_t count,loff_t * ppos)272 write_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 
357 error:
358 	mutex_unlock(&(rio->lock));
359 	return errn;
360 }
361 
362 static ssize_t
read_rio(struct file * file,char __user * buffer,size_t count,loff_t * ppos)363 read_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 
447 static 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 
457 static struct usb_class_driver usb_rio_class = {
458 	.name =		"rio500%d",
459 	.fops =		&usb_rio_fops,
460 	.minor_base =	RIO_MINOR,
461 };
462 
probe_rio(struct usb_interface * intf,const struct usb_device_id * id)463 static 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 
disconnect_rio(struct usb_interface * intf)506 static 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 
535 static const struct usb_device_id rio_table[] = {
536 	{ USB_DEVICE(0x0841, 1) }, 		/* Rio 500 */
537 	{ }					/* Terminating entry */
538 };
539 
540 MODULE_DEVICE_TABLE (usb, rio_table);
541 
542 static struct usb_driver rio_driver = {
543 	.name =		"rio500",
544 	.probe =	probe_rio,
545 	.disconnect =	disconnect_rio,
546 	.id_table =	rio_table,
547 };
548 
549 module_usb_driver(rio_driver);
550 
551 MODULE_AUTHOR( DRIVER_AUTHOR );
552 MODULE_DESCRIPTION( DRIVER_DESC );
553 MODULE_LICENSE("GPL");
554 
555