28a8362f5271c239299c5bcca5a9703b3ba86f77
[firefly-linux-kernel-4.4.55.git] / drivers / staging / dgap / dgap.c
1 /*
2  * Copyright 2003 Digi International (www.digi.com)
3  *      Scott H Kilau <Scott_Kilau at digi dot com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2, or (at your option)
8  * any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
12  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13  * PURPOSE.  See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  *
19  *
20  *      NOTE TO LINUX KERNEL HACKERS:  DO NOT REFORMAT THIS CODE!
21  *
22  *      This is shared code between Digi's CVS archive and the
23  *      Linux Kernel sources.
24  *      Changing the source just for reformatting needlessly breaks
25  *      our CVS diff history.
26  *
27  *      Send any bug fixes/changes to:  Eng.Linux at digi dot com.
28  *      Thank you.
29  *
30  */
31
32 /*
33  *      In the original out of kernel Digi dgap driver, firmware
34  *      loading was done via user land to driver handshaking.
35  *
36  *      For cards that support a concentrator (port expander),
37  *      I believe the concentrator its self told the card which
38  *      concentrator is actually attached and then that info
39  *      was used to tell user land which concentrator firmware
40  *      image was to be downloaded. I think even the BIOS or
41  *      FEP images required could change with the connection
42  *      of a particular concentrator.
43  *
44  *      Since I have no access to any of these cards or
45  *      concentrators, I cannot put the correct concentrator
46  *      firmware file names into the firmware_info structure
47  *      as is now done for the BIOS and FEP images.
48  *
49  *      I think, but am not certain, that the cards supporting
50  *      concentrators will function without them. So support
51  *      of these cards has been left in this driver.
52  *
53  *      In order to fully support those cards, they would
54  *      either have to be acquired for dissection or maybe
55  *      Digi International could provide some assistance.
56  */
57 #undef DIGI_CONCENTRATORS_SUPPORTED
58
59 #include <linux/kernel.h>
60 #include <linux/module.h>
61 #include <linux/pci.h>
62 #include <linux/delay.h>        /* For udelay */
63 #include <linux/slab.h>
64 #include <linux/uaccess.h>
65 #include <linux/sched.h>
66
67 #include <linux/interrupt.h>    /* For tasklet and interrupt structs/defines */
68 #include <linux/ctype.h>
69 #include <linux/tty.h>
70 #include <linux/tty_flip.h>
71 #include <linux/serial_reg.h>
72 #include <linux/io.h>           /* For read[bwl]/write[bwl] */
73
74 #include <linux/string.h>
75 #include <linux/device.h>
76 #include <linux/kdev_t.h>
77 #include <linux/firmware.h>
78
79 #include "dgap.h"
80
81 #define init_MUTEX(sem)         sema_init(sem, 1)
82 #define DECLARE_MUTEX(name)     \
83         struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1)
84
85 MODULE_LICENSE("GPL");
86 MODULE_AUTHOR("Digi International, http://www.digi.com");
87 MODULE_DESCRIPTION("Driver for the Digi International EPCA PCI based product line");
88 MODULE_SUPPORTED_DEVICE("dgap");
89
90 /**************************************************************************
91  *
92  * protos for this file
93  *
94  */
95
96 static int dgap_start(void);
97 static void dgap_init_globals(void);
98 static int dgap_found_board(struct pci_dev *pdev, int id);
99 static void dgap_cleanup_board(struct board_t *brd);
100 static void dgap_poll_handler(ulong dummy);
101 static int dgap_init_pci(void);
102 static int dgap_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
103 static void dgap_remove_one(struct pci_dev *dev);
104 static int dgap_probe1(struct pci_dev *pdev, int card_type);
105 static int dgap_do_remap(struct board_t *brd);
106 static irqreturn_t dgap_intr(int irq, void *voidbrd);
107
108 /* Our function prototypes */
109 static int dgap_tty_open(struct tty_struct *tty, struct file *file);
110 static void dgap_tty_close(struct tty_struct *tty, struct file *file);
111 static int dgap_block_til_ready(struct tty_struct *tty, struct file *file,
112                                 struct channel_t *ch);
113 static int dgap_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
114                                 unsigned long arg);
115 static int dgap_tty_digigeta(struct tty_struct *tty,
116                                 struct digi_t __user *retinfo);
117 static int dgap_tty_digiseta(struct tty_struct *tty,
118                                 struct digi_t __user *new_info);
119 static int dgap_tty_digigetedelay(struct tty_struct *tty, int __user *retinfo);
120 static int dgap_tty_digisetedelay(struct tty_struct *tty, int __user *new_info);
121 static int dgap_tty_write_room(struct tty_struct *tty);
122 static int dgap_tty_chars_in_buffer(struct tty_struct *tty);
123 static void dgap_tty_start(struct tty_struct *tty);
124 static void dgap_tty_stop(struct tty_struct *tty);
125 static void dgap_tty_throttle(struct tty_struct *tty);
126 static void dgap_tty_unthrottle(struct tty_struct *tty);
127 static void dgap_tty_flush_chars(struct tty_struct *tty);
128 static void dgap_tty_flush_buffer(struct tty_struct *tty);
129 static void dgap_tty_hangup(struct tty_struct *tty);
130 static int dgap_wait_for_drain(struct tty_struct *tty);
131 static int dgap_set_modem_info(struct tty_struct *tty, unsigned int command,
132                                 unsigned int __user *value);
133 static int dgap_get_modem_info(struct channel_t *ch,
134                                 unsigned int __user *value);
135 static int dgap_tty_digisetcustombaud(struct tty_struct *tty,
136                                 int __user *new_info);
137 static int dgap_tty_digigetcustombaud(struct tty_struct *tty,
138                                 int __user *retinfo);
139 static int dgap_tty_tiocmget(struct tty_struct *tty);
140 static int dgap_tty_tiocmset(struct tty_struct *tty, unsigned int set,
141                                 unsigned int clear);
142 static int dgap_tty_send_break(struct tty_struct *tty, int msec);
143 static void dgap_tty_wait_until_sent(struct tty_struct *tty, int timeout);
144 static int dgap_tty_write(struct tty_struct *tty, const unsigned char *buf,
145                                 int count);
146 static void dgap_tty_set_termios(struct tty_struct *tty,
147                                 struct ktermios *old_termios);
148 static int dgap_tty_put_char(struct tty_struct *tty, unsigned char c);
149 static void dgap_tty_send_xchar(struct tty_struct *tty, char ch);
150
151 static int dgap_tty_register(struct board_t *brd);
152 static int dgap_tty_preinit(void);
153 static int dgap_tty_init(struct board_t *);
154 static void dgap_tty_post_uninit(void);
155 static void dgap_tty_uninit(struct board_t *);
156 static void dgap_carrier(struct channel_t *ch);
157 static void dgap_input(struct channel_t *ch);
158
159 /*
160  * Our function prototypes from dgap_fep5
161  */
162 static void dgap_cmdw_ext(struct channel_t *ch, u16 cmd, u16 word, uint ncmds);
163 static int dgap_event(struct board_t *bd);
164
165 static void dgap_poll_tasklet(unsigned long data);
166 static void dgap_cmdb(struct channel_t *ch, uchar cmd, uchar byte1,
167                         uchar byte2, uint ncmds);
168 static void dgap_cmdw(struct channel_t *ch, uchar cmd, u16 word, uint ncmds);
169 static void dgap_wmove(struct channel_t *ch, char *buf, uint cnt);
170 static int dgap_param(struct tty_struct *tty);
171 static void dgap_parity_scan(struct channel_t *ch, unsigned char *cbuf,
172                                 unsigned char *fbuf, int *len);
173 static uint dgap_get_custom_baud(struct channel_t *ch);
174 static void dgap_firmware_reset_port(struct channel_t *ch);
175
176 /*
177  * Function prototypes from dgap_parse.c.
178  */
179 static int dgap_gettok(char **in, struct cnode *p);
180 static char *dgap_getword(char **in);
181 static char *dgap_savestring(char *s);
182 static struct cnode *dgap_newnode(int t);
183 static int dgap_checknode(struct cnode *p);
184 static void dgap_err(char *s);
185
186 /*
187  * Function prototypes from dgap_sysfs.h
188  */
189 struct board_t;
190 struct channel_t;
191 struct un_t;
192 struct pci_driver;
193 struct class_device;
194
195 static void dgap_create_ports_sysfiles(struct board_t *bd);
196 static void dgap_remove_ports_sysfiles(struct board_t *bd);
197
198 static void dgap_create_driver_sysfiles(struct pci_driver *);
199 static void dgap_remove_driver_sysfiles(struct pci_driver *);
200
201 static void dgap_create_tty_sysfs(struct un_t *un, struct device *c);
202 static void dgap_remove_tty_sysfs(struct device *c);
203
204 /*
205  * Function prototypes from dgap_parse.h
206  */
207 static int dgap_parsefile(char **in, int Remove);
208 static struct cnode *dgap_find_config(int type, int bus, int slot);
209 static uint dgap_config_get_number_of_ports(struct board_t *bd);
210 static char *dgap_create_config_string(struct board_t *bd, char *string);
211 static uint dgap_config_get_useintr(struct board_t *bd);
212 static uint dgap_config_get_altpin(struct board_t *bd);
213
214 static int dgap_ms_sleep(ulong ms);
215 static void dgap_do_bios_load(struct board_t *brd, uchar __user *ubios,
216                                 int len);
217 static void dgap_do_fep_load(struct board_t *brd, uchar __user *ufep, int len);
218 #ifdef DIGI_CONCENTRATORS_SUPPORTED
219 static void dgap_do_conc_load(struct board_t *brd, uchar *uaddr, int len);
220 #endif
221 static int dgap_after_config_loaded(int board);
222 static int dgap_finalize_board_init(struct board_t *brd);
223
224 static void dgap_get_vpd(struct board_t *brd);
225 static void dgap_do_reset_board(struct board_t *brd);
226 static void dgap_do_wait_for_bios(struct board_t *brd);
227 static void dgap_do_wait_for_fep(struct board_t *brd);
228 static int dgap_tty_register_ports(struct board_t *brd);
229 static int dgap_firmware_load(struct pci_dev *pdev, int card_type);
230
231 /* Driver unload function */
232 static void dgap_cleanup_module(void);
233
234 module_exit(dgap_cleanup_module);
235
236 /*
237  * File operations permitted on Control/Management major.
238  */
239 static const struct file_operations DgapBoardFops = {
240         .owner  = THIS_MODULE,
241 };
242
243 /*
244  * Globals
245  */
246 static uint dgap_NumBoards;
247 static struct board_t *dgap_Board[MAXBOARDS];
248 static ulong dgap_poll_counter;
249 static char *dgap_config_buf;
250 static int dgap_driver_state = DRIVER_INITIALIZED;
251 DEFINE_SPINLOCK(dgap_dl_lock);
252 static wait_queue_head_t dgap_dl_wait;
253 static int dgap_dl_action;
254 static int dgap_poll_tick = 20; /* Poll interval - 20 ms */
255
256 /*
257  * Static vars.
258  */
259 static int dgap_Major_Control_Registered = FALSE;
260 static uint dgap_driver_start = FALSE;
261
262 static struct class *dgap_class;
263
264 static struct board_t *dgap_BoardsByMajor[256];
265 static uchar *dgap_TmpWriteBuf;
266 DECLARE_MUTEX(dgap_TmpWriteSem);
267 static uint dgap_count = 500;
268
269 /*
270  * Poller stuff
271  */
272 DEFINE_SPINLOCK(dgap_poll_lock);        /* Poll scheduling lock */
273 static ulong dgap_poll_time;            /* Time of next poll */
274 static uint dgap_poll_stop;             /* Used to tell poller to stop */
275 static struct timer_list dgap_poll_timer;
276
277 /*
278      SUPPORTED PRODUCTS
279
280      Card Model               Number of Ports      Interface
281      ----------------------------------------------------------------
282      Acceleport Xem           4 - 64              (EIA232 & EIA422)
283      Acceleport Xr            4 & 8               (EIA232)
284      Acceleport Xr 920        4 & 8               (EIA232)
285      Acceleport C/X           8 - 128             (EIA232)
286      Acceleport EPC/X         8 - 224             (EIA232)
287      Acceleport Xr/422        4 & 8               (EIA422)
288      Acceleport 2r/920        2                   (EIA232)
289      Acceleport 4r/920        4                   (EIA232)
290      Acceleport 8r/920        8                   (EIA232)
291
292      IBM 8-Port Asynchronous PCI Adapter          (EIA232)
293      IBM 128-Port Asynchronous PCI Adapter        (EIA232 & EIA422)
294 */
295
296 static struct pci_device_id dgap_pci_tbl[] = {
297         { DIGI_VID, PCI_DEV_XEM_DID,      PCI_ANY_ID, PCI_ANY_ID, 0, 0,  0 },
298         { DIGI_VID, PCI_DEV_CX_DID,       PCI_ANY_ID, PCI_ANY_ID, 0, 0,  1 },
299         { DIGI_VID, PCI_DEV_CX_IBM_DID,   PCI_ANY_ID, PCI_ANY_ID, 0, 0,  2 },
300         { DIGI_VID, PCI_DEV_EPCJ_DID,     PCI_ANY_ID, PCI_ANY_ID, 0, 0,  3 },
301         { DIGI_VID, PCI_DEV_920_2_DID,    PCI_ANY_ID, PCI_ANY_ID, 0, 0,  4 },
302         { DIGI_VID, PCI_DEV_920_4_DID,    PCI_ANY_ID, PCI_ANY_ID, 0, 0,  5 },
303         { DIGI_VID, PCI_DEV_920_8_DID,    PCI_ANY_ID, PCI_ANY_ID, 0, 0,  6 },
304         { DIGI_VID, PCI_DEV_XR_DID,       PCI_ANY_ID, PCI_ANY_ID, 0, 0,  7 },
305         { DIGI_VID, PCI_DEV_XRJ_DID,      PCI_ANY_ID, PCI_ANY_ID, 0, 0,  8 },
306         { DIGI_VID, PCI_DEV_XR_422_DID,   PCI_ANY_ID, PCI_ANY_ID, 0, 0,  9 },
307         { DIGI_VID, PCI_DEV_XR_IBM_DID,   PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10 },
308         { DIGI_VID, PCI_DEV_XR_SAIP_DID,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11 },
309         { DIGI_VID, PCI_DEV_XR_BULL_DID,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12 },
310         { DIGI_VID, PCI_DEV_920_8_HP_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 },
311         { DIGI_VID, PCI_DEV_XEM_HP_DID,   PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 },
312         {0,}                                    /* 0 terminated list. */
313 };
314 MODULE_DEVICE_TABLE(pci, dgap_pci_tbl);
315
316 /*
317  * A generic list of Product names, PCI Vendor ID, and PCI Device ID.
318  */
319 struct board_id {
320         uint config_type;
321         uchar *name;
322         uint maxports;
323         uint dpatype;
324 };
325
326 static struct board_id dgap_Ids[] = {
327         { PPCM,        PCI_DEV_XEM_NAME,     64, (T_PCXM|T_PCLITE|T_PCIBUS) },
328         { PCX,         PCI_DEV_CX_NAME,     128, (T_CX|T_PCIBUS)            },
329         { PCX,         PCI_DEV_CX_IBM_NAME, 128, (T_CX|T_PCIBUS)            },
330         { PEPC,        PCI_DEV_EPCJ_NAME,   224, (T_EPC|T_PCIBUS)           },
331         { APORT2_920P, PCI_DEV_920_2_NAME,    2, (T_PCXR|T_PCLITE|T_PCIBUS) },
332         { APORT4_920P, PCI_DEV_920_4_NAME,    4, (T_PCXR|T_PCLITE|T_PCIBUS) },
333         { APORT8_920P, PCI_DEV_920_8_NAME,    8, (T_PCXR|T_PCLITE|T_PCIBUS) },
334         { PAPORT8,     PCI_DEV_XR_NAME,       8, (T_PCXR|T_PCLITE|T_PCIBUS) },
335         { PAPORT8,     PCI_DEV_XRJ_NAME,      8, (T_PCXR|T_PCLITE|T_PCIBUS) },
336         { PAPORT8,     PCI_DEV_XR_422_NAME,   8, (T_PCXR|T_PCLITE|T_PCIBUS) },
337         { PAPORT8,     PCI_DEV_XR_IBM_NAME,   8, (T_PCXR|T_PCLITE|T_PCIBUS) },
338         { PAPORT8,     PCI_DEV_XR_SAIP_NAME,  8, (T_PCXR|T_PCLITE|T_PCIBUS) },
339         { PAPORT8,     PCI_DEV_XR_BULL_NAME,  8, (T_PCXR|T_PCLITE|T_PCIBUS) },
340         { APORT8_920P, PCI_DEV_920_8_HP_NAME, 8, (T_PCXR|T_PCLITE|T_PCIBUS) },
341         { PPCM,        PCI_DEV_XEM_HP_NAME,  64, (T_PCXM|T_PCLITE|T_PCIBUS) },
342         {0,}                                            /* 0 terminated list. */
343 };
344
345 static struct pci_driver dgap_driver = {
346         .name           = "dgap",
347         .probe          = dgap_init_one,
348         .id_table       = dgap_pci_tbl,
349         .remove         = dgap_remove_one,
350 };
351
352 struct firmware_info {
353         uchar *conf_name;       /* dgap.conf */
354         uchar *bios_name;       /* BIOS filename */
355         uchar *fep_name;        /* FEP  filename */
356         uchar *con_name;        /* Concentrator filename  FIXME*/
357         int num;                /* sequence number */
358 };
359
360 /*
361  * Firmware - BIOS, FEP, and CONC filenames
362  */
363 static struct firmware_info fw_info[] = {
364         { "dgap/dgap.conf", "dgap/sxbios.bin",  "dgap/sxfep.bin",  0, 0 },
365         { "dgap/dgap.conf", "dgap/cxpbios.bin", "dgap/cxpfep.bin", 0, 1 },
366         { "dgap/dgap.conf", "dgap/cxpbios.bin", "dgap/cxpfep.bin", 0, 2 },
367         { "dgap/dgap.conf", "dgap/pcibios.bin", "dgap/pcifep.bin", 0, 3 },
368         { "dgap/dgap.conf", "dgap/xrbios.bin",  "dgap/xrfep.bin",  0, 4 },
369         { "dgap/dgap.conf", "dgap/xrbios.bin",  "dgap/xrfep.bin",  0, 5 },
370         { "dgap/dgap.conf", "dgap/xrbios.bin",  "dgap/xrfep.bin",  0, 6 },
371         { "dgap/dgap.conf", "dgap/xrbios.bin",  "dgap/xrfep.bin",  0, 7 },
372         { "dgap/dgap.conf", "dgap/xrbios.bin",  "dgap/xrfep.bin",  0, 8 },
373         { "dgap/dgap.conf", "dgap/xrbios.bin",  "dgap/xrfep.bin",  0, 9 },
374         { "dgap/dgap.conf", "dgap/xrbios.bin",  "dgap/xrfep.bin",  0, 10 },
375         { "dgap/dgap.conf", "dgap/xrbios.bin",  "dgap/xrfep.bin",  0, 11 },
376         { "dgap/dgap.conf", "dgap/xrbios.bin",  "dgap/xrfep.bin",  0, 12 },
377         { "dgap/dgap.conf", "dgap/xrbios.bin",  "dgap/xrfep.bin",  0, 13 },
378         { "dgap/dgap.conf", "dgap/sxbios.bin",  "dgap/sxfep.bin",  0, 14 },
379         {0,}
380 };
381
382 static char *dgap_driver_state_text[] = {
383         "Driver Initialized",
384         "Driver needs configuration load.",
385         "Driver requested configuration from download daemon.",
386         "Driver Ready."
387 };
388
389 /*
390  * Default transparent print information.
391  */
392 static struct digi_t dgap_digi_init = {
393         .digi_flags =   DIGI_COOK,      /* Flags                        */
394         .digi_maxcps =  100,            /* Max CPS                      */
395         .digi_maxchar = 50,             /* Max chars in print queue     */
396         .digi_bufsize = 100,            /* Printer buffer size          */
397         .digi_onlen =   4,              /* size of printer on string    */
398         .digi_offlen =  4,              /* size of printer off string   */
399         .digi_onstr =   "\033[5i",      /* ANSI printer on string ]     */
400         .digi_offstr =  "\033[4i",      /* ANSI printer off string ]    */
401         .digi_term =    "ansi"          /* default terminal type        */
402 };
403
404 /*
405  * Define a local default termios struct. All ports will be created
406  * with this termios initially.
407  *
408  * This defines a raw port at 9600 baud, 8 data bits, no parity,
409  * 1 stop bit.
410  */
411
412 static struct ktermios DgapDefaultTermios = {
413         .c_iflag =      (DEFAULT_IFLAGS),       /* iflags */
414         .c_oflag =      (DEFAULT_OFLAGS),       /* oflags */
415         .c_cflag =      (DEFAULT_CFLAGS),       /* cflags */
416         .c_lflag =      (DEFAULT_LFLAGS),       /* lflags */
417         .c_cc =         INIT_C_CC,
418         .c_line =       0,
419 };
420
421 static const struct tty_operations dgap_tty_ops = {
422         .open = dgap_tty_open,
423         .close = dgap_tty_close,
424         .write = dgap_tty_write,
425         .write_room = dgap_tty_write_room,
426         .flush_buffer = dgap_tty_flush_buffer,
427         .chars_in_buffer = dgap_tty_chars_in_buffer,
428         .flush_chars = dgap_tty_flush_chars,
429         .ioctl = dgap_tty_ioctl,
430         .set_termios = dgap_tty_set_termios,
431         .stop = dgap_tty_stop,
432         .start = dgap_tty_start,
433         .throttle = dgap_tty_throttle,
434         .unthrottle = dgap_tty_unthrottle,
435         .hangup = dgap_tty_hangup,
436         .put_char = dgap_tty_put_char,
437         .tiocmget = dgap_tty_tiocmget,
438         .tiocmset = dgap_tty_tiocmset,
439         .break_ctl = dgap_tty_send_break,
440         .wait_until_sent = dgap_tty_wait_until_sent,
441         .send_xchar = dgap_tty_send_xchar
442 };
443
444 /*
445  * Our needed internal static variables from dgap_parse.c
446  */
447 static struct cnode dgap_head;
448 #define MAXCWORD 200
449 static char dgap_cword[MAXCWORD];
450
451 struct toklist {
452         int     token;
453         char    *string;
454 };
455
456 static struct toklist dgap_tlist[] = {
457         { BEGIN,        "config_begin" },
458         { END,          "config_end" },
459         { BOARD,        "board" },
460         { PCX,          "Digi_AccelePort_C/X_PCI" },
461         { PEPC,         "Digi_AccelePort_EPC/X_PCI" },
462         { PPCM,         "Digi_AccelePort_Xem_PCI" },
463         { APORT2_920P,  "Digi_AccelePort_2r_920_PCI" },
464         { APORT4_920P,  "Digi_AccelePort_4r_920_PCI" },
465         { APORT8_920P,  "Digi_AccelePort_8r_920_PCI" },
466         { PAPORT4,      "Digi_AccelePort_4r_PCI(EIA-232/RS-422)" },
467         { PAPORT8,      "Digi_AccelePort_8r_PCI(EIA-232/RS-422)" },
468         { IO,           "io" },
469         { PCIINFO,      "pciinfo" },
470         { LINE,         "line" },
471         { CONC,         "conc" },
472         { CONC,         "concentrator" },
473         { CX,           "cx" },
474         { CX,           "ccon" },
475         { EPC,          "epccon" },
476         { EPC,          "epc" },
477         { MOD,          "module" },
478         { ID,           "id" },
479         { STARTO,       "start" },
480         { SPEED,        "speed" },
481         { CABLE,        "cable" },
482         { CONNECT,      "connect" },
483         { METHOD,       "method" },
484         { STATUS,       "status" },
485         { CUSTOM,       "Custom" },
486         { BASIC,        "Basic" },
487         { MEM,          "mem" },
488         { MEM,          "memory" },
489         { PORTS,        "ports" },
490         { MODEM,        "modem" },
491         { NPORTS,       "nports" },
492         { TTYN,         "ttyname" },
493         { CU,           "cuname" },
494         { PRINT,        "prname" },
495         { CMAJOR,       "major"  },
496         { ALTPIN,       "altpin" },
497         { USEINTR,      "useintr" },
498         { TTSIZ,        "ttysize" },
499         { CHSIZ,        "chsize" },
500         { BSSIZ,        "boardsize" },
501         { UNTSIZ,       "schedsize" },
502         { F2SIZ,        "f2200size" },
503         { VPSIZ,        "vpixsize" },
504         { 0,            NULL }
505 };
506
507 /************************************************************************
508  *
509  * Driver load/unload functions
510  *
511  ************************************************************************/
512
513 /*
514  * init_module()
515  *
516  * Module load.  This is where it all starts.
517  */
518 static int dgap_init_module(void)
519 {
520         int rc = 0;
521
522         pr_info("%s, Digi International Part Number %s\n", DG_NAME, DG_PART);
523
524         dgap_driver_state = DRIVER_NEED_CONFIG_LOAD;
525
526         /*
527          * Initialize global stuff
528          */
529         rc = dgap_start();
530
531         if (rc < 0)
532                 return rc;
533
534         /*
535          * Find and configure all the cards
536          */
537         rc = dgap_init_pci();
538
539         /*
540          * If something went wrong in the scan, bail out of driver.
541          */
542         if (rc < 0) {
543                 /* Only unregister the pci driver if it was actually registered. */
544                 if (dgap_NumBoards)
545                         pci_unregister_driver(&dgap_driver);
546                 else
547                         pr_err("dgap: driver load failed. No boards found.\n");
548
549                 dgap_cleanup_module();
550         } else {
551                 dgap_create_driver_sysfiles(&dgap_driver);
552                 dgap_driver_state = DRIVER_READY;
553         }
554
555         return rc;
556 }
557 module_init(dgap_init_module);
558
559 /*
560  * Start of driver.
561  */
562 static int dgap_start(void)
563 {
564         int rc = 0;
565         unsigned long flags;
566
567         if (dgap_driver_start == FALSE) {
568
569                 dgap_driver_start = TRUE;
570
571                 /*
572                  * make sure that the globals are
573                  * init'd before we do anything else
574                  */
575                 dgap_init_globals();
576
577                 dgap_NumBoards = 0;
578
579                 pr_info("For the tools package please visit http://www.digi.com\n");
580
581                 /*
582                  * Register our base character device into the kernel.
583                  */
584                 if (!dgap_Major_Control_Registered) {
585                         /*
586                          * Register management/dpa devices
587                          */
588                         rc = register_chrdev(DIGI_DGAP_MAJOR, "dgap",
589                                                  &DgapBoardFops);
590                         if (rc < 0)
591                                 return rc;
592
593                         dgap_class = class_create(THIS_MODULE, "dgap_mgmt");
594                         device_create(dgap_class, NULL,
595                                 MKDEV(DIGI_DGAP_MAJOR, 0),
596                                 NULL, "dgap_mgmt");
597                         dgap_Major_Control_Registered = TRUE;
598                 }
599
600                 /*
601                  * Init any global tty stuff.
602                  */
603                 rc = dgap_tty_preinit();
604
605                 if (rc < 0)
606                         return rc;
607
608                 /* Start the poller */
609                 DGAP_LOCK(dgap_poll_lock, flags);
610                 init_timer(&dgap_poll_timer);
611                 dgap_poll_timer.function = dgap_poll_handler;
612                 dgap_poll_timer.data = 0;
613                 dgap_poll_time = jiffies + dgap_jiffies_from_ms(dgap_poll_tick);
614                 dgap_poll_timer.expires = dgap_poll_time;
615                 DGAP_UNLOCK(dgap_poll_lock, flags);
616
617                 add_timer(&dgap_poll_timer);
618
619                 dgap_driver_state = DRIVER_NEED_CONFIG_LOAD;
620         }
621
622         return rc;
623 }
624
625 /*
626  * Register pci driver, and return how many boards we have.
627  */
628 static int dgap_init_pci(void)
629 {
630         return pci_register_driver(&dgap_driver);
631 }
632
633 /* returns count (>= 0), or negative on error */
634 static int dgap_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
635 {
636         int rc;
637
638         /* wake up and enable device */
639         rc = pci_enable_device(pdev);
640
641         if (rc < 0) {
642                 rc = -EIO;
643         } else {
644                 rc = dgap_probe1(pdev, ent->driver_data);
645                 if (rc == 0) {
646                         dgap_NumBoards++;
647                         rc = dgap_firmware_load(pdev, ent->driver_data);
648                 }
649         }
650         return rc;
651 }
652
653 static int dgap_probe1(struct pci_dev *pdev, int card_type)
654 {
655         return dgap_found_board(pdev, card_type);
656 }
657
658 static void dgap_remove_one(struct pci_dev *dev)
659 {
660         /* Do Nothing */
661 }
662
663 /*
664  * dgap_cleanup_module()
665  *
666  * Module unload.  This is where it all ends.
667  */
668 static void dgap_cleanup_module(void)
669 {
670         int i;
671         ulong lock_flags;
672
673         DGAP_LOCK(dgap_poll_lock, lock_flags);
674         dgap_poll_stop = 1;
675         DGAP_UNLOCK(dgap_poll_lock, lock_flags);
676
677         /* Turn off poller right away. */
678         del_timer_sync(&dgap_poll_timer);
679
680         dgap_remove_driver_sysfiles(&dgap_driver);
681
682
683         if (dgap_Major_Control_Registered) {
684                 device_destroy(dgap_class, MKDEV(DIGI_DGAP_MAJOR, 0));
685                 device_destroy(dgap_class, MKDEV(DIGI_DGAP_MAJOR, 1));
686                 class_destroy(dgap_class);
687                 unregister_chrdev(DIGI_DGAP_MAJOR, "dgap");
688         }
689
690         kfree(dgap_config_buf);
691
692         for (i = 0; i < dgap_NumBoards; ++i) {
693                 dgap_remove_ports_sysfiles(dgap_Board[i]);
694                 dgap_tty_uninit(dgap_Board[i]);
695                 dgap_cleanup_board(dgap_Board[i]);
696         }
697
698         dgap_tty_post_uninit();
699
700 #if defined(DGAP_TRACER)
701         /* last thing, make sure we release the tracebuffer */
702         dgap_tracer_free();
703 #endif
704         if (dgap_NumBoards)
705                 pci_unregister_driver(&dgap_driver);
706 }
707
708 /*
709  * dgap_cleanup_board()
710  *
711  * Free all the memory associated with a board
712  */
713 static void dgap_cleanup_board(struct board_t *brd)
714 {
715         int i = 0;
716
717         if (!brd || brd->magic != DGAP_BOARD_MAGIC)
718                 return;
719
720         if (brd->intr_used && brd->irq)
721                 free_irq(brd->irq, brd);
722
723         tasklet_kill(&brd->helper_tasklet);
724
725         if (brd->re_map_port) {
726                 release_mem_region(brd->membase + 0x200000, 0x200000);
727                 iounmap(brd->re_map_port);
728                 brd->re_map_port = NULL;
729         }
730
731         if (brd->re_map_membase) {
732                 release_mem_region(brd->membase, 0x200000);
733                 iounmap(brd->re_map_membase);
734                 brd->re_map_membase = NULL;
735         }
736
737         /* Free all allocated channels structs */
738         for (i = 0; i < MAXPORTS ; i++)
739                 kfree(brd->channels[i]);
740
741         kfree(brd->flipbuf);
742         kfree(brd->flipflagbuf);
743
744         dgap_Board[brd->boardnum] = NULL;
745
746         kfree(brd);
747 }
748
749 /*
750  * dgap_found_board()
751  *
752  * A board has been found, init it.
753  */
754 static int dgap_found_board(struct pci_dev *pdev, int id)
755 {
756         struct board_t *brd;
757         unsigned int pci_irq;
758         int i = 0;
759
760         /* get the board structure and prep it */
761         brd = kzalloc(sizeof(struct board_t), GFP_KERNEL);
762         if (!brd)
763                 return -ENOMEM;
764
765         dgap_Board[dgap_NumBoards] = brd;
766
767         /* store the info for the board we've found */
768         brd->magic = DGAP_BOARD_MAGIC;
769         brd->boardnum = dgap_NumBoards;
770         brd->firstminor = 0;
771         brd->vendor = dgap_pci_tbl[id].vendor;
772         brd->device = dgap_pci_tbl[id].device;
773         brd->pdev = pdev;
774         brd->pci_bus = pdev->bus->number;
775         brd->pci_slot = PCI_SLOT(pdev->devfn);
776         brd->name = dgap_Ids[id].name;
777         brd->maxports = dgap_Ids[id].maxports;
778         brd->type = dgap_Ids[id].config_type;
779         brd->dpatype = dgap_Ids[id].dpatype;
780         brd->dpastatus = BD_NOFEP;
781         init_waitqueue_head(&brd->state_wait);
782
783         DGAP_SPINLOCK_INIT(brd->bd_lock);
784
785         brd->state              = BOARD_FOUND;
786         brd->runwait            = 0;
787         brd->inhibit_poller     = FALSE;
788         brd->wait_for_bios      = 0;
789         brd->wait_for_fep       = 0;
790
791         for (i = 0; i < MAXPORTS; i++)
792                 brd->channels[i] = NULL;
793
794         /* store which card & revision we have */
795         pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &brd->subvendor);
796         pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &brd->subdevice);
797         pci_read_config_byte(pdev, PCI_REVISION_ID, &brd->rev);
798
799         pci_irq = pdev->irq;
800         brd->irq = pci_irq;
801
802         /* get the PCI Base Address Registers */
803
804         /* Xr Jupiter and EPC use BAR 2 */
805         if (brd->device == PCI_DEV_XRJ_DID || brd->device == PCI_DEV_EPCJ_DID) {
806                 brd->membase     = pci_resource_start(pdev, 2);
807                 brd->membase_end = pci_resource_end(pdev, 2);
808         }
809         /* Everyone else uses BAR 0 */
810         else {
811                 brd->membase     = pci_resource_start(pdev, 0);
812                 brd->membase_end = pci_resource_end(pdev, 0);
813         }
814
815         if (!brd->membase)
816                 return -ENODEV;
817
818         if (brd->membase & 1)
819                 brd->membase &= ~3;
820         else
821                 brd->membase &= ~15;
822
823         /*
824          * On the PCI boards, there is no IO space allocated
825          * The I/O registers will be in the first 3 bytes of the
826          * upper 2MB of the 4MB memory space.  The board memory
827          * will be mapped into the low 2MB of the 4MB memory space
828          */
829         brd->port = brd->membase + PCI_IO_OFFSET;
830         brd->port_end = brd->port + PCI_IO_SIZE;
831
832         /*
833          * Special initialization for non-PLX boards
834          */
835         if (brd->device != PCI_DEV_XRJ_DID && brd->device != PCI_DEV_EPCJ_DID) {
836                 unsigned short cmd;
837
838                 pci_write_config_byte(pdev, 0x40, 0);
839                 pci_write_config_byte(pdev, 0x46, 0);
840
841                 /* Limit burst length to 2 doubleword transactions */
842                 pci_write_config_byte(pdev, 0x42, 1);
843
844                 /*
845                  * Enable IO and mem if not already done.
846                  * This was needed for support on Itanium.
847                  */
848                 pci_read_config_word(pdev, PCI_COMMAND, &cmd);
849                 cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
850                 pci_write_config_word(pdev, PCI_COMMAND, cmd);
851         }
852
853         /* init our poll helper tasklet */
854         tasklet_init(&brd->helper_tasklet, dgap_poll_tasklet,
855                         (unsigned long) brd);
856
857         i = dgap_do_remap(brd);
858         if (i)
859                 brd->state = BOARD_FAILED;
860         else
861                 brd->state = NEED_RESET;
862
863         return 0;
864 }
865
866
867 static int dgap_finalize_board_init(struct board_t *brd)
868 {
869         int rc;
870
871         if (!brd || brd->magic != DGAP_BOARD_MAGIC)
872                 return -ENODEV;
873
874         brd->use_interrupts = dgap_config_get_useintr(brd);
875
876         /*
877          * Set up our interrupt handler if we are set to do interrupts.
878          */
879         if (brd->use_interrupts && brd->irq) {
880
881                 rc = request_irq(brd->irq, dgap_intr, IRQF_SHARED, "DGAP", brd);
882
883                 if (rc)
884                         brd->intr_used = 0;
885                 else
886                         brd->intr_used = 1;
887         } else {
888                 brd->intr_used = 0;
889         }
890
891         return 0;
892 }
893
894 static int dgap_firmware_load(struct pci_dev *pdev, int card_type)
895 {
896         struct board_t *brd = dgap_Board[dgap_NumBoards - 1];
897         const struct firmware *fw;
898         int ret;
899
900         dgap_get_vpd(brd);
901         dgap_do_reset_board(brd);
902
903         if ((fw_info[card_type].conf_name) &&
904             (dgap_driver_state == DRIVER_NEED_CONFIG_LOAD)) {
905                 ret = request_firmware(&fw, fw_info[card_type].conf_name,
906                                          &pdev->dev);
907                 if (ret) {
908                         pr_err("dgap: config file %s not found\n",
909                                 fw_info[card_type].conf_name);
910                         return ret;
911                 }
912                 if (!dgap_config_buf) {
913                         dgap_config_buf = kmalloc(fw->size + 1, GFP_ATOMIC);
914                         if (!dgap_config_buf) {
915                                 release_firmware(fw);
916                                 return -ENOMEM;
917                         }
918                 }
919
920                 memcpy(dgap_config_buf, fw->data, fw->size);
921                 release_firmware(fw);
922                 dgap_config_buf[fw->size + 1] = '\0';
923
924                 if (dgap_parsefile(&dgap_config_buf, TRUE) != 0)
925                         return -EINVAL;
926
927                 dgap_driver_state = -1;
928         }
929
930         ret = dgap_after_config_loaded(brd->boardnum);
931         if (ret)
932                 return ret;
933         /*
934          * Match this board to a config the user created for us.
935          */
936         brd->bd_config =
937                 dgap_find_config(brd->type, brd->pci_bus, brd->pci_slot);
938
939         /*
940          * Because the 4 port Xr products share the same PCI ID
941          * as the 8 port Xr products, if we receive a NULL config
942          * back, and this is a PAPORT8 board, retry with a
943          * PAPORT4 attempt as well.
944          */
945         if (brd->type == PAPORT8 && !brd->bd_config)
946                 brd->bd_config =
947                         dgap_find_config(PAPORT4, brd->pci_bus, brd->pci_slot);
948
949         if (!brd->bd_config) {
950                 pr_err("dgap: No valid configuration found\n");
951                 return -EINVAL;
952         }
953
954         dgap_tty_register(brd);
955         dgap_finalize_board_init(brd);
956
957         if (fw_info[card_type].bios_name) {
958                 ret = request_firmware(&fw, fw_info[card_type].bios_name,
959                                         &pdev->dev);
960                 if (ret) {
961                         pr_err("dgap: bios file %s not found\n",
962                                 fw_info[card_type].bios_name);
963                         return ret;
964                 }
965                 dgap_do_bios_load(brd, (char *)fw->data, fw->size);
966                 release_firmware(fw);
967
968                 /* Wait for BIOS to test board... */
969                 dgap_do_wait_for_bios(brd);
970
971                 if (brd->state != FINISHED_BIOS_LOAD)
972                         return -ENXIO;
973         }
974
975         if (fw_info[card_type].fep_name) {
976                 ret = request_firmware(&fw, fw_info[card_type].fep_name,
977                                         &pdev->dev);
978                 if (ret) {
979                         pr_err("dgap: fep file %s not found\n",
980                                 fw_info[card_type].fep_name);
981                         return ret;
982                 }
983                 dgap_do_fep_load(brd, (char *)fw->data, fw->size);
984                 release_firmware(fw);
985
986                 /* Wait for FEP to load on board... */
987                 dgap_do_wait_for_fep(brd);
988
989                 if (brd->state != FINISHED_FEP_LOAD)
990                         return -ENXIO;
991         }
992
993 #ifdef DIGI_CONCENTRATORS_SUPPORTED
994         /*
995          * If this is a CX or EPCX, we need to see if the firmware
996          * is requesting a concentrator image from us.
997          */
998         if ((bd->type == PCX) || (bd->type == PEPC)) {
999                 chk_addr = (u16 *) (vaddr + DOWNREQ);
1000                 /* Nonzero if FEP is requesting concentrator image. */
1001                 check = readw(chk_addr);
1002                 vaddr = brd->re_map_membase;
1003         }
1004
1005         if (fw_info[card_type].con_name && check && vaddr) {
1006                 ret = request_firmware(&fw, fw_info[card_type].con_name,
1007                                         &pdev->dev);
1008                 if (ret) {
1009                         pr_err("dgap: conc file %s not found\n",
1010                                 fw_info[card_type].con_name);
1011                         return ret;
1012                 }
1013                 /* Put concentrator firmware loading code here */
1014                 offset = readw((u16 *) (vaddr + DOWNREQ));
1015                 memcpy_toio(offset, fw->data, fw->size);
1016
1017                 dgap_do_conc_load(brd, (char *)fw->data, fw->size)
1018                 release_firmware(fw);
1019         }
1020 #endif
1021         /*
1022          * Do tty device initialization.
1023          */
1024         ret = dgap_tty_init(brd);
1025         if (ret < 0) {
1026                 dgap_tty_uninit(brd);
1027                 return ret;
1028         }
1029
1030         ret = dgap_tty_register_ports(brd);
1031         if (ret)
1032                 return ret;
1033
1034         brd->state = BOARD_READY;
1035         brd->dpastatus = BD_RUNNING;
1036
1037         return 0;
1038 }
1039
1040 /*
1041  * Remap PCI memory.
1042  */
1043 static int dgap_do_remap(struct board_t *brd)
1044 {
1045         if (!brd || brd->magic != DGAP_BOARD_MAGIC)
1046                 return -ENXIO;
1047
1048         if (!request_mem_region(brd->membase, 0x200000, "dgap"))
1049                 return -ENOMEM;
1050
1051         if (!request_mem_region(brd->membase + PCI_IO_OFFSET, 0x200000,
1052                                         "dgap")) {
1053                 release_mem_region(brd->membase, 0x200000);
1054                 return -ENOMEM;
1055         }
1056
1057         brd->re_map_membase = ioremap(brd->membase, 0x200000);
1058         if (!brd->re_map_membase) {
1059                 release_mem_region(brd->membase, 0x200000);
1060                 release_mem_region(brd->membase + PCI_IO_OFFSET, 0x200000);
1061                 return -ENOMEM;
1062         }
1063
1064         brd->re_map_port = ioremap((brd->membase + PCI_IO_OFFSET), 0x200000);
1065         if (!brd->re_map_port) {
1066                 release_mem_region(brd->membase, 0x200000);
1067                 release_mem_region(brd->membase + PCI_IO_OFFSET, 0x200000);
1068                 iounmap(brd->re_map_membase);
1069                 return -ENOMEM;
1070         }
1071
1072         return 0;
1073 }
1074
1075 /*****************************************************************************
1076 *
1077 * Function:
1078 *
1079 *    dgap_poll_handler
1080 *
1081 * Author:
1082 *
1083 *    Scott H Kilau
1084 *
1085 * Parameters:
1086 *
1087 *    dummy -- ignored
1088 *
1089 * Return Values:
1090 *
1091 *    none
1092 *
1093 * Description:
1094 *
1095 *    As each timer expires, it determines (a) whether the "transmit"
1096 *    waiter needs to be woken up, and (b) whether the poller needs to
1097 *    be rescheduled.
1098 *
1099 ******************************************************************************/
1100
1101 static void dgap_poll_handler(ulong dummy)
1102 {
1103         int i;
1104         struct board_t *brd;
1105         unsigned long lock_flags;
1106         ulong new_time;
1107
1108         dgap_poll_counter++;
1109
1110         /*
1111          * Do not start the board state machine until
1112          * driver tells us its up and running, and has
1113          * everything it needs.
1114          */
1115         if (dgap_driver_state != DRIVER_READY)
1116                 goto schedule_poller;
1117
1118         /*
1119          * If we have just 1 board, or the system is not SMP,
1120          * then use the typical old style poller.
1121          * Otherwise, use our new tasklet based poller, which should
1122          * speed things up for multiple boards.
1123          */
1124         if ((dgap_NumBoards == 1) || (num_online_cpus() <= 1)) {
1125                 for (i = 0; i < dgap_NumBoards; i++) {
1126
1127                         brd = dgap_Board[i];
1128
1129                         if (brd->state == BOARD_FAILED)
1130                                 continue;
1131                         if (!brd->intr_running)
1132                                 /* Call the real board poller directly */
1133                                 dgap_poll_tasklet((unsigned long) brd);
1134                 }
1135         } else {
1136                 /*
1137                  * Go thru each board, kicking off a
1138                  * tasklet for each if needed
1139                  */
1140                 for (i = 0; i < dgap_NumBoards; i++) {
1141                         brd = dgap_Board[i];
1142
1143                         /*
1144                          * Attempt to grab the board lock.
1145                          *
1146                          * If we can't get it, no big deal, the next poll
1147                          * will get it. Basically, I just really don't want
1148                          * to spin in here, because I want to kick off my
1149                          * tasklets as fast as I can, and then get out the
1150                          * poller.
1151                          */
1152                         if (!spin_trylock(&brd->bd_lock))
1153                                 continue;
1154
1155                         /*
1156                          * If board is in a failed state, don't bother
1157                          *  scheduling a tasklet
1158                          */
1159                         if (brd->state == BOARD_FAILED) {
1160                                 spin_unlock(&brd->bd_lock);
1161                                 continue;
1162                         }
1163
1164                         /* Schedule a poll helper task */
1165                         if (!brd->intr_running)
1166                                 tasklet_schedule(&brd->helper_tasklet);
1167
1168                         /*
1169                          * Can't do DGAP_UNLOCK here, as we don't have
1170                          * lock_flags because we did a trylock above.
1171                          */
1172                         spin_unlock(&brd->bd_lock);
1173                 }
1174         }
1175
1176 schedule_poller:
1177
1178         /*
1179          * Schedule ourself back at the nominal wakeup interval.
1180          */
1181         DGAP_LOCK(dgap_poll_lock, lock_flags);
1182         dgap_poll_time +=  dgap_jiffies_from_ms(dgap_poll_tick);
1183
1184         new_time = dgap_poll_time - jiffies;
1185
1186         if ((ulong) new_time >= 2 * dgap_poll_tick) {
1187                 dgap_poll_time =
1188                         jiffies +  dgap_jiffies_from_ms(dgap_poll_tick);
1189         }
1190
1191         dgap_poll_timer.function = dgap_poll_handler;
1192         dgap_poll_timer.data = 0;
1193         dgap_poll_timer.expires = dgap_poll_time;
1194         DGAP_UNLOCK(dgap_poll_lock, lock_flags);
1195
1196         if (!dgap_poll_stop)
1197                 add_timer(&dgap_poll_timer);
1198 }
1199
1200 /*
1201  * dgap_intr()
1202  *
1203  * Driver interrupt handler.
1204  */
1205 static irqreturn_t dgap_intr(int irq, void *voidbrd)
1206 {
1207         struct board_t *brd = (struct board_t *) voidbrd;
1208
1209         if (!brd)
1210                 return IRQ_NONE;
1211
1212         /*
1213          * Check to make sure its for us.
1214          */
1215         if (brd->magic != DGAP_BOARD_MAGIC)
1216                 return IRQ_NONE;
1217
1218         brd->intr_count++;
1219
1220         /*
1221          * Schedule tasklet to run at a better time.
1222          */
1223         tasklet_schedule(&brd->helper_tasklet);
1224         return IRQ_HANDLED;
1225 }
1226
1227 /*
1228  * dgap_init_globals()
1229  *
1230  * This is where we initialize the globals from the static insmod
1231  * configuration variables.  These are declared near the head of
1232  * this file.
1233  */
1234 static void dgap_init_globals(void)
1235 {
1236         int i = 0;
1237
1238         for (i = 0; i < MAXBOARDS; i++)
1239                 dgap_Board[i] = NULL;
1240
1241         init_timer(&dgap_poll_timer);
1242
1243         init_waitqueue_head(&dgap_dl_wait);
1244         dgap_dl_action = 0;
1245 }
1246
1247 /************************************************************************
1248  *
1249  * Utility functions
1250  *
1251  ************************************************************************/
1252
1253 /*
1254  * dgap_ms_sleep()
1255  *
1256  * Put the driver to sleep for x ms's
1257  *
1258  * Returns 0 if timed out, !0 (showing signal) if interrupted by a signal.
1259  */
1260 static int dgap_ms_sleep(ulong ms)
1261 {
1262         current->state = TASK_INTERRUPTIBLE;
1263         schedule_timeout((ms * HZ) / 1000);
1264         return signal_pending(current);
1265 }
1266
1267 /************************************************************************
1268  *
1269  * TTY Initialization/Cleanup Functions
1270  *
1271  ************************************************************************/
1272
1273 /*
1274  * dgap_tty_preinit()
1275  *
1276  * Initialize any global tty related data before we download any boards.
1277  */
1278 static int dgap_tty_preinit(void)
1279 {
1280         /*
1281          * Allocate a buffer for doing the copy from user space to
1282          * kernel space in dgap_input().  We only use one buffer and
1283          * control access to it with a semaphore.  If we are paging, we
1284          * are already in trouble so one buffer won't hurt much anyway.
1285          */
1286         dgap_TmpWriteBuf = kmalloc(WRITEBUFLEN, GFP_ATOMIC);
1287
1288         if (!dgap_TmpWriteBuf)
1289                 return -ENOMEM;
1290
1291         return 0;
1292 }
1293
1294 /*
1295  * dgap_tty_register()
1296  *
1297  * Init the tty subsystem for this board.
1298  */
1299 static int dgap_tty_register(struct board_t *brd)
1300 {
1301         int rc = 0;
1302
1303         brd->SerialDriver = alloc_tty_driver(MAXPORTS);
1304
1305         snprintf(brd->SerialName, MAXTTYNAMELEN, "tty_dgap_%d_", brd->boardnum);
1306         brd->SerialDriver->name = brd->SerialName;
1307         brd->SerialDriver->name_base = 0;
1308         brd->SerialDriver->major = 0;
1309         brd->SerialDriver->minor_start = 0;
1310         brd->SerialDriver->type = TTY_DRIVER_TYPE_SERIAL;
1311         brd->SerialDriver->subtype = SERIAL_TYPE_NORMAL;
1312         brd->SerialDriver->init_termios = DgapDefaultTermios;
1313         brd->SerialDriver->driver_name = DRVSTR;
1314         brd->SerialDriver->flags = (TTY_DRIVER_REAL_RAW |
1315                                     TTY_DRIVER_DYNAMIC_DEV |
1316                                     TTY_DRIVER_HARDWARE_BREAK);
1317
1318         /* The kernel wants space to store pointers to tty_structs */
1319         brd->SerialDriver->ttys =
1320                 kzalloc(MAXPORTS * sizeof(struct tty_struct *), GFP_KERNEL);
1321         if (!brd->SerialDriver->ttys)
1322                 return -ENOMEM;
1323
1324         /*
1325          * Entry points for driver.  Called by the kernel from
1326          * tty_io.c and n_tty.c.
1327          */
1328         tty_set_operations(brd->SerialDriver, &dgap_tty_ops);
1329
1330         /*
1331          * If we're doing transparent print, we have to do all of the above
1332          * again, separately so we don't get the LD confused about what major
1333          * we are when we get into the dgap_tty_open() routine.
1334          */
1335         brd->PrintDriver = alloc_tty_driver(MAXPORTS);
1336
1337         snprintf(brd->PrintName, MAXTTYNAMELEN, "pr_dgap_%d_", brd->boardnum);
1338         brd->PrintDriver->name = brd->PrintName;
1339         brd->PrintDriver->name_base = 0;
1340         brd->PrintDriver->major = 0;
1341         brd->PrintDriver->minor_start = 0;
1342         brd->PrintDriver->type = TTY_DRIVER_TYPE_SERIAL;
1343         brd->PrintDriver->subtype = SERIAL_TYPE_NORMAL;
1344         brd->PrintDriver->init_termios = DgapDefaultTermios;
1345         brd->PrintDriver->driver_name = DRVSTR;
1346         brd->PrintDriver->flags = (TTY_DRIVER_REAL_RAW |
1347                                    TTY_DRIVER_DYNAMIC_DEV |
1348                                    TTY_DRIVER_HARDWARE_BREAK);
1349
1350         /* The kernel wants space to store pointers to tty_structs */
1351         brd->PrintDriver->ttys =
1352                 kzalloc(MAXPORTS * sizeof(struct tty_struct *), GFP_KERNEL);
1353         if (!brd->PrintDriver->ttys)
1354                 return -ENOMEM;
1355
1356         /*
1357          * Entry points for driver.  Called by the kernel from
1358          * tty_io.c and n_tty.c.
1359          */
1360         tty_set_operations(brd->PrintDriver, &dgap_tty_ops);
1361
1362         if (!brd->dgap_Major_Serial_Registered) {
1363                 /* Register tty devices */
1364                 rc = tty_register_driver(brd->SerialDriver);
1365                 if (rc < 0)
1366                         return rc;
1367                 brd->dgap_Major_Serial_Registered = TRUE;
1368                 dgap_BoardsByMajor[brd->SerialDriver->major] = brd;
1369                 brd->dgap_Serial_Major = brd->SerialDriver->major;
1370         }
1371
1372         if (!brd->dgap_Major_TransparentPrint_Registered) {
1373                 /* Register Transparent Print devices */
1374                 rc = tty_register_driver(brd->PrintDriver);
1375                 if (rc < 0)
1376                         return rc;
1377                 brd->dgap_Major_TransparentPrint_Registered = TRUE;
1378                 dgap_BoardsByMajor[brd->PrintDriver->major] = brd;
1379                 brd->dgap_TransparentPrint_Major = brd->PrintDriver->major;
1380         }
1381
1382         return rc;
1383 }
1384
1385 /*
1386  * dgap_tty_init()
1387  *
1388  * Init the tty subsystem.  Called once per board after board has been
1389  * downloaded and init'ed.
1390  */
1391 static int dgap_tty_init(struct board_t *brd)
1392 {
1393         int i;
1394         int tlw;
1395         uint true_count = 0;
1396         uchar *vaddr;
1397         uchar modem = 0;
1398         struct channel_t *ch;
1399         struct bs_t *bs;
1400         struct cm_t *cm;
1401
1402         if (!brd)
1403                 return -ENXIO;
1404
1405         /*
1406          * Initialize board structure elements.
1407          */
1408
1409         vaddr = brd->re_map_membase;
1410         true_count = readw((vaddr + NCHAN));
1411
1412         brd->nasync = dgap_config_get_number_of_ports(brd);
1413
1414         if (!brd->nasync)
1415                 brd->nasync = brd->maxports;
1416
1417         if (brd->nasync > brd->maxports)
1418                 brd->nasync = brd->maxports;
1419
1420         if (true_count != brd->nasync) {
1421                 if ((brd->type == PPCM) && (true_count == 64)) {
1422                         pr_warn("dgap: %s configured for %d ports, has %d ports.\n",
1423                                 brd->name, brd->nasync, true_count);
1424                         pr_warn("dgap: Please make SURE the EBI cable running from the card\n");
1425                         pr_warn("dgap: to each EM module is plugged into EBI IN!\n");
1426                 } else if ((brd->type == PPCM) && (true_count == 0)) {
1427                         pr_warn("dgap: %s configured for %d ports, has %d ports.\n",
1428                                 brd->name, brd->nasync, true_count);
1429                         pr_warn("dgap: Please make SURE the EBI cable running from the card\n");
1430                         pr_warn("dgap: to each EM module is plugged into EBI IN!\n");
1431                 } else
1432                         pr_warn("dgap: %s configured for %d ports, has %d ports.\n",
1433                                 brd->name, brd->nasync, true_count);
1434
1435                 brd->nasync = true_count;
1436
1437                 /* If no ports, don't bother going any further */
1438                 if (!brd->nasync) {
1439                         brd->state = BOARD_FAILED;
1440                         brd->dpastatus = BD_NOFEP;
1441                         return -ENXIO;
1442                 }
1443         }
1444
1445         /*
1446          * Allocate channel memory that might not have been allocated
1447          * when the driver was first loaded.
1448          */
1449         for (i = 0; i < brd->nasync; i++) {
1450                 if (!brd->channels[i]) {
1451                         brd->channels[i] =
1452                                 kzalloc(sizeof(struct channel_t), GFP_ATOMIC);
1453                         if (!brd->channels[i])
1454                                 return -ENOMEM;
1455                 }
1456         }
1457
1458         ch = brd->channels[0];
1459         vaddr = brd->re_map_membase;
1460
1461         bs = (struct bs_t *) ((ulong) vaddr + CHANBUF);
1462         cm = (struct cm_t *) ((ulong) vaddr + CMDBUF);
1463
1464         brd->bd_bs = bs;
1465
1466         /* Set up channel variables */
1467         for (i = 0; i < brd->nasync; i++, ch = brd->channels[i], bs++) {
1468
1469                 if (!brd->channels[i])
1470                         continue;
1471
1472                 DGAP_SPINLOCK_INIT(ch->ch_lock);
1473
1474                 /* Store all our magic numbers */
1475                 ch->magic = DGAP_CHANNEL_MAGIC;
1476                 ch->ch_tun.magic = DGAP_UNIT_MAGIC;
1477                 ch->ch_tun.un_type = DGAP_SERIAL;
1478                 ch->ch_tun.un_ch = ch;
1479                 ch->ch_tun.un_dev = i;
1480
1481                 ch->ch_pun.magic = DGAP_UNIT_MAGIC;
1482                 ch->ch_pun.un_type = DGAP_PRINT;
1483                 ch->ch_pun.un_ch = ch;
1484                 ch->ch_pun.un_dev = i;
1485
1486                 ch->ch_vaddr = vaddr;
1487                 ch->ch_bs = bs;
1488                 ch->ch_cm = cm;
1489                 ch->ch_bd = brd;
1490                 ch->ch_portnum = i;
1491                 ch->ch_digi = dgap_digi_init;
1492
1493                 /*
1494                  * Set up digi dsr and dcd bits based on altpin flag.
1495                  */
1496                 if (dgap_config_get_altpin(brd)) {
1497                         ch->ch_dsr      = DM_CD;
1498                         ch->ch_cd       = DM_DSR;
1499                         ch->ch_digi.digi_flags |= DIGI_ALTPIN;
1500                 } else {
1501                         ch->ch_cd       = DM_CD;
1502                         ch->ch_dsr      = DM_DSR;
1503                 }
1504
1505                 ch->ch_taddr = vaddr + ((ch->ch_bs->tx_seg) << 4);
1506                 ch->ch_raddr = vaddr + ((ch->ch_bs->rx_seg) << 4);
1507                 ch->ch_tx_win = 0;
1508                 ch->ch_rx_win = 0;
1509                 ch->ch_tsize = readw(&(ch->ch_bs->tx_max)) + 1;
1510                 ch->ch_rsize = readw(&(ch->ch_bs->rx_max)) + 1;
1511                 ch->ch_tstart = 0;
1512                 ch->ch_rstart = 0;
1513
1514                 /* .25 second delay */
1515                 ch->ch_close_delay = 250;
1516
1517                 /*
1518                  * Set queue water marks, interrupt mask,
1519                  * and general tty parameters.
1520                  */
1521                 tlw = ch->ch_tsize >= 2000 ? ((ch->ch_tsize * 5) / 8) :
1522                                                 ch->ch_tsize / 2;
1523                 ch->ch_tlw = tlw;
1524
1525                 dgap_cmdw(ch, STLOW, tlw, 0);
1526
1527                 dgap_cmdw(ch, SRLOW, ch->ch_rsize / 2, 0);
1528
1529                 dgap_cmdw(ch, SRHIGH, 7 * ch->ch_rsize / 8, 0);
1530
1531                 ch->ch_mistat = readb(&(ch->ch_bs->m_stat));
1532
1533                 init_waitqueue_head(&ch->ch_flags_wait);
1534                 init_waitqueue_head(&ch->ch_tun.un_flags_wait);
1535                 init_waitqueue_head(&ch->ch_pun.un_flags_wait);
1536                 init_waitqueue_head(&ch->ch_sniff_wait);
1537
1538                 /* Turn on all modem interrupts for now */
1539                 modem = (DM_CD | DM_DSR | DM_CTS | DM_RI);
1540                 writeb(modem, &(ch->ch_bs->m_int));
1541
1542                 /*
1543                  * Set edelay to 0 if interrupts are turned on,
1544                  * otherwise set edelay to the usual 100.
1545                  */
1546                 if (brd->intr_used)
1547                         writew(0, &(ch->ch_bs->edelay));
1548                 else
1549                         writew(100, &(ch->ch_bs->edelay));
1550
1551                 writeb(1, &(ch->ch_bs->idata));
1552         }
1553
1554         return 0;
1555 }
1556
1557 /*
1558  * dgap_tty_post_uninit()
1559  *
1560  * UnInitialize any global tty related data.
1561  */
1562 static void dgap_tty_post_uninit(void)
1563 {
1564         kfree(dgap_TmpWriteBuf);
1565         dgap_TmpWriteBuf = NULL;
1566 }
1567
1568 /*
1569  * dgap_tty_uninit()
1570  *
1571  * Uninitialize the TTY portion of this driver.  Free all memory and
1572  * resources.
1573  */
1574 static void dgap_tty_uninit(struct board_t *brd)
1575 {
1576         struct device *dev;
1577         int i = 0;
1578
1579         if (brd->dgap_Major_Serial_Registered) {
1580                 dgap_BoardsByMajor[brd->SerialDriver->major] = NULL;
1581                 brd->dgap_Serial_Major = 0;
1582                 for (i = 0; i < brd->nasync; i++) {
1583                         tty_port_destroy(&brd->SerialPorts[i]);
1584                         dev = brd->channels[i]->ch_tun.un_sysfs;
1585                         dgap_remove_tty_sysfs(dev);
1586                         tty_unregister_device(brd->SerialDriver, i);
1587                 }
1588                 tty_unregister_driver(brd->SerialDriver);
1589                 kfree(brd->SerialDriver->ttys);
1590                 brd->SerialDriver->ttys = NULL;
1591                 put_tty_driver(brd->SerialDriver);
1592                 kfree(brd->SerialPorts);
1593                 brd->dgap_Major_Serial_Registered = FALSE;
1594         }
1595
1596         if (brd->dgap_Major_TransparentPrint_Registered) {
1597                 dgap_BoardsByMajor[brd->PrintDriver->major] = NULL;
1598                 brd->dgap_TransparentPrint_Major = 0;
1599                 for (i = 0; i < brd->nasync; i++) {
1600                         tty_port_destroy(&brd->PrinterPorts[i]);
1601                         dev = brd->channels[i]->ch_pun.un_sysfs;
1602                         dgap_remove_tty_sysfs(dev);
1603                         tty_unregister_device(brd->PrintDriver, i);
1604                 }
1605                 tty_unregister_driver(brd->PrintDriver);
1606                 kfree(brd->PrintDriver->ttys);
1607                 brd->PrintDriver->ttys = NULL;
1608                 put_tty_driver(brd->PrintDriver);
1609                 kfree(brd->PrinterPorts);
1610                 brd->dgap_Major_TransparentPrint_Registered = FALSE;
1611         }
1612 }
1613
1614 #define TMPBUFLEN (1024)
1615 /*
1616  * dgap_sniff - Dump data out to the "sniff" buffer if the
1617  * proc sniff file is opened...
1618  */
1619 static void dgap_sniff_nowait_nolock(struct channel_t *ch, uchar *text,
1620                                      uchar *buf, int len)
1621 {
1622         struct timeval tv;
1623         int n;
1624         int r;
1625         int nbuf;
1626         int i;
1627         int tmpbuflen;
1628         char tmpbuf[TMPBUFLEN];
1629         char *p = tmpbuf;
1630         int too_much_data;
1631
1632         /* Leave if sniff not open */
1633         if (!(ch->ch_sniff_flags & SNIFF_OPEN))
1634                 return;
1635
1636         do_gettimeofday(&tv);
1637
1638         /* Create our header for data dump */
1639         p += sprintf(p, "<%ld %ld><%s><", tv.tv_sec, tv.tv_usec, text);
1640         tmpbuflen = p - tmpbuf;
1641
1642         do {
1643                 too_much_data = 0;
1644
1645                 for (i = 0; i < len && tmpbuflen < (TMPBUFLEN - 4); i++) {
1646                         p += sprintf(p, "%02x ", *buf);
1647                         buf++;
1648                         tmpbuflen = p - tmpbuf;
1649                 }
1650
1651                 if (tmpbuflen < (TMPBUFLEN - 4)) {
1652                         if (i > 0)
1653                                 p += sprintf(p - 1, "%s\n", ">");
1654                         else
1655                                 p += sprintf(p, "%s\n", ">");
1656                 } else {
1657                         too_much_data = 1;
1658                         len -= i;
1659                 }
1660
1661                 nbuf = strlen(tmpbuf);
1662                 p = tmpbuf;
1663
1664                 /*
1665                  *  Loop while data remains.
1666                  */
1667                 while (nbuf > 0 && ch->ch_sniff_buf) {
1668                         /*
1669                          *  Determine the amount of available space left in the
1670                          *  buffer.  If there's none, wait until some appears.
1671                          */
1672                         n = (ch->ch_sniff_out - ch->ch_sniff_in - 1) &
1673                              SNIFF_MASK;
1674
1675                         /*
1676                          * If there is no space left to write to in our sniff
1677                          * buffer, we have no choice but to drop the data.
1678                          * We *cannot* sleep here waiting for space, because
1679                          * this function was probably called by the
1680                          * interrupt/timer routines!
1681                          */
1682                         if (n == 0)
1683                                 return;
1684
1685                         /*
1686                          * Copy as much data as will fit.
1687                          */
1688
1689                         if (n > nbuf)
1690                                 n = nbuf;
1691
1692                         r = SNIFF_MAX - ch->ch_sniff_in;
1693
1694                         if (r <= n) {
1695                                 memcpy(ch->ch_sniff_buf + ch->ch_sniff_in, p, r);
1696
1697                                 n -= r;
1698                                 ch->ch_sniff_in = 0;
1699                                 p += r;
1700                                 nbuf -= r;
1701                         }
1702
1703                         memcpy(ch->ch_sniff_buf + ch->ch_sniff_in, p, n);
1704
1705                         ch->ch_sniff_in += n;
1706                         p += n;
1707                         nbuf -= n;
1708
1709                         /*
1710                          *  Wakeup any thread waiting for data
1711                          */
1712                         if (ch->ch_sniff_flags & SNIFF_WAIT_DATA) {
1713                                 ch->ch_sniff_flags &= ~SNIFF_WAIT_DATA;
1714                                 wake_up_interruptible(&ch->ch_sniff_wait);
1715                         }
1716                 }
1717
1718                 /*
1719                  * If the user sent us too much data to push into our tmpbuf,
1720                  * we need to keep looping around on all the data.
1721                  */
1722                 if (too_much_data) {
1723                         p = tmpbuf;
1724                         tmpbuflen = 0;
1725                 }
1726
1727         } while (too_much_data);
1728 }
1729
1730 /*=======================================================================
1731  *
1732  *      dgap_input - Process received data.
1733  *
1734  *              ch      - Pointer to channel structure.
1735  *
1736  *=======================================================================*/
1737
1738 static void dgap_input(struct channel_t *ch)
1739 {
1740         struct board_t *bd;
1741         struct bs_t     *bs;
1742         struct tty_struct *tp;
1743         struct tty_ldisc *ld;
1744         uint    rmask;
1745         uint    head;
1746         uint    tail;
1747         int     data_len;
1748         ulong   lock_flags;
1749         ulong   lock_flags2;
1750         int flip_len;
1751         int len = 0;
1752         int n = 0;
1753         uchar *buf;
1754         uchar tmpchar;
1755         int s = 0;
1756
1757         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
1758                 return;
1759
1760         tp = ch->ch_tun.un_tty;
1761
1762         bs  = ch->ch_bs;
1763         if (!bs)
1764                 return;
1765
1766         bd = ch->ch_bd;
1767         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
1768                 return;
1769
1770         DGAP_LOCK(bd->bd_lock, lock_flags);
1771         DGAP_LOCK(ch->ch_lock, lock_flags2);
1772
1773         /*
1774          *      Figure the number of characters in the buffer.
1775          *      Exit immediately if none.
1776          */
1777
1778         rmask = ch->ch_rsize - 1;
1779
1780         head = readw(&(bs->rx_head));
1781         head &= rmask;
1782         tail = readw(&(bs->rx_tail));
1783         tail &= rmask;
1784
1785         data_len = (head - tail) & rmask;
1786
1787         if (data_len == 0) {
1788                 writeb(1, &(bs->idata));
1789                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
1790                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
1791                 return;
1792         }
1793
1794         /*
1795          * If the device is not open, or CREAD is off, flush
1796          * input data and return immediately.
1797          */
1798         if ((bd->state != BOARD_READY) || !tp  ||
1799             (tp->magic != TTY_MAGIC) ||
1800             !(ch->ch_tun.un_flags & UN_ISOPEN) ||
1801             !(tp->termios.c_cflag & CREAD) ||
1802             (ch->ch_tun.un_flags & UN_CLOSING)) {
1803
1804                 writew(head, &(bs->rx_tail));
1805                 writeb(1, &(bs->idata));
1806                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
1807                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
1808                 return;
1809         }
1810
1811         /*
1812          * If we are throttled, simply don't read any data.
1813          */
1814         if (ch->ch_flags & CH_RXBLOCK) {
1815                 writeb(1, &(bs->idata));
1816                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
1817                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
1818                 return;
1819         }
1820
1821         /*
1822          *      Ignore oruns.
1823          */
1824         tmpchar = readb(&(bs->orun));
1825         if (tmpchar) {
1826                 ch->ch_err_overrun++;
1827                 writeb(0, &(bs->orun));
1828         }
1829
1830         /* Decide how much data we can send into the tty layer */
1831         flip_len = TTY_FLIPBUF_SIZE;
1832
1833         /* Chop down the length, if needed */
1834         len = min(data_len, flip_len);
1835         len = min(len, (N_TTY_BUF_SIZE - 1));
1836
1837         ld = tty_ldisc_ref(tp);
1838
1839 #ifdef TTY_DONT_FLIP
1840         /*
1841          * If the DONT_FLIP flag is on, don't flush our buffer, and act
1842          * like the ld doesn't have any space to put the data right now.
1843          */
1844         if (test_bit(TTY_DONT_FLIP, &tp->flags))
1845                 len = 0;
1846 #endif
1847
1848         /*
1849          * If we were unable to get a reference to the ld,
1850          * don't flush our buffer, and act like the ld doesn't
1851          * have any space to put the data right now.
1852          */
1853         if (!ld) {
1854                 len = 0;
1855         } else {
1856                 /*
1857                  * If ld doesn't have a pointer to a receive_buf function,
1858                  * flush the data, then act like the ld doesn't have any
1859                  * space to put the data right now.
1860                  */
1861                 if (!ld->ops->receive_buf) {
1862                         writew(head, &(bs->rx_tail));
1863                         len = 0;
1864                 }
1865         }
1866
1867         if (len <= 0) {
1868                 writeb(1, &(bs->idata));
1869                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
1870                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
1871                 if (ld)
1872                         tty_ldisc_deref(ld);
1873                 return;
1874         }
1875
1876         buf = ch->ch_bd->flipbuf;
1877         n = len;
1878
1879         /*
1880          * n now contains the most amount of data we can copy,
1881          * bounded either by our buffer size or the amount
1882          * of data the card actually has pending...
1883          */
1884         while (n) {
1885
1886                 s = ((head >= tail) ? head : ch->ch_rsize) - tail;
1887                 s = min(s, n);
1888
1889                 if (s <= 0)
1890                         break;
1891
1892                 memcpy_fromio(buf, (char *) ch->ch_raddr + tail, s);
1893                 dgap_sniff_nowait_nolock(ch, "USER READ", buf, s);
1894
1895                 tail += s;
1896                 buf += s;
1897
1898                 n -= s;
1899                 /* Flip queue if needed */
1900                 tail &= rmask;
1901         }
1902
1903         writew(tail, &(bs->rx_tail));
1904         writeb(1, &(bs->idata));
1905         ch->ch_rxcount += len;
1906
1907         /*
1908          * If we are completely raw, we don't need to go through a lot
1909          * of the tty layers that exist.
1910          * In this case, we take the shortest and fastest route we
1911          * can to relay the data to the user.
1912          *
1913          * On the other hand, if we are not raw, we need to go through
1914          * the tty layer, which has its API more well defined.
1915          */
1916         if (I_PARMRK(tp) || I_BRKINT(tp) || I_INPCK(tp)) {
1917                 dgap_parity_scan(ch, ch->ch_bd->flipbuf,
1918                                  ch->ch_bd->flipflagbuf, &len);
1919
1920                 len = tty_buffer_request_room(tp->port, len);
1921                 tty_insert_flip_string_flags(tp->port, ch->ch_bd->flipbuf,
1922                         ch->ch_bd->flipflagbuf, len);
1923         } else {
1924                 len = tty_buffer_request_room(tp->port, len);
1925                 tty_insert_flip_string(tp->port, ch->ch_bd->flipbuf, len);
1926         }
1927
1928         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
1929         DGAP_UNLOCK(bd->bd_lock, lock_flags);
1930
1931         /* Tell the tty layer its okay to "eat" the data now */
1932         tty_flip_buffer_push(tp->port);
1933
1934         if (ld)
1935                 tty_ldisc_deref(ld);
1936
1937 }
1938
1939 /************************************************************************
1940  * Determines when CARRIER changes state and takes appropriate
1941  * action.
1942  ************************************************************************/
1943 static void dgap_carrier(struct channel_t *ch)
1944 {
1945         struct board_t *bd;
1946
1947         int virt_carrier = 0;
1948         int phys_carrier = 0;
1949
1950         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
1951                 return;
1952
1953         bd = ch->ch_bd;
1954
1955         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
1956                 return;
1957
1958         /* Make sure altpin is always set correctly */
1959         if (ch->ch_digi.digi_flags & DIGI_ALTPIN) {
1960                 ch->ch_dsr      = DM_CD;
1961                 ch->ch_cd       = DM_DSR;
1962         } else {
1963                 ch->ch_dsr      = DM_DSR;
1964                 ch->ch_cd       = DM_CD;
1965         }
1966
1967         if (ch->ch_mistat & D_CD(ch))
1968                 phys_carrier = 1;
1969
1970         if (ch->ch_digi.digi_flags & DIGI_FORCEDCD)
1971                 virt_carrier = 1;
1972
1973         if (ch->ch_c_cflag & CLOCAL)
1974                 virt_carrier = 1;
1975
1976         /*
1977          * Test for a VIRTUAL carrier transition to HIGH.
1978          */
1979         if (((ch->ch_flags & CH_FCAR) == 0) && (virt_carrier == 1)) {
1980
1981                 /*
1982                  * When carrier rises, wake any threads waiting
1983                  * for carrier in the open routine.
1984                  */
1985
1986                 if (waitqueue_active(&(ch->ch_flags_wait)))
1987                         wake_up_interruptible(&ch->ch_flags_wait);
1988         }
1989
1990         /*
1991          * Test for a PHYSICAL carrier transition to HIGH.
1992          */
1993         if (((ch->ch_flags & CH_CD) == 0) && (phys_carrier == 1)) {
1994
1995                 /*
1996                  * When carrier rises, wake any threads waiting
1997                  * for carrier in the open routine.
1998                  */
1999
2000                 if (waitqueue_active(&(ch->ch_flags_wait)))
2001                         wake_up_interruptible(&ch->ch_flags_wait);
2002         }
2003
2004         /*
2005          *  Test for a PHYSICAL transition to low, so long as we aren't
2006          *  currently ignoring physical transitions (which is what "virtual
2007          *  carrier" indicates).
2008          *
2009          *  The transition of the virtual carrier to low really doesn't
2010          *  matter... it really only means "ignore carrier state", not
2011          *  "make pretend that carrier is there".
2012          */
2013         if ((virt_carrier == 0) &&
2014             ((ch->ch_flags & CH_CD) != 0) &&
2015             (phys_carrier == 0)) {
2016
2017                 /*
2018                  *   When carrier drops:
2019                  *
2020                  *   Drop carrier on all open units.
2021                  *
2022                  *   Flush queues, waking up any task waiting in the
2023                  *   line discipline.
2024                  *
2025                  *   Send a hangup to the control terminal.
2026                  *
2027                  *   Enable all select calls.
2028                  */
2029                 if (waitqueue_active(&(ch->ch_flags_wait)))
2030                         wake_up_interruptible(&ch->ch_flags_wait);
2031
2032                 if (ch->ch_tun.un_open_count > 0)
2033                         tty_hangup(ch->ch_tun.un_tty);
2034
2035                 if (ch->ch_pun.un_open_count > 0)
2036                         tty_hangup(ch->ch_pun.un_tty);
2037         }
2038
2039         /*
2040          *  Make sure that our cached values reflect the current reality.
2041          */
2042         if (virt_carrier == 1)
2043                 ch->ch_flags |= CH_FCAR;
2044         else
2045                 ch->ch_flags &= ~CH_FCAR;
2046
2047         if (phys_carrier == 1)
2048                 ch->ch_flags |= CH_CD;
2049         else
2050                 ch->ch_flags &= ~CH_CD;
2051 }
2052
2053 /************************************************************************
2054  *
2055  * TTY Entry points and helper functions
2056  *
2057  ************************************************************************/
2058
2059 /*
2060  * dgap_tty_open()
2061  *
2062  */
2063 static int dgap_tty_open(struct tty_struct *tty, struct file *file)
2064 {
2065         struct board_t  *brd;
2066         struct channel_t *ch;
2067         struct un_t     *un;
2068         struct bs_t     *bs;
2069         uint            major = 0;
2070         uint            minor = 0;
2071         int             rc = 0;
2072         ulong           lock_flags;
2073         ulong           lock_flags2;
2074         u16             head;
2075
2076         rc = 0;
2077
2078         major = MAJOR(tty_devnum(tty));
2079         minor = MINOR(tty_devnum(tty));
2080
2081         if (major > 255)
2082                 return -ENXIO;
2083
2084         /* Get board pointer from our array of majors we have allocated */
2085         brd = dgap_BoardsByMajor[major];
2086         if (!brd)
2087                 return -ENXIO;
2088
2089         /*
2090          * If board is not yet up to a state of READY, go to
2091          * sleep waiting for it to happen or they cancel the open.
2092          */
2093         rc = wait_event_interruptible(brd->state_wait,
2094                 (brd->state & BOARD_READY));
2095
2096         if (rc)
2097                 return rc;
2098
2099         DGAP_LOCK(brd->bd_lock, lock_flags);
2100
2101         /* The wait above should guarantee this cannot happen */
2102         if (brd->state != BOARD_READY) {
2103                 DGAP_UNLOCK(brd->bd_lock, lock_flags);
2104                 return -ENXIO;
2105         }
2106
2107         /* If opened device is greater than our number of ports, bail. */
2108         if (MINOR(tty_devnum(tty)) > brd->nasync) {
2109                 DGAP_UNLOCK(brd->bd_lock, lock_flags);
2110                 return -ENXIO;
2111         }
2112
2113         ch = brd->channels[minor];
2114         if (!ch) {
2115                 DGAP_UNLOCK(brd->bd_lock, lock_flags);
2116                 return -ENXIO;
2117         }
2118
2119         /* Grab channel lock */
2120         DGAP_LOCK(ch->ch_lock, lock_flags2);
2121
2122         /* Figure out our type */
2123         if (major == brd->dgap_Serial_Major) {
2124                 un = &brd->channels[minor]->ch_tun;
2125                 un->un_type = DGAP_SERIAL;
2126         } else if (major == brd->dgap_TransparentPrint_Major) {
2127                 un = &brd->channels[minor]->ch_pun;
2128                 un->un_type = DGAP_PRINT;
2129         } else {
2130                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
2131                 DGAP_UNLOCK(brd->bd_lock, lock_flags);
2132                 return -ENXIO;
2133         }
2134
2135         /* Store our unit into driver_data, so we always have it available. */
2136         tty->driver_data = un;
2137
2138         /*
2139          * Error if channel info pointer is NULL.
2140          */
2141         bs = ch->ch_bs;
2142         if (!bs) {
2143                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
2144                 DGAP_UNLOCK(brd->bd_lock, lock_flags);
2145                 return -ENXIO;
2146         }
2147
2148         /*
2149          * Initialize tty's
2150          */
2151         if (!(un->un_flags & UN_ISOPEN)) {
2152                 /* Store important variables. */
2153                 un->un_tty     = tty;
2154
2155                 /* Maybe do something here to the TTY struct as well? */
2156         }
2157
2158         /*
2159          * Initialize if neither terminal or printer is open.
2160          */
2161         if (!((ch->ch_tun.un_flags | ch->ch_pun.un_flags) & UN_ISOPEN)) {
2162
2163                 ch->ch_mforce = 0;
2164                 ch->ch_mval = 0;
2165
2166                 /*
2167                  * Flush input queue.
2168                  */
2169                 head = readw(&(bs->rx_head));
2170                 writew(head, &(bs->rx_tail));
2171
2172                 ch->ch_flags = 0;
2173                 ch->pscan_state = 0;
2174                 ch->pscan_savechar = 0;
2175
2176                 ch->ch_c_cflag   = tty->termios.c_cflag;
2177                 ch->ch_c_iflag   = tty->termios.c_iflag;
2178                 ch->ch_c_oflag   = tty->termios.c_oflag;
2179                 ch->ch_c_lflag   = tty->termios.c_lflag;
2180                 ch->ch_startc = tty->termios.c_cc[VSTART];
2181                 ch->ch_stopc  = tty->termios.c_cc[VSTOP];
2182
2183                 /* TODO: flush our TTY struct here? */
2184         }
2185
2186         dgap_carrier(ch);
2187         /*
2188          * Run param in case we changed anything
2189          */
2190         dgap_param(tty);
2191
2192         /*
2193          * follow protocol for opening port
2194          */
2195
2196         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
2197         DGAP_UNLOCK(brd->bd_lock, lock_flags);
2198
2199         rc = dgap_block_til_ready(tty, file, ch);
2200
2201         if (!un->un_tty)
2202                 return -ENODEV;
2203
2204         /* No going back now, increment our unit and channel counters */
2205         DGAP_LOCK(ch->ch_lock, lock_flags);
2206         ch->ch_open_count++;
2207         un->un_open_count++;
2208         un->un_flags |= (UN_ISOPEN);
2209         DGAP_UNLOCK(ch->ch_lock, lock_flags);
2210
2211         return rc;
2212 }
2213
2214 /*
2215  * dgap_block_til_ready()
2216  *
2217  * Wait for DCD, if needed.
2218  */
2219 static int dgap_block_til_ready(struct tty_struct *tty, struct file *file,
2220                                 struct channel_t *ch)
2221 {
2222         int retval = 0;
2223         struct un_t *un = NULL;
2224         ulong   lock_flags;
2225         uint    old_flags = 0;
2226         int sleep_on_un_flags = 0;
2227
2228         if (!tty || tty->magic != TTY_MAGIC || !file || !ch ||
2229                 ch->magic != DGAP_CHANNEL_MAGIC)
2230                 return -ENXIO;
2231
2232         un = tty->driver_data;
2233         if (!un || un->magic != DGAP_UNIT_MAGIC)
2234                 return -ENXIO;
2235
2236         DGAP_LOCK(ch->ch_lock, lock_flags);
2237
2238         ch->ch_wopen++;
2239
2240         /* Loop forever */
2241         while (1) {
2242
2243                 sleep_on_un_flags = 0;
2244
2245                 /*
2246                  * If board has failed somehow during our sleep,
2247                  * bail with error.
2248                  */
2249                 if (ch->ch_bd->state == BOARD_FAILED) {
2250                         retval = -ENXIO;
2251                         break;
2252                 }
2253
2254                 /* If tty was hung up, break out of loop and set error. */
2255                 if (tty_hung_up_p(file)) {
2256                         retval = -EAGAIN;
2257                         break;
2258                 }
2259
2260                 /*
2261                  * If either unit is in the middle of the fragile part of close,
2262                  * we just cannot touch the channel safely.
2263                  * Go back to sleep, knowing that when the channel can be
2264                  * touched safely, the close routine will signal the
2265                  * ch_wait_flags to wake us back up.
2266                  */
2267                 if (!((ch->ch_tun.un_flags | ch->ch_pun.un_flags) &
2268                       UN_CLOSING)) {
2269
2270                         /*
2271                          * Our conditions to leave cleanly and happily:
2272                          * 1) NONBLOCKING on the tty is set.
2273                          * 2) CLOCAL is set.
2274                          * 3) DCD (fake or real) is active.
2275                          */
2276
2277                         if (file->f_flags & O_NONBLOCK)
2278                                 break;
2279
2280                         if (tty->flags & (1 << TTY_IO_ERROR))
2281                                 break;
2282
2283                         if (ch->ch_flags & CH_CD)
2284                                 break;
2285
2286                         if (ch->ch_flags & CH_FCAR)
2287                                 break;
2288                 } else {
2289                         sleep_on_un_flags = 1;
2290                 }
2291
2292                 /*
2293                  * If there is a signal pending, the user probably
2294                  * interrupted (ctrl-c) us.
2295                  * Leave loop with error set.
2296                  */
2297                 if (signal_pending(current)) {
2298                         retval = -ERESTARTSYS;
2299                         break;
2300                 }
2301
2302                 /*
2303                  * Store the flags before we let go of channel lock
2304                  */
2305                 if (sleep_on_un_flags)
2306                         old_flags = ch->ch_tun.un_flags | ch->ch_pun.un_flags;
2307                 else
2308                         old_flags = ch->ch_flags;
2309
2310                 /*
2311                  * Let go of channel lock before calling schedule.
2312                  * Our poller will get any FEP events and wake us up when DCD
2313                  * eventually goes active.
2314                  */
2315
2316                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
2317
2318                 /*
2319                  * Wait for something in the flags to change
2320                  * from the current value.
2321                  */
2322                 if (sleep_on_un_flags) {
2323                         retval = wait_event_interruptible(un->un_flags_wait,
2324                                 (old_flags != (ch->ch_tun.un_flags |
2325                                                ch->ch_pun.un_flags)));
2326                 } else {
2327                         retval = wait_event_interruptible(ch->ch_flags_wait,
2328                                 (old_flags != ch->ch_flags));
2329                 }
2330
2331                 /*
2332                  * We got woken up for some reason.
2333                  * Before looping around, grab our channel lock.
2334                  */
2335                 DGAP_LOCK(ch->ch_lock, lock_flags);
2336         }
2337
2338         ch->ch_wopen--;
2339
2340         DGAP_UNLOCK(ch->ch_lock, lock_flags);
2341
2342         if (retval)
2343                 return retval;
2344
2345         return 0;
2346 }
2347
2348 /*
2349  * dgap_tty_hangup()
2350  *
2351  * Hangup the port.  Like a close, but don't wait for output to drain.
2352  */
2353 static void dgap_tty_hangup(struct tty_struct *tty)
2354 {
2355         struct board_t  *bd;
2356         struct channel_t *ch;
2357         struct un_t     *un;
2358
2359         if (!tty || tty->magic != TTY_MAGIC)
2360                 return;
2361
2362         un = tty->driver_data;
2363         if (!un || un->magic != DGAP_UNIT_MAGIC)
2364                 return;
2365
2366         ch = un->un_ch;
2367         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
2368                 return;
2369
2370         bd = ch->ch_bd;
2371         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
2372                 return;
2373
2374         /* flush the transmit queues */
2375         dgap_tty_flush_buffer(tty);
2376
2377 }
2378
2379 /*
2380  * dgap_tty_close()
2381  *
2382  */
2383 static void dgap_tty_close(struct tty_struct *tty, struct file *file)
2384 {
2385         struct ktermios *ts;
2386         struct board_t *bd;
2387         struct channel_t *ch;
2388         struct un_t *un;
2389         ulong lock_flags;
2390         int rc = 0;
2391
2392         if (!tty || tty->magic != TTY_MAGIC)
2393                 return;
2394
2395         un = tty->driver_data;
2396         if (!un || un->magic != DGAP_UNIT_MAGIC)
2397                 return;
2398
2399         ch = un->un_ch;
2400         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
2401                 return;
2402
2403         bd = ch->ch_bd;
2404         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
2405                 return;
2406
2407         ts = &tty->termios;
2408
2409         DGAP_LOCK(ch->ch_lock, lock_flags);
2410
2411         /*
2412          * Determine if this is the last close or not - and if we agree about
2413          * which type of close it is with the Line Discipline
2414          */
2415         if ((tty->count == 1) && (un->un_open_count != 1)) {
2416                 /*
2417                  * Uh, oh.  tty->count is 1, which means that the tty
2418                  * structure will be freed.  un_open_count should always
2419                  * be one in these conditions.  If it's greater than
2420                  * one, we've got real problems, since it means the
2421                  * serial port won't be shutdown.
2422                  */
2423                 un->un_open_count = 1;
2424         }
2425
2426         if (--un->un_open_count < 0)
2427                 un->un_open_count = 0;
2428
2429         ch->ch_open_count--;
2430
2431         if (ch->ch_open_count && un->un_open_count) {
2432                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
2433                 return;
2434         }
2435
2436         /* OK, its the last close on the unit */
2437
2438         un->un_flags |= UN_CLOSING;
2439
2440         tty->closing = 1;
2441
2442         /*
2443          * Only officially close channel if count is 0 and
2444          * DIGI_PRINTER bit is not set.
2445          */
2446         if ((ch->ch_open_count == 0) &&
2447             !(ch->ch_digi.digi_flags & DIGI_PRINTER)) {
2448
2449                 ch->ch_flags &= ~(CH_RXBLOCK);
2450
2451                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
2452
2453                 /* wait for output to drain */
2454                 /* This will also return if we take an interrupt */
2455
2456                 rc = dgap_wait_for_drain(tty);
2457
2458                 dgap_tty_flush_buffer(tty);
2459                 tty_ldisc_flush(tty);
2460
2461                 DGAP_LOCK(ch->ch_lock, lock_flags);
2462
2463                 tty->closing = 0;
2464
2465                 /*
2466                  * If we have HUPCL set, lower DTR and RTS
2467                  */
2468                 if (ch->ch_c_cflag & HUPCL) {
2469                         ch->ch_mostat &= ~(D_RTS(ch)|D_DTR(ch));
2470                         dgap_cmdb(ch, SMODEM, 0, D_DTR(ch)|D_RTS(ch), 0);
2471
2472                         /*
2473                          * Go to sleep to ensure RTS/DTR
2474                          * have been dropped for modems to see it.
2475                          */
2476                         if (ch->ch_close_delay) {
2477                                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
2478                                 dgap_ms_sleep(ch->ch_close_delay);
2479                                 DGAP_LOCK(ch->ch_lock, lock_flags);
2480                         }
2481                 }
2482
2483                 ch->pscan_state = 0;
2484                 ch->pscan_savechar = 0;
2485                 ch->ch_baud_info = 0;
2486
2487         }
2488
2489         /*
2490          * turn off print device when closing print device.
2491          */
2492         if ((un->un_type == DGAP_PRINT)  && (ch->ch_flags & CH_PRON)) {
2493                 dgap_wmove(ch, ch->ch_digi.digi_offstr,
2494                         (int) ch->ch_digi.digi_offlen);
2495                 ch->ch_flags &= ~CH_PRON;
2496         }
2497
2498         un->un_tty = NULL;
2499         un->un_flags &= ~(UN_ISOPEN | UN_CLOSING);
2500         tty->driver_data = NULL;
2501
2502         wake_up_interruptible(&ch->ch_flags_wait);
2503         wake_up_interruptible(&un->un_flags_wait);
2504
2505         DGAP_UNLOCK(ch->ch_lock, lock_flags);
2506 }
2507
2508 /*
2509  * dgap_tty_chars_in_buffer()
2510  *
2511  * Return number of characters that have not been transmitted yet.
2512  *
2513  * This routine is used by the line discipline to determine if there
2514  * is data waiting to be transmitted/drained/flushed or not.
2515  */
2516 static int dgap_tty_chars_in_buffer(struct tty_struct *tty)
2517 {
2518         struct board_t *bd = NULL;
2519         struct channel_t *ch = NULL;
2520         struct un_t *un = NULL;
2521         struct bs_t *bs = NULL;
2522         uchar tbusy;
2523         uint chars = 0;
2524         u16 thead, ttail, tmask, chead, ctail;
2525         ulong   lock_flags = 0;
2526         ulong   lock_flags2 = 0;
2527
2528         if (tty == NULL)
2529                 return 0;
2530
2531         un = tty->driver_data;
2532         if (!un || un->magic != DGAP_UNIT_MAGIC)
2533                 return 0;
2534
2535         ch = un->un_ch;
2536         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
2537                 return 0;
2538
2539         bd = ch->ch_bd;
2540         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
2541                 return 0;
2542
2543         bs = ch->ch_bs;
2544         if (!bs)
2545                 return 0;
2546
2547         DGAP_LOCK(bd->bd_lock, lock_flags);
2548         DGAP_LOCK(ch->ch_lock, lock_flags2);
2549
2550         tmask = (ch->ch_tsize - 1);
2551
2552         /* Get Transmit queue pointers */
2553         thead = readw(&(bs->tx_head)) & tmask;
2554         ttail = readw(&(bs->tx_tail)) & tmask;
2555
2556         /* Get tbusy flag */
2557         tbusy = readb(&(bs->tbusy));
2558
2559         /* Get Command queue pointers */
2560         chead = readw(&(ch->ch_cm->cm_head));
2561         ctail = readw(&(ch->ch_cm->cm_tail));
2562
2563         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
2564         DGAP_UNLOCK(bd->bd_lock, lock_flags);
2565
2566         /*
2567          * The only way we know for sure if there is no pending
2568          * data left to be transferred, is if:
2569          * 1) Transmit head and tail are equal (empty).
2570          * 2) Command queue head and tail are equal (empty).
2571          * 3) The "TBUSY" flag is 0. (Transmitter not busy).
2572          */
2573
2574         if ((ttail == thead) && (tbusy == 0) && (chead == ctail)) {
2575                 chars = 0;
2576         } else {
2577                 if (thead >= ttail)
2578                         chars = thead - ttail;
2579                 else
2580                         chars = thead - ttail + ch->ch_tsize;
2581                 /*
2582                  * Fudge factor here.
2583                  * If chars is zero, we know that the command queue had
2584                  * something in it or tbusy was set.  Because we cannot
2585                  * be sure if there is still some data to be transmitted,
2586                  * lets lie, and tell ld we have 1 byte left.
2587                  */
2588                 if (chars == 0) {
2589                         /*
2590                          * If TBUSY is still set, and our tx buffers are empty,
2591                          * force the firmware to send me another wakeup after
2592                          * TBUSY has been cleared.
2593                          */
2594                         if (tbusy != 0) {
2595                                 DGAP_LOCK(ch->ch_lock, lock_flags);
2596                                 un->un_flags |= UN_EMPTY;
2597                                 writeb(1, &(bs->iempty));
2598                                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
2599                         }
2600                         chars = 1;
2601                 }
2602         }
2603
2604         return chars;
2605 }
2606
2607 static int dgap_wait_for_drain(struct tty_struct *tty)
2608 {
2609         struct channel_t *ch;
2610         struct un_t *un;
2611         struct bs_t *bs;
2612         int ret = -EIO;
2613         uint count = 1;
2614         ulong   lock_flags = 0;
2615
2616         if (!tty || tty->magic != TTY_MAGIC)
2617                 return ret;
2618
2619         un = tty->driver_data;
2620         if (!un || un->magic != DGAP_UNIT_MAGIC)
2621                 return ret;
2622
2623         ch = un->un_ch;
2624         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
2625                 return ret;
2626
2627         bs = ch->ch_bs;
2628         if (!bs)
2629                 return ret;
2630
2631         ret = 0;
2632
2633         /* Loop until data is drained */
2634         while (count != 0) {
2635
2636                 count = dgap_tty_chars_in_buffer(tty);
2637
2638                 if (count == 0)
2639                         break;
2640
2641                 /* Set flag waiting for drain */
2642                 DGAP_LOCK(ch->ch_lock, lock_flags);
2643                 un->un_flags |= UN_EMPTY;
2644                 writeb(1, &(bs->iempty));
2645                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
2646
2647                 /* Go to sleep till we get woken up */
2648                 ret = wait_event_interruptible(un->un_flags_wait,
2649                                         ((un->un_flags & UN_EMPTY) == 0));
2650                 /* If ret is non-zero, user ctrl-c'ed us */
2651                 if (ret)
2652                         break;
2653         }
2654
2655         DGAP_LOCK(ch->ch_lock, lock_flags);
2656         un->un_flags &= ~(UN_EMPTY);
2657         DGAP_UNLOCK(ch->ch_lock, lock_flags);
2658
2659         return ret;
2660 }
2661
2662 /*
2663  * dgap_maxcps_room
2664  *
2665  * Reduces bytes_available to the max number of characters
2666  * that can be sent currently given the maxcps value, and
2667  * returns the new bytes_available.  This only affects printer
2668  * output.
2669  */
2670 static int dgap_maxcps_room(struct tty_struct *tty, int bytes_available)
2671 {
2672         struct channel_t *ch = NULL;
2673         struct un_t *un = NULL;
2674
2675         if (tty == NULL)
2676                 return bytes_available;
2677
2678         un = tty->driver_data;
2679         if (!un || un->magic != DGAP_UNIT_MAGIC)
2680                 return bytes_available;
2681
2682         ch = un->un_ch;
2683         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
2684                 return bytes_available;
2685
2686         /*
2687          * If its not the Transparent print device, return
2688          * the full data amount.
2689          */
2690         if (un->un_type != DGAP_PRINT)
2691                 return bytes_available;
2692
2693         if (ch->ch_digi.digi_maxcps > 0 && ch->ch_digi.digi_bufsize > 0) {
2694                 int cps_limit = 0;
2695                 unsigned long current_time = jiffies;
2696                 unsigned long buffer_time = current_time +
2697                         (HZ * ch->ch_digi.digi_bufsize) /
2698                         ch->ch_digi.digi_maxcps;
2699
2700                 if (ch->ch_cpstime < current_time) {
2701                         /* buffer is empty */
2702                         ch->ch_cpstime = current_time;   /* reset ch_cpstime */
2703                         cps_limit = ch->ch_digi.digi_bufsize;
2704                 } else if (ch->ch_cpstime < buffer_time) {
2705                         /* still room in the buffer */
2706                         cps_limit = ((buffer_time - ch->ch_cpstime) *
2707                                      ch->ch_digi.digi_maxcps) / HZ;
2708                 } else {
2709                         /* no room in the buffer */
2710                         cps_limit = 0;
2711                 }
2712
2713                 bytes_available = min(cps_limit, bytes_available);
2714         }
2715
2716         return bytes_available;
2717 }
2718
2719 static inline void dgap_set_firmware_event(struct un_t *un, unsigned int event)
2720 {
2721         struct channel_t *ch = NULL;
2722         struct bs_t *bs = NULL;
2723
2724         if (!un || un->magic != DGAP_UNIT_MAGIC)
2725                 return;
2726         ch = un->un_ch;
2727         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
2728                 return;
2729         bs = ch->ch_bs;
2730         if (!bs)
2731                 return;
2732
2733         if ((event & UN_LOW) != 0) {
2734                 if ((un->un_flags & UN_LOW) == 0) {
2735                         un->un_flags |= UN_LOW;
2736                         writeb(1, &(bs->ilow));
2737                 }
2738         }
2739         if ((event & UN_LOW) != 0) {
2740                 if ((un->un_flags & UN_EMPTY) == 0) {
2741                         un->un_flags |= UN_EMPTY;
2742                         writeb(1, &(bs->iempty));
2743                 }
2744         }
2745 }
2746
2747 /*
2748  * dgap_tty_write_room()
2749  *
2750  * Return space available in Tx buffer
2751  */
2752 static int dgap_tty_write_room(struct tty_struct *tty)
2753 {
2754         struct channel_t *ch = NULL;
2755         struct un_t *un = NULL;
2756         struct bs_t *bs = NULL;
2757         u16 head, tail, tmask;
2758         int ret = 0;
2759         ulong   lock_flags = 0;
2760
2761         if (tty == NULL || dgap_TmpWriteBuf == NULL)
2762                 return 0;
2763
2764         un = tty->driver_data;
2765         if (!un || un->magic != DGAP_UNIT_MAGIC)
2766                 return 0;
2767
2768         ch = un->un_ch;
2769         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
2770                 return 0;
2771
2772         bs = ch->ch_bs;
2773         if (!bs)
2774                 return 0;
2775
2776         DGAP_LOCK(ch->ch_lock, lock_flags);
2777
2778         tmask = ch->ch_tsize - 1;
2779         head = readw(&(bs->tx_head)) & tmask;
2780         tail = readw(&(bs->tx_tail)) & tmask;
2781
2782         ret = tail - head - 1;
2783         if (ret < 0)
2784                 ret += ch->ch_tsize;
2785
2786         /* Limit printer to maxcps */
2787         ret = dgap_maxcps_room(tty, ret);
2788
2789         /*
2790          * If we are printer device, leave space for
2791          * possibly both the on and off strings.
2792          */
2793         if (un->un_type == DGAP_PRINT) {
2794                 if (!(ch->ch_flags & CH_PRON))
2795                         ret -= ch->ch_digi.digi_onlen;
2796                 ret -= ch->ch_digi.digi_offlen;
2797         } else {
2798                 if (ch->ch_flags & CH_PRON)
2799                         ret -= ch->ch_digi.digi_offlen;
2800         }
2801
2802         if (ret < 0)
2803                 ret = 0;
2804
2805         /*
2806          * Schedule FEP to wake us up if needed.
2807          *
2808          * TODO:  This might be overkill...
2809          * Do we really need to schedule callbacks from the FEP
2810          * in every case?  Can we get smarter based on ret?
2811          */
2812         dgap_set_firmware_event(un, UN_LOW | UN_EMPTY);
2813         DGAP_UNLOCK(ch->ch_lock, lock_flags);
2814
2815         return ret;
2816 }
2817
2818 /*
2819  * dgap_tty_put_char()
2820  *
2821  * Put a character into ch->ch_buf
2822  *
2823  *      - used by the line discipline for OPOST processing
2824  */
2825 static int dgap_tty_put_char(struct tty_struct *tty, unsigned char c)
2826 {
2827         /*
2828          * Simply call tty_write.
2829          */
2830         dgap_tty_write(tty, &c, 1);
2831         return 1;
2832 }
2833
2834 /*
2835  * dgap_tty_write()
2836  *
2837  * Take data from the user or kernel and send it out to the FEP.
2838  * In here exists all the Transparent Print magic as well.
2839  */
2840 static int dgap_tty_write(struct tty_struct *tty, const unsigned char *buf,
2841                                 int count)
2842 {
2843         struct channel_t *ch = NULL;
2844         struct un_t *un = NULL;
2845         struct bs_t *bs = NULL;
2846         char *vaddr = NULL;
2847         u16 head, tail, tmask, remain;
2848         int bufcount = 0, n = 0;
2849         int orig_count = 0;
2850         ulong lock_flags;
2851         int from_user = 0;
2852
2853         if (tty == NULL || dgap_TmpWriteBuf == NULL)
2854                 return 0;
2855
2856         un = tty->driver_data;
2857         if (!un || un->magic != DGAP_UNIT_MAGIC)
2858                 return 0;
2859
2860         ch = un->un_ch;
2861         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
2862                 return 0;
2863
2864         bs = ch->ch_bs;
2865         if (!bs)
2866                 return 0;
2867
2868         if (!count)
2869                 return 0;
2870
2871         /*
2872          * Store original amount of characters passed in.
2873          * This helps to figure out if we should ask the FEP
2874          * to send us an event when it has more space available.
2875          */
2876         orig_count = count;
2877
2878         DGAP_LOCK(ch->ch_lock, lock_flags);
2879
2880         /* Get our space available for the channel from the board */
2881         tmask = ch->ch_tsize - 1;
2882         head = readw(&(bs->tx_head)) & tmask;
2883         tail = readw(&(bs->tx_tail)) & tmask;
2884
2885         bufcount = tail - head - 1;
2886         if (bufcount < 0)
2887                 bufcount += ch->ch_tsize;
2888
2889         /*
2890          * Limit printer output to maxcps overall, with bursts allowed
2891          * up to bufsize characters.
2892          */
2893         bufcount = dgap_maxcps_room(tty, bufcount);
2894
2895         /*
2896          * Take minimum of what the user wants to send, and the
2897          * space available in the FEP buffer.
2898          */
2899         count = min(count, bufcount);
2900
2901         /*
2902          * Bail if no space left.
2903          */
2904         if (count <= 0) {
2905                 dgap_set_firmware_event(un, UN_LOW | UN_EMPTY);
2906                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
2907                 return 0;
2908         }
2909
2910         /*
2911          * Output the printer ON string, if we are in terminal mode, but
2912          * need to be in printer mode.
2913          */
2914         if ((un->un_type == DGAP_PRINT) && !(ch->ch_flags & CH_PRON)) {
2915                 dgap_wmove(ch, ch->ch_digi.digi_onstr,
2916                     (int) ch->ch_digi.digi_onlen);
2917                 head = readw(&(bs->tx_head)) & tmask;
2918                 ch->ch_flags |= CH_PRON;
2919         }
2920
2921         /*
2922          * On the other hand, output the printer OFF string, if we are
2923          * currently in printer mode, but need to output to the terminal.
2924          */
2925         if ((un->un_type != DGAP_PRINT) && (ch->ch_flags & CH_PRON)) {
2926                 dgap_wmove(ch, ch->ch_digi.digi_offstr,
2927                         (int) ch->ch_digi.digi_offlen);
2928                 head = readw(&(bs->tx_head)) & tmask;
2929                 ch->ch_flags &= ~CH_PRON;
2930         }
2931
2932         /*
2933          * If there is nothing left to copy, or
2934          * I can't handle any more data, leave.
2935          */
2936         if (count <= 0) {
2937                 dgap_set_firmware_event(un, UN_LOW | UN_EMPTY);
2938                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
2939                 return 0;
2940         }
2941
2942         if (from_user) {
2943
2944                 count = min(count, WRITEBUFLEN);
2945
2946                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
2947
2948                 /*
2949                  * If data is coming from user space, copy it into a temporary
2950                  * buffer so we don't get swapped out while doing the copy to
2951                  * the board.
2952                  */
2953                 /* we're allowed to block if it's from_user */
2954                 if (down_interruptible(&dgap_TmpWriteSem))
2955                         return -EINTR;
2956
2957                 if (copy_from_user(dgap_TmpWriteBuf, (const uchar __user *)buf,
2958                                         count)) {
2959                         up(&dgap_TmpWriteSem);
2960                         return -EFAULT;
2961                 }
2962
2963                 DGAP_LOCK(ch->ch_lock, lock_flags);
2964
2965                 buf = dgap_TmpWriteBuf;
2966         }
2967
2968         n = count;
2969
2970         /*
2971          * If the write wraps over the top of the circular buffer,
2972          * move the portion up to the wrap point, and reset the
2973          * pointers to the bottom.
2974          */
2975         remain = ch->ch_tstart + ch->ch_tsize - head;
2976
2977         if (n >= remain) {
2978                 n -= remain;
2979                 vaddr = ch->ch_taddr + head;
2980
2981                 memcpy_toio(vaddr, (uchar *) buf, remain);
2982                 dgap_sniff_nowait_nolock(ch, "USER WRITE", (uchar *) buf,
2983                                         remain);
2984
2985                 head = ch->ch_tstart;
2986                 buf += remain;
2987         }
2988
2989         if (n > 0) {
2990
2991                 /*
2992                  * Move rest of data.
2993                  */
2994                 vaddr = ch->ch_taddr + head;
2995                 remain = n;
2996
2997                 memcpy_toio(vaddr, (uchar *) buf, remain);
2998                 dgap_sniff_nowait_nolock(ch, "USER WRITE", (uchar *)buf,
2999                                         remain);
3000
3001                 head += remain;
3002
3003         }
3004
3005         if (count) {
3006                 ch->ch_txcount += count;
3007                 head &= tmask;
3008                 writew(head, &(bs->tx_head));
3009         }
3010
3011         dgap_set_firmware_event(un, UN_LOW | UN_EMPTY);
3012
3013         /*
3014          * If this is the print device, and the
3015          * printer is still on, we need to turn it
3016          * off before going idle.  If the buffer is
3017          * non-empty, wait until it goes empty.
3018          * Otherwise turn it off right now.
3019          */
3020         if ((un->un_type == DGAP_PRINT) && (ch->ch_flags & CH_PRON)) {
3021                 tail = readw(&(bs->tx_tail)) & tmask;
3022
3023                 if (tail != head) {
3024                         un->un_flags |= UN_EMPTY;
3025                         writeb(1, &(bs->iempty));
3026                 } else {
3027                         dgap_wmove(ch, ch->ch_digi.digi_offstr,
3028                                 (int) ch->ch_digi.digi_offlen);
3029                         head = readw(&(bs->tx_head)) & tmask;
3030                         ch->ch_flags &= ~CH_PRON;
3031                 }
3032         }
3033
3034         /* Update printer buffer empty time. */
3035         if ((un->un_type == DGAP_PRINT) && (ch->ch_digi.digi_maxcps > 0)
3036             && (ch->ch_digi.digi_bufsize > 0)) {
3037                 ch->ch_cpstime += (HZ * count) / ch->ch_digi.digi_maxcps;
3038         }
3039
3040         if (from_user) {
3041                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
3042                 up(&dgap_TmpWriteSem);
3043         } else
3044                 DGAP_UNLOCK(ch->ch_lock, lock_flags);
3045
3046         return count;
3047 }
3048
3049 /*
3050  * Return modem signals to ld.
3051  */
3052 static int dgap_tty_tiocmget(struct tty_struct *tty)
3053 {
3054         struct channel_t *ch;
3055         struct un_t *un;
3056         int result = -EIO;
3057         uchar mstat = 0;
3058         ulong lock_flags;
3059
3060         if (!tty || tty->magic != TTY_MAGIC)
3061                 return result;
3062
3063         un = tty->driver_data;
3064         if (!un || un->magic != DGAP_UNIT_MAGIC)
3065                 return result;
3066
3067         ch = un->un_ch;
3068         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3069                 return result;
3070
3071         DGAP_LOCK(ch->ch_lock, lock_flags);
3072
3073         mstat = readb(&(ch->ch_bs->m_stat));
3074         /* Append any outbound signals that might be pending... */
3075         mstat |= ch->ch_mostat;
3076
3077         DGAP_UNLOCK(ch->ch_lock, lock_flags);
3078
3079         result = 0;
3080
3081         if (mstat & D_DTR(ch))
3082                 result |= TIOCM_DTR;
3083         if (mstat & D_RTS(ch))
3084                 result |= TIOCM_RTS;
3085         if (mstat & D_CTS(ch))
3086                 result |= TIOCM_CTS;
3087         if (mstat & D_DSR(ch))
3088                 result |= TIOCM_DSR;
3089         if (mstat & D_RI(ch))
3090                 result |= TIOCM_RI;
3091         if (mstat & D_CD(ch))
3092                 result |= TIOCM_CD;
3093
3094         return result;
3095 }
3096
3097 /*
3098  * dgap_tty_tiocmset()
3099  *
3100  * Set modem signals, called by ld.
3101  */
3102 static int dgap_tty_tiocmset(struct tty_struct *tty,
3103                 unsigned int set, unsigned int clear)
3104 {
3105         struct board_t *bd;
3106         struct channel_t *ch;
3107         struct un_t *un;
3108         int ret = -EIO;
3109         ulong lock_flags;
3110         ulong lock_flags2;
3111
3112         if (!tty || tty->magic != TTY_MAGIC)
3113                 return ret;
3114
3115         un = tty->driver_data;
3116         if (!un || un->magic != DGAP_UNIT_MAGIC)
3117                 return ret;
3118
3119         ch = un->un_ch;
3120         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3121                 return ret;
3122
3123         bd = ch->ch_bd;
3124         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3125                 return ret;
3126
3127         DGAP_LOCK(bd->bd_lock, lock_flags);
3128         DGAP_LOCK(ch->ch_lock, lock_flags2);
3129
3130         if (set & TIOCM_RTS) {
3131                 ch->ch_mforce |= D_RTS(ch);
3132                 ch->ch_mval   |= D_RTS(ch);
3133         }
3134
3135         if (set & TIOCM_DTR) {
3136                 ch->ch_mforce |= D_DTR(ch);
3137                 ch->ch_mval   |= D_DTR(ch);
3138         }
3139
3140         if (clear & TIOCM_RTS) {
3141                 ch->ch_mforce |= D_RTS(ch);
3142                 ch->ch_mval   &= ~(D_RTS(ch));
3143         }
3144
3145         if (clear & TIOCM_DTR) {
3146                 ch->ch_mforce |= D_DTR(ch);
3147                 ch->ch_mval   &= ~(D_DTR(ch));
3148         }
3149
3150         dgap_param(tty);
3151
3152         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3153         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3154
3155         return 0;
3156 }
3157
3158 /*
3159  * dgap_tty_send_break()
3160  *
3161  * Send a Break, called by ld.
3162  */
3163 static int dgap_tty_send_break(struct tty_struct *tty, int msec)
3164 {
3165         struct board_t *bd;
3166         struct channel_t *ch;
3167         struct un_t *un;
3168         int ret = -EIO;
3169         ulong lock_flags;
3170         ulong lock_flags2;
3171
3172         if (!tty || tty->magic != TTY_MAGIC)
3173                 return ret;
3174
3175         un = tty->driver_data;
3176         if (!un || un->magic != DGAP_UNIT_MAGIC)
3177                 return ret;
3178
3179         ch = un->un_ch;
3180         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3181                 return ret;
3182
3183         bd = ch->ch_bd;
3184         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3185                 return ret;
3186
3187         switch (msec) {
3188         case -1:
3189                 msec = 0xFFFF;
3190                 break;
3191         case 0:
3192                 msec = 1;
3193                 break;
3194         default:
3195                 msec /= 10;
3196                 break;
3197         }
3198
3199         DGAP_LOCK(bd->bd_lock, lock_flags);
3200         DGAP_LOCK(ch->ch_lock, lock_flags2);
3201 #if 0
3202         dgap_cmdw(ch, SBREAK, (u16) SBREAK_TIME, 0);
3203 #endif
3204         dgap_cmdw(ch, SBREAK, (u16) msec, 0);
3205
3206         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3207         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3208
3209         return 0;
3210 }
3211
3212 /*
3213  * dgap_tty_wait_until_sent()
3214  *
3215  * wait until data has been transmitted, called by ld.
3216  */
3217 static void dgap_tty_wait_until_sent(struct tty_struct *tty, int timeout)
3218 {
3219         dgap_wait_for_drain(tty);
3220 }
3221
3222 /*
3223  * dgap_send_xchar()
3224  *
3225  * send a high priority character, called by ld.
3226  */
3227 static void dgap_tty_send_xchar(struct tty_struct *tty, char c)
3228 {
3229         struct board_t *bd;
3230         struct channel_t *ch;
3231         struct un_t *un;
3232         ulong lock_flags;
3233         ulong lock_flags2;
3234
3235         if (!tty || tty->magic != TTY_MAGIC)
3236                 return;
3237
3238         un = tty->driver_data;
3239         if (!un || un->magic != DGAP_UNIT_MAGIC)
3240                 return;
3241
3242         ch = un->un_ch;
3243         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3244                 return;
3245
3246         bd = ch->ch_bd;
3247         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3248                 return;
3249
3250         DGAP_LOCK(bd->bd_lock, lock_flags);
3251         DGAP_LOCK(ch->ch_lock, lock_flags2);
3252
3253         /*
3254          * This is technically what we should do.
3255          * However, the NIST tests specifically want
3256          * to see each XON or XOFF character that it
3257          * sends, so lets just send each character
3258          * by hand...
3259          */
3260 #if 0
3261         if (c == STOP_CHAR(tty))
3262                 dgap_cmdw(ch, RPAUSE, 0, 0);
3263         else if (c == START_CHAR(tty))
3264                 dgap_cmdw(ch, RRESUME, 0, 0);
3265         else
3266                 dgap_wmove(ch, &c, 1);
3267 #else
3268         dgap_wmove(ch, &c, 1);
3269 #endif
3270
3271         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3272         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3273
3274         return;
3275 }
3276
3277 /*
3278  * Return modem signals to ld.
3279  */
3280 static int dgap_get_modem_info(struct channel_t *ch, unsigned int __user *value)
3281 {
3282         int result = 0;
3283         uchar mstat = 0;
3284         ulong lock_flags;
3285         int rc = 0;
3286
3287         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3288                 return -ENXIO;
3289
3290         DGAP_LOCK(ch->ch_lock, lock_flags);
3291
3292         mstat = readb(&(ch->ch_bs->m_stat));
3293         /* Append any outbound signals that might be pending... */
3294         mstat |= ch->ch_mostat;
3295
3296         DGAP_UNLOCK(ch->ch_lock, lock_flags);
3297
3298         result = 0;
3299
3300         if (mstat & D_DTR(ch))
3301                 result |= TIOCM_DTR;
3302         if (mstat & D_RTS(ch))
3303                 result |= TIOCM_RTS;
3304         if (mstat & D_CTS(ch))
3305                 result |= TIOCM_CTS;
3306         if (mstat & D_DSR(ch))
3307                 result |= TIOCM_DSR;
3308         if (mstat & D_RI(ch))
3309                 result |= TIOCM_RI;
3310         if (mstat & D_CD(ch))
3311                 result |= TIOCM_CD;
3312
3313         rc = put_user(result, value);
3314
3315         return rc;
3316 }
3317
3318 /*
3319  * dgap_set_modem_info()
3320  *
3321  * Set modem signals, called by ld.
3322  */
3323 static int dgap_set_modem_info(struct tty_struct *tty, unsigned int command,
3324                                 unsigned int __user *value)
3325 {
3326         struct board_t *bd;
3327         struct channel_t *ch;
3328         struct un_t *un;
3329         int ret = -ENXIO;
3330         unsigned int arg = 0;
3331         ulong lock_flags;
3332         ulong lock_flags2;
3333
3334         if (!tty || tty->magic != TTY_MAGIC)
3335                 return ret;
3336
3337         un = tty->driver_data;
3338         if (!un || un->magic != DGAP_UNIT_MAGIC)
3339                 return ret;
3340
3341         ch = un->un_ch;
3342         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3343                 return ret;
3344
3345         bd = ch->ch_bd;
3346         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3347                 return ret;
3348
3349         ret = get_user(arg, value);
3350         if (ret)
3351                 return ret;
3352
3353         switch (command) {
3354         case TIOCMBIS:
3355                 if (arg & TIOCM_RTS) {
3356                         ch->ch_mforce |= D_RTS(ch);
3357                         ch->ch_mval   |= D_RTS(ch);
3358                 }
3359
3360                 if (arg & TIOCM_DTR) {
3361                         ch->ch_mforce |= D_DTR(ch);
3362                         ch->ch_mval   |= D_DTR(ch);
3363                 }
3364
3365                 break;
3366
3367         case TIOCMBIC:
3368                 if (arg & TIOCM_RTS) {
3369                         ch->ch_mforce |= D_RTS(ch);
3370                         ch->ch_mval   &= ~(D_RTS(ch));
3371                 }
3372
3373                 if (arg & TIOCM_DTR) {
3374                         ch->ch_mforce |= D_DTR(ch);
3375                         ch->ch_mval   &= ~(D_DTR(ch));
3376                 }
3377
3378                 break;
3379
3380         case TIOCMSET:
3381                 ch->ch_mforce = D_DTR(ch)|D_RTS(ch);
3382
3383                 if (arg & TIOCM_RTS)
3384                         ch->ch_mval |= D_RTS(ch);
3385                 else
3386                         ch->ch_mval &= ~(D_RTS(ch));
3387
3388                 if (arg & TIOCM_DTR)
3389                         ch->ch_mval |= (D_DTR(ch));
3390                 else
3391                         ch->ch_mval &= ~(D_DTR(ch));
3392
3393                 break;
3394
3395         default:
3396                 return -EINVAL;
3397         }
3398
3399         DGAP_LOCK(bd->bd_lock, lock_flags);
3400         DGAP_LOCK(ch->ch_lock, lock_flags2);
3401
3402         dgap_param(tty);
3403
3404         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3405         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3406
3407         return 0;
3408 }
3409
3410 /*
3411  * dgap_tty_digigeta()
3412  *
3413  * Ioctl to get the information for ditty.
3414  *
3415  *
3416  *
3417  */
3418 static int dgap_tty_digigeta(struct tty_struct *tty,
3419                                 struct digi_t __user *retinfo)
3420 {
3421         struct channel_t *ch;
3422         struct un_t *un;
3423         struct digi_t tmp;
3424         ulong lock_flags;
3425
3426         if (!retinfo)
3427                 return -EFAULT;
3428
3429         if (!tty || tty->magic != TTY_MAGIC)
3430                 return -EFAULT;
3431
3432         un = tty->driver_data;
3433         if (!un || un->magic != DGAP_UNIT_MAGIC)
3434                 return -EFAULT;
3435
3436         ch = un->un_ch;
3437         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3438                 return -EFAULT;
3439
3440         memset(&tmp, 0, sizeof(tmp));
3441
3442         DGAP_LOCK(ch->ch_lock, lock_flags);
3443         memcpy(&tmp, &ch->ch_digi, sizeof(tmp));
3444         DGAP_UNLOCK(ch->ch_lock, lock_flags);
3445
3446         if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
3447                 return -EFAULT;
3448
3449         return 0;
3450 }
3451
3452 /*
3453  * dgap_tty_digiseta()
3454  *
3455  * Ioctl to set the information for ditty.
3456  *
3457  *
3458  *
3459  */
3460 static int dgap_tty_digiseta(struct tty_struct *tty,
3461                                 struct digi_t __user *new_info)
3462 {
3463         struct board_t *bd;
3464         struct channel_t *ch;
3465         struct un_t *un;
3466         struct digi_t new_digi;
3467         ulong   lock_flags = 0;
3468         unsigned long lock_flags2;
3469
3470         if (!tty || tty->magic != TTY_MAGIC)
3471                 return -EFAULT;
3472
3473         un = tty->driver_data;
3474         if (!un || un->magic != DGAP_UNIT_MAGIC)
3475                 return -EFAULT;
3476
3477         ch = un->un_ch;
3478         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3479                 return -EFAULT;
3480
3481         bd = ch->ch_bd;
3482         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3483                 return -EFAULT;
3484
3485         if (copy_from_user(&new_digi, new_info, sizeof(struct digi_t)))
3486                 return -EFAULT;
3487
3488         DGAP_LOCK(bd->bd_lock, lock_flags);
3489         DGAP_LOCK(ch->ch_lock, lock_flags2);
3490
3491         memcpy(&ch->ch_digi, &new_digi, sizeof(struct digi_t));
3492
3493         if (ch->ch_digi.digi_maxcps < 1)
3494                 ch->ch_digi.digi_maxcps = 1;
3495
3496         if (ch->ch_digi.digi_maxcps > 10000)
3497                 ch->ch_digi.digi_maxcps = 10000;
3498
3499         if (ch->ch_digi.digi_bufsize < 10)
3500                 ch->ch_digi.digi_bufsize = 10;
3501
3502         if (ch->ch_digi.digi_maxchar < 1)
3503                 ch->ch_digi.digi_maxchar = 1;
3504
3505         if (ch->ch_digi.digi_maxchar > ch->ch_digi.digi_bufsize)
3506                 ch->ch_digi.digi_maxchar = ch->ch_digi.digi_bufsize;
3507
3508         if (ch->ch_digi.digi_onlen > DIGI_PLEN)
3509                 ch->ch_digi.digi_onlen = DIGI_PLEN;
3510
3511         if (ch->ch_digi.digi_offlen > DIGI_PLEN)
3512                 ch->ch_digi.digi_offlen = DIGI_PLEN;
3513
3514         dgap_param(tty);
3515
3516         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3517         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3518
3519         return 0;
3520 }
3521
3522 /*
3523  * dgap_tty_digigetedelay()
3524  *
3525  * Ioctl to get the current edelay setting.
3526  *
3527  *
3528  *
3529  */
3530 static int dgap_tty_digigetedelay(struct tty_struct *tty, int __user *retinfo)
3531 {
3532         struct channel_t *ch;
3533         struct un_t *un;
3534         int tmp;
3535         ulong lock_flags;
3536
3537         if (!retinfo)
3538                 return -EFAULT;
3539
3540         if (!tty || tty->magic != TTY_MAGIC)
3541                 return -EFAULT;
3542
3543         un = tty->driver_data;
3544         if (!un || un->magic != DGAP_UNIT_MAGIC)
3545                 return -EFAULT;
3546
3547         ch = un->un_ch;
3548         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3549                 return -EFAULT;
3550
3551         memset(&tmp, 0, sizeof(tmp));
3552
3553         DGAP_LOCK(ch->ch_lock, lock_flags);
3554         tmp = readw(&(ch->ch_bs->edelay));
3555         DGAP_UNLOCK(ch->ch_lock, lock_flags);
3556
3557         if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
3558                 return -EFAULT;
3559
3560         return 0;
3561 }
3562
3563 /*
3564  * dgap_tty_digisetedelay()
3565  *
3566  * Ioctl to set the EDELAY setting
3567  *
3568  */
3569 static int dgap_tty_digisetedelay(struct tty_struct *tty, int __user *new_info)
3570 {
3571         struct board_t *bd;
3572         struct channel_t *ch;
3573         struct un_t *un;
3574         int new_digi;
3575         ulong lock_flags;
3576         ulong lock_flags2;
3577
3578         if (!tty || tty->magic != TTY_MAGIC)
3579                 return -EFAULT;
3580
3581         un = tty->driver_data;
3582         if (!un || un->magic != DGAP_UNIT_MAGIC)
3583                 return -EFAULT;
3584
3585         ch = un->un_ch;
3586         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3587                 return -EFAULT;
3588
3589         bd = ch->ch_bd;
3590         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3591                 return -EFAULT;
3592
3593         if (copy_from_user(&new_digi, new_info, sizeof(int)))
3594                 return -EFAULT;
3595
3596         DGAP_LOCK(bd->bd_lock, lock_flags);
3597         DGAP_LOCK(ch->ch_lock, lock_flags2);
3598
3599         writew((u16) new_digi, &(ch->ch_bs->edelay));
3600
3601         dgap_param(tty);
3602
3603         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3604         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3605
3606         return 0;
3607 }
3608
3609 /*
3610  * dgap_tty_digigetcustombaud()
3611  *
3612  * Ioctl to get the current custom baud rate setting.
3613  */
3614 static int dgap_tty_digigetcustombaud(struct tty_struct *tty,
3615                                         int __user *retinfo)
3616 {
3617         struct channel_t *ch;
3618         struct un_t *un;
3619         int tmp;
3620         ulong lock_flags;
3621
3622         if (!retinfo)
3623                 return -EFAULT;
3624
3625         if (!tty || tty->magic != TTY_MAGIC)
3626                 return -EFAULT;
3627
3628         un = tty->driver_data;
3629         if (!un || un->magic != DGAP_UNIT_MAGIC)
3630                 return -EFAULT;
3631
3632         ch = un->un_ch;
3633         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3634                 return -EFAULT;
3635
3636         memset(&tmp, 0, sizeof(tmp));
3637
3638         DGAP_LOCK(ch->ch_lock, lock_flags);
3639         tmp = dgap_get_custom_baud(ch);
3640         DGAP_UNLOCK(ch->ch_lock, lock_flags);
3641
3642         if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
3643                 return -EFAULT;
3644
3645         return 0;
3646 }
3647
3648 /*
3649  * dgap_tty_digisetcustombaud()
3650  *
3651  * Ioctl to set the custom baud rate setting
3652  */
3653 static int dgap_tty_digisetcustombaud(struct tty_struct *tty,
3654                                         int __user *new_info)
3655 {
3656         struct board_t *bd;
3657         struct channel_t *ch;
3658         struct un_t *un;
3659         uint new_rate;
3660         ulong lock_flags;
3661         ulong lock_flags2;
3662
3663         if (!tty || tty->magic != TTY_MAGIC)
3664                 return -EFAULT;
3665
3666         un = tty->driver_data;
3667         if (!un || un->magic != DGAP_UNIT_MAGIC)
3668                 return -EFAULT;
3669
3670         ch = un->un_ch;
3671         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3672                 return -EFAULT;
3673
3674         bd = ch->ch_bd;
3675         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3676                 return -EFAULT;
3677
3678
3679         if (copy_from_user(&new_rate, new_info, sizeof(unsigned int)))
3680                 return -EFAULT;
3681
3682         if (bd->bd_flags & BD_FEP5PLUS) {
3683
3684                 DGAP_LOCK(bd->bd_lock, lock_flags);
3685                 DGAP_LOCK(ch->ch_lock, lock_flags2);
3686
3687                 ch->ch_custom_speed = new_rate;
3688
3689                 dgap_param(tty);
3690
3691                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3692                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
3693         }
3694
3695         return 0;
3696 }
3697
3698 /*
3699  * dgap_set_termios()
3700  */
3701 static void dgap_tty_set_termios(struct tty_struct *tty,
3702                                 struct ktermios *old_termios)
3703 {
3704         struct board_t *bd;
3705         struct channel_t *ch;
3706         struct un_t *un;
3707         unsigned long lock_flags;
3708         unsigned long lock_flags2;
3709
3710         if (!tty || tty->magic != TTY_MAGIC)
3711                 return;
3712
3713         un = tty->driver_data;
3714         if (!un || un->magic != DGAP_UNIT_MAGIC)
3715                 return;
3716
3717         ch = un->un_ch;
3718         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3719                 return;
3720
3721         bd = ch->ch_bd;
3722         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3723                 return;
3724
3725         DGAP_LOCK(bd->bd_lock, lock_flags);
3726         DGAP_LOCK(ch->ch_lock, lock_flags2);
3727
3728         ch->ch_c_cflag   = tty->termios.c_cflag;
3729         ch->ch_c_iflag   = tty->termios.c_iflag;
3730         ch->ch_c_oflag   = tty->termios.c_oflag;
3731         ch->ch_c_lflag   = tty->termios.c_lflag;
3732         ch->ch_startc    = tty->termios.c_cc[VSTART];
3733         ch->ch_stopc     = tty->termios.c_cc[VSTOP];
3734
3735         dgap_carrier(ch);
3736         dgap_param(tty);
3737
3738         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3739         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3740 }
3741
3742 static void dgap_tty_throttle(struct tty_struct *tty)
3743 {
3744         struct board_t *bd;
3745         struct channel_t *ch;
3746         struct un_t *un;
3747         ulong   lock_flags;
3748         ulong   lock_flags2;
3749
3750         if (!tty || tty->magic != TTY_MAGIC)
3751                 return;
3752
3753         un = tty->driver_data;
3754         if (!un || un->magic != DGAP_UNIT_MAGIC)
3755                 return;
3756
3757         ch = un->un_ch;
3758         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3759                 return;
3760
3761         bd = ch->ch_bd;
3762         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3763                 return;
3764
3765         DGAP_LOCK(bd->bd_lock, lock_flags);
3766         DGAP_LOCK(ch->ch_lock, lock_flags2);
3767
3768         ch->ch_flags |= (CH_RXBLOCK);
3769 #if 1
3770         dgap_cmdw(ch, RPAUSE, 0, 0);
3771 #endif
3772
3773         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3774         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3775
3776 }
3777
3778 static void dgap_tty_unthrottle(struct tty_struct *tty)
3779 {
3780         struct board_t *bd;
3781         struct channel_t *ch;
3782         struct un_t *un;
3783         ulong   lock_flags;
3784         ulong   lock_flags2;
3785
3786         if (!tty || tty->magic != TTY_MAGIC)
3787                 return;
3788
3789         un = tty->driver_data;
3790         if (!un || un->magic != DGAP_UNIT_MAGIC)
3791                 return;
3792
3793         ch = un->un_ch;
3794         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3795                 return;
3796
3797         bd = ch->ch_bd;
3798         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3799                 return;
3800
3801         DGAP_LOCK(bd->bd_lock, lock_flags);
3802         DGAP_LOCK(ch->ch_lock, lock_flags2);
3803
3804         ch->ch_flags &= ~(CH_RXBLOCK);
3805
3806 #if 1
3807         dgap_cmdw(ch, RRESUME, 0, 0);
3808 #endif
3809
3810         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3811         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3812 }
3813
3814 static void dgap_tty_start(struct tty_struct *tty)
3815 {
3816         struct board_t *bd;
3817         struct channel_t *ch;
3818         struct un_t *un;
3819         ulong   lock_flags;
3820         ulong   lock_flags2;
3821
3822         if (!tty || tty->magic != TTY_MAGIC)
3823                 return;
3824
3825         un = tty->driver_data;
3826         if (!un || un->magic != DGAP_UNIT_MAGIC)
3827                 return;
3828
3829         ch = un->un_ch;
3830         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3831                 return;
3832
3833         bd = ch->ch_bd;
3834         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3835                 return;
3836
3837         DGAP_LOCK(bd->bd_lock, lock_flags);
3838         DGAP_LOCK(ch->ch_lock, lock_flags2);
3839
3840         dgap_cmdw(ch, RESUMETX, 0, 0);
3841
3842         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3843         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3844
3845 }
3846
3847 static void dgap_tty_stop(struct tty_struct *tty)
3848 {
3849         struct board_t *bd;
3850         struct channel_t *ch;
3851         struct un_t *un;
3852         ulong   lock_flags;
3853         ulong   lock_flags2;
3854
3855         if (!tty || tty->magic != TTY_MAGIC)
3856                 return;
3857
3858         un = tty->driver_data;
3859         if (!un || un->magic != DGAP_UNIT_MAGIC)
3860                 return;
3861
3862         ch = un->un_ch;
3863         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3864                 return;
3865
3866         bd = ch->ch_bd;
3867         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3868                 return;
3869
3870         DGAP_LOCK(bd->bd_lock, lock_flags);
3871         DGAP_LOCK(ch->ch_lock, lock_flags2);
3872
3873         dgap_cmdw(ch, PAUSETX, 0, 0);
3874
3875         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3876         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3877
3878 }
3879
3880 /*
3881  * dgap_tty_flush_chars()
3882  *
3883  * Flush the cook buffer
3884  *
3885  * Note to self, and any other poor souls who venture here:
3886  *
3887  * flush in this case DOES NOT mean dispose of the data.
3888  * instead, it means "stop buffering and send it if you
3889  * haven't already."  Just guess how I figured that out...   SRW 2-Jun-98
3890  *
3891  * It is also always called in interrupt context - JAR 8-Sept-99
3892  */
3893 static void dgap_tty_flush_chars(struct tty_struct *tty)
3894 {
3895         struct board_t *bd;
3896         struct channel_t *ch;
3897         struct un_t *un;
3898         ulong   lock_flags;
3899         ulong   lock_flags2;
3900
3901         if (!tty || tty->magic != TTY_MAGIC)
3902                 return;
3903
3904         un = tty->driver_data;
3905         if (!un || un->magic != DGAP_UNIT_MAGIC)
3906                 return;
3907
3908         ch = un->un_ch;
3909         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3910                 return;
3911
3912         bd = ch->ch_bd;
3913         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3914                 return;
3915
3916         DGAP_LOCK(bd->bd_lock, lock_flags);
3917         DGAP_LOCK(ch->ch_lock, lock_flags2);
3918
3919         /* TODO: Do something here */
3920
3921         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3922         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3923 }
3924
3925 /*
3926  * dgap_tty_flush_buffer()
3927  *
3928  * Flush Tx buffer (make in == out)
3929  */
3930 static void dgap_tty_flush_buffer(struct tty_struct *tty)
3931 {
3932         struct board_t *bd;
3933         struct channel_t *ch;
3934         struct un_t *un;
3935         ulong   lock_flags;
3936         ulong   lock_flags2;
3937         u16     head = 0;
3938
3939         if (!tty || tty->magic != TTY_MAGIC)
3940                 return;
3941
3942         un = tty->driver_data;
3943         if (!un || un->magic != DGAP_UNIT_MAGIC)
3944                 return;
3945
3946         ch = un->un_ch;
3947         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
3948                 return;
3949
3950         bd = ch->ch_bd;
3951         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
3952                 return;
3953
3954         DGAP_LOCK(bd->bd_lock, lock_flags);
3955         DGAP_LOCK(ch->ch_lock, lock_flags2);
3956
3957         ch->ch_flags &= ~CH_STOP;
3958         head = readw(&(ch->ch_bs->tx_head));
3959         dgap_cmdw(ch, FLUSHTX, (u16) head, 0);
3960         dgap_cmdw(ch, RESUMETX, 0, 0);
3961         if (ch->ch_tun.un_flags & (UN_LOW|UN_EMPTY)) {
3962                 ch->ch_tun.un_flags &= ~(UN_LOW|UN_EMPTY);
3963                 wake_up_interruptible(&ch->ch_tun.un_flags_wait);
3964         }
3965         if (ch->ch_pun.un_flags & (UN_LOW|UN_EMPTY)) {
3966                 ch->ch_pun.un_flags &= ~(UN_LOW|UN_EMPTY);
3967                 wake_up_interruptible(&ch->ch_pun.un_flags_wait);
3968         }
3969
3970         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
3971         DGAP_UNLOCK(bd->bd_lock, lock_flags);
3972         if (waitqueue_active(&tty->write_wait))
3973                 wake_up_interruptible(&tty->write_wait);
3974         tty_wakeup(tty);
3975 }
3976
3977 /*****************************************************************************
3978  *
3979  * The IOCTL function and all of its helpers
3980  *
3981  *****************************************************************************/
3982
3983 /*
3984  * dgap_tty_ioctl()
3985  *
3986  * The usual assortment of ioctl's
3987  */
3988 static int dgap_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
3989                 unsigned long arg)
3990 {
3991         struct board_t *bd;
3992         struct channel_t *ch;
3993         struct un_t *un;
3994         int rc;
3995         u16     head = 0;
3996         ulong   lock_flags = 0;
3997         ulong   lock_flags2 = 0;
3998         void __user *uarg = (void __user *) arg;
3999
4000         if (!tty || tty->magic != TTY_MAGIC)
4001                 return -ENODEV;
4002
4003         un = tty->driver_data;
4004         if (!un || un->magic != DGAP_UNIT_MAGIC)
4005                 return -ENODEV;
4006
4007         ch = un->un_ch;
4008         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
4009                 return -ENODEV;
4010
4011         bd = ch->ch_bd;
4012         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
4013                 return -ENODEV;
4014
4015         DGAP_LOCK(bd->bd_lock, lock_flags);
4016         DGAP_LOCK(ch->ch_lock, lock_flags2);
4017
4018         if (un->un_open_count <= 0) {
4019                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4020                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4021                 return -EIO;
4022         }
4023
4024         switch (cmd) {
4025
4026         /* Here are all the standard ioctl's that we MUST implement */
4027
4028         case TCSBRK:
4029                 /*
4030                  * TCSBRK is SVID version: non-zero arg --> no break
4031                  * this behaviour is exploited by tcdrain().
4032                  *
4033                  * According to POSIX.1 spec (7.2.2.1.2) breaks should be
4034                  * between 0.25 and 0.5 seconds so we'll ask for something
4035                  * in the middle: 0.375 seconds.
4036                  */
4037                 rc = tty_check_change(tty);
4038                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4039                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4040                 if (rc)
4041                         return rc;
4042
4043                 rc = dgap_wait_for_drain(tty);
4044
4045                 if (rc)
4046                         return -EINTR;
4047
4048                 DGAP_LOCK(bd->bd_lock, lock_flags);
4049                 DGAP_LOCK(ch->ch_lock, lock_flags2);
4050
4051                 if (((cmd == TCSBRK) && (!arg)) || (cmd == TCSBRKP))
4052                         dgap_cmdw(ch, SBREAK, (u16) SBREAK_TIME, 0);
4053
4054                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4055                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4056
4057                 return 0;
4058
4059         case TCSBRKP:
4060                 /* support for POSIX tcsendbreak()
4061
4062                  * According to POSIX.1 spec (7.2.2.1.2) breaks should be
4063                  * between 0.25 and 0.5 seconds so we'll ask for something
4064                  * in the middle: 0.375 seconds.
4065                  */
4066                 rc = tty_check_change(tty);
4067                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4068                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4069                 if (rc)
4070                         return rc;
4071
4072                 rc = dgap_wait_for_drain(tty);
4073                 if (rc)
4074                         return -EINTR;
4075
4076                 DGAP_LOCK(bd->bd_lock, lock_flags);
4077                 DGAP_LOCK(ch->ch_lock, lock_flags2);
4078
4079                 dgap_cmdw(ch, SBREAK, (u16) SBREAK_TIME, 0);
4080
4081                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4082                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4083
4084                 return 0;
4085
4086         case TIOCSBRK:
4087                 /*
4088                  * FEP5 doesn't support turning on a break unconditionally.
4089                  * The FEP5 device will stop sending a break automatically
4090                  * after the specified time value that was sent when turning on
4091                  * the break.
4092                  */
4093                 rc = tty_check_change(tty);
4094                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4095                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4096                 if (rc)
4097                         return rc;
4098
4099                 rc = dgap_wait_for_drain(tty);
4100                 if (rc)
4101                         return -EINTR;
4102
4103                 DGAP_LOCK(bd->bd_lock, lock_flags);
4104                 DGAP_LOCK(ch->ch_lock, lock_flags2);
4105
4106                 dgap_cmdw(ch, SBREAK, (u16) SBREAK_TIME, 0);
4107
4108                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4109                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4110
4111                 return 0;
4112
4113         case TIOCCBRK:
4114                 /*
4115                  * FEP5 doesn't support turning off a break unconditionally.
4116                  * The FEP5 device will stop sending a break automatically
4117                  * after the specified time value that was sent when turning on
4118                  * the break.
4119                  */
4120                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4121                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4122                 return 0;
4123
4124         case TIOCGSOFTCAR:
4125
4126                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4127                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4128
4129                 rc = put_user(C_CLOCAL(tty) ? 1 : 0,
4130                                 (unsigned long __user *) arg);
4131                 return rc;
4132
4133         case TIOCSSOFTCAR:
4134                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4135                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4136
4137                 rc = get_user(arg, (unsigned long __user *) arg);
4138                 if (rc)
4139                         return rc;
4140
4141                 DGAP_LOCK(bd->bd_lock, lock_flags);
4142                 DGAP_LOCK(ch->ch_lock, lock_flags2);
4143                 tty->termios.c_cflag = ((tty->termios.c_cflag & ~CLOCAL) |
4144                                                 (arg ? CLOCAL : 0));
4145                 dgap_param(tty);
4146                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4147                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4148
4149                 return 0;
4150
4151         case TIOCMGET:
4152                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4153                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4154                 return dgap_get_modem_info(ch, uarg);
4155
4156         case TIOCMBIS:
4157         case TIOCMBIC:
4158         case TIOCMSET:
4159                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4160                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4161                 return dgap_set_modem_info(tty, cmd, uarg);
4162
4163                 /*
4164                  * Here are any additional ioctl's that we want to implement
4165                  */
4166
4167         case TCFLSH:
4168                 /*
4169                  * The linux tty driver doesn't have a flush
4170                  * input routine for the driver, assuming all backed
4171                  * up data is in the line disc. buffers.  However,
4172                  * we all know that's not the case.  Here, we
4173                  * act on the ioctl, but then lie and say we didn't
4174                  * so the line discipline will process the flush
4175                  * also.
4176                  */
4177                 rc = tty_check_change(tty);
4178                 if (rc) {
4179                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4180                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4181                         return rc;
4182                 }
4183
4184                 if ((arg == TCIFLUSH) || (arg == TCIOFLUSH)) {
4185                         if (!(un->un_type == DGAP_PRINT)) {
4186                                 head = readw(&(ch->ch_bs->rx_head));
4187                                 writew(head, &(ch->ch_bs->rx_tail));
4188                                 writeb(0, &(ch->ch_bs->orun));
4189                         }
4190                 }
4191
4192                 if ((arg == TCOFLUSH) || (arg == TCIOFLUSH)) {
4193                         ch->ch_flags &= ~CH_STOP;
4194                         head = readw(&(ch->ch_bs->tx_head));
4195                         dgap_cmdw(ch, FLUSHTX, (u16) head, 0);
4196                         dgap_cmdw(ch, RESUMETX, 0, 0);
4197                         if (ch->ch_tun.un_flags & (UN_LOW|UN_EMPTY)) {
4198                                 ch->ch_tun.un_flags &= ~(UN_LOW|UN_EMPTY);
4199                                 wake_up_interruptible(&ch->ch_tun.un_flags_wait);
4200                         }
4201                         if (ch->ch_pun.un_flags & (UN_LOW|UN_EMPTY)) {
4202                                 ch->ch_pun.un_flags &= ~(UN_LOW|UN_EMPTY);
4203                                 wake_up_interruptible(&ch->ch_pun.un_flags_wait);
4204                         }
4205                         if (waitqueue_active(&tty->write_wait))
4206                                 wake_up_interruptible(&tty->write_wait);
4207
4208                         /* Can't hold any locks when calling tty_wakeup! */
4209                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4210                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4211                         tty_wakeup(tty);
4212                         DGAP_LOCK(bd->bd_lock, lock_flags);
4213                         DGAP_LOCK(ch->ch_lock, lock_flags2);
4214                 }
4215
4216                 /* pretend we didn't recognize this IOCTL */
4217                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4218                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4219
4220                 return -ENOIOCTLCMD;
4221
4222         case TCSETSF:
4223         case TCSETSW:
4224                 /*
4225                  * The linux tty driver doesn't have a flush
4226                  * input routine for the driver, assuming all backed
4227                  * up data is in the line disc. buffers.  However,
4228                  * we all know that's not the case.  Here, we
4229                  * act on the ioctl, but then lie and say we didn't
4230                  * so the line discipline will process the flush
4231                  * also.
4232                  */
4233                 if (cmd == TCSETSF) {
4234                         /* flush rx */
4235                         ch->ch_flags &= ~CH_STOP;
4236                         head = readw(&(ch->ch_bs->rx_head));
4237                         writew(head, &(ch->ch_bs->rx_tail));
4238                 }
4239
4240                 /* now wait for all the output to drain */
4241                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4242                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4243                 rc = dgap_wait_for_drain(tty);
4244                 if (rc)
4245                         return -EINTR;
4246
4247                 /* pretend we didn't recognize this */
4248                 return -ENOIOCTLCMD;
4249
4250         case TCSETAW:
4251
4252                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4253                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4254                 rc = dgap_wait_for_drain(tty);
4255                 if (rc)
4256                         return -EINTR;
4257
4258                 /* pretend we didn't recognize this */
4259                 return -ENOIOCTLCMD;
4260
4261         case TCXONC:
4262                 /*
4263                  * The Linux Line Discipline (LD) would do this for us if we
4264                  * let it, but we have the special firmware options to do this
4265                  * the "right way" regardless of hardware or software flow
4266                  * control so we'll do it outselves instead of letting the LD
4267                  * do it.
4268                  */
4269                 rc = tty_check_change(tty);
4270                 if (rc) {
4271                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4272                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4273                         return rc;
4274                 }
4275
4276                 switch (arg) {
4277
4278                 case TCOON:
4279                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4280                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4281                         dgap_tty_start(tty);
4282                         return 0;
4283                 case TCOOFF:
4284                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4285                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4286                         dgap_tty_stop(tty);
4287                         return 0;
4288                 case TCION:
4289                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4290                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4291                         /* Make the ld do it */
4292                         return -ENOIOCTLCMD;
4293                 case TCIOFF:
4294                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4295                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4296                         /* Make the ld do it */
4297                         return -ENOIOCTLCMD;
4298                 default:
4299                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4300                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4301                         return -EINVAL;
4302                 }
4303
4304         case DIGI_GETA:
4305                 /* get information for ditty */
4306                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4307                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4308                 return dgap_tty_digigeta(tty, uarg);
4309
4310         case DIGI_SETAW:
4311         case DIGI_SETAF:
4312
4313                 /* set information for ditty */
4314                 if (cmd == (DIGI_SETAW)) {
4315
4316                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4317                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4318                         rc = dgap_wait_for_drain(tty);
4319                         if (rc)
4320                                 return -EINTR;
4321                         DGAP_LOCK(bd->bd_lock, lock_flags);
4322                         DGAP_LOCK(ch->ch_lock, lock_flags2);
4323                 } else
4324                         tty_ldisc_flush(tty);
4325                 /* fall thru */
4326
4327         case DIGI_SETA:
4328                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4329                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4330                 return dgap_tty_digiseta(tty, uarg);
4331
4332         case DIGI_GEDELAY:
4333                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4334                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4335                 return dgap_tty_digigetedelay(tty, uarg);
4336
4337         case DIGI_SEDELAY:
4338                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4339                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4340                 return dgap_tty_digisetedelay(tty, uarg);
4341
4342         case DIGI_GETCUSTOMBAUD:
4343                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4344                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4345                 return dgap_tty_digigetcustombaud(tty, uarg);
4346
4347         case DIGI_SETCUSTOMBAUD:
4348                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4349                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4350                 return dgap_tty_digisetcustombaud(tty, uarg);
4351
4352         case DIGI_RESET_PORT:
4353                 dgap_firmware_reset_port(ch);
4354                 dgap_param(tty);
4355                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4356                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4357                 return 0;
4358
4359         default:
4360                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
4361                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4362
4363                 return -ENOIOCTLCMD;
4364         }
4365 }
4366
4367 static int dgap_after_config_loaded(int board)
4368 {
4369         /*
4370          * Initialize KME waitqueues...
4371          */
4372         init_waitqueue_head(&(dgap_Board[board]->kme_wait));
4373
4374         /*
4375          * allocate flip buffer for board.
4376          */
4377         dgap_Board[board]->flipbuf = kmalloc(MYFLIPLEN, GFP_ATOMIC);
4378         if (!dgap_Board[board]->flipbuf)
4379                 return -ENOMEM;
4380
4381         dgap_Board[board]->flipflagbuf = kmalloc(MYFLIPLEN, GFP_ATOMIC);
4382         if (!dgap_Board[board]->flipflagbuf) {
4383                 kfree(dgap_Board[board]->flipbuf);
4384                 return -ENOMEM;
4385         }
4386
4387         return 0;
4388 }
4389
4390 /*
4391  * Create pr and tty device entries
4392  */
4393 static int dgap_tty_register_ports(struct board_t *brd)
4394 {
4395         struct channel_t *ch;
4396         int i;
4397
4398         brd->SerialPorts = kcalloc(brd->nasync, sizeof(*brd->SerialPorts),
4399                                         GFP_KERNEL);
4400         if (brd->SerialPorts == NULL)
4401                 return -ENOMEM;
4402         for (i = 0; i < brd->nasync; i++)
4403                 tty_port_init(&brd->SerialPorts[i]);
4404
4405         brd->PrinterPorts = kcalloc(brd->nasync, sizeof(*brd->PrinterPorts),
4406                                         GFP_KERNEL);
4407         if (brd->PrinterPorts == NULL) {
4408                 kfree(brd->SerialPorts);
4409                 return -ENOMEM;
4410         }
4411         for (i = 0; i < brd->nasync; i++)
4412                 tty_port_init(&brd->PrinterPorts[i]);
4413
4414         ch = brd->channels[0];
4415         for (i = 0; i < brd->nasync; i++, ch = brd->channels[i]) {
4416
4417                 struct device *classp;
4418
4419                 classp = tty_port_register_device(&brd->SerialPorts[i],
4420                                         brd->SerialDriver,
4421                                         brd->firstminor + i, NULL);
4422
4423                 dgap_create_tty_sysfs(&ch->ch_tun, classp);
4424                 ch->ch_tun.un_sysfs = classp;
4425
4426                 classp = tty_port_register_device(&brd->PrinterPorts[i],
4427                                         brd->PrintDriver,
4428                                         brd->firstminor + i, NULL);
4429
4430                 dgap_create_tty_sysfs(&ch->ch_pun, classp);
4431                 ch->ch_pun.un_sysfs = classp;
4432         }
4433         dgap_create_ports_sysfiles(brd);
4434
4435         return 0;
4436 }
4437
4438 /*
4439  * Copies the BIOS code from the user to the board,
4440  * and starts the BIOS running.
4441  */
4442 static void dgap_do_bios_load(struct board_t *brd, uchar __user *ubios, int len)
4443 {
4444         uchar *addr;
4445         uint offset;
4446         int i;
4447
4448         if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase)
4449                 return;
4450
4451         addr = brd->re_map_membase;
4452
4453         /*
4454          * clear POST area
4455          */
4456         for (i = 0; i < 16; i++)
4457                 writeb(0, addr + POSTAREA + i);
4458
4459         /*
4460          * Download bios
4461          */
4462         offset = 0x1000;
4463         memcpy_toio(addr + offset, ubios, len);
4464
4465         writel(0x0bf00401, addr);
4466         writel(0, (addr + 4));
4467
4468         /* Clear the reset, and change states. */
4469         writeb(FEPCLR, brd->re_map_port);
4470 }
4471
4472 /*
4473  * Checks to see if the BIOS completed running on the card.
4474  */
4475 static void dgap_do_wait_for_bios(struct board_t *brd)
4476 {
4477         uchar *addr;
4478         u16 word;
4479         u16 err1;
4480         u16 err2;
4481
4482         if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase)
4483                 return;
4484
4485         addr = brd->re_map_membase;
4486         word = readw(addr + POSTAREA);
4487
4488         /*
4489          * It can take 5-6 seconds for a board to
4490          * pass the bios self test and post results.
4491          * Give it 10 seconds.
4492          */
4493         brd->wait_for_bios = 0;
4494         while (brd->wait_for_bios < 1000) {
4495                 /* Check to see if BIOS thinks board is good. (GD). */
4496                 if (word == *(u16 *) "GD") {
4497                         brd->state = FINISHED_BIOS_LOAD;
4498                         return;
4499                 }
4500                 msleep_interruptible(10);
4501                 brd->wait_for_bios++;
4502                 word = readw(addr + POSTAREA);
4503         }
4504
4505         /* Gave up on board after too long of time taken */
4506         err1 = readw(addr + SEQUENCE);
4507         err2 = readw(addr + ERROR);
4508         pr_warn("dgap: %s failed diagnostics.  Error #(%x,%x).\n",
4509                 brd->name, err1, err2);
4510         brd->state = BOARD_FAILED;
4511         brd->dpastatus = BD_NOBIOS;
4512 }
4513
4514 /*
4515  * Copies the FEP code from the user to the board,
4516  * and starts the FEP running.
4517  */
4518 static void dgap_do_fep_load(struct board_t *brd, uchar *ufep, int len)
4519 {
4520         uchar *addr;
4521         uint offset;
4522
4523         if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase)
4524                 return;
4525
4526         addr = brd->re_map_membase;
4527
4528         /*
4529          * Download FEP
4530          */
4531         offset = 0x1000;
4532         memcpy_toio(addr + offset, ufep, len);
4533
4534         /*
4535          * If board is a concentrator product, we need to give
4536          * it its config string describing how the concentrators look.
4537          */
4538         if ((brd->type == PCX) || (brd->type == PEPC)) {
4539                 uchar string[100];
4540                 uchar *config, *xconfig;
4541                 int i = 0;
4542
4543                 xconfig = dgap_create_config_string(brd, string);
4544
4545                 /* Write string to board memory */
4546                 config = addr + CONFIG;
4547                 for (; i < CONFIGSIZE; i++, config++, xconfig++) {
4548                         writeb(*xconfig, config);
4549                         if ((*xconfig & 0xff) == 0xff)
4550                                 break;
4551                 }
4552         }
4553
4554         writel(0xbfc01004, (addr + 0xc34));
4555         writel(0x3, (addr + 0xc30));
4556
4557 }
4558
4559 /*
4560  * Waits for the FEP to report thats its ready for us to use.
4561  */
4562 static void dgap_do_wait_for_fep(struct board_t *brd)
4563 {
4564         uchar *addr;
4565         u16 word;
4566         u16 err1;
4567         u16 err2;
4568
4569         if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase)
4570                 return;
4571
4572         addr = brd->re_map_membase;
4573         word = readw(addr + FEPSTAT);
4574
4575         /*
4576          * It can take 2-3 seconds for the FEP to
4577          * be up and running. Give it 5 secs.
4578          */
4579         brd->wait_for_fep = 0;
4580         while (brd->wait_for_fep < 500) {
4581                 /* Check to see if FEP is up and running now. */
4582                 if (word == *(u16 *) "OS") {
4583                         brd->state = FINISHED_FEP_LOAD;
4584                         /*
4585                          * Check to see if the board can support FEP5+ commands.
4586                         */
4587                         word = readw(addr + FEP5_PLUS);
4588                         if (word == *(u16 *) "5A")
4589                                 brd->bd_flags |= BD_FEP5PLUS;
4590
4591                         return;
4592                 }
4593                 msleep_interruptible(10);
4594                 brd->wait_for_fep++;
4595                 word = readw(addr + FEPSTAT);
4596         }
4597
4598         /* Gave up on board after too long of time taken */
4599         err1 = readw(addr + SEQUENCE);
4600         err2 = readw(addr + ERROR);
4601         pr_warn("dgap: FEPOS for %s not functioning.  Error #(%x,%x).\n",
4602                 brd->name, err1, err2);
4603         brd->state = BOARD_FAILED;
4604         brd->dpastatus = BD_NOFEP;
4605 }
4606
4607 /*
4608  * Physically forces the FEP5 card to reset itself.
4609  */
4610 static void dgap_do_reset_board(struct board_t *brd)
4611 {
4612         uchar check;
4613         u32 check1;
4614         u32 check2;
4615         int i = 0;
4616
4617         if (!brd || (brd->magic != DGAP_BOARD_MAGIC) ||
4618             !brd->re_map_membase || !brd->re_map_port)
4619                 return;
4620
4621         /* FEPRST does not vary among supported boards */
4622         writeb(FEPRST, brd->re_map_port);
4623
4624         for (i = 0; i <= 1000; i++) {
4625                 check = readb(brd->re_map_port) & 0xe;
4626                 if (check == FEPRST)
4627                         break;
4628                 udelay(10);
4629
4630         }
4631         if (i > 1000) {
4632                 pr_warn("dgap: Board not resetting...  Failing board.\n");
4633                 brd->state = BOARD_FAILED;
4634                 brd->dpastatus = BD_NOFEP;
4635                 return;
4636         }
4637
4638         /*
4639          * Make sure there really is memory out there.
4640          */
4641         writel(0xa55a3cc3, (brd->re_map_membase + LOWMEM));
4642         writel(0x5aa5c33c, (brd->re_map_membase + HIGHMEM));
4643         check1 = readl(brd->re_map_membase + LOWMEM);
4644         check2 = readl(brd->re_map_membase + HIGHMEM);
4645
4646         if ((check1 != 0xa55a3cc3) || (check2 != 0x5aa5c33c)) {
4647                 pr_warn("dgap: No memory at %p for board.\n",
4648                         brd->re_map_membase);
4649                 brd->state = BOARD_FAILED;
4650                 brd->dpastatus = BD_NOFEP;
4651                 return;
4652         }
4653
4654         if (brd->state != BOARD_FAILED)
4655                 brd->state = FINISHED_RESET;
4656 }
4657
4658 #ifdef DIGI_CONCENTRATORS_SUPPORTED
4659 /*
4660  * Sends a concentrator image into the FEP5 board.
4661  */
4662 static void dgap_do_conc_load(struct board_t *brd, uchar *uaddr, int len)
4663 {
4664         char *vaddr;
4665         u16 offset = 0;
4666         struct downld_t *to_dp;
4667
4668         if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase)
4669                 return;
4670
4671         vaddr = brd->re_map_membase;
4672
4673         offset = readw((u16 *) (vaddr + DOWNREQ));
4674         to_dp = (struct downld_t *) (vaddr + (int) offset);
4675         memcpy_toio(to_dp, uaddr, len);
4676
4677         /* Tell card we have data for it */
4678         writew(0, vaddr + (DOWNREQ));
4679
4680         brd->conc_dl_status = NO_PENDING_CONCENTRATOR_REQUESTS;
4681 }
4682 #endif
4683
4684 #define EXPANSION_ROM_SIZE      (64 * 1024)
4685 #define FEP5_ROM_MAGIC          (0xFEFFFFFF)
4686
4687 static void dgap_get_vpd(struct board_t *brd)
4688 {
4689         u32 magic;
4690         u32 base_offset;
4691         u16 rom_offset;
4692         u16 vpd_offset;
4693         u16 image_length;
4694         u16 i;
4695         uchar byte1;
4696         uchar byte2;
4697
4698         /*
4699          * Poke the magic number at the PCI Rom Address location.
4700          * If VPD is supported, the value read from that address
4701          * will be non-zero.
4702          */
4703         magic = FEP5_ROM_MAGIC;
4704         pci_write_config_dword(brd->pdev, PCI_ROM_ADDRESS, magic);
4705         pci_read_config_dword(brd->pdev, PCI_ROM_ADDRESS, &magic);
4706
4707         /* VPD not supported, bail */
4708         if (!magic)
4709                 return;
4710
4711         /*
4712          * To get to the OTPROM memory, we have to send the boards base
4713          * address or'ed with 1 into the PCI Rom Address location.
4714          */
4715         magic = brd->membase | 0x01;
4716         pci_write_config_dword(brd->pdev, PCI_ROM_ADDRESS, magic);
4717         pci_read_config_dword(brd->pdev, PCI_ROM_ADDRESS, &magic);
4718
4719         byte1 = readb(brd->re_map_membase);
4720         byte2 = readb(brd->re_map_membase + 1);
4721
4722         /*
4723          * If the board correctly swapped to the OTPROM memory,
4724          * the first 2 bytes (header) should be 0x55, 0xAA
4725          */
4726         if (byte1 == 0x55 && byte2 == 0xAA) {
4727
4728                 base_offset = 0;
4729
4730                 /*
4731                  * We have to run through all the OTPROM memory looking
4732                  * for the VPD offset.
4733                  */
4734                 while (base_offset <= EXPANSION_ROM_SIZE) {
4735
4736                         /*
4737                          * Lots of magic numbers here.
4738                          *
4739                          * The VPD offset is located inside the ROM Data
4740                          * Structure.
4741                          *
4742                          * We also have to remember the length of each
4743                          * ROM Data Structure, so we can "hop" to the next
4744                          * entry if the VPD isn't in the current
4745                          * ROM Data Structure.
4746                          */
4747                         rom_offset = readw(brd->re_map_membase +
4748                                                 base_offset + 0x18);
4749                         image_length = readw(brd->re_map_membase +
4750                                                 rom_offset + 0x10) * 512;
4751                         vpd_offset = readw(brd->re_map_membase +
4752                                                 rom_offset + 0x08);
4753
4754                         /* Found the VPD entry */
4755                         if (vpd_offset)
4756                                 break;
4757
4758                         /* We didn't find a VPD entry, go to next ROM entry. */
4759                         base_offset += image_length;
4760
4761                         byte1 = readb(brd->re_map_membase + base_offset);
4762                         byte2 = readb(brd->re_map_membase + base_offset + 1);
4763
4764                         /*
4765                          * If the new ROM offset doesn't have 0x55, 0xAA
4766                          * as its header, we have run out of ROM.
4767                          */
4768                         if (byte1 != 0x55 || byte2 != 0xAA)
4769                                 break;
4770                 }
4771
4772                 /*
4773                  * If we have a VPD offset, then mark the board
4774                  * as having a valid VPD, and copy VPDSIZE (512) bytes of
4775                  * that VPD to the buffer we have in our board structure.
4776                  */
4777                 if (vpd_offset) {
4778                         brd->bd_flags |= BD_HAS_VPD;
4779                         for (i = 0; i < VPDSIZE; i++) {
4780                                 brd->vpd[i] = readb(brd->re_map_membase +
4781                                                         vpd_offset + i);
4782                         }
4783                 }
4784         }
4785
4786         /*
4787          * We MUST poke the magic number at the PCI Rom Address location again.
4788          * This makes the card report the regular board memory back to us,
4789          * rather than the OTPROM memory.
4790          */
4791         magic = FEP5_ROM_MAGIC;
4792         pci_write_config_dword(brd->pdev, PCI_ROM_ADDRESS, magic);
4793 }
4794
4795 /*
4796  * Our board poller function.
4797  */
4798 static void dgap_poll_tasklet(unsigned long data)
4799 {
4800         struct board_t *bd = (struct board_t *) data;
4801         ulong  lock_flags;
4802         ulong  lock_flags2;
4803         char *vaddr;
4804         u16 head, tail;
4805
4806         if (!bd || (bd->magic != DGAP_BOARD_MAGIC))
4807                 return;
4808
4809         if (bd->inhibit_poller)
4810                 return;
4811
4812         DGAP_LOCK(bd->bd_lock, lock_flags);
4813
4814         vaddr = bd->re_map_membase;
4815
4816         /*
4817          * If board is ready, parse deeper to see if there is anything to do.
4818          */
4819         if (bd->state == BOARD_READY) {
4820
4821                 struct ev_t *eaddr = NULL;
4822
4823                 if (!bd->re_map_membase) {
4824                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4825                         return;
4826                 }
4827                 if (!bd->re_map_port) {
4828                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4829                         return;
4830                 }
4831
4832                 if (!bd->nasync)
4833                         goto out;
4834
4835                 eaddr = (struct ev_t *) (vaddr + EVBUF);
4836
4837                 /* Get our head and tail */
4838                 head = readw(&(eaddr->ev_head));
4839                 tail = readw(&(eaddr->ev_tail));
4840
4841                 /*
4842                  * If there is an event pending. Go service it.
4843                  */
4844                 if (head != tail) {
4845                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
4846                         dgap_event(bd);
4847                         DGAP_LOCK(bd->bd_lock, lock_flags);
4848                 }
4849
4850 out:
4851                 /*
4852                  * If board is doing interrupts, ACK the interrupt.
4853                  */
4854                 if (bd && bd->intr_running)
4855                         readb(bd->re_map_port + 2);
4856
4857                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
4858                 return;
4859         }
4860
4861         /* Our state machine to get the board up and running */
4862
4863         /* Reset board */
4864         if (bd->state == NEED_RESET) {
4865
4866                 /* Get VPD info */
4867                 dgap_get_vpd(bd);
4868
4869                 dgap_do_reset_board(bd);
4870         }
4871
4872         /* Move to next state */
4873         if (bd->state == FINISHED_RESET)
4874                 bd->state = NEED_CONFIG;
4875
4876         if (bd->state == NEED_CONFIG) {
4877                 /*
4878                  * Match this board to a config the user created for us.
4879                  */
4880                 bd->bd_config = dgap_find_config(bd->type, bd->pci_bus,
4881                                                         bd->pci_slot);
4882
4883                 /*
4884                  * Because the 4 port Xr products share the same PCI ID
4885                  * as the 8 port Xr products, if we receive a NULL config
4886                  * back, and this is a PAPORT8 board, retry with a
4887                  * PAPORT4 attempt as well.
4888                  */
4889                 if (bd->type == PAPORT8 && !bd->bd_config)
4890                         bd->bd_config = dgap_find_config(PAPORT4, bd->pci_bus,
4891                                                                 bd->pci_slot);
4892
4893                 /*
4894                  * Register the ttys (if any) into the kernel.
4895                  */
4896                 if (bd->bd_config)
4897                         bd->state = FINISHED_CONFIG;
4898                 else
4899                         bd->state = CONFIG_NOT_FOUND;
4900         }
4901
4902         /* Move to next state */
4903         if (bd->state == FINISHED_CONFIG)
4904                 bd->state = NEED_DEVICE_CREATION;
4905
4906         /* Move to next state */
4907         if (bd->state == NEED_DEVICE_CREATION) {
4908                 /*
4909                  * Signal downloader, its got some work to do.
4910                  */
4911                 DGAP_LOCK(dgap_dl_lock, lock_flags2);
4912                 if (dgap_dl_action != 1) {
4913                         dgap_dl_action = 1;
4914                         wake_up_interruptible(&dgap_dl_wait);
4915                 }
4916                 DGAP_UNLOCK(dgap_dl_lock, lock_flags2);
4917         }
4918
4919         /* Move to next state */
4920         if (bd->state == FINISHED_DEVICE_CREATION)
4921                 bd->state = NEED_BIOS_LOAD;
4922
4923         /* Move to next state */
4924         if (bd->state == NEED_BIOS_LOAD) {
4925                 /*
4926                  * Signal downloader, its got some work to do.
4927                  */
4928                 DGAP_LOCK(dgap_dl_lock, lock_flags2);
4929                 if (dgap_dl_action != 1) {
4930                         dgap_dl_action = 1;
4931                         wake_up_interruptible(&dgap_dl_wait);
4932                 }
4933                 DGAP_UNLOCK(dgap_dl_lock, lock_flags2);
4934         }
4935
4936         /* Wait for BIOS to test board... */
4937         if (bd->state == WAIT_BIOS_LOAD)
4938                 dgap_do_wait_for_bios(bd);
4939
4940         /* Move to next state */
4941         if (bd->state == FINISHED_BIOS_LOAD) {
4942                 bd->state = NEED_FEP_LOAD;
4943
4944                 /*
4945                  * Signal downloader, its got some work to do.
4946                  */
4947                 DGAP_LOCK(dgap_dl_lock, lock_flags2);
4948                 if (dgap_dl_action != 1) {
4949                         dgap_dl_action = 1;
4950                         wake_up_interruptible(&dgap_dl_wait);
4951                 }
4952                 DGAP_UNLOCK(dgap_dl_lock, lock_flags2);
4953         }
4954
4955         /* Wait for FEP to load on board... */
4956         if (bd->state == WAIT_FEP_LOAD)
4957                 dgap_do_wait_for_fep(bd);
4958
4959         /* Move to next state */
4960         if (bd->state == FINISHED_FEP_LOAD) {
4961
4962                 /*
4963                  * Do tty device initialization.
4964                  */
4965                 int rc = dgap_tty_init(bd);
4966
4967                 if (rc < 0) {
4968                         dgap_tty_uninit(bd);
4969                         bd->state = BOARD_FAILED;
4970                         bd->dpastatus = BD_NOFEP;
4971                 } else {
4972                         bd->state = NEED_PROC_CREATION;
4973
4974                         /*
4975                          * Signal downloader, its got some work to do.
4976                          */
4977                         DGAP_LOCK(dgap_dl_lock, lock_flags2);
4978                         if (dgap_dl_action != 1) {
4979                                 dgap_dl_action = 1;
4980                                 wake_up_interruptible(&dgap_dl_wait);
4981                         }
4982                         DGAP_UNLOCK(dgap_dl_lock, lock_flags2);
4983                 }
4984         }
4985
4986         /* Move to next state */
4987         if (bd->state == FINISHED_PROC_CREATION) {
4988
4989                 bd->state = BOARD_READY;
4990                 bd->dpastatus = BD_RUNNING;
4991
4992                 /*
4993                  * If user requested the board to run in interrupt mode,
4994                  * go and set it up on the board.
4995                  */
4996                 if (bd->intr_used) {
4997                         writew(1, (bd->re_map_membase + ENABLE_INTR));
4998                         /*
4999                          * Tell the board to poll the UARTS as fast as possible.
5000                          */
5001                         writew(FEPPOLL_MIN, (bd->re_map_membase + FEPPOLL));
5002                         bd->intr_running = 1;
5003                 }
5004
5005                 /* Wake up anyone waiting for board state to change to ready */
5006                 wake_up_interruptible(&bd->state_wait);
5007         }
5008
5009         DGAP_UNLOCK(bd->bd_lock, lock_flags);
5010 }
5011
5012 /*=======================================================================
5013  *
5014  *      dgap_cmdb - Sends a 2 byte command to the FEP.
5015  *
5016  *              ch      - Pointer to channel structure.
5017  *              cmd     - Command to be sent.
5018  *              byte1   - Integer containing first byte to be sent.
5019  *              byte2   - Integer containing second byte to be sent.
5020  *              ncmds   - Wait until ncmds or fewer cmds are left
5021  *                        in the cmd buffer before returning.
5022  *
5023  *=======================================================================*/
5024 static void dgap_cmdb(struct channel_t *ch, uchar cmd, uchar byte1,
5025                         uchar byte2, uint ncmds)
5026 {
5027         char            *vaddr = NULL;
5028         struct cm_t     *cm_addr = NULL;
5029         uint            count;
5030         uint            n;
5031         u16             head;
5032         u16             tail;
5033
5034         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
5035                 return;
5036
5037         /*
5038          * Check if board is still alive.
5039          */
5040         if (ch->ch_bd->state == BOARD_FAILED)
5041                 return;
5042
5043         /*
5044          * Make sure the pointers are in range before
5045          * writing to the FEP memory.
5046          */
5047         vaddr = ch->ch_bd->re_map_membase;
5048
5049         if (!vaddr)
5050                 return;
5051
5052         cm_addr = (struct cm_t *) (vaddr + CMDBUF);
5053         head = readw(&(cm_addr->cm_head));
5054
5055         /*
5056          * Forget it if pointers out of range.
5057          */
5058         if (head >= (CMDMAX - CMDSTART) || (head & 03)) {
5059                 ch->ch_bd->state = BOARD_FAILED;
5060                 return;
5061         }
5062
5063         /*
5064          * Put the data in the circular command buffer.
5065          */
5066         writeb(cmd, (char *) (vaddr + head + CMDSTART + 0));
5067         writeb((uchar) ch->ch_portnum, (char *) (vaddr + head + CMDSTART + 1));
5068         writeb(byte1, (char *) (vaddr + head + CMDSTART + 2));
5069         writeb(byte2, (char *) (vaddr + head + CMDSTART + 3));
5070
5071         head = (head + 4) & (CMDMAX - CMDSTART - 4);
5072
5073         writew(head, &(cm_addr->cm_head));
5074
5075         /*
5076          * Wait if necessary before updating the head
5077          * pointer to limit the number of outstanding
5078          * commands to the FEP.   If the time spent waiting
5079          * is outlandish, declare the FEP dead.
5080          */
5081         for (count = dgap_count ;;) {
5082
5083                 head = readw(&(cm_addr->cm_head));
5084                 tail = readw(&(cm_addr->cm_tail));
5085
5086                 n = (head - tail) & (CMDMAX - CMDSTART - 4);
5087
5088                 if (n <= ncmds * sizeof(struct cm_t))
5089                         break;
5090
5091                 if (--count == 0) {
5092                         ch->ch_bd->state = BOARD_FAILED;
5093                         return;
5094                 }
5095                 udelay(10);
5096         }
5097 }
5098
5099 /*=======================================================================
5100  *
5101  *      dgap_cmdw - Sends a 1 word command to the FEP.
5102  *
5103  *              ch      - Pointer to channel structure.
5104  *              cmd     - Command to be sent.
5105  *              word    - Integer containing word to be sent.
5106  *              ncmds   - Wait until ncmds or fewer cmds are left
5107  *                        in the cmd buffer before returning.
5108  *
5109  *=======================================================================*/
5110 static void dgap_cmdw(struct channel_t *ch, uchar cmd, u16 word, uint ncmds)
5111 {
5112         char            *vaddr = NULL;
5113         struct cm_t     *cm_addr = NULL;
5114         uint            count;
5115         uint            n;
5116         u16             head;
5117         u16             tail;
5118
5119         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
5120                 return;
5121
5122         /*
5123          * Check if board is still alive.
5124          */
5125         if (ch->ch_bd->state == BOARD_FAILED)
5126                 return;
5127
5128         /*
5129          * Make sure the pointers are in range before
5130          * writing to the FEP memory.
5131          */
5132         vaddr = ch->ch_bd->re_map_membase;
5133         if (!vaddr)
5134                 return;
5135
5136         cm_addr = (struct cm_t *) (vaddr + CMDBUF);
5137         head = readw(&(cm_addr->cm_head));
5138
5139         /*
5140          * Forget it if pointers out of range.
5141          */
5142         if (head >= (CMDMAX - CMDSTART) || (head & 03)) {
5143                 ch->ch_bd->state = BOARD_FAILED;
5144                 return;
5145         }
5146
5147         /*
5148          * Put the data in the circular command buffer.
5149          */
5150         writeb(cmd, (char *) (vaddr + head + CMDSTART + 0));
5151         writeb((uchar) ch->ch_portnum, (char *) (vaddr + head + CMDSTART + 1));
5152         writew((u16) word, (char *) (vaddr + head + CMDSTART + 2));
5153
5154         head = (head + 4) & (CMDMAX - CMDSTART - 4);
5155
5156         writew(head, &(cm_addr->cm_head));
5157
5158         /*
5159          * Wait if necessary before updating the head
5160          * pointer to limit the number of outstanding
5161          * commands to the FEP.   If the time spent waiting
5162          * is outlandish, declare the FEP dead.
5163          */
5164         for (count = dgap_count ;;) {
5165
5166                 head = readw(&(cm_addr->cm_head));
5167                 tail = readw(&(cm_addr->cm_tail));
5168
5169                 n = (head - tail) & (CMDMAX - CMDSTART - 4);
5170
5171                 if (n <= ncmds * sizeof(struct cm_t))
5172                         break;
5173
5174                 if (--count == 0) {
5175                         ch->ch_bd->state = BOARD_FAILED;
5176                         return;
5177                 }
5178                 udelay(10);
5179         }
5180 }
5181
5182 /*=======================================================================
5183  *
5184  *      dgap_cmdw_ext - Sends a extended word command to the FEP.
5185  *
5186  *              ch      - Pointer to channel structure.
5187  *              cmd     - Command to be sent.
5188  *              word    - Integer containing word to be sent.
5189  *              ncmds   - Wait until ncmds or fewer cmds are left
5190  *                        in the cmd buffer before returning.
5191  *
5192  *=======================================================================*/
5193 static void dgap_cmdw_ext(struct channel_t *ch, u16 cmd, u16 word, uint ncmds)
5194 {
5195         char            *vaddr = NULL;
5196         struct cm_t     *cm_addr = NULL;
5197         uint            count;
5198         uint            n;
5199         u16             head;
5200         u16             tail;
5201
5202         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
5203                 return;
5204
5205         /*
5206          * Check if board is still alive.
5207          */
5208         if (ch->ch_bd->state == BOARD_FAILED)
5209                 return;
5210
5211         /*
5212          * Make sure the pointers are in range before
5213          * writing to the FEP memory.
5214          */
5215         vaddr = ch->ch_bd->re_map_membase;
5216         if (!vaddr)
5217                 return;
5218
5219         cm_addr = (struct cm_t *) (vaddr + CMDBUF);
5220         head = readw(&(cm_addr->cm_head));
5221
5222         /*
5223          * Forget it if pointers out of range.
5224          */
5225         if (head >= (CMDMAX - CMDSTART) || (head & 03)) {
5226                 ch->ch_bd->state = BOARD_FAILED;
5227                 return;
5228         }
5229
5230         /*
5231          * Put the data in the circular command buffer.
5232          */
5233
5234         /* Write an FF to tell the FEP that we want an extended command */
5235         writeb((uchar) 0xff, (char *) (vaddr + head + CMDSTART + 0));
5236
5237         writeb((uchar) ch->ch_portnum, (uchar *) (vaddr + head + CMDSTART + 1));
5238         writew((u16) cmd, (char *) (vaddr + head + CMDSTART + 2));
5239
5240         /*
5241          * If the second part of the command won't fit,
5242          * put it at the beginning of the circular buffer.
5243          */
5244         if (((head + 4) >= ((CMDMAX - CMDSTART)) || (head & 03)))
5245                 writew((u16) word, (char *) (vaddr + CMDSTART));
5246         else
5247                 writew((u16) word, (char *) (vaddr + head + CMDSTART + 4));
5248
5249         head = (head + 8) & (CMDMAX - CMDSTART - 4);
5250
5251         writew(head, &(cm_addr->cm_head));
5252
5253         /*
5254          * Wait if necessary before updating the head
5255          * pointer to limit the number of outstanding
5256          * commands to the FEP.   If the time spent waiting
5257          * is outlandish, declare the FEP dead.
5258          */
5259         for (count = dgap_count ;;) {
5260
5261                 head = readw(&(cm_addr->cm_head));
5262                 tail = readw(&(cm_addr->cm_tail));
5263
5264                 n = (head - tail) & (CMDMAX - CMDSTART - 4);
5265
5266                 if (n <= ncmds * sizeof(struct cm_t))
5267                         break;
5268
5269                 if (--count == 0) {
5270                         ch->ch_bd->state = BOARD_FAILED;
5271                         return;
5272                 }
5273                 udelay(10);
5274         }
5275 }
5276
5277 /*=======================================================================
5278  *
5279  *      dgap_wmove - Write data to FEP buffer.
5280  *
5281  *              ch      - Pointer to channel structure.
5282  *              buf     - Poiter to characters to be moved.
5283  *              cnt     - Number of characters to move.
5284  *
5285  *=======================================================================*/
5286 static void dgap_wmove(struct channel_t *ch, char *buf, uint cnt)
5287 {
5288         int    n;
5289         char   *taddr;
5290         struct bs_t    *bs;
5291         u16    head;
5292
5293         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
5294                 return;
5295
5296         /*
5297          * Check parameters.
5298          */
5299         bs   = ch->ch_bs;
5300         head = readw(&(bs->tx_head));
5301
5302         /*
5303          * If pointers are out of range, just return.
5304          */
5305         if ((cnt > ch->ch_tsize) ||
5306             (unsigned)(head - ch->ch_tstart) >= ch->ch_tsize)
5307                 return;
5308
5309         /*
5310          * If the write wraps over the top of the circular buffer,
5311          * move the portion up to the wrap point, and reset the
5312          * pointers to the bottom.
5313          */
5314         n = ch->ch_tstart + ch->ch_tsize - head;
5315
5316         if (cnt >= n) {
5317                 cnt -= n;
5318                 taddr = ch->ch_taddr + head;
5319                 memcpy_toio(taddr, buf, n);
5320                 head = ch->ch_tstart;
5321                 buf += n;
5322         }
5323
5324         /*
5325          * Move rest of data.
5326          */
5327         taddr = ch->ch_taddr + head;
5328         n = cnt;
5329         memcpy_toio(taddr, buf, n);
5330         head += cnt;
5331
5332         writew(head, &(bs->tx_head));
5333 }
5334
5335 /*
5336  * Retrives the current custom baud rate from FEP memory,
5337  * and returns it back to the user.
5338  * Returns 0 on error.
5339  */
5340 static uint dgap_get_custom_baud(struct channel_t *ch)
5341 {
5342         uchar *vaddr;
5343         ulong offset = 0;
5344         uint value = 0;
5345
5346         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
5347                 return 0;
5348
5349         if (!ch->ch_bd || ch->ch_bd->magic != DGAP_BOARD_MAGIC)
5350                 return 0;
5351
5352         if (!(ch->ch_bd->bd_flags & BD_FEP5PLUS))
5353                 return 0;
5354
5355         vaddr = ch->ch_bd->re_map_membase;
5356
5357         if (!vaddr)
5358                 return 0;
5359
5360         /*
5361          * Go get from fep mem, what the fep
5362          * believes the custom baud rate is.
5363          */
5364         offset = ((((*(unsigned short *)(vaddr + ECS_SEG)) << 4) +
5365                 (ch->ch_portnum * 0x28) + LINE_SPEED));
5366
5367         value = readw(vaddr + offset);
5368         return value;
5369 }
5370
5371 /*
5372  * Calls the firmware to reset this channel.
5373  */
5374 static void dgap_firmware_reset_port(struct channel_t *ch)
5375 {
5376         dgap_cmdb(ch, CHRESET, 0, 0, 0);
5377
5378         /*
5379          * Now that the channel is reset, we need to make sure
5380          * all the current settings get reapplied to the port
5381          * in the firmware.
5382          *
5383          * So we will set the driver's cache of firmware
5384          * settings all to 0, and then call param.
5385          */
5386         ch->ch_fepiflag = 0;
5387         ch->ch_fepcflag = 0;
5388         ch->ch_fepoflag = 0;
5389         ch->ch_fepstartc = 0;
5390         ch->ch_fepstopc = 0;
5391         ch->ch_fepastartc = 0;
5392         ch->ch_fepastopc = 0;
5393         ch->ch_mostat = 0;
5394         ch->ch_hflow = 0;
5395 }
5396
5397 /*=======================================================================
5398  *
5399  *      dgap_param - Set Digi parameters.
5400  *
5401  *              struct tty_struct *     - TTY for port.
5402  *
5403  *=======================================================================*/
5404 static int dgap_param(struct tty_struct *tty)
5405 {
5406         struct ktermios *ts;
5407         struct board_t *bd;
5408         struct channel_t *ch;
5409         struct bs_t   *bs;
5410         struct un_t   *un;
5411         u16     head;
5412         u16     cflag;
5413         u16     iflag;
5414         uchar   mval;
5415         uchar   hflow;
5416
5417         if (!tty || tty->magic != TTY_MAGIC)
5418                 return -ENXIO;
5419
5420         un = (struct un_t *) tty->driver_data;
5421         if (!un || un->magic != DGAP_UNIT_MAGIC)
5422                 return -ENXIO;
5423
5424         ch = un->un_ch;
5425         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
5426                 return -ENXIO;
5427
5428         bd = ch->ch_bd;
5429         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
5430                 return -ENXIO;
5431
5432         bs = ch->ch_bs;
5433         if (!bs)
5434                 return -ENXIO;
5435
5436         ts = &tty->termios;
5437
5438         /*
5439          * If baud rate is zero, flush queues, and set mval to drop DTR.
5440          */
5441         if ((ch->ch_c_cflag & (CBAUD)) == 0) {
5442
5443                 /* flush rx */
5444                 head = readw(&(ch->ch_bs->rx_head));
5445                 writew(head, &(ch->ch_bs->rx_tail));
5446
5447                 /* flush tx */
5448                 head = readw(&(ch->ch_bs->tx_head));
5449                 writew(head, &(ch->ch_bs->tx_tail));
5450
5451                 ch->ch_flags |= (CH_BAUD0);
5452
5453                 /* Drop RTS and DTR */
5454                 ch->ch_mval &= ~(D_RTS(ch)|D_DTR(ch));
5455                 mval = D_DTR(ch) | D_RTS(ch);
5456                 ch->ch_baud_info = 0;
5457
5458         } else if (ch->ch_custom_speed && (bd->bd_flags & BD_FEP5PLUS)) {
5459                 /*
5460                  * Tell the fep to do the command
5461                  */
5462
5463                 dgap_cmdw_ext(ch, 0xff01, ch->ch_custom_speed, 0);
5464
5465                 /*
5466                  * Now go get from fep mem, what the fep
5467                  * believes the custom baud rate is.
5468                  */
5469                 ch->ch_custom_speed = dgap_get_custom_baud(ch);
5470                 ch->ch_baud_info = ch->ch_custom_speed;
5471
5472                 /* Handle transition from B0 */
5473                 if (ch->ch_flags & CH_BAUD0) {
5474                         ch->ch_flags &= ~(CH_BAUD0);
5475                         ch->ch_mval |= (D_RTS(ch)|D_DTR(ch));
5476                 }
5477                 mval = D_DTR(ch) | D_RTS(ch);
5478
5479         } else {
5480                 /*
5481                  * Set baud rate, character size, and parity.
5482                  */
5483
5484
5485                 int iindex = 0;
5486                 int jindex = 0;
5487                 int baud = 0;
5488
5489                 ulong bauds[4][16] = {
5490                         { /* slowbaud */
5491                                 0,      50,     75,     110,
5492                                 134,    150,    200,    300,
5493                                 600,    1200,   1800,   2400,
5494                                 4800,   9600,   19200,  38400 },
5495                         { /* slowbaud & CBAUDEX */
5496                                 0,      57600,  115200, 230400,
5497                                 460800, 150,    200,    921600,
5498                                 600,    1200,   1800,   2400,
5499                                 4800,   9600,   19200,  38400 },
5500                         { /* fastbaud */
5501                                 0,      57600,  76800,  115200,
5502                                 14400,  57600,  230400, 76800,
5503                                 115200, 230400, 28800,  460800,
5504                                 921600, 9600,   19200,  38400 },
5505                         { /* fastbaud & CBAUDEX */
5506                                 0,      57600,  115200, 230400,
5507                                 460800, 150,    200,    921600,
5508                                 600,    1200,   1800,   2400,
5509                                 4800,   9600,   19200,  38400 }
5510                 };
5511
5512                 /*
5513                  * Only use the TXPrint baud rate if the
5514                  * terminal unit is NOT open
5515                  */
5516                 if (!(ch->ch_tun.un_flags & UN_ISOPEN) &&
5517                      (un->un_type == DGAP_PRINT))
5518                         baud = C_BAUD(ch->ch_pun.un_tty) & 0xff;
5519                 else
5520                         baud = C_BAUD(ch->ch_tun.un_tty) & 0xff;
5521
5522                 if (ch->ch_c_cflag & CBAUDEX)
5523                         iindex = 1;
5524
5525                 if (ch->ch_digi.digi_flags & DIGI_FAST)
5526                         iindex += 2;
5527
5528                 jindex = baud;
5529
5530                 if ((iindex >= 0) && (iindex < 4) &&
5531                     (jindex >= 0) && (jindex < 16))
5532                         baud = bauds[iindex][jindex];
5533                 else
5534                         baud = 0;
5535
5536                 if (baud == 0)
5537                         baud = 9600;
5538
5539                 ch->ch_baud_info = baud;
5540
5541                 /*
5542                  * CBAUD has bit position 0x1000 set these days to
5543                  * indicate Linux baud rate remap.
5544                  * We use a different bit assignment for high speed.
5545                  * Clear this bit out while grabbing the parts of
5546                  * "cflag" we want.
5547                  */
5548                 cflag = ch->ch_c_cflag & ((CBAUD ^ CBAUDEX) | PARODD | PARENB |
5549                                                    CSTOPB | CSIZE);
5550
5551                 /*
5552                  * HUPCL bit is used by FEP to indicate fast baud
5553                  * table is to be used.
5554                  */
5555                 if ((ch->ch_digi.digi_flags & DIGI_FAST) ||
5556                     (ch->ch_c_cflag & CBAUDEX))
5557                         cflag |= HUPCL;
5558
5559                 if ((ch->ch_c_cflag & CBAUDEX) &&
5560                     !(ch->ch_digi.digi_flags & DIGI_FAST)) {
5561                         /*
5562                          * The below code is trying to guarantee that only
5563                          * baud rates 115200, 230400, 460800, 921600 are
5564                          * remapped. We use exclusive or  because the various
5565                          * baud rates share common bit positions and therefore
5566                          * can't be tested for easily.
5567                          */
5568                         tcflag_t tcflag = (ch->ch_c_cflag & CBAUD) | CBAUDEX;
5569                         int baudpart = 0;
5570
5571                         /*
5572                          * Map high speed requests to index
5573                          * into FEP's baud table
5574                          */
5575                         switch (tcflag) {
5576                         case B57600:
5577                                 baudpart = 1;
5578                                 break;
5579 #ifdef B76800
5580                         case B76800:
5581                                 baudpart = 2;
5582                                 break;
5583 #endif
5584                         case B115200:
5585                                 baudpart = 3;
5586                                 break;
5587                         case B230400:
5588                                 baudpart = 9;
5589                                 break;
5590                         case B460800:
5591                                 baudpart = 11;
5592                                 break;
5593 #ifdef B921600
5594                         case B921600:
5595                                 baudpart = 12;
5596                                 break;
5597 #endif
5598                         default:
5599                                 baudpart = 0;
5600                         }
5601
5602                         if (baudpart)
5603                                 cflag = (cflag & ~(CBAUD | CBAUDEX)) | baudpart;
5604                 }
5605
5606                 cflag &= 0xffff;
5607
5608                 if (cflag != ch->ch_fepcflag) {
5609                         ch->ch_fepcflag = (u16) (cflag & 0xffff);
5610
5611                         /* Okay to have channel and board locks held calling this */
5612                         dgap_cmdw(ch, SCFLAG, (u16) cflag, 0);
5613                 }
5614
5615                 /* Handle transition from B0 */
5616                 if (ch->ch_flags & CH_BAUD0) {
5617                         ch->ch_flags &= ~(CH_BAUD0);
5618                         ch->ch_mval |= (D_RTS(ch)|D_DTR(ch));
5619                 }
5620                 mval = D_DTR(ch) | D_RTS(ch);
5621         }
5622
5623         /*
5624          * Get input flags.
5625          */
5626         iflag = ch->ch_c_iflag & (IGNBRK | BRKINT | IGNPAR | PARMRK | INPCK | ISTRIP | IXON | IXANY | IXOFF);
5627
5628         if ((ch->ch_startc == _POSIX_VDISABLE) || (ch->ch_stopc == _POSIX_VDISABLE)) {
5629                 iflag &= ~(IXON | IXOFF);
5630                 ch->ch_c_iflag &= ~(IXON | IXOFF);
5631         }
5632
5633         /*
5634          * Only the IBM Xr card can switch between
5635          * 232 and 422 modes on the fly
5636          */
5637         if (bd->device == PCI_DEV_XR_IBM_DID) {
5638                 if (ch->ch_digi.digi_flags & DIGI_422)
5639                         dgap_cmdb(ch, SCOMMODE, MODE_422, 0, 0);
5640                 else
5641                         dgap_cmdb(ch, SCOMMODE, MODE_232, 0, 0);
5642         }
5643
5644         if (ch->ch_digi.digi_flags & DIGI_ALTPIN)
5645                 iflag |= IALTPIN;
5646
5647         if (iflag != ch->ch_fepiflag) {
5648                 ch->ch_fepiflag = iflag;
5649
5650                 /* Okay to have channel and board locks held calling this */
5651                 dgap_cmdw(ch, SIFLAG, (u16) ch->ch_fepiflag, 0);
5652         }
5653
5654         /*
5655          * Select hardware handshaking.
5656          */
5657         hflow = 0;
5658
5659         if (ch->ch_c_cflag & CRTSCTS)
5660                 hflow |= (D_RTS(ch) | D_CTS(ch));
5661         if (ch->ch_digi.digi_flags & RTSPACE)
5662                 hflow |= D_RTS(ch);
5663         if (ch->ch_digi.digi_flags & DTRPACE)
5664                 hflow |= D_DTR(ch);
5665         if (ch->ch_digi.digi_flags & CTSPACE)
5666                 hflow |= D_CTS(ch);
5667         if (ch->ch_digi.digi_flags & DSRPACE)
5668                 hflow |= D_DSR(ch);
5669         if (ch->ch_digi.digi_flags & DCDPACE)
5670                 hflow |= D_CD(ch);
5671
5672         if (hflow != ch->ch_hflow) {
5673                 ch->ch_hflow = hflow;
5674
5675                 /* Okay to have channel and board locks held calling this */
5676                 dgap_cmdb(ch, SHFLOW, (uchar) hflow, 0xff, 0);
5677         }
5678
5679
5680         /*
5681          * Set RTS and/or DTR Toggle if needed, but only if product is FEP5+ based.
5682          */
5683         if (bd->bd_flags & BD_FEP5PLUS) {
5684                 u16 hflow2 = 0;
5685                 if (ch->ch_digi.digi_flags & DIGI_RTS_TOGGLE)
5686                         hflow2 |= (D_RTS(ch));
5687                 if (ch->ch_digi.digi_flags & DIGI_DTR_TOGGLE)
5688                         hflow2 |= (D_DTR(ch));
5689
5690                 dgap_cmdw_ext(ch, 0xff03, hflow2, 0);
5691         }
5692
5693         /*
5694          * Set modem control lines.
5695          */
5696
5697         mval ^= ch->ch_mforce & (mval ^ ch->ch_mval);
5698
5699         if (ch->ch_mostat ^ mval) {
5700                 ch->ch_mostat = mval;
5701
5702                 /* Okay to have channel and board locks held calling this */
5703                 dgap_cmdb(ch, SMODEM, (uchar) mval, D_RTS(ch)|D_DTR(ch), 0);
5704         }
5705
5706         /*
5707          * Read modem signals, and then call carrier function.
5708          */
5709         ch->ch_mistat = readb(&(bs->m_stat));
5710         dgap_carrier(ch);
5711
5712         /*
5713          * Set the start and stop characters.
5714          */
5715         if (ch->ch_startc != ch->ch_fepstartc || ch->ch_stopc != ch->ch_fepstopc) {
5716                 ch->ch_fepstartc = ch->ch_startc;
5717                 ch->ch_fepstopc =  ch->ch_stopc;
5718
5719                 /* Okay to have channel and board locks held calling this */
5720                 dgap_cmdb(ch, SFLOWC, ch->ch_fepstartc, ch->ch_fepstopc, 0);
5721         }
5722
5723         /*
5724          * Set the Auxiliary start and stop characters.
5725          */
5726         if (ch->ch_astartc != ch->ch_fepastartc || ch->ch_astopc != ch->ch_fepastopc) {
5727                 ch->ch_fepastartc = ch->ch_astartc;
5728                 ch->ch_fepastopc = ch->ch_astopc;
5729
5730                 /* Okay to have channel and board locks held calling this */
5731                 dgap_cmdb(ch, SAFLOWC, ch->ch_fepastartc, ch->ch_fepastopc, 0);
5732         }
5733
5734         return 0;
5735 }
5736
5737 /*
5738  * dgap_parity_scan()
5739  *
5740  * Convert the FEP5 way of reporting parity errors and breaks into
5741  * the Linux line discipline way.
5742  */
5743 static void dgap_parity_scan(struct channel_t *ch, unsigned char *cbuf, unsigned char *fbuf, int *len)
5744 {
5745         int l = *len;
5746         int count = 0;
5747         unsigned char *in, *cout, *fout;
5748         unsigned char c;
5749
5750         in = cbuf;
5751         cout = cbuf;
5752         fout = fbuf;
5753
5754         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
5755                 return;
5756
5757         while (l--) {
5758                 c = *in++;
5759                 switch (ch->pscan_state) {
5760                 default:
5761                         /* reset to sanity and fall through */
5762                         ch->pscan_state = 0;
5763
5764                 case 0:
5765                         /* No FF seen yet */
5766                         if (c == (unsigned char) '\377')
5767                                 /* delete this character from stream */
5768                                 ch->pscan_state = 1;
5769                         else {
5770                                 *cout++ = c;
5771                                 *fout++ = TTY_NORMAL;
5772                                 count += 1;
5773                         }
5774                         break;
5775
5776                 case 1:
5777                         /* first FF seen */
5778                         if (c == (unsigned char) '\377') {
5779                                 /* doubled ff, transform to single ff */
5780                                 *cout++ = c;
5781                                 *fout++ = TTY_NORMAL;
5782                                 count += 1;
5783                                 ch->pscan_state = 0;
5784                         } else {
5785                                 /* save value examination in next state */
5786                                 ch->pscan_savechar = c;
5787                                 ch->pscan_state = 2;
5788                         }
5789                         break;
5790
5791                 case 2:
5792                         /* third character of ff sequence */
5793
5794                         *cout++ = c;
5795
5796                         if (ch->pscan_savechar == 0x0) {
5797
5798                                 if (c == 0x0) {
5799                                         ch->ch_err_break++;
5800                                         *fout++ = TTY_BREAK;
5801                                 } else {
5802                                         ch->ch_err_parity++;
5803                                         *fout++ = TTY_PARITY;
5804                                 }
5805                         }
5806
5807                         count += 1;
5808                         ch->pscan_state = 0;
5809                 }
5810         }
5811         *len = count;
5812 }
5813
5814 /*=======================================================================
5815  *
5816  *      dgap_event - FEP to host event processing routine.
5817  *
5818  *              bd     - Board of current event.
5819  *
5820  *=======================================================================*/
5821 static int dgap_event(struct board_t *bd)
5822 {
5823         struct channel_t *ch;
5824         ulong           lock_flags;
5825         ulong           lock_flags2;
5826         struct bs_t     *bs;
5827         uchar           *event;
5828         uchar           *vaddr = NULL;
5829         struct ev_t     *eaddr = NULL;
5830         uint            head;
5831         uint            tail;
5832         int             port;
5833         int             reason;
5834         int             modem;
5835         int             b1;
5836
5837         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
5838                 return -ENXIO;
5839
5840         DGAP_LOCK(bd->bd_lock, lock_flags);
5841
5842         vaddr = bd->re_map_membase;
5843
5844         if (!vaddr) {
5845                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
5846                 return -ENXIO;
5847         }
5848
5849         eaddr = (struct ev_t *) (vaddr + EVBUF);
5850
5851         /* Get our head and tail */
5852         head = readw(&(eaddr->ev_head));
5853         tail = readw(&(eaddr->ev_tail));
5854
5855         /*
5856          * Forget it if pointers out of range.
5857          */
5858
5859         if (head >= EVMAX - EVSTART || tail >= EVMAX - EVSTART ||
5860             (head | tail) & 03) {
5861                 /* Let go of board lock */
5862                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
5863                 return -ENXIO;
5864         }
5865
5866         /*
5867          * Loop to process all the events in the buffer.
5868          */
5869         while (tail != head) {
5870
5871                 /*
5872                  * Get interrupt information.
5873                  */
5874
5875                 event = bd->re_map_membase + tail + EVSTART;
5876
5877                 port   = event[0];
5878                 reason = event[1];
5879                 modem  = event[2];
5880                 b1     = event[3];
5881
5882                 /*
5883                  * Make sure the interrupt is valid.
5884                  */
5885                 if (port >= bd->nasync)
5886                         goto next;
5887
5888                 if (!(reason & (IFMODEM | IFBREAK | IFTLW | IFTEM | IFDATA)))
5889                         goto next;
5890
5891                 ch = bd->channels[port];
5892
5893                 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
5894                         goto next;
5895
5896                 /*
5897                  * If we have made it here, the event was valid.
5898                  * Lock down the channel.
5899                  */
5900                 DGAP_LOCK(ch->ch_lock, lock_flags2);
5901
5902                 bs = ch->ch_bs;
5903
5904                 if (!bs) {
5905                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
5906                         goto next;
5907                 }
5908
5909                 /*
5910                  * Process received data.
5911                  */
5912                 if (reason & IFDATA) {
5913
5914                         /*
5915                          * ALL LOCKS *MUST* BE DROPPED BEFORE CALLING INPUT!
5916                          * input could send some data to ld, which in turn
5917                          * could do a callback to one of our other functions.
5918                          */
5919                         DGAP_UNLOCK(ch->ch_lock, lock_flags2);
5920                         DGAP_UNLOCK(bd->bd_lock, lock_flags);
5921
5922                         dgap_input(ch);
5923
5924                         DGAP_LOCK(bd->bd_lock, lock_flags);
5925                         DGAP_LOCK(ch->ch_lock, lock_flags2);
5926
5927                         if (ch->ch_flags & CH_RACTIVE)
5928                                 ch->ch_flags |= CH_RENABLE;
5929                         else
5930                                 writeb(1, &(bs->idata));
5931
5932                         if (ch->ch_flags & CH_RWAIT) {
5933                                 ch->ch_flags &= ~CH_RWAIT;
5934
5935                                 wake_up_interruptible(&ch->ch_tun.un_flags_wait);
5936                         }
5937                 }
5938
5939                 /*
5940                  * Process Modem change signals.
5941                  */
5942                 if (reason & IFMODEM) {
5943                         ch->ch_mistat = modem;
5944                         dgap_carrier(ch);
5945                 }
5946
5947                 /*
5948                  * Process break.
5949                  */
5950                 if (reason & IFBREAK) {
5951
5952                         if (ch->ch_tun.un_tty) {
5953                                 /* A break has been indicated */
5954                                 ch->ch_err_break++;
5955                                 tty_buffer_request_room(ch->ch_tun.un_tty->port, 1);
5956                                 tty_insert_flip_char(ch->ch_tun.un_tty->port, 0, TTY_BREAK);
5957                                 tty_flip_buffer_push(ch->ch_tun.un_tty->port);
5958                         }
5959                 }
5960
5961                 /*
5962                  * Process Transmit low.
5963                  */
5964                 if (reason & IFTLW) {
5965
5966                         if (ch->ch_tun.un_flags & UN_LOW) {
5967                                 ch->ch_tun.un_flags &= ~UN_LOW;
5968
5969                                 if (ch->ch_tun.un_flags & UN_ISOPEN) {
5970                                         if ((ch->ch_tun.un_tty->flags &
5971                                            (1 << TTY_DO_WRITE_WAKEUP)) &&
5972                                                 ch->ch_tun.un_tty->ldisc->ops->write_wakeup) {
5973                                                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
5974                                                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
5975                                                 (ch->ch_tun.un_tty->ldisc->ops->write_wakeup)(ch->ch_tun.un_tty);
5976                                                 DGAP_LOCK(bd->bd_lock, lock_flags);
5977                                                 DGAP_LOCK(ch->ch_lock, lock_flags2);
5978                                         }
5979                                         wake_up_interruptible(&ch->ch_tun.un_tty->write_wait);
5980                                         wake_up_interruptible(&ch->ch_tun.un_flags_wait);
5981                                 }
5982                         }
5983
5984                         if (ch->ch_pun.un_flags & UN_LOW) {
5985                                 ch->ch_pun.un_flags &= ~UN_LOW;
5986                                 if (ch->ch_pun.un_flags & UN_ISOPEN) {
5987                                         if ((ch->ch_pun.un_tty->flags &
5988                                            (1 << TTY_DO_WRITE_WAKEUP)) &&
5989                                                 ch->ch_pun.un_tty->ldisc->ops->write_wakeup) {
5990                                                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
5991                                                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
5992                                                 (ch->ch_pun.un_tty->ldisc->ops->write_wakeup)(ch->ch_pun.un_tty);
5993                                                 DGAP_LOCK(bd->bd_lock, lock_flags);
5994                                                 DGAP_LOCK(ch->ch_lock, lock_flags2);
5995                                         }
5996                                         wake_up_interruptible(&ch->ch_pun.un_tty->write_wait);
5997                                         wake_up_interruptible(&ch->ch_pun.un_flags_wait);
5998                                 }
5999                         }
6000
6001                         if (ch->ch_flags & CH_WLOW) {
6002                                 ch->ch_flags &= ~CH_WLOW;
6003                                 wake_up_interruptible(&ch->ch_flags_wait);
6004                         }
6005                 }
6006
6007                 /*
6008                  * Process Transmit empty.
6009                  */
6010                 if (reason & IFTEM) {
6011                         if (ch->ch_tun.un_flags & UN_EMPTY) {
6012                                 ch->ch_tun.un_flags &= ~UN_EMPTY;
6013                                 if (ch->ch_tun.un_flags & UN_ISOPEN) {
6014                                         if ((ch->ch_tun.un_tty->flags &
6015                                            (1 << TTY_DO_WRITE_WAKEUP)) &&
6016                                                 ch->ch_tun.un_tty->ldisc->ops->write_wakeup) {
6017                                                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
6018                                                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
6019
6020                                                 (ch->ch_tun.un_tty->ldisc->ops->write_wakeup)(ch->ch_tun.un_tty);
6021                                                 DGAP_LOCK(bd->bd_lock, lock_flags);
6022                                                 DGAP_LOCK(ch->ch_lock, lock_flags2);
6023                                         }
6024                                         wake_up_interruptible(&ch->ch_tun.un_tty->write_wait);
6025                                         wake_up_interruptible(&ch->ch_tun.un_flags_wait);
6026                                 }
6027                         }
6028
6029                         if (ch->ch_pun.un_flags & UN_EMPTY) {
6030                                 ch->ch_pun.un_flags &= ~UN_EMPTY;
6031                                 if (ch->ch_pun.un_flags & UN_ISOPEN) {
6032                                         if ((ch->ch_pun.un_tty->flags &
6033                                            (1 << TTY_DO_WRITE_WAKEUP)) &&
6034                                                 ch->ch_pun.un_tty->ldisc->ops->write_wakeup) {
6035                                                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
6036                                                 DGAP_UNLOCK(bd->bd_lock, lock_flags);
6037                                                 (ch->ch_pun.un_tty->ldisc->ops->write_wakeup)(ch->ch_pun.un_tty);
6038                                                 DGAP_LOCK(bd->bd_lock, lock_flags);
6039                                                 DGAP_LOCK(ch->ch_lock, lock_flags2);
6040                                         }
6041                                         wake_up_interruptible(&ch->ch_pun.un_tty->write_wait);
6042                                         wake_up_interruptible(&ch->ch_pun.un_flags_wait);
6043                                 }
6044                         }
6045
6046
6047                         if (ch->ch_flags & CH_WEMPTY) {
6048                                 ch->ch_flags &= ~CH_WEMPTY;
6049                                 wake_up_interruptible(&ch->ch_flags_wait);
6050                         }
6051                 }
6052
6053                 DGAP_UNLOCK(ch->ch_lock, lock_flags2);
6054
6055 next:
6056                 tail = (tail + 4) & (EVMAX - EVSTART - 4);
6057         }
6058
6059         writew(tail, &(eaddr->ev_tail));
6060         DGAP_UNLOCK(bd->bd_lock, lock_flags);
6061
6062         return 0;
6063 }
6064
6065 static ssize_t dgap_driver_version_show(struct device_driver *ddp, char *buf)
6066 {
6067         return snprintf(buf, PAGE_SIZE, "%s\n", DG_PART);
6068 }
6069 static DRIVER_ATTR(version, S_IRUSR, dgap_driver_version_show, NULL);
6070
6071
6072 static ssize_t dgap_driver_boards_show(struct device_driver *ddp, char *buf)
6073 {
6074         return snprintf(buf, PAGE_SIZE, "%d\n", dgap_NumBoards);
6075 }
6076 static DRIVER_ATTR(boards, S_IRUSR, dgap_driver_boards_show, NULL);
6077
6078
6079 static ssize_t dgap_driver_maxboards_show(struct device_driver *ddp, char *buf)
6080 {
6081         return snprintf(buf, PAGE_SIZE, "%d\n", MAXBOARDS);
6082 }
6083 static DRIVER_ATTR(maxboards, S_IRUSR, dgap_driver_maxboards_show, NULL);
6084
6085
6086 static ssize_t dgap_driver_pollcounter_show(struct device_driver *ddp, char *buf)
6087 {
6088         return snprintf(buf, PAGE_SIZE, "%ld\n", dgap_poll_counter);
6089 }
6090 static DRIVER_ATTR(pollcounter, S_IRUSR, dgap_driver_pollcounter_show, NULL);
6091
6092
6093 static ssize_t dgap_driver_state_show(struct device_driver *ddp, char *buf)
6094 {
6095         return snprintf(buf, PAGE_SIZE, "%s\n", dgap_driver_state_text[dgap_driver_state]);
6096 }
6097 static DRIVER_ATTR(state, S_IRUSR, dgap_driver_state_show, NULL);
6098
6099 static ssize_t dgap_driver_pollrate_show(struct device_driver *ddp, char *buf)
6100 {
6101         return snprintf(buf, PAGE_SIZE, "%dms\n", dgap_poll_tick);
6102 }
6103
6104 static ssize_t dgap_driver_pollrate_store(struct device_driver *ddp, const char *buf, size_t count)
6105 {
6106         if (sscanf(buf, "%d\n", &dgap_poll_tick) != 1)
6107                 return -EINVAL;
6108         return count;
6109 }
6110 static DRIVER_ATTR(pollrate, (S_IRUSR | S_IWUSR), dgap_driver_pollrate_show, dgap_driver_pollrate_store);
6111
6112 static void dgap_create_driver_sysfiles(struct pci_driver *dgap_driver)
6113 {
6114         int rc = 0;
6115         struct device_driver *driverfs = &dgap_driver->driver;
6116
6117         rc |= driver_create_file(driverfs, &driver_attr_version);
6118         rc |= driver_create_file(driverfs, &driver_attr_boards);
6119         rc |= driver_create_file(driverfs, &driver_attr_maxboards);
6120         rc |= driver_create_file(driverfs, &driver_attr_pollrate);
6121         rc |= driver_create_file(driverfs, &driver_attr_pollcounter);
6122         rc |= driver_create_file(driverfs, &driver_attr_state);
6123         if (rc)
6124                 printk(KERN_ERR "DGAP: sysfs driver_create_file failed!\n");
6125 }
6126
6127 static void dgap_remove_driver_sysfiles(struct pci_driver *dgap_driver)
6128 {
6129         struct device_driver *driverfs = &dgap_driver->driver;
6130         driver_remove_file(driverfs, &driver_attr_version);
6131         driver_remove_file(driverfs, &driver_attr_boards);
6132         driver_remove_file(driverfs, &driver_attr_maxboards);
6133         driver_remove_file(driverfs, &driver_attr_pollrate);
6134         driver_remove_file(driverfs, &driver_attr_pollcounter);
6135         driver_remove_file(driverfs, &driver_attr_state);
6136 }
6137
6138 static struct board_t *dgap_verify_board(struct device *p)
6139 {
6140         struct board_t *bd;
6141
6142         if (!p)
6143                 return NULL;
6144
6145         bd = dev_get_drvdata(p);
6146         if (!bd || bd->magic != DGAP_BOARD_MAGIC || bd->state != BOARD_READY)
6147                 return NULL;
6148
6149         return bd;
6150 }
6151
6152 static ssize_t dgap_ports_state_show(struct device *p, struct device_attribute *attr, char *buf)
6153 {
6154         struct board_t *bd;
6155         int count = 0;
6156         int i = 0;
6157
6158         bd = dgap_verify_board(p);
6159         if (!bd)
6160                 return 0;
6161
6162         for (i = 0; i < bd->nasync; i++) {
6163                 count += snprintf(buf + count, PAGE_SIZE - count,
6164                         "%d %s\n", bd->channels[i]->ch_portnum,
6165                         bd->channels[i]->ch_open_count ? "Open" : "Closed");
6166         }
6167         return count;
6168 }
6169 static DEVICE_ATTR(ports_state, S_IRUSR, dgap_ports_state_show, NULL);
6170
6171 static ssize_t dgap_ports_baud_show(struct device *p, struct device_attribute *attr, char *buf)
6172 {
6173         struct board_t *bd;
6174         int count = 0;
6175         int i = 0;
6176
6177         bd = dgap_verify_board(p);
6178         if (!bd)
6179                 return 0;
6180
6181         for (i = 0; i < bd->nasync; i++) {
6182                 count +=  snprintf(buf + count, PAGE_SIZE - count,
6183                         "%d %d\n", bd->channels[i]->ch_portnum, bd->channels[i]->ch_baud_info);
6184         }
6185         return count;
6186 }
6187 static DEVICE_ATTR(ports_baud, S_IRUSR, dgap_ports_baud_show, NULL);
6188
6189 static ssize_t dgap_ports_msignals_show(struct device *p, struct device_attribute *attr, char *buf)
6190 {
6191         struct board_t *bd;
6192         int count = 0;
6193         int i = 0;
6194
6195         bd = dgap_verify_board(p);
6196         if (!bd)
6197                 return 0;
6198
6199         for (i = 0; i < bd->nasync; i++) {
6200                 if (bd->channels[i]->ch_open_count)
6201                         count += snprintf(buf + count, PAGE_SIZE - count,
6202                                 "%d %s %s %s %s %s %s\n", bd->channels[i]->ch_portnum,
6203                                 (bd->channels[i]->ch_mostat & UART_MCR_RTS) ? "RTS" : "",
6204                                 (bd->channels[i]->ch_mistat & UART_MSR_CTS) ? "CTS" : "",
6205                                 (bd->channels[i]->ch_mostat & UART_MCR_DTR) ? "DTR" : "",
6206                                 (bd->channels[i]->ch_mistat & UART_MSR_DSR) ? "DSR" : "",
6207                                 (bd->channels[i]->ch_mistat & UART_MSR_DCD) ? "DCD" : "",
6208                                 (bd->channels[i]->ch_mistat & UART_MSR_RI)  ? "RI"  : "");
6209                 else
6210                         count += snprintf(buf + count, PAGE_SIZE - count,
6211                                 "%d\n", bd->channels[i]->ch_portnum);
6212         }
6213         return count;
6214 }
6215 static DEVICE_ATTR(ports_msignals, S_IRUSR, dgap_ports_msignals_show, NULL);
6216
6217 static ssize_t dgap_ports_iflag_show(struct device *p, struct device_attribute *attr, char *buf)
6218 {
6219         struct board_t *bd;
6220         int count = 0;
6221         int i = 0;
6222
6223         bd = dgap_verify_board(p);
6224         if (!bd)
6225                 return 0;
6226
6227         for (i = 0; i < bd->nasync; i++)
6228                 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
6229                         bd->channels[i]->ch_portnum, bd->channels[i]->ch_c_iflag);
6230         return count;
6231 }
6232 static DEVICE_ATTR(ports_iflag, S_IRUSR, dgap_ports_iflag_show, NULL);
6233
6234 static ssize_t dgap_ports_cflag_show(struct device *p, struct device_attribute *attr, char *buf)
6235 {
6236         struct board_t *bd;
6237         int count = 0;
6238         int i = 0;
6239
6240         bd = dgap_verify_board(p);
6241         if (!bd)
6242                 return 0;
6243
6244         for (i = 0; i < bd->nasync; i++)
6245                 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
6246                         bd->channels[i]->ch_portnum, bd->channels[i]->ch_c_cflag);
6247         return count;
6248 }
6249 static DEVICE_ATTR(ports_cflag, S_IRUSR, dgap_ports_cflag_show, NULL);
6250
6251 static ssize_t dgap_ports_oflag_show(struct device *p, struct device_attribute *attr, char *buf)
6252 {
6253         struct board_t *bd;
6254         int count = 0;
6255         int i = 0;
6256
6257         bd = dgap_verify_board(p);
6258         if (!bd)
6259                 return 0;
6260
6261         for (i = 0; i < bd->nasync; i++)
6262                 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
6263                         bd->channels[i]->ch_portnum, bd->channels[i]->ch_c_oflag);
6264         return count;
6265 }
6266 static DEVICE_ATTR(ports_oflag, S_IRUSR, dgap_ports_oflag_show, NULL);
6267
6268 static ssize_t dgap_ports_lflag_show(struct device *p, struct device_attribute *attr, char *buf)
6269 {
6270         struct board_t *bd;
6271         int count = 0;
6272         int i = 0;
6273
6274         bd = dgap_verify_board(p);
6275         if (!bd)
6276                 return 0;
6277
6278         for (i = 0; i < bd->nasync; i++)
6279                 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
6280                         bd->channels[i]->ch_portnum, bd->channels[i]->ch_c_lflag);
6281         return count;
6282 }
6283 static DEVICE_ATTR(ports_lflag, S_IRUSR, dgap_ports_lflag_show, NULL);
6284
6285 static ssize_t dgap_ports_digi_flag_show(struct device *p, struct device_attribute *attr, char *buf)
6286 {
6287         struct board_t *bd;
6288         int count = 0;
6289         int i = 0;
6290
6291         bd = dgap_verify_board(p);
6292         if (!bd)
6293                 return 0;
6294
6295         for (i = 0; i < bd->nasync; i++)
6296                 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
6297                         bd->channels[i]->ch_portnum, bd->channels[i]->ch_digi.digi_flags);
6298         return count;
6299 }
6300 static DEVICE_ATTR(ports_digi_flag, S_IRUSR, dgap_ports_digi_flag_show, NULL);
6301
6302 static ssize_t dgap_ports_rxcount_show(struct device *p, struct device_attribute *attr, char *buf)
6303 {
6304         struct board_t *bd;
6305         int count = 0;
6306         int i = 0;
6307
6308         bd = dgap_verify_board(p);
6309         if (!bd)
6310                 return 0;
6311
6312         for (i = 0; i < bd->nasync; i++)
6313                 count += snprintf(buf + count, PAGE_SIZE - count, "%d %ld\n",
6314                         bd->channels[i]->ch_portnum, bd->channels[i]->ch_rxcount);
6315         return count;
6316 }
6317 static DEVICE_ATTR(ports_rxcount, S_IRUSR, dgap_ports_rxcount_show, NULL);
6318
6319 static ssize_t dgap_ports_txcount_show(struct device *p, struct device_attribute *attr, char *buf)
6320 {
6321         struct board_t *bd;
6322         int count = 0;
6323         int i = 0;
6324
6325         bd = dgap_verify_board(p);
6326         if (!bd)
6327                 return 0;
6328
6329         for (i = 0; i < bd->nasync; i++)
6330                 count += snprintf(buf + count, PAGE_SIZE - count, "%d %ld\n",
6331                         bd->channels[i]->ch_portnum, bd->channels[i]->ch_txcount);
6332         return count;
6333 }
6334 static DEVICE_ATTR(ports_txcount, S_IRUSR, dgap_ports_txcount_show, NULL);
6335
6336 /* this function creates the sys files that will export each signal status
6337  * to sysfs each value will be put in a separate filename
6338  */
6339 static void dgap_create_ports_sysfiles(struct board_t *bd)
6340 {
6341         int rc = 0;
6342
6343         dev_set_drvdata(&bd->pdev->dev, bd);
6344         rc |= device_create_file(&(bd->pdev->dev), &dev_attr_ports_state);
6345         rc |= device_create_file(&(bd->pdev->dev), &dev_attr_ports_baud);
6346         rc |= device_create_file(&(bd->pdev->dev), &dev_attr_ports_msignals);
6347         rc |= device_create_file(&(bd->pdev->dev), &dev_attr_ports_iflag);
6348         rc |= device_create_file(&(bd->pdev->dev), &dev_attr_ports_cflag);
6349         rc |= device_create_file(&(bd->pdev->dev), &dev_attr_ports_oflag);
6350         rc |= device_create_file(&(bd->pdev->dev), &dev_attr_ports_lflag);
6351         rc |= device_create_file(&(bd->pdev->dev), &dev_attr_ports_digi_flag);
6352         rc |= device_create_file(&(bd->pdev->dev), &dev_attr_ports_rxcount);
6353         rc |= device_create_file(&(bd->pdev->dev), &dev_attr_ports_txcount);
6354         if (rc)
6355                 printk(KERN_ERR "DGAP: sysfs device_create_file failed!\n");
6356 }
6357
6358 /* removes all the sys files created for that port */
6359 static void dgap_remove_ports_sysfiles(struct board_t *bd)
6360 {
6361         device_remove_file(&(bd->pdev->dev), &dev_attr_ports_state);
6362         device_remove_file(&(bd->pdev->dev), &dev_attr_ports_baud);
6363         device_remove_file(&(bd->pdev->dev), &dev_attr_ports_msignals);
6364         device_remove_file(&(bd->pdev->dev), &dev_attr_ports_iflag);
6365         device_remove_file(&(bd->pdev->dev), &dev_attr_ports_cflag);
6366         device_remove_file(&(bd->pdev->dev), &dev_attr_ports_oflag);
6367         device_remove_file(&(bd->pdev->dev), &dev_attr_ports_lflag);
6368         device_remove_file(&(bd->pdev->dev), &dev_attr_ports_digi_flag);
6369         device_remove_file(&(bd->pdev->dev), &dev_attr_ports_rxcount);
6370         device_remove_file(&(bd->pdev->dev), &dev_attr_ports_txcount);
6371 }
6372
6373 static ssize_t dgap_tty_state_show(struct device *d, struct device_attribute *attr, char *buf)
6374 {
6375         struct board_t *bd;
6376         struct channel_t *ch;
6377         struct un_t *un;
6378
6379         if (!d)
6380                 return 0;
6381         un = dev_get_drvdata(d);
6382         if (!un || un->magic != DGAP_UNIT_MAGIC)
6383                 return 0;
6384         ch = un->un_ch;
6385         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6386                 return 0;
6387         bd = ch->ch_bd;
6388         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6389                 return 0;
6390         if (bd->state != BOARD_READY)
6391                 return 0;
6392
6393         return snprintf(buf, PAGE_SIZE, "%s", un->un_open_count ? "Open" : "Closed");
6394 }
6395 static DEVICE_ATTR(state, S_IRUSR, dgap_tty_state_show, NULL);
6396
6397 static ssize_t dgap_tty_baud_show(struct device *d, struct device_attribute *attr, char *buf)
6398 {
6399         struct board_t *bd;
6400         struct channel_t *ch;
6401         struct un_t *un;
6402
6403         if (!d)
6404                 return 0;
6405         un = dev_get_drvdata(d);
6406         if (!un || un->magic != DGAP_UNIT_MAGIC)
6407                 return 0;
6408         ch = un->un_ch;
6409         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6410                 return 0;
6411         bd = ch->ch_bd;
6412         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6413                 return 0;
6414         if (bd->state != BOARD_READY)
6415                 return 0;
6416
6417         return snprintf(buf, PAGE_SIZE, "%d\n", ch->ch_baud_info);
6418 }
6419 static DEVICE_ATTR(baud, S_IRUSR, dgap_tty_baud_show, NULL);
6420
6421 static ssize_t dgap_tty_msignals_show(struct device *d, struct device_attribute *attr, char *buf)
6422 {
6423         struct board_t *bd;
6424         struct channel_t *ch;
6425         struct un_t *un;
6426
6427         if (!d)
6428                 return 0;
6429         un = dev_get_drvdata(d);
6430         if (!un || un->magic != DGAP_UNIT_MAGIC)
6431                 return 0;
6432         ch = un->un_ch;
6433         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6434                 return 0;
6435         bd = ch->ch_bd;
6436         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6437                 return 0;
6438         if (bd->state != BOARD_READY)
6439                 return 0;
6440
6441         if (ch->ch_open_count) {
6442                 return snprintf(buf, PAGE_SIZE, "%s %s %s %s %s %s\n",
6443                         (ch->ch_mostat & UART_MCR_RTS) ? "RTS" : "",
6444                         (ch->ch_mistat & UART_MSR_CTS) ? "CTS" : "",
6445                         (ch->ch_mostat & UART_MCR_DTR) ? "DTR" : "",
6446                         (ch->ch_mistat & UART_MSR_DSR) ? "DSR" : "",
6447                         (ch->ch_mistat & UART_MSR_DCD) ? "DCD" : "",
6448                         (ch->ch_mistat & UART_MSR_RI)  ? "RI"  : "");
6449         }
6450         return 0;
6451 }
6452 static DEVICE_ATTR(msignals, S_IRUSR, dgap_tty_msignals_show, NULL);
6453
6454 static ssize_t dgap_tty_iflag_show(struct device *d, struct device_attribute *attr, char *buf)
6455 {
6456         struct board_t *bd;
6457         struct channel_t *ch;
6458         struct un_t *un;
6459
6460         if (!d)
6461                 return 0;
6462         un = dev_get_drvdata(d);
6463         if (!un || un->magic != DGAP_UNIT_MAGIC)
6464                 return 0;
6465         ch = un->un_ch;
6466         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6467                 return 0;
6468         bd = ch->ch_bd;
6469         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6470                 return 0;
6471         if (bd->state != BOARD_READY)
6472                 return 0;
6473
6474         return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_iflag);
6475 }
6476 static DEVICE_ATTR(iflag, S_IRUSR, dgap_tty_iflag_show, NULL);
6477
6478 static ssize_t dgap_tty_cflag_show(struct device *d, struct device_attribute *attr, char *buf)
6479 {
6480         struct board_t *bd;
6481         struct channel_t *ch;
6482         struct un_t *un;
6483
6484         if (!d)
6485                 return 0;
6486         un = dev_get_drvdata(d);
6487         if (!un || un->magic != DGAP_UNIT_MAGIC)
6488                 return 0;
6489         ch = un->un_ch;
6490         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6491                 return 0;
6492         bd = ch->ch_bd;
6493         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6494                 return 0;
6495         if (bd->state != BOARD_READY)
6496                 return 0;
6497
6498         return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_cflag);
6499 }
6500 static DEVICE_ATTR(cflag, S_IRUSR, dgap_tty_cflag_show, NULL);
6501
6502 static ssize_t dgap_tty_oflag_show(struct device *d, struct device_attribute *attr, char *buf)
6503 {
6504         struct board_t *bd;
6505         struct channel_t *ch;
6506         struct un_t *un;
6507
6508         if (!d)
6509                 return 0;
6510         un = dev_get_drvdata(d);
6511         if (!un || un->magic != DGAP_UNIT_MAGIC)
6512                 return 0;
6513         ch = un->un_ch;
6514         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6515                 return 0;
6516         bd = ch->ch_bd;
6517         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6518                 return 0;
6519         if (bd->state != BOARD_READY)
6520                 return 0;
6521
6522         return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_oflag);
6523 }
6524 static DEVICE_ATTR(oflag, S_IRUSR, dgap_tty_oflag_show, NULL);
6525
6526 static ssize_t dgap_tty_lflag_show(struct device *d, struct device_attribute *attr, char *buf)
6527 {
6528         struct board_t *bd;
6529         struct channel_t *ch;
6530         struct un_t *un;
6531
6532         if (!d)
6533                 return 0;
6534         un = dev_get_drvdata(d);
6535         if (!un || un->magic != DGAP_UNIT_MAGIC)
6536                 return 0;
6537         ch = un->un_ch;
6538         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6539                 return 0;
6540         bd = ch->ch_bd;
6541         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6542                 return 0;
6543         if (bd->state != BOARD_READY)
6544                 return 0;
6545
6546         return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_lflag);
6547 }
6548 static DEVICE_ATTR(lflag, S_IRUSR, dgap_tty_lflag_show, NULL);
6549
6550 static ssize_t dgap_tty_digi_flag_show(struct device *d, struct device_attribute *attr, char *buf)
6551 {
6552         struct board_t *bd;
6553         struct channel_t *ch;
6554         struct un_t *un;
6555
6556         if (!d)
6557                 return 0;
6558         un = dev_get_drvdata(d);
6559         if (!un || un->magic != DGAP_UNIT_MAGIC)
6560                 return 0;
6561         ch = un->un_ch;
6562         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6563                 return 0;
6564         bd = ch->ch_bd;
6565         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6566                 return 0;
6567         if (bd->state != BOARD_READY)
6568                 return 0;
6569
6570         return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_digi.digi_flags);
6571 }
6572 static DEVICE_ATTR(digi_flag, S_IRUSR, dgap_tty_digi_flag_show, NULL);
6573
6574 static ssize_t dgap_tty_rxcount_show(struct device *d, struct device_attribute *attr, char *buf)
6575 {
6576         struct board_t *bd;
6577         struct channel_t *ch;
6578         struct un_t *un;
6579
6580         if (!d)
6581                 return 0;
6582         un = dev_get_drvdata(d);
6583         if (!un || un->magic != DGAP_UNIT_MAGIC)
6584                 return 0;
6585         ch = un->un_ch;
6586         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6587                 return 0;
6588         bd = ch->ch_bd;
6589         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6590                 return 0;
6591         if (bd->state != BOARD_READY)
6592                 return 0;
6593
6594         return snprintf(buf, PAGE_SIZE, "%ld\n", ch->ch_rxcount);
6595 }
6596 static DEVICE_ATTR(rxcount, S_IRUSR, dgap_tty_rxcount_show, NULL);
6597
6598 static ssize_t dgap_tty_txcount_show(struct device *d, struct device_attribute *attr, char *buf)
6599 {
6600         struct board_t *bd;
6601         struct channel_t *ch;
6602         struct un_t *un;
6603
6604         if (!d)
6605                 return 0;
6606         un = dev_get_drvdata(d);
6607         if (!un || un->magic != DGAP_UNIT_MAGIC)
6608                 return 0;
6609         ch = un->un_ch;
6610         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6611                 return 0;
6612         bd = ch->ch_bd;
6613         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6614                 return 0;
6615         if (bd->state != BOARD_READY)
6616                 return 0;
6617
6618         return snprintf(buf, PAGE_SIZE, "%ld\n", ch->ch_txcount);
6619 }
6620 static DEVICE_ATTR(txcount, S_IRUSR, dgap_tty_txcount_show, NULL);
6621
6622 static ssize_t dgap_tty_name_show(struct device *d, struct device_attribute *attr, char *buf)
6623 {
6624         struct board_t *bd;
6625         struct channel_t *ch;
6626         struct un_t *un;
6627         int     cn;
6628         int     bn;
6629         struct cnode *cptr = NULL;
6630         int found = FALSE;
6631         int ncount = 0;
6632         int starto = 0;
6633         int i = 0;
6634
6635         if (!d)
6636                 return 0;
6637         un = dev_get_drvdata(d);
6638         if (!un || un->magic != DGAP_UNIT_MAGIC)
6639                 return 0;
6640         ch = un->un_ch;
6641         if (!ch || ch->magic != DGAP_CHANNEL_MAGIC)
6642                 return 0;
6643         bd = ch->ch_bd;
6644         if (!bd || bd->magic != DGAP_BOARD_MAGIC)
6645                 return 0;
6646         if (bd->state != BOARD_READY)
6647                 return 0;
6648
6649         bn = bd->boardnum;
6650         cn = ch->ch_portnum;
6651
6652         for (cptr = bd->bd_config; cptr; cptr = cptr->next) {
6653
6654                 if ((cptr->type == BNODE) &&
6655                     ((cptr->u.board.type == APORT2_920P) || (cptr->u.board.type == APORT4_920P) ||
6656                      (cptr->u.board.type == APORT8_920P) || (cptr->u.board.type == PAPORT4) ||
6657                      (cptr->u.board.type == PAPORT8))) {
6658
6659                                 found = TRUE;
6660                                 if (cptr->u.board.v_start)
6661                                         starto = cptr->u.board.start;
6662                                 else
6663                                         starto = 1;
6664                 }
6665
6666                 if (cptr->type == TNODE && found == TRUE) {
6667                         char *ptr1;
6668                         if (strstr(cptr->u.ttyname, "tty")) {
6669                                 ptr1 = cptr->u.ttyname;
6670                                 ptr1 += 3;
6671                         } else
6672                                 ptr1 = cptr->u.ttyname;
6673
6674                         for (i = 0; i < dgap_config_get_number_of_ports(bd); i++) {
6675                                 if (cn == i)
6676                                         return snprintf(buf, PAGE_SIZE, "%s%s%02d\n",
6677                                                 (un->un_type == DGAP_PRINT) ? "pr" : "tty",
6678                                                 ptr1, i + starto);
6679                         }
6680                 }
6681
6682                 if (cptr->type == CNODE) {
6683
6684                         for (i = 0; i < cptr->u.conc.nport; i++) {
6685                                 if (cn == (i + ncount))
6686
6687                                         return snprintf(buf, PAGE_SIZE, "%s%s%02d\n",
6688                                                 (un->un_type == DGAP_PRINT) ? "pr" : "tty",
6689                                                 cptr->u.conc.id,
6690                                                 i + (cptr->u.conc.v_start ? cptr->u.conc.start : 1));
6691                         }
6692
6693                         ncount += cptr->u.conc.nport;
6694                 }
6695
6696                 if (cptr->type == MNODE) {
6697
6698                         for (i = 0; i < cptr->u.module.nport; i++) {
6699                                 if (cn == (i + ncount))
6700                                         return snprintf(buf, PAGE_SIZE, "%s%s%02d\n",
6701                                                 (un->un_type == DGAP_PRINT) ? "pr" : "tty",
6702                                                 cptr->u.module.id,
6703                                                 i + (cptr->u.module.v_start ? cptr->u.module.start : 1));
6704                         }
6705
6706                         ncount += cptr->u.module.nport;
6707
6708                 }
6709         }
6710
6711         return snprintf(buf, PAGE_SIZE, "%s_dgap_%d_%d\n",
6712                 (un->un_type == DGAP_PRINT) ? "pr" : "tty", bn, cn);
6713
6714 }
6715 static DEVICE_ATTR(custom_name, S_IRUSR, dgap_tty_name_show, NULL);
6716
6717 static struct attribute *dgap_sysfs_tty_entries[] = {
6718         &dev_attr_state.attr,
6719         &dev_attr_baud.attr,
6720         &dev_attr_msignals.attr,
6721         &dev_attr_iflag.attr,
6722         &dev_attr_cflag.attr,
6723         &dev_attr_oflag.attr,
6724         &dev_attr_lflag.attr,
6725         &dev_attr_digi_flag.attr,
6726         &dev_attr_rxcount.attr,
6727         &dev_attr_txcount.attr,
6728         &dev_attr_custom_name.attr,
6729         NULL
6730 };
6731
6732 static struct attribute_group dgap_tty_attribute_group = {
6733         .name = NULL,
6734         .attrs = dgap_sysfs_tty_entries,
6735 };
6736
6737 static void dgap_create_tty_sysfs(struct un_t *un, struct device *c)
6738 {
6739         int ret;
6740
6741         ret = sysfs_create_group(&c->kobj, &dgap_tty_attribute_group);
6742         if (ret)
6743                 return;
6744
6745         dev_set_drvdata(c, un);
6746
6747 }
6748
6749 static void dgap_remove_tty_sysfs(struct device *c)
6750 {
6751         sysfs_remove_group(&c->kobj, &dgap_tty_attribute_group);
6752 }
6753
6754 /*
6755  * Parse a configuration file read into memory as a string.
6756  */
6757 static int      dgap_parsefile(char **in, int Remove)
6758 {
6759         struct cnode *p, *brd, *line, *conc;
6760         int     rc;
6761         char    *s = NULL, *s2 = NULL;
6762         int     linecnt = 0;
6763
6764         p = &dgap_head;
6765         brd = line = conc = NULL;
6766
6767         /* perhaps we are adding to an existing list? */
6768         while (p->next != NULL)
6769                 p = p->next;
6770
6771         /* file must start with a BEGIN */
6772         while ((rc = dgap_gettok(in, p)) != BEGIN) {
6773                 if (rc == 0) {
6774                         dgap_err("unexpected EOF");
6775                         return -1;
6776                 }
6777         }
6778
6779         for (; ;) {
6780                 rc = dgap_gettok(in, p);
6781                 if (rc == 0) {
6782                         dgap_err("unexpected EOF");
6783                         return -1;
6784                 }
6785
6786                 switch (rc) {
6787                 case 0:
6788                         dgap_err("unexpected end of file");
6789                         return -1;
6790
6791                 case BEGIN:     /* should only be 1 begin */
6792                         dgap_err("unexpected config_begin\n");
6793                         return -1;
6794
6795                 case END:
6796                         return 0;
6797
6798                 case BOARD:     /* board info */
6799                         if (dgap_checknode(p))
6800                                 return -1;
6801                         p->next = dgap_newnode(BNODE);
6802                         if (!p->next) {
6803                                 dgap_err("out of memory");
6804                                 return -1;
6805                         }
6806                         p = p->next;
6807
6808                         p->u.board.status = dgap_savestring("No");
6809                         line = conc = NULL;
6810                         brd = p;
6811                         linecnt = -1;
6812                         break;
6813
6814                 case APORT2_920P:       /* AccelePort_4 */
6815                         if (p->type != BNODE) {
6816                                 dgap_err("unexpected Digi_2r_920 string");
6817                                 return -1;
6818                         }
6819                         p->u.board.type = APORT2_920P;
6820                         p->u.board.v_type = 1;
6821                         break;
6822
6823                 case APORT4_920P:       /* AccelePort_4 */
6824                         if (p->type != BNODE) {
6825                                 dgap_err("unexpected Digi_4r_920 string");
6826                                 return -1;
6827                         }
6828                         p->u.board.type = APORT4_920P;
6829                         p->u.board.v_type = 1;
6830                         break;
6831
6832                 case APORT8_920P:       /* AccelePort_8 */
6833                         if (p->type != BNODE) {
6834                                 dgap_err("unexpected Digi_8r_920 string");
6835                                 return -1;
6836                         }
6837                         p->u.board.type = APORT8_920P;
6838                         p->u.board.v_type = 1;
6839                         break;
6840
6841                 case PAPORT4:   /* AccelePort_4 PCI */
6842                         if (p->type != BNODE) {
6843                                 dgap_err("unexpected Digi_4r(PCI) string");
6844                                 return -1;
6845                         }
6846                         p->u.board.type = PAPORT4;
6847                         p->u.board.v_type = 1;
6848                         break;
6849
6850                 case PAPORT8:   /* AccelePort_8 PCI */
6851                         if (p->type != BNODE) {
6852                                 dgap_err("unexpected Digi_8r string");
6853                                 return -1;
6854                         }
6855                         p->u.board.type = PAPORT8;
6856                         p->u.board.v_type = 1;
6857                         break;
6858
6859                 case PCX:       /* PCI C/X */
6860                         if (p->type != BNODE) {
6861                                 dgap_err("unexpected Digi_C/X_(PCI) string");
6862                                 return -1;
6863                         }
6864                         p->u.board.type = PCX;
6865                         p->u.board.v_type = 1;
6866                         p->u.board.conc1 = 0;
6867                         p->u.board.conc2 = 0;
6868                         p->u.board.module1 = 0;
6869                         p->u.board.module2 = 0;
6870                         break;
6871
6872                 case PEPC:      /* PCI EPC/X */
6873                         if (p->type != BNODE) {
6874                                 dgap_err("unexpected \"Digi_EPC/X_(PCI)\" string");
6875                                 return -1;
6876                         }
6877                         p->u.board.type = PEPC;
6878                         p->u.board.v_type = 1;
6879                         p->u.board.conc1 = 0;
6880                         p->u.board.conc2 = 0;
6881                         p->u.board.module1 = 0;
6882                         p->u.board.module2 = 0;
6883                         break;
6884
6885                 case PPCM:      /* PCI/Xem */
6886                         if (p->type != BNODE) {
6887                                 dgap_err("unexpected PCI/Xem string");
6888                                 return -1;
6889                         }
6890                         p->u.board.type = PPCM;
6891                         p->u.board.v_type = 1;
6892                         p->u.board.conc1 = 0;
6893                         p->u.board.conc2 = 0;
6894                         break;
6895
6896                 case IO:        /* i/o port */
6897                         if (p->type != BNODE) {
6898                                 dgap_err("IO port only vaild for boards");
6899                                 return -1;
6900                         }
6901                         s = dgap_getword(in);
6902                         if (s == NULL) {
6903                                 dgap_err("unexpected end of file");
6904                                 return -1;
6905                         }
6906                         p->u.board.portstr = dgap_savestring(s);
6907                         p->u.board.port = (short)simple_strtol(s, &s2, 0);
6908                         if ((short)strlen(s) > (short)(s2 - s)) {
6909                                 dgap_err("bad number for IO port");
6910                                 return -1;
6911                         }
6912                         p->u.board.v_port = 1;
6913                         break;
6914
6915                 case MEM:       /* memory address */
6916                         if (p->type != BNODE) {
6917                                 dgap_err("memory address only vaild for boards");
6918                                 return -1;
6919                         }
6920                         s = dgap_getword(in);
6921                         if (s == NULL) {
6922                                 dgap_err("unexpected end of file");
6923                                 return -1;
6924                         }
6925                         p->u.board.addrstr = dgap_savestring(s);
6926                         p->u.board.addr = simple_strtoul(s, &s2, 0);
6927                         if ((int)strlen(s) > (int)(s2 - s)) {
6928                                 dgap_err("bad number for memory address");
6929                                 return -1;
6930                         }
6931                         p->u.board.v_addr = 1;
6932                         break;
6933
6934                 case PCIINFO:   /* pci information */
6935                         if (p->type != BNODE) {
6936                                 dgap_err("memory address only vaild for boards");
6937                                 return -1;
6938                         }
6939                         s = dgap_getword(in);
6940                         if (s == NULL) {
6941                                 dgap_err("unexpected end of file");
6942                                 return -1;
6943                         }
6944                         p->u.board.pcibusstr = dgap_savestring(s);
6945                         p->u.board.pcibus = simple_strtoul(s, &s2, 0);
6946                         if ((int)strlen(s) > (int)(s2 - s)) {
6947                                 dgap_err("bad number for pci bus");
6948                                 return -1;
6949                         }
6950                         p->u.board.v_pcibus = 1;
6951                         s = dgap_getword(in);
6952                         if (s == NULL) {
6953                                 dgap_err("unexpected end of file");
6954                                 return -1;
6955                         }
6956                         p->u.board.pcislotstr = dgap_savestring(s);
6957                         p->u.board.pcislot = simple_strtoul(s, &s2, 0);
6958                         if ((int)strlen(s) > (int)(s2 - s)) {
6959                                 dgap_err("bad number for pci slot");
6960                                 return -1;
6961                         }
6962                         p->u.board.v_pcislot = 1;
6963                         break;
6964
6965                 case METHOD:
6966                         if (p->type != BNODE) {
6967                                 dgap_err("install method only vaild for boards");
6968                                 return -1;
6969                         }
6970                         s = dgap_getword(in);
6971                         if (s == NULL) {
6972                                 dgap_err("unexpected end of file");
6973                                 return -1;
6974                         }
6975                         p->u.board.method = dgap_savestring(s);
6976                         p->u.board.v_method = 1;
6977                         break;
6978
6979                 case STATUS:
6980                         if (p->type != BNODE) {
6981                                 dgap_err("config status only vaild for boards");
6982                                 return -1;
6983                         }
6984                         s = dgap_getword(in);
6985                         if (s == NULL) {
6986                                 dgap_err("unexpected end of file");
6987                                 return -1;
6988                         }
6989                         p->u.board.status = dgap_savestring(s);
6990                         break;
6991
6992                 case NPORTS:    /* number of ports */
6993                         if (p->type == BNODE) {
6994                                 s = dgap_getword(in);
6995                                 if (s == NULL) {
6996                                         dgap_err("unexpected end of file");
6997                                         return -1;
6998                                 }
6999                                 p->u.board.nport = (char)simple_strtol(s, &s2, 0);
7000                                 if ((int)strlen(s) > (int)(s2 - s)) {
7001                                         dgap_err("bad number for number of ports");
7002                                         return -1;
7003                                 }
7004                                 p->u.board.v_nport = 1;
7005                         } else if (p->type == CNODE) {
7006                                 s = dgap_getword(in);
7007                                 if (s == NULL) {
7008                                         dgap_err("unexpected end of file");
7009                                         return -1;
7010                                 }
7011                                 p->u.conc.nport = (char)simple_strtol(s, &s2, 0);
7012                                 if ((int)strlen(s) > (int)(s2 - s)) {
7013                                         dgap_err("bad number for number of ports");
7014                                         return -1;
7015                                 }
7016                                 p->u.conc.v_nport = 1;
7017                         } else if (p->type == MNODE) {
7018                                 s = dgap_getword(in);
7019                                 if (s == NULL) {
7020                                         dgap_err("unexpected end of file");
7021                                         return -1;
7022                                 }
7023                                 p->u.module.nport = (char)simple_strtol(s, &s2, 0);
7024                                 if ((int)strlen(s) > (int)(s2 - s)) {
7025                                         dgap_err("bad number for number of ports");
7026                                         return -1;
7027                                 }
7028                                 p->u.module.v_nport = 1;
7029                         } else {
7030                                 dgap_err("nports only valid for concentrators or modules");
7031                                 return -1;
7032                         }
7033                         break;
7034
7035                 case ID:        /* letter ID used in tty name */
7036                         s = dgap_getword(in);
7037                         if (s == NULL) {
7038                                 dgap_err("unexpected end of file");
7039                                 return -1;
7040                         }
7041
7042                         p->u.board.status = dgap_savestring(s);
7043
7044                         if (p->type == CNODE) {
7045                                 p->u.conc.id = dgap_savestring(s);
7046                                 p->u.conc.v_id = 1;
7047                         } else if (p->type == MNODE) {
7048                                 p->u.module.id = dgap_savestring(s);
7049                                 p->u.module.v_id = 1;
7050                         } else {
7051                                 dgap_err("id only valid for concentrators or modules");
7052                                 return -1;
7053                         }
7054                         break;
7055
7056                 case STARTO:    /* start offset of ID */
7057                         if (p->type == BNODE) {
7058                                 s = dgap_getword(in);
7059                                 if (s == NULL) {
7060                                         dgap_err("unexpected end of file");
7061                                         return -1;
7062                                 }
7063                                 p->u.board.start = simple_strtol(s, &s2, 0);
7064                                 if ((int)strlen(s) > (int)(s2 - s)) {
7065                                         dgap_err("bad number for start of tty count");
7066                                         return -1;
7067                                 }
7068                                 p->u.board.v_start = 1;
7069                         } else if (p->type == CNODE) {
7070                                 s = dgap_getword(in);
7071                                 if (s == NULL) {
7072                                         dgap_err("unexpected end of file");
7073                                         return -1;
7074                                 }
7075                                 p->u.conc.start = simple_strtol(s, &s2, 0);
7076                                 if ((int)strlen(s) > (int)(s2 - s)) {
7077                                         dgap_err("bad number for start of tty count");
7078                                         return -1;
7079                                 }
7080                                 p->u.conc.v_start = 1;
7081                         } else if (p->type == MNODE) {
7082                                 s = dgap_getword(in);
7083                                 if (s == NULL) {
7084                                         dgap_err("unexpected end of file");
7085                                         return -1;
7086                                 }
7087                                 p->u.module.start = simple_strtol(s, &s2, 0);
7088                                 if ((int)strlen(s) > (int)(s2 - s)) {
7089                                         dgap_err("bad number for start of tty count");
7090                                         return -1;
7091                                 }
7092                                 p->u.module.v_start = 1;
7093                         } else {
7094                                 dgap_err("start only valid for concentrators or modules");
7095                                 return -1;
7096                         }
7097                         break;
7098
7099                 case TTYN:      /* tty name prefix */
7100                         if (dgap_checknode(p))
7101                                 return -1;
7102                         p->next = dgap_newnode(TNODE);
7103                         if (!p->next) {
7104                                 dgap_err("out of memory");
7105                                 return -1;
7106                         }
7107                         p = p->next;
7108                         s = dgap_getword(in);
7109                         if (!s) {
7110                                 dgap_err("unexpeced end of file");
7111                                 return -1;
7112                         }
7113                         p->u.ttyname = dgap_savestring(s);
7114                         if (!p->u.ttyname) {
7115                                 dgap_err("out of memory");
7116                                 return -1;
7117                         }
7118                         break;
7119
7120                 case CU:        /* cu name prefix */
7121                         if (dgap_checknode(p))
7122                                 return -1;
7123                         p->next = dgap_newnode(CUNODE);
7124                         if (!p->next) {
7125                                 dgap_err("out of memory");
7126                                 return -1;
7127                         }
7128                         p = p->next;
7129                         s = dgap_getword(in);
7130                         if (!s) {
7131                                 dgap_err("unexpeced end of file");
7132                                 return -1;
7133                         }
7134                         p->u.cuname = dgap_savestring(s);
7135                         if (!p->u.cuname) {
7136                                 dgap_err("out of memory");
7137                                 return -1;
7138                         }
7139                         break;
7140
7141                 case LINE:      /* line information */
7142                         if (dgap_checknode(p))
7143                                 return -1;
7144                         if (brd == NULL) {
7145                                 dgap_err("must specify board before line info");
7146                                 return -1;
7147                         }
7148                         switch (brd->u.board.type) {
7149                         case PPCM:
7150                                 dgap_err("line not vaild for PC/em");
7151                                 return -1;
7152                         }
7153                         p->next = dgap_newnode(LNODE);
7154                         if (!p->next) {
7155                                 dgap_err("out of memory");
7156                                 return -1;
7157                         }
7158                         p = p->next;
7159                         conc = NULL;
7160                         line = p;
7161                         linecnt++;
7162                         break;
7163
7164                 case CONC:      /* concentrator information */
7165                         if (dgap_checknode(p))
7166                                 return -1;
7167                         if (line == NULL) {
7168                                 dgap_err("must specify line info before concentrator");
7169                                 return -1;
7170                         }
7171                         p->next = dgap_newnode(CNODE);
7172                         if (!p->next) {
7173                                 dgap_err("out of memory");
7174                                 return -1;
7175                         }
7176                         p = p->next;
7177                         conc = p;
7178                         if (linecnt)
7179                                 brd->u.board.conc2++;
7180                         else
7181                                 brd->u.board.conc1++;
7182
7183                         break;
7184
7185                 case CX:        /* c/x type concentrator */
7186                         if (p->type != CNODE) {
7187                                 dgap_err("cx only valid for concentrators");
7188                                 return -1;
7189                         }
7190                         p->u.conc.type = CX;
7191                         p->u.conc.v_type = 1;
7192                         break;
7193
7194                 case EPC:       /* epc type concentrator */
7195                         if (p->type != CNODE) {
7196                                 dgap_err("cx only valid for concentrators");
7197                                 return -1;
7198                         }
7199                         p->u.conc.type = EPC;
7200                         p->u.conc.v_type = 1;
7201                         break;
7202
7203                 case MOD:       /* EBI module */
7204                         if (dgap_checknode(p))
7205                                 return -1;
7206                         if (brd == NULL) {
7207                                 dgap_err("must specify board info before EBI modules");
7208                                 return -1;
7209                         }
7210                         switch (brd->u.board.type) {
7211                         case PPCM:
7212                                 linecnt = 0;
7213                                 break;
7214                         default:
7215                                 if (conc == NULL) {
7216                                         dgap_err("must specify concentrator info before EBI module");
7217                                         return -1;
7218                                 }
7219                         }
7220                         p->next = dgap_newnode(MNODE);
7221                         if (!p->next) {
7222                                 dgap_err("out of memory");
7223                                 return -1;
7224                         }
7225                         p = p->next;
7226                         if (linecnt)
7227                                 brd->u.board.module2++;
7228                         else
7229                                 brd->u.board.module1++;
7230
7231                         break;
7232
7233                 case PORTS:     /* ports type EBI module */
7234                         if (p->type != MNODE) {
7235                                 dgap_err("ports only valid for EBI modules");
7236                                 return -1;
7237                         }
7238                         p->u.module.type = PORTS;
7239                         p->u.module.v_type = 1;
7240                         break;
7241
7242                 case MODEM:     /* ports type EBI module */
7243                         if (p->type != MNODE) {
7244                                 dgap_err("modem only valid for modem modules");
7245                                 return -1;
7246                         }
7247                         p->u.module.type = MODEM;
7248                         p->u.module.v_type = 1;
7249                         break;
7250
7251                 case CABLE:
7252                         if (p->type == LNODE) {
7253                                 s = dgap_getword(in);
7254                                 if (!s) {
7255                                         dgap_err("unexpected end of file");
7256                                         return -1;
7257                                 }
7258                                 p->u.line.cable = dgap_savestring(s);
7259                                 p->u.line.v_cable = 1;
7260                         }
7261                         break;
7262
7263                 case SPEED:     /* sync line speed indication */
7264                         if (p->type == LNODE) {
7265                                 s = dgap_getword(in);
7266                                 if (s == NULL) {
7267                                         dgap_err("unexpected end of file");
7268                                         return -1;
7269                                 }
7270                                 p->u.line.speed = (char)simple_strtol(s, &s2, 0);
7271                                 if ((short)strlen(s) > (short)(s2 - s)) {
7272                                         dgap_err("bad number for line speed");
7273                                         return -1;
7274                                 }
7275                                 p->u.line.v_speed = 1;
7276                         } else if (p->type == CNODE) {
7277                                 s = dgap_getword(in);
7278                                 if (s == NULL) {
7279                                         dgap_err("unexpected end of file");
7280                                         return -1;
7281                                 }
7282                                 p->u.conc.speed = (char)simple_strtol(s, &s2, 0);
7283                                 if ((short)strlen(s) > (short)(s2 - s)) {
7284                                         dgap_err("bad number for line speed");
7285                                         return -1;
7286                                 }
7287                                 p->u.conc.v_speed = 1;
7288                         } else {
7289                                 dgap_err("speed valid only for lines or concentrators.");
7290                                 return -1;
7291                         }
7292                         break;
7293
7294                 case CONNECT:
7295                         if (p->type == CNODE) {
7296                                 s = dgap_getword(in);
7297                                 if (!s) {
7298                                         dgap_err("unexpected end of file");
7299                                         return -1;
7300                                 }
7301                                 p->u.conc.connect = dgap_savestring(s);
7302                                 p->u.conc.v_connect = 1;
7303                         }
7304                         break;
7305                 case PRINT:     /* transparent print name prefix */
7306                         if (dgap_checknode(p))
7307                                 return -1;
7308                         p->next = dgap_newnode(PNODE);
7309                         if (!p->next) {
7310                                 dgap_err("out of memory");
7311                                 return -1;
7312                         }
7313                         p = p->next;
7314                         s = dgap_getword(in);
7315                         if (!s) {
7316                                 dgap_err("unexpeced end of file");
7317                                 return -1;
7318                         }
7319                         p->u.printname = dgap_savestring(s);
7320                         if (!p->u.printname) {
7321                                 dgap_err("out of memory");
7322                                 return -1;
7323                         }
7324                         break;
7325
7326                 case CMAJOR:    /* major number */
7327                         if (dgap_checknode(p))
7328                                 return -1;
7329                         p->next = dgap_newnode(JNODE);
7330                         if (!p->next) {
7331                                 dgap_err("out of memory");
7332                                 return -1;
7333                         }
7334                         p = p->next;
7335                         s = dgap_getword(in);
7336                         if (s == NULL) {
7337                                 dgap_err("unexpected end of file");
7338                                 return -1;
7339                         }
7340                         p->u.majornumber = simple_strtol(s, &s2, 0);
7341                         if ((int)strlen(s) > (int)(s2 - s)) {
7342                                 dgap_err("bad number for major number");
7343                                 return -1;
7344                         }
7345                         break;
7346
7347                 case ALTPIN:    /* altpin setting */
7348                         if (dgap_checknode(p))
7349                                 return -1;
7350                         p->next = dgap_newnode(ANODE);
7351                         if (!p->next) {
7352                                 dgap_err("out of memory");
7353                                 return -1;
7354                         }
7355                         p = p->next;
7356                         s = dgap_getword(in);
7357                         if (s == NULL) {
7358                                 dgap_err("unexpected end of file");
7359                                 return -1;
7360                         }
7361                         p->u.altpin = simple_strtol(s, &s2, 0);
7362                         if ((int)strlen(s) > (int)(s2 - s)) {
7363                                 dgap_err("bad number for altpin");
7364                                 return -1;
7365                         }
7366                         break;
7367
7368                 case USEINTR:           /* enable interrupt setting */
7369                         if (dgap_checknode(p))
7370                                 return -1;
7371                         p->next = dgap_newnode(INTRNODE);
7372                         if (!p->next) {
7373                                 dgap_err("out of memory");
7374                                 return -1;
7375                         }
7376                         p = p->next;
7377                         s = dgap_getword(in);
7378                         if (s == NULL) {
7379                                 dgap_err("unexpected end of file");
7380                                 return -1;
7381                         }
7382                         p->u.useintr = simple_strtol(s, &s2, 0);
7383                         if ((int)strlen(s) > (int)(s2 - s)) {
7384                                 dgap_err("bad number for useintr");
7385                                 return -1;
7386                         }
7387                         break;
7388
7389                 case TTSIZ:     /* size of tty structure */
7390                         if (dgap_checknode(p))
7391                                 return -1;
7392                         p->next = dgap_newnode(TSNODE);
7393                         if (!p->next) {
7394                                 dgap_err("out of memory");
7395                                 return -1;
7396                         }
7397                         p = p->next;
7398                         s = dgap_getword(in);
7399                         if (s == NULL) {
7400                                 dgap_err("unexpected end of file");
7401                                 return -1;
7402                         }
7403                         p->u.ttysize = simple_strtol(s, &s2, 0);
7404                         if ((int)strlen(s) > (int)(s2 - s)) {
7405                                 dgap_err("bad number for ttysize");
7406                                 return -1;
7407                         }
7408                         break;
7409
7410                 case CHSIZ:     /* channel structure size */
7411                         if (dgap_checknode(p))
7412                                 return -1;
7413                         p->next = dgap_newnode(CSNODE);
7414                         if (!p->next) {
7415                                 dgap_err("out of memory");
7416                                 return -1;
7417                         }
7418                         p = p->next;
7419                         s = dgap_getword(in);
7420                         if (s == NULL) {
7421                                 dgap_err("unexpected end of file");
7422                                 return -1;
7423                         }
7424                         p->u.chsize = simple_strtol(s, &s2, 0);
7425                         if ((int)strlen(s) > (int)(s2 - s)) {
7426                                 dgap_err("bad number for chsize");
7427                                 return -1;
7428                         }
7429                         break;
7430
7431                 case BSSIZ:     /* board structure size */
7432                         if (dgap_checknode(p))
7433                                 return -1;
7434                         p->next = dgap_newnode(BSNODE);
7435                         if (!p->next) {
7436                                 dgap_err("out of memory");
7437                                 return -1;
7438                         }
7439                         p = p->next;
7440                         s = dgap_getword(in);
7441                         if (s == NULL) {
7442                                 dgap_err("unexpected end of file");
7443                                 return -1;
7444                         }
7445                         p->u.bssize = simple_strtol(s, &s2, 0);
7446                         if ((int)strlen(s) > (int)(s2 - s)) {
7447                                 dgap_err("bad number for bssize");
7448                                 return -1;
7449                         }
7450                         break;
7451
7452                 case UNTSIZ:    /* sched structure size */
7453                         if (dgap_checknode(p))
7454                                 return -1;
7455                         p->next = dgap_newnode(USNODE);
7456                         if (!p->next) {
7457                                 dgap_err("out of memory");
7458                                 return -1;
7459                         }
7460                         p = p->next;
7461                         s = dgap_getword(in);
7462                         if (s == NULL) {
7463                                 dgap_err("unexpected end of file");
7464                                 return -1;
7465                         }
7466                         p->u.unsize = simple_strtol(s, &s2, 0);
7467                         if ((int)strlen(s) > (int)(s2 - s)) {
7468                                 dgap_err("bad number for schedsize");
7469                                 return -1;
7470                         }
7471                         break;
7472
7473                 case F2SIZ:     /* f2200 structure size */
7474                         if (dgap_checknode(p))
7475                                 return -1;
7476                         p->next = dgap_newnode(FSNODE);
7477                         if (!p->next) {
7478                                 dgap_err("out of memory");
7479                                 return -1;
7480                         }
7481                         p = p->next;
7482                         s = dgap_getword(in);
7483                         if (s == NULL) {
7484                                 dgap_err("unexpected end of file");
7485                                 return -1;
7486                         }
7487                         p->u.f2size = simple_strtol(s, &s2, 0);
7488                         if ((int)strlen(s) > (int)(s2 - s)) {
7489                                 dgap_err("bad number for f2200size");
7490                                 return -1;
7491                         }
7492                         break;
7493
7494                 case VPSIZ:     /* vpix structure size */
7495                         if (dgap_checknode(p))
7496                                 return -1;
7497                         p->next = dgap_newnode(VSNODE);
7498                         if (!p->next) {
7499                                 dgap_err("out of memory");
7500                                 return -1;
7501                         }
7502                         p = p->next;
7503                         s = dgap_getword(in);
7504                         if (s == NULL) {
7505                                 dgap_err("unexpected end of file");
7506                                 return -1;
7507                         }
7508                         p->u.vpixsize = simple_strtol(s, &s2, 0);
7509                         if ((int)strlen(s) > (int)(s2 - s)) {
7510                                 dgap_err("bad number for vpixsize");
7511                                 return -1;
7512                         }
7513                         break;
7514                 }
7515         }
7516 }
7517
7518 /*
7519  * dgap_sindex: much like index(), but it looks for a match of any character in
7520  * the group, and returns that position.  If the first character is a ^, then
7521  * this will match the first occurrence not in that group.
7522  */
7523 static char *dgap_sindex(char *string, char *group)
7524 {
7525         char    *ptr;
7526
7527         if (!string || !group)
7528                 return (char *) NULL;
7529
7530         if (*group == '^') {
7531                 group++;
7532                 for (; *string; string++) {
7533                         for (ptr = group; *ptr; ptr++) {
7534                                 if (*ptr == *string)
7535                                         break;
7536                         }
7537                         if (*ptr == '\0')
7538                                 return string;
7539                 }
7540         } else {
7541                 for (; *string; string++) {
7542                         for (ptr = group; *ptr; ptr++) {
7543                                 if (*ptr == *string)
7544                                         return string;
7545                         }
7546                 }
7547         }
7548
7549         return (char *) NULL;
7550 }
7551
7552 /*
7553  * Get a token from the input file; return 0 if end of file is reached
7554  */
7555 static int dgap_gettok(char **in, struct cnode *p)
7556 {
7557         char    *w;
7558         struct toklist *t;
7559
7560         if (strstr(dgap_cword, "boar")) {
7561                 w = dgap_getword(in);
7562                 snprintf(dgap_cword, MAXCWORD, "%s", w);
7563                 for (t = dgap_tlist; t->token != 0; t++) {
7564                         if (!strcmp(w, t->string))
7565                                 return t->token;
7566                 }
7567                 dgap_err("board !!type not specified");
7568                 return 1;
7569         } else {
7570                 while ((w = dgap_getword(in))) {
7571                         snprintf(dgap_cword, MAXCWORD, "%s", w);
7572                         for (t = dgap_tlist; t->token != 0; t++) {
7573                                 if (!strcmp(w, t->string))
7574                                         return t->token;
7575                         }
7576                 }
7577                 return 0;
7578         }
7579 }
7580
7581 /*
7582  * get a word from the input stream, also keep track of current line number.
7583  * words are separated by whitespace.
7584  */
7585 static char *dgap_getword(char **in)
7586 {
7587         char *ret_ptr = *in;
7588
7589         char *ptr = dgap_sindex(*in, " \t\n");
7590
7591         /* If no word found, return null */
7592         if (!ptr)
7593                 return NULL;
7594
7595         /* Mark new location for our buffer */
7596         *ptr = '\0';
7597         *in = ptr + 1;
7598
7599         /* Eat any extra spaces/tabs/newlines that might be present */
7600         while (*in && **in && ((**in == ' ') || (**in == '\t') || (**in == '\n'))) {
7601                 **in = '\0';
7602                 *in = *in + 1;
7603         }
7604
7605         return ret_ptr;
7606 }
7607
7608 /*
7609  * print an error message, giving the line number in the file where
7610  * the error occurred.
7611  */
7612 static void dgap_err(char *s)
7613 {
7614         pr_err("dgap: parse: %s\n", s);
7615 }
7616
7617 /*
7618  * allocate a new configuration node of type t
7619  */
7620 static struct cnode *dgap_newnode(int t)
7621 {
7622         struct cnode *n;
7623
7624         n = kmalloc(sizeof(struct cnode), GFP_ATOMIC);
7625         if (n != NULL) {
7626                 memset((char *)n, 0, sizeof(struct cnode));
7627                 n->type = t;
7628         }
7629         return n;
7630 }
7631
7632 /*
7633  * dgap_checknode: see if all the necessary info has been supplied for a node
7634  * before creating the next node.
7635  */
7636 static int dgap_checknode(struct cnode *p)
7637 {
7638         switch (p->type) {
7639         case BNODE:
7640                 if (p->u.board.v_type == 0) {
7641                         dgap_err("board type !not specified");
7642                         return 1;
7643                 }
7644
7645                 return 0;
7646
7647         case LNODE:
7648                 if (p->u.line.v_speed == 0) {
7649                         dgap_err("line speed not specified");
7650                         return 1;
7651                 }
7652                 return 0;
7653
7654         case CNODE:
7655                 if (p->u.conc.v_type == 0) {
7656                         dgap_err("concentrator type not specified");
7657                         return 1;
7658                 }
7659                 if (p->u.conc.v_speed == 0) {
7660                         dgap_err("concentrator line speed not specified");
7661                         return 1;
7662                 }
7663                 if (p->u.conc.v_nport == 0) {
7664                         dgap_err("number of ports on concentrator not specified");
7665                         return 1;
7666                 }
7667                 if (p->u.conc.v_id == 0) {
7668                         dgap_err("concentrator id letter not specified");
7669                         return 1;
7670                 }
7671                 return 0;
7672
7673         case MNODE:
7674                 if (p->u.module.v_type == 0) {
7675                         dgap_err("EBI module type not specified");
7676                         return 1;
7677                 }
7678                 if (p->u.module.v_nport == 0) {
7679                         dgap_err("number of ports on EBI module not specified");
7680                         return 1;
7681                 }
7682                 if (p->u.module.v_id == 0) {
7683                         dgap_err("EBI module id letter not specified");
7684                         return 1;
7685                 }
7686                 return 0;
7687         }
7688         return 0;
7689 }
7690
7691 /*
7692  * save a string somewhere
7693  */
7694 static char     *dgap_savestring(char *s)
7695 {
7696         char    *p;
7697
7698         p = kmalloc(strlen(s) + 1, GFP_ATOMIC);
7699         if (p)
7700                 strcpy(p, s);
7701         return p;
7702 }
7703
7704 /*
7705  * Given a board pointer, returns whether we should use interrupts or not.
7706  */
7707 static uint dgap_config_get_useintr(struct board_t *bd)
7708 {
7709         struct cnode *p = NULL;
7710
7711         if (!bd)
7712                 return 0;
7713
7714         for (p = bd->bd_config; p; p = p->next) {
7715                 switch (p->type) {
7716                 case INTRNODE:
7717                         /*
7718                          * check for pcxr types.
7719                          */
7720                         return p->u.useintr;
7721                 default:
7722                         break;
7723                 }
7724         }
7725
7726         /* If not found, then don't turn on interrupts. */
7727         return 0;
7728 }
7729
7730 /*
7731  * Given a board pointer, returns whether we turn on altpin or not.
7732  */
7733 static uint dgap_config_get_altpin(struct board_t *bd)
7734 {
7735         struct cnode *p = NULL;
7736
7737         if (!bd)
7738                 return 0;
7739
7740         for (p = bd->bd_config; p; p = p->next) {
7741                 switch (p->type) {
7742                 case ANODE:
7743                         /*
7744                          * check for pcxr types.
7745                          */
7746                         return p->u.altpin;
7747                 default:
7748                         break;
7749                 }
7750         }
7751
7752         /* If not found, then don't turn on interrupts. */
7753         return 0;
7754 }
7755
7756 /*
7757  * Given a specific type of board, if found, detached link and
7758  * returns the first occurrence in the list.
7759  */
7760 static struct cnode *dgap_find_config(int type, int bus, int slot)
7761 {
7762         struct cnode *p, *prev = NULL, *prev2 = NULL, *found = NULL;
7763
7764         p = &dgap_head;
7765
7766         while (p->next != NULL) {
7767                 prev = p;
7768                 p = p->next;
7769
7770                 if (p->type == BNODE) {
7771
7772                         if (p->u.board.type == type) {
7773
7774                                 if (p->u.board.v_pcibus &&
7775                                     p->u.board.pcibus != bus)
7776                                         continue;
7777                                 if (p->u.board.v_pcislot &&
7778                                     p->u.board.pcislot != slot)
7779                                         continue;
7780
7781                                 found = p;
7782                                 /*
7783                                  * Keep walking thru the list till we find the next board.
7784                                  */
7785                                 while (p->next != NULL) {
7786                                         prev2 = p;
7787                                         p = p->next;
7788                                         if (p->type == BNODE) {
7789
7790                                                 /*
7791                                                  * Mark the end of our 1 board chain of configs.
7792                                                  */
7793                                                 prev2->next = NULL;
7794
7795                                                 /*
7796                                                  * Link the "next" board to the previous board,
7797                                                  * effectively "unlinking" our board from the main config.
7798                                                  */
7799                                                 prev->next = p;
7800
7801                                                 return found;
7802                                         }
7803                                 }
7804                                 /*
7805                                  * It must be the last board in the list.
7806                                  */
7807                                 prev->next = NULL;
7808                                 return found;
7809                         }
7810                 }
7811         }
7812         return NULL;
7813 }
7814
7815 /*
7816  * Given a board pointer, walks the config link, counting up
7817  * all ports user specified should be on the board.
7818  * (This does NOT mean they are all actually present right now tho)
7819  */
7820 static uint dgap_config_get_number_of_ports(struct board_t *bd)
7821 {
7822         int count = 0;
7823         struct cnode *p = NULL;
7824
7825         if (!bd)
7826                 return 0;
7827
7828         for (p = bd->bd_config; p; p = p->next) {
7829
7830                 switch (p->type) {
7831                 case BNODE:
7832                         /*
7833                          * check for pcxr types.
7834                          */
7835                         if (p->u.board.type > EPCFE)
7836                                 count += p->u.board.nport;
7837                         break;
7838                 case CNODE:
7839                         count += p->u.conc.nport;
7840                         break;
7841                 case MNODE:
7842                         count += p->u.module.nport;
7843                         break;
7844                 }
7845         }
7846         return count;
7847 }
7848
7849 static char *dgap_create_config_string(struct board_t *bd, char *string)
7850 {
7851         char *ptr = string;
7852         struct cnode *p = NULL;
7853         struct cnode *q = NULL;
7854         int speed;
7855
7856         if (!bd) {
7857                 *ptr = 0xff;
7858                 return string;
7859         }
7860
7861         for (p = bd->bd_config; p; p = p->next) {
7862
7863                 switch (p->type) {
7864                 case LNODE:
7865                         *ptr = '\0';
7866                         ptr++;
7867                         *ptr = p->u.line.speed;
7868                         ptr++;
7869                         break;
7870                 case CNODE:
7871                         /*
7872                          * Because the EPC/con concentrators can have EM modules
7873                          * hanging off of them, we have to walk ahead in the list
7874                          * and keep adding the number of ports on each EM to the config.
7875                          * UGH!
7876                          */
7877                         speed = p->u.conc.speed;
7878                         q = p->next;
7879                         if ((q != NULL) && (q->type == MNODE)) {
7880                                 *ptr = (p->u.conc.nport + 0x80);
7881                                 ptr++;
7882                                 p = q;
7883                                 while ((q->next != NULL) && (q->next->type) == MNODE) {
7884                                         *ptr = (q->u.module.nport + 0x80);
7885                                         ptr++;
7886                                         p = q;
7887                                         q = q->next;
7888                                 }
7889                                 *ptr = q->u.module.nport;
7890                                 ptr++;
7891                         } else {
7892                                 *ptr = p->u.conc.nport;
7893                                 ptr++;
7894                         }
7895
7896                         *ptr = speed;
7897                         ptr++;
7898                         break;
7899                 }
7900         }
7901
7902         *ptr = 0xff;
7903         return string;
7904 }