v2.4.9.9 -> v2.4.9.10
[opensuse:kernel.git] / drivers / usb / serial / usb-serial.h
1 /*
2  * USB Serial Converter driver
3  *
4  *      Copyright (C) 1999 - 2001
5  *          Greg Kroah-Hartman (greg@kroah.com)
6  *
7  *      This program is free software; you can redistribute it and/or modify
8  *      it under the terms of the GNU General Public License as published by
9  *      the Free Software Foundation; either version 2 of the License, or
10  *      (at your option) any later version.
11  *
12  * See Documentation/usb/usb-serial.txt for more information on using this driver
13  *
14  * (05/30/2001) gkh
15  *      added sem to port structure and removed port_lock
16  *
17  * (10/05/2000) gkh
18  *      Added interrupt_in_endpointAddress and bulk_in_endpointAddress to help
19  *      fix bug with urb->dev not being set properly, now that the usb core
20  *      needs it.
21  * 
22  * (09/11/2000) gkh
23  *      Added usb_serial_debug_data function to help get rid of #DEBUG in the
24  *      drivers.
25  *
26  * (08/28/2000) gkh
27  *      Added port_lock to port structure.
28  *
29  * (08/08/2000) gkh
30  *      Added open_count to port structure.
31  *
32  * (07/23/2000) gkh
33  *      Added bulk_out_endpointAddress to port structure.
34  *
35  * (07/19/2000) gkh, pberger, and borchers
36  *      Modifications to allow usb-serial drivers to be modules.
37  *
38  * 
39  */
40
41
42 #ifndef __LINUX_USB_SERIAL_H
43 #define __LINUX_USB_SERIAL_H
44
45 #include <linux/config.h>
46
47 #define SERIAL_TTY_MAJOR        188     /* Nice legal number now */
48 #define SERIAL_TTY_MINORS       255     /* loads of devices :) */
49
50 #define MAX_NUM_PORTS           8       /* The maximum number of ports one device can grab at once */
51
52 #define USB_SERIAL_MAGIC        0x6702  /* magic number for usb_serial struct */
53 #define USB_SERIAL_PORT_MAGIC   0x7301  /* magic number for usb_serial_port struct */
54
55 /* parity check flag */
56 #define RELEVANT_IFLAG(iflag)   (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
57
58
59 struct usb_serial_port {
60         int                     magic;
61         struct usb_serial       *serial;        /* pointer back to the owner of this port */
62         struct tty_struct *     tty;            /* the coresponding tty for this port */
63         unsigned char           number;
64         char                    active;         /* someone has this device open */
65
66         unsigned char *         interrupt_in_buffer;
67         struct urb *            interrupt_in_urb;
68         __u8                    interrupt_in_endpointAddress;
69
70         unsigned char *         bulk_in_buffer;
71         struct urb *            read_urb;
72         __u8                    bulk_in_endpointAddress;
73
74         unsigned char *         bulk_out_buffer;
75         int                     bulk_out_size;
76         struct urb *            write_urb;
77         __u8                    bulk_out_endpointAddress;
78
79         wait_queue_head_t       write_wait;
80
81         struct tq_struct        tqueue;         /* task queue for line discipline waking up */
82         int                     open_count;     /* number of times this port has been opened */
83         struct semaphore        sem;            /* locks this structure */
84         
85         void *                  private;        /* data private to the specific port */
86 };
87
88 struct usb_serial {
89         int                             magic;
90         struct usb_device *             dev;
91         struct usb_serial_device_type * type;                   /* the type of usb serial device this is */
92         struct usb_interface *          interface;              /* the interface for this device */
93         struct tty_driver *             tty_driver;             /* the tty_driver for this device */
94         unsigned char                   minor;                  /* the starting minor number for this device */
95         unsigned char                   num_ports;              /* the number of ports this device has */
96         char                            num_interrupt_in;       /* number of interrupt in endpoints we have */
97         char                            num_bulk_in;            /* number of bulk in endpoints we have */
98         char                            num_bulk_out;           /* number of bulk out endpoints we have */
99         struct usb_serial_port          port[MAX_NUM_PORTS];
100
101         void *                  private;                /* data private to the specific driver */
102 };
103
104
105 #define MUST_HAVE_NOT   0x01
106 #define MUST_HAVE       0x02
107 #define DONT_CARE       0x03
108
109 #define HAS             0x02
110 #define HAS_NOT         0x01
111
112 #define NUM_DONT_CARE   (-1)
113
114
115 /* This structure defines the individual serial converter. */
116 struct usb_serial_device_type {
117         char    *name;
118         const struct usb_device_id *id_table;
119         char    needs_interrupt_in;
120         char    needs_bulk_in;
121         char    needs_bulk_out;
122         char    num_interrupt_in;
123         char    num_bulk_in;
124         char    num_bulk_out;
125         char    num_ports;              /* number of serial ports this device has */
126
127         struct list_head        driver_list;
128         
129         /* function call to make before accepting driver */
130         /* return 0 to continue initialization, anything else to abort */
131         int (*startup) (struct usb_serial *serial);
132         
133         void (*shutdown) (struct usb_serial *serial);
134
135         /* serial function calls */
136         int  (*open)            (struct usb_serial_port *port, struct file * filp);
137         void (*close)           (struct usb_serial_port *port, struct file * filp);
138         int  (*write)           (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count);
139         int  (*write_room)      (struct usb_serial_port *port);
140         int  (*ioctl)           (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg);
141         void (*set_termios)     (struct usb_serial_port *port, struct termios * old);
142         void (*break_ctl)       (struct usb_serial_port *port, int break_state);
143         int  (*chars_in_buffer) (struct usb_serial_port *port);
144         void (*throttle)        (struct usb_serial_port *port);
145         void (*unthrottle)      (struct usb_serial_port *port);
146
147         void (*read_int_callback)(struct urb *urb);
148         void (*read_bulk_callback)(struct urb *urb);
149         void (*write_bulk_callback)(struct urb *urb);
150 };
151
152 extern int  usb_serial_register(struct usb_serial_device_type *new_device);
153 extern void usb_serial_deregister(struct usb_serial_device_type *device);
154
155 /* determine if we should include the EzUSB loader functions */
156 #undef USES_EZUSB_FUNCTIONS
157 #if defined(CONFIG_USB_SERIAL_KEYSPAN_PDA) || defined(CONFIG_USB_SERIAL_KEYSPAN_PDA_MODULE)
158         #define USES_EZUSB_FUNCTIONS
159 #endif
160 #if defined(CONFIG_USB_SERIAL_XIRCOM) || defined(CONFIG_USB_SERIAL_XIRCOM_MODULE)
161         #define USES_EZUSB_FUNCTIONS
162 #endif
163 #if defined(CONFIG_USB_SERIAL_KEYSPAN) || defined(CONFIG_USB_SERIAL_KEYSPAN_MODULE)
164         #define USES_EZUSB_FUNCTIONS
165 #endif
166 #if defined(CONFIG_USB_SERIAL_WHITEHEAT) || defined(CONFIG_USB_SERIAL_WHITEHEAT_MODULE)
167         #define USES_EZUSB_FUNCTIONS
168 #endif
169 #ifdef USES_EZUSB_FUNCTIONS
170 extern int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *data, int length, __u8 bRequest);
171 extern int ezusb_set_reset (struct usb_serial *serial, unsigned char reset_bit);
172 #endif
173
174
175 /* Inline functions to check the sanity of a pointer that is passed to us */
176 static inline int serial_paranoia_check (struct usb_serial *serial, const char *function)
177 {
178         if (!serial) {
179                 dbg("%s - serial == NULL", function);
180                 return -1;
181         }
182         if (serial->magic != USB_SERIAL_MAGIC) {
183                 dbg("%s - bad magic number for serial", function);
184                 return -1;
185         }
186         if (!serial->type) {
187                 dbg("%s - serial->type == NULL!", function);
188                 return -1;
189         }
190
191         return 0;
192 }
193
194
195 static inline int port_paranoia_check (struct usb_serial_port *port, const char *function)
196 {
197         if (!port) {
198                 dbg("%s - port == NULL", function);
199                 return -1;
200         }
201         if (port->magic != USB_SERIAL_PORT_MAGIC) {
202                 dbg("%s - bad magic number for port", function);
203                 return -1;
204         }
205         if (!port->serial) {
206                 dbg("%s - port->serial == NULL", function);
207                 return -1;
208         }
209         if (!port->tty) {
210                 dbg("%s - port->tty == NULL", function);
211                 return -1;
212         }
213
214         return 0;
215 }
216
217
218 static inline struct usb_serial* get_usb_serial (struct usb_serial_port *port, const char *function) 
219
220         /* if no port was specified, or it fails a paranoia check */
221         if (!port || 
222                 port_paranoia_check (port, function) ||
223                 serial_paranoia_check (port->serial, function)) {
224                 /* then say that we dont have a valid usb_serial thing, which will
225                  * end up genrating -ENODEV return values */ 
226                 return NULL;
227         }
228
229         return port->serial;
230 }
231
232
233 static inline void usb_serial_debug_data (const char *file, const char *function, int size, const unsigned char *data)
234 {
235         int i;
236
237         if (!debug)
238                 return;
239         
240         printk (KERN_DEBUG "%s: %s - length = %d, data = ", file, function, size);
241         for (i = 0; i < size; ++i) {
242                 printk ("%.2x ", data[i]);
243         }
244         printk ("\n");
245 }
246
247
248 /* Use our own dbg macro */
249 #undef dbg
250 #define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg); } while (0)
251
252
253
254 #endif  /* ifdef __LINUX_USB_SERIAL_H */
255