2005-04-16 15:20:36 -07: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 21:28:02 +02:00
/*
2011-03-30 22:57:33 -03:00
* The only reason to have several buffers is to accommodate assumptions
2005-04-21 21:28:02 +02:00
* 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-13 22:50:47 +02:00
* when processing onlcr , so we only need 2 buffers . These values must be
* powers of 2.
2005-04-21 21:28:02 +02:00
*/
2008-03-20 10:01:34 +01:00
# define ACM_NW 16
2006-05-13 22:50:47 +02:00
# define ACM_NR 16
2005-11-01 18:51:34 +01:00
2005-04-21 21:28:02 +02:00
struct acm_wb {
unsigned char * buf ;
dma_addr_t dmah ;
int len ;
int use ;
2008-03-20 10:01:34 +01:00
struct urb * urb ;
struct acm * instance ;
2005-04-21 21:28:02 +02:00
} ;
2005-11-01 18:51:34 +01:00
struct acm_rb {
int size ;
unsigned char * base ;
dma_addr_t dma ;
2011-03-25 11:06:02 +01:00
int index ;
2005-11-01 18:51:34 +01:00
struct acm * instance ;
} ;
2005-04-16 15:20:36 -07: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 12:27:50 +01:00
struct tty_port port ; /* our tty port data */
struct urb * ctrlurb ; /* urbs */
2005-11-01 18:51:34 +01:00
u8 * ctrl_buffer ; /* buffers of urbs */
dma_addr_t ctrl_dma ; /* dma handles of buffers */
2007-02-27 15:28:55 +01: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-13 22:50:47 +02:00
struct acm_wb wb [ ACM_NW ] ;
2011-03-25 11:06:02 +01:00
unsigned long read_urbs_free ;
struct urb * read_urbs [ ACM_NR ] ;
struct acm_rb read_buffers [ ACM_NR ] ;
2006-05-13 22:50:47 +02:00
int rx_buflimit ;
2005-11-01 18:51:34 +01:00
int rx_endpoint ;
spinlock_t read_lock ;
2005-04-21 21:28:02 +02:00
int write_used ; /* number of non-empty write buffers */
2008-06-20 11:25:57 +02:00
int transmitting ;
2005-04-21 21:28:02 +02:00
spinlock_t write_lock ;
2007-10-12 17:24:28 +02:00
struct mutex mutex ;
2011-11-30 13:28:14 -08:00
bool disconnected ;
2005-04-16 15:20:36 -07:00
struct usb_cdc_line_coding line ; /* bits, stop, parity */
struct work_struct work ; /* work queue entry for line discipline waking up */
unsigned int ctrlin ; /* input control lines (DCD, DSR, RI, break, overruns) */
unsigned int ctrlout ; /* output control lines (DTR, RTS) */
2013-11-20 11:35:34 +01:00
struct async_icount iocount ; /* counters for control line changes */
struct async_icount oldcount ; /* for comparison of counter */
wait_queue_head_t wioctl ; /* for ioctl */
2005-04-16 15:20:36 -07:00
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 clocal ; /* termios CLOCAL */
unsigned int ctrl_caps ; /* control capabilities from the class specific header */
2007-10-12 17:24:28 +02:00
unsigned int susp_count ; /* number of suspended interfaces */
2010-03-02 14:52:33 -08:00
unsigned int combined_interfaces : 1 ; /* control and data collapsed */
unsigned int is_int_ep : 1 ; /* interrupt endpoints contrary to spec used */
2011-03-25 11:06:02 +01:00
unsigned int throttled : 1 ; /* actually throttled */
unsigned int throttle_req : 1 ; /* throttle requested */
2009-08-04 23:52:09 +02:00
u8 bInterval ;
2014-05-26 19:23:38 +02:00
struct usb_anchor delayed ; /* writes queued for a device about to be woken */
2005-04-16 15:20:36 -07:00
} ;
# define CDC_DATA_INTERFACE_TYPE 0x0a
/* constants describing various quirks and errors */
2014-05-19 13:55:25 +02:00
# define NO_UNION_NORMAL BIT(0)
# define SINGLE_RX_URB BIT(1)
# define NO_CAP_LINE BIT(2)
# define NOT_A_MODEM BIT(3)
# define NO_DATA_INTERFACE BIT(4)
# define IGNORE_DEVICE BIT(5)