Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 48752
b: refs/heads/master
c: ca79b7b
h: refs/heads/master
v: v3
  • Loading branch information
Oliver Neukum authored and Greg Kroah-Hartman committed Feb 16, 2007
1 parent f7d49a8 commit dce116a
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3f141e2aed586c41c2666d49c70c1c1bbb6d6abd
refs/heads/master: ca79b7b4158cbf32625793a1fc1d59ac46d44197
29 changes: 18 additions & 11 deletions trunk/drivers/usb/class/cdc-acm.c
Original file line number Diff line number Diff line change
Expand Up @@ -326,10 +326,16 @@ static void acm_rx_tasklet(unsigned long _acm)
struct tty_struct *tty = acm->tty;
struct acm_ru *rcv;
unsigned long flags;
int i = 0;
unsigned char throttled;
dbg("Entering acm_rx_tasklet");

if (!ACM_READY(acm) || acm->throttle)
if (!ACM_READY(acm))
return;

spin_lock(&acm->throttle_lock);
throttled = acm->throttle;
spin_unlock(&acm->throttle_lock);
if (throttled)
return;

next_buffer:
Expand All @@ -346,22 +352,20 @@ static void acm_rx_tasklet(unsigned long _acm)
dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d", buf, buf->size);

tty_buffer_request_room(tty, buf->size);
if (!acm->throttle)
spin_lock(&acm->throttle_lock);
throttled = acm->throttle;
spin_unlock(&acm->throttle_lock);
if (!throttled)
tty_insert_flip_string(tty, buf->base, buf->size);
tty_flip_buffer_push(tty);

spin_lock(&acm->throttle_lock);
if (acm->throttle) {
dbg("Throtteling noticed");
memmove(buf->base, buf->base + i, buf->size - i);
buf->size -= i;
spin_unlock(&acm->throttle_lock);
if (throttled) {
dbg("Throttling noticed");
spin_lock_irqsave(&acm->read_lock, flags);
list_add(&buf->list, &acm->filled_read_bufs);
spin_unlock_irqrestore(&acm->read_lock, flags);
return;
}
spin_unlock(&acm->throttle_lock);

spin_lock_irqsave(&acm->read_lock, flags);
list_add(&buf->list, &acm->spare_read_bufs);
Expand Down Expand Up @@ -467,7 +471,8 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)
goto bail_out;
}

if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS))
if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS) &&
(acm->ctrl_caps & USB_CDC_CAP_LINE))
goto full_bailout;

INIT_LIST_HEAD(&acm->spare_read_urbs);
Expand All @@ -480,6 +485,8 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp)
list_add(&(acm->rb[i].list), &acm->spare_read_bufs);
}

acm->throttle = 0;

tasklet_schedule(&acm->urb_task);

done:
Expand Down
7 changes: 7 additions & 0 deletions trunk/include/linux/usb/cdc.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,13 @@ struct usb_cdc_acm_descriptor {
__u8 bmCapabilities;
} __attribute__ ((packed));

/* capabilities from 5.2.3.3 */

#define USB_CDC_COMM_FEATURE 0x01
#define USB_CDC_CAP_LINE 0x02
#define USB_CDC_CAP_BRK 0x04
#define USB_CDC_CAP_NOTIFY 0x08

/* "Union Functional Descriptor" from CDC spec 5.2.3.8 */
struct usb_cdc_union_desc {
__u8 bLength;
Expand Down

0 comments on commit dce116a

Please sign in to comment.