blob: 04dd45139406450ad494090d667dc82bde436939 [file] [log] [blame]
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001/*
2 * Gadget Driver for Android ADB
3 *
4 * Copyright (C) 2008 Google, Inc.
5 * Author: Mike Lockwood <lockwood@android.com>
6 *
7 * This software is licensed under the terms of the GNU General Public
8 * License version 2, as published by the Free Software Foundation, and
9 * may be copied, distributed, and modified under those terms.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 */
17
18/* #define DEBUG */
19/* #define VERBOSE_DEBUG */
20
21#include <linux/module.h>
22#include <linux/init.h>
23#include <linux/poll.h>
24#include <linux/delay.h>
25#include <linux/wait.h>
26#include <linux/err.h>
27#include <linux/interrupt.h>
28#include <linux/sched.h>
29#include <linux/types.h>
30#include <linux/device.h>
31#include <linux/miscdevice.h>
32
Krishna, Vamsi83814ea2009-02-11 21:07:20 +053033#include <linux/usb/android_composite.h>
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -050034
35#define BULK_BUFFER_SIZE 4096
36
37/* number of rx and tx requests to allocate */
38#define RX_REQ_MAX 4
39#define TX_REQ_MAX 4
40
41static const char shortname[] = "android_adb";
42
43struct adb_dev {
44 struct usb_function function;
45 struct usb_composite_dev *cdev;
46 spinlock_t lock;
47
48 struct usb_ep *ep_in;
49 struct usb_ep *ep_out;
50
51 int online;
52 int error;
53
54 atomic_t read_excl;
55 atomic_t write_excl;
56 atomic_t open_excl;
57
58 struct list_head tx_idle;
59 struct list_head rx_idle;
60 struct list_head rx_done;
61
62 wait_queue_head_t read_wq;
63 wait_queue_head_t write_wq;
64
65 /* the request we're currently reading from */
66 struct usb_request *read_req;
67 unsigned char *read_buf;
68 unsigned read_count;
69};
70
71static struct usb_interface_descriptor adb_interface_desc = {
72 .bLength = USB_DT_INTERFACE_SIZE,
73 .bDescriptorType = USB_DT_INTERFACE,
74 .bInterfaceNumber = 0,
75 .bNumEndpoints = 2,
76 .bInterfaceClass = 0xFF,
77 .bInterfaceSubClass = 0x42,
78 .bInterfaceProtocol = 1,
79};
80
81static struct usb_endpoint_descriptor adb_highspeed_in_desc = {
82 .bLength = USB_DT_ENDPOINT_SIZE,
83 .bDescriptorType = USB_DT_ENDPOINT,
84 .bEndpointAddress = USB_DIR_IN,
85 .bmAttributes = USB_ENDPOINT_XFER_BULK,
86 .wMaxPacketSize = __constant_cpu_to_le16(512),
87};
88
89static struct usb_endpoint_descriptor adb_highspeed_out_desc = {
90 .bLength = USB_DT_ENDPOINT_SIZE,
91 .bDescriptorType = USB_DT_ENDPOINT,
92 .bEndpointAddress = USB_DIR_OUT,
93 .bmAttributes = USB_ENDPOINT_XFER_BULK,
94 .wMaxPacketSize = __constant_cpu_to_le16(512),
95};
96
97static struct usb_endpoint_descriptor adb_fullspeed_in_desc = {
98 .bLength = USB_DT_ENDPOINT_SIZE,
99 .bDescriptorType = USB_DT_ENDPOINT,
100 .bEndpointAddress = USB_DIR_IN,
101 .bmAttributes = USB_ENDPOINT_XFER_BULK,
102};
103
104static struct usb_endpoint_descriptor adb_fullspeed_out_desc = {
105 .bLength = USB_DT_ENDPOINT_SIZE,
106 .bDescriptorType = USB_DT_ENDPOINT,
107 .bEndpointAddress = USB_DIR_OUT,
108 .bmAttributes = USB_ENDPOINT_XFER_BULK,
109};
110
111static struct usb_descriptor_header *fs_adb_descs[] = {
112 (struct usb_descriptor_header *) &adb_interface_desc,
113 (struct usb_descriptor_header *) &adb_fullspeed_in_desc,
114 (struct usb_descriptor_header *) &adb_fullspeed_out_desc,
115 NULL,
116};
117
118static struct usb_descriptor_header *hs_adb_descs[] = {
119 (struct usb_descriptor_header *) &adb_interface_desc,
120 (struct usb_descriptor_header *) &adb_highspeed_in_desc,
121 (struct usb_descriptor_header *) &adb_highspeed_out_desc,
122 NULL,
123};
124
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500125
126/* temporary variable used between adb_open() and adb_gadget_bind() */
127static struct adb_dev *_adb_dev;
128
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530129static atomic_t adb_enable_excl;
130
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500131static inline struct adb_dev *func_to_dev(struct usb_function *f)
132{
133 return container_of(f, struct adb_dev, function);
134}
135
136
137static struct usb_request *adb_request_new(struct usb_ep *ep, int buffer_size)
138{
139 struct usb_request *req = usb_ep_alloc_request(ep, GFP_KERNEL);
140 if (!req)
141 return NULL;
142
143 /* now allocate buffers for the requests */
144 req->buf = kmalloc(buffer_size, GFP_KERNEL);
145 if (!req->buf) {
146 usb_ep_free_request(ep, req);
147 return NULL;
148 }
149
150 return req;
151}
152
153static void adb_request_free(struct usb_request *req, struct usb_ep *ep)
154{
155 if (req) {
156 kfree(req->buf);
157 usb_ep_free_request(ep, req);
158 }
159}
160
161static inline int _lock(atomic_t *excl)
162{
163 if (atomic_inc_return(excl) == 1) {
164 return 0;
165 } else {
166 atomic_dec(excl);
167 return -1;
168 }
169}
170
171static inline void _unlock(atomic_t *excl)
172{
173 atomic_dec(excl);
174}
175
176/* add a request to the tail of a list */
177void req_put(struct adb_dev *dev, struct list_head *head,
178 struct usb_request *req)
179{
180 unsigned long flags;
181
182 spin_lock_irqsave(&dev->lock, flags);
183 list_add_tail(&req->list, head);
184 spin_unlock_irqrestore(&dev->lock, flags);
185}
186
187/* remove a request from the head of a list */
188struct usb_request *req_get(struct adb_dev *dev, struct list_head *head)
189{
190 unsigned long flags;
191 struct usb_request *req;
192
193 spin_lock_irqsave(&dev->lock, flags);
194 if (list_empty(head)) {
195 req = 0;
196 } else {
197 req = list_first_entry(head, struct usb_request, list);
198 list_del(&req->list);
199 }
200 spin_unlock_irqrestore(&dev->lock, flags);
201 return req;
202}
203
204static void adb_complete_in(struct usb_ep *ep, struct usb_request *req)
205{
206 struct adb_dev *dev = _adb_dev;
207
208 if (req->status != 0)
209 dev->error = 1;
210
211 req_put(dev, &dev->tx_idle, req);
212
213 wake_up(&dev->write_wq);
214}
215
216static void adb_complete_out(struct usb_ep *ep, struct usb_request *req)
217{
218 struct adb_dev *dev = _adb_dev;
219
220 if (req->status != 0) {
221 dev->error = 1;
222 req_put(dev, &dev->rx_idle, req);
223 } else {
224 req_put(dev, &dev->rx_done, req);
225 }
226
227 wake_up(&dev->read_wq);
228}
229
230static int __init create_bulk_endpoints(struct adb_dev *dev,
231 struct usb_endpoint_descriptor *in_desc,
232 struct usb_endpoint_descriptor *out_desc)
233{
234 struct usb_composite_dev *cdev = dev->cdev;
235 struct usb_request *req;
236 struct usb_ep *ep;
237 int i;
238
239 DBG(cdev, "create_bulk_endpoints dev: %p\n", dev);
240
241 ep = usb_ep_autoconfig(cdev->gadget, in_desc);
242 if (!ep) {
243 DBG(cdev, "usb_ep_autoconfig for ep_in failed\n");
244 return -ENODEV;
245 }
246 DBG(cdev, "usb_ep_autoconfig for ep_in got %s\n", ep->name);
247 dev->ep_in = ep;
248
249 ep = usb_ep_autoconfig(cdev->gadget, out_desc);
250 if (!ep) {
251 DBG(cdev, "usb_ep_autoconfig for ep_out failed\n");
252 return -ENODEV;
253 }
254 DBG(cdev, "usb_ep_autoconfig for adb ep_out got %s\n", ep->name);
255 dev->ep_out = ep;
256
257 /* now allocate requests for our endpoints */
258 for (i = 0; i < RX_REQ_MAX; i++) {
259 req = adb_request_new(dev->ep_out, BULK_BUFFER_SIZE);
260 if (!req)
261 goto fail;
262 req->complete = adb_complete_out;
263 req_put(dev, &dev->rx_idle, req);
264 }
265
266 for (i = 0; i < TX_REQ_MAX; i++) {
267 req = adb_request_new(dev->ep_in, BULK_BUFFER_SIZE);
268 if (!req)
269 goto fail;
270 req->complete = adb_complete_in;
271 req_put(dev, &dev->tx_idle, req);
272 }
273
274 return 0;
275
276fail:
277 printk(KERN_ERR "adb_bind() could not allocate requests\n");
278 return -1;
279}
280
281static ssize_t adb_read(struct file *fp, char __user *buf,
282 size_t count, loff_t *pos)
283{
284 struct adb_dev *dev = fp->private_data;
285 struct usb_composite_dev *cdev = dev->cdev;
286 struct usb_request *req;
287 int r = count, xfer;
288 int ret;
289
290 DBG(cdev, "adb_read(%d)\n", count);
291
292 if (_lock(&dev->read_excl))
293 return -EBUSY;
294
295 /* we will block until we're online */
296 while (!(dev->online || dev->error)) {
297 DBG(cdev, "adb_read: waiting for online state\n");
298 ret = wait_event_interruptible(dev->read_wq,
299 (dev->online || dev->error));
300 if (ret < 0) {
301 _unlock(&dev->read_excl);
302 return ret;
303 }
304 }
305
306 while (count > 0) {
307 if (dev->error) {
308 DBG(cdev, "adb_read dev->error\n");
309 r = -EIO;
310 break;
311 }
312
313 /* if we have idle read requests, get them queued */
314 while ((req = req_get(dev, &dev->rx_idle))) {
315requeue_req:
316 req->length = BULK_BUFFER_SIZE;
317 ret = usb_ep_queue(dev->ep_out, req, GFP_ATOMIC);
318
319 if (ret < 0) {
320 r = -EIO;
321 dev->error = 1;
322 req_put(dev, &dev->rx_idle, req);
323 goto fail;
324 } else {
325 DBG(cdev, "rx %p queue\n", req);
326 }
327 }
328
329 /* if we have data pending, give it to userspace */
330 if (dev->read_count > 0) {
331 if (dev->read_count < count)
332 xfer = dev->read_count;
333 else
334 xfer = count;
335
336 if (copy_to_user(buf, dev->read_buf, xfer)) {
337 r = -EFAULT;
338 break;
339 }
340 dev->read_buf += xfer;
341 dev->read_count -= xfer;
342 buf += xfer;
343 count -= xfer;
344
345 /* if we've emptied the buffer, release the request */
346 if (dev->read_count == 0) {
347 req_put(dev, &dev->rx_idle, dev->read_req);
348 dev->read_req = 0;
349 }
350 continue;
351 }
352
353 /* wait for a request to complete */
354 req = 0;
355 ret = wait_event_interruptible(dev->read_wq,
356 ((req = req_get(dev, &dev->rx_done)) || dev->error));
357 if (req != 0) {
358 /* if we got a 0-len one we need to put it back into
359 ** service. if we made it the current read req we'd
360 ** be stuck forever
361 */
362 if (req->actual == 0)
363 goto requeue_req;
364
365 dev->read_req = req;
366 dev->read_count = req->actual;
367 dev->read_buf = req->buf;
368 DBG(cdev, "rx %p %d\n", req, req->actual);
369 }
370
371 if (ret < 0) {
372 r = ret;
373 break;
374 }
375 }
376
377fail:
378 _unlock(&dev->read_excl);
379 DBG(cdev, "adb_read returning %d\n", r);
380 return r;
381}
382
383static ssize_t adb_write(struct file *fp, const char __user *buf,
384 size_t count, loff_t *pos)
385{
386 struct adb_dev *dev = fp->private_data;
387 struct usb_composite_dev *cdev = dev->cdev;
388 struct usb_request *req = 0;
389 int r = count, xfer;
390 int ret;
391
392 DBG(cdev, "adb_write(%d)\n", count);
393
394 if (_lock(&dev->write_excl))
395 return -EBUSY;
396
397 while (count > 0) {
398 if (dev->error) {
399 DBG(cdev, "adb_write dev->error\n");
400 r = -EIO;
401 break;
402 }
403
404 /* get an idle tx request to use */
405 req = 0;
406 ret = wait_event_interruptible(dev->write_wq,
407 ((req = req_get(dev, &dev->tx_idle)) || dev->error));
408
409 if (ret < 0) {
410 r = ret;
411 break;
412 }
413
414 if (req != 0) {
415 if (count > BULK_BUFFER_SIZE)
416 xfer = BULK_BUFFER_SIZE;
417 else
418 xfer = count;
419 if (copy_from_user(req->buf, buf, xfer)) {
420 r = -EFAULT;
421 break;
422 }
423
424 req->length = xfer;
425 ret = usb_ep_queue(dev->ep_in, req, GFP_ATOMIC);
426 if (ret < 0) {
427 DBG(cdev, "adb_write: xfer error %d\n", ret);
428 dev->error = 1;
429 r = -EIO;
430 break;
431 }
432
433 buf += xfer;
434 count -= xfer;
435
436 /* zero this so we don't try to free it on error exit */
437 req = 0;
438 }
439 }
440
441 if (req)
442 req_put(dev, &dev->tx_idle, req);
443
444 _unlock(&dev->write_excl);
445 DBG(cdev, "adb_write returning %d\n", r);
446 return r;
447}
448
449static int adb_open(struct inode *ip, struct file *fp)
450{
451 printk(KERN_INFO "adb_open\n");
452 if (_lock(&_adb_dev->open_excl))
453 return -EBUSY;
454
455 fp->private_data = _adb_dev;
456
457 /* clear the error latch */
458 _adb_dev->error = 0;
459
460 return 0;
461}
462
463static int adb_release(struct inode *ip, struct file *fp)
464{
465 printk(KERN_INFO "adb_release\n");
466 _unlock(&_adb_dev->open_excl);
467 return 0;
468}
469
470/* file operations for ADB device /dev/android_adb */
471static struct file_operations adb_fops = {
472 .owner = THIS_MODULE,
473 .read = adb_read,
474 .write = adb_write,
475 .open = adb_open,
476 .release = adb_release,
477};
478
479static struct miscdevice adb_device = {
480 .minor = MISC_DYNAMIC_MINOR,
481 .name = shortname,
482 .fops = &adb_fops,
483};
484
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530485static int adb_enable_open(struct inode *ip, struct file *fp)
486{
487 if (atomic_inc_return(&adb_enable_excl) != 1) {
488 atomic_dec(&adb_enable_excl);
489 return -EBUSY;
490 }
491
492 printk(KERN_INFO "enabling adb\n");
493 android_enable_function(&_adb_dev->function, 1);
494
495 return 0;
496}
497
498static int adb_enable_release(struct inode *ip, struct file *fp)
499{
500 printk(KERN_INFO "disabling adb\n");
501 android_enable_function(&_adb_dev->function, 0);
502 atomic_dec(&adb_enable_excl);
503 return 0;
504}
505
506static const struct file_operations adb_enable_fops = {
507 .owner = THIS_MODULE,
508 .open = adb_enable_open,
509 .release = adb_enable_release,
510};
511
512static struct miscdevice adb_enable_device = {
513 .minor = MISC_DYNAMIC_MINOR,
514 .name = "android_adb_enable",
515 .fops = &adb_enable_fops,
516};
517
518static int
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500519adb_function_bind(struct usb_configuration *c, struct usb_function *f)
520{
521 struct usb_composite_dev *cdev = c->cdev;
522 struct adb_dev *dev = func_to_dev(f);
523 int id;
524 int ret;
525
526 dev->cdev = cdev;
527 DBG(cdev, "adb_function_bind dev: %p\n", dev);
528
529 /* allocate interface ID(s) */
530 id = usb_interface_id(c, f);
531 if (id < 0)
532 return id;
533 adb_interface_desc.bInterfaceNumber = id;
534
535 /* allocate endpoints */
536 ret = create_bulk_endpoints(dev, &adb_fullspeed_in_desc,
537 &adb_fullspeed_out_desc);
538 if (ret)
539 return ret;
540
541 /* support high speed hardware */
542 if (gadget_is_dualspeed(c->cdev->gadget)) {
543 adb_highspeed_in_desc.bEndpointAddress =
544 adb_fullspeed_in_desc.bEndpointAddress;
545 adb_highspeed_out_desc.bEndpointAddress =
546 adb_fullspeed_out_desc.bEndpointAddress;
547 }
548
549 DBG(cdev, "%s speed %s: IN/%s, OUT/%s\n",
550 gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
551 f->name, dev->ep_in->name, dev->ep_out->name);
552 return 0;
553}
554
555static void
556adb_function_unbind(struct usb_configuration *c, struct usb_function *f)
557{
558 struct adb_dev *dev = func_to_dev(f);
559 struct usb_request *req;
560
561 spin_lock_irq(&dev->lock);
562
563 while ((req = req_get(dev, &dev->rx_idle)))
564 adb_request_free(req, dev->ep_out);
565 while ((req = req_get(dev, &dev->tx_idle)))
566 adb_request_free(req, dev->ep_in);
567
568 dev->online = 0;
569 dev->error = 1;
570 spin_unlock_irq(&dev->lock);
571
572 misc_deregister(&adb_device);
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530573 misc_deregister(&adb_enable_device);
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500574 kfree(_adb_dev);
575 _adb_dev = NULL;
576}
577
578static int adb_function_set_alt(struct usb_function *f,
579 unsigned intf, unsigned alt)
580{
581 struct adb_dev *dev = func_to_dev(f);
582 struct usb_composite_dev *cdev = f->config->cdev;
583 int ret;
584
585 DBG(cdev, "adb_function_set_alt intf: %d alt: %d\n", intf, alt);
586 ret = usb_ep_enable(dev->ep_in,
587 ep_choose(cdev->gadget,
588 &adb_highspeed_in_desc,
589 &adb_fullspeed_in_desc));
590 if (ret)
591 return ret;
592 ret = usb_ep_enable(dev->ep_out,
593 ep_choose(cdev->gadget,
594 &adb_highspeed_out_desc,
595 &adb_fullspeed_out_desc));
596 if (ret) {
597 usb_ep_disable(dev->ep_in);
598 return ret;
599 }
600 dev->online = 1;
601
602 /* readers may be blocked waiting for us to go online */
603 wake_up(&dev->read_wq);
604 return 0;
605}
606
607static void adb_function_disable(struct usb_function *f)
608{
609 struct adb_dev *dev = func_to_dev(f);
610 struct usb_composite_dev *cdev = dev->cdev;
611
612 DBG(cdev, "adb_function_disable\n");
613 dev->online = 0;
614 dev->error = 1;
615 usb_ep_disable(dev->ep_in);
616 usb_ep_disable(dev->ep_out);
617
618 /* readers may be blocked waiting for us to go online */
619 wake_up(&dev->read_wq);
620
621 VDBG(cdev, "%s disabled\n", dev->function.name);
622}
623
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530624static int adb_bind_config(struct usb_configuration *c)
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500625{
626 struct adb_dev *dev;
627 int ret;
628
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530629 printk(KERN_INFO "adb_bind_config\n");
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500630
631 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
632 if (!dev)
633 return -ENOMEM;
634
635 spin_lock_init(&dev->lock);
636
637 init_waitqueue_head(&dev->read_wq);
638 init_waitqueue_head(&dev->write_wq);
639
640 atomic_set(&dev->open_excl, 0);
641 atomic_set(&dev->read_excl, 0);
642 atomic_set(&dev->write_excl, 0);
643
644 INIT_LIST_HEAD(&dev->rx_idle);
645 INIT_LIST_HEAD(&dev->rx_done);
646 INIT_LIST_HEAD(&dev->tx_idle);
647
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530648 dev->cdev = c->cdev;
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500649 dev->function.name = "adb";
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530650 dev->function.descriptors = fs_adb_descs;
651 dev->function.hs_descriptors = hs_adb_descs;
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500652 dev->function.bind = adb_function_bind;
653 dev->function.unbind = adb_function_unbind;
654 dev->function.set_alt = adb_function_set_alt;
655 dev->function.disable = adb_function_disable;
656
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530657 /* start disabled */
658 dev->function.hidden = 1;
659
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500660 /* _adb_dev must be set before calling usb_gadget_register_driver */
661 _adb_dev = dev;
662
663 ret = misc_register(&adb_device);
664 if (ret)
665 goto err1;
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530666 ret = misc_register(&adb_enable_device);
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500667 if (ret)
668 goto err2;
669
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530670 ret = usb_add_function(c, &dev->function);
671 if (ret)
672 goto err3;
673
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500674 return 0;
675
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530676err3:
677 misc_deregister(&adb_enable_device);
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500678err2:
679 misc_deregister(&adb_device);
680err1:
681 kfree(dev);
682 printk(KERN_ERR "adb gadget driver failed to initialize\n");
683 return ret;
684}
685
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530686static struct android_usb_function adb_function = {
687 .name = "adb",
688 .bind_config = adb_bind_config,
689};
690
691static int __init init(void)
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500692{
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530693 printk(KERN_INFO "f_adb init\n");
694 android_register_function(&adb_function);
695 return 0;
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500696}
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530697module_init(init);