| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * | 
 | 3 |  * Includes for cdc-acm.c | 
 | 4 |  * | 
 | 5 |  * Mainly take from usbnet's cdc-ether part | 
 | 6 |  * | 
 | 7 |  */ | 
 | 8 |  | 
 | 9 | /* | 
 | 10 |  * CMSPAR, some architectures can't have space and mark parity. | 
 | 11 |  */ | 
 | 12 |  | 
 | 13 | #ifndef CMSPAR | 
 | 14 | #define CMSPAR			0 | 
 | 15 | #endif | 
 | 16 |  | 
 | 17 | /* | 
 | 18 |  * Major and minor numbers. | 
 | 19 |  */ | 
 | 20 |  | 
 | 21 | #define ACM_TTY_MAJOR		166 | 
 | 22 | #define ACM_TTY_MINORS		32 | 
 | 23 |  | 
 | 24 | /* | 
 | 25 |  * Requests. | 
 | 26 |  */ | 
 | 27 |  | 
 | 28 | #define USB_RT_ACM		(USB_TYPE_CLASS | USB_RECIP_INTERFACE) | 
 | 29 |  | 
 | 30 | /* | 
 | 31 |  * Output control lines. | 
 | 32 |  */ | 
 | 33 |  | 
 | 34 | #define ACM_CTRL_DTR		0x01 | 
 | 35 | #define ACM_CTRL_RTS		0x02 | 
 | 36 |  | 
 | 37 | /* | 
 | 38 |  * Input control lines and line errors. | 
 | 39 |  */ | 
 | 40 |  | 
 | 41 | #define ACM_CTRL_DCD		0x01 | 
 | 42 | #define ACM_CTRL_DSR		0x02 | 
 | 43 | #define ACM_CTRL_BRK		0x04 | 
 | 44 | #define ACM_CTRL_RI		0x08 | 
 | 45 |  | 
 | 46 | #define ACM_CTRL_FRAMING	0x10 | 
 | 47 | #define ACM_CTRL_PARITY		0x20 | 
 | 48 | #define ACM_CTRL_OVERRUN	0x40 | 
 | 49 |  | 
 | 50 | /* | 
 | 51 |  * Internal driver structures. | 
 | 52 |  */ | 
 | 53 |  | 
| Oliver Neukum | 884b600 | 2005-04-21 21:28:02 +0200 | [diff] [blame] | 54 | /* | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 55 |  * The only reason to have several buffers is to accommodate assumptions | 
| Oliver Neukum | 884b600 | 2005-04-21 21:28:02 +0200 | [diff] [blame] | 56 |  * in line disciplines. They ask for empty space amount, receive our URB size, | 
 | 57 |  * and proceed to issue several 1-character writes, assuming they will fit. | 
 | 58 |  * The very first write takes a complete URB. Fortunately, this only happens | 
| Oliver Neukum | 8647894 | 2006-05-13 22:50:47 +0200 | [diff] [blame] | 59 |  * when processing onlcr, so we only need 2 buffers. These values must be | 
 | 60 |  * powers of 2. | 
| Oliver Neukum | 884b600 | 2005-04-21 21:28:02 +0200 | [diff] [blame] | 61 |  */ | 
| David Engraf | e4cf3aa | 2008-03-20 10:01:34 +0100 | [diff] [blame] | 62 | #define ACM_NW  16 | 
| Oliver Neukum | 8647894 | 2006-05-13 22:50:47 +0200 | [diff] [blame] | 63 | #define ACM_NR  16 | 
| David Kubicek | 61a87ad | 2005-11-01 18:51:34 +0100 | [diff] [blame] | 64 |  | 
| Oliver Neukum | 884b600 | 2005-04-21 21:28:02 +0200 | [diff] [blame] | 65 | struct acm_wb { | 
 | 66 | 	unsigned char *buf; | 
 | 67 | 	dma_addr_t dmah; | 
 | 68 | 	int len; | 
 | 69 | 	int use; | 
| David Engraf | e4cf3aa | 2008-03-20 10:01:34 +0100 | [diff] [blame] | 70 | 	struct urb		*urb; | 
 | 71 | 	struct acm		*instance; | 
| Oliver Neukum | 884b600 | 2005-04-21 21:28:02 +0200 | [diff] [blame] | 72 | }; | 
 | 73 |  | 
| David Kubicek | 61a87ad | 2005-11-01 18:51:34 +0100 | [diff] [blame] | 74 | struct acm_rb { | 
| David Kubicek | 61a87ad | 2005-11-01 18:51:34 +0100 | [diff] [blame] | 75 | 	int			size; | 
 | 76 | 	unsigned char		*base; | 
 | 77 | 	dma_addr_t		dma; | 
| Johan Hovold | 088c64f | 2011-03-25 11:06:02 +0100 | [diff] [blame] | 78 | 	int			index; | 
| David Kubicek | 61a87ad | 2005-11-01 18:51:34 +0100 | [diff] [blame] | 79 | 	struct acm		*instance; | 
 | 80 | }; | 
 | 81 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 82 | struct acm { | 
 | 83 | 	struct usb_device *dev;				/* the corresponding usb device */ | 
 | 84 | 	struct usb_interface *control;			/* control interface */ | 
 | 85 | 	struct usb_interface *data;			/* data interface */ | 
| Alan Cox | 739e028 | 2009-06-11 12:27:50 +0100 | [diff] [blame] | 86 | 	struct tty_port port;			 	/* our tty port data */ | 
 | 87 | 	struct urb *ctrlurb;				/* urbs */ | 
| David Kubicek | 61a87ad | 2005-11-01 18:51:34 +0100 | [diff] [blame] | 88 | 	u8 *ctrl_buffer;				/* buffers of urbs */ | 
 | 89 | 	dma_addr_t ctrl_dma;				/* dma handles of buffers */ | 
| Oliver Neukum | c4cabd2 | 2007-02-27 15:28:55 +0100 | [diff] [blame] | 90 | 	u8 *country_codes;				/* country codes from device */ | 
 | 91 | 	unsigned int country_code_size;			/* size of this buffer */ | 
 | 92 | 	unsigned int country_rel_date;			/* release date of version */ | 
| Oliver Neukum | 8647894 | 2006-05-13 22:50:47 +0200 | [diff] [blame] | 93 | 	struct acm_wb wb[ACM_NW]; | 
| Johan Hovold | 088c64f | 2011-03-25 11:06:02 +0100 | [diff] [blame] | 94 | 	unsigned long read_urbs_free; | 
 | 95 | 	struct urb *read_urbs[ACM_NR]; | 
 | 96 | 	struct acm_rb read_buffers[ACM_NR]; | 
| Oliver Neukum | 8647894 | 2006-05-13 22:50:47 +0200 | [diff] [blame] | 97 | 	int rx_buflimit; | 
| David Kubicek | 61a87ad | 2005-11-01 18:51:34 +0100 | [diff] [blame] | 98 | 	int rx_endpoint; | 
 | 99 | 	spinlock_t read_lock; | 
| Oliver Neukum | 884b600 | 2005-04-21 21:28:02 +0200 | [diff] [blame] | 100 | 	int write_used;					/* number of non-empty write buffers */ | 
| Oliver Neukum | 11ea859 | 2008-06-20 11:25:57 +0200 | [diff] [blame] | 101 | 	int transmitting; | 
| Oliver Neukum | 884b600 | 2005-04-21 21:28:02 +0200 | [diff] [blame] | 102 | 	spinlock_t write_lock; | 
| Oliver Neukum | 1365baf | 2007-10-12 17:24:28 +0200 | [diff] [blame] | 103 | 	struct mutex mutex; | 
| Havard Skinnemoen | 7fb57a0 | 2011-11-30 13:28:14 -0800 | [diff] [blame] | 104 | 	bool disconnected; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 105 | 	struct usb_cdc_line_coding line;		/* bits, stop, parity */ | 
 | 106 | 	struct work_struct work;			/* work queue entry for line discipline waking up */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 107 | 	unsigned int ctrlin;				/* input control lines (DCD, DSR, RI, break, overruns) */ | 
 | 108 | 	unsigned int ctrlout;				/* output control lines (DTR, RTS) */ | 
 | 109 | 	unsigned int writesize;				/* max packet size for the output bulk endpoint */ | 
 | 110 | 	unsigned int readsize,ctrlsize;			/* buffer sizes for freeing */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 111 | 	unsigned int minor;				/* acm minor number */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 112 | 	unsigned char clocal;				/* termios CLOCAL */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 113 | 	unsigned int ctrl_caps;				/* control capabilities from the class specific header */ | 
| Oliver Neukum | 1365baf | 2007-10-12 17:24:28 +0200 | [diff] [blame] | 114 | 	unsigned int susp_count;			/* number of suspended interfaces */ | 
| Randy Dunlap | fa4dc36 | 2010-03-02 14:52:33 -0800 | [diff] [blame] | 115 | 	unsigned int combined_interfaces:1;		/* control and data collapsed */ | 
 | 116 | 	unsigned int is_int_ep:1;			/* interrupt endpoints contrary to spec used */ | 
| Johan Hovold | 088c64f | 2011-03-25 11:06:02 +0100 | [diff] [blame] | 117 | 	unsigned int throttled:1;			/* actually throttled */ | 
 | 118 | 	unsigned int throttle_req:1;			/* throttle requested */ | 
| Oliver Neukum | cf7fdd5 | 2009-08-04 23:52:09 +0200 | [diff] [blame] | 119 | 	u8 bInterval; | 
| Oliver Neukum | 11ea859 | 2008-06-20 11:25:57 +0200 | [diff] [blame] | 120 | 	struct acm_wb *delayed_wb;			/* write queued for a device about to be woken */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 121 | }; | 
 | 122 |  | 
 | 123 | #define CDC_DATA_INTERFACE_TYPE	0x0a | 
 | 124 |  | 
 | 125 | /* constants describing various quirks and errors */ | 
 | 126 | #define NO_UNION_NORMAL			1 | 
| Oliver Neukum | 8647894 | 2006-05-13 22:50:47 +0200 | [diff] [blame] | 127 | #define SINGLE_RX_URB			2 | 
| Oliver Neukum | a2bfb4a | 2009-05-16 21:13:19 +0200 | [diff] [blame] | 128 | #define NO_CAP_LINE			4 | 
| Julian Calaby | ce12664 | 2010-01-05 23:58:20 +1100 | [diff] [blame] | 129 | #define NOT_A_MODEM			8 | 
| Erik Slagter | fd5054c | 2011-05-11 12:06:55 +0200 | [diff] [blame] | 130 | #define NO_DATA_INTERFACE		16 |