diff options
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r-- | drivers/usb/gadget/Kconfig | 10 | ||||
-rw-r--r-- | drivers/usb/gadget/amd5536udc.c | 1 | ||||
-rw-r--r-- | drivers/usb/gadget/dummy_hcd.c | 5 | ||||
-rw-r--r-- | drivers/usb/gadget/f_acm.c | 196 | ||||
-rw-r--r-- | drivers/usb/gadget/f_ecm.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/f_rndis.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/f_serial.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/f_subset.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/gadget_chips.h | 6 | ||||
-rw-r--r-- | drivers/usb/gadget/omap_udc.c | 5 | ||||
-rw-r--r-- | drivers/usb/gadget/pxa27x_udc.c | 2 | ||||
-rw-r--r-- | drivers/usb/gadget/s3c2410_udc.c | 1 | ||||
-rw-r--r-- | drivers/usb/gadget/u_serial.c | 290 | ||||
-rw-r--r-- | drivers/usb/gadget/u_serial.h | 12 |
14 files changed, 403 insertions, 133 deletions
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index c6a8c6b1116a..acc95b2ac6f8 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -284,6 +284,16 @@ config USB_LH7A40X | |||
284 | default USB_GADGET | 284 | default USB_GADGET |
285 | select USB_GADGET_SELECTED | 285 | select USB_GADGET_SELECTED |
286 | 286 | ||
287 | # built in ../musb along with host support | ||
288 | config USB_GADGET_MUSB_HDRC | ||
289 | boolean "Inventra HDRC USB Peripheral (TI, ...)" | ||
290 | depends on USB_MUSB_HDRC && (USB_MUSB_PERIPHERAL || USB_MUSB_OTG) | ||
291 | select USB_GADGET_DUALSPEED | ||
292 | select USB_GADGET_SELECTED | ||
293 | help | ||
294 | This OTG-capable silicon IP is used in dual designs including | ||
295 | the TI DaVinci, OMAP 243x, OMAP 343x, and TUSB 6010. | ||
296 | |||
287 | config USB_GADGET_OMAP | 297 | config USB_GADGET_OMAP |
288 | boolean "OMAP USB Device Controller" | 298 | boolean "OMAP USB Device Controller" |
289 | depends on ARCH_OMAP | 299 | depends on ARCH_OMAP |
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 1500e1b3c302..abf8192f89e8 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c | |||
@@ -44,7 +44,6 @@ | |||
44 | #include <linux/module.h> | 44 | #include <linux/module.h> |
45 | #include <linux/pci.h> | 45 | #include <linux/pci.h> |
46 | #include <linux/kernel.h> | 46 | #include <linux/kernel.h> |
47 | #include <linux/version.h> | ||
48 | #include <linux/delay.h> | 47 | #include <linux/delay.h> |
49 | #include <linux/ioport.h> | 48 | #include <linux/ioport.h> |
50 | #include <linux/sched.h> | 49 | #include <linux/sched.h> |
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 21d1406af9ee..7600a0c78753 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
@@ -542,13 +542,14 @@ dummy_queue (struct usb_ep *_ep, struct usb_request *_req, | |||
542 | req->req.context = dum; | 542 | req->req.context = dum; |
543 | req->req.complete = fifo_complete; | 543 | req->req.complete = fifo_complete; |
544 | 544 | ||
545 | list_add_tail(&req->queue, &ep->queue); | ||
545 | spin_unlock (&dum->lock); | 546 | spin_unlock (&dum->lock); |
546 | _req->actual = _req->length; | 547 | _req->actual = _req->length; |
547 | _req->status = 0; | 548 | _req->status = 0; |
548 | _req->complete (_ep, _req); | 549 | _req->complete (_ep, _req); |
549 | spin_lock (&dum->lock); | 550 | spin_lock (&dum->lock); |
550 | } | 551 | } else |
551 | list_add_tail (&req->queue, &ep->queue); | 552 | list_add_tail(&req->queue, &ep->queue); |
552 | spin_unlock_irqrestore (&dum->lock, flags); | 553 | spin_unlock_irqrestore (&dum->lock, flags); |
553 | 554 | ||
554 | /* real hardware would likely enable transfers here, in case | 555 | /* real hardware would likely enable transfers here, in case |
diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c index d8faccf27895..5ee1590b8e9c 100644 --- a/drivers/usb/gadget/f_acm.c +++ b/drivers/usb/gadget/f_acm.c | |||
@@ -47,18 +47,37 @@ struct f_acm { | |||
47 | u8 ctrl_id, data_id; | 47 | u8 ctrl_id, data_id; |
48 | u8 port_num; | 48 | u8 port_num; |
49 | 49 | ||
50 | struct usb_descriptor_header **fs_function; | 50 | u8 pending; |
51 | |||
52 | /* lock is mostly for pending and notify_req ... they get accessed | ||
53 | * by callbacks both from tty (open/close/break) under its spinlock, | ||
54 | * and notify_req.complete() which can't use that lock. | ||
55 | */ | ||
56 | spinlock_t lock; | ||
57 | |||
51 | struct acm_ep_descs fs; | 58 | struct acm_ep_descs fs; |
52 | struct usb_descriptor_header **hs_function; | ||
53 | struct acm_ep_descs hs; | 59 | struct acm_ep_descs hs; |
54 | 60 | ||
55 | struct usb_ep *notify; | 61 | struct usb_ep *notify; |
56 | struct usb_endpoint_descriptor *notify_desc; | 62 | struct usb_endpoint_descriptor *notify_desc; |
63 | struct usb_request *notify_req; | ||
57 | 64 | ||
58 | struct usb_cdc_line_coding port_line_coding; /* 8-N-1 etc */ | 65 | struct usb_cdc_line_coding port_line_coding; /* 8-N-1 etc */ |
66 | |||
67 | /* SetControlLineState request -- CDC 1.1 section 6.2.14 (INPUT) */ | ||
59 | u16 port_handshake_bits; | 68 | u16 port_handshake_bits; |
60 | #define RS232_RTS (1 << 1) /* unused with full duplex */ | 69 | #define ACM_CTRL_RTS (1 << 1) /* unused with full duplex */ |
61 | #define RS232_DTR (1 << 0) /* host is ready for data r/w */ | 70 | #define ACM_CTRL_DTR (1 << 0) /* host is ready for data r/w */ |
71 | |||
72 | /* SerialState notification -- CDC 1.1 section 6.3.5 (OUTPUT) */ | ||
73 | u16 serial_state; | ||
74 | #define ACM_CTRL_OVERRUN (1 << 6) | ||
75 | #define ACM_CTRL_PARITY (1 << 5) | ||
76 | #define ACM_CTRL_FRAMING (1 << 4) | ||
77 | #define ACM_CTRL_RI (1 << 3) | ||
78 | #define ACM_CTRL_BRK (1 << 2) | ||
79 | #define ACM_CTRL_DSR (1 << 1) | ||
80 | #define ACM_CTRL_DCD (1 << 0) | ||
62 | }; | 81 | }; |
63 | 82 | ||
64 | static inline struct f_acm *func_to_acm(struct usb_function *f) | 83 | static inline struct f_acm *func_to_acm(struct usb_function *f) |
@@ -66,12 +85,17 @@ static inline struct f_acm *func_to_acm(struct usb_function *f) | |||
66 | return container_of(f, struct f_acm, port.func); | 85 | return container_of(f, struct f_acm, port.func); |
67 | } | 86 | } |
68 | 87 | ||
88 | static inline struct f_acm *port_to_acm(struct gserial *p) | ||
89 | { | ||
90 | return container_of(p, struct f_acm, port); | ||
91 | } | ||
92 | |||
69 | /*-------------------------------------------------------------------------*/ | 93 | /*-------------------------------------------------------------------------*/ |
70 | 94 | ||
71 | /* notification endpoint uses smallish and infrequent fixed-size messages */ | 95 | /* notification endpoint uses smallish and infrequent fixed-size messages */ |
72 | 96 | ||
73 | #define GS_LOG2_NOTIFY_INTERVAL 5 /* 1 << 5 == 32 msec */ | 97 | #define GS_LOG2_NOTIFY_INTERVAL 5 /* 1 << 5 == 32 msec */ |
74 | #define GS_NOTIFY_MAXPACKET 8 | 98 | #define GS_NOTIFY_MAXPACKET 10 /* notification + 2 bytes */ |
75 | 99 | ||
76 | /* interface and class descriptors: */ | 100 | /* interface and class descriptors: */ |
77 | 101 | ||
@@ -117,7 +141,7 @@ static struct usb_cdc_acm_descriptor acm_descriptor __initdata = { | |||
117 | .bLength = sizeof(acm_descriptor), | 141 | .bLength = sizeof(acm_descriptor), |
118 | .bDescriptorType = USB_DT_CS_INTERFACE, | 142 | .bDescriptorType = USB_DT_CS_INTERFACE, |
119 | .bDescriptorSubType = USB_CDC_ACM_TYPE, | 143 | .bDescriptorSubType = USB_CDC_ACM_TYPE, |
120 | .bmCapabilities = (1 << 1), | 144 | .bmCapabilities = USB_CDC_CAP_LINE, |
121 | }; | 145 | }; |
122 | 146 | ||
123 | static struct usb_cdc_union_desc acm_union_desc __initdata = { | 147 | static struct usb_cdc_union_desc acm_union_desc __initdata = { |
@@ -277,6 +301,11 @@ static int acm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) | |||
277 | 301 | ||
278 | /* composite driver infrastructure handles everything except | 302 | /* composite driver infrastructure handles everything except |
279 | * CDC class messages; interface activation uses set_alt(). | 303 | * CDC class messages; interface activation uses set_alt(). |
304 | * | ||
305 | * Note CDC spec table 4 lists the ACM request profile. It requires | ||
306 | * encapsulated command support ... we don't handle any, and respond | ||
307 | * to them by stalling. Options include get/set/clear comm features | ||
308 | * (not that useful) and SEND_BREAK. | ||
280 | */ | 309 | */ |
281 | switch ((ctrl->bRequestType << 8) | ctrl->bRequest) { | 310 | switch ((ctrl->bRequestType << 8) | ctrl->bRequest) { |
282 | 311 | ||
@@ -312,7 +341,7 @@ static int acm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) | |||
312 | value = 0; | 341 | value = 0; |
313 | 342 | ||
314 | /* FIXME we should not allow data to flow until the | 343 | /* FIXME we should not allow data to flow until the |
315 | * host sets the RS232_DTR bit; and when it clears | 344 | * host sets the ACM_CTRL_DTR bit; and when it clears |
316 | * that bit, we should return to that no-flow state. | 345 | * that bit, we should return to that no-flow state. |
317 | */ | 346 | */ |
318 | acm->port_handshake_bits = w_value; | 347 | acm->port_handshake_bits = w_value; |
@@ -350,9 +379,6 @@ static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
350 | /* we know alt == 0, so this is an activation or a reset */ | 379 | /* we know alt == 0, so this is an activation or a reset */ |
351 | 380 | ||
352 | if (intf == acm->ctrl_id) { | 381 | if (intf == acm->ctrl_id) { |
353 | /* REVISIT this may need more work when we start to | ||
354 | * send notifications ... | ||
355 | */ | ||
356 | if (acm->notify->driver_data) { | 382 | if (acm->notify->driver_data) { |
357 | VDBG(cdev, "reset acm control interface %d\n", intf); | 383 | VDBG(cdev, "reset acm control interface %d\n", intf); |
358 | usb_ep_disable(acm->notify); | 384 | usb_ep_disable(acm->notify); |
@@ -397,6 +423,128 @@ static void acm_disable(struct usb_function *f) | |||
397 | 423 | ||
398 | /*-------------------------------------------------------------------------*/ | 424 | /*-------------------------------------------------------------------------*/ |
399 | 425 | ||
426 | /** | ||
427 | * acm_cdc_notify - issue CDC notification to host | ||
428 | * @acm: wraps host to be notified | ||
429 | * @type: notification type | ||
430 | * @value: Refer to cdc specs, wValue field. | ||
431 | * @data: data to be sent | ||
432 | * @length: size of data | ||
433 | * Context: irqs blocked, acm->lock held, acm_notify_req non-null | ||
434 | * | ||
435 | * Returns zero on sucess or a negative errno. | ||
436 | * | ||
437 | * See section 6.3.5 of the CDC 1.1 specification for information | ||
438 | * about the only notification we issue: SerialState change. | ||
439 | */ | ||
440 | static int acm_cdc_notify(struct f_acm *acm, u8 type, u16 value, | ||
441 | void *data, unsigned length) | ||
442 | { | ||
443 | struct usb_ep *ep = acm->notify; | ||
444 | struct usb_request *req; | ||
445 | struct usb_cdc_notification *notify; | ||
446 | const unsigned len = sizeof(*notify) + length; | ||
447 | void *buf; | ||
448 | int status; | ||
449 | |||
450 | req = acm->notify_req; | ||
451 | acm->notify_req = NULL; | ||
452 | acm->pending = false; | ||
453 | |||
454 | req->length = len; | ||
455 | notify = req->buf; | ||
456 | buf = notify + 1; | ||
457 | |||
458 | notify->bmRequestType = USB_DIR_IN | USB_TYPE_CLASS | ||
459 | | USB_RECIP_INTERFACE; | ||
460 | notify->bNotificationType = type; | ||
461 | notify->wValue = cpu_to_le16(value); | ||
462 | notify->wIndex = cpu_to_le16(acm->ctrl_id); | ||
463 | notify->wLength = cpu_to_le16(length); | ||
464 | memcpy(buf, data, length); | ||
465 | |||
466 | status = usb_ep_queue(ep, req, GFP_ATOMIC); | ||
467 | if (status < 0) { | ||
468 | ERROR(acm->port.func.config->cdev, | ||
469 | "acm ttyGS%d can't notify serial state, %d\n", | ||
470 | acm->port_num, status); | ||
471 | acm->notify_req = req; | ||
472 | } | ||
473 | |||
474 | return status; | ||
475 | } | ||
476 | |||
477 | static int acm_notify_serial_state(struct f_acm *acm) | ||
478 | { | ||
479 | struct usb_composite_dev *cdev = acm->port.func.config->cdev; | ||
480 | int status; | ||
481 | |||
482 | spin_lock(&acm->lock); | ||
483 | if (acm->notify_req) { | ||
484 | DBG(cdev, "acm ttyGS%d serial state %04x\n", | ||
485 | acm->port_num, acm->serial_state); | ||
486 | status = acm_cdc_notify(acm, USB_CDC_NOTIFY_SERIAL_STATE, | ||
487 | 0, &acm->serial_state, sizeof(acm->serial_state)); | ||
488 | } else { | ||
489 | acm->pending = true; | ||
490 | status = 0; | ||
491 | } | ||
492 | spin_unlock(&acm->lock); | ||
493 | return status; | ||
494 | } | ||
495 | |||
496 | static void acm_cdc_notify_complete(struct usb_ep *ep, struct usb_request *req) | ||
497 | { | ||
498 | struct f_acm *acm = req->context; | ||
499 | u8 doit = false; | ||
500 | |||
501 | /* on this call path we do NOT hold the port spinlock, | ||
502 | * which is why ACM needs its own spinlock | ||
503 | */ | ||
504 | spin_lock(&acm->lock); | ||
505 | if (req->status != -ESHUTDOWN) | ||
506 | doit = acm->pending; | ||
507 | acm->notify_req = req; | ||
508 | spin_unlock(&acm->lock); | ||
509 | |||
510 | if (doit) | ||
511 | acm_notify_serial_state(acm); | ||
512 | } | ||
513 | |||
514 | /* connect == the TTY link is open */ | ||
515 | |||
516 | static void acm_connect(struct gserial *port) | ||
517 | { | ||
518 | struct f_acm *acm = port_to_acm(port); | ||
519 | |||
520 | acm->serial_state |= ACM_CTRL_DSR | ACM_CTRL_DCD; | ||
521 | acm_notify_serial_state(acm); | ||
522 | } | ||
523 | |||
524 | static void acm_disconnect(struct gserial *port) | ||
525 | { | ||
526 | struct f_acm *acm = port_to_acm(port); | ||
527 | |||
528 | acm->serial_state &= ~(ACM_CTRL_DSR | ACM_CTRL_DCD); | ||
529 | acm_notify_serial_state(acm); | ||
530 | } | ||
531 | |||
532 | static int acm_send_break(struct gserial *port, int duration) | ||
533 | { | ||
534 | struct f_acm *acm = port_to_acm(port); | ||
535 | u16 state; | ||
536 | |||
537 | state = acm->serial_state; | ||
538 | state &= ~ACM_CTRL_BRK; | ||
539 | if (duration) | ||
540 | state |= ACM_CTRL_BRK; | ||
541 | |||
542 | acm->serial_state = state; | ||
543 | return acm_notify_serial_state(acm); | ||
544 | } | ||
545 | |||
546 | /*-------------------------------------------------------------------------*/ | ||
547 | |||
400 | /* ACM function driver setup/binding */ | 548 | /* ACM function driver setup/binding */ |
401 | static int __init | 549 | static int __init |
402 | acm_bind(struct usb_configuration *c, struct usb_function *f) | 550 | acm_bind(struct usb_configuration *c, struct usb_function *f) |
@@ -445,8 +593,20 @@ acm_bind(struct usb_configuration *c, struct usb_function *f) | |||
445 | acm->notify = ep; | 593 | acm->notify = ep; |
446 | ep->driver_data = cdev; /* claim */ | 594 | ep->driver_data = cdev; /* claim */ |
447 | 595 | ||
596 | /* allocate notification */ | ||
597 | acm->notify_req = gs_alloc_req(ep, | ||
598 | sizeof(struct usb_cdc_notification) + 2, | ||
599 | GFP_KERNEL); | ||
600 | if (!acm->notify_req) | ||
601 | goto fail; | ||
602 | |||
603 | acm->notify_req->complete = acm_cdc_notify_complete; | ||
604 | acm->notify_req->context = acm; | ||
605 | |||
448 | /* copy descriptors, and track endpoint copies */ | 606 | /* copy descriptors, and track endpoint copies */ |
449 | f->descriptors = usb_copy_descriptors(acm_fs_function); | 607 | f->descriptors = usb_copy_descriptors(acm_fs_function); |
608 | if (!f->descriptors) | ||
609 | goto fail; | ||
450 | 610 | ||
451 | acm->fs.in = usb_find_endpoint(acm_fs_function, | 611 | acm->fs.in = usb_find_endpoint(acm_fs_function, |
452 | f->descriptors, &acm_fs_in_desc); | 612 | f->descriptors, &acm_fs_in_desc); |
@@ -478,8 +638,6 @@ acm_bind(struct usb_configuration *c, struct usb_function *f) | |||
478 | f->hs_descriptors, &acm_hs_notify_desc); | 638 | f->hs_descriptors, &acm_hs_notify_desc); |
479 | } | 639 | } |
480 | 640 | ||
481 | /* FIXME provide a callback for triggering notifications */ | ||
482 | |||
483 | DBG(cdev, "acm ttyGS%d: %s speed IN/%s OUT/%s NOTIFY/%s\n", | 641 | DBG(cdev, "acm ttyGS%d: %s speed IN/%s OUT/%s NOTIFY/%s\n", |
484 | acm->port_num, | 642 | acm->port_num, |
485 | gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full", | 643 | gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full", |
@@ -488,6 +646,9 @@ acm_bind(struct usb_configuration *c, struct usb_function *f) | |||
488 | return 0; | 646 | return 0; |
489 | 647 | ||
490 | fail: | 648 | fail: |
649 | if (acm->notify_req) | ||
650 | gs_free_req(acm->notify, acm->notify_req); | ||
651 | |||
491 | /* we might as well release our claims on endpoints */ | 652 | /* we might as well release our claims on endpoints */ |
492 | if (acm->notify) | 653 | if (acm->notify) |
493 | acm->notify->driver_data = NULL; | 654 | acm->notify->driver_data = NULL; |
@@ -504,10 +665,13 @@ fail: | |||
504 | static void | 665 | static void |
505 | acm_unbind(struct usb_configuration *c, struct usb_function *f) | 666 | acm_unbind(struct usb_configuration *c, struct usb_function *f) |
506 | { | 667 | { |
668 | struct f_acm *acm = func_to_acm(f); | ||
669 | |||
507 | if (gadget_is_dualspeed(c->cdev->gadget)) | 670 | if (gadget_is_dualspeed(c->cdev->gadget)) |
508 | usb_free_descriptors(f->hs_descriptors); | 671 | usb_free_descriptors(f->hs_descriptors); |
509 | usb_free_descriptors(f->descriptors); | 672 | usb_free_descriptors(f->descriptors); |
510 | kfree(func_to_acm(f)); | 673 | gs_free_req(acm->notify, acm->notify_req); |
674 | kfree(acm); | ||
511 | } | 675 | } |
512 | 676 | ||
513 | /* Some controllers can't support CDC ACM ... */ | 677 | /* Some controllers can't support CDC ACM ... */ |
@@ -571,8 +735,14 @@ int __init acm_bind_config(struct usb_configuration *c, u8 port_num) | |||
571 | if (!acm) | 735 | if (!acm) |
572 | return -ENOMEM; | 736 | return -ENOMEM; |
573 | 737 | ||
738 | spin_lock_init(&acm->lock); | ||
739 | |||
574 | acm->port_num = port_num; | 740 | acm->port_num = port_num; |
575 | 741 | ||
742 | acm->port.connect = acm_connect; | ||
743 | acm->port.disconnect = acm_disconnect; | ||
744 | acm->port.send_break = acm_send_break; | ||
745 | |||
576 | acm->port.func.name = "acm"; | 746 | acm->port.func.name = "acm"; |
577 | acm->port.func.strings = acm_strings; | 747 | acm->port.func.strings = acm_strings; |
578 | /* descriptors are per-instance copies */ | 748 | /* descriptors are per-instance copies */ |
diff --git a/drivers/usb/gadget/f_ecm.c b/drivers/usb/gadget/f_ecm.c index 0822e9d7693a..a2b5c092bda0 100644 --- a/drivers/usb/gadget/f_ecm.c +++ b/drivers/usb/gadget/f_ecm.c | |||
@@ -63,9 +63,7 @@ struct f_ecm { | |||
63 | 63 | ||
64 | char ethaddr[14]; | 64 | char ethaddr[14]; |
65 | 65 | ||
66 | struct usb_descriptor_header **fs_function; | ||
67 | struct ecm_ep_descs fs; | 66 | struct ecm_ep_descs fs; |
68 | struct usb_descriptor_header **hs_function; | ||
69 | struct ecm_ep_descs hs; | 67 | struct ecm_ep_descs hs; |
70 | 68 | ||
71 | struct usb_ep *notify; | 69 | struct usb_ep *notify; |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 61652f0f13fd..659b3d9671c4 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
@@ -85,9 +85,7 @@ struct f_rndis { | |||
85 | u8 ethaddr[ETH_ALEN]; | 85 | u8 ethaddr[ETH_ALEN]; |
86 | int config; | 86 | int config; |
87 | 87 | ||
88 | struct usb_descriptor_header **fs_function; | ||
89 | struct rndis_ep_descs fs; | 88 | struct rndis_ep_descs fs; |
90 | struct usb_descriptor_header **hs_function; | ||
91 | struct rndis_ep_descs hs; | 89 | struct rndis_ep_descs hs; |
92 | 90 | ||
93 | struct usb_ep *notify; | 91 | struct usb_ep *notify; |
diff --git a/drivers/usb/gadget/f_serial.c b/drivers/usb/gadget/f_serial.c index 1b6bde9aaed5..fe5674db344b 100644 --- a/drivers/usb/gadget/f_serial.c +++ b/drivers/usb/gadget/f_serial.c | |||
@@ -36,9 +36,7 @@ struct f_gser { | |||
36 | u8 data_id; | 36 | u8 data_id; |
37 | u8 port_num; | 37 | u8 port_num; |
38 | 38 | ||
39 | struct usb_descriptor_header **fs_function; | ||
40 | struct gser_descs fs; | 39 | struct gser_descs fs; |
41 | struct usb_descriptor_header **hs_function; | ||
42 | struct gser_descs hs; | 40 | struct gser_descs hs; |
43 | }; | 41 | }; |
44 | 42 | ||
diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c index afeab9a0523f..acb8d233aa1d 100644 --- a/drivers/usb/gadget/f_subset.c +++ b/drivers/usb/gadget/f_subset.c | |||
@@ -66,9 +66,7 @@ struct f_gether { | |||
66 | 66 | ||
67 | char ethaddr[14]; | 67 | char ethaddr[14]; |
68 | 68 | ||
69 | struct usb_descriptor_header **fs_function; | ||
70 | struct geth_descs fs; | 69 | struct geth_descs fs; |
71 | struct usb_descriptor_header **hs_function; | ||
72 | struct geth_descs hs; | 70 | struct geth_descs hs; |
73 | }; | 71 | }; |
74 | 72 | ||
diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h index 5246e8fef2b2..17d9905101b7 100644 --- a/drivers/usb/gadget/gadget_chips.h +++ b/drivers/usb/gadget/gadget_chips.h | |||
@@ -11,6 +11,10 @@ | |||
11 | * Some are available on 2.4 kernels; several are available, but not | 11 | * Some are available on 2.4 kernels; several are available, but not |
12 | * yet pushed in the 2.6 mainline tree. | 12 | * yet pushed in the 2.6 mainline tree. |
13 | */ | 13 | */ |
14 | |||
15 | #ifndef __GADGET_CHIPS_H | ||
16 | #define __GADGET_CHIPS_H | ||
17 | |||
14 | #ifdef CONFIG_USB_GADGET_NET2280 | 18 | #ifdef CONFIG_USB_GADGET_NET2280 |
15 | #define gadget_is_net2280(g) !strcmp("net2280", (g)->name) | 19 | #define gadget_is_net2280(g) !strcmp("net2280", (g)->name) |
16 | #else | 20 | #else |
@@ -237,3 +241,5 @@ static inline bool gadget_supports_altsettings(struct usb_gadget *gadget) | |||
237 | /* Everything else is *presumably* fine ... */ | 241 | /* Everything else is *presumably* fine ... */ |
238 | return true; | 242 | return true; |
239 | } | 243 | } |
244 | |||
245 | #endif /* __GADGET_CHIPS_H */ | ||
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index 376e80c07530..574c53831a05 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c | |||
@@ -54,6 +54,7 @@ | |||
54 | 54 | ||
55 | #include <mach/dma.h> | 55 | #include <mach/dma.h> |
56 | #include <mach/usb.h> | 56 | #include <mach/usb.h> |
57 | #include <mach/control.h> | ||
57 | 58 | ||
58 | #include "omap_udc.h" | 59 | #include "omap_udc.h" |
59 | 60 | ||
@@ -2310,10 +2311,10 @@ static int proc_otg_show(struct seq_file *s) | |||
2310 | u32 trans; | 2311 | u32 trans; |
2311 | char *ctrl_name; | 2312 | char *ctrl_name; |
2312 | 2313 | ||
2313 | tmp = OTG_REV_REG; | 2314 | tmp = omap_readl(OTG_REV); |
2314 | if (cpu_is_omap24xx()) { | 2315 | if (cpu_is_omap24xx()) { |
2315 | ctrl_name = "control_devconf"; | 2316 | ctrl_name = "control_devconf"; |
2316 | trans = CONTROL_DEVCONF_REG; | 2317 | trans = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); |
2317 | } else { | 2318 | } else { |
2318 | ctrl_name = "tranceiver_ctrl"; | 2319 | ctrl_name = "tranceiver_ctrl"; |
2319 | trans = omap_readw(USB_TRANSCEIVER_CTRL); | 2320 | trans = omap_readw(USB_TRANSCEIVER_CTRL); |
diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c index a28513ecbe5b..7cbc78a6853d 100644 --- a/drivers/usb/gadget/pxa27x_udc.c +++ b/drivers/usb/gadget/pxa27x_udc.c | |||
@@ -1622,7 +1622,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) | |||
1622 | struct pxa_udc *udc = the_controller; | 1622 | struct pxa_udc *udc = the_controller; |
1623 | int retval; | 1623 | int retval; |
1624 | 1624 | ||
1625 | if (!driver || driver->speed != USB_SPEED_FULL || !driver->bind | 1625 | if (!driver || driver->speed < USB_SPEED_FULL || !driver->bind |
1626 | || !driver->disconnect || !driver->setup) | 1626 | || !driver->disconnect || !driver->setup) |
1627 | return -EINVAL; | 1627 | return -EINVAL; |
1628 | if (!udc) | 1628 | if (!udc) |
diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index 538807384592..29d13ebe7500 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include <linux/list.h> | 35 | #include <linux/list.h> |
36 | #include <linux/interrupt.h> | 36 | #include <linux/interrupt.h> |
37 | #include <linux/platform_device.h> | 37 | #include <linux/platform_device.h> |
38 | #include <linux/version.h> | ||
39 | #include <linux/clk.h> | 38 | #include <linux/clk.h> |
40 | 39 | ||
41 | #include <linux/debugfs.h> | 40 | #include <linux/debugfs.h> |
diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c index abf9505d3a75..53d59287f2bc 100644 --- a/drivers/usb/gadget/u_serial.c +++ b/drivers/usb/gadget/u_serial.c | |||
@@ -52,13 +52,16 @@ | |||
52 | * is managed in userspace ... OBEX, PTP, and MTP have been mentioned. | 52 | * is managed in userspace ... OBEX, PTP, and MTP have been mentioned. |
53 | */ | 53 | */ |
54 | 54 | ||
55 | #define PREFIX "ttyGS" | ||
56 | |||
55 | /* | 57 | /* |
56 | * gserial is the lifecycle interface, used by USB functions | 58 | * gserial is the lifecycle interface, used by USB functions |
57 | * gs_port is the I/O nexus, used by the tty driver | 59 | * gs_port is the I/O nexus, used by the tty driver |
58 | * tty_struct links to the tty/filesystem framework | 60 | * tty_struct links to the tty/filesystem framework |
59 | * | 61 | * |
60 | * gserial <---> gs_port ... links will be null when the USB link is | 62 | * gserial <---> gs_port ... links will be null when the USB link is |
61 | * inactive; managed by gserial_{connect,disconnect}(). | 63 | * inactive; managed by gserial_{connect,disconnect}(). each gserial |
64 | * instance can wrap its own USB control protocol. | ||
62 | * gserial->ioport == usb_ep->driver_data ... gs_port | 65 | * gserial->ioport == usb_ep->driver_data ... gs_port |
63 | * gs_port->port_usb ... gserial | 66 | * gs_port->port_usb ... gserial |
64 | * | 67 | * |
@@ -100,6 +103,8 @@ struct gs_port { | |||
100 | wait_queue_head_t close_wait; /* wait for last close */ | 103 | wait_queue_head_t close_wait; /* wait for last close */ |
101 | 104 | ||
102 | struct list_head read_pool; | 105 | struct list_head read_pool; |
106 | struct list_head read_queue; | ||
107 | unsigned n_read; | ||
103 | struct tasklet_struct push; | 108 | struct tasklet_struct push; |
104 | 109 | ||
105 | struct list_head write_pool; | 110 | struct list_head write_pool; |
@@ -177,7 +182,7 @@ static void gs_buf_clear(struct gs_buf *gb) | |||
177 | /* | 182 | /* |
178 | * gs_buf_data_avail | 183 | * gs_buf_data_avail |
179 | * | 184 | * |
180 | * Return the number of bytes of data available in the circular | 185 | * Return the number of bytes of data written into the circular |
181 | * buffer. | 186 | * buffer. |
182 | */ | 187 | */ |
183 | static unsigned gs_buf_data_avail(struct gs_buf *gb) | 188 | static unsigned gs_buf_data_avail(struct gs_buf *gb) |
@@ -278,7 +283,7 @@ gs_buf_get(struct gs_buf *gb, char *buf, unsigned count) | |||
278 | * Allocate a usb_request and its buffer. Returns a pointer to the | 283 | * Allocate a usb_request and its buffer. Returns a pointer to the |
279 | * usb_request or NULL if there is an error. | 284 | * usb_request or NULL if there is an error. |
280 | */ | 285 | */ |
281 | static struct usb_request * | 286 | struct usb_request * |
282 | gs_alloc_req(struct usb_ep *ep, unsigned len, gfp_t kmalloc_flags) | 287 | gs_alloc_req(struct usb_ep *ep, unsigned len, gfp_t kmalloc_flags) |
283 | { | 288 | { |
284 | struct usb_request *req; | 289 | struct usb_request *req; |
@@ -302,7 +307,7 @@ gs_alloc_req(struct usb_ep *ep, unsigned len, gfp_t kmalloc_flags) | |||
302 | * | 307 | * |
303 | * Free a usb_request and its buffer. | 308 | * Free a usb_request and its buffer. |
304 | */ | 309 | */ |
305 | static void gs_free_req(struct usb_ep *ep, struct usb_request *req) | 310 | void gs_free_req(struct usb_ep *ep, struct usb_request *req) |
306 | { | 311 | { |
307 | kfree(req->buf); | 312 | kfree(req->buf); |
308 | usb_ep_free_request(ep, req); | 313 | usb_ep_free_request(ep, req); |
@@ -367,11 +372,9 @@ __acquires(&port->port_lock) | |||
367 | req->length = len; | 372 | req->length = len; |
368 | list_del(&req->list); | 373 | list_del(&req->list); |
369 | 374 | ||
370 | #ifdef VERBOSE_DEBUG | 375 | pr_vdebug(PREFIX "%d: tx len=%d, 0x%02x 0x%02x 0x%02x ...\n", |
371 | pr_debug("%s: %s, len=%d, 0x%02x 0x%02x 0x%02x ...\n", | 376 | port->port_num, len, *((u8 *)req->buf), |
372 | __func__, in->name, len, *((u8 *)req->buf), | ||
373 | *((u8 *)req->buf+1), *((u8 *)req->buf+2)); | 377 | *((u8 *)req->buf+1), *((u8 *)req->buf+2)); |
374 | #endif | ||
375 | 378 | ||
376 | /* Drop lock while we call out of driver; completions | 379 | /* Drop lock while we call out of driver; completions |
377 | * could be issued while we do so. Disconnection may | 380 | * could be issued while we do so. Disconnection may |
@@ -401,56 +404,6 @@ __acquires(&port->port_lock) | |||
401 | return status; | 404 | return status; |
402 | } | 405 | } |
403 | 406 | ||
404 | static void gs_rx_push(unsigned long _port) | ||
405 | { | ||
406 | struct gs_port *port = (void *)_port; | ||
407 | struct tty_struct *tty = port->port_tty; | ||
408 | |||
409 | /* With low_latency, tty_flip_buffer_push() doesn't put its | ||
410 | * real work through a workqueue, so the ldisc has a better | ||
411 | * chance to keep up with peak USB data rates. | ||
412 | */ | ||
413 | if (tty) { | ||
414 | tty_flip_buffer_push(tty); | ||
415 | wake_up_interruptible(&tty->read_wait); | ||
416 | } | ||
417 | } | ||
418 | |||
419 | /* | ||
420 | * gs_recv_packet | ||
421 | * | ||
422 | * Called for each USB packet received. Reads the packet | ||
423 | * header and stuffs the data in the appropriate tty buffer. | ||
424 | * Returns 0 if successful, or a negative error number. | ||
425 | * | ||
426 | * Called during USB completion routine, on interrupt time. | ||
427 | * With port_lock. | ||
428 | */ | ||
429 | static int gs_recv_packet(struct gs_port *port, char *packet, unsigned size) | ||
430 | { | ||
431 | unsigned len; | ||
432 | struct tty_struct *tty; | ||
433 | |||
434 | /* I/O completions can continue for a while after close(), until the | ||
435 | * request queue empties. Just discard any data we receive, until | ||
436 | * something reopens this TTY ... as if there were no HW flow control. | ||
437 | */ | ||
438 | tty = port->port_tty; | ||
439 | if (tty == NULL) { | ||
440 | pr_vdebug("%s: ttyGS%d, after close\n", | ||
441 | __func__, port->port_num); | ||
442 | return -EIO; | ||
443 | } | ||
444 | |||
445 | len = tty_insert_flip_string(tty, packet, size); | ||
446 | if (len > 0) | ||
447 | tasklet_schedule(&port->push); | ||
448 | if (len < size) | ||
449 | pr_debug("%s: ttyGS%d, drop %d bytes\n", | ||
450 | __func__, port->port_num, size - len); | ||
451 | return 0; | ||
452 | } | ||
453 | |||
454 | /* | 407 | /* |
455 | * Context: caller owns port_lock, and port_usb is set | 408 | * Context: caller owns port_lock, and port_usb is set |
456 | */ | 409 | */ |
@@ -469,9 +422,9 @@ __acquires(&port->port_lock) | |||
469 | int status; | 422 | int status; |
470 | struct tty_struct *tty; | 423 | struct tty_struct *tty; |
471 | 424 | ||
472 | /* no more rx if closed or throttled */ | 425 | /* no more rx if closed */ |
473 | tty = port->port_tty; | 426 | tty = port->port_tty; |
474 | if (!tty || test_bit(TTY_THROTTLED, &tty->flags)) | 427 | if (!tty) |
475 | break; | 428 | break; |
476 | 429 | ||
477 | req = list_entry(pool->next, struct usb_request, list); | 430 | req = list_entry(pool->next, struct usb_request, list); |
@@ -500,36 +453,134 @@ __acquires(&port->port_lock) | |||
500 | return started; | 453 | return started; |
501 | } | 454 | } |
502 | 455 | ||
503 | static void gs_read_complete(struct usb_ep *ep, struct usb_request *req) | 456 | /* |
457 | * RX tasklet takes data out of the RX queue and hands it up to the TTY | ||
458 | * layer until it refuses to take any more data (or is throttled back). | ||
459 | * Then it issues reads for any further data. | ||
460 | * | ||
461 | * If the RX queue becomes full enough that no usb_request is queued, | ||
462 | * the OUT endpoint may begin NAKing as soon as its FIFO fills up. | ||
463 | * So QUEUE_SIZE packets plus however many the FIFO holds (usually two) | ||
464 | * can be buffered before the TTY layer's buffers (currently 64 KB). | ||
465 | */ | ||
466 | static void gs_rx_push(unsigned long _port) | ||
504 | { | 467 | { |
505 | int status; | 468 | struct gs_port *port = (void *)_port; |
506 | struct gs_port *port = ep->driver_data; | 469 | struct tty_struct *tty; |
470 | struct list_head *queue = &port->read_queue; | ||
471 | bool disconnect = false; | ||
472 | bool do_push = false; | ||
507 | 473 | ||
508 | spin_lock(&port->port_lock); | 474 | /* hand any queued data to the tty */ |
509 | list_add(&req->list, &port->read_pool); | 475 | spin_lock_irq(&port->port_lock); |
476 | tty = port->port_tty; | ||
477 | while (!list_empty(queue)) { | ||
478 | struct usb_request *req; | ||
510 | 479 | ||
511 | switch (req->status) { | 480 | req = list_first_entry(queue, struct usb_request, list); |
512 | case 0: | ||
513 | /* normal completion */ | ||
514 | status = gs_recv_packet(port, req->buf, req->actual); | ||
515 | if (status && status != -EIO) | ||
516 | pr_debug("%s: %s %s err %d\n", | ||
517 | __func__, "recv", ep->name, status); | ||
518 | gs_start_rx(port); | ||
519 | break; | ||
520 | 481 | ||
521 | case -ESHUTDOWN: | 482 | /* discard data if tty was closed */ |
522 | /* disconnect */ | 483 | if (!tty) |
523 | pr_vdebug("%s: %s shutdown\n", __func__, ep->name); | 484 | goto recycle; |
524 | break; | ||
525 | 485 | ||
526 | default: | 486 | /* leave data queued if tty was rx throttled */ |
527 | /* presumably a transient fault */ | 487 | if (test_bit(TTY_THROTTLED, &tty->flags)) |
528 | pr_warning("%s: unexpected %s status %d\n", | 488 | break; |
529 | __func__, ep->name, req->status); | 489 | |
530 | gs_start_rx(port); | 490 | switch (req->status) { |
531 | break; | 491 | case -ESHUTDOWN: |
492 | disconnect = true; | ||
493 | pr_vdebug(PREFIX "%d: shutdown\n", port->port_num); | ||
494 | break; | ||
495 | |||
496 | default: | ||
497 | /* presumably a transient fault */ | ||
498 | pr_warning(PREFIX "%d: unexpected RX status %d\n", | ||
499 | port->port_num, req->status); | ||
500 | /* FALLTHROUGH */ | ||
501 | case 0: | ||
502 | /* normal completion */ | ||
503 | break; | ||
504 | } | ||
505 | |||
506 | /* push data to (open) tty */ | ||
507 | if (req->actual) { | ||
508 | char *packet = req->buf; | ||
509 | unsigned size = req->actual; | ||
510 | unsigned n; | ||
511 | int count; | ||
512 | |||
513 | /* we may have pushed part of this packet already... */ | ||
514 | n = port->n_read; | ||
515 | if (n) { | ||
516 | packet += n; | ||
517 | size -= n; | ||
518 | } | ||
519 | |||
520 | count = tty_insert_flip_string(tty, packet, size); | ||
521 | if (count) | ||
522 | do_push = true; | ||
523 | if (count != size) { | ||
524 | /* stop pushing; TTY layer can't handle more */ | ||
525 | port->n_read += count; | ||
526 | pr_vdebug(PREFIX "%d: rx block %d/%d\n", | ||
527 | port->port_num, | ||
528 | count, req->actual); | ||
529 | break; | ||
530 | } | ||
531 | port->n_read = 0; | ||
532 | } | ||
533 | recycle: | ||
534 | list_move(&req->list, &port->read_pool); | ||
532 | } | 535 | } |
536 | |||
537 | /* Push from tty to ldisc; this is immediate with low_latency, and | ||
538 | * may trigger callbacks to this driver ... so drop the spinlock. | ||
539 | */ | ||
540 | if (tty && do_push) { | ||
541 | spin_unlock_irq(&port->port_lock); | ||
542 | tty_flip_buffer_push(tty); | ||
543 | wake_up_interruptible(&tty->read_wait); | ||
544 | spin_lock_irq(&port->port_lock); | ||
545 | |||
546 | /* tty may have been closed */ | ||
547 | tty = port->port_tty; | ||
548 | } | ||
549 | |||
550 | |||
551 | /* We want our data queue to become empty ASAP, keeping data | ||
552 | * in the tty and ldisc (not here). If we couldn't push any | ||
553 | * this time around, there may be trouble unless there's an | ||
554 | * implicit tty_unthrottle() call on its way... | ||
555 | * | ||
556 | * REVISIT we should probably add a timer to keep the tasklet | ||
557 | * from starving ... but it's not clear that case ever happens. | ||
558 | */ | ||
559 | if (!list_empty(queue) && tty) { | ||
560 | if (!test_bit(TTY_THROTTLED, &tty->flags)) { | ||
561 | if (do_push) | ||
562 | tasklet_schedule(&port->push); | ||
563 | else | ||
564 | pr_warning(PREFIX "%d: RX not scheduled?\n", | ||
565 | port->port_num); | ||
566 | } | ||
567 | } | ||
568 | |||
569 | /* If we're still connected, refill the USB RX queue. */ | ||
570 | if (!disconnect && port->port_usb) | ||
571 | gs_start_rx(port); | ||
572 | |||
573 | spin_unlock_irq(&port->port_lock); | ||
574 | } | ||
575 | |||
576 | static void gs_read_complete(struct usb_ep *ep, struct usb_request *req) | ||
577 | { | ||
578 | struct gs_port *port = ep->driver_data; | ||
579 | |||
580 | /* Queue all received data until the tty layer is ready for it. */ | ||
581 | spin_lock(&port->port_lock); | ||
582 | list_add_tail(&req->list, &port->read_queue); | ||
583 | tasklet_schedule(&port->push); | ||
533 | spin_unlock(&port->port_lock); | 584 | spin_unlock(&port->port_lock); |
534 | } | 585 | } |
535 | 586 | ||
@@ -625,6 +676,7 @@ static int gs_start_io(struct gs_port *port) | |||
625 | } | 676 | } |
626 | 677 | ||
627 | /* queue read requests */ | 678 | /* queue read requests */ |
679 | port->n_read = 0; | ||
628 | started = gs_start_rx(port); | 680 | started = gs_start_rx(port); |
629 | 681 | ||
630 | /* unblock any pending writes into our circular buffer */ | 682 | /* unblock any pending writes into our circular buffer */ |
@@ -633,9 +685,10 @@ static int gs_start_io(struct gs_port *port) | |||
633 | } else { | 685 | } else { |
634 | gs_free_requests(ep, head); | 686 | gs_free_requests(ep, head); |
635 | gs_free_requests(port->port_usb->in, &port->write_pool); | 687 | gs_free_requests(port->port_usb->in, &port->write_pool); |
688 | status = -EIO; | ||
636 | } | 689 | } |
637 | 690 | ||
638 | return started ? 0 : status; | 691 | return status; |
639 | } | 692 | } |
640 | 693 | ||
641 | /*-------------------------------------------------------------------------*/ | 694 | /*-------------------------------------------------------------------------*/ |
@@ -736,10 +789,13 @@ static int gs_open(struct tty_struct *tty, struct file *file) | |||
736 | 789 | ||
737 | /* if connected, start the I/O stream */ | 790 | /* if connected, start the I/O stream */ |
738 | if (port->port_usb) { | 791 | if (port->port_usb) { |
792 | struct gserial *gser = port->port_usb; | ||
793 | |||
739 | pr_debug("gs_open: start ttyGS%d\n", port->port_num); | 794 | pr_debug("gs_open: start ttyGS%d\n", port->port_num); |
740 | gs_start_io(port); | 795 | gs_start_io(port); |
741 | 796 | ||
742 | /* REVISIT for ACM, issue "network connected" event */ | 797 | if (gser->connect) |
798 | gser->connect(gser); | ||
743 | } | 799 | } |
744 | 800 | ||
745 | pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file); | 801 | pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file); |
@@ -766,6 +822,7 @@ static int gs_writes_finished(struct gs_port *p) | |||
766 | static void gs_close(struct tty_struct *tty, struct file *file) | 822 | static void gs_close(struct tty_struct *tty, struct file *file) |
767 | { | 823 | { |
768 | struct gs_port *port = tty->driver_data; | 824 | struct gs_port *port = tty->driver_data; |
825 | struct gserial *gser; | ||
769 | 826 | ||
770 | spin_lock_irq(&port->port_lock); | 827 | spin_lock_irq(&port->port_lock); |
771 | 828 | ||
@@ -785,32 +842,31 @@ static void gs_close(struct tty_struct *tty, struct file *file) | |||
785 | port->openclose = true; | 842 | port->openclose = true; |
786 | port->open_count = 0; | 843 | port->open_count = 0; |
787 | 844 | ||
788 | if (port->port_usb) | 845 | gser = port->port_usb; |
789 | /* REVISIT for ACM, issue "network disconnected" event */; | 846 | if (gser && gser->disconnect) |
847 | gser->disconnect(gser); | ||
790 | 848 | ||
791 | /* wait for circular write buffer to drain, disconnect, or at | 849 | /* wait for circular write buffer to drain, disconnect, or at |
792 | * most GS_CLOSE_TIMEOUT seconds; then discard the rest | 850 | * most GS_CLOSE_TIMEOUT seconds; then discard the rest |
793 | */ | 851 | */ |
794 | if (gs_buf_data_avail(&port->port_write_buf) > 0 | 852 | if (gs_buf_data_avail(&port->port_write_buf) > 0 && gser) { |
795 | && port->port_usb) { | ||
796 | spin_unlock_irq(&port->port_lock); | 853 | spin_unlock_irq(&port->port_lock); |
797 | wait_event_interruptible_timeout(port->drain_wait, | 854 | wait_event_interruptible_timeout(port->drain_wait, |
798 | gs_writes_finished(port), | 855 | gs_writes_finished(port), |
799 | GS_CLOSE_TIMEOUT * HZ); | 856 | GS_CLOSE_TIMEOUT * HZ); |
800 | spin_lock_irq(&port->port_lock); | 857 | spin_lock_irq(&port->port_lock); |
858 | gser = port->port_usb; | ||
801 | } | 859 | } |
802 | 860 | ||
803 | /* Iff we're disconnected, there can be no I/O in flight so it's | 861 | /* Iff we're disconnected, there can be no I/O in flight so it's |
804 | * ok to free the circular buffer; else just scrub it. And don't | 862 | * ok to free the circular buffer; else just scrub it. And don't |
805 | * let the push tasklet fire again until we're re-opened. | 863 | * let the push tasklet fire again until we're re-opened. |
806 | */ | 864 | */ |
807 | if (port->port_usb == NULL) | 865 | if (gser == NULL) |
808 | gs_buf_free(&port->port_write_buf); | 866 | gs_buf_free(&port->port_write_buf); |
809 | else | 867 | else |
810 | gs_buf_clear(&port->port_write_buf); | 868 | gs_buf_clear(&port->port_write_buf); |
811 | 869 | ||
812 | tasklet_kill(&port->push); | ||
813 | |||
814 | tty->driver_data = NULL; | 870 | tty->driver_data = NULL; |
815 | port->port_tty = NULL; | 871 | port->port_tty = NULL; |
816 | 872 | ||
@@ -911,15 +967,35 @@ static void gs_unthrottle(struct tty_struct *tty) | |||
911 | { | 967 | { |
912 | struct gs_port *port = tty->driver_data; | 968 | struct gs_port *port = tty->driver_data; |
913 | unsigned long flags; | 969 | unsigned long flags; |
914 | unsigned started = 0; | ||
915 | 970 | ||
916 | spin_lock_irqsave(&port->port_lock, flags); | 971 | spin_lock_irqsave(&port->port_lock, flags); |
917 | if (port->port_usb) | 972 | if (port->port_usb) { |
918 | started = gs_start_rx(port); | 973 | /* Kickstart read queue processing. We don't do xon/xoff, |
974 | * rts/cts, or other handshaking with the host, but if the | ||
975 | * read queue backs up enough we'll be NAKing OUT packets. | ||
976 | */ | ||
977 | tasklet_schedule(&port->push); | ||
978 | pr_vdebug(PREFIX "%d: unthrottle\n", port->port_num); | ||
979 | } | ||
919 | spin_unlock_irqrestore(&port->port_lock, flags); | 980 | spin_unlock_irqrestore(&port->port_lock, flags); |
981 | } | ||
982 | |||
983 | static int gs_break_ctl(struct tty_struct *tty, int duration) | ||
984 | { | ||
985 | struct gs_port *port = tty->driver_data; | ||
986 | int status = 0; | ||
987 | struct gserial *gser; | ||
988 | |||
989 | pr_vdebug("gs_break_ctl: ttyGS%d, send break (%d) \n", | ||
990 | port->port_num, duration); | ||
920 | 991 | ||
921 | pr_vdebug("gs_unthrottle: ttyGS%d, %d packets\n", | 992 | spin_lock_irq(&port->port_lock); |
922 | port->port_num, started); | 993 | gser = port->port_usb; |
994 | if (gser && gser->send_break) | ||
995 | status = gser->send_break(gser, duration); | ||
996 | spin_unlock_irq(&port->port_lock); | ||
997 | |||
998 | return status; | ||
923 | } | 999 | } |
924 | 1000 | ||
925 | static const struct tty_operations gs_tty_ops = { | 1001 | static const struct tty_operations gs_tty_ops = { |
@@ -931,6 +1007,7 @@ static const struct tty_operations gs_tty_ops = { | |||
931 | .write_room = gs_write_room, | 1007 | .write_room = gs_write_room, |
932 | .chars_in_buffer = gs_chars_in_buffer, | 1008 | .chars_in_buffer = gs_chars_in_buffer, |
933 | .unthrottle = gs_unthrottle, | 1009 | .unthrottle = gs_unthrottle, |
1010 | .break_ctl = gs_break_ctl, | ||
934 | }; | 1011 | }; |
935 | 1012 | ||
936 | /*-------------------------------------------------------------------------*/ | 1013 | /*-------------------------------------------------------------------------*/ |
@@ -953,6 +1030,7 @@ gs_port_alloc(unsigned port_num, struct usb_cdc_line_coding *coding) | |||
953 | tasklet_init(&port->push, gs_rx_push, (unsigned long) port); | 1030 | tasklet_init(&port->push, gs_rx_push, (unsigned long) port); |
954 | 1031 | ||
955 | INIT_LIST_HEAD(&port->read_pool); | 1032 | INIT_LIST_HEAD(&port->read_pool); |
1033 | INIT_LIST_HEAD(&port->read_queue); | ||
956 | INIT_LIST_HEAD(&port->write_pool); | 1034 | INIT_LIST_HEAD(&port->write_pool); |
957 | 1035 | ||
958 | port->port_num = port_num; | 1036 | port->port_num = port_num; |
@@ -997,7 +1075,7 @@ int __init gserial_setup(struct usb_gadget *g, unsigned count) | |||
997 | 1075 | ||
998 | gs_tty_driver->owner = THIS_MODULE; | 1076 | gs_tty_driver->owner = THIS_MODULE; |
999 | gs_tty_driver->driver_name = "g_serial"; | 1077 | gs_tty_driver->driver_name = "g_serial"; |
1000 | gs_tty_driver->name = "ttyGS"; | 1078 | gs_tty_driver->name = PREFIX; |
1001 | /* uses dynamically assigned dev_t values */ | 1079 | /* uses dynamically assigned dev_t values */ |
1002 | 1080 | ||
1003 | gs_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; | 1081 | gs_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; |
@@ -1104,6 +1182,8 @@ void gserial_cleanup(void) | |||
1104 | ports[i].port = NULL; | 1182 | ports[i].port = NULL; |
1105 | mutex_unlock(&ports[i].lock); | 1183 | mutex_unlock(&ports[i].lock); |
1106 | 1184 | ||
1185 | tasklet_kill(&port->push); | ||
1186 | |||
1107 | /* wait for old opens to finish */ | 1187 | /* wait for old opens to finish */ |
1108 | wait_event(port->close_wait, gs_closed(port)); | 1188 | wait_event(port->close_wait, gs_closed(port)); |
1109 | 1189 | ||
@@ -1175,14 +1255,17 @@ int gserial_connect(struct gserial *gser, u8 port_num) | |||
1175 | 1255 | ||
1176 | /* REVISIT if waiting on "carrier detect", signal. */ | 1256 | /* REVISIT if waiting on "carrier detect", signal. */ |
1177 | 1257 | ||
1178 | /* REVISIT for ACM, issue "network connection" status notification: | 1258 | /* if it's already open, start I/O ... and notify the serial |
1179 | * connected if open_count, else disconnected. | 1259 | * protocol about open/close status (connect/disconnect). |
1180 | */ | 1260 | */ |
1181 | |||
1182 | /* if it's already open, start I/O */ | ||
1183 | if (port->open_count) { | 1261 | if (port->open_count) { |
1184 | pr_debug("gserial_connect: start ttyGS%d\n", port->port_num); | 1262 | pr_debug("gserial_connect: start ttyGS%d\n", port->port_num); |
1185 | gs_start_io(port); | 1263 | gs_start_io(port); |
1264 | if (gser->connect) | ||
1265 | gser->connect(gser); | ||
1266 | } else { | ||
1267 | if (gser->disconnect) | ||
1268 | gser->disconnect(gser); | ||
1186 | } | 1269 | } |
1187 | 1270 | ||
1188 | spin_unlock_irqrestore(&port->port_lock, flags); | 1271 | spin_unlock_irqrestore(&port->port_lock, flags); |
@@ -1241,6 +1324,7 @@ void gserial_disconnect(struct gserial *gser) | |||
1241 | if (port->open_count == 0 && !port->openclose) | 1324 | if (port->open_count == 0 && !port->openclose) |
1242 | gs_buf_free(&port->port_write_buf); | 1325 | gs_buf_free(&port->port_write_buf); |
1243 | gs_free_requests(gser->out, &port->read_pool); | 1326 | gs_free_requests(gser->out, &port->read_pool); |
1327 | gs_free_requests(gser->out, &port->read_queue); | ||
1244 | gs_free_requests(gser->in, &port->write_pool); | 1328 | gs_free_requests(gser->in, &port->write_pool); |
1245 | spin_unlock_irqrestore(&port->port_lock, flags); | 1329 | spin_unlock_irqrestore(&port->port_lock, flags); |
1246 | } | 1330 | } |
diff --git a/drivers/usb/gadget/u_serial.h b/drivers/usb/gadget/u_serial.h index 7b561138f90e..af3910d01aea 100644 --- a/drivers/usb/gadget/u_serial.h +++ b/drivers/usb/gadget/u_serial.h | |||
@@ -23,8 +23,7 @@ | |||
23 | * style I/O using the USB peripheral endpoints listed here, including | 23 | * style I/O using the USB peripheral endpoints listed here, including |
24 | * hookups to sysfs and /dev for each logical "tty" device. | 24 | * hookups to sysfs and /dev for each logical "tty" device. |
25 | * | 25 | * |
26 | * REVISIT need TTY --> USB event flow too, so ACM can report open/close | 26 | * REVISIT at least ACM could support tiocmget() if needed. |
27 | * as carrier detect events. Model after ECM. There's more ACM state too. | ||
28 | * | 27 | * |
29 | * REVISIT someday, allow multiplexing several TTYs over these endpoints. | 28 | * REVISIT someday, allow multiplexing several TTYs over these endpoints. |
30 | */ | 29 | */ |
@@ -41,8 +40,17 @@ struct gserial { | |||
41 | 40 | ||
42 | /* REVISIT avoid this CDC-ACM support harder ... */ | 41 | /* REVISIT avoid this CDC-ACM support harder ... */ |
43 | struct usb_cdc_line_coding port_line_coding; /* 9600-8-N-1 etc */ | 42 | struct usb_cdc_line_coding port_line_coding; /* 9600-8-N-1 etc */ |
43 | |||
44 | /* notification callbacks */ | ||
45 | void (*connect)(struct gserial *p); | ||
46 | void (*disconnect)(struct gserial *p); | ||
47 | int (*send_break)(struct gserial *p, int duration); | ||
44 | }; | 48 | }; |
45 | 49 | ||
50 | /* utilities to allocate/free request and buffer */ | ||
51 | struct usb_request *gs_alloc_req(struct usb_ep *ep, unsigned len, gfp_t flags); | ||
52 | void gs_free_req(struct usb_ep *, struct usb_request *req); | ||
53 | |||
46 | /* port setup/teardown is handled by gadget driver */ | 54 | /* port setup/teardown is handled by gadget driver */ |
47 | int gserial_setup(struct usb_gadget *g, unsigned n_ports); | 55 | int gserial_setup(struct usb_gadget *g, unsigned n_ports); |
48 | void gserial_cleanup(void); | 56 | void gserial_cleanup(void); |