epca.c: static functions and integer as NULL pointer fixes
[safe/jmp/linux-2.6] / drivers / char / epca.c
1 /*
2         Copyright (C) 1996  Digi International.
3
4         For technical support please email digiLinux@dgii.com or
5         call Digi tech support at (612) 912-3456
6
7         ** This driver is no longer supported by Digi **
8
9         Much of this design and code came from epca.c which was
10         copyright (C) 1994, 1995 Troy De Jongh, and subsquently
11         modified by David Nugent, Christoph Lameter, Mike McLagan.
12
13         This program is free software; you can redistribute it and/or modify
14         it under the terms of the GNU General Public License as published by
15         the Free Software Foundation; either version 2 of the License, or
16         (at your option) any later version.
17
18         This program is distributed in the hope that it will be useful,
19         but WITHOUT ANY WARRANTY; without even the implied warranty of
20         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21         GNU General Public License for more details.
22
23         You should have received a copy of the GNU General Public License
24         along with this program; if not, write to the Free Software
25         Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 */
27 /* See README.epca for change history --DAT*/
28
29 #include <linux/module.h>
30 #include <linux/kernel.h>
31 #include <linux/types.h>
32 #include <linux/init.h>
33 #include <linux/serial.h>
34 #include <linux/delay.h>
35 #include <linux/ctype.h>
36 #include <linux/tty.h>
37 #include <linux/tty_flip.h>
38 #include <linux/slab.h>
39 #include <linux/ioport.h>
40 #include <linux/interrupt.h>
41 #include <asm/uaccess.h>
42 #include <asm/io.h>
43 #include <linux/spinlock.h>
44 #include <linux/pci.h>
45 #include "digiPCI.h"
46
47
48 #include "digi1.h"
49 #include "digiFep1.h"
50 #include "epca.h"
51 #include "epcaconfig.h"
52
53 #define VERSION            "1.3.0.1-LK2.6"
54
55 /* This major needs to be submitted to Linux to join the majors list */
56 #define DIGIINFOMAJOR       35  /* For Digi specific ioctl */
57
58
59 #define MAXCARDS 7
60 #define epcaassert(x, msg)  if (!(x)) epca_error(__LINE__, msg)
61
62 #define PFX "epca: "
63
64 static int nbdevs, num_cards, liloconfig;
65 static int digi_poller_inhibited = 1 ;
66
67 static int setup_error_code;
68 static int invalid_lilo_config;
69
70 /*
71  * The ISA boards do window flipping into the same spaces so its only sane with
72  * a single lock. It's still pretty efficient.
73  */
74 static DEFINE_SPINLOCK(epca_lock);
75
76 /* MAXBOARDS is typically 12, but ISA and EISA cards are restricted to 7 below. */
77 static struct board_info boards[MAXBOARDS];
78
79 static struct tty_driver *pc_driver;
80 static struct tty_driver *pc_info;
81
82 /* ------------------ Begin Digi specific structures -------------------- */
83
84 /*
85  * digi_channels represents an array of structures that keep track of each
86  * channel of the Digi product. Information such as transmit and receive
87  * pointers, termio data, and signal definitions (DTR, CTS, etc ...) are stored
88  * here. This structure is NOT used to overlay the cards physical channel
89  * structure.
90  */
91 static struct channel digi_channels[MAX_ALLOC];
92
93 /*
94  * card_ptr is an array used to hold the address of the first channel structure
95  * of each card. This array will hold the addresses of various channels located
96  * in digi_channels.
97  */
98 static struct channel *card_ptr[MAXCARDS];
99
100 static struct timer_list epca_timer;
101
102 /*
103  * Begin generic memory functions. These functions will be alias (point at)
104  * more specific functions dependent on the board being configured.
105  */
106 static void memwinon(struct board_info *b, unsigned int win);
107 static void memwinoff(struct board_info *b, unsigned int win);
108 static void globalwinon(struct channel *ch);
109 static void rxwinon(struct channel *ch);
110 static void txwinon(struct channel *ch);
111 static void memoff(struct channel *ch);
112 static void assertgwinon(struct channel *ch);
113 static void assertmemoff(struct channel *ch);
114
115 /* ---- Begin more 'specific' memory functions for cx_like products --- */
116
117 static void pcxem_memwinon(struct board_info *b, unsigned int win);
118 static void pcxem_memwinoff(struct board_info *b, unsigned int win);
119 static void pcxem_globalwinon(struct channel *ch);
120 static void pcxem_rxwinon(struct channel *ch);
121 static void pcxem_txwinon(struct channel *ch);
122 static void pcxem_memoff(struct channel *ch);
123
124 /* ------ Begin more 'specific' memory functions for the pcxe ------- */
125
126 static void pcxe_memwinon(struct board_info *b, unsigned int win);
127 static void pcxe_memwinoff(struct board_info *b, unsigned int win);
128 static void pcxe_globalwinon(struct channel *ch);
129 static void pcxe_rxwinon(struct channel *ch);
130 static void pcxe_txwinon(struct channel *ch);
131 static void pcxe_memoff(struct channel *ch);
132
133 /* ---- Begin more 'specific' memory functions for the pc64xe and pcxi ---- */
134 /* Note : pc64xe and pcxi share the same windowing routines */
135
136 static void pcxi_memwinon(struct board_info *b, unsigned int win);
137 static void pcxi_memwinoff(struct board_info *b, unsigned int win);
138 static void pcxi_globalwinon(struct channel *ch);
139 static void pcxi_rxwinon(struct channel *ch);
140 static void pcxi_txwinon(struct channel *ch);
141 static void pcxi_memoff(struct channel *ch);
142
143 /* - Begin 'specific' do nothing memory functions needed for some cards - */
144
145 static void dummy_memwinon(struct board_info *b, unsigned int win);
146 static void dummy_memwinoff(struct board_info *b, unsigned int win);
147 static void dummy_globalwinon(struct channel *ch);
148 static void dummy_rxwinon(struct channel *ch);
149 static void dummy_txwinon(struct channel *ch);
150 static void dummy_memoff(struct channel *ch);
151 static void dummy_assertgwinon(struct channel *ch);
152 static void dummy_assertmemoff(struct channel *ch);
153
154 static struct channel *verifyChannel(struct tty_struct *);
155 static void pc_sched_event(struct channel *, int);
156 static void epca_error(int, char *);
157 static void pc_close(struct tty_struct *, struct file *);
158 static void shutdown(struct channel *);
159 static void pc_hangup(struct tty_struct *);
160 static void pc_put_char(struct tty_struct *, unsigned char);
161 static int pc_write_room(struct tty_struct *);
162 static int pc_chars_in_buffer(struct tty_struct *);
163 static void pc_flush_buffer(struct tty_struct *);
164 static void pc_flush_chars(struct tty_struct *);
165 static int block_til_ready(struct tty_struct *, struct file *,
166                            struct channel *);
167 static int pc_open(struct tty_struct *, struct file *);
168 static void post_fep_init(unsigned int crd);
169 static void epcapoll(unsigned long);
170 static void doevent(int);
171 static void fepcmd(struct channel *, int, int, int, int, int);
172 static unsigned termios2digi_h(struct channel *ch, unsigned);
173 static unsigned termios2digi_i(struct channel *ch, unsigned);
174 static unsigned termios2digi_c(struct channel *ch, unsigned);
175 static void epcaparam(struct tty_struct *, struct channel *);
176 static void receive_data(struct channel *);
177 static int pc_ioctl(struct tty_struct *, struct file *,
178                     unsigned int, unsigned long);
179 static int info_ioctl(struct tty_struct *, struct file *,
180                     unsigned int, unsigned long);
181 static void pc_set_termios(struct tty_struct *, struct ktermios *);
182 static void do_softint(struct work_struct *work);
183 static void pc_stop(struct tty_struct *);
184 static void pc_start(struct tty_struct *);
185 static void pc_throttle(struct tty_struct * tty);
186 static void pc_unthrottle(struct tty_struct *tty);
187 static void digi_send_break(struct channel *ch, int msec);
188 static void setup_empty_event(struct tty_struct *tty, struct channel *ch);
189 void epca_setup(char *, int *);
190
191 static int pc_write(struct tty_struct *, const unsigned char *, int);
192 static int pc_init(void);
193 static int init_PCI(void);
194
195 /*
196  * Table of functions for each board to handle memory. Mantaining parallelism
197  * is a *very* good idea here. The idea is for the runtime code to blindly call
198  * these functions, not knowing/caring about the underlying hardware. This
199  * stuff should contain no conditionals; if more functionality is needed a
200  * different entry should be established. These calls are the interface calls
201  * and are the only functions that should be accessed. Anyone caught making
202  * direct calls deserves what they get.
203  */
204 static void memwinon(struct board_info *b, unsigned int win)
205 {
206         b->memwinon(b, win);
207 }
208
209 static void memwinoff(struct board_info *b, unsigned int win)
210 {
211         b->memwinoff(b, win);
212 }
213
214 static void globalwinon(struct channel *ch)
215 {
216         ch->board->globalwinon(ch);
217 }
218
219 static void rxwinon(struct channel *ch)
220 {
221         ch->board->rxwinon(ch);
222 }
223
224 static void txwinon(struct channel *ch)
225 {
226         ch->board->txwinon(ch);
227 }
228
229 static void memoff(struct channel *ch)
230 {
231         ch->board->memoff(ch);
232 }
233 static void assertgwinon(struct channel *ch)
234 {
235         ch->board->assertgwinon(ch);
236 }
237
238 static void assertmemoff(struct channel *ch)
239 {
240         ch->board->assertmemoff(ch);
241 }
242
243 /* PCXEM windowing is the same as that used in the PCXR and CX series cards. */
244 static void pcxem_memwinon(struct board_info *b, unsigned int win)
245 {
246         outb_p(FEPWIN|win, b->port + 1);
247 }
248
249 static void pcxem_memwinoff(struct board_info *b, unsigned int win)
250 {
251         outb_p(0, b->port + 1);
252 }
253
254 static void pcxem_globalwinon(struct channel *ch)
255 {
256         outb_p( FEPWIN, (int)ch->board->port + 1);
257 }
258
259 static void pcxem_rxwinon(struct channel *ch)
260 {
261         outb_p(ch->rxwin, (int)ch->board->port + 1);
262 }
263
264 static void pcxem_txwinon(struct channel *ch)
265 {
266         outb_p(ch->txwin, (int)ch->board->port + 1);
267 }
268
269 static void pcxem_memoff(struct channel *ch)
270 {
271         outb_p(0, (int)ch->board->port + 1);
272 }
273
274 /* ----------------- Begin pcxe memory window stuff ------------------ */
275 static void pcxe_memwinon(struct board_info *b, unsigned int win)
276 {
277         outb_p(FEPWIN | win, b->port + 1);
278 }
279
280 static void pcxe_memwinoff(struct board_info *b, unsigned int win)
281 {
282         outb_p(inb(b->port) & ~FEPMEM, b->port + 1);
283         outb_p(0, b->port + 1);
284 }
285
286 static void pcxe_globalwinon(struct channel *ch)
287 {
288         outb_p(FEPWIN, (int)ch->board->port + 1);
289 }
290
291 static void pcxe_rxwinon(struct channel *ch)
292 {
293         outb_p(ch->rxwin, (int)ch->board->port + 1);
294 }
295
296 static void pcxe_txwinon(struct channel *ch)
297 {
298         outb_p(ch->txwin, (int)ch->board->port + 1);
299 }
300
301 static void pcxe_memoff(struct channel *ch)
302 {
303         outb_p(0, (int)ch->board->port);
304         outb_p(0, (int)ch->board->port + 1);
305 }
306
307 /* ------------- Begin pc64xe and pcxi memory window stuff -------------- */
308 static void pcxi_memwinon(struct board_info *b, unsigned int win)
309 {
310         outb_p(inb(b->port) | FEPMEM, b->port);
311 }
312
313 static void pcxi_memwinoff(struct board_info *b, unsigned int win)
314 {
315         outb_p(inb(b->port) & ~FEPMEM, b->port);
316 }
317
318 static void pcxi_globalwinon(struct channel *ch)
319 {
320         outb_p(FEPMEM, ch->board->port);
321 }
322
323 static void pcxi_rxwinon(struct channel *ch)
324 {
325         outb_p(FEPMEM, ch->board->port);
326 }
327
328 static void pcxi_txwinon(struct channel *ch)
329 {
330         outb_p(FEPMEM, ch->board->port);
331 }
332
333 static void pcxi_memoff(struct channel *ch)
334 {
335         outb_p(0, ch->board->port);
336 }
337
338 static void pcxi_assertgwinon(struct channel *ch)
339 {
340         epcaassert(inb(ch->board->port) & FEPMEM, "Global memory off");
341 }
342
343 static void pcxi_assertmemoff(struct channel *ch)
344 {
345         epcaassert(!(inb(ch->board->port) & FEPMEM), "Memory on");
346 }
347
348 /*
349  * Not all of the cards need specific memory windowing routines. Some cards
350  * (Such as PCI) needs no windowing routines at all. We provide these do
351  * nothing routines so that the same code base can be used. The driver will
352  * ALWAYS call a windowing routine if it thinks it needs to; regardless of the
353  * card. However, dependent on the card the routine may or may not do anything.
354  */
355 static void dummy_memwinon(struct board_info *b, unsigned int win)
356 {
357 }
358
359 static void dummy_memwinoff(struct board_info *b, unsigned int win)
360 {
361 }
362
363 static void dummy_globalwinon(struct channel *ch)
364 {
365 }
366
367 static void dummy_rxwinon(struct channel *ch)
368 {
369 }
370
371 static void dummy_txwinon(struct channel *ch)
372 {
373 }
374
375 static void dummy_memoff(struct channel *ch)
376 {
377 }
378
379 static void dummy_assertgwinon(struct channel *ch)
380 {
381 }
382
383 static void dummy_assertmemoff(struct channel *ch)
384 {
385 }
386
387 static struct channel *verifyChannel(struct tty_struct *tty)
388 {
389         /*
390          * This routine basically provides a sanity check. It insures that the
391          * channel returned is within the proper range of addresses as well as
392          * properly initialized. If some bogus info gets passed in
393          * through tty->driver_data this should catch it.
394          */
395         if (tty) {
396                 struct channel *ch = (struct channel *)tty->driver_data;
397                 if ((ch >= &digi_channels[0]) && (ch < &digi_channels[nbdevs])) {
398                         if (ch->magic == EPCA_MAGIC)
399                                 return ch;
400                 }
401         }
402         return NULL;
403 }
404
405 static void pc_sched_event(struct channel *ch, int event)
406 {
407         /*
408          * We call this to schedule interrupt processing on some event. The
409          * kernel sees our request and calls the related routine in OUR driver.
410          */
411         ch->event |= 1 << event;
412         schedule_work(&ch->tqueue);
413 }
414
415 static void epca_error(int line, char *msg)
416 {
417         printk(KERN_ERR "epca_error (Digi): line = %d %s\n",line,msg);
418 }
419
420 static void pc_close(struct tty_struct *tty, struct file *filp)
421 {
422         struct channel *ch;
423         unsigned long flags;
424         /*
425          * verifyChannel returns the channel from the tty struct if it is
426          * valid. This serves as a sanity check.
427          */
428         if ((ch = verifyChannel(tty)) != NULL) {
429                 spin_lock_irqsave(&epca_lock, flags);
430                 if (tty_hung_up_p(filp)) {
431                         spin_unlock_irqrestore(&epca_lock, flags);
432                         return;
433                 }
434                 if (ch->count-- > 1)  {
435                         /* Begin channel is open more than once */
436                         /*
437                          * Return without doing anything. Someone might still
438                          * be using the channel.
439                          */
440                         spin_unlock_irqrestore(&epca_lock, flags);
441                         return;
442                 }
443
444                 /* Port open only once go ahead with shutdown & reset */
445                 BUG_ON(ch->count < 0);
446
447                 /*
448                  * Let the rest of the driver know the channel is being closed.
449                  * This becomes important if an open is attempted before close
450                  * is finished.
451                  */
452                 ch->asyncflags |= ASYNC_CLOSING;
453                 tty->closing = 1;
454
455                 spin_unlock_irqrestore(&epca_lock, flags);
456
457                 if (ch->asyncflags & ASYNC_INITIALIZED)  {
458                         /* Setup an event to indicate when the transmit buffer empties */
459                         setup_empty_event(tty, ch);
460                         tty_wait_until_sent(tty, 3000); /* 30 seconds timeout */
461                 }
462                 if (tty->driver->flush_buffer)
463                         tty->driver->flush_buffer(tty);
464
465                 tty_ldisc_flush(tty);
466                 shutdown(ch);
467
468                 spin_lock_irqsave(&epca_lock, flags);
469                 tty->closing = 0;
470                 ch->event = 0;
471                 ch->tty = NULL;
472                 spin_unlock_irqrestore(&epca_lock, flags);
473
474                 if (ch->blocked_open) {
475                         if (ch->close_delay)
476                                 msleep_interruptible(jiffies_to_msecs(ch->close_delay));
477                         wake_up_interruptible(&ch->open_wait);
478                 }
479                 ch->asyncflags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_INITIALIZED |
480                                       ASYNC_CLOSING);
481                 wake_up_interruptible(&ch->close_wait);
482         }
483 }
484
485 static void shutdown(struct channel *ch)
486 {
487         unsigned long flags;
488         struct tty_struct *tty;
489         struct board_chan __iomem *bc;
490
491         if (!(ch->asyncflags & ASYNC_INITIALIZED))
492                 return;
493
494         spin_lock_irqsave(&epca_lock, flags);
495
496         globalwinon(ch);
497         bc = ch->brdchan;
498
499         /*
500          * In order for an event to be generated on the receipt of data the
501          * idata flag must be set. Since we are shutting down, this is not
502          * necessary clear this flag.
503          */
504         if (bc)
505                 writeb(0, &bc->idata);
506         tty = ch->tty;
507
508         /* If we're a modem control device and HUPCL is on, drop RTS & DTR. */
509         if (tty->termios->c_cflag & HUPCL)  {
510                 ch->omodem &= ~(ch->m_rts | ch->m_dtr);
511                 fepcmd(ch, SETMODEM, 0, ch->m_dtr | ch->m_rts, 10, 1);
512         }
513         memoff(ch);
514
515         /*
516          * The channel has officialy been closed. The next time it is opened it
517          * will have to reinitialized. Set a flag to indicate this.
518          */
519         /* Prevent future Digi programmed interrupts from coming active */
520         ch->asyncflags &= ~ASYNC_INITIALIZED;
521         spin_unlock_irqrestore(&epca_lock, flags);
522 }
523
524 static void pc_hangup(struct tty_struct *tty)
525 {
526         struct channel *ch;
527
528         /*
529          * verifyChannel returns the channel from the tty struct if it is
530          * valid. This serves as a sanity check.
531          */
532         if ((ch = verifyChannel(tty)) != NULL) {
533                 unsigned long flags;
534
535                 if (tty->driver->flush_buffer)
536                         tty->driver->flush_buffer(tty);
537                 tty_ldisc_flush(tty);
538                 shutdown(ch);
539
540                 spin_lock_irqsave(&epca_lock, flags);
541                 ch->tty   = NULL;
542                 ch->event = 0;
543                 ch->count = 0;
544                 ch->asyncflags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_INITIALIZED);
545                 spin_unlock_irqrestore(&epca_lock, flags);
546                 wake_up_interruptible(&ch->open_wait);
547         }
548 }
549
550 static int pc_write(struct tty_struct *tty,
551                     const unsigned char *buf, int bytesAvailable)
552 {
553         unsigned int head, tail;
554         int dataLen;
555         int size;
556         int amountCopied;
557         struct channel *ch;
558         unsigned long flags;
559         int remain;
560         struct board_chan __iomem *bc;
561
562         /*
563          * pc_write is primarily called directly by the kernel routine
564          * tty_write (Though it can also be called by put_char) found in
565          * tty_io.c. pc_write is passed a line discipline buffer where the data
566          * to be written out is stored. The line discipline implementation
567          * itself is done at the kernel level and is not brought into the
568          * driver.
569          */
570
571         /*
572          * verifyChannel returns the channel from the tty struct if it is
573          * valid. This serves as a sanity check.
574          */
575         if ((ch = verifyChannel(tty)) == NULL)
576                 return 0;
577
578         /* Make a pointer to the channel data structure found on the board. */
579         bc   = ch->brdchan;
580         size = ch->txbufsize;
581         amountCopied = 0;
582
583         spin_lock_irqsave(&epca_lock, flags);
584         globalwinon(ch);
585
586         head = readw(&bc->tin) & (size - 1);
587         tail = readw(&bc->tout);
588
589         if (tail != readw(&bc->tout))
590                 tail = readw(&bc->tout);
591         tail &= (size - 1);
592
593         if (head >= tail) {
594                 /* head has not wrapped */
595                 /*
596                  * remain (much like dataLen above) represents the total amount
597                  * of space available on the card for data. Here dataLen
598                  * represents the space existing between the head pointer and
599                  * the end of buffer. This is important because a memcpy cannot
600                  * be told to automatically wrap around when it hits the buffer
601                  * end.
602                  */
603                 dataLen = size - head;
604                 remain = size - (head - tail) - 1;
605         } else {
606                 /* head has wrapped around */
607                 remain = tail - head - 1;
608                 dataLen = remain;
609         }
610         /*
611          * Check the space on the card. If we have more data than space; reduce
612          * the amount of data to fit the space.
613          */
614         bytesAvailable = min(remain, bytesAvailable);
615         txwinon(ch);
616         while (bytesAvailable > 0) {
617                 /* there is data to copy onto card */
618
619                 /*
620                  * If head is not wrapped, the below will make sure the first
621                  * data copy fills to the end of card buffer.
622                  */
623                 dataLen = min(bytesAvailable, dataLen);
624                 memcpy_toio(ch->txptr + head, buf, dataLen);
625                 buf += dataLen;
626                 head += dataLen;
627                 amountCopied += dataLen;
628                 bytesAvailable -= dataLen;
629
630                 if (head >= size) {
631                         head = 0;
632                         dataLen = tail;
633                 }
634         }
635         ch->statusflags |= TXBUSY;
636         globalwinon(ch);
637         writew(head, &bc->tin);
638
639         if ((ch->statusflags & LOWWAIT) == 0)  {
640                 ch->statusflags |= LOWWAIT;
641                 writeb(1, &bc->ilow);
642         }
643         memoff(ch);
644         spin_unlock_irqrestore(&epca_lock, flags);
645         return amountCopied;
646 }
647
648 static void pc_put_char(struct tty_struct *tty, unsigned char c)
649 {
650         pc_write(tty, &c, 1);
651 }
652
653 static int pc_write_room(struct tty_struct *tty)
654 {
655         int remain;
656         struct channel *ch;
657         unsigned long flags;
658         unsigned int head, tail;
659         struct board_chan __iomem *bc;
660
661         remain = 0;
662
663         /*
664          * verifyChannel returns the channel from the tty struct if it is
665          * valid. This serves as a sanity check.
666          */
667         if ((ch = verifyChannel(tty)) != NULL)  {
668                 spin_lock_irqsave(&epca_lock, flags);
669                 globalwinon(ch);
670
671                 bc   = ch->brdchan;
672                 head = readw(&bc->tin) & (ch->txbufsize - 1);
673                 tail = readw(&bc->tout);
674
675                 if (tail != readw(&bc->tout))
676                         tail = readw(&bc->tout);
677                 /* Wrap tail if necessary */
678                 tail &= (ch->txbufsize - 1);
679
680                 if ((remain = tail - head - 1) < 0 )
681                         remain += ch->txbufsize;
682
683                 if (remain && (ch->statusflags & LOWWAIT) == 0) {
684                         ch->statusflags |= LOWWAIT;
685                         writeb(1, &bc->ilow);
686                 }
687                 memoff(ch);
688                 spin_unlock_irqrestore(&epca_lock, flags);
689         }
690         /* Return how much room is left on card */
691         return remain;
692 }
693
694 static int pc_chars_in_buffer(struct tty_struct *tty)
695 {
696         int chars;
697         unsigned int ctail, head, tail;
698         int remain;
699         unsigned long flags;
700         struct channel *ch;
701         struct board_chan __iomem *bc;
702
703         /*
704          * verifyChannel returns the channel from the tty struct if it is
705          * valid. This serves as a sanity check.
706          */
707         if ((ch = verifyChannel(tty)) == NULL)
708                 return 0;
709
710         spin_lock_irqsave(&epca_lock, flags);
711         globalwinon(ch);
712
713         bc = ch->brdchan;
714         tail = readw(&bc->tout);
715         head = readw(&bc->tin);
716         ctail = readw(&ch->mailbox->cout);
717
718         if (tail == head && readw(&ch->mailbox->cin) == ctail && readb(&bc->tbusy) == 0)
719                 chars = 0;
720         else  { /* Begin if some space on the card has been used */
721                 head = readw(&bc->tin) & (ch->txbufsize - 1);
722                 tail &= (ch->txbufsize - 1);
723                 /*
724                  * The logic here is basically opposite of the above
725                  * pc_write_room here we are finding the amount of bytes in the
726                  * buffer filled. Not the amount of bytes empty.
727                  */
728                 if ((remain = tail - head - 1) < 0 )
729                         remain += ch->txbufsize;
730                 chars = (int)(ch->txbufsize - remain);
731                 /*
732                  * Make it possible to wakeup anything waiting for output in
733                  * tty_ioctl.c, etc.
734                  *
735                  * If not already set. Setup an event to indicate when the
736                  * transmit buffer empties.
737                  */
738                 if (!(ch->statusflags & EMPTYWAIT))
739                         setup_empty_event(tty,ch);
740         } /* End if some space on the card has been used */
741         memoff(ch);
742         spin_unlock_irqrestore(&epca_lock, flags);
743         /* Return number of characters residing on card. */
744         return chars;
745 }
746
747 static void pc_flush_buffer(struct tty_struct *tty)
748 {
749         unsigned int tail;
750         unsigned long flags;
751         struct channel *ch;
752         struct board_chan __iomem *bc;
753         /*
754          * verifyChannel returns the channel from the tty struct if it is
755          * valid. This serves as a sanity check.
756          */
757         if ((ch = verifyChannel(tty)) == NULL)
758                 return;
759
760         spin_lock_irqsave(&epca_lock, flags);
761         globalwinon(ch);
762         bc   = ch->brdchan;
763         tail = readw(&bc->tout);
764         /* Have FEP move tout pointer; effectively flushing transmit buffer */
765         fepcmd(ch, STOUT, (unsigned) tail, 0, 0, 0);
766         memoff(ch);
767         spin_unlock_irqrestore(&epca_lock, flags);
768         tty_wakeup(tty);
769 }
770
771 static void pc_flush_chars(struct tty_struct *tty)
772 {
773         struct channel *ch;
774         /*
775          * verifyChannel returns the channel from the tty struct if it is
776          * valid. This serves as a sanity check.
777          */
778         if ((ch = verifyChannel(tty)) != NULL) {
779                 unsigned long flags;
780                 spin_lock_irqsave(&epca_lock, flags);
781                 /*
782                  * If not already set and the transmitter is busy setup an
783                  * event to indicate when the transmit empties.
784                  */
785                 if ((ch->statusflags & TXBUSY) && !(ch->statusflags & EMPTYWAIT))
786                         setup_empty_event(tty,ch);
787                 spin_unlock_irqrestore(&epca_lock, flags);
788         }
789 }
790
791 static int block_til_ready(struct tty_struct *tty,
792                            struct file *filp, struct channel *ch)
793 {
794         DECLARE_WAITQUEUE(wait,current);
795         int retval, do_clocal = 0;
796         unsigned long flags;
797
798         if (tty_hung_up_p(filp)) {
799                 if (ch->asyncflags & ASYNC_HUP_NOTIFY)
800                         retval = -EAGAIN;
801                 else
802                         retval = -ERESTARTSYS;
803                 return retval;
804         }
805
806         /*
807          * If the device is in the middle of being closed, then block until
808          * it's done, and then try again.
809          */
810         if (ch->asyncflags & ASYNC_CLOSING) {
811                 interruptible_sleep_on(&ch->close_wait);
812
813                 if (ch->asyncflags & ASYNC_HUP_NOTIFY)
814                         return -EAGAIN;
815                 else
816                         return -ERESTARTSYS;
817         }
818
819         if (filp->f_flags & O_NONBLOCK)  {
820                 /*
821                  * If non-blocking mode is set, then make the check up front
822                  * and then exit.
823                  */
824                 ch->asyncflags |= ASYNC_NORMAL_ACTIVE;
825                 return 0;
826         }
827         if (tty->termios->c_cflag & CLOCAL)
828                 do_clocal = 1;
829         /* Block waiting for the carrier detect and the line to become free */
830
831         retval = 0;
832         add_wait_queue(&ch->open_wait, &wait);
833
834         spin_lock_irqsave(&epca_lock, flags);
835         /* We dec count so that pc_close will know when to free things */
836         if (!tty_hung_up_p(filp))
837                 ch->count--;
838         ch->blocked_open++;
839         while (1) {
840                 set_current_state(TASK_INTERRUPTIBLE);
841                 if (tty_hung_up_p(filp) ||
842                     !(ch->asyncflags & ASYNC_INITIALIZED))
843                 {
844                         if (ch->asyncflags & ASYNC_HUP_NOTIFY)
845                                 retval = -EAGAIN;
846                         else
847                                 retval = -ERESTARTSYS;
848                         break;
849                 }
850                 if (!(ch->asyncflags & ASYNC_CLOSING) &&
851                           (do_clocal || (ch->imodem & ch->dcd)))
852                         break;
853                 if (signal_pending(current)) {
854                         retval = -ERESTARTSYS;
855                         break;
856                 }
857                 spin_unlock_irqrestore(&epca_lock, flags);
858                 /*
859                  * Allow someone else to be scheduled. We will occasionally go
860                  * through this loop until one of the above conditions change.
861                  * The below schedule call will allow other processes to enter
862                  * and prevent this loop from hogging the cpu.
863                  */
864                 schedule();
865                 spin_lock_irqsave(&epca_lock, flags);
866         }
867
868         __set_current_state(TASK_RUNNING);
869         remove_wait_queue(&ch->open_wait, &wait);
870         if (!tty_hung_up_p(filp))
871                 ch->count++;
872         ch->blocked_open--;
873
874         spin_unlock_irqrestore(&epca_lock, flags);
875
876         if (retval)
877                 return retval;
878
879         ch->asyncflags |= ASYNC_NORMAL_ACTIVE;
880         return 0;
881 }
882
883 static int pc_open(struct tty_struct *tty, struct file * filp)
884 {
885         struct channel *ch;
886         unsigned long flags;
887         int line, retval, boardnum;
888         struct board_chan __iomem *bc;
889         unsigned int head;
890
891         line = tty->index;
892         if (line < 0 || line >= nbdevs)
893                 return -ENODEV;
894
895         ch = &digi_channels[line];
896         boardnum = ch->boardnum;
897
898         /* Check status of board configured in system.  */
899
900         /*
901          * I check to see if the epca_setup routine detected an user error. It
902          * might be better to put this in pc_init, but for the moment it goes
903          * here.
904          */
905         if (invalid_lilo_config) {
906                 if (setup_error_code & INVALID_BOARD_TYPE)
907                         printk(KERN_ERR "epca: pc_open: Invalid board type specified in kernel options.\n");
908                 if (setup_error_code & INVALID_NUM_PORTS)
909                         printk(KERN_ERR "epca: pc_open: Invalid number of ports specified in kernel options.\n");
910                 if (setup_error_code & INVALID_MEM_BASE)
911                         printk(KERN_ERR "epca: pc_open: Invalid board memory address specified in kernel options.\n");
912                 if (setup_error_code & INVALID_PORT_BASE)
913                         printk(KERN_ERR "epca; pc_open: Invalid board port address specified in kernel options.\n");
914                 if (setup_error_code & INVALID_BOARD_STATUS)
915                         printk(KERN_ERR "epca: pc_open: Invalid board status specified in kernel options.\n");
916                 if (setup_error_code & INVALID_ALTPIN)
917                         printk(KERN_ERR "epca: pc_open: Invalid board altpin specified in kernel options;\n");
918                 tty->driver_data = NULL;   /* Mark this device as 'down' */
919                 return -ENODEV;
920         }
921         if (boardnum >= num_cards || boards[boardnum].status == DISABLED)  {
922                 tty->driver_data = NULL;   /* Mark this device as 'down' */
923                 return(-ENODEV);
924         }
925
926         bc = ch->brdchan;
927         if (bc == NULL) {
928                 tty->driver_data = NULL;
929                 return -ENODEV;
930         }
931
932         spin_lock_irqsave(&epca_lock, flags);
933         /*
934          * Every time a channel is opened, increment a counter. This is
935          * necessary because we do not wish to flush and shutdown the channel
936          * until the last app holding the channel open, closes it.
937          */
938         ch->count++;
939         /*
940          * Set a kernel structures pointer to our local channel structure. This
941          * way we can get to it when passed only a tty struct.
942          */
943         tty->driver_data = ch;
944         /*
945          * If this is the first time the channel has been opened, initialize
946          * the tty->termios struct otherwise let pc_close handle it.
947          */
948         globalwinon(ch);
949         ch->statusflags = 0;
950
951         /* Save boards current modem status */
952         ch->imodem = readb(&bc->mstat);
953
954         /*
955          * Set receive head and tail ptrs to each other. This indicates no data
956          * available to read.
957          */
958         head = readw(&bc->rin);
959         writew(head, &bc->rout);
960
961         /* Set the channels associated tty structure */
962         ch->tty = tty;
963
964         /*
965          * The below routine generally sets up parity, baud, flow control
966          * issues, etc.... It effect both control flags and input flags.
967          */
968         epcaparam(tty,ch);
969         ch->asyncflags |= ASYNC_INITIALIZED;
970         memoff(ch);
971         spin_unlock_irqrestore(&epca_lock, flags);
972
973         retval = block_til_ready(tty, filp, ch);
974         if (retval)
975                 return retval;
976         /*
977          * Set this again in case a hangup set it to zero while this open() was
978          * waiting for the line...
979          */
980         spin_lock_irqsave(&epca_lock, flags);
981         ch->tty = tty;
982         globalwinon(ch);
983         /* Enable Digi Data events */
984         writeb(1, &bc->idata);
985         memoff(ch);
986         spin_unlock_irqrestore(&epca_lock, flags);
987         return 0;
988 }
989
990 static int __init epca_module_init(void)
991 {
992         return pc_init();
993 }
994 module_init(epca_module_init);
995
996 static struct pci_driver epca_driver;
997
998 static void __exit epca_module_exit(void)
999 {
1000         int               count, crd;
1001         struct board_info *bd;
1002         struct channel    *ch;
1003
1004         del_timer_sync(&epca_timer);
1005
1006         if (tty_unregister_driver(pc_driver) || tty_unregister_driver(pc_info))
1007         {
1008                 printk(KERN_WARNING "epca: cleanup_module failed to un-register tty driver\n");
1009                 return;
1010         }
1011         put_tty_driver(pc_driver);
1012         put_tty_driver(pc_info);
1013
1014         for (crd = 0; crd < num_cards; crd++) {
1015                 bd = &boards[crd];
1016                 if (!bd) { /* sanity check */
1017                         printk(KERN_ERR "<Error> - Digi : cleanup_module failed\n");
1018                         return;
1019                 }
1020                 ch = card_ptr[crd];
1021                 for (count = 0; count < bd->numports; count++, ch++) {
1022                         if (ch && ch->tty)
1023                                 tty_hangup(ch->tty);
1024                 }
1025         }
1026         pci_unregister_driver(&epca_driver);
1027 }
1028 module_exit(epca_module_exit);
1029
1030 static const struct tty_operations pc_ops = {
1031         .open = pc_open,
1032         .close = pc_close,
1033         .write = pc_write,
1034         .write_room = pc_write_room,
1035         .flush_buffer = pc_flush_buffer,
1036         .chars_in_buffer = pc_chars_in_buffer,
1037         .flush_chars = pc_flush_chars,
1038         .put_char = pc_put_char,
1039         .ioctl = pc_ioctl,
1040         .set_termios = pc_set_termios,
1041         .stop = pc_stop,
1042         .start = pc_start,
1043         .throttle = pc_throttle,
1044         .unthrottle = pc_unthrottle,
1045         .hangup = pc_hangup,
1046 };
1047
1048 static int info_open(struct tty_struct *tty, struct file * filp)
1049 {
1050         return 0;
1051 }
1052
1053 static struct tty_operations info_ops = {
1054         .open = info_open,
1055         .ioctl = info_ioctl,
1056 };
1057
1058 static int __init pc_init(void)
1059 {
1060         int crd;
1061         struct board_info *bd;
1062         unsigned char board_id = 0;
1063         int err = -ENOMEM;
1064
1065         int pci_boards_found, pci_count;
1066
1067         pci_count = 0;
1068
1069         pc_driver = alloc_tty_driver(MAX_ALLOC);
1070         if (!pc_driver)
1071                 goto out1;
1072
1073         pc_info = alloc_tty_driver(MAX_ALLOC);
1074         if (!pc_info)
1075                 goto out2;
1076
1077         /*
1078          * If epca_setup has not been ran by LILO set num_cards to defaults;
1079          * copy board structure defined by digiConfig into drivers board
1080          * structure. Note : If LILO has ran epca_setup then epca_setup will
1081          * handle defining num_cards as well as copying the data into the board
1082          * structure.
1083          */
1084         if (!liloconfig) {
1085                 /* driver has been configured via. epcaconfig */
1086                 nbdevs = NBDEVS;
1087                 num_cards = NUMCARDS;
1088                 memcpy(&boards, &static_boards,
1089                        sizeof(struct board_info) * NUMCARDS);
1090         }
1091
1092         /*
1093          * Note : If lilo was used to configure the driver and the ignore
1094          * epcaconfig option was choosen (digiepca=2) then nbdevs and num_cards
1095          * will equal 0 at this point. This is okay; PCI cards will still be
1096          * picked up if detected.
1097          */
1098
1099         /*
1100          * Set up interrupt, we will worry about memory allocation in
1101          * post_fep_init.
1102          */
1103         printk(KERN_INFO "DIGI epca driver version %s loaded.\n",VERSION);
1104
1105         /*
1106          * NOTE : This code assumes that the number of ports found in the
1107          * boards array is correct. This could be wrong if the card in question
1108          * is PCI (And therefore has no ports entry in the boards structure.)
1109          * The rest of the information will be valid for PCI because the
1110          * beginning of pc_init scans for PCI and determines i/o and base
1111          * memory addresses. I am not sure if it is possible to read the number
1112          * of ports supported by the card prior to it being booted (Since that
1113          * is the state it is in when pc_init is run). Because it is not
1114          * possible to query the number of supported ports until after the card
1115          * has booted; we are required to calculate the card_ptrs as the card
1116          * is initialized (Inside post_fep_init). The negative thing about this
1117          * approach is that digiDload's call to GET_INFO will have a bad port
1118          * value. (Since this is called prior to post_fep_init.)
1119          */
1120         pci_boards_found = 0;
1121         if (num_cards < MAXBOARDS)
1122                 pci_boards_found += init_PCI();
1123         num_cards += pci_boards_found;
1124
1125         pc_driver->owner = THIS_MODULE;
1126         pc_driver->name = "ttyD";
1127         pc_driver->major = DIGI_MAJOR;
1128         pc_driver->minor_start = 0;
1129         pc_driver->type = TTY_DRIVER_TYPE_SERIAL;
1130         pc_driver->subtype = SERIAL_TYPE_NORMAL;
1131         pc_driver->init_termios = tty_std_termios;
1132         pc_driver->init_termios.c_iflag = 0;
1133         pc_driver->init_termios.c_oflag = 0;
1134         pc_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
1135         pc_driver->init_termios.c_lflag = 0;
1136         pc_driver->init_termios.c_ispeed = 9600;
1137         pc_driver->init_termios.c_ospeed = 9600;
1138         pc_driver->flags = TTY_DRIVER_REAL_RAW;
1139         tty_set_operations(pc_driver, &pc_ops);
1140
1141         pc_info->owner = THIS_MODULE;
1142         pc_info->name = "digi_ctl";
1143         pc_info->major = DIGIINFOMAJOR;
1144         pc_info->minor_start = 0;
1145         pc_info->type = TTY_DRIVER_TYPE_SERIAL;
1146         pc_info->subtype = SERIAL_TYPE_INFO;
1147         pc_info->init_termios = tty_std_termios;
1148         pc_info->init_termios.c_iflag = 0;
1149         pc_info->init_termios.c_oflag = 0;
1150         pc_info->init_termios.c_lflag = 0;
1151         pc_info->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL;
1152         pc_info->init_termios.c_ispeed = 9600;
1153         pc_info->init_termios.c_ospeed = 9600;
1154         pc_info->flags = TTY_DRIVER_REAL_RAW;
1155         tty_set_operations(pc_info, &info_ops);
1156
1157
1158         for (crd = 0; crd < num_cards; crd++) {
1159                 /*
1160                  * This is where the appropriate memory handlers for the
1161                  * hardware is set. Everything at runtime blindly jumps through
1162                  * these vectors.
1163                  */
1164
1165                 /* defined in epcaconfig.h */
1166                 bd = &boards[crd];
1167
1168                 switch (bd->type) {
1169                 case PCXEM:
1170                 case EISAXEM:
1171                         bd->memwinon     = pcxem_memwinon;
1172                         bd->memwinoff    = pcxem_memwinoff;
1173                         bd->globalwinon  = pcxem_globalwinon;
1174                         bd->txwinon      = pcxem_txwinon;
1175                         bd->rxwinon      = pcxem_rxwinon;
1176                         bd->memoff       = pcxem_memoff;
1177                         bd->assertgwinon = dummy_assertgwinon;
1178                         bd->assertmemoff = dummy_assertmemoff;
1179                         break;
1180
1181                 case PCIXEM:
1182                 case PCIXRJ:
1183                 case PCIXR:
1184                         bd->memwinon     = dummy_memwinon;
1185                         bd->memwinoff    = dummy_memwinoff;
1186                         bd->globalwinon  = dummy_globalwinon;
1187                         bd->txwinon      = dummy_txwinon;
1188                         bd->rxwinon      = dummy_rxwinon;
1189                         bd->memoff       = dummy_memoff;
1190                         bd->assertgwinon = dummy_assertgwinon;
1191                         bd->assertmemoff = dummy_assertmemoff;
1192                         break;
1193
1194                 case PCXE:
1195                 case PCXEVE:
1196                         bd->memwinon     = pcxe_memwinon;
1197                         bd->memwinoff    = pcxe_memwinoff;
1198                         bd->globalwinon  = pcxe_globalwinon;
1199                         bd->txwinon      = pcxe_txwinon;
1200                         bd->rxwinon      = pcxe_rxwinon;
1201                         bd->memoff       = pcxe_memoff;
1202                         bd->assertgwinon = dummy_assertgwinon;
1203                         bd->assertmemoff = dummy_assertmemoff;
1204                         break;
1205
1206                 case PCXI:
1207                 case PC64XE:
1208                         bd->memwinon     = pcxi_memwinon;
1209                         bd->memwinoff    = pcxi_memwinoff;
1210                         bd->globalwinon  = pcxi_globalwinon;
1211                         bd->txwinon      = pcxi_txwinon;
1212                         bd->rxwinon      = pcxi_rxwinon;
1213                         bd->memoff       = pcxi_memoff;
1214                         bd->assertgwinon = pcxi_assertgwinon;
1215                         bd->assertmemoff = pcxi_assertmemoff;
1216                         break;
1217
1218                 default:
1219                         break;
1220                 }
1221
1222                 /*
1223                  * Some cards need a memory segment to be defined for use in
1224                  * transmit and receive windowing operations. These boards are
1225                  * listed in the below switch. In the case of the XI the amount
1226                  * of memory on the board is variable so the memory_seg is also
1227                  * variable. This code determines what they segment should be.
1228                  */
1229                 switch (bd->type) {
1230                 case PCXE:
1231                 case PCXEVE:
1232                 case PC64XE:
1233                         bd->memory_seg = 0xf000;
1234                         break;
1235
1236                 case PCXI:
1237                         board_id = inb((int)bd->port);
1238                         if ((board_id & 0x1) == 0x1) {
1239                                 /* it's an XI card */
1240                                 /* Is it a 64K board */
1241                                 if ((board_id & 0x30) == 0)
1242                                         bd->memory_seg = 0xf000;
1243
1244                                 /* Is it a 128K board */
1245                                 if ((board_id & 0x30) == 0x10)
1246                                         bd->memory_seg = 0xe000;
1247
1248                                 /* Is is a 256K board */
1249                                 if ((board_id & 0x30) == 0x20)
1250                                         bd->memory_seg = 0xc000;
1251
1252                                 /* Is it a 512K board */
1253                                 if ((board_id & 0x30) == 0x30)
1254                                         bd->memory_seg = 0x8000;
1255                         } else
1256                                 printk(KERN_ERR "epca: Board at 0x%x doesn't appear to be an XI\n",(int)bd->port);
1257                         break;
1258                 }
1259         }
1260
1261         err = tty_register_driver(pc_driver);
1262         if (err) {
1263                 printk(KERN_ERR "Couldn't register Digi PC/ driver");
1264                 goto out3;
1265         }
1266
1267         err = tty_register_driver(pc_info);
1268         if (err) {
1269                 printk(KERN_ERR "Couldn't register Digi PC/ info ");
1270                 goto out4;
1271         }
1272
1273         /* Start up the poller to check for events on all enabled boards */
1274         init_timer(&epca_timer);
1275         epca_timer.function = epcapoll;
1276         mod_timer(&epca_timer, jiffies + HZ/25);
1277         return 0;
1278
1279 out4:
1280         tty_unregister_driver(pc_driver);
1281 out3:
1282         put_tty_driver(pc_info);
1283 out2:
1284         put_tty_driver(pc_driver);
1285 out1:
1286         return err;
1287 }
1288
1289 static void post_fep_init(unsigned int crd)
1290 {
1291         int i;
1292         void __iomem *memaddr;
1293         struct global_data __iomem *gd;
1294         struct board_info *bd;
1295         struct board_chan __iomem *bc;
1296         struct channel *ch;
1297         int shrinkmem = 0, lowwater;
1298
1299         /*
1300          * This call is made by the user via. the ioctl call DIGI_INIT. It is
1301          * responsible for setting up all the card specific stuff.
1302          */
1303         bd = &boards[crd];
1304
1305         /*
1306          * If this is a PCI board, get the port info. Remember PCI cards do not
1307          * have entries into the epcaconfig.h file, so we can't get the number
1308          * of ports from it. Unfortunetly, this means that anyone doing a
1309          * DIGI_GETINFO before the board has booted will get an invalid number
1310          * of ports returned (It should return 0). Calls to DIGI_GETINFO after
1311          * DIGI_INIT has been called will return the proper values.
1312          */
1313         if (bd->type >= PCIXEM) { /* Begin get PCI number of ports */
1314                 /*
1315                  * Below we use XEMPORTS as a memory offset regardless of which
1316                  * PCI card it is. This is because all of the supported PCI
1317                  * cards have the same memory offset for the channel data. This
1318                  * will have to be changed if we ever develop a PCI/XE card.
1319                  * NOTE : The FEP manual states that the port offset is 0xC22
1320                  * as opposed to 0xC02. This is only true for PC/XE, and PC/XI
1321                  * cards; not for the XEM, or CX series. On the PCI cards the
1322                  * number of ports is determined by reading a ID PROM located
1323                  * in the box attached to the card. The card can then determine
1324                  * the index the id to determine the number of ports available.
1325                  * (FYI - The id should be located at 0x1ac (And may use up to
1326                  * 4 bytes if the box in question is a XEM or CX)).
1327                  */
1328                 /* PCI cards are already remapped at this point ISA are not */
1329                 bd->numports = readw(bd->re_map_membase + XEMPORTS);
1330                 epcaassert(bd->numports <= 64,"PCI returned a invalid number of ports");
1331                 nbdevs += (bd->numports);
1332         } else {
1333                 /* Fix up the mappings for ISA/EISA etc */
1334                 /* FIXME: 64K - can we be smarter ? */
1335                 bd->re_map_membase = ioremap(bd->membase, 0x10000);
1336         }
1337
1338         if (crd != 0)
1339                 card_ptr[crd] = card_ptr[crd-1] + boards[crd-1].numports;
1340         else
1341                 card_ptr[crd] = &digi_channels[crd]; /* <- For card 0 only */
1342
1343         ch = card_ptr[crd];
1344         epcaassert(ch <= &digi_channels[nbdevs - 1], "ch out of range");
1345
1346         memaddr = bd->re_map_membase;
1347
1348         /*
1349          * The below assignment will set bc to point at the BEGINING of the
1350          * cards channel structures. For 1 card there will be between 8 and 64
1351          * of these structures.
1352          */
1353         bc = memaddr + CHANSTRUCT;
1354
1355         /*
1356          * The below assignment will set gd to point at the BEGINING of global
1357          * memory address 0xc00. The first data in that global memory actually
1358          * starts at address 0xc1a. The command in pointer begins at 0xd10.
1359          */
1360         gd = memaddr + GLOBAL;
1361
1362         /*
1363          * XEPORTS (address 0xc22) points at the number of channels the card
1364          * supports. (For 64XE, XI, XEM, and XR use 0xc02)
1365          */
1366         if ((bd->type == PCXEVE || bd->type == PCXE) && (readw(memaddr + XEPORTS) < 3))
1367                 shrinkmem = 1;
1368         if (bd->type < PCIXEM)
1369                 if (!request_region((int)bd->port, 4, board_desc[bd->type]))
1370                         return;
1371         memwinon(bd, 0);
1372
1373         /*
1374          * Remember ch is the main drivers channels structure, while bc is the
1375          * cards channel structure.
1376          */
1377         for (i = 0; i < bd->numports; i++, ch++, bc++) {
1378                 unsigned long flags;
1379                 u16 tseg, rseg;
1380
1381                 ch->brdchan = bc;
1382                 ch->mailbox = gd;
1383                 INIT_WORK(&ch->tqueue, do_softint);
1384                 ch->board = &boards[crd];
1385
1386                 spin_lock_irqsave(&epca_lock, flags);
1387                 switch (bd->type) {
1388                 /*
1389                  * Since some of the boards use different bitmaps for
1390                  * their control signals we cannot hard code these
1391                  * values and retain portability. We virtualize this
1392                  * data here.
1393                  */
1394                 case EISAXEM:
1395                 case PCXEM:
1396                 case PCIXEM:
1397                 case PCIXRJ:
1398                 case PCIXR:
1399                         ch->m_rts = 0x02;
1400                         ch->m_dcd = 0x80;
1401                         ch->m_dsr = 0x20;
1402                         ch->m_cts = 0x10;
1403                         ch->m_ri  = 0x40;
1404                         ch->m_dtr = 0x01;
1405                         break;
1406
1407                 case PCXE:
1408                 case PCXEVE:
1409                 case PCXI:
1410                 case PC64XE:
1411                         ch->m_rts = 0x02;
1412                         ch->m_dcd = 0x08;
1413                         ch->m_dsr = 0x10;
1414                         ch->m_cts = 0x20;
1415                         ch->m_ri  = 0x40;
1416                         ch->m_dtr = 0x80;
1417                         break;
1418                 }
1419
1420                 if (boards[crd].altpin) {
1421                         ch->dsr = ch->m_dcd;
1422                         ch->dcd = ch->m_dsr;
1423                         ch->digiext.digi_flags |= DIGI_ALTPIN;
1424                 } else {
1425                         ch->dcd = ch->m_dcd;
1426                         ch->dsr = ch->m_dsr;
1427                 }
1428
1429                 ch->boardnum   = crd;
1430                 ch->channelnum = i;
1431                 ch->magic      = EPCA_MAGIC;
1432                 ch->tty        = NULL;
1433
1434                 if (shrinkmem) {
1435                         fepcmd(ch, SETBUFFER, 32, 0, 0, 0);
1436                         shrinkmem = 0;
1437                 }
1438
1439                 tseg = readw(&bc->tseg);
1440                 rseg = readw(&bc->rseg);
1441
1442                 switch (bd->type) {
1443                 case PCIXEM:
1444                 case PCIXRJ:
1445                 case PCIXR:
1446                         /* Cover all the 2MEG cards */
1447                         ch->txptr = memaddr + ((tseg << 4) & 0x1fffff);
1448                         ch->rxptr = memaddr + ((rseg << 4) & 0x1fffff);
1449                         ch->txwin = FEPWIN | (tseg >> 11);
1450                         ch->rxwin = FEPWIN | (rseg >> 11);
1451                         break;
1452
1453                 case PCXEM:
1454                 case EISAXEM:
1455                         /* Cover all the 32K windowed cards */
1456                         /* Mask equal to window size - 1 */
1457                         ch->txptr = memaddr + ((tseg << 4) & 0x7fff);
1458                         ch->rxptr = memaddr + ((rseg << 4) & 0x7fff);
1459                         ch->txwin = FEPWIN | (tseg >> 11);
1460                         ch->rxwin = FEPWIN | (rseg >> 11);
1461                         break;
1462
1463                 case PCXEVE:
1464                 case PCXE:
1465                         ch->txptr = memaddr + (((tseg - bd->memory_seg) << 4) & 0x1fff);
1466                         ch->txwin = FEPWIN | ((tseg - bd->memory_seg) >> 9);
1467                         ch->rxptr = memaddr + (((rseg - bd->memory_seg) << 4) & 0x1fff);
1468                         ch->rxwin = FEPWIN | ((rseg - bd->memory_seg) >>9 );
1469                         break;
1470
1471                 case PCXI:
1472                 case PC64XE:
1473                         ch->txptr = memaddr + ((tseg - bd->memory_seg) << 4);
1474                         ch->rxptr = memaddr + ((rseg - bd->memory_seg) << 4);
1475                         ch->txwin = ch->rxwin = 0;
1476                         break;
1477                 }
1478
1479                 ch->txbufhead = 0;
1480                 ch->txbufsize = readw(&bc->tmax) + 1;
1481
1482                 ch->rxbufhead = 0;
1483                 ch->rxbufsize = readw(&bc->rmax) + 1;
1484
1485                 lowwater = ch->txbufsize >= 2000 ? 1024 : (ch->txbufsize / 2);
1486
1487                 /* Set transmitter low water mark */
1488                 fepcmd(ch, STXLWATER, lowwater, 0, 10, 0);
1489
1490                 /* Set receiver low water mark */
1491                 fepcmd(ch, SRXLWATER, (ch->rxbufsize / 4), 0, 10, 0);
1492
1493                 /* Set receiver high water mark */
1494                 fepcmd(ch, SRXHWATER, (3 * ch->rxbufsize / 4), 0, 10, 0);
1495
1496                 writew(100, &bc->edelay);
1497                 writeb(1, &bc->idata);
1498
1499                 ch->startc  = readb(&bc->startc);
1500                 ch->stopc   = readb(&bc->stopc);
1501                 ch->startca = readb(&bc->startca);
1502                 ch->stopca  = readb(&bc->stopca);
1503
1504                 ch->fepcflag = 0;
1505                 ch->fepiflag = 0;
1506                 ch->fepoflag = 0;
1507                 ch->fepstartc = 0;
1508                 ch->fepstopc = 0;
1509                 ch->fepstartca = 0;
1510                 ch->fepstopca = 0;
1511
1512                 ch->close_delay = 50;
1513                 ch->count = 0;
1514                 ch->blocked_open = 0;
1515                 init_waitqueue_head(&ch->open_wait);
1516                 init_waitqueue_head(&ch->close_wait);
1517
1518                 spin_unlock_irqrestore(&epca_lock, flags);
1519         }
1520
1521         printk(KERN_INFO
1522                 "Digi PC/Xx Driver V%s:  %s I/O = 0x%lx Mem = 0x%lx Ports = %d\n",
1523                 VERSION, board_desc[bd->type], (long)bd->port, (long)bd->membase, bd->numports);
1524         memwinoff(bd, 0);
1525 }
1526
1527 static void epcapoll(unsigned long ignored)
1528 {
1529         unsigned long flags;
1530         int crd;
1531         volatile unsigned int head, tail;
1532         struct channel *ch;
1533         struct board_info *bd;
1534
1535         /*
1536          * This routine is called upon every timer interrupt. Even though the
1537          * Digi series cards are capable of generating interrupts this method
1538          * of non-looping polling is more efficient. This routine checks for
1539          * card generated events (Such as receive data, are transmit buffer
1540          * empty) and acts on those events.
1541          */
1542         for (crd = 0; crd < num_cards; crd++) {
1543                 bd = &boards[crd];
1544                 ch = card_ptr[crd];
1545
1546                 if ((bd->status == DISABLED) || digi_poller_inhibited)
1547                         continue;
1548
1549                 /*
1550                  * assertmemoff is not needed here; indeed it is an empty
1551                  * subroutine. It is being kept because future boards may need
1552                  * this as well as some legacy boards.
1553                  */
1554                 spin_lock_irqsave(&epca_lock, flags);
1555
1556                 assertmemoff(ch);
1557
1558                 globalwinon(ch);
1559
1560                 /*
1561                  * In this case head and tail actually refer to the event queue
1562                  * not the transmit or receive queue.
1563                  */
1564                 head = readw(&ch->mailbox->ein);
1565                 tail = readw(&ch->mailbox->eout);
1566
1567                 /* If head isn't equal to tail we have an event */
1568                 if (head != tail)
1569                         doevent(crd);
1570                 memoff(ch);
1571
1572                 spin_unlock_irqrestore(&epca_lock, flags);
1573         } /* End for each card */
1574         mod_timer(&epca_timer, jiffies + (HZ / 25));
1575 }
1576
1577 static void doevent(int crd)
1578 {
1579         void __iomem *eventbuf;
1580         struct channel *ch, *chan0;
1581         static struct tty_struct *tty;
1582         struct board_info *bd;
1583         struct board_chan __iomem *bc;
1584         unsigned int tail, head;
1585         int event, channel;
1586         int mstat, lstat;
1587
1588         /*
1589          * This subroutine is called by epcapoll when an event is detected
1590          * in the event queue. This routine responds to those events.
1591          */
1592         bd = &boards[crd];
1593
1594         chan0 = card_ptr[crd];
1595         epcaassert(chan0 <= &digi_channels[nbdevs - 1], "ch out of range");
1596         assertgwinon(chan0);
1597         while ((tail = readw(&chan0->mailbox->eout)) != (head = readw(&chan0->mailbox->ein))) { /* Begin while something in event queue */
1598                 assertgwinon(chan0);
1599                 eventbuf = bd->re_map_membase + tail + ISTART;
1600                 /* Get the channel the event occurred on */
1601                 channel = readb(eventbuf);
1602                 /* Get the actual event code that occurred */
1603                 event = readb(eventbuf + 1);
1604                 /*
1605                  * The two assignments below get the current modem status
1606                  * (mstat) and the previous modem status (lstat). These are
1607                  * useful becuase an event could signal a change in modem
1608                  * signals itself.
1609                  */
1610                 mstat = readb(eventbuf + 2);
1611                 lstat = readb(eventbuf + 3);
1612
1613                 ch = chan0 + channel;
1614                 if ((unsigned)channel >= bd->numports || !ch)  {
1615                         if (channel >= bd->numports)
1616                                 ch = chan0;
1617                         bc = ch->brdchan;
1618                         goto next;
1619                 }
1620
1621                 if ((bc = ch->brdchan) == NULL)
1622                         goto next;
1623
1624                 if (event & DATA_IND)  { /* Begin DATA_IND */
1625                         receive_data(ch);
1626                         assertgwinon(ch);
1627                 } /* End DATA_IND */
1628                 /* else *//* Fix for DCD transition missed bug */
1629                 if (event & MODEMCHG_IND) {
1630                         /* A modem signal change has been indicated */
1631                         ch->imodem = mstat;
1632                         if (ch->asyncflags & ASYNC_CHECK_CD) {
1633                                 if (mstat & ch->dcd)  /* We are now receiving dcd */
1634                                         wake_up_interruptible(&ch->open_wait);
1635                                 else
1636                                         pc_sched_event(ch, EPCA_EVENT_HANGUP); /* No dcd; hangup */
1637                         }
1638                 }
1639                 tty = ch->tty;
1640                 if (tty) {
1641                         if (event & BREAK_IND) {
1642                                 /* A break has been indicated */
1643                                 tty_insert_flip_char(tty, 0, TTY_BREAK);
1644                                 tty_schedule_flip(tty);
1645                         } else if (event & LOWTX_IND)  {
1646                                 if (ch->statusflags & LOWWAIT) {
1647                                         ch->statusflags &= ~LOWWAIT;
1648                                         tty_wakeup(tty);
1649                                 }
1650                         } else if (event & EMPTYTX_IND) {
1651                                 /* This event is generated by setup_empty_event */
1652                                 ch->statusflags &= ~TXBUSY;
1653                                 if (ch->statusflags & EMPTYWAIT) {
1654                                         ch->statusflags &= ~EMPTYWAIT;
1655                                         tty_wakeup(tty);
1656                                 }
1657                         }
1658                 }
1659         next:
1660                 globalwinon(ch);
1661                 BUG_ON(!bc);
1662                 writew(1, &bc->idata);
1663                 writew((tail + 4) & (IMAX - ISTART - 4), &chan0->mailbox->eout);
1664                 globalwinon(chan0);
1665         } /* End while something in event queue */
1666 }
1667
1668 static void fepcmd(struct channel *ch, int cmd, int word_or_byte,
1669                    int byte2, int ncmds, int bytecmd)
1670 {
1671         unchar __iomem *memaddr;
1672         unsigned int head, cmdTail, cmdStart, cmdMax;
1673         long count;
1674         int n;
1675
1676         /* This is the routine in which commands may be passed to the card. */
1677
1678         if (ch->board->status == DISABLED)
1679                 return;
1680         assertgwinon(ch);
1681         /* Remember head (As well as max) is just an offset not a base addr */
1682         head = readw(&ch->mailbox->cin);
1683         /* cmdStart is a base address */
1684         cmdStart = readw(&ch->mailbox->cstart);
1685         /*
1686          * We do the addition below because we do not want a max pointer
1687          * relative to cmdStart. We want a max pointer that points at the
1688          * physical end of the command queue.
1689          */
1690         cmdMax = (cmdStart + 4 + readw(&ch->mailbox->cmax));
1691         memaddr = ch->board->re_map_membase;
1692
1693         if (head >= (cmdMax - cmdStart) || (head & 03))  {
1694                 printk(KERN_ERR "line %d: Out of range, cmd = %x, head = %x\n", __LINE__,  cmd, head);
1695                 printk(KERN_ERR "line %d: Out of range, cmdMax = %x, cmdStart = %x\n", __LINE__,  cmdMax, cmdStart);
1696                 return;
1697         }
1698         if (bytecmd)  {
1699                 writeb(cmd, memaddr + head + cmdStart + 0);
1700                 writeb(ch->channelnum,  memaddr + head + cmdStart + 1);
1701                 /* Below word_or_byte is bits to set */
1702                 writeb(word_or_byte,  memaddr + head + cmdStart + 2);
1703                 /* Below byte2 is bits to reset */
1704                 writeb(byte2, memaddr + head + cmdStart + 3);
1705         }  else {
1706                 writeb(cmd, memaddr + head + cmdStart + 0);
1707                 writeb(ch->channelnum,  memaddr + head + cmdStart + 1);
1708                 writeb(word_or_byte,  memaddr + head + cmdStart + 2);
1709         }
1710         head = (head + 4) & (cmdMax - cmdStart - 4);
1711         writew(head, &ch->mailbox->cin);
1712         count = FEPTIMEOUT;
1713
1714         for (;;) {
1715                 count--;
1716                 if (count == 0)  {
1717                         printk(KERN_ERR "<Error> - Fep not responding in fepcmd()\n");
1718                         return;
1719                 }
1720                 head = readw(&ch->mailbox->cin);
1721                 cmdTail = readw(&ch->mailbox->cout);
1722                 n = (head - cmdTail) & (cmdMax - cmdStart - 4);
1723                 /*
1724                  * Basically this will break when the FEP acknowledges the
1725                  * command by incrementing cmdTail (Making it equal to head).
1726                  */
1727                 if (n <= ncmds * (sizeof(short) * 4))
1728                         break;
1729         }
1730 }
1731
1732 /*
1733  * Digi products use fields in their channels structures that are very similar
1734  * to the c_cflag and c_iflag fields typically found in UNIX termios
1735  * structures. The below three routines allow mappings between these hardware
1736  * "flags" and their respective Linux flags.
1737  */
1738 static unsigned termios2digi_h(struct channel *ch, unsigned cflag)
1739 {
1740         unsigned res = 0;
1741
1742         if (cflag & CRTSCTS) {
1743                 ch->digiext.digi_flags |= (RTSPACE | CTSPACE);
1744                 res |= ((ch->m_cts) | (ch->m_rts));
1745         }
1746
1747         if (ch->digiext.digi_flags & RTSPACE)
1748                 res |= ch->m_rts;
1749
1750         if (ch->digiext.digi_flags & DTRPACE)
1751                 res |= ch->m_dtr;
1752
1753         if (ch->digiext.digi_flags & CTSPACE)
1754                 res |= ch->m_cts;
1755
1756         if (ch->digiext.digi_flags & DSRPACE)
1757                 res |= ch->dsr;
1758
1759         if (ch->digiext.digi_flags & DCDPACE)
1760                 res |= ch->dcd;
1761
1762         if (res & (ch->m_rts))
1763                 ch->digiext.digi_flags |= RTSPACE;
1764
1765         if (res & (ch->m_cts))
1766                 ch->digiext.digi_flags |= CTSPACE;
1767
1768         return res;
1769 }
1770
1771 static unsigned termios2digi_i(struct channel *ch, unsigned iflag)
1772 {
1773         unsigned res = iflag & (IGNBRK | BRKINT | IGNPAR | PARMRK |
1774                                 INPCK | ISTRIP|IXON|IXANY|IXOFF);
1775         if (ch->digiext.digi_flags & DIGI_AIXON)
1776                 res |= IAIXON;
1777         return res;
1778 }
1779
1780 static unsigned termios2digi_c(struct channel *ch, unsigned cflag)
1781 {
1782         unsigned res = 0;
1783         if (cflag & CBAUDEX) {
1784                 ch->digiext.digi_flags |= DIGI_FAST;
1785                 /*
1786                  * HUPCL bit is used by FEP to indicate fast baud table is to
1787                  * be used.
1788                  */
1789                 res |= FEP_HUPCL;
1790         } else
1791                 ch->digiext.digi_flags &= ~DIGI_FAST;
1792         /*
1793          * CBAUD has bit position 0x1000 set these days to indicate Linux
1794          * baud rate remap. Digi hardware can't handle the bit assignment.
1795          * (We use a different bit assignment for high speed.). Clear this
1796          * bit out.
1797          */
1798         res |= cflag & ((CBAUD ^ CBAUDEX) | PARODD | PARENB | CSTOPB | CSIZE);
1799         /*
1800          * This gets a little confusing. The Digi cards have their own
1801          * representation of c_cflags controlling baud rate. For the most part
1802          * this is identical to the Linux implementation. However; Digi
1803          * supports one rate (76800) that Linux doesn't. This means that the
1804          * c_cflag entry that would normally mean 76800 for Digi actually means
1805          * 115200 under Linux. Without the below mapping, a stty 115200 would
1806          * only drive the board at 76800. Since the rate 230400 is also found
1807          * after 76800, the same problem afflicts us when we choose a rate of
1808          * 230400. Without the below modificiation stty 230400 would actually
1809          * give us 115200.
1810          *
1811          * There are two additional differences. The Linux value for CLOCAL
1812          * (0x800; 0004000) has no meaning to the Digi hardware. Also in later
1813          * releases of Linux; the CBAUD define has CBAUDEX (0x1000; 0010000)
1814          * ored into it (CBAUD = 0x100f as opposed to 0xf). CBAUDEX should be
1815          * checked for a screened out prior to termios2digi_c returning. Since
1816          * CLOCAL isn't used by the board this can be ignored as long as the
1817          * returned value is used only by Digi hardware.
1818          */
1819         if (cflag & CBAUDEX) {
1820                 /*
1821                  * The below code is trying to guarantee that only baud rates
1822                  * 115200 and 230400 are remapped. We use exclusive or because
1823                  * the various baud rates share common bit positions and
1824                  * therefore can't be tested for easily.
1825                  */
1826                 if ((!((cflag & 0x7) ^ (B115200 & ~CBAUDEX))) ||
1827                     (!((cflag & 0x7) ^ (B230400 & ~CBAUDEX))))
1828                         res += 1;
1829         }
1830         return res;
1831 }
1832
1833 /* Caller must hold the locks */
1834 static void epcaparam(struct tty_struct *tty, struct channel *ch)
1835 {
1836         unsigned int cmdHead;
1837         struct ktermios *ts;
1838         struct board_chan __iomem *bc;
1839         unsigned mval, hflow, cflag, iflag;
1840
1841         bc = ch->brdchan;
1842         epcaassert(bc != NULL, "bc out of range");
1843
1844         assertgwinon(ch);
1845         ts = tty->termios;
1846         if ((ts->c_cflag & CBAUD) == 0)  { /* Begin CBAUD detected */
1847                 cmdHead = readw(&bc->rin);
1848                 writew(cmdHead, &bc->rout);
1849                 cmdHead = readw(&bc->tin);
1850                 /* Changing baud in mid-stream transmission can be wonderful */
1851                 /*
1852                  * Flush current transmit buffer by setting cmdTail pointer
1853                  * (tout) to cmdHead pointer (tin). Hopefully the transmit
1854                  * buffer is empty.
1855                  */
1856                 fepcmd(ch, STOUT, (unsigned) cmdHead, 0, 0, 0);
1857                 mval = 0;
1858         } else { /* Begin CBAUD not detected */
1859                 /*
1860                  * c_cflags have changed but that change had nothing to do with
1861                  * BAUD. Propagate the change to the card.
1862                  */
1863                 cflag = termios2digi_c(ch, ts->c_cflag);
1864                 if (cflag != ch->fepcflag)  {
1865                         ch->fepcflag = cflag;
1866                         /* Set baud rate, char size, stop bits, parity */
1867                         fepcmd(ch, SETCTRLFLAGS, (unsigned) cflag, 0, 0, 0);
1868                 }
1869                 /*
1870                  * If the user has not forced CLOCAL and if the device is not a
1871                  * CALLOUT device (Which is always CLOCAL) we set flags such
1872                  * that the driver will wait on carrier detect.
1873                  */
1874                 if (ts->c_cflag & CLOCAL)
1875                         ch->asyncflags &= ~ASYNC_CHECK_CD;
1876                 else
1877                         ch->asyncflags |= ASYNC_CHECK_CD;
1878                 mval = ch->m_dtr | ch->m_rts;
1879         } /* End CBAUD not detected */
1880         iflag = termios2digi_i(ch, ts->c_iflag);
1881         /* Check input mode flags */
1882         if (iflag != ch->fepiflag)  {
1883                 ch->fepiflag = iflag;
1884                 /*
1885                  * Command sets channels iflag structure on the board. Such
1886                  * things as input soft flow control, handling of parity
1887                  * errors, and break handling are all set here.
1888                  */
1889                 /* break handling, parity handling, input stripping, flow control chars */
1890                 fepcmd(ch, SETIFLAGS, (unsigned int) ch->fepiflag, 0, 0, 0);
1891         }
1892         /*
1893          * Set the board mint value for this channel. This will cause hardware
1894          * events to be generated each time the DCD signal (Described in mint)
1895          * changes.
1896          */
1897         writeb(ch->dcd, &bc->mint);
1898         if ((ts->c_cflag & CLOCAL) || (ch->digiext.digi_flags & DIGI_FORCEDCD))
1899                 if (ch->digiext.digi_flags & DIGI_FORCEDCD)
1900                         writeb(0, &bc->mint);
1901         ch->imodem = readb(&bc->mstat);
1902         hflow = termios2digi_h(ch, ts->c_cflag);
1903         if (hflow != ch->hflow)  {
1904                 ch->hflow = hflow;
1905                 /*
1906                  * Hard flow control has been selected but the board is not
1907                  * using it. Activate hard flow control now.
1908                  */
1909                 fepcmd(ch, SETHFLOW, hflow, 0xff, 0, 1);
1910         }
1911         mval ^= ch->modemfake & (mval ^ ch->modem);
1912
1913         if (ch->omodem ^ mval)  {
1914                 ch->omodem = mval;
1915                 /*
1916                  * The below command sets the DTR and RTS mstat structure. If
1917                  * hard flow control is NOT active these changes will drive the
1918                  * output of the actual DTR and RTS lines. If hard flow control
1919                  * is active, the changes will be saved in the mstat structure
1920                  * and only asserted when hard flow control is turned off.
1921                  */
1922
1923                 /* First reset DTR & RTS; then set them */
1924                 fepcmd(ch, SETMODEM, 0, ((ch->m_dtr)|(ch->m_rts)), 0, 1);
1925                 fepcmd(ch, SETMODEM, mval, 0, 0, 1);
1926         }
1927         if (ch->startc != ch->fepstartc || ch->stopc != ch->fepstopc)  {
1928                 ch->fepstartc = ch->startc;
1929                 ch->fepstopc = ch->stopc;
1930                 /*
1931                  * The XON / XOFF characters have changed; propagate these
1932                  * changes to the card.
1933                  */
1934                 fepcmd(ch, SONOFFC, ch->fepstartc, ch->fepstopc, 0, 1);
1935         }
1936         if (ch->startca != ch->fepstartca || ch->stopca != ch->fepstopca)  {
1937                 ch->fepstartca = ch->startca;
1938                 ch->fepstopca = ch->stopca;
1939                 /*
1940                  * Similar to the above, this time the auxilarly XON / XOFF
1941                  * characters have changed; propagate these changes to the card.
1942                  */
1943                 fepcmd(ch, SAUXONOFFC, ch->fepstartca, ch->fepstopca, 0, 1);
1944         }
1945 }
1946
1947 /* Caller holds lock */
1948 static void receive_data(struct channel *ch)
1949 {
1950         unchar *rptr;
1951         struct ktermios *ts = NULL;
1952         struct tty_struct *tty;
1953         struct board_chan __iomem *bc;
1954         int dataToRead, wrapgap, bytesAvailable;
1955         unsigned int tail, head;
1956         unsigned int wrapmask;
1957
1958         /*
1959          * This routine is called by doint when a receive data event has taken
1960          * place.
1961          */
1962         globalwinon(ch);
1963         if (ch->statusflags & RXSTOPPED)
1964                 return;
1965         tty = ch->tty;
1966         if (tty)
1967                 ts = tty->termios;
1968         bc = ch->brdchan;
1969         BUG_ON(!bc);
1970         wrapmask = ch->rxbufsize - 1;
1971
1972         /*
1973          * Get the head and tail pointers to the receiver queue. Wrap the head
1974          * pointer if it has reached the end of the buffer.
1975          */
1976         head = readw(&bc->rin);
1977         head &= wrapmask;
1978         tail = readw(&bc->rout) & wrapmask;
1979
1980         bytesAvailable = (head - tail) & wrapmask;
1981         if (bytesAvailable == 0)
1982                 return;
1983
1984         /* If CREAD bit is off or device not open, set TX tail to head */
1985         if (!tty || !ts || !(ts->c_cflag & CREAD))  {
1986                 writew(head, &bc->rout);
1987                 return;
1988         }
1989
1990         if (tty_buffer_request_room(tty, bytesAvailable + 1) == 0)
1991                 return;
1992
1993         if (readb(&bc->orun)) {
1994                 writeb(0, &bc->orun);
1995                 printk(KERN_WARNING "epca; overrun! DigiBoard device %s\n",tty->name);
1996                 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
1997         }
1998         rxwinon(ch);
1999         while (bytesAvailable > 0)  { /* Begin while there is data on the card */
2000                 wrapgap = (head >= tail) ? head - tail : ch->rxbufsize - tail;
2001                 /*
2002                  * Even if head has wrapped around only report the amount of
2003                  * data to be equal to the size - tail. Remember memcpy can't
2004                  * automaticly wrap around the receive buffer.
2005                  */
2006                 dataToRead = (wrapgap < bytesAvailable) ? wrapgap : bytesAvailable;
2007                 /* Make sure we don't overflow the buffer */
2008                 dataToRead = tty_prepare_flip_string(tty, &rptr, dataToRead);
2009                 if (dataToRead == 0)
2010                         break;
2011                 /*
2012                  * Move data read from our card into the line disciplines
2013                  * buffer for translation if necessary.
2014                  */
2015                 memcpy_fromio(rptr, ch->rxptr + tail, dataToRead);
2016                 tail = (tail + dataToRead) & wrapmask;
2017                 bytesAvailable -= dataToRead;
2018         } /* End while there is data on the card */
2019         globalwinon(ch);
2020         writew(tail, &bc->rout);
2021         /* Must be called with global data */
2022         tty_schedule_flip(ch->tty);
2023 }
2024
2025 static int info_ioctl(struct tty_struct *tty, struct file *file,
2026                     unsigned int cmd, unsigned long arg)
2027 {
2028         switch (cmd) {
2029         case DIGI_GETINFO:
2030                 {
2031                         struct digi_info di;
2032                         int brd;
2033
2034                         if (get_user(brd, (unsigned int __user *)arg))
2035                                 return -EFAULT;
2036                         if (brd < 0 || brd >= num_cards || num_cards == 0)
2037                                 return -ENODEV;
2038
2039                         memset(&di, 0, sizeof(di));
2040
2041                         di.board = brd;
2042                         di.status = boards[brd].status;
2043                         di.type = boards[brd].type ;
2044                         di.numports = boards[brd].numports ;
2045                         /* Legacy fixups - just move along nothing to see */
2046                         di.port = (unsigned char *)boards[brd].port ;
2047                         di.membase = (unsigned char *)boards[brd].membase ;
2048
2049                         if (copy_to_user((void __user *)arg, &di, sizeof(di)))
2050                                 return -EFAULT;
2051                         break;
2052
2053                 }
2054
2055         case DIGI_POLLER:
2056                 {
2057                         int brd = arg & 0xff000000 >> 16;
2058                         unsigned char state = arg & 0xff;
2059
2060                         if (brd < 0 || brd >= num_cards) {
2061                                 printk(KERN_ERR "epca: DIGI POLLER : brd not valid!\n");
2062                                 return -ENODEV;
2063                         }
2064                         digi_poller_inhibited = state;
2065                         break;
2066                 }
2067
2068         case DIGI_INIT:
2069                 {
2070                         /*
2071                          * This call is made by the apps to complete the
2072                          * initialization of the board(s). This routine is
2073                          * responsible for setting the card to its initial
2074                          * state and setting the drivers control fields to the
2075                          * sutianle settings for the card in question.
2076                          */
2077                         int crd;
2078                         for (crd = 0; crd < num_cards; crd++)
2079                                 post_fep_init(crd);
2080                         break;
2081                 }
2082         default:
2083                 return -ENOTTY;
2084         }
2085         return 0;
2086 }
2087
2088 static int pc_tiocmget(struct tty_struct *tty, struct file *file)
2089 {
2090         struct channel *ch = (struct channel *) tty->driver_data;
2091         struct board_chan __iomem *bc;
2092         unsigned int mstat, mflag = 0;
2093         unsigned long flags;
2094
2095         if (ch)
2096                 bc = ch->brdchan;
2097         else
2098                 return -EINVAL;
2099
2100         spin_lock_irqsave(&epca_lock, flags);
2101         globalwinon(ch);
2102         mstat = readb(&bc->mstat);
2103         memoff(ch);
2104         spin_unlock_irqrestore(&epca_lock, flags);
2105
2106         if (mstat & ch->m_dtr)
2107                 mflag |= TIOCM_DTR;
2108         if (mstat & ch->m_rts)
2109                 mflag |= TIOCM_RTS;
2110         if (mstat & ch->m_cts)
2111                 mflag |= TIOCM_CTS;
2112         if (mstat & ch->dsr)
2113                 mflag |= TIOCM_DSR;
2114         if (mstat & ch->m_ri)
2115                 mflag |= TIOCM_RI;
2116         if (mstat & ch->dcd)
2117                 mflag |= TIOCM_CD;
2118         return mflag;
2119 }
2120
2121 static int pc_tiocmset(struct tty_struct *tty, struct file *file,
2122                        unsigned int set, unsigned int clear)
2123 {
2124         struct channel *ch = (struct channel *) tty->driver_data;
2125         unsigned long flags;
2126
2127         if (!ch)
2128                 return -EINVAL;
2129
2130         spin_lock_irqsave(&epca_lock, flags);
2131         /*
2132          * I think this modemfake stuff is broken. It doesn't correctly reflect
2133          * the behaviour desired by the TIOCM* ioctls. Therefore this is
2134          * probably broken.
2135          */
2136         if (set & TIOCM_RTS) {
2137                 ch->modemfake |= ch->m_rts;
2138                 ch->modem |= ch->m_rts;
2139         }
2140         if (set & TIOCM_DTR) {
2141                 ch->modemfake |= ch->m_dtr;
2142                 ch->modem |= ch->m_dtr;
2143         }
2144         if (clear & TIOCM_RTS) {
2145                 ch->modemfake |= ch->m_rts;
2146                 ch->modem &= ~ch->m_rts;
2147         }
2148         if (clear & TIOCM_DTR) {
2149                 ch->modemfake |= ch->m_dtr;
2150                 ch->modem &= ~ch->m_dtr;
2151         }
2152         globalwinon(ch);
2153         /*
2154          * The below routine generally sets up parity, baud, flow control
2155          * issues, etc.... It effect both control flags and input flags.
2156          */
2157         epcaparam(tty,ch);
2158         memoff(ch);
2159         spin_unlock_irqrestore(&epca_lock, flags);
2160         return 0;
2161 }
2162
2163 static int pc_ioctl(struct tty_struct *tty, struct file * file,
2164                     unsigned int cmd, unsigned long arg)
2165 {
2166         digiflow_t dflow;
2167         int retval;
2168         unsigned long flags;
2169         unsigned int mflag, mstat;
2170         unsigned char startc, stopc;
2171         struct board_chan __iomem *bc;
2172         struct channel *ch = (struct channel *) tty->driver_data;
2173         void __user *argp = (void __user *)arg;
2174
2175         if (ch)
2176                 bc = ch->brdchan;
2177         else
2178                 return -EINVAL;
2179
2180         /*
2181          * For POSIX compliance we need to add more ioctls. See tty_ioctl.c in
2182          * /usr/src/linux/drivers/char for a good example. In particular think
2183          * about adding TCSETAF, TCSETAW, TCSETA, TCSETSF, TCSETSW, TCSETS.
2184          */
2185         switch (cmd) {
2186         case TCSBRK:    /* SVID version: non-zero arg --> no break */
2187                 retval = tty_check_change(tty);
2188                 if (retval)
2189                         return retval;
2190                 /* Setup an event to indicate when the transmit buffer empties */
2191                 spin_lock_irqsave(&epca_lock, flags);
2192                 setup_empty_event(tty,ch);
2193                 spin_unlock_irqrestore(&epca_lock, flags);
2194                 tty_wait_until_sent(tty, 0);
2195                 if (!arg)
2196                         digi_send_break(ch, HZ / 4);    /* 1/4 second */
2197                 return 0;
2198         case TCSBRKP:   /* support for POSIX tcsendbreak() */
2199                 retval = tty_check_change(tty);
2200                 if (retval)
2201                         return retval;
2202
2203                 /* Setup an event to indicate when the transmit buffer empties */
2204                 spin_lock_irqsave(&epca_lock, flags);
2205                 setup_empty_event(tty,ch);
2206                 spin_unlock_irqrestore(&epca_lock, flags);
2207                 tty_wait_until_sent(tty, 0);
2208                 digi_send_break(ch, arg ? arg*(HZ/10) : HZ/4);
2209                 return 0;
2210         case TIOCMODG:
2211                 mflag = pc_tiocmget(tty, file);
2212                 if (put_user(mflag, (unsigned long __user *)argp))
2213                         return -EFAULT;
2214                 break;
2215         case TIOCMODS:
2216                 if (get_user(mstat, (unsigned __user *)argp))
2217                         return -EFAULT;
2218                 return pc_tiocmset(tty, file, mstat, ~mstat);
2219         case TIOCSDTR:
2220                 spin_lock_irqsave(&epca_lock, flags);
2221                 ch->omodem |= ch->m_dtr;
2222                 globalwinon(ch);
2223                 fepcmd(ch, SETMODEM, ch->m_dtr, 0, 10, 1);
2224                 memoff(ch);
2225                 spin_unlock_irqrestore(&epca_lock, flags);
2226                 break;
2227
2228         case TIOCCDTR:
2229                 spin_lock_irqsave(&epca_lock, flags);
2230                 ch->omodem &= ~ch->m_dtr;
2231                 globalwinon(ch);
2232                 fepcmd(ch, SETMODEM, 0, ch->m_dtr, 10, 1);
2233                 memoff(ch);
2234                 spin_unlock_irqrestore(&epca_lock, flags);
2235                 break;
2236         case DIGI_GETA:
2237                 if (copy_to_user(argp, &ch->digiext, sizeof(digi_t)))
2238                         return -EFAULT;
2239                 break;
2240         case DIGI_SETAW:
2241         case DIGI_SETAF:
2242                 lock_kernel();
2243                 if (cmd == DIGI_SETAW) {
2244                         /* Setup an event to indicate when the transmit buffer empties */
2245                         spin_lock_irqsave(&epca_lock, flags);
2246                         setup_empty_event(tty,ch);
2247                         spin_unlock_irqrestore(&epca_lock, flags);
2248                         tty_wait_until_sent(tty, 0);
2249                 } else {
2250                         /* ldisc lock already held in ioctl */
2251                         if (tty->ldisc.flush_buffer)
2252                                 tty->ldisc.flush_buffer(tty);
2253                 }
2254                 unlock_kernel();
2255                 /* Fall Thru */
2256         case DIGI_SETA:
2257                 if (copy_from_user(&ch->digiext, argp, sizeof(digi_t)))
2258                         return -EFAULT;
2259
2260                 if (ch->digiext.digi_flags & DIGI_ALTPIN)  {
2261                         ch->dcd = ch->m_dsr;
2262                         ch->dsr = ch->m_dcd;
2263                 } else {
2264                         ch->dcd = ch->m_dcd;
2265                         ch->dsr = ch->m_dsr;
2266                         }
2267
2268                 spin_lock_irqsave(&epca_lock, flags);
2269                 globalwinon(ch);
2270
2271                 /*
2272                  * The below routine generally sets up parity, baud, flow
2273                  * control issues, etc.... It effect both control flags and
2274                  * input flags.
2275                  */
2276                 epcaparam(tty,ch);
2277                 memoff(ch);
2278                 spin_unlock_irqrestore(&epca_lock, flags);
2279                 break;
2280
2281         case DIGI_GETFLOW:
2282         case DIGI_GETAFLOW:
2283                 spin_lock_irqsave(&epca_lock, flags);
2284                 globalwinon(ch);
2285                 if (cmd == DIGI_GETFLOW) {
2286                         dflow.startc = readb(&bc->startc);
2287                         dflow.stopc = readb(&bc->stopc);
2288                 } else {
2289                         dflow.startc = readb(&bc->startca);
2290                         dflow.stopc = readb(&bc->stopca);
2291                 }
2292                 memoff(ch);
2293                 spin_unlock_irqrestore(&epca_lock, flags);
2294
2295                 if (copy_to_user(argp, &dflow, sizeof(dflow)))
2296                         return -EFAULT;
2297                 break;
2298
2299         case DIGI_SETAFLOW:
2300         case DIGI_SETFLOW:
2301                 if (cmd == DIGI_SETFLOW) {
2302                         startc = ch->startc;
2303                         stopc = ch->stopc;
2304                 } else {
2305                         startc = ch->startca;
2306                         stopc = ch->stopca;
2307                 }
2308
2309                 if (copy_from_user(&dflow, argp, sizeof(dflow)))
2310                         return -EFAULT;
2311
2312                 if (dflow.startc != startc || dflow.stopc != stopc) { /* Begin  if setflow toggled */
2313                         spin_lock_irqsave(&epca_lock, flags);
2314                         globalwinon(ch);
2315
2316                         if (cmd == DIGI_SETFLOW) {
2317                                 ch->fepstartc = ch->startc = dflow.startc;
2318                                 ch->fepstopc = ch->stopc = dflow.stopc;
2319                                 fepcmd(ch, SONOFFC, ch->fepstartc, ch->fepstopc, 0, 1);
2320                         } else {
2321                                 ch->fepstartca = ch->startca = dflow.startc;
2322                                 ch->fepstopca  = ch->stopca = dflow.stopc;
2323                                 fepcmd(ch, SAUXONOFFC, ch->fepstartca, ch->fepstopca, 0, 1);
2324                         }
2325
2326                         if (ch->statusflags & TXSTOPPED)
2327                                 pc_start(tty);
2328
2329                         memoff(ch);
2330                         spin_unlock_irqrestore(&epca_lock, flags);
2331                 } /* End if setflow toggled */
2332                 break;
2333         default:
2334                 return -ENOIOCTLCMD;
2335         }
2336         return 0;
2337 }
2338
2339 static void pc_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
2340 {
2341         struct channel *ch;
2342         unsigned long flags;
2343         /*
2344          * verifyChannel returns the channel from the tty struct if it is
2345          * valid. This serves as a sanity check.
2346          */
2347         if ((ch = verifyChannel(tty)) != NULL)  { /* Begin if channel valid */
2348                 spin_lock_irqsave(&epca_lock, flags);
2349                 globalwinon(ch);
2350                 epcaparam(tty, ch);
2351                 memoff(ch);
2352                 spin_unlock_irqrestore(&epca_lock, flags);
2353
2354                 if ((old_termios->c_cflag & CRTSCTS) &&
2355                          ((tty->termios->c_cflag & CRTSCTS) == 0))
2356                         tty->hw_stopped = 0;
2357
2358                 if (!(old_termios->c_cflag & CLOCAL) &&
2359                          (tty->termios->c_cflag & CLOCAL))
2360                         wake_up_interruptible(&ch->open_wait);
2361
2362         } /* End if channel valid */
2363 }
2364
2365 static void do_softint(struct work_struct *work)
2366 {
2367         struct channel *ch = container_of(work, struct channel, tqueue);
2368         /* Called in response to a modem change event */
2369         if (ch && ch->magic == EPCA_MAGIC) {
2370                 struct tty_struct *tty = ch->tty;
2371
2372                 if (tty && tty->driver_data) {
2373                         if (test_and_clear_bit(EPCA_EVENT_HANGUP, &ch->event)) {
2374                                 tty_hangup(tty);        /* FIXME: module removal race here - AKPM */
2375                                 wake_up_interruptible(&ch->open_wait);
2376                                 ch->asyncflags &= ~ASYNC_NORMAL_ACTIVE;
2377                         }
2378                 }
2379         }
2380 }
2381
2382 /*
2383  * pc_stop and pc_start provide software flow control to the routine and the
2384  * pc_ioctl routine.
2385  */
2386 static void pc_stop(struct tty_struct *tty)
2387 {
2388         struct channel *ch;
2389         unsigned long flags;
2390         /*
2391          * verifyChannel returns the channel from the tty struct if it is
2392          * valid. This serves as a sanity check.
2393          */
2394         if ((ch = verifyChannel(tty)) != NULL) {
2395                 spin_lock_irqsave(&epca_lock, flags);
2396                 if ((ch->statusflags & TXSTOPPED) == 0) { /* Begin if transmit stop requested */
2397                         globalwinon(ch);
2398                         /* STOP transmitting now !! */
2399                         fepcmd(ch, PAUSETX, 0, 0, 0, 0);
2400                         ch->statusflags |= TXSTOPPED;
2401                         memoff(ch);
2402                 } /* End if transmit stop requested */
2403                 spin_unlock_irqrestore(&epca_lock, flags);
2404         }
2405 }
2406
2407 static void pc_start(struct tty_struct *tty)
2408 {
2409         struct channel *ch;
2410         /*
2411          * verifyChannel returns the channel from the tty struct if it is
2412          * valid. This serves as a sanity check.
2413          */
2414         if ((ch = verifyChannel(tty)) != NULL) {
2415                 unsigned long flags;
2416                 spin_lock_irqsave(&epca_lock, flags);
2417                 /* Just in case output was resumed because of a change in Digi-flow */
2418                 if (ch->statusflags & TXSTOPPED)  { /* Begin transmit resume requested */
2419                         struct board_chan __iomem *bc;
2420                         globalwinon(ch);
2421                         bc = ch->brdchan;
2422                         if (ch->statusflags & LOWWAIT)
2423                                 writeb(1, &bc->ilow);
2424                         /* Okay, you can start transmitting again... */
2425                         fepcmd(ch, RESUMETX, 0, 0, 0, 0);
2426                         ch->statusflags &= ~TXSTOPPED;
2427                         memoff(ch);
2428                 } /* End transmit resume requested */
2429                 spin_unlock_irqrestore(&epca_lock, flags);
2430         }
2431 }
2432
2433 /*
2434  * The below routines pc_throttle and pc_unthrottle are used to slow (And
2435  * resume) the receipt of data into the kernels receive buffers. The exact
2436  * occurrence of this depends on the size of the kernels receive buffer and
2437  * what the 'watermarks' are set to for that buffer. See the n_ttys.c file for
2438  * more details.
2439  */
2440 static void pc_throttle(struct tty_struct *tty)
2441 {
2442         struct channel *ch;
2443         unsigned long flags;
2444         /*
2445          * verifyChannel returns the channel from the tty struct if it is
2446          * valid. This serves as a sanity check.
2447          */
2448         if ((ch = verifyChannel(tty)) != NULL) {
2449                 spin_lock_irqsave(&epca_lock, flags);
2450                 if ((ch->statusflags & RXSTOPPED) == 0) {
2451                         globalwinon(ch);
2452                         fepcmd(ch, PAUSERX, 0, 0, 0, 0);
2453                         ch->statusflags |= RXSTOPPED;
2454                         memoff(ch);
2455                 }
2456                 spin_unlock_irqrestore(&epca_lock, flags);
2457         }
2458 }
2459
2460 static void pc_unthrottle(struct tty_struct *tty)
2461 {
2462         struct channel *ch;
2463         unsigned long flags;
2464         /*
2465          * verifyChannel returns the channel from the tty struct if it is
2466          * valid. This serves as a sanity check.
2467          */
2468         if ((ch = verifyChannel(tty)) != NULL) {
2469                 /* Just in case output was resumed because of a change in Digi-flow */
2470                 spin_lock_irqsave(&epca_lock, flags);
2471                 if (ch->statusflags & RXSTOPPED) {
2472                         globalwinon(ch);
2473                         fepcmd(ch, RESUMERX, 0, 0, 0, 0);
2474                         ch->statusflags &= ~RXSTOPPED;
2475                         memoff(ch);
2476                 }
2477                 spin_unlock_irqrestore(&epca_lock, flags);
2478         }
2479 }
2480
2481 static void digi_send_break(struct channel *ch, int msec)
2482 {
2483         unsigned long flags;
2484
2485         spin_lock_irqsave(&epca_lock, flags);
2486         globalwinon(ch);
2487         /*
2488          * Maybe I should send an infinite break here, schedule() for msec
2489          * amount of time, and then stop the break. This way, the user can't
2490          * screw up the FEP by causing digi_send_break() to be called (i.e. via
2491          * an ioctl()) more than once in msec amount of time.
2492          * Try this for now...
2493          */
2494         fepcmd(ch, SENDBREAK, msec, 0, 10, 0);
2495         memoff(ch);
2496         spin_unlock_irqrestore(&epca_lock, flags);
2497 }
2498
2499 /* Caller MUST hold the lock */
2500 static void setup_empty_event(struct tty_struct *tty, struct channel *ch)
2501 {
2502         struct board_chan __iomem *bc = ch->brdchan;
2503
2504         globalwinon(ch);
2505         ch->statusflags |= EMPTYWAIT;
2506         /*
2507          * When set the iempty flag request a event to be generated when the
2508          * transmit buffer is empty (If there is no BREAK in progress).
2509          */
2510         writeb(1, &bc->iempty);
2511         memoff(ch);
2512 }
2513
2514 void epca_setup(char *str, int *ints)
2515 {
2516         struct board_info board;
2517         int               index, loop, last;
2518         char              *temp, *t2;
2519         unsigned          len;
2520
2521         /*
2522          * If this routine looks a little strange it is because it is only
2523          * called if a LILO append command is given to boot the kernel with
2524          * parameters. In this way, we can provide the user a method of
2525          * changing his board configuration without rebuilding the kernel.
2526          */
2527         if (!liloconfig)
2528                 liloconfig = 1;
2529
2530         memset(&board, 0, sizeof(board));
2531
2532         /* Assume the data is int first, later we can change it */
2533         /* I think that array position 0 of ints holds the number of args */
2534         for (last = 0, index = 1; index <= ints[0]; index++)
2535                 switch (index) { /* Begin parse switch */
2536                 case 1:
2537                         board.status = ints[index];
2538                         /*
2539                          * We check for 2 (As opposed to 1; because 2 is a flag
2540                          * instructing the driver to ignore epcaconfig.) For
2541                          * this reason we check for 2.
2542                          */
2543                         if (board.status == 2) { /* Begin ignore epcaconfig as well as lilo cmd line */
2544                                 nbdevs = 0;
2545                                 num_cards = 0;
2546                                 return;
2547                         } /* End ignore epcaconfig as well as lilo cmd line */
2548
2549                         if (board.status > 2) {
2550                                 printk(KERN_ERR "epca_setup: Invalid board status 0x%x\n", board.status);
2551                                 invalid_lilo_config = 1;
2552                                 setup_error_code |= INVALID_BOARD_STATUS;
2553                                 return;
2554                         }
2555                         last = index;
2556                         break;
2557                 case 2:
2558                         board.type = ints[index];
2559                         if (board.type >= PCIXEM)  {
2560                                 printk(KERN_ERR "epca_setup: Invalid board type 0x%x\n", board.type);
2561                                 invalid_lilo_config = 1;
2562                                 setup_error_code |= INVALID_BOARD_TYPE;
2563                                 return;
2564                         }
2565                         last = index;
2566                         break;
2567                 case 3:
2568                         board.altpin = ints[index];
2569                         if (board.altpin > 1) {
2570                                 printk(KERN_ERR "epca_setup: Invalid board altpin 0x%x\n", board.altpin);
2571                                 invalid_lilo_config = 1;
2572                                 setup_error_code |= INVALID_ALTPIN;
2573                                 return;
2574                         }
2575                         last = index;
2576                         break;
2577
2578                 case 4:
2579                         board.numports = ints[index];
2580                         if (board.numports < 2 || board.numports > 256) {
2581                                 printk(KERN_ERR "epca_setup: Invalid board numports 0x%x\n", board.numports);
2582                                 invalid_lilo_config = 1;
2583                                 setup_error_code |= INVALID_NUM_PORTS;
2584                                 return;
2585                         }
2586                         nbdevs += board.numports;
2587                         last = index;
2588                         break;
2589
2590                 case 5:
2591                         board.port = ints[index];
2592                         if (ints[index] <= 0) {
2593                                 printk(KERN_ERR "epca_setup: Invalid io port 0x%x\n", (unsigned int)board.port);
2594                                 invalid_lilo_config = 1;
2595                                 setup_error_code |= INVALID_PORT_BASE;
2596                                 return;
2597                         }
2598                         last = index;
2599                         break;
2600
2601                 case 6:
2602                         board.membase = ints[index];
2603                         if (ints[index] <= 0) {
2604                                 printk(KERN_ERR "epca_setup: Invalid memory base 0x%x\n",(unsigned int)board.membase);
2605                                 invalid_lilo_config = 1;
2606                                 setup_error_code |= INVALID_MEM_BASE;
2607                                 return;
2608                         }
2609                         last = index;
2610                         break;
2611
2612                 default:
2613                         printk(KERN_ERR "<Error> - epca_setup: Too many integer parms\n");
2614                         return;
2615
2616                 } /* End parse switch */
2617
2618         while (str && *str)  { /* Begin while there is a string arg */
2619                 /* find the next comma or terminator */
2620                 temp = str;
2621                 /* While string is not null, and a comma hasn't been found */
2622                 while (*temp && (*temp != ','))
2623                         temp++;
2624                 if (!*temp)
2625                         temp = NULL;
2626                 else
2627                         *temp++ = 0;
2628                 /* Set index to the number of args + 1 */
2629                 index = last + 1;
2630
2631                 switch (index) {
2632                 case 1:
2633                         len = strlen(str);
2634                         if (strncmp("Disable", str, len) == 0)
2635                                 board.status = 0;
2636                         else if (strncmp("Enable", str, len) == 0)
2637                                 board.status = 1;
2638                         else {
2639                                 printk(KERN_ERR "epca_setup: Invalid status %s\n", str);
2640                                 invalid_lilo_config = 1;
2641                                 setup_error_code |= INVALID_BOARD_STATUS;
2642                                 return;
2643                         }
2644                         last = index;
2645                         break;
2646
2647                 case 2:
2648                         for (loop = 0; loop < EPCA_NUM_TYPES; loop++)
2649                                 if (strcmp(board_desc[loop], str) == 0)
2650                                         break;
2651                         /*
2652                          * If the index incremented above refers to a
2653                          * legitamate board type set it here.
2654                          */
2655                         if (index < EPCA_NUM_TYPES)
2656                                 board.type = loop;
2657                         else {
2658                                 printk(KERN_ERR "epca_setup: Invalid board type: %s\n", str);
2659                                 invalid_lilo_config = 1;
2660                                 setup_error_code |= INVALID_BOARD_TYPE;
2661                                 return;
2662                         }
2663                         last = index;
2664                         break;
2665
2666                 case 3:
2667                         len = strlen(str);
2668                         if (strncmp("Disable", str, len) == 0)
2669                                 board.altpin = 0;
2670                         else if (strncmp("Enable", str, len) == 0)
2671                                 board.altpin = 1;
2672                         else {
2673                                 printk(KERN_ERR "epca_setup: Invalid altpin %s\n", str);
2674                                 invalid_lilo_config = 1;
2675                                 setup_error_code |= INVALID_ALTPIN;
2676                                 return;
2677                         }
2678                         last = index;
2679                         break;
2680
2681                 case 4:
2682                         t2 = str;
2683                         while (isdigit(*t2))
2684                                 t2++;
2685
2686                         if (*t2) {
2687                                 printk(KERN_ERR "epca_setup: Invalid port count %s\n", str);
2688                                 invalid_lilo_config = 1;
2689                                 setup_error_code |= INVALID_NUM_PORTS;
2690                                 return;
2691                         }
2692
2693                         /*
2694                          * There is not a man page for simple_strtoul but the
2695                          * code can be found in vsprintf.c. The first argument
2696                          * is the string to translate (To an unsigned long
2697                          * obviously), the second argument can be the address
2698                          * of any character variable or a NULL. If a variable
2699                          * is given, the end pointer of the string will be
2700                          * stored in that variable; if a NULL is given the end
2701                          * pointer will not be returned. The last argument is
2702                          * the base to use. If a 0 is indicated, the routine
2703                          * will attempt to determine the proper base by looking
2704                          * at the values prefix (A '0' for octal, a 'x' for
2705                          * hex, etc ... If a value is given it will use that
2706                          * value as the base.
2707                          */
2708                         board.numports = simple_strtoul(str, NULL, 0);
2709                         nbdevs += board.numports;
2710                         last = index;
2711                         break;
2712
2713                 case 5:
2714                         t2 = str;
2715                         while (isxdigit(*t2))
2716                                 t2++;
2717
2718                         if (*t2) {
2719                                 printk(KERN_ERR "epca_setup: Invalid i/o address %s\n", str);
2720                                 invalid_lilo_config = 1;
2721                                 setup_error_code |= INVALID_PORT_BASE;
2722                                 return;
2723                         }
2724
2725                         board.port = simple_strtoul(str, NULL, 16);
2726                         last = index;
2727                         break;
2728
2729                 case 6:
2730                         t2 = str;
2731                         while (isxdigit(*t2))
2732                                 t2++;
2733
2734                         if (*t2) {
2735                                 printk(KERN_ERR "epca_setup: Invalid memory base %s\n",str);
2736                                 invalid_lilo_config = 1;
2737                                 setup_error_code |= INVALID_MEM_BASE;
2738                                 return;
2739                         }
2740                         board.membase = simple_strtoul(str, NULL, 16);
2741                         last = index;
2742                         break;
2743                 default:
2744                         printk(KERN_ERR "epca: Too many string parms\n");
2745                         return;
2746                 }
2747                 str = temp;
2748         } /* End while there is a string arg */
2749
2750         if (last < 6) {
2751                 printk(KERN_ERR "epca: Insufficient parms specified\n");
2752                 return;
2753         }
2754
2755         /* I should REALLY validate the stuff here */
2756         /* Copies our local copy of board into boards */
2757         memcpy((void *)&boards[num_cards],(void *)&board, sizeof(board));
2758         /* Does this get called once per lilo arg are what ? */
2759         printk(KERN_INFO "PC/Xx: Added board %i, %s %i ports at 0x%4.4X base 0x%6.6X\n",
2760                 num_cards, board_desc[board.type],
2761                 board.numports, (int)board.port, (unsigned int) board.membase);
2762         num_cards++;
2763 }
2764
2765 enum epic_board_types {
2766         brd_xr = 0,
2767         brd_xem,
2768         brd_cx,
2769         brd_xrj,
2770 };
2771
2772 /* indexed directly by epic_board_types enum */
2773 static struct {
2774         unsigned char board_type;
2775         unsigned bar_idx;               /* PCI base address region */
2776 } epca_info_tbl[] = {
2777         { PCIXR, 0, },
2778         { PCIXEM, 0, },
2779         { PCICX, 0, },
2780         { PCIXRJ, 2, },
2781 };
2782
2783 static int __devinit epca_init_one(struct pci_dev *pdev,
2784                                  const struct pci_device_id *ent)
2785 {
2786         static int board_num = -1;
2787         int board_idx, info_idx = ent->driver_data;
2788         unsigned long addr;
2789
2790         if (pci_enable_device(pdev))
2791                 return -EIO;
2792
2793         board_num++;
2794         board_idx = board_num + num_cards;
2795         if (board_idx >= MAXBOARDS)
2796                 goto err_out;
2797
2798         addr = pci_resource_start (pdev, epca_info_tbl[info_idx].bar_idx);
2799         if (!addr) {
2800                 printk (KERN_ERR PFX "PCI region #%d not available (size 0)\n",
2801                         epca_info_tbl[info_idx].bar_idx);
2802                 goto err_out;
2803         }
2804
2805         boards[board_idx].status = ENABLED;
2806         boards[board_idx].type = epca_info_tbl[info_idx].board_type;
2807         boards[board_idx].numports = 0x0;
2808         boards[board_idx].port = addr + PCI_IO_OFFSET;
2809         boards[board_idx].membase = addr;
2810
2811         if (!request_mem_region (addr + PCI_IO_OFFSET, 0x200000, "epca")) {
2812                 printk (KERN_ERR PFX "resource 0x%x @ 0x%lx unavailable\n",
2813                         0x200000, addr + PCI_IO_OFFSET);
2814                 goto err_out;
2815         }
2816
2817         boards[board_idx].re_map_port = ioremap(addr + PCI_IO_OFFSET, 0x200000);
2818         if (!boards[board_idx].re_map_port) {
2819                 printk (KERN_ERR PFX "cannot map 0x%x @ 0x%lx\n",
2820                         0x200000, addr + PCI_IO_OFFSET);
2821                 goto err_out_free_pciio;
2822         }
2823
2824         if (!request_mem_region (addr, 0x200000, "epca")) {
2825                 printk (KERN_ERR PFX "resource 0x%x @ 0x%lx unavailable\n",
2826                         0x200000, addr);
2827                 goto err_out_free_iounmap;
2828         }
2829
2830         boards[board_idx].re_map_membase = ioremap(addr, 0x200000);
2831         if (!boards[board_idx].re_map_membase) {
2832                 printk (KERN_ERR PFX "cannot map 0x%x @ 0x%lx\n",
2833                         0x200000, addr + PCI_IO_OFFSET);
2834                 goto err_out_free_memregion;
2835         }
2836
2837         /*
2838          * I don't know what the below does, but the hardware guys say its
2839          * required on everything except PLX (In this case XRJ).
2840          */
2841         if (info_idx != brd_xrj) {
2842                 pci_write_config_byte(pdev, 0x40, 0);
2843                 pci_write_config_byte(pdev, 0x46, 0);
2844         }
2845
2846         return 0;
2847
2848 err_out_free_memregion:
2849         release_mem_region (addr, 0x200000);
2850 err_out_free_iounmap:
2851         iounmap (boards[board_idx].re_map_port);
2852 err_out_free_pciio:
2853         release_mem_region (addr + PCI_IO_OFFSET, 0x200000);
2854 err_out:
2855         return -ENODEV;
2856 }
2857
2858
2859 static struct pci_device_id epca_pci_tbl[] = {
2860         { PCI_VENDOR_DIGI, PCI_DEVICE_XR, PCI_ANY_ID, PCI_ANY_ID, 0, 0, brd_xr },
2861         { PCI_VENDOR_DIGI, PCI_DEVICE_XEM, PCI_ANY_ID, PCI_ANY_ID, 0, 0, brd_xem },
2862         { PCI_VENDOR_DIGI, PCI_DEVICE_CX, PCI_ANY_ID, PCI_ANY_ID, 0, 0, brd_cx },
2863         { PCI_VENDOR_DIGI, PCI_DEVICE_XRJ, PCI_ANY_ID, PCI_ANY_ID, 0, 0, brd_xrj },
2864         { 0, }
2865 };
2866
2867 MODULE_DEVICE_TABLE(pci, epca_pci_tbl);
2868
2869 static int __init init_PCI(void)
2870 {
2871         memset (&epca_driver, 0, sizeof (epca_driver));
2872         epca_driver.name = "epca";
2873         epca_driver.id_table = epca_pci_tbl;
2874         epca_driver.probe = epca_init_one;
2875
2876         return pci_register_driver(&epca_driver);
2877 }
2878
2879 MODULE_LICENSE("GPL");