initial commit with v2.6.9
[linux-2.6.9-moxart.git] / drivers / usb / misc / rio500.c
blobe90a334f7287f49f3e35500bd58f0c443decbf72
1 /* -*- linux-c -*- */
3 /*
4 * Driver for USB Rio 500
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.
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).
26 * Changelog:
27 * 30/05/2003 replaced lock/unlock kernel with up/down
28 * Daniele Bellucci bellucda@tiscali.it
29 * */
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/smp_lock.h>
44 #include "rio500_usb.h"
47 * Version Information
49 #define DRIVER_VERSION "v1.1"
50 #define DRIVER_AUTHOR "Cesar Miquel <miquel@df.uba.ar>"
51 #define DRIVER_DESC "USB Rio 500 driver"
53 #define RIO_MINOR 64
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
63 struct rio_usb_data {
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 semaphore 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 down(&(rio->lock));
82 if (rio->isopen || !rio->present) {
83 up(&(rio->lock));
84 return -EBUSY;
86 rio->isopen = 1;
88 init_waitqueue_head(&rio->wait_q);
90 up(&(rio->lock));
92 info("Rio opened.");
94 return 0;
97 static int close_rio(struct inode *inode, struct file *file)
99 struct rio_usb_data *rio = &rio_instance;
101 rio->isopen = 0;
103 info("Rio closed.");
104 return 0;
107 static int
108 ioctl_rio(struct inode *inode, struct file *file, unsigned int cmd,
109 unsigned long arg)
111 struct RioCommand rio_cmd;
112 struct rio_usb_data *rio = &rio_instance;
113 void __user *data;
114 unsigned char *buffer;
115 int result, requesttype;
116 int retries;
117 int retval=0;
119 down(&(rio->lock));
120 /* Sanity check to make sure rio is connected, powered, etc */
121 if ( rio == NULL ||
122 rio->present == 0 ||
123 rio->rio_dev == NULL )
125 retval = -ENODEV;
126 goto err_out;
129 switch (cmd) {
130 case RIO_RECV_COMMAND:
131 data = (void __user *) arg;
132 if (data == NULL)
133 break;
134 if (copy_from_user(&rio_cmd, data, sizeof(struct RioCommand))) {
135 retval = -EFAULT;
136 goto err_out;
138 if (rio_cmd.length < 0 || rio_cmd.length > PAGE_SIZE) {
139 retval = -EINVAL;
140 goto err_out;
142 buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
143 if (buffer == NULL) {
144 retval = -ENOMEM;
145 goto err_out;
147 if (copy_from_user(buffer, rio_cmd.buffer, rio_cmd.length)) {
148 retval = -EFAULT;
149 free_page((unsigned long) buffer);
150 goto err_out;
153 requesttype = rio_cmd.requesttype | USB_DIR_IN |
154 USB_TYPE_VENDOR | USB_RECIP_DEVICE;
156 ("sending command:reqtype=%0x req=%0x value=%0x index=%0x len=%0x",
157 requesttype, rio_cmd.request, rio_cmd.value,
158 rio_cmd.index, rio_cmd.length);
159 /* Send rio control message */
160 retries = 3;
161 while (retries) {
162 result = usb_control_msg(rio->rio_dev,
163 usb_rcvctrlpipe(rio-> rio_dev, 0),
164 rio_cmd.request,
165 requesttype,
166 rio_cmd.value,
167 rio_cmd.index, buffer,
168 rio_cmd.length,
169 rio_cmd.timeout);
170 if (result == -ETIMEDOUT)
171 retries--;
172 else if (result < 0) {
173 err("Error executing ioctrl. code = %d",
174 le32_to_cpu(result));
175 retries = 0;
176 } else {
177 dbg("Executed ioctl. Result = %d (data=%04x)",
178 le32_to_cpu(result),
179 le32_to_cpu(*((long *) buffer)));
180 if (copy_to_user(rio_cmd.buffer, buffer,
181 rio_cmd.length)) {
182 free_page((unsigned long) buffer);
183 retval = -EFAULT;
184 goto err_out;
186 retries = 0;
189 /* rio_cmd.buffer contains a raw stream of single byte
190 data which has been returned from rio. Data is
191 interpreted at application level. For data that
192 will be cast to data types longer than 1 byte, data
193 will be little_endian and will potentially need to
194 be swapped at the app level */
197 free_page((unsigned long) buffer);
198 break;
200 case RIO_SEND_COMMAND:
201 data = (void __user *) arg;
202 if (data == NULL)
203 break;
204 if (copy_from_user(&rio_cmd, data, sizeof(struct RioCommand))) {
205 retval = -EFAULT;
206 goto err_out;
208 if (rio_cmd.length < 0 || rio_cmd.length > PAGE_SIZE) {
209 retval = -EINVAL;
210 goto err_out;
212 buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
213 if (buffer == NULL) {
214 retval = -ENOMEM;
215 goto err_out;
217 if (copy_from_user(buffer, rio_cmd.buffer, rio_cmd.length)) {
218 free_page((unsigned long)buffer);
219 retval = -EFAULT;
220 goto err_out;
223 requesttype = rio_cmd.requesttype | USB_DIR_OUT |
224 USB_TYPE_VENDOR | USB_RECIP_DEVICE;
225 dbg("sending command: reqtype=%0x req=%0x value=%0x index=%0x len=%0x",
226 requesttype, rio_cmd.request, rio_cmd.value,
227 rio_cmd.index, rio_cmd.length);
228 /* Send rio control message */
229 retries = 3;
230 while (retries) {
231 result = usb_control_msg(rio->rio_dev,
232 usb_sndctrlpipe(rio-> rio_dev, 0),
233 rio_cmd.request,
234 requesttype,
235 rio_cmd.value,
236 rio_cmd.index, buffer,
237 rio_cmd.length,
238 rio_cmd.timeout);
239 if (result == -ETIMEDOUT)
240 retries--;
241 else if (result < 0) {
242 err("Error executing ioctrl. code = %d",
243 le32_to_cpu(result));
244 retries = 0;
245 } else {
246 dbg("Executed ioctl. Result = %d",
247 le32_to_cpu(result));
248 retries = 0;
253 free_page((unsigned long) buffer);
254 break;
256 default:
257 retval = -ENOTTY;
258 break;
262 err_out:
263 up(&(rio->lock));
264 return retval;
267 static ssize_t
268 write_rio(struct file *file, const char __user *buffer,
269 size_t count, loff_t * ppos)
271 struct rio_usb_data *rio = &rio_instance;
273 unsigned long copy_size;
274 unsigned long bytes_written = 0;
275 unsigned int partial;
277 int result = 0;
278 int maxretry;
279 int errn = 0;
281 down(&(rio->lock));
282 /* Sanity check to make sure rio is connected, powered, etc */
283 if ( rio == NULL ||
284 rio->present == 0 ||
285 rio->rio_dev == NULL )
287 up(&(rio->lock));
288 return -ENODEV;
293 do {
294 unsigned long thistime;
295 char *obuf = rio->obuf;
297 thistime = copy_size =
298 (count >= OBUF_SIZE) ? OBUF_SIZE : count;
299 if (copy_from_user(rio->obuf, buffer, copy_size)) {
300 errn = -EFAULT;
301 goto error;
303 maxretry = 5;
304 while (thistime) {
305 if (!rio->rio_dev) {
306 errn = -ENODEV;
307 goto error;
309 if (signal_pending(current)) {
310 up(&(rio->lock));
311 return bytes_written ? bytes_written : -EINTR;
314 result = usb_bulk_msg(rio->rio_dev,
315 usb_sndbulkpipe(rio->rio_dev, 2),
316 obuf, thistime, &partial, 5 * HZ);
318 dbg("write stats: result:%d thistime:%lu partial:%u",
319 result, thistime, partial);
321 if (result == -ETIMEDOUT) { /* NAK - so hold for a while */
322 if (!maxretry--) {
323 errn = -ETIME;
324 goto error;
326 interruptible_sleep_on_timeout(&rio-> wait_q, NAK_TIMEOUT);
327 continue;
328 } else if (!result && partial) {
329 obuf += partial;
330 thistime -= partial;
331 } else
332 break;
334 if (result) {
335 err("Write Whoops - %x", result);
336 errn = -EIO;
337 goto error;
339 bytes_written += copy_size;
340 count -= copy_size;
341 buffer += copy_size;
342 } while (count > 0);
344 up(&(rio->lock));
346 return bytes_written ? bytes_written : -EIO;
348 error:
349 up(&(rio->lock));
350 return errn;
353 static ssize_t
354 read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
356 struct rio_usb_data *rio = &rio_instance;
357 ssize_t read_count;
358 unsigned int partial;
359 int this_read;
360 int result;
361 int maxretry = 10;
362 char *ibuf;
364 down(&(rio->lock));
365 /* Sanity check to make sure rio is connected, powered, etc */
366 if ( rio == NULL ||
367 rio->present == 0 ||
368 rio->rio_dev == NULL )
370 up(&(rio->lock));
371 return -ENODEV;
374 ibuf = rio->ibuf;
376 read_count = 0;
379 while (count > 0) {
380 if (signal_pending(current)) {
381 up(&(rio->lock));
382 return read_count ? read_count : -EINTR;
384 if (!rio->rio_dev) {
385 up(&(rio->lock));
386 return -ENODEV;
388 this_read = (count >= IBUF_SIZE) ? IBUF_SIZE : count;
390 result = usb_bulk_msg(rio->rio_dev,
391 usb_rcvbulkpipe(rio->rio_dev, 1),
392 ibuf, this_read, &partial,
393 (int) (HZ * 8));
395 dbg(KERN_DEBUG "read stats: result:%d this_read:%u partial:%u",
396 result, this_read, partial);
398 if (partial) {
399 count = this_read = partial;
400 } else if (result == -ETIMEDOUT || result == 15) { /* FIXME: 15 ??? */
401 if (!maxretry--) {
402 up(&(rio->lock));
403 err("read_rio: maxretry timeout");
404 return -ETIME;
406 interruptible_sleep_on_timeout(&rio->wait_q,
407 NAK_TIMEOUT);
408 continue;
409 } else if (result != -EREMOTEIO) {
410 up(&(rio->lock));
411 err("Read Whoops - result:%u partial:%u this_read:%u",
412 result, partial, this_read);
413 return -EIO;
414 } else {
415 up(&(rio->lock));
416 return (0);
419 if (this_read) {
420 if (copy_to_user(buffer, ibuf, this_read)) {
421 up(&(rio->lock));
422 return -EFAULT;
424 count -= this_read;
425 read_count += this_read;
426 buffer += this_read;
429 up(&(rio->lock));
430 return read_count;
433 static struct
434 file_operations usb_rio_fops = {
435 .owner = THIS_MODULE,
436 .read = read_rio,
437 .write = write_rio,
438 .ioctl = ioctl_rio,
439 .open = open_rio,
440 .release = close_rio,
443 static struct usb_class_driver usb_rio_class = {
444 .name = "usb/rio500%d",
445 .fops = &usb_rio_fops,
446 .mode = S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
447 .minor_base = RIO_MINOR,
450 static int probe_rio(struct usb_interface *intf,
451 const struct usb_device_id *id)
453 struct usb_device *dev = interface_to_usbdev(intf);
454 struct rio_usb_data *rio = &rio_instance;
455 int retval;
457 info("USB Rio found at address %d", dev->devnum);
459 retval = usb_register_dev(intf, &usb_rio_class);
460 if (retval) {
461 err("Not able to get a minor for this device.");
462 return -ENOMEM;
465 rio->rio_dev = dev;
467 if (!(rio->obuf = (char *) kmalloc(OBUF_SIZE, GFP_KERNEL))) {
468 err("probe_rio: Not enough memory for the output buffer");
469 usb_deregister_dev(intf, &usb_rio_class);
470 return -ENOMEM;
472 dbg("probe_rio: obuf address:%p", rio->obuf);
474 if (!(rio->ibuf = (char *) kmalloc(IBUF_SIZE, GFP_KERNEL))) {
475 err("probe_rio: Not enough memory for the input buffer");
476 usb_deregister_dev(intf, &usb_rio_class);
477 kfree(rio->obuf);
478 return -ENOMEM;
480 dbg("probe_rio: ibuf address:%p", rio->ibuf);
482 init_MUTEX(&(rio->lock));
484 usb_set_intfdata (intf, rio);
485 rio->present = 1;
487 return 0;
490 static void disconnect_rio(struct usb_interface *intf)
492 struct rio_usb_data *rio = usb_get_intfdata (intf);
494 usb_set_intfdata (intf, NULL);
495 if (rio) {
496 usb_deregister_dev(intf, &usb_rio_class);
498 down(&(rio->lock));
499 if (rio->isopen) {
500 rio->isopen = 0;
501 /* better let it finish - the release will do whats needed */
502 rio->rio_dev = NULL;
503 up(&(rio->lock));
504 return;
506 kfree(rio->ibuf);
507 kfree(rio->obuf);
509 info("USB Rio disconnected.");
511 rio->present = 0;
512 up(&(rio->lock));
516 static struct usb_device_id rio_table [] = {
517 { USB_DEVICE(0x0841, 1) }, /* Rio 500 */
518 { } /* Terminating entry */
521 MODULE_DEVICE_TABLE (usb, rio_table);
523 static struct usb_driver rio_driver = {
524 .owner = THIS_MODULE,
525 .name = "rio500",
526 .probe = probe_rio,
527 .disconnect = disconnect_rio,
528 .id_table = rio_table,
531 static int __init usb_rio_init(void)
533 int retval;
534 retval = usb_register(&rio_driver);
535 if (retval)
536 goto out;
538 info(DRIVER_VERSION ":" DRIVER_DESC);
540 out:
541 return retval;
545 static void __exit usb_rio_cleanup(void)
547 struct rio_usb_data *rio = &rio_instance;
549 rio->present = 0;
550 usb_deregister(&rio_driver);
555 module_init(usb_rio_init);
556 module_exit(usb_rio_cleanup);
558 MODULE_AUTHOR( DRIVER_AUTHOR );
559 MODULE_DESCRIPTION( DRIVER_DESC );
560 MODULE_LICENSE("GPL");