aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/class/cdc-acm.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-04-29 15:16:17 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-04-29 15:16:17 -0400
commit507ffe4f3840ac24890a8123c702cf1b7fe4d33c (patch)
tree1046888f9db00f268a0056d7f6e427e21502f84c /drivers/usb/class/cdc-acm.c
parentfdc719b63ae35d6a2d8a2a2c76eed813294664bf (diff)
parent45efcb2d32d35f6509543e477568842d8467035d (diff)
Merge tag 'tty-3.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty/serial driver update from Greg Kroah-Hartman: "Here's the big tty/serial driver merge request for 3.10-rc1 Once again, Jiri has a number of TTY driver fixes and cleanups, and Peter Hurley came through with a bunch of ldisc fixes that resolve a number of reported issues. There are some other serial driver cleanups as well. All of these have been in the linux-next tree for a while" * tag 'tty-3.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (117 commits) tty/serial/sirf: fix MODULE_DEVICE_TABLE serial: mxs: drop superfluous {get|put}_device serial: mxs: fix buffer overflow ARM: PL011: add support for extended FIFO-size of PL011-r1p5 serial_core.c: add put_device() after device_find_child() tty: Fix unsafe bit ops in tty_throttle_safe/unthrottle_safe serial: sccnxp: Replace pdata.init/exit with regulator API serial: sccnxp: Do not override device name TTY: pty, fix compilation warning TTY: rocket, fix compilation warning TTY: ircomm: fix DTR being raised on hang up TTY: synclinkmp: fix DTR being raised on hang up TTY: synclink_gt: fix DTR being raised on hang up TTY: synclink: fix DTR being raised on hang up serial: 8250_dw: Fix the stub for dw8250_probe_acpi() serial: 8250_dw: Convert to devm_ioremap() serial: 8250_dw: Set port capabilities based on CPR register serial: 8250_dw: Let ACPI code extract the DMA client info serial: 8250_dw: Support clk framework also with ACPI serial: 8250_dw: Enable runtime PM ...
Diffstat (limited to 'drivers/usb/class/cdc-acm.c')
-rw-r--r--drivers/usb/class/cdc-acm.c31
1 files changed, 7 insertions, 24 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 387dc6c8ad25..c77f7ae48f1c 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -292,7 +292,6 @@ static void acm_ctrl_irq(struct urb *urb)
292{ 292{
293 struct acm *acm = urb->context; 293 struct acm *acm = urb->context;
294 struct usb_cdc_notification *dr = urb->transfer_buffer; 294 struct usb_cdc_notification *dr = urb->transfer_buffer;
295 struct tty_struct *tty;
296 unsigned char *data; 295 unsigned char *data;
297 int newctrl; 296 int newctrl;
298 int retval; 297 int retval;
@@ -327,17 +326,12 @@ static void acm_ctrl_irq(struct urb *urb)
327 break; 326 break;
328 327
329 case USB_CDC_NOTIFY_SERIAL_STATE: 328 case USB_CDC_NOTIFY_SERIAL_STATE:
330 tty = tty_port_tty_get(&acm->port);
331 newctrl = get_unaligned_le16(data); 329 newctrl = get_unaligned_le16(data);
332 330
333 if (tty) { 331 if (!acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) {
334 if (!acm->clocal && 332 dev_dbg(&acm->control->dev, "%s - calling hangup\n",
335 (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) { 333 __func__);
336 dev_dbg(&acm->control->dev, 334 tty_port_tty_hangup(&acm->port, false);
337 "%s - calling hangup\n", __func__);
338 tty_hangup(tty);
339 }
340 tty_kref_put(tty);
341 } 335 }
342 336
343 acm->ctrlin = newctrl; 337 acm->ctrlin = newctrl;
@@ -475,15 +469,10 @@ static void acm_write_bulk(struct urb *urb)
475static void acm_softint(struct work_struct *work) 469static void acm_softint(struct work_struct *work)
476{ 470{
477 struct acm *acm = container_of(work, struct acm, work); 471 struct acm *acm = container_of(work, struct acm, work);
478 struct tty_struct *tty;
479 472
480 dev_vdbg(&acm->data->dev, "%s\n", __func__); 473 dev_vdbg(&acm->data->dev, "%s\n", __func__);
481 474
482 tty = tty_port_tty_get(&acm->port); 475 tty_port_tty_wakeup(&acm->port);
483 if (!tty)
484 return;
485 tty_wakeup(tty);
486 tty_kref_put(tty);
487} 476}
488 477
489/* 478/*
@@ -1519,15 +1508,9 @@ err_out:
1519static int acm_reset_resume(struct usb_interface *intf) 1508static int acm_reset_resume(struct usb_interface *intf)
1520{ 1509{
1521 struct acm *acm = usb_get_intfdata(intf); 1510 struct acm *acm = usb_get_intfdata(intf);
1522 struct tty_struct *tty;
1523 1511
1524 if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags)) { 1512 if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags))
1525 tty = tty_port_tty_get(&acm->port); 1513 tty_port_tty_hangup(&acm->port, false);
1526 if (tty) {
1527 tty_hangup(tty);
1528 tty_kref_put(tty);
1529 }
1530 }
1531 1514
1532 return acm_resume(intf); 1515 return acm_resume(intf);
1533} 1516}