cdc-acm.h 3.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 *
 * 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
22
#define ACM_TTY_MINORS		256
L
Linus Torvalds 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

/*
 * 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.
 */

54
/*
L
Lucas De Marchi 已提交
55
 * The only reason to have several buffers is to accommodate assumptions
56 57 58
 * 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
59 60
 * when processing onlcr, so we only need 2 buffers. These values must be
 * powers of 2.
61
 */
62
#define ACM_NW  16
63
#define ACM_NR  16
64

65 66 67 68 69
struct acm_wb {
	unsigned char *buf;
	dma_addr_t dmah;
	int len;
	int use;
70 71
	struct urb		*urb;
	struct acm		*instance;
72 73
};

74 75 76 77
struct acm_rb {
	int			size;
	unsigned char		*base;
	dma_addr_t		dma;
78
	int			index;
79 80 81
	struct acm		*instance;
};

L
Linus Torvalds 已提交
82 83 84 85
struct acm {
	struct usb_device *dev;				/* the corresponding usb device */
	struct usb_interface *control;			/* control interface */
	struct usb_interface *data;			/* data interface */
A
Alan Cox 已提交
86 87
	struct tty_port port;			 	/* our tty port data */
	struct urb *ctrlurb;				/* urbs */
88 89
	u8 *ctrl_buffer;				/* buffers of urbs */
	dma_addr_t ctrl_dma;				/* dma handles of buffers */
90 91 92
	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 */
93
	struct acm_wb wb[ACM_NW];
94 95 96
	unsigned long read_urbs_free;
	struct urb *read_urbs[ACM_NR];
	struct acm_rb read_buffers[ACM_NR];
97
	int rx_buflimit;
98 99
	int rx_endpoint;
	spinlock_t read_lock;
100
	int write_used;					/* number of non-empty write buffers */
101
	int transmitting;
102
	spinlock_t write_lock;
O
Oliver Neukum 已提交
103
	struct mutex mutex;
104
	bool disconnected;
L
Linus Torvalds 已提交
105 106 107 108
	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) */
O
Oliver Neukum 已提交
109 110 111
	struct async_icount iocount;			/* counters for control line changes */
	struct async_icount oldcount;			/* for comparison of counter */
	wait_queue_head_t wioctl;			/* for ioctl */
L
Linus Torvalds 已提交
112 113 114 115 116
	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 */
O
Oliver Neukum 已提交
117
	unsigned int susp_count;			/* number of suspended interfaces */
118 119
	unsigned int combined_interfaces:1;		/* control and data collapsed */
	unsigned int is_int_ep:1;			/* interrupt endpoints contrary to spec used */
120 121
	unsigned int throttled:1;			/* actually throttled */
	unsigned int throttle_req:1;			/* throttle requested */
122
	u8 bInterval;
123
	struct usb_anchor delayed;			/* writes queued for a device about to be woken */
124
	unsigned long quirks;
L
Linus Torvalds 已提交
125 126 127 128 129
};

#define CDC_DATA_INTERFACE_TYPE	0x0a

/* constants describing various quirks and errors */
O
Oliver Neukum 已提交
130 131 132 133 134
#define NO_UNION_NORMAL			BIT(0)
#define SINGLE_RX_URB			BIT(1)
#define NO_CAP_LINE			BIT(2)
#define NO_DATA_INTERFACE		BIT(4)
#define IGNORE_DEVICE			BIT(5)
135
#define QUIRK_CONTROL_LINE_STATE	BIT(6)
136
#define CLEAR_HALT_CONDITIONS		BIT(7)
137
#define SEND_ZERO_PACKET		BIT(8)