From 8d38b2e22a98f5b7ffe4c01a4c531eae94109ab0 Mon Sep 17 00:00:00 2001 From: Oliver Neukum Date: Wed, 25 Jun 2008 14:17:16 +0200 Subject: [PATCH] --- yaml --- r: 104611 b: refs/heads/master c: 830f4021a8d5ce97c6bed267132e5e90fb166192 h: refs/heads/master i: 104609: dc3c05c311b5126f5d8980f17ad6a3c8a266bad0 104607: ca77c0ef3320ed4ba1a0548f1fa3f8cc7ab1e903 v: v3 --- [refs] | 2 +- trunk/drivers/usb/class/cdc-acm.c | 28 +++++++++++++++------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/[refs] b/[refs] index d04ae9a09009..653e348931d0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 62ad296b6ca78bd123864c138814c0a597873693 +refs/heads/master: 830f4021a8d5ce97c6bed267132e5e90fb166192 diff --git a/trunk/drivers/usb/class/cdc-acm.c b/trunk/drivers/usb/class/cdc-acm.c index ba86fec872b4..93b28ee8e8bd 100644 --- a/trunk/drivers/usb/class/cdc-acm.c +++ b/trunk/drivers/usb/class/cdc-acm.c @@ -838,7 +838,7 @@ static void acm_tty_set_termios(struct tty_struct *tty, struct ktermios *termios * USB probe and disconnect routines. */ -/* Little helper: write buffers free */ +/* Little helpers: write/read buffers free */ static void acm_write_buffers_free(struct acm *acm) { int i; @@ -849,6 +849,15 @@ static void acm_write_buffers_free(struct acm *acm) } } +static void acm_read_buffers_free(struct acm *acm) +{ + struct usb_device *usb_dev = interface_to_usbdev(acm->control); + int i, n = acm->rx_buflimit; + + for (i = 0; i < n; i++) + usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma); +} + /* Little helper: write buffers allocate */ static int acm_write_buffers_alloc(struct acm *acm) { @@ -1171,8 +1180,7 @@ static int acm_probe (struct usb_interface *intf, for (i = 0; i < ACM_NW; i++) usb_free_urb(acm->wb[i].urb); alloc_fail7: - for (i = 0; i < num_rx_buf; i++) - usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma); + acm_read_buffers_free(acm); for (i = 0; i < num_rx_buf; i++) usb_free_urb(acm->ru[i].urb); usb_free_urb(acm->ctrlurb); @@ -1209,15 +1217,9 @@ static void acm_disconnect(struct usb_interface *intf) { struct acm *acm = usb_get_intfdata(intf); struct usb_device *usb_dev = interface_to_usbdev(intf); - int i; - - if (!acm || !acm->dev) { - dbg("disconnect on nonexisting interface"); - return; - } mutex_lock(&open_mutex); - if (!usb_get_intfdata(intf)) { + if (!acm || !acm->dev) { mutex_unlock(&open_mutex); return; } @@ -1236,10 +1238,10 @@ static void acm_disconnect(struct usb_interface *intf) acm_write_buffers_free(acm); usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); - for (i = 0; i < acm->rx_buflimit; i++) - usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma); + acm_read_buffers_free(acm); - usb_driver_release_interface(&acm_driver, intf == acm->control ? acm->data : intf); + usb_driver_release_interface(&acm_driver, intf == acm->control ? + acm->data : acm->control); if (!acm->used) { acm_tty_unregister(acm);