Loading...
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
64struct 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
75static DEFINE_MUTEX(rio500_mutex);
76static struct rio_usb_data rio_instance;
77
78static 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
103static 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
113static 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 dbg
157 ("sending command:reqtype=%0x req=%0x value=%0x index=%0x len=%0x",
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 err("Error executing ioctrl. code = %d", result);
175 retries = 0;
176 } else {
177 dbg("Executed ioctl. Result = %d (data=%02x)",
178 result, buffer[0]);
179 if (copy_to_user(rio_cmd.buffer, buffer,
180 rio_cmd.length)) {
181 free_page((unsigned long) buffer);
182 retval = -EFAULT;
183 goto err_out;
184 }
185 retries = 0;
186 }
187
188 /* rio_cmd.buffer contains a raw stream of single byte
189 data which has been returned from rio. Data is
190 interpreted at application level. For data that
191 will be cast to data types longer than 1 byte, data
192 will be little_endian and will potentially need to
193 be swapped at the app level */
194
195 }
196 free_page((unsigned long) buffer);
197 break;
198
199 case RIO_SEND_COMMAND:
200 data = (void __user *) arg;
201 if (data == NULL)
202 break;
203 if (copy_from_user(&rio_cmd, data, sizeof(struct RioCommand))) {
204 retval = -EFAULT;
205 goto err_out;
206 }
207 if (rio_cmd.length < 0 || rio_cmd.length > PAGE_SIZE) {
208 retval = -EINVAL;
209 goto err_out;
210 }
211 buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
212 if (buffer == NULL) {
213 retval = -ENOMEM;
214 goto err_out;
215 }
216 if (copy_from_user(buffer, rio_cmd.buffer, rio_cmd.length)) {
217 free_page((unsigned long)buffer);
218 retval = -EFAULT;
219 goto err_out;
220 }
221
222 requesttype = rio_cmd.requesttype | USB_DIR_OUT |
223 USB_TYPE_VENDOR | USB_RECIP_DEVICE;
224 dbg("sending command: reqtype=%0x req=%0x value=%0x index=%0x len=%0x",
225 requesttype, rio_cmd.request, rio_cmd.value,
226 rio_cmd.index, rio_cmd.length);
227 /* Send rio control message */
228 retries = 3;
229 while (retries) {
230 result = usb_control_msg(rio->rio_dev,
231 usb_sndctrlpipe(rio-> rio_dev, 0),
232 rio_cmd.request,
233 requesttype,
234 rio_cmd.value,
235 rio_cmd.index, buffer,
236 rio_cmd.length,
237 jiffies_to_msecs(rio_cmd.timeout));
238 if (result == -ETIMEDOUT)
239 retries--;
240 else if (result < 0) {
241 err("Error executing ioctrl. code = %d", result);
242 retries = 0;
243 } else {
244 dbg("Executed ioctl. Result = %d", result);
245 retries = 0;
246
247 }
248
249 }
250 free_page((unsigned long) buffer);
251 break;
252
253 default:
254 retval = -ENOTTY;
255 break;
256 }
257
258
259err_out:
260 mutex_unlock(&(rio->lock));
261 return retval;
262}
263
264static ssize_t
265write_rio(struct file *file, const char __user *buffer,
266 size_t count, loff_t * ppos)
267{
268 DEFINE_WAIT(wait);
269 struct rio_usb_data *rio = &rio_instance;
270
271 unsigned long copy_size;
272 unsigned long bytes_written = 0;
273 unsigned int partial;
274
275 int result = 0;
276 int maxretry;
277 int errn = 0;
278 int intr;
279
280 intr = mutex_lock_interruptible(&(rio->lock));
281 if (intr)
282 return -EINTR;
283 /* Sanity check to make sure rio is connected, powered, etc */
284 if (rio->present == 0 || rio->rio_dev == NULL) {
285 mutex_unlock(&(rio->lock));
286 return -ENODEV;
287 }
288
289
290
291 do {
292 unsigned long thistime;
293 char *obuf = rio->obuf;
294
295 thistime = copy_size =
296 (count >= OBUF_SIZE) ? OBUF_SIZE : count;
297 if (copy_from_user(rio->obuf, buffer, copy_size)) {
298 errn = -EFAULT;
299 goto error;
300 }
301 maxretry = 5;
302 while (thistime) {
303 if (!rio->rio_dev) {
304 errn = -ENODEV;
305 goto error;
306 }
307 if (signal_pending(current)) {
308 mutex_unlock(&(rio->lock));
309 return bytes_written ? bytes_written : -EINTR;
310 }
311
312 result = usb_bulk_msg(rio->rio_dev,
313 usb_sndbulkpipe(rio->rio_dev, 2),
314 obuf, thistime, &partial, 5000);
315
316 dbg("write stats: result:%d thistime:%lu partial:%u",
317 result, thistime, partial);
318
319 if (result == -ETIMEDOUT) { /* NAK - so hold for a while */
320 if (!maxretry--) {
321 errn = -ETIME;
322 goto error;
323 }
324 prepare_to_wait(&rio->wait_q, &wait, TASK_INTERRUPTIBLE);
325 schedule_timeout(NAK_TIMEOUT);
326 finish_wait(&rio->wait_q, &wait);
327 continue;
328 } else if (!result && partial) {
329 obuf += partial;
330 thistime -= partial;
331 } else
332 break;
333 };
334 if (result) {
335 err("Write Whoops - %x", result);
336 errn = -EIO;
337 goto error;
338 }
339 bytes_written += copy_size;
340 count -= copy_size;
341 buffer += copy_size;
342 } while (count > 0);
343
344 mutex_unlock(&(rio->lock));
345
346 return bytes_written ? bytes_written : -EIO;
347
348error:
349 mutex_unlock(&(rio->lock));
350 return errn;
351}
352
353static ssize_t
354read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
355{
356 DEFINE_WAIT(wait);
357 struct rio_usb_data *rio = &rio_instance;
358 ssize_t read_count;
359 unsigned int partial;
360 int this_read;
361 int result;
362 int maxretry = 10;
363 char *ibuf;
364 int intr;
365
366 intr = mutex_lock_interruptible(&(rio->lock));
367 if (intr)
368 return -EINTR;
369 /* Sanity check to make sure rio is connected, powered, etc */
370 if (rio->present == 0 || rio->rio_dev == NULL) {
371 mutex_unlock(&(rio->lock));
372 return -ENODEV;
373 }
374
375 ibuf = rio->ibuf;
376
377 read_count = 0;
378
379
380 while (count > 0) {
381 if (signal_pending(current)) {
382 mutex_unlock(&(rio->lock));
383 return read_count ? read_count : -EINTR;
384 }
385 if (!rio->rio_dev) {
386 mutex_unlock(&(rio->lock));
387 return -ENODEV;
388 }
389 this_read = (count >= IBUF_SIZE) ? IBUF_SIZE : count;
390
391 result = usb_bulk_msg(rio->rio_dev,
392 usb_rcvbulkpipe(rio->rio_dev, 1),
393 ibuf, this_read, &partial,
394 8000);
395
396 dbg("read stats: result:%d this_read:%u partial:%u",
397 result, this_read, partial);
398
399 if (partial) {
400 count = this_read = partial;
401 } else if (result == -ETIMEDOUT || result == 15) { /* FIXME: 15 ??? */
402 if (!maxretry--) {
403 mutex_unlock(&(rio->lock));
404 err("read_rio: maxretry timeout");
405 return -ETIME;
406 }
407 prepare_to_wait(&rio->wait_q, &wait, TASK_INTERRUPTIBLE);
408 schedule_timeout(NAK_TIMEOUT);
409 finish_wait(&rio->wait_q, &wait);
410 continue;
411 } else if (result != -EREMOTEIO) {
412 mutex_unlock(&(rio->lock));
413 err("Read Whoops - result:%u partial:%u this_read:%u",
414 result, partial, this_read);
415 return -EIO;
416 } else {
417 mutex_unlock(&(rio->lock));
418 return (0);
419 }
420
421 if (this_read) {
422 if (copy_to_user(buffer, ibuf, this_read)) {
423 mutex_unlock(&(rio->lock));
424 return -EFAULT;
425 }
426 count -= this_read;
427 read_count += this_read;
428 buffer += this_read;
429 }
430 }
431 mutex_unlock(&(rio->lock));
432 return read_count;
433}
434
435static const struct file_operations usb_rio_fops = {
436 .owner = THIS_MODULE,
437 .read = read_rio,
438 .write = write_rio,
439 .unlocked_ioctl = ioctl_rio,
440 .open = open_rio,
441 .release = close_rio,
442 .llseek = noop_llseek,
443};
444
445static struct usb_class_driver usb_rio_class = {
446 .name = "rio500%d",
447 .fops = &usb_rio_fops,
448 .minor_base = RIO_MINOR,
449};
450
451static int probe_rio(struct usb_interface *intf,
452 const struct usb_device_id *id)
453{
454 struct usb_device *dev = interface_to_usbdev(intf);
455 struct rio_usb_data *rio = &rio_instance;
456 int retval;
457
458 dev_info(&intf->dev, "USB Rio found at address %d\n", dev->devnum);
459
460 retval = usb_register_dev(intf, &usb_rio_class);
461 if (retval) {
462 err("Not able to get a minor for this device.");
463 return -ENOMEM;
464 }
465
466 rio->rio_dev = dev;
467
468 if (!(rio->obuf = kmalloc(OBUF_SIZE, GFP_KERNEL))) {
469 err("probe_rio: Not enough memory for the output buffer");
470 usb_deregister_dev(intf, &usb_rio_class);
471 return -ENOMEM;
472 }
473 dbg("probe_rio: obuf address:%p", rio->obuf);
474
475 if (!(rio->ibuf = kmalloc(IBUF_SIZE, GFP_KERNEL))) {
476 err("probe_rio: Not enough memory for the input buffer");
477 usb_deregister_dev(intf, &usb_rio_class);
478 kfree(rio->obuf);
479 return -ENOMEM;
480 }
481 dbg("probe_rio: ibuf address:%p", rio->ibuf);
482
483 mutex_init(&(rio->lock));
484
485 usb_set_intfdata (intf, rio);
486 rio->present = 1;
487
488 return 0;
489}
490
491static void disconnect_rio(struct usb_interface *intf)
492{
493 struct rio_usb_data *rio = usb_get_intfdata (intf);
494
495 usb_set_intfdata (intf, NULL);
496 mutex_lock(&rio500_mutex);
497 if (rio) {
498 usb_deregister_dev(intf, &usb_rio_class);
499
500 mutex_lock(&(rio->lock));
501 if (rio->isopen) {
502 rio->isopen = 0;
503 /* better let it finish - the release will do whats needed */
504 rio->rio_dev = NULL;
505 mutex_unlock(&(rio->lock));
506 mutex_unlock(&rio500_mutex);
507 return;
508 }
509 kfree(rio->ibuf);
510 kfree(rio->obuf);
511
512 dev_info(&intf->dev, "USB Rio disconnected.\n");
513
514 rio->present = 0;
515 mutex_unlock(&(rio->lock));
516 }
517 mutex_unlock(&rio500_mutex);
518}
519
520static const struct usb_device_id rio_table[] = {
521 { USB_DEVICE(0x0841, 1) }, /* Rio 500 */
522 { } /* Terminating entry */
523};
524
525MODULE_DEVICE_TABLE (usb, rio_table);
526
527static struct usb_driver rio_driver = {
528 .name = "rio500",
529 .probe = probe_rio,
530 .disconnect = disconnect_rio,
531 .id_table = rio_table,
532};
533
534static int __init usb_rio_init(void)
535{
536 int retval;
537 retval = usb_register(&rio_driver);
538 if (retval)
539 goto out;
540
541 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
542 DRIVER_DESC "\n");
543
544out:
545 return retval;
546}
547
548
549static void __exit usb_rio_cleanup(void)
550{
551 struct rio_usb_data *rio = &rio_instance;
552
553 rio->present = 0;
554 usb_deregister(&rio_driver);
555
556
557}
558
559module_init(usb_rio_init);
560module_exit(usb_rio_cleanup);
561
562MODULE_AUTHOR( DRIVER_AUTHOR );
563MODULE_DESCRIPTION( DRIVER_DESC );
564MODULE_LICENSE("GPL");
565
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
46struct 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
57static DEFINE_MUTEX(rio500_mutex);
58static struct rio_usb_data rio_instance;
59
60static 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
85static 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
95static 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
248err_out:
249 mutex_unlock(&(rio->lock));
250 return retval;
251}
252
253static ssize_t
254write_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
339error:
340 mutex_unlock(&(rio->lock));
341 return errn;
342}
343
344static ssize_t
345read_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
429static 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
439static struct usb_class_driver usb_rio_class = {
440 .name = "rio500%d",
441 .fops = &usb_rio_fops,
442 .minor_base = RIO_MINOR,
443};
444
445static 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
488static 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
517static const struct usb_device_id rio_table[] = {
518 { USB_DEVICE(0x0841, 1) }, /* Rio 500 */
519 { } /* Terminating entry */
520};
521
522MODULE_DEVICE_TABLE (usb, rio_table);
523
524static struct usb_driver rio_driver = {
525 .name = "rio500",
526 .probe = probe_rio,
527 .disconnect = disconnect_rio,
528 .id_table = rio_table,
529};
530
531module_usb_driver(rio_driver);
532
533MODULE_AUTHOR( DRIVER_AUTHOR );
534MODULE_DESCRIPTION( DRIVER_DESC );
535MODULE_LICENSE("GPL");
536