xref: /OK3568_Linux_fs/kernel/drivers/usb/class/cdc-acm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Includes for cdc-acm.c
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Mainly take from usbnet's cdc-ether part
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun /*
11*4882a593Smuzhiyun  * CMSPAR, some architectures can't have space and mark parity.
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #ifndef CMSPAR
15*4882a593Smuzhiyun #define CMSPAR			0
16*4882a593Smuzhiyun #endif
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /*
19*4882a593Smuzhiyun  * Major and minor numbers.
20*4882a593Smuzhiyun  */
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define ACM_TTY_MAJOR		166
23*4882a593Smuzhiyun #define ACM_TTY_MINORS		256
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define ACM_MINOR_INVALID	ACM_TTY_MINORS
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun  * Requests.
29*4882a593Smuzhiyun  */
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define USB_RT_ACM		(USB_TYPE_CLASS | USB_RECIP_INTERFACE)
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun  * Output control lines.
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define ACM_CTRL_DTR		0x01
38*4882a593Smuzhiyun #define ACM_CTRL_RTS		0x02
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /*
41*4882a593Smuzhiyun  * Input control lines and line errors.
42*4882a593Smuzhiyun  */
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define ACM_CTRL_DCD		0x01
45*4882a593Smuzhiyun #define ACM_CTRL_DSR		0x02
46*4882a593Smuzhiyun #define ACM_CTRL_BRK		0x04
47*4882a593Smuzhiyun #define ACM_CTRL_RI		0x08
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define ACM_CTRL_FRAMING	0x10
50*4882a593Smuzhiyun #define ACM_CTRL_PARITY		0x20
51*4882a593Smuzhiyun #define ACM_CTRL_OVERRUN	0x40
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /*
54*4882a593Smuzhiyun  * Internal driver structures.
55*4882a593Smuzhiyun  */
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /*
58*4882a593Smuzhiyun  * The only reason to have several buffers is to accommodate assumptions
59*4882a593Smuzhiyun  * in line disciplines. They ask for empty space amount, receive our URB size,
60*4882a593Smuzhiyun  * and proceed to issue several 1-character writes, assuming they will fit.
61*4882a593Smuzhiyun  * The very first write takes a complete URB. Fortunately, this only happens
62*4882a593Smuzhiyun  * when processing onlcr, so we only need 2 buffers. These values must be
63*4882a593Smuzhiyun  * powers of 2.
64*4882a593Smuzhiyun  */
65*4882a593Smuzhiyun #define ACM_NW  16
66*4882a593Smuzhiyun #define ACM_NR  16
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun struct acm_wb {
69*4882a593Smuzhiyun 	u8 *buf;
70*4882a593Smuzhiyun 	dma_addr_t dmah;
71*4882a593Smuzhiyun 	unsigned int len;
72*4882a593Smuzhiyun 	struct urb		*urb;
73*4882a593Smuzhiyun 	struct acm		*instance;
74*4882a593Smuzhiyun 	bool use;
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun struct acm_rb {
78*4882a593Smuzhiyun 	int			size;
79*4882a593Smuzhiyun 	unsigned char		*base;
80*4882a593Smuzhiyun 	dma_addr_t		dma;
81*4882a593Smuzhiyun 	int			index;
82*4882a593Smuzhiyun 	struct acm		*instance;
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun struct acm {
86*4882a593Smuzhiyun 	struct usb_device *dev;				/* the corresponding usb device */
87*4882a593Smuzhiyun 	struct usb_interface *control;			/* control interface */
88*4882a593Smuzhiyun 	struct usb_interface *data;			/* data interface */
89*4882a593Smuzhiyun 	unsigned in, out;				/* i/o pipes */
90*4882a593Smuzhiyun 	struct tty_port port;			 	/* our tty port data */
91*4882a593Smuzhiyun 	struct urb *ctrlurb;				/* urbs */
92*4882a593Smuzhiyun 	u8 *ctrl_buffer;				/* buffers of urbs */
93*4882a593Smuzhiyun 	dma_addr_t ctrl_dma;				/* dma handles of buffers */
94*4882a593Smuzhiyun 	u8 *country_codes;				/* country codes from device */
95*4882a593Smuzhiyun 	unsigned int country_code_size;			/* size of this buffer */
96*4882a593Smuzhiyun 	unsigned int country_rel_date;			/* release date of version */
97*4882a593Smuzhiyun 	struct acm_wb wb[ACM_NW];
98*4882a593Smuzhiyun 	unsigned long read_urbs_free;
99*4882a593Smuzhiyun 	struct urb *read_urbs[ACM_NR];
100*4882a593Smuzhiyun 	struct acm_rb read_buffers[ACM_NR];
101*4882a593Smuzhiyun 	int rx_buflimit;
102*4882a593Smuzhiyun 	spinlock_t read_lock;
103*4882a593Smuzhiyun 	u8 *notification_buffer;			/* to reassemble fragmented notifications */
104*4882a593Smuzhiyun 	unsigned int nb_index;
105*4882a593Smuzhiyun 	unsigned int nb_size;
106*4882a593Smuzhiyun 	int transmitting;
107*4882a593Smuzhiyun 	spinlock_t write_lock;
108*4882a593Smuzhiyun 	struct mutex mutex;
109*4882a593Smuzhiyun 	bool disconnected;
110*4882a593Smuzhiyun 	unsigned long flags;
111*4882a593Smuzhiyun #		define EVENT_TTY_WAKEUP	0
112*4882a593Smuzhiyun #		define EVENT_RX_STALL	1
113*4882a593Smuzhiyun #		define ACM_THROTTLED	2
114*4882a593Smuzhiyun #		define ACM_ERROR_DELAY	3
115*4882a593Smuzhiyun 	unsigned long urbs_in_error_delay;		/* these need to be restarted after a delay */
116*4882a593Smuzhiyun 	struct usb_cdc_line_coding line;		/* bits, stop, parity */
117*4882a593Smuzhiyun 	struct delayed_work dwork;		        /* work queue entry for various purposes */
118*4882a593Smuzhiyun 	unsigned int ctrlin;				/* input control lines (DCD, DSR, RI, break, overruns) */
119*4882a593Smuzhiyun 	unsigned int ctrlout;				/* output control lines (DTR, RTS) */
120*4882a593Smuzhiyun 	struct async_icount iocount;			/* counters for control line changes */
121*4882a593Smuzhiyun 	struct async_icount oldcount;			/* for comparison of counter */
122*4882a593Smuzhiyun 	wait_queue_head_t wioctl;			/* for ioctl */
123*4882a593Smuzhiyun 	unsigned int writesize;				/* max packet size for the output bulk endpoint */
124*4882a593Smuzhiyun 	unsigned int readsize,ctrlsize;			/* buffer sizes for freeing */
125*4882a593Smuzhiyun 	unsigned int minor;				/* acm minor number */
126*4882a593Smuzhiyun 	unsigned char clocal;				/* termios CLOCAL */
127*4882a593Smuzhiyun 	unsigned int ctrl_caps;				/* control capabilities from the class specific header */
128*4882a593Smuzhiyun 	unsigned int susp_count;			/* number of suspended interfaces */
129*4882a593Smuzhiyun 	unsigned int combined_interfaces:1;		/* control and data collapsed */
130*4882a593Smuzhiyun 	u8 bInterval;
131*4882a593Smuzhiyun 	struct usb_anchor delayed;			/* writes queued for a device about to be woken */
132*4882a593Smuzhiyun 	unsigned long quirks;
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun /* constants describing various quirks and errors */
136*4882a593Smuzhiyun #define NO_UNION_NORMAL			BIT(0)
137*4882a593Smuzhiyun #define SINGLE_RX_URB			BIT(1)
138*4882a593Smuzhiyun #define NO_CAP_LINE			BIT(2)
139*4882a593Smuzhiyun #define IGNORE_DEVICE			BIT(3)
140*4882a593Smuzhiyun #define QUIRK_CONTROL_LINE_STATE	BIT(4)
141*4882a593Smuzhiyun #define CLEAR_HALT_CONDITIONS		BIT(5)
142*4882a593Smuzhiyun #define SEND_ZERO_PACKET		BIT(6)
143*4882a593Smuzhiyun #define DISABLE_ECHO			BIT(7)
144