1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef __LINUX_USB_SERIAL_H
14#define __LINUX_USB_SERIAL_H
15
16#include <linux/kref.h>
17#include <linux/mutex.h>
18#include <linux/sysrq.h>
19
20#define SERIAL_TTY_MAJOR 188
21#define SERIAL_TTY_MINORS 254
22#define SERIAL_TTY_NO_MINOR 255
23
24
25#define MAX_NUM_PORTS 8
26
27
28#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
29
30enum port_dev_state {
31 PORT_UNREGISTERED,
32 PORT_REGISTERING,
33 PORT_REGISTERED,
34 PORT_UNREGISTERING,
35};
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75struct usb_serial_port {
76 struct usb_serial *serial;
77 struct tty_port port;
78 spinlock_t lock;
79 struct mutex mutex;
80 unsigned char number;
81
82 unsigned char *interrupt_in_buffer;
83 struct urb *interrupt_in_urb;
84 __u8 interrupt_in_endpointAddress;
85
86 unsigned char *interrupt_out_buffer;
87 int interrupt_out_size;
88 struct urb *interrupt_out_urb;
89 __u8 interrupt_out_endpointAddress;
90
91 unsigned char *bulk_in_buffer;
92 int bulk_in_size;
93 struct urb *read_urb;
94 __u8 bulk_in_endpointAddress;
95
96 unsigned char *bulk_out_buffer;
97 int bulk_out_size;
98 struct urb *write_urb;
99 int write_urb_busy;
100 __u8 bulk_out_endpointAddress;
101
102 int tx_bytes_flight;
103 int urbs_in_flight;
104
105 wait_queue_head_t write_wait;
106 struct work_struct work;
107 char throttled;
108 char throttle_req;
109 char console;
110 unsigned long sysrq;
111 struct device dev;
112 enum port_dev_state dev_state;
113};
114#define to_usb_serial_port(d) container_of(d, struct usb_serial_port, dev)
115
116
117static inline void *usb_get_serial_port_data(struct usb_serial_port *port)
118{
119 return dev_get_drvdata(&port->dev);
120}
121
122static inline void usb_set_serial_port_data(struct usb_serial_port *port,
123 void *data)
124{
125 dev_set_drvdata(&port->dev, data);
126}
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145struct usb_serial {
146 struct usb_device *dev;
147 struct usb_serial_driver *type;
148 struct usb_interface *interface;
149 unsigned char disconnected:1;
150 unsigned char suspending:1;
151 unsigned char minor;
152 unsigned char num_ports;
153 unsigned char num_port_pointers;
154 char num_interrupt_in;
155 char num_interrupt_out;
156 char num_bulk_in;
157 char num_bulk_out;
158 struct usb_serial_port *port[MAX_NUM_PORTS];
159 struct kref kref;
160 struct mutex disc_mutex;
161 void *private;
162};
163#define to_usb_serial(d) container_of(d, struct usb_serial, kref)
164
165
166static inline void *usb_get_serial_data(struct usb_serial *serial)
167{
168 return serial->private;
169}
170
171static inline void usb_set_serial_data(struct usb_serial *serial, void *data)
172{
173 serial->private = data;
174}
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216struct usb_serial_driver {
217 const char *description;
218 const struct usb_device_id *id_table;
219 char num_ports;
220
221 struct list_head driver_list;
222 struct device_driver driver;
223 struct usb_driver *usb_driver;
224 struct usb_dynids dynids;
225 int max_in_flight_urbs;
226
227 int (*probe)(struct usb_serial *serial, const struct usb_device_id *id);
228 int (*attach)(struct usb_serial *serial);
229 int (*calc_num_ports) (struct usb_serial *serial);
230
231 void (*disconnect)(struct usb_serial *serial);
232 void (*release)(struct usb_serial *serial);
233
234 int (*port_probe)(struct usb_serial_port *port);
235 int (*port_remove)(struct usb_serial_port *port);
236
237 int (*suspend)(struct usb_serial *serial, pm_message_t message);
238 int (*resume)(struct usb_serial *serial);
239
240
241
242 int (*open)(struct tty_struct *tty,
243 struct usb_serial_port *port, struct file *filp);
244 void (*close)(struct usb_serial_port *port);
245 int (*write)(struct tty_struct *tty, struct usb_serial_port *port,
246 const unsigned char *buf, int count);
247
248 int (*write_room)(struct tty_struct *tty);
249 int (*ioctl)(struct tty_struct *tty, struct file *file,
250 unsigned int cmd, unsigned long arg);
251 void (*set_termios)(struct tty_struct *tty,
252 struct usb_serial_port *port, struct ktermios *old);
253 void (*break_ctl)(struct tty_struct *tty, int break_state);
254 int (*chars_in_buffer)(struct tty_struct *tty);
255 void (*throttle)(struct tty_struct *tty);
256 void (*unthrottle)(struct tty_struct *tty);
257 int (*tiocmget)(struct tty_struct *tty, struct file *file);
258 int (*tiocmset)(struct tty_struct *tty, struct file *file,
259 unsigned int set, unsigned int clear);
260
261
262 void (*dtr_rts)(struct usb_serial_port *port, int on);
263 int (*carrier_raised)(struct usb_serial_port *port);
264
265 void (*read_int_callback)(struct urb *urb);
266 void (*write_int_callback)(struct urb *urb);
267 void (*read_bulk_callback)(struct urb *urb);
268 void (*write_bulk_callback)(struct urb *urb);
269};
270#define to_usb_serial_driver(d) \
271 container_of(d, struct usb_serial_driver, driver)
272
273extern int usb_serial_register(struct usb_serial_driver *driver);
274extern void usb_serial_deregister(struct usb_serial_driver *driver);
275extern void usb_serial_port_softint(struct usb_serial_port *port);
276
277extern int usb_serial_probe(struct usb_interface *iface,
278 const struct usb_device_id *id);
279extern void usb_serial_disconnect(struct usb_interface *iface);
280
281extern int usb_serial_suspend(struct usb_interface *intf, pm_message_t message);
282extern int usb_serial_resume(struct usb_interface *intf);
283
284extern int ezusb_writememory(struct usb_serial *serial, int address,
285 unsigned char *data, int length, __u8 bRequest);
286extern int ezusb_set_reset(struct usb_serial *serial, unsigned char reset_bit);
287
288
289#ifdef CONFIG_USB_SERIAL_CONSOLE
290extern void usb_serial_console_init(int debug, int minor);
291extern void usb_serial_console_exit(void);
292extern void usb_serial_console_disconnect(struct usb_serial *serial);
293#else
294static inline void usb_serial_console_init(int debug, int minor) { }
295static inline void usb_serial_console_exit(void) { }
296static inline void usb_serial_console_disconnect(struct usb_serial *serial) {}
297#endif
298
299
300extern struct usb_serial *usb_serial_get_by_index(unsigned int minor);
301extern void usb_serial_put(struct usb_serial *serial);
302extern int usb_serial_generic_open(struct tty_struct *tty,
303 struct usb_serial_port *port, struct file *filp);
304extern int usb_serial_generic_write(struct tty_struct *tty,
305 struct usb_serial_port *port, const unsigned char *buf, int count);
306extern void usb_serial_generic_close(struct usb_serial_port *port);
307extern int usb_serial_generic_resume(struct usb_serial *serial);
308extern int usb_serial_generic_write_room(struct tty_struct *tty);
309extern int usb_serial_generic_chars_in_buffer(struct tty_struct *tty);
310extern void usb_serial_generic_read_bulk_callback(struct urb *urb);
311extern void usb_serial_generic_write_bulk_callback(struct urb *urb);
312extern void usb_serial_generic_throttle(struct tty_struct *tty);
313extern void usb_serial_generic_unthrottle(struct tty_struct *tty);
314extern void usb_serial_generic_disconnect(struct usb_serial *serial);
315extern void usb_serial_generic_release(struct usb_serial *serial);
316extern int usb_serial_generic_register(int debug);
317extern void usb_serial_generic_deregister(void);
318extern void usb_serial_generic_resubmit_read_urb(struct usb_serial_port *port,
319 gfp_t mem_flags);
320extern int usb_serial_handle_sysrq_char(struct tty_struct *tty,
321 struct usb_serial_port *port,
322 unsigned int ch);
323extern int usb_serial_handle_break(struct usb_serial_port *port);
324
325
326extern int usb_serial_bus_register(struct usb_serial_driver *device);
327extern void usb_serial_bus_deregister(struct usb_serial_driver *device);
328
329extern struct usb_serial_driver usb_serial_generic_device;
330extern struct bus_type usb_serial_bus_type;
331extern struct tty_driver *usb_serial_tty_driver;
332
333static inline void usb_serial_debug_data(int debug,
334 struct device *dev,
335 const char *function, int size,
336 const unsigned char *data)
337{
338 int i;
339
340 if (debug) {
341 dev_printk(KERN_DEBUG, dev, "%s - length = %d, data = ",
342 function, size);
343 for (i = 0; i < size; ++i)
344 printk("%.2x ", data[i]);
345 printk("\n");
346 }
347}
348
349
350#undef dbg
351#define dbg(format, arg...) \
352 do { \
353 if (debug) \
354 printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , \
355 ## arg); \
356 } while (0)
357
358
359
360#endif
361
362