Re: [PATCH]cdc-acm:fix incorrect throtteling, make set_control optional

David Brownell <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
On Thursday 08 February 2007 1:06 am, Oliver Neukum wrote:

> --- a/include/linux/usb/cdc.h	2007-02-06 14:11:50.000000000 +0100
> +++ b/include/linux/usb/cdc.h	2007-02-08 09:50:28.000000000 +0100
> @@ -73,6 +73,13 @@
>  	__u8	bmCapabilities;
>  } __attribute__ ((packed));
>  
> +/* capabilities from 5.2.3.3 */
> +
> +#define ACM_CTRL_CAP_COMM_FTR	0x01
> +#define ACM_CTRL_CAP_LINE	0x02
> +#define ACM_CTRL_CAP_BRK	0x04
> +#define ACM_CTRL_CAP_NOTIFY	0x08

All other #defines in that code use USB_CDC_* prefixes;
could you make this match?

- Dave

> +
>  /* "Union Functional Descriptor" from CDC spec 5.2.3.8 */
>  struct usb_cdc_union_desc {
>  	__u8	bLength;
> --- a/drivers/usb/class/cdc-acm.c	2007-02-06 14:14:48.000000000 +0100
> +++ b/drivers/usb/class/cdc-acm.c	2007-02-06 14:37:44.000000000 +0100
> @@ -326,10 +326,16 @@
>  	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:
> @@ -346,22 +352,20 @@
>  	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);
> @@ -467,7 +471,8 @@
>  		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 & ACM_CTRL_CAP_LINE))
>  		goto full_bailout;
>  
>  	INIT_LIST_HEAD(&acm->spare_read_urbs);
> @@ -480,6 +485,8 @@
>  		list_add(&(acm->rb[i].list), &acm->spare_read_bufs);
>  	}
>  
> +	acm->throttle = 0;
> +
>  	tasklet_schedule(&acm->urb_task);
>  
>  done:
> 

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.