more changes on original files
[linux-2.4.git] / drivers / usb / serial / keyspan.h
1 /*
2   Keyspan USB to Serial Converter driver
3  
4   (C) Copyright (C) 2000-2001
5       Hugh Blemings <hugh@blemings.org>
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 http://misc.nu/hugh/keyspan.html for more information.
13   
14   Code in this driver inspired by and in a number of places taken
15   from Brian Warner's original Keyspan-PDA driver.
16
17   This driver has been put together with the support of Innosys, Inc.
18   and Keyspan, Inc the manufacturers of the Keyspan USB-serial products.
19   Thanks Guys :)
20   
21   Thanks to Paulus for miscellaneous tidy ups, some largish chunks
22   of much nicer and/or completely new code and (perhaps most uniquely)
23   having the patience to sit down and explain why and where he'd changed
24   stuff.
25
26   Tip 'o the hat to IBM (and previously Linuxcare :) for supporting 
27   staff in their work on open source projects.
28   
29   See keyspan.c for update history.
30
31 */
32
33 #ifndef __LINUX_USB_SERIAL_KEYSPAN_H
34 #define __LINUX_USB_SERIAL_KEYSPAN_H
35
36
37 /* Function prototypes for Keyspan serial converter */
38 static int  keyspan_open                (struct usb_serial_port *port,
39                                          struct file *filp);
40 static void keyspan_close               (struct usb_serial_port *port,
41                                          struct file *filp);
42 static int  keyspan_startup             (struct usb_serial *serial);
43 static void keyspan_shutdown            (struct usb_serial *serial);
44 static void keyspan_rx_throttle         (struct usb_serial_port *port);
45 static void keyspan_rx_unthrottle       (struct usb_serial_port *port);
46 static int  keyspan_write_room          (struct usb_serial_port *port);
47
48 static int  keyspan_write               (struct usb_serial_port *port,
49                                          int from_user,
50                                          const unsigned char *buf,
51                                          int count);
52
53 static void keyspan_send_setup          (struct usb_serial_port *port,
54                                          int reset_port);
55
56
57 static int  keyspan_chars_in_buffer     (struct usb_serial_port *port);
58 static int  keyspan_ioctl               (struct usb_serial_port *port,
59                                          struct file *file,
60                                          unsigned int cmd,
61                                          unsigned long arg);
62 static void keyspan_set_termios         (struct usb_serial_port *port,
63                                          struct termios *old);
64 static void keyspan_break_ctl           (struct usb_serial_port *port,
65                                          int break_state);
66 static int  keyspan_fake_startup        (struct usb_serial *serial);
67
68 static int  keyspan_usa19_calc_baud     (u32 baud_rate, u32 baudclk, 
69                                          u8 *rate_hi, u8 *rate_low,
70                                          u8 *prescaler, int portnum);
71
72 static int  keyspan_usa19w_calc_baud    (u32 baud_rate, u32 baudclk,
73                                          u8 *rate_hi, u8 *rate_low,
74                                          u8 *prescaler, int portnum);
75
76 static int  keyspan_usa28_calc_baud     (u32 baud_rate, u32 baudclk,
77                                          u8 *rate_hi, u8 *rate_low,
78                                          u8 *prescaler, int portnum);
79
80 static int  keyspan_usa19hs_calc_baud   (u32 baud_rate, u32 baudclk,
81                                          u8 *rate_hi, u8 *rate_low,
82                                          u8 *prescaler, int portnum);
83
84 static int  keyspan_usa28_send_setup    (struct usb_serial *serial,
85                                          struct usb_serial_port *port,
86                                          int reset_port);
87 static int  keyspan_usa26_send_setup    (struct usb_serial *serial,
88                                          struct usb_serial_port *port,
89                                          int reset_port);
90 static int  keyspan_usa49_send_setup    (struct usb_serial *serial,
91                                          struct usb_serial_port *port,
92                                          int reset_port);
93
94 static int  keyspan_usa90_send_setup    (struct usb_serial *serial,
95                                          struct usb_serial_port *port,
96                                          int reset_port);
97
98 /* Struct used for firmware - increased size of data section
99    to allow Keyspan's 'C' firmware struct to be used unmodified */
100 struct ezusb_hex_record {
101         __u16 address;
102         __u8 data_size;
103         __u8 data[64];
104 };
105
106 /* Conditionally include firmware images, if they aren't
107    included create a null pointer instead.  Current 
108    firmware images aren't optimised to remove duplicate
109    addresses in the image itself. */
110 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA28
111         #include "keyspan_usa28_fw.h"
112 #else
113         static const struct ezusb_hex_record *keyspan_usa28_firmware = NULL;
114 #endif
115
116 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA28X
117         #include "keyspan_usa28x_fw.h"
118 #else
119         static const struct ezusb_hex_record *keyspan_usa28x_firmware = NULL;
120 #endif
121
122 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA28XA
123         #include "keyspan_usa28xa_fw.h"
124 #else
125         static const struct ezusb_hex_record *keyspan_usa28xa_firmware = NULL;
126 #endif
127
128 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA28XB
129         #include "keyspan_usa28xb_fw.h"
130 #else
131         static const struct ezusb_hex_record *keyspan_usa28xb_firmware = NULL;
132 #endif
133
134 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA19
135         #include "keyspan_usa19_fw.h"
136 #else
137         static const struct ezusb_hex_record *keyspan_usa19_firmware = NULL;
138 #endif
139
140 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA19QI
141         #include "keyspan_usa19qi_fw.h"
142 #else
143         static const struct ezusb_hex_record *keyspan_usa19qi_firmware = NULL;
144 #endif
145
146 #ifdef CONFIG_USB_SERIAL_KEYSPAN_MPR
147         #include "keyspan_mpr_fw.h"
148 #else
149         static const struct ezusb_hex_record *keyspan_mpr_firmware = NULL;
150 #endif
151
152 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA19QW
153         #include "keyspan_usa19qw_fw.h"
154 #else
155         static const struct ezusb_hex_record *keyspan_usa19qw_firmware = NULL;
156 #endif
157
158 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA18X
159         #include "keyspan_usa18x_fw.h"
160 #else
161         static const struct ezusb_hex_record *keyspan_usa18x_firmware = NULL;
162 #endif
163
164 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA19W
165         #include "keyspan_usa19w_fw.h"
166 #else
167         static const struct ezusb_hex_record *keyspan_usa19w_firmware = NULL;
168 #endif
169
170 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA49W
171         #include "keyspan_usa49w_fw.h"
172 #else
173         static const struct ezusb_hex_record *keyspan_usa49w_firmware = NULL;
174 #endif
175
176 #ifdef CONFIG_USB_SERIAL_KEYSPAN_USA49WLC
177         #include "keyspan_usa49wlc_fw.h"
178 #else
179         static const struct ezusb_hex_record *keyspan_usa49wlc_firmware = NULL;
180 #endif
181
182 /* Values used for baud rate calculation - device specific */
183 #define KEYSPAN_INVALID_BAUD_RATE               (-1)
184 #define KEYSPAN_BAUD_RATE_OK                    (0)
185 #define KEYSPAN_USA18X_BAUDCLK                  (12000000L)     /* a guess */
186 #define KEYSPAN_USA19_BAUDCLK                   (12000000L)
187 #define KEYSPAN_USA19W_BAUDCLK                  (24000000L)
188 #define KEYSPAN_USA19HS_BAUDCLK                 (14769231L)
189 #define KEYSPAN_USA28_BAUDCLK                   (1843200L)
190 #define KEYSPAN_USA28X_BAUDCLK                  (12000000L)
191 #define KEYSPAN_USA49W_BAUDCLK                  (48000000L)
192
193 /* Some constants used to characterise each device.  */
194 #define         KEYSPAN_MAX_NUM_PORTS           (4)
195 #define         KEYSPAN_MAX_FLIPS               (2)
196
197 /* Device info for the Keyspan serial converter, used
198    by the overall usb-serial probe function */
199 #define KEYSPAN_VENDOR_ID                       (0x06cd)
200
201 /* Product IDs for the products supported, pre-renumeration */
202 #define keyspan_usa18x_pre_product_id           0x0105
203 #define keyspan_usa19_pre_product_id            0x0103
204 #define keyspan_usa19qi_pre_product_id          0x010b
205 #define keyspan_mpr_pre_product_id              0x011b
206 #define keyspan_usa19qw_pre_product_id          0x0118
207 #define keyspan_usa19w_pre_product_id           0x0106
208 #define keyspan_usa28_pre_product_id            0x0101
209 #define keyspan_usa28x_pre_product_id           0x0102
210 #define keyspan_usa28xa_pre_product_id          0x0114
211 #define keyspan_usa28xb_pre_product_id          0x0113
212 #define keyspan_usa49w_pre_product_id           0x0109
213 #define keyspan_usa49wlc_pre_product_id         0x011a
214
215 /* Product IDs post-renumeration.  Note that the 28x and 28xb
216    have the same id's post-renumeration but behave identically
217    so it's not an issue. */
218 #define keyspan_usa18x_product_id               0x0112
219 #define keyspan_usa19_product_id                0x0107
220 #define keyspan_usa19qi_product_id              0x010c
221 #define keyspan_usa19hs_product_id              0x0121
222 #define keyspan_mpr_product_id                  0x011c
223 #define keyspan_usa19qw_product_id              0x0119
224 #define keyspan_usa19w_product_id               0x0108
225 #define keyspan_usa28_product_id                0x010f
226 #define keyspan_usa28x_product_id               0x0110
227 #define keyspan_usa28xa_product_id              0x0115
228 #define keyspan_usa28xb_product_id              0x0110
229 #define keyspan_usa49w_product_id               0x010a
230 #define keyspan_usa49wlc_product_id             0x012a
231
232
233 struct keyspan_device_details {
234         /* product ID value */
235         int     product_id;
236
237         enum    {msg_usa26, msg_usa28, msg_usa49, msg_usa90} msg_format;
238
239                 /* Number of physical ports */
240         int     num_ports;
241
242                 /* 1 if endpoint flipping used on input, 0 if not */
243         int     indat_endp_flip;
244
245                 /* 1 if endpoint flipping used on output, 0 if not */
246         int     outdat_endp_flip;
247
248                 /* Table mapping input data endpoint IDs to physical
249                    port number and flip if used */
250         int     indat_endpoints[KEYSPAN_MAX_NUM_PORTS];
251
252                 /* Same for output endpoints */
253         int     outdat_endpoints[KEYSPAN_MAX_NUM_PORTS];
254
255                 /* Input acknowledge endpoints */
256         int     inack_endpoints[KEYSPAN_MAX_NUM_PORTS];
257
258                 /* Output control endpoints */
259         int     outcont_endpoints[KEYSPAN_MAX_NUM_PORTS];
260
261                 /* Endpoint used for input status */
262         int     instat_endpoint;
263
264                 /* Endpoint used for global control functions */
265         int     glocont_endpoint;
266
267         int     (*calculate_baud_rate) (u32 baud_rate, u32 baudclk,
268                         u8 *rate_hi, u8 *rate_low, u8 *prescaler, int portnum);
269         u32     baudclk;
270 }; 
271
272 /* Now for each device type we setup the device detail
273    structure with the appropriate information (provided
274    in Keyspan's documentation) */
275
276 static const struct keyspan_device_details usa18x_device_details = {
277         product_id:             keyspan_usa18x_product_id,
278         msg_format:             msg_usa26,
279         num_ports:              1,
280         indat_endp_flip:        0,
281         outdat_endp_flip:       1,
282         indat_endpoints:        {0x81},
283         outdat_endpoints:       {0x01},
284         inack_endpoints:        {0x85},
285         outcont_endpoints:      {0x05},
286         instat_endpoint:        0x87,
287         glocont_endpoint:       0x07,
288         calculate_baud_rate:    keyspan_usa19w_calc_baud,
289         baudclk:                KEYSPAN_USA18X_BAUDCLK,
290 };
291
292 static const struct keyspan_device_details usa19_device_details = {
293         product_id:             keyspan_usa19_product_id,
294         msg_format:             msg_usa28,
295         num_ports:              1,
296         indat_endp_flip:        1,
297         outdat_endp_flip:       1,
298         indat_endpoints:        {0x81},
299         outdat_endpoints:       {0x01},
300         inack_endpoints:        {0x83},
301         outcont_endpoints:      {0x03},
302         instat_endpoint:        0x84,
303         glocont_endpoint:       -1,
304         calculate_baud_rate:    keyspan_usa19_calc_baud,
305         baudclk:                KEYSPAN_USA19_BAUDCLK,
306 };
307
308 static const struct keyspan_device_details usa19qi_device_details = {
309         product_id:             keyspan_usa19qi_product_id,
310         msg_format:             msg_usa28,
311         num_ports:              1,
312         indat_endp_flip:        1,
313         outdat_endp_flip:       1,
314         indat_endpoints:        {0x81},
315         outdat_endpoints:       {0x01},
316         inack_endpoints:        {0x83},
317         outcont_endpoints:      {0x03},
318         instat_endpoint:        0x84,
319         glocont_endpoint:       -1,
320         calculate_baud_rate:    keyspan_usa28_calc_baud,
321         baudclk:                KEYSPAN_USA19_BAUDCLK,
322 };
323
324 static const struct keyspan_device_details mpr_device_details = {
325         product_id:             keyspan_mpr_product_id,
326         msg_format:             msg_usa28,
327         num_ports:              1,
328         indat_endp_flip:        1,
329         outdat_endp_flip:       1,
330         indat_endpoints:        {0x81},
331         outdat_endpoints:       {0x01},
332         inack_endpoints:        {0x83},
333         outcont_endpoints:      {0x03},
334         instat_endpoint:        0x84,
335         glocont_endpoint:       -1,
336         calculate_baud_rate:    keyspan_usa28_calc_baud,
337         baudclk:                KEYSPAN_USA19_BAUDCLK,
338 };
339
340
341 static const struct keyspan_device_details usa19qw_device_details = {
342         product_id:             keyspan_usa19qw_product_id,
343         msg_format:             msg_usa26,
344         num_ports:              1,
345         indat_endp_flip:        0,
346         outdat_endp_flip:       1,
347         indat_endpoints:        {0x81},
348         outdat_endpoints:       {0x01},
349         inack_endpoints:        {0x85},
350         outcont_endpoints:      {0x05},
351         instat_endpoint:        0x87,
352         glocont_endpoint:       0x07,
353         calculate_baud_rate:    keyspan_usa19w_calc_baud,
354         baudclk:                KEYSPAN_USA19W_BAUDCLK,
355 };
356
357 static const struct keyspan_device_details usa19w_device_details = {
358         product_id:             keyspan_usa19w_product_id,
359         msg_format:             msg_usa26,
360         num_ports:              1,
361         indat_endp_flip:        0,
362         outdat_endp_flip:       1,
363         indat_endpoints:        {0x81},
364         outdat_endpoints:       {0x01},
365         inack_endpoints:        {0x85},
366         outcont_endpoints:      {0x05},
367         instat_endpoint:        0x87,
368         glocont_endpoint:       0x07,
369         calculate_baud_rate:    keyspan_usa19w_calc_baud,
370         baudclk:                KEYSPAN_USA19W_BAUDCLK,
371 };
372
373 static const struct keyspan_device_details usa19hs_device_details = {
374         product_id:             keyspan_usa19hs_product_id,
375         msg_format:             msg_usa90,
376         num_ports:              1,
377         indat_endp_flip:        0,
378         outdat_endp_flip:       0,
379         indat_endpoints:        {0x81},
380         outdat_endpoints:       {0x01},
381         inack_endpoints:        {-1},
382         outcont_endpoints:      {0x02},
383         instat_endpoint:        0x82,
384         glocont_endpoint:       -1,
385         calculate_baud_rate:    keyspan_usa19hs_calc_baud,
386         baudclk:                KEYSPAN_USA19HS_BAUDCLK,
387 };
388
389 static const struct keyspan_device_details usa28_device_details = {
390         product_id:             keyspan_usa28_product_id,
391         msg_format:             msg_usa28,
392         num_ports:              2,
393         indat_endp_flip:        1,
394         outdat_endp_flip:       1,
395         indat_endpoints:        {0x81, 0x83},
396         outdat_endpoints:       {0x01, 0x03},
397         inack_endpoints:        {0x85, 0x86},
398         outcont_endpoints:      {0x05, 0x06},
399         instat_endpoint:        0x87,
400         glocont_endpoint:       0x07,
401         calculate_baud_rate:    keyspan_usa28_calc_baud,
402         baudclk:                KEYSPAN_USA28_BAUDCLK,          
403 };
404
405 static const struct keyspan_device_details usa28x_device_details = {
406         product_id:             keyspan_usa28x_product_id,
407         msg_format:             msg_usa26,
408         num_ports:              2,
409         indat_endp_flip:        0,
410         outdat_endp_flip:       1,
411         indat_endpoints:        {0x81, 0x83},
412         outdat_endpoints:       {0x01, 0x03},
413         inack_endpoints:        {0x85, 0x86},
414         outcont_endpoints:      {0x05, 0x06},
415         instat_endpoint:        0x87,
416         glocont_endpoint:       0x07,
417         calculate_baud_rate:    keyspan_usa19w_calc_baud,
418         baudclk:                KEYSPAN_USA28X_BAUDCLK,
419 };
420
421 static const struct keyspan_device_details usa28xa_device_details = {
422         product_id:             keyspan_usa28xa_product_id,
423         msg_format:             msg_usa26,
424         num_ports:              2,
425         indat_endp_flip:        0,
426         outdat_endp_flip:       1,
427         indat_endpoints:        {0x81, 0x83},
428         outdat_endpoints:       {0x01, 0x03},
429         inack_endpoints:        {0x85, 0x86},
430         outcont_endpoints:      {0x05, 0x06},
431         instat_endpoint:        0x87,
432         glocont_endpoint:       0x07,
433         calculate_baud_rate:    keyspan_usa19w_calc_baud,
434         baudclk:                KEYSPAN_USA28X_BAUDCLK,
435 };
436
437 /* We don't need a separate entry for the usa28xb as it appears as a 28x anyway */
438
439 static const struct keyspan_device_details usa49w_device_details = {
440         product_id:             keyspan_usa49w_product_id,
441         msg_format:             msg_usa49,
442         num_ports:              4,
443         indat_endp_flip:        0,
444         outdat_endp_flip:       0,
445         indat_endpoints:        {0x81, 0x82, 0x83, 0x84},
446         outdat_endpoints:       {0x01, 0x02, 0x03, 0x04},
447         inack_endpoints:        {-1, -1, -1, -1},
448         outcont_endpoints:      {-1, -1, -1, -1},
449         instat_endpoint:        0x87,
450         glocont_endpoint:       0x07,
451         calculate_baud_rate:    keyspan_usa19w_calc_baud,
452         baudclk:                KEYSPAN_USA49W_BAUDCLK,
453 };
454
455 static const struct keyspan_device_details usa49wlc_device_details = {
456         product_id:             keyspan_usa49wlc_product_id,
457         msg_format:             msg_usa49,
458         num_ports:              4,
459         indat_endp_flip:        0,
460         outdat_endp_flip:       0,
461         indat_endpoints:        {0x81, 0x82, 0x83, 0x84},
462         outdat_endpoints:       {0x01, 0x02, 0x03, 0x04},
463         inack_endpoints:        {-1, -1, -1, -1},
464         outcont_endpoints:      {-1, -1, -1, -1},
465         instat_endpoint:        0x87,
466         glocont_endpoint:       0x07,
467         calculate_baud_rate:    keyspan_usa19w_calc_baud,
468         baudclk:                KEYSPAN_USA19W_BAUDCLK,
469 };
470
471 static const struct keyspan_device_details *keyspan_devices[] = {
472         &usa18x_device_details,
473         &usa19_device_details,
474         &usa19qi_device_details,
475         &mpr_device_details,
476         &usa19qw_device_details,
477         &usa19w_device_details,
478         &usa19hs_device_details,
479         &usa28_device_details,
480         &usa28x_device_details,
481         &usa28xa_device_details,
482         /* 28xb not required as it renumerates as a 28x */
483         &usa49w_device_details,
484         &usa49wlc_device_details,
485         NULL,
486 };
487
488 static __devinitdata struct usb_device_id keyspan_ids_combined[] = {
489         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
490         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
491         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
492         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
493         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
494         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
495         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
496         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
497         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
498         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
499         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
500         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
501         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
502         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
503         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
504         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
505         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
506         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
507         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
508         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
509         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
510         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
511         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_product_id) },
512         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id)},
513         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
514         { } /* Terminating entry */
515 };
516
517 MODULE_DEVICE_TABLE(usb, keyspan_ids_combined);
518
519 /* usb_device_id table for the pre-firmware download keyspan devices */
520 static struct usb_device_id keyspan_pre_ids[] = {
521         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
522         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
523         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
524         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
525         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
526         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
527         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
528         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
529         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
530         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
531         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
532         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
533         { } /* Terminating entry */
534 };
535
536 static struct usb_device_id keyspan_1port_ids[] = {
537         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
538         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
539         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
540         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
541         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
542         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
543         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
544         { } /* Terminating entry */
545 };
546
547 static struct usb_device_id keyspan_2port_ids[] = {
548         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
549         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
550         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
551         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_product_id) },
552         { } /* Terminating entry */
553 };
554
555 static struct usb_device_id keyspan_4port_ids[] = {
556         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id) },
557         { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
558         { } /* Terminating entry */
559 };
560
561 /* Structs for the devices, pre and post renumeration. */
562 static struct usb_serial_device_type keyspan_pre_device = {
563         owner:                  THIS_MODULE,
564         name:                   "Keyspan - (without firmware)",
565         id_table:               keyspan_pre_ids,
566         num_interrupt_in:       NUM_DONT_CARE,
567         num_bulk_in:            NUM_DONT_CARE,
568         num_bulk_out:           NUM_DONT_CARE,
569         num_ports:              1,
570         startup:                keyspan_fake_startup,
571 };
572
573 static struct usb_serial_device_type keyspan_1port_device = {
574         owner:                  THIS_MODULE,
575         name:                   "Keyspan 1 port adapter",
576         id_table:               keyspan_1port_ids,
577         num_interrupt_in:       NUM_DONT_CARE,
578         num_bulk_in:            NUM_DONT_CARE,
579         num_bulk_out:           NUM_DONT_CARE,
580         num_ports:              1,
581         open:                   keyspan_open,
582         close:                  keyspan_close,
583         write:                  keyspan_write,
584         write_room:             keyspan_write_room,
585         chars_in_buffer:        keyspan_chars_in_buffer,
586         throttle:               keyspan_rx_throttle,
587         unthrottle:             keyspan_rx_unthrottle,
588         ioctl:                  keyspan_ioctl,
589         set_termios:            keyspan_set_termios,
590         break_ctl:              keyspan_break_ctl,
591         startup:                keyspan_startup,
592         shutdown:               keyspan_shutdown,
593 };
594
595 static struct usb_serial_device_type keyspan_2port_device = {
596         owner:                  THIS_MODULE,
597         name:                   "Keyspan 2 port adapter",
598         id_table:               keyspan_2port_ids,
599         num_interrupt_in:       NUM_DONT_CARE,
600         num_bulk_in:            NUM_DONT_CARE,
601         num_bulk_out:           NUM_DONT_CARE,
602         num_ports:              2,
603         open:                   keyspan_open,
604         close:                  keyspan_close,
605         write:                  keyspan_write,
606         write_room:             keyspan_write_room,
607         chars_in_buffer:        keyspan_chars_in_buffer,
608         throttle:               keyspan_rx_throttle,
609         unthrottle:             keyspan_rx_unthrottle,
610         ioctl:                  keyspan_ioctl,
611         set_termios:            keyspan_set_termios,
612         break_ctl:              keyspan_break_ctl,
613         startup:                keyspan_startup,
614         shutdown:               keyspan_shutdown,
615 };
616
617 static struct usb_serial_device_type keyspan_4port_device = {
618         owner:                  THIS_MODULE,
619         name:                   "Keyspan 4 port adapter",
620         id_table:               keyspan_4port_ids,
621         num_interrupt_in:       NUM_DONT_CARE,
622         num_bulk_in:            5,
623         num_bulk_out:           5,
624         num_ports:              4,
625         open:                   keyspan_open,
626         close:                  keyspan_close,
627         write:                  keyspan_write,
628         write_room:             keyspan_write_room,
629         chars_in_buffer:        keyspan_chars_in_buffer,
630         throttle:               keyspan_rx_throttle,
631         unthrottle:             keyspan_rx_unthrottle,
632         ioctl:                  keyspan_ioctl,
633         set_termios:            keyspan_set_termios,
634         break_ctl:              keyspan_break_ctl,
635         startup:                keyspan_startup,
636         shutdown:               keyspan_shutdown,
637 };
638
639 #endif