diff options
| author | David Kubicek <dave@awk.cz> | 2005-11-01 18:51:34 +0100 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-04 13:48:29 -0800 | 
| commit | 61a87adf2e7b410da8e41799c61c21a7b8c8b001 (patch) | |
| tree | b4d09ce45dadd78cd2b92848a96c508f44d12f88 /drivers/usb/class/cdc-acm.h | |
| parent | 2e1dcc1600c1d83b26479edd076866595bbd3523 (diff) | |
| download | olio-linux-3.10-61a87adf2e7b410da8e41799c61c21a7b8c8b001.tar.xz olio-linux-3.10-61a87adf2e7b410da8e41799c61c21a7b8c8b001.zip  | |
[PATCH] USB: Converting cdc acm to a ring queue
this patch by David converts the sending queue of the CDC ACM driver
to a queue of URBs. This is needed for quicker devices. Please apply.
Signed-Off-By: Oliver Neukum <oliver@neukum.name>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
 drivers/usb/class/cdc-acm.c |  229 ++++++++++++++++++++++++++++++--------------
 drivers/usb/class/cdc-acm.h |   33 +++++-
 2 files changed, 185 insertions(+), 77 deletions(-)
Diffstat (limited to 'drivers/usb/class/cdc-acm.h')
| -rw-r--r-- | drivers/usb/class/cdc-acm.h | 33 | 
1 files changed, 28 insertions, 5 deletions
diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h index 963a5dfd209..fd2aaccdcba 100644 --- a/drivers/usb/class/cdc-acm.h +++ b/drivers/usb/class/cdc-acm.h @@ -59,6 +59,9 @@   * when processing onlcr, so we only need 2 buffers.   */  #define ACM_NWB  2 +#define ACM_NRU  16 +#define ACM_NRB  16 +  struct acm_wb {  	unsigned char *buf;  	dma_addr_t dmah; @@ -66,22 +69,43 @@ struct acm_wb {  	int use;  }; +struct acm_rb { +	struct list_head	list; +	int			size; +	unsigned char		*base; +	dma_addr_t		dma; +}; + +struct acm_ru { +	struct list_head	list; +	struct acm_rb		*buffer; +	struct urb		*urb; +	struct acm		*instance; +}; +  struct acm {  	struct usb_device *dev;				/* the corresponding usb device */  	struct usb_interface *control;			/* control interface */  	struct usb_interface *data;			/* data interface */  	struct tty_struct *tty;				/* the corresponding tty */ -	struct urb *ctrlurb, *readurb, *writeurb;	/* urbs */ -	u8 *ctrl_buffer, *read_buffer;			/* buffers of urbs */ -	dma_addr_t ctrl_dma, read_dma;			/* dma handles of buffers */ +	struct urb *ctrlurb, *writeurb;			/* urbs */ +	u8 *ctrl_buffer;				/* buffers of urbs */ +	dma_addr_t ctrl_dma;				/* dma handles of buffers */  	struct acm_wb wb[ACM_NWB]; +	struct acm_ru ru[ACM_NRU]; +	struct acm_rb rb[ACM_NRB]; +	int rx_endpoint; +	spinlock_t read_lock; +	struct list_head spare_read_urbs; +	struct list_head spare_read_bufs; +	struct list_head filled_read_bufs;  	int write_current;				/* current write buffer */  	int write_used;					/* number of non-empty write buffers */  	int write_ready;				/* write urb is not running */  	spinlock_t write_lock;  	struct usb_cdc_line_coding line;		/* bits, stop, parity */  	struct work_struct work;			/* work queue entry for line discipline waking up */ -	struct tasklet_struct bh;			/* rx processing */ +	struct tasklet_struct urb_task;                 /* rx processing */  	spinlock_t throttle_lock;			/* synchronize throtteling and read callback */  	unsigned int ctrlin;				/* input control lines (DCD, DSR, RI, break, overruns) */  	unsigned int ctrlout;				/* output control lines (DTR, RTS) */ @@ -91,7 +115,6 @@ struct acm {  	unsigned int minor;				/* acm minor number */  	unsigned char throttle;				/* throttled by tty layer */  	unsigned char clocal;				/* termios CLOCAL */ -	unsigned char resubmit_to_unthrottle;		/* throtteling has disabled the read urb */  	unsigned int ctrl_caps;				/* control capabilities from the class specific header */  };  |