2005-04-17 02:20:36 +04:00
/*
*
* Includes for cdc - acm . c
*
* Mainly take from usbnet ' s cdc - ether part
*
*/
/*
* CMSPAR , some architectures can ' t have space and mark parity .
*/
# ifndef CMSPAR
# define CMSPAR 0
# endif
/*
* Major and minor numbers .
*/
# define ACM_TTY_MAJOR 166
# define ACM_TTY_MINORS 32
/*
* Requests .
*/
# define USB_RT_ACM (USB_TYPE_CLASS | USB_RECIP_INTERFACE)
/*
* Output control lines .
*/
# define ACM_CTRL_DTR 0x01
# define ACM_CTRL_RTS 0x02
/*
* Input control lines and line errors .
*/
# define ACM_CTRL_DCD 0x01
# define ACM_CTRL_DSR 0x02
# define ACM_CTRL_BRK 0x04
# define ACM_CTRL_RI 0x08
# define ACM_CTRL_FRAMING 0x10
# define ACM_CTRL_PARITY 0x20
# define ACM_CTRL_OVERRUN 0x40
/*
* Internal driver structures .
*/
2005-04-21 23:28:02 +04:00
/*
* The only reason to have several buffers is to accomodate assumptions
* in line disciplines . They ask for empty space amount , receive our URB size ,
* and proceed to issue several 1 - character writes , assuming they will fit .
* The very first write takes a complete URB . Fortunately , this only happens
2006-05-14 00:50:47 +04:00
* when processing onlcr , so we only need 2 buffers . These values must be
* powers of 2.
2005-04-21 23:28:02 +04:00
*/
2008-03-20 12:01:34 +03:00
# define ACM_NW 16
2006-05-14 00:50:47 +04:00
# define ACM_NR 16
2005-11-01 20:51:34 +03:00
2005-04-21 23:28:02 +04:00
struct acm_wb {
unsigned char * buf ;
dma_addr_t dmah ;
int len ;
int use ;
2008-03-20 12:01:34 +03:00
struct urb * urb ;
struct acm * instance ;
2005-04-21 23:28:02 +04:00
} ;
2005-11-01 20:51:34 +03:00
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 ;
} ;
2005-04-17 02:20:36 +04:00
struct acm {
struct usb_device * dev ; /* the corresponding usb device */
struct usb_interface * control ; /* control interface */
struct usb_interface * data ; /* data interface */
2009-06-11 15:27:50 +04:00
struct tty_port port ; /* our tty port data */
struct urb * ctrlurb ; /* urbs */
2005-11-01 20:51:34 +03:00
u8 * ctrl_buffer ; /* buffers of urbs */
dma_addr_t ctrl_dma ; /* dma handles of buffers */
2007-02-27 17:28:55 +03:00
u8 * country_codes ; /* country codes from device */
unsigned int country_code_size ; /* size of this buffer */
unsigned int country_rel_date ; /* release date of version */
2006-05-14 00:50:47 +04:00
struct acm_wb wb [ ACM_NW ] ;
struct acm_ru ru [ ACM_NR ] ;
struct acm_rb rb [ ACM_NR ] ;
int rx_buflimit ;
2005-11-01 20:51:34 +03:00
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 ;
2005-04-21 23:28:02 +04:00
int write_used ; /* number of non-empty write buffers */
2008-06-20 13:25:57 +04:00
int processing ;
int transmitting ;
2005-04-21 23:28:02 +04:00
spinlock_t write_lock ;
2007-10-12 19:24:28 +04:00
struct mutex mutex ;
2005-04-17 02:20:36 +04:00
struct usb_cdc_line_coding line ; /* bits, stop, parity */
struct work_struct work ; /* work queue entry for line discipline waking up */
2008-06-20 13:25:57 +04:00
struct work_struct waker ;
2008-08-07 05:46:10 +04:00
wait_queue_head_t drain_wait ; /* close processing */
2005-11-01 20:51:34 +03:00
struct tasklet_struct urb_task ; /* rx processing */
2005-04-17 02:20:36 +04:00
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) */
unsigned int writesize ; /* max packet size for the output bulk endpoint */
unsigned int readsize , ctrlsize ; /* buffer sizes for freeing */
unsigned int minor ; /* acm minor number */
unsigned char throttle ; /* throttled by tty layer */
unsigned char clocal ; /* termios CLOCAL */
unsigned int ctrl_caps ; /* control capabilities from the class specific header */
2007-10-12 19:24:28 +04:00
unsigned int susp_count ; /* number of suspended interfaces */
2008-06-20 13:25:57 +04:00
struct acm_wb * delayed_wb ; /* write queued for a device about to be woken */
2005-04-17 02:20:36 +04:00
} ;
# define CDC_DATA_INTERFACE_TYPE 0x0a
/* constants describing various quirks and errors */
# define NO_UNION_NORMAL 1
2006-05-14 00:50:47 +04:00
# define SINGLE_RX_URB 2