aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/epca.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
commit1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch)
tree0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/char/epca.c
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
Diffstat (limited to 'drivers/char/epca.c')
-rw-r--r--drivers/char/epca.c3789
1 files changed, 3789 insertions, 0 deletions
diff --git a/drivers/char/epca.c b/drivers/char/epca.c
new file mode 100644
index 000000000000..6025e1866c7e
--- /dev/null
+++ b/drivers/char/epca.c
@@ -0,0 +1,3789 @@
1/*
2
3
4 Copyright (C) 1996 Digi International.
5
6 For technical support please email digiLinux@dgii.com or
7 call Digi tech support at (612) 912-3456
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--------------------------------------------------------------------------- */
28/* See README.epca for change history --DAT*/
29
30
31#include <linux/config.h>
32#include <linux/module.h>
33#include <linux/kernel.h>
34#include <linux/types.h>
35#include <linux/init.h>
36#include <linux/serial.h>
37#include <linux/delay.h>
38#include <linux/ctype.h>
39#include <linux/tty.h>
40#include <linux/tty_flip.h>
41#include <linux/slab.h>
42#include <linux/ioport.h>
43#include <linux/interrupt.h>
44#include <asm/uaccess.h>
45#include <asm/io.h>
46
47#ifdef CONFIG_PCI
48#define ENABLE_PCI
49#endif /* CONFIG_PCI */
50
51#define putUser(arg1, arg2) put_user(arg1, (unsigned long __user *)arg2)
52#define getUser(arg1, arg2) get_user(arg1, (unsigned __user *)arg2)
53
54#ifdef ENABLE_PCI
55#include <linux/pci.h>
56#include "digiPCI.h"
57#endif /* ENABLE_PCI */
58
59#include "digi1.h"
60#include "digiFep1.h"
61#include "epca.h"
62#include "epcaconfig.h"
63
64#if BITS_PER_LONG != 32
65# error FIXME: this driver only works on 32-bit platforms
66#endif
67
68/* ---------------------- Begin defines ------------------------ */
69
70#define VERSION "1.3.0.1-LK"
71
72/* This major needs to be submitted to Linux to join the majors list */
73
74#define DIGIINFOMAJOR 35 /* For Digi specific ioctl */
75
76
77#define MAXCARDS 7
78#define epcaassert(x, msg) if (!(x)) epca_error(__LINE__, msg)
79
80#define PFX "epca: "
81
82/* ----------------- Begin global definitions ------------------- */
83
84static char mesg[100];
85static int nbdevs, num_cards, liloconfig;
86static int digi_poller_inhibited = 1 ;
87
88static int setup_error_code;
89static int invalid_lilo_config;
90
91/* -----------------------------------------------------------------------
92 MAXBOARDS is typically 12, but ISA and EISA cards are restricted to
93 7 below.
94--------------------------------------------------------------------------*/
95static struct board_info boards[MAXBOARDS];
96
97
98/* ------------- Begin structures used for driver registeration ---------- */
99
100static struct tty_driver *pc_driver;
101static struct tty_driver *pc_info;
102
103/* ------------------ Begin Digi specific structures -------------------- */
104
105/* ------------------------------------------------------------------------
106 digi_channels represents an array of structures that keep track of
107 each channel of the Digi product. Information such as transmit and
108 receive pointers, termio data, and signal definitions (DTR, CTS, etc ...)
109 are stored here. This structure is NOT used to overlay the cards
110 physical channel structure.
111-------------------------------------------------------------------------- */
112
113static struct channel digi_channels[MAX_ALLOC];
114
115/* ------------------------------------------------------------------------
116 card_ptr is an array used to hold the address of the
117 first channel structure of each card. This array will hold
118 the addresses of various channels located in digi_channels.
119-------------------------------------------------------------------------- */
120static struct channel *card_ptr[MAXCARDS];
121
122static struct timer_list epca_timer;
123
124/* ---------------------- Begin function prototypes --------------------- */
125
126/* ----------------------------------------------------------------------
127 Begin generic memory functions. These functions will be alias
128 (point at) more specific functions dependent on the board being
129 configured.
130----------------------------------------------------------------------- */
131
132static inline void memwinon(struct board_info *b, unsigned int win);
133static inline void memwinoff(struct board_info *b, unsigned int win);
134static inline void globalwinon(struct channel *ch);
135static inline void rxwinon(struct channel *ch);
136static inline void txwinon(struct channel *ch);
137static inline void memoff(struct channel *ch);
138static inline void assertgwinon(struct channel *ch);
139static inline void assertmemoff(struct channel *ch);
140
141/* ---- Begin more 'specific' memory functions for cx_like products --- */
142
143static inline void pcxem_memwinon(struct board_info *b, unsigned int win);
144static inline void pcxem_memwinoff(struct board_info *b, unsigned int win);
145static inline void pcxem_globalwinon(struct channel *ch);
146static inline void pcxem_rxwinon(struct channel *ch);
147static inline void pcxem_txwinon(struct channel *ch);
148static inline void pcxem_memoff(struct channel *ch);
149
150/* ------ Begin more 'specific' memory functions for the pcxe ------- */
151
152static inline void pcxe_memwinon(struct board_info *b, unsigned int win);
153static inline void pcxe_memwinoff(struct board_info *b, unsigned int win);
154static inline void pcxe_globalwinon(struct channel *ch);
155static inline void pcxe_rxwinon(struct channel *ch);
156static inline void pcxe_txwinon(struct channel *ch);
157static inline void pcxe_memoff(struct channel *ch);
158
159/* ---- Begin more 'specific' memory functions for the pc64xe and pcxi ---- */
160/* Note : pc64xe and pcxi share the same windowing routines */
161
162static inline void pcxi_memwinon(struct board_info *b, unsigned int win);
163static inline void pcxi_memwinoff(struct board_info *b, unsigned int win);
164static inline void pcxi_globalwinon(struct channel *ch);
165static inline void pcxi_rxwinon(struct channel *ch);
166static inline void pcxi_txwinon(struct channel *ch);
167static inline void pcxi_memoff(struct channel *ch);
168
169/* - Begin 'specific' do nothing memory functions needed for some cards - */
170
171static inline void dummy_memwinon(struct board_info *b, unsigned int win);
172static inline void dummy_memwinoff(struct board_info *b, unsigned int win);
173static inline void dummy_globalwinon(struct channel *ch);
174static inline void dummy_rxwinon(struct channel *ch);
175static inline void dummy_txwinon(struct channel *ch);
176static inline void dummy_memoff(struct channel *ch);
177static inline void dummy_assertgwinon(struct channel *ch);
178static inline void dummy_assertmemoff(struct channel *ch);
179
180/* ------------------- Begin declare functions ----------------------- */
181
182static inline struct channel *verifyChannel(register struct tty_struct *);
183static inline void pc_sched_event(struct channel *, int);
184static void epca_error(int, char *);
185static void pc_close(struct tty_struct *, struct file *);
186static void shutdown(struct channel *);
187static void pc_hangup(struct tty_struct *);
188static void pc_put_char(struct tty_struct *, unsigned char);
189static int pc_write_room(struct tty_struct *);
190static int pc_chars_in_buffer(struct tty_struct *);
191static void pc_flush_buffer(struct tty_struct *);
192static void pc_flush_chars(struct tty_struct *);
193static int block_til_ready(struct tty_struct *, struct file *,
194 struct channel *);
195static int pc_open(struct tty_struct *, struct file *);
196static void post_fep_init(unsigned int crd);
197static void epcapoll(unsigned long);
198static void doevent(int);
199static void fepcmd(struct channel *, int, int, int, int, int);
200static unsigned termios2digi_h(struct channel *ch, unsigned);
201static unsigned termios2digi_i(struct channel *ch, unsigned);
202static unsigned termios2digi_c(struct channel *ch, unsigned);
203static void epcaparam(struct tty_struct *, struct channel *);
204static void receive_data(struct channel *);
205static int pc_ioctl(struct tty_struct *, struct file *,
206 unsigned int, unsigned long);
207static int info_ioctl(struct tty_struct *, struct file *,
208 unsigned int, unsigned long);
209static void pc_set_termios(struct tty_struct *, struct termios *);
210static void do_softint(void *);
211static void pc_stop(struct tty_struct *);
212static void pc_start(struct tty_struct *);
213static void pc_throttle(struct tty_struct * tty);
214static void pc_unthrottle(struct tty_struct *tty);
215static void digi_send_break(struct channel *ch, int msec);
216static void setup_empty_event(struct tty_struct *tty, struct channel *ch);
217void epca_setup(char *, int *);
218void console_print(const char *);
219
220static int get_termio(struct tty_struct *, struct termio __user *);
221static int pc_write(struct tty_struct *, const unsigned char *, int);
222int pc_init(void);
223
224#ifdef ENABLE_PCI
225static int init_PCI(void);
226#endif /* ENABLE_PCI */
227
228
229/* ------------------------------------------------------------------
230 Table of functions for each board to handle memory. Mantaining
231 parallelism is a *very* good idea here. The idea is for the
232 runtime code to blindly call these functions, not knowing/caring
233 about the underlying hardware. This stuff should contain no
234 conditionals; if more functionality is needed a different entry
235 should be established. These calls are the interface calls and
236 are the only functions that should be accessed. Anyone caught
237 making direct calls deserves what they get.
238-------------------------------------------------------------------- */
239
240static inline void memwinon(struct board_info *b, unsigned int win)
241{
242 (b->memwinon)(b, win);
243}
244
245static inline void memwinoff(struct board_info *b, unsigned int win)
246{
247 (b->memwinoff)(b, win);
248}
249
250static inline void globalwinon(struct channel *ch)
251{
252 (ch->board->globalwinon)(ch);
253}
254
255static inline void rxwinon(struct channel *ch)
256{
257 (ch->board->rxwinon)(ch);
258}
259
260static inline void txwinon(struct channel *ch)
261{
262 (ch->board->txwinon)(ch);
263}
264
265static inline void memoff(struct channel *ch)
266{
267 (ch->board->memoff)(ch);
268}
269static inline void assertgwinon(struct channel *ch)
270{
271 (ch->board->assertgwinon)(ch);
272}
273
274static inline void assertmemoff(struct channel *ch)
275{
276 (ch->board->assertmemoff)(ch);
277}
278
279/* ---------------------------------------------------------
280 PCXEM windowing is the same as that used in the PCXR
281 and CX series cards.
282------------------------------------------------------------ */
283
284static inline void pcxem_memwinon(struct board_info *b, unsigned int win)
285{
286 outb_p(FEPWIN|win, (int)b->port + 1);
287}
288
289static inline void pcxem_memwinoff(struct board_info *b, unsigned int win)
290{
291 outb_p(0, (int)b->port + 1);
292}
293
294static inline void pcxem_globalwinon(struct channel *ch)
295{
296 outb_p( FEPWIN, (int)ch->board->port + 1);
297}
298
299static inline void pcxem_rxwinon(struct channel *ch)
300{
301 outb_p(ch->rxwin, (int)ch->board->port + 1);
302}
303
304static inline void pcxem_txwinon(struct channel *ch)
305{
306 outb_p(ch->txwin, (int)ch->board->port + 1);
307}
308
309static inline void pcxem_memoff(struct channel *ch)
310{
311 outb_p(0, (int)ch->board->port + 1);
312}
313
314/* ----------------- Begin pcxe memory window stuff ------------------ */
315
316static inline void pcxe_memwinon(struct board_info *b, unsigned int win)
317{
318 outb_p(FEPWIN | win, (int)b->port + 1);
319}
320
321static inline void pcxe_memwinoff(struct board_info *b, unsigned int win)
322{
323 outb_p(inb((int)b->port) & ~FEPMEM,
324 (int)b->port + 1);
325 outb_p(0, (int)b->port + 1);
326}
327
328static inline void pcxe_globalwinon(struct channel *ch)
329{
330 outb_p( FEPWIN, (int)ch->board->port + 1);
331}
332
333static inline void pcxe_rxwinon(struct channel *ch)
334{
335 outb_p(ch->rxwin, (int)ch->board->port + 1);
336}
337
338static inline void pcxe_txwinon(struct channel *ch)
339{
340 outb_p(ch->txwin, (int)ch->board->port + 1);
341}
342
343static inline void pcxe_memoff(struct channel *ch)
344{
345 outb_p(0, (int)ch->board->port);
346 outb_p(0, (int)ch->board->port + 1);
347}
348
349/* ------------- Begin pc64xe and pcxi memory window stuff -------------- */
350
351static inline void pcxi_memwinon(struct board_info *b, unsigned int win)
352{
353 outb_p(inb((int)b->port) | FEPMEM, (int)b->port);
354}
355
356static inline void pcxi_memwinoff(struct board_info *b, unsigned int win)
357{
358 outb_p(inb((int)b->port) & ~FEPMEM, (int)b->port);
359}
360
361static inline void pcxi_globalwinon(struct channel *ch)
362{
363 outb_p(FEPMEM, (int)ch->board->port);
364}
365
366static inline void pcxi_rxwinon(struct channel *ch)
367{
368 outb_p(FEPMEM, (int)ch->board->port);
369}
370
371static inline void pcxi_txwinon(struct channel *ch)
372{
373 outb_p(FEPMEM, (int)ch->board->port);
374}
375
376static inline void pcxi_memoff(struct channel *ch)
377{
378 outb_p(0, (int)ch->board->port);
379}
380
381static inline void pcxi_assertgwinon(struct channel *ch)
382{
383 epcaassert(inb((int)ch->board->port) & FEPMEM, "Global memory off");
384}
385
386static inline void pcxi_assertmemoff(struct channel *ch)
387{
388 epcaassert(!(inb((int)ch->board->port) & FEPMEM), "Memory on");
389}
390
391
392/* ----------------------------------------------------------------------
393 Not all of the cards need specific memory windowing routines. Some
394 cards (Such as PCI) needs no windowing routines at all. We provide
395 these do nothing routines so that the same code base can be used.
396 The driver will ALWAYS call a windowing routine if it thinks it needs
397 to; regardless of the card. However, dependent on the card the routine
398 may or may not do anything.
399---------------------------------------------------------------------------*/
400
401static inline void dummy_memwinon(struct board_info *b, unsigned int win)
402{
403}
404
405static inline void dummy_memwinoff(struct board_info *b, unsigned int win)
406{
407}
408
409static inline void dummy_globalwinon(struct channel *ch)
410{
411}
412
413static inline void dummy_rxwinon(struct channel *ch)
414{
415}
416
417static inline void dummy_txwinon(struct channel *ch)
418{
419}
420
421static inline void dummy_memoff(struct channel *ch)
422{
423}
424
425static inline void dummy_assertgwinon(struct channel *ch)
426{
427}
428
429static inline void dummy_assertmemoff(struct channel *ch)
430{
431}
432
433/* ----------------- Begin verifyChannel function ----------------------- */
434static inline struct channel *verifyChannel(register struct tty_struct *tty)
435{ /* Begin verifyChannel */
436
437 /* --------------------------------------------------------------------
438 This routine basically provides a sanity check. It insures that
439 the channel returned is within the proper range of addresses as
440 well as properly initialized. If some bogus info gets passed in
441 through tty->driver_data this should catch it.
442 --------------------------------------------------------------------- */
443
444 if (tty)
445 { /* Begin if tty */
446
447 register struct channel *ch = (struct channel *)tty->driver_data;
448
449 if ((ch >= &digi_channels[0]) && (ch < &digi_channels[nbdevs]))
450 {
451 if (ch->magic == EPCA_MAGIC)
452 return ch;
453 }
454
455 } /* End if tty */
456
457 /* Else return a NULL for invalid */
458 return NULL;
459
460} /* End verifyChannel */
461
462/* ------------------ Begin pc_sched_event ------------------------- */
463
464static inline void pc_sched_event(struct channel *ch, int event)
465{ /* Begin pc_sched_event */
466
467
468 /* ----------------------------------------------------------------------
469 We call this to schedule interrupt processing on some event. The
470 kernel sees our request and calls the related routine in OUR driver.
471 -------------------------------------------------------------------------*/
472
473 ch->event |= 1 << event;
474 schedule_work(&ch->tqueue);
475
476
477} /* End pc_sched_event */
478
479/* ------------------ Begin epca_error ------------------------- */
480
481static void epca_error(int line, char *msg)
482{ /* Begin epca_error */
483
484 printk(KERN_ERR "epca_error (Digi): line = %d %s\n",line,msg);
485 return;
486
487} /* End epca_error */
488
489/* ------------------ Begin pc_close ------------------------- */
490static void pc_close(struct tty_struct * tty, struct file * filp)
491{ /* Begin pc_close */
492
493 struct channel *ch;
494 unsigned long flags;
495
496 /* ---------------------------------------------------------
497 verifyChannel returns the channel from the tty struct
498 if it is valid. This serves as a sanity check.
499 ------------------------------------------------------------- */
500
501 if ((ch = verifyChannel(tty)) != NULL)
502 { /* Begin if ch != NULL */
503
504 save_flags(flags);
505 cli();
506
507 if (tty_hung_up_p(filp))
508 {
509 restore_flags(flags);
510 return;
511 }
512
513 /* Check to see if the channel is open more than once */
514 if (ch->count-- > 1)
515 { /* Begin channel is open more than once */
516
517 /* -------------------------------------------------------------
518 Return without doing anything. Someone might still be using
519 the channel.
520 ---------------------------------------------------------------- */
521
522 restore_flags(flags);
523 return;
524 } /* End channel is open more than once */
525
526 /* Port open only once go ahead with shutdown & reset */
527
528 if (ch->count < 0)
529 {
530 ch->count = 0;
531 }
532
533 /* ---------------------------------------------------------------
534 Let the rest of the driver know the channel is being closed.
535 This becomes important if an open is attempted before close
536 is finished.
537 ------------------------------------------------------------------ */
538
539 ch->asyncflags |= ASYNC_CLOSING;
540
541 tty->closing = 1;
542
543 if (ch->asyncflags & ASYNC_INITIALIZED)
544 {
545 /* Setup an event to indicate when the transmit buffer empties */
546 setup_empty_event(tty, ch);
547 tty_wait_until_sent(tty, 3000); /* 30 seconds timeout */
548 }
549
550 if (tty->driver->flush_buffer)
551 tty->driver->flush_buffer(tty);
552
553 tty_ldisc_flush(tty);
554 shutdown(ch);
555 tty->closing = 0;
556 ch->event = 0;
557 ch->tty = NULL;
558
559 if (ch->blocked_open)
560 { /* Begin if blocked_open */
561
562 if (ch->close_delay)
563 {
564 msleep_interruptible(jiffies_to_msecs(ch->close_delay));
565 }
566
567 wake_up_interruptible(&ch->open_wait);
568
569 } /* End if blocked_open */
570
571 ch->asyncflags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_INITIALIZED |
572 ASYNC_CLOSING);
573 wake_up_interruptible(&ch->close_wait);
574
575
576 restore_flags(flags);
577
578 } /* End if ch != NULL */
579
580} /* End pc_close */
581
582/* ------------------ Begin shutdown ------------------------- */
583
584static void shutdown(struct channel *ch)
585{ /* Begin shutdown */
586
587 unsigned long flags;
588 struct tty_struct *tty;
589 volatile struct board_chan *bc;
590
591 if (!(ch->asyncflags & ASYNC_INITIALIZED))
592 return;
593
594 save_flags(flags);
595 cli();
596 globalwinon(ch);
597
598 bc = ch->brdchan;
599
600 /* ------------------------------------------------------------------
601 In order for an event to be generated on the receipt of data the
602 idata flag must be set. Since we are shutting down, this is not
603 necessary clear this flag.
604 --------------------------------------------------------------------- */
605
606 if (bc)
607 bc->idata = 0;
608
609 tty = ch->tty;
610
611 /* ----------------------------------------------------------------
612 If we're a modem control device and HUPCL is on, drop RTS & DTR.
613 ------------------------------------------------------------------ */
614
615 if (tty->termios->c_cflag & HUPCL)
616 {
617 ch->omodem &= ~(ch->m_rts | ch->m_dtr);
618 fepcmd(ch, SETMODEM, 0, ch->m_dtr | ch->m_rts, 10, 1);
619 }
620
621 memoff(ch);
622
623 /* ------------------------------------------------------------------
624 The channel has officialy been closed. The next time it is opened
625 it will have to reinitialized. Set a flag to indicate this.
626 ---------------------------------------------------------------------- */
627
628 /* Prevent future Digi programmed interrupts from coming active */
629
630 ch->asyncflags &= ~ASYNC_INITIALIZED;
631 restore_flags(flags);
632
633} /* End shutdown */
634
635/* ------------------ Begin pc_hangup ------------------------- */
636
637static void pc_hangup(struct tty_struct *tty)
638{ /* Begin pc_hangup */
639
640 struct channel *ch;
641
642 /* ---------------------------------------------------------
643 verifyChannel returns the channel from the tty struct
644 if it is valid. This serves as a sanity check.
645 ------------------------------------------------------------- */
646
647 if ((ch = verifyChannel(tty)) != NULL)
648 { /* Begin if ch != NULL */
649
650 unsigned long flags;
651
652 save_flags(flags);
653 cli();
654 if (tty->driver->flush_buffer)
655 tty->driver->flush_buffer(tty);
656 tty_ldisc_flush(tty);
657 shutdown(ch);
658
659 ch->tty = NULL;
660 ch->event = 0;
661 ch->count = 0;
662 restore_flags(flags);
663 ch->asyncflags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_INITIALIZED);
664 wake_up_interruptible(&ch->open_wait);
665
666 } /* End if ch != NULL */
667
668} /* End pc_hangup */
669
670/* ------------------ Begin pc_write ------------------------- */
671
672static int pc_write(struct tty_struct * tty,
673 const unsigned char *buf, int bytesAvailable)
674{ /* Begin pc_write */
675
676 register unsigned int head, tail;
677 register int dataLen;
678 register int size;
679 register int amountCopied;
680
681
682 struct channel *ch;
683 unsigned long flags;
684 int remain;
685 volatile struct board_chan *bc;
686
687
688 /* ----------------------------------------------------------------
689 pc_write is primarily called directly by the kernel routine
690 tty_write (Though it can also be called by put_char) found in
691 tty_io.c. pc_write is passed a line discipline buffer where
692 the data to be written out is stored. The line discipline
693 implementation itself is done at the kernel level and is not
694 brought into the driver.
695 ------------------------------------------------------------------- */
696
697 /* ---------------------------------------------------------
698 verifyChannel returns the channel from the tty struct
699 if it is valid. This serves as a sanity check.
700 ------------------------------------------------------------- */
701
702 if ((ch = verifyChannel(tty)) == NULL)
703 return 0;
704
705 /* Make a pointer to the channel data structure found on the board. */
706
707 bc = ch->brdchan;
708 size = ch->txbufsize;
709
710 amountCopied = 0;
711 save_flags(flags);
712 cli();
713
714 globalwinon(ch);
715
716 head = bc->tin & (size - 1);
717 tail = bc->tout;
718
719 if (tail != bc->tout)
720 tail = bc->tout;
721 tail &= (size - 1);
722
723 /* If head >= tail, head has not wrapped around. */
724 if (head >= tail)
725 { /* Begin head has not wrapped */
726
727 /* ---------------------------------------------------------------
728 remain (much like dataLen above) represents the total amount of
729 space available on the card for data. Here dataLen represents
730 the space existing between the head pointer and the end of
731 buffer. This is important because a memcpy cannot be told to
732 automatically wrap around when it hits the buffer end.
733 ------------------------------------------------------------------ */
734
735 dataLen = size - head;
736 remain = size - (head - tail) - 1;
737
738 } /* End head has not wrapped */
739 else
740 { /* Begin head has wrapped around */
741
742 remain = tail - head - 1;
743 dataLen = remain;
744
745 } /* End head has wrapped around */
746
747 /* -------------------------------------------------------------------
748 Check the space on the card. If we have more data than
749 space; reduce the amount of data to fit the space.
750 ---------------------------------------------------------------------- */
751
752 bytesAvailable = min(remain, bytesAvailable);
753
754 txwinon(ch);
755 while (bytesAvailable > 0)
756 { /* Begin while there is data to copy onto card */
757
758 /* -----------------------------------------------------------------
759 If head is not wrapped, the below will make sure the first
760 data copy fills to the end of card buffer.
761 ------------------------------------------------------------------- */
762
763 dataLen = min(bytesAvailable, dataLen);
764 memcpy(ch->txptr + head, buf, dataLen);
765 buf += dataLen;
766 head += dataLen;
767 amountCopied += dataLen;
768 bytesAvailable -= dataLen;
769
770 if (head >= size)
771 {
772 head = 0;
773 dataLen = tail;
774 }
775
776 } /* End while there is data to copy onto card */
777
778 ch->statusflags |= TXBUSY;
779 globalwinon(ch);
780 bc->tin = head;
781
782 if ((ch->statusflags & LOWWAIT) == 0)
783 {
784 ch->statusflags |= LOWWAIT;
785 bc->ilow = 1;
786 }
787 memoff(ch);
788 restore_flags(flags);
789
790 return(amountCopied);
791
792} /* End pc_write */
793
794/* ------------------ Begin pc_put_char ------------------------- */
795
796static void pc_put_char(struct tty_struct *tty, unsigned char c)
797{ /* Begin pc_put_char */
798
799
800 pc_write(tty, &c, 1);
801 return;
802
803} /* End pc_put_char */
804
805/* ------------------ Begin pc_write_room ------------------------- */
806
807static int pc_write_room(struct tty_struct *tty)
808{ /* Begin pc_write_room */
809
810 int remain;
811 struct channel *ch;
812 unsigned long flags;
813 unsigned int head, tail;
814 volatile struct board_chan *bc;
815
816 remain = 0;
817
818 /* ---------------------------------------------------------
819 verifyChannel returns the channel from the tty struct
820 if it is valid. This serves as a sanity check.
821 ------------------------------------------------------------- */
822
823 if ((ch = verifyChannel(tty)) != NULL)
824 {
825 save_flags(flags);
826 cli();
827 globalwinon(ch);
828
829 bc = ch->brdchan;
830 head = bc->tin & (ch->txbufsize - 1);
831 tail = bc->tout;
832
833 if (tail != bc->tout)
834 tail = bc->tout;
835 /* Wrap tail if necessary */
836 tail &= (ch->txbufsize - 1);
837
838 if ((remain = tail - head - 1) < 0 )
839 remain += ch->txbufsize;
840
841 if (remain && (ch->statusflags & LOWWAIT) == 0)
842 {
843 ch->statusflags |= LOWWAIT;
844 bc->ilow = 1;
845 }
846 memoff(ch);
847 restore_flags(flags);
848 }
849
850 /* Return how much room is left on card */
851 return remain;
852
853} /* End pc_write_room */
854
855/* ------------------ Begin pc_chars_in_buffer ---------------------- */
856
857static int pc_chars_in_buffer(struct tty_struct *tty)
858{ /* Begin pc_chars_in_buffer */
859
860 int chars;
861 unsigned int ctail, head, tail;
862 int remain;
863 unsigned long flags;
864 struct channel *ch;
865 volatile struct board_chan *bc;
866
867
868 /* ---------------------------------------------------------
869 verifyChannel returns the channel from the tty struct
870 if it is valid. This serves as a sanity check.
871 ------------------------------------------------------------- */
872
873 if ((ch = verifyChannel(tty)) == NULL)
874 return(0);
875
876 save_flags(flags);
877 cli();
878 globalwinon(ch);
879
880 bc = ch->brdchan;
881 tail = bc->tout;
882 head = bc->tin;
883 ctail = ch->mailbox->cout;
884
885 if (tail == head && ch->mailbox->cin == ctail && bc->tbusy == 0)
886 chars = 0;
887 else
888 { /* Begin if some space on the card has been used */
889
890 head = bc->tin & (ch->txbufsize - 1);
891 tail &= (ch->txbufsize - 1);
892
893 /* --------------------------------------------------------------
894 The logic here is basically opposite of the above pc_write_room
895 here we are finding the amount of bytes in the buffer filled.
896 Not the amount of bytes empty.
897 ------------------------------------------------------------------- */
898
899 if ((remain = tail - head - 1) < 0 )
900 remain += ch->txbufsize;
901
902 chars = (int)(ch->txbufsize - remain);
903
904 /* -------------------------------------------------------------
905 Make it possible to wakeup anything waiting for output
906 in tty_ioctl.c, etc.
907
908 If not already set. Setup an event to indicate when the
909 transmit buffer empties
910 ----------------------------------------------------------------- */
911
912 if (!(ch->statusflags & EMPTYWAIT))
913 setup_empty_event(tty,ch);
914
915 } /* End if some space on the card has been used */
916
917 memoff(ch);
918 restore_flags(flags);
919
920 /* Return number of characters residing on card. */
921 return(chars);
922
923} /* End pc_chars_in_buffer */
924
925/* ------------------ Begin pc_flush_buffer ---------------------- */
926
927static void pc_flush_buffer(struct tty_struct *tty)
928{ /* Begin pc_flush_buffer */
929
930 unsigned int tail;
931 unsigned long flags;
932 struct channel *ch;
933 volatile struct board_chan *bc;
934
935
936 /* ---------------------------------------------------------
937 verifyChannel returns the channel from the tty struct
938 if it is valid. This serves as a sanity check.
939 ------------------------------------------------------------- */
940
941 if ((ch = verifyChannel(tty)) == NULL)
942 return;
943
944 save_flags(flags);
945 cli();
946
947 globalwinon(ch);
948
949 bc = ch->brdchan;
950 tail = bc->tout;
951
952 /* Have FEP move tout pointer; effectively flushing transmit buffer */
953
954 fepcmd(ch, STOUT, (unsigned) tail, 0, 0, 0);
955
956 memoff(ch);
957 restore_flags(flags);
958
959 wake_up_interruptible(&tty->write_wait);
960 tty_wakeup(tty);
961
962} /* End pc_flush_buffer */
963
964/* ------------------ Begin pc_flush_chars ---------------------- */
965
966static void pc_flush_chars(struct tty_struct *tty)
967{ /* Begin pc_flush_chars */
968
969 struct channel * ch;
970
971 /* ---------------------------------------------------------
972 verifyChannel returns the channel from the tty struct
973 if it is valid. This serves as a sanity check.
974 ------------------------------------------------------------- */
975
976 if ((ch = verifyChannel(tty)) != NULL)
977 {
978 unsigned long flags;
979
980 save_flags(flags);
981 cli();
982
983 /* ----------------------------------------------------------------
984 If not already set and the transmitter is busy setup an event
985 to indicate when the transmit empties.
986 ------------------------------------------------------------------- */
987
988 if ((ch->statusflags & TXBUSY) && !(ch->statusflags & EMPTYWAIT))
989 setup_empty_event(tty,ch);
990
991 restore_flags(flags);
992 }
993
994} /* End pc_flush_chars */
995
996/* ------------------ Begin block_til_ready ---------------------- */
997
998static int block_til_ready(struct tty_struct *tty,
999 struct file *filp, struct channel *ch)
1000{ /* Begin block_til_ready */
1001
1002 DECLARE_WAITQUEUE(wait,current);
1003 int retval, do_clocal = 0;
1004 unsigned long flags;
1005
1006
1007 if (tty_hung_up_p(filp))
1008 {
1009 if (ch->asyncflags & ASYNC_HUP_NOTIFY)
1010 retval = -EAGAIN;
1011 else
1012 retval = -ERESTARTSYS;
1013 return(retval);
1014 }
1015
1016 /* -----------------------------------------------------------------
1017 If the device is in the middle of being closed, then block
1018 until it's done, and then try again.
1019 -------------------------------------------------------------------- */
1020 if (ch->asyncflags & ASYNC_CLOSING)
1021 {
1022 interruptible_sleep_on(&ch->close_wait);
1023
1024 if (ch->asyncflags & ASYNC_HUP_NOTIFY)
1025 return -EAGAIN;
1026 else
1027 return -ERESTARTSYS;
1028 }
1029
1030 if (filp->f_flags & O_NONBLOCK)
1031 {
1032 /* -----------------------------------------------------------------
1033 If non-blocking mode is set, then make the check up front
1034 and then exit.
1035 -------------------------------------------------------------------- */
1036
1037 ch->asyncflags |= ASYNC_NORMAL_ACTIVE;
1038
1039 return 0;
1040 }
1041
1042
1043 if (tty->termios->c_cflag & CLOCAL)
1044 do_clocal = 1;
1045
1046 /* Block waiting for the carrier detect and the line to become free */
1047
1048 retval = 0;
1049 add_wait_queue(&ch->open_wait, &wait);
1050 save_flags(flags);
1051 cli();
1052
1053
1054 /* We dec count so that pc_close will know when to free things */
1055 if (!tty_hung_up_p(filp))
1056 ch->count--;
1057
1058 restore_flags(flags);
1059
1060 ch->blocked_open++;
1061
1062 while(1)
1063 { /* Begin forever while */
1064
1065 set_current_state(TASK_INTERRUPTIBLE);
1066
1067 if (tty_hung_up_p(filp) ||
1068 !(ch->asyncflags & ASYNC_INITIALIZED))
1069 {
1070 if (ch->asyncflags & ASYNC_HUP_NOTIFY)
1071 retval = -EAGAIN;
1072 else
1073 retval = -ERESTARTSYS;
1074 break;
1075 }
1076
1077 if (!(ch->asyncflags & ASYNC_CLOSING) &&
1078 (do_clocal || (ch->imodem & ch->dcd)))
1079 break;
1080
1081 if (signal_pending(current))
1082 {
1083 retval = -ERESTARTSYS;
1084 break;
1085 }
1086
1087 /* ---------------------------------------------------------------
1088 Allow someone else to be scheduled. We will occasionally go
1089 through this loop until one of the above conditions change.
1090 The below schedule call will allow other processes to enter and
1091 prevent this loop from hogging the cpu.
1092 ------------------------------------------------------------------ */
1093 schedule();
1094
1095 } /* End forever while */
1096
1097 current->state = TASK_RUNNING;
1098 remove_wait_queue(&ch->open_wait, &wait);
1099 cli();
1100 if (!tty_hung_up_p(filp))
1101 ch->count++;
1102 restore_flags(flags);
1103
1104 ch->blocked_open--;
1105
1106 if (retval)
1107 return retval;
1108
1109 ch->asyncflags |= ASYNC_NORMAL_ACTIVE;
1110
1111 return 0;
1112
1113} /* End block_til_ready */
1114
1115/* ------------------ Begin pc_open ---------------------- */
1116
1117static int pc_open(struct tty_struct *tty, struct file * filp)
1118{ /* Begin pc_open */
1119
1120 struct channel *ch;
1121 unsigned long flags;
1122 int line, retval, boardnum;
1123 volatile struct board_chan *bc;
1124 volatile unsigned int head;
1125
1126 line = tty->index;
1127 if (line < 0 || line >= nbdevs)
1128 {
1129 printk(KERN_ERR "<Error> - pc_open : line out of range in pc_open\n");
1130 tty->driver_data = NULL;
1131 return(-ENODEV);
1132 }
1133
1134
1135 ch = &digi_channels[line];
1136 boardnum = ch->boardnum;
1137
1138 /* Check status of board configured in system. */
1139
1140 /* -----------------------------------------------------------------
1141 I check to see if the epca_setup routine detected an user error.
1142 It might be better to put this in pc_init, but for the moment it
1143 goes here.
1144 ---------------------------------------------------------------------- */
1145
1146 if (invalid_lilo_config)
1147 {
1148 if (setup_error_code & INVALID_BOARD_TYPE)
1149 printk(KERN_ERR "<Error> - pc_open: Invalid board type specified in LILO command\n");
1150
1151 if (setup_error_code & INVALID_NUM_PORTS)
1152 printk(KERN_ERR "<Error> - pc_open: Invalid number of ports specified in LILO command\n");
1153
1154 if (setup_error_code & INVALID_MEM_BASE)
1155 printk(KERN_ERR "<Error> - pc_open: Invalid board memory address specified in LILO command\n");
1156
1157 if (setup_error_code & INVALID_PORT_BASE)
1158 printk(KERN_ERR "<Error> - pc_open: Invalid board port address specified in LILO command\n");
1159
1160 if (setup_error_code & INVALID_BOARD_STATUS)
1161 printk(KERN_ERR "<Error> - pc_open: Invalid board status specified in LILO command\n");
1162
1163 if (setup_error_code & INVALID_ALTPIN)
1164 printk(KERN_ERR "<Error> - pc_open: Invalid board altpin specified in LILO command\n");
1165
1166 tty->driver_data = NULL; /* Mark this device as 'down' */
1167 return(-ENODEV);
1168 }
1169
1170 if ((boardnum >= num_cards) || (boards[boardnum].status == DISABLED))
1171 {
1172 tty->driver_data = NULL; /* Mark this device as 'down' */
1173 return(-ENODEV);
1174 }
1175
1176 if (( bc = ch->brdchan) == 0)
1177 {
1178 tty->driver_data = NULL;
1179 return(-ENODEV);
1180 }
1181
1182 /* ------------------------------------------------------------------
1183 Every time a channel is opened, increment a counter. This is
1184 necessary because we do not wish to flush and shutdown the channel
1185 until the last app holding the channel open, closes it.
1186 --------------------------------------------------------------------- */
1187
1188 ch->count++;
1189
1190 /* ----------------------------------------------------------------
1191 Set a kernel structures pointer to our local channel
1192 structure. This way we can get to it when passed only
1193 a tty struct.
1194 ------------------------------------------------------------------ */
1195
1196 tty->driver_data = ch;
1197
1198 /* ----------------------------------------------------------------
1199 If this is the first time the channel has been opened, initialize
1200 the tty->termios struct otherwise let pc_close handle it.
1201 -------------------------------------------------------------------- */
1202
1203 save_flags(flags);
1204 cli();
1205
1206 globalwinon(ch);
1207 ch->statusflags = 0;
1208
1209 /* Save boards current modem status */
1210 ch->imodem = bc->mstat;
1211
1212 /* ----------------------------------------------------------------
1213 Set receive head and tail ptrs to each other. This indicates
1214 no data available to read.
1215 ----------------------------------------------------------------- */
1216 head = bc->rin;
1217 bc->rout = head;
1218
1219 /* Set the channels associated tty structure */
1220 ch->tty = tty;
1221
1222 /* -----------------------------------------------------------------
1223 The below routine generally sets up parity, baud, flow control
1224 issues, etc.... It effect both control flags and input flags.
1225 -------------------------------------------------------------------- */
1226 epcaparam(tty,ch);
1227
1228 ch->asyncflags |= ASYNC_INITIALIZED;
1229 memoff(ch);
1230
1231 restore_flags(flags);
1232
1233 retval = block_til_ready(tty, filp, ch);
1234 if (retval)
1235 {
1236 return retval;
1237 }
1238
1239 /* -------------------------------------------------------------
1240 Set this again in case a hangup set it to zero while this
1241 open() was waiting for the line...
1242 --------------------------------------------------------------- */
1243 ch->tty = tty;
1244
1245 save_flags(flags);
1246 cli();
1247 globalwinon(ch);
1248
1249 /* Enable Digi Data events */
1250 bc->idata = 1;
1251
1252 memoff(ch);
1253 restore_flags(flags);
1254
1255 return 0;
1256
1257} /* End pc_open */
1258
1259#ifdef MODULE
1260static int __init epca_module_init(void)
1261{ /* Begin init_module */
1262
1263 unsigned long flags;
1264
1265 save_flags(flags);
1266 cli();
1267
1268 pc_init();
1269
1270 restore_flags(flags);
1271
1272 return(0);
1273}
1274
1275module_init(epca_module_init);
1276#endif
1277
1278#ifdef ENABLE_PCI
1279static struct pci_driver epca_driver;
1280#endif
1281
1282#ifdef MODULE
1283/* -------------------- Begin cleanup_module ---------------------- */
1284
1285static void __exit epca_module_exit(void)
1286{
1287
1288 int count, crd;
1289 struct board_info *bd;
1290 struct channel *ch;
1291 unsigned long flags;
1292
1293 del_timer_sync(&epca_timer);
1294
1295 save_flags(flags);
1296 cli();
1297
1298 if ((tty_unregister_driver(pc_driver)) ||
1299 (tty_unregister_driver(pc_info)))
1300 {
1301 printk(KERN_WARNING "<Error> - DIGI : cleanup_module failed to un-register tty driver\n");
1302 restore_flags(flags);
1303 return;
1304 }
1305 put_tty_driver(pc_driver);
1306 put_tty_driver(pc_info);
1307
1308 for (crd = 0; crd < num_cards; crd++)
1309 { /* Begin for each card */
1310
1311 bd = &boards[crd];
1312
1313 if (!bd)
1314 { /* Begin sanity check */
1315 printk(KERN_ERR "<Error> - Digi : cleanup_module failed\n");
1316 return;
1317 } /* End sanity check */
1318
1319 ch = card_ptr[crd];
1320
1321 for (count = 0; count < bd->numports; count++, ch++)
1322 { /* Begin for each port */
1323
1324 if (ch)
1325 {
1326 if (ch->tty)
1327 tty_hangup(ch->tty);
1328 kfree(ch->tmp_buf);
1329 }
1330
1331 } /* End for each port */
1332 } /* End for each card */
1333
1334#ifdef ENABLE_PCI
1335 pci_unregister_driver (&epca_driver);
1336#endif
1337
1338 restore_flags(flags);
1339
1340}
1341module_exit(epca_module_exit);
1342#endif /* MODULE */
1343
1344static struct tty_operations pc_ops = {
1345 .open = pc_open,
1346 .close = pc_close,
1347 .write = pc_write,
1348 .write_room = pc_write_room,
1349 .flush_buffer = pc_flush_buffer,
1350 .chars_in_buffer = pc_chars_in_buffer,
1351 .flush_chars = pc_flush_chars,
1352 .put_char = pc_put_char,
1353 .ioctl = pc_ioctl,
1354 .set_termios = pc_set_termios,
1355 .stop = pc_stop,
1356 .start = pc_start,
1357 .throttle = pc_throttle,
1358 .unthrottle = pc_unthrottle,
1359 .hangup = pc_hangup,
1360};
1361
1362static int info_open(struct tty_struct *tty, struct file * filp)
1363{
1364 return 0;
1365}
1366
1367static struct tty_operations info_ops = {
1368 .open = info_open,
1369 .ioctl = info_ioctl,
1370};
1371
1372/* ------------------ Begin pc_init ---------------------- */
1373
1374int __init pc_init(void)
1375{ /* Begin pc_init */
1376
1377 /* ----------------------------------------------------------------
1378 pc_init is called by the operating system during boot up prior to
1379 any open calls being made. In the older versions of Linux (Prior
1380 to 2.0.0) an entry is made into tty_io.c. A pointer to the last
1381 memory location (from kernel space) used (kmem_start) is passed
1382 to pc_init. It is pc_inits responsibility to modify this value
1383 for any memory that the Digi driver might need and then return
1384 this value to the operating system. For example if the driver
1385 wishes to allocate 1K of kernel memory, pc_init would return
1386 (kmem_start + 1024). This memory (Between kmem_start and kmem_start
1387 + 1024) would then be available for use exclusively by the driver.
1388 In this case our driver does not allocate any of this kernel
1389 memory.
1390 ------------------------------------------------------------------*/
1391
1392 ulong flags;
1393 int crd;
1394 struct board_info *bd;
1395 unsigned char board_id = 0;
1396
1397#ifdef ENABLE_PCI
1398 int pci_boards_found, pci_count;
1399
1400 pci_count = 0;
1401#endif /* ENABLE_PCI */
1402
1403 pc_driver = alloc_tty_driver(MAX_ALLOC);
1404 if (!pc_driver)
1405 return -ENOMEM;
1406
1407 pc_info = alloc_tty_driver(MAX_ALLOC);
1408 if (!pc_info) {
1409 put_tty_driver(pc_driver);
1410 return -ENOMEM;
1411 }
1412
1413 /* -----------------------------------------------------------------------
1414 If epca_setup has not been ran by LILO set num_cards to defaults; copy
1415 board structure defined by digiConfig into drivers board structure.
1416 Note : If LILO has ran epca_setup then epca_setup will handle defining
1417 num_cards as well as copying the data into the board structure.
1418 -------------------------------------------------------------------------- */
1419 if (!liloconfig)
1420 { /* Begin driver has been configured via. epcaconfig */
1421
1422 nbdevs = NBDEVS;
1423 num_cards = NUMCARDS;
1424 memcpy((void *)&boards, (void *)&static_boards,
1425 (sizeof(struct board_info) * NUMCARDS));
1426 } /* End driver has been configured via. epcaconfig */
1427
1428 /* -----------------------------------------------------------------
1429 Note : If lilo was used to configure the driver and the
1430 ignore epcaconfig option was choosen (digiepca=2) then
1431 nbdevs and num_cards will equal 0 at this point. This is
1432 okay; PCI cards will still be picked up if detected.
1433 --------------------------------------------------------------------- */
1434
1435 /* -----------------------------------------------------------
1436 Set up interrupt, we will worry about memory allocation in
1437 post_fep_init.
1438 --------------------------------------------------------------- */
1439
1440
1441 printk(KERN_INFO "DIGI epca driver version %s loaded.\n",VERSION);
1442
1443#ifdef ENABLE_PCI
1444
1445 /* ------------------------------------------------------------------
1446 NOTE : This code assumes that the number of ports found in
1447 the boards array is correct. This could be wrong if
1448 the card in question is PCI (And therefore has no ports
1449 entry in the boards structure.) The rest of the
1450 information will be valid for PCI because the beginning
1451 of pc_init scans for PCI and determines i/o and base
1452 memory addresses. I am not sure if it is possible to
1453 read the number of ports supported by the card prior to
1454 it being booted (Since that is the state it is in when
1455 pc_init is run). Because it is not possible to query the
1456 number of supported ports until after the card has booted;
1457 we are required to calculate the card_ptrs as the card is
1458 is initialized (Inside post_fep_init). The negative thing
1459 about this approach is that digiDload's call to GET_INFO
1460 will have a bad port value. (Since this is called prior
1461 to post_fep_init.)
1462
1463 --------------------------------------------------------------------- */
1464
1465 pci_boards_found = 0;
1466 if(num_cards < MAXBOARDS)
1467 pci_boards_found += init_PCI();
1468 num_cards += pci_boards_found;
1469
1470#endif /* ENABLE_PCI */
1471
1472 pc_driver->owner = THIS_MODULE;
1473 pc_driver->name = "ttyD";
1474 pc_driver->devfs_name = "tts/D";
1475 pc_driver->major = DIGI_MAJOR;
1476 pc_driver->minor_start = 0;
1477 pc_driver->type = TTY_DRIVER_TYPE_SERIAL;
1478 pc_driver->subtype = SERIAL_TYPE_NORMAL;
1479 pc_driver->init_termios = tty_std_termios;
1480 pc_driver->init_termios.c_iflag = 0;
1481 pc_driver->init_termios.c_oflag = 0;
1482 pc_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
1483 pc_driver->init_termios.c_lflag = 0;
1484 pc_driver->flags = TTY_DRIVER_REAL_RAW;
1485 tty_set_operations(pc_driver, &pc_ops);
1486
1487 pc_info->owner = THIS_MODULE;
1488 pc_info->name = "digi_ctl";
1489 pc_info->major = DIGIINFOMAJOR;
1490 pc_info->minor_start = 0;
1491 pc_info->type = TTY_DRIVER_TYPE_SERIAL;
1492 pc_info->subtype = SERIAL_TYPE_INFO;
1493 pc_info->init_termios = tty_std_termios;
1494 pc_info->init_termios.c_iflag = 0;
1495 pc_info->init_termios.c_oflag = 0;
1496 pc_info->init_termios.c_lflag = 0;
1497 pc_info->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL;
1498 pc_info->flags = TTY_DRIVER_REAL_RAW;
1499 tty_set_operations(pc_info, &info_ops);
1500
1501
1502 save_flags(flags);
1503 cli();
1504
1505 for (crd = 0; crd < num_cards; crd++)
1506 { /* Begin for each card */
1507
1508 /* ------------------------------------------------------------------
1509 This is where the appropriate memory handlers for the hardware is
1510 set. Everything at runtime blindly jumps through these vectors.
1511 ---------------------------------------------------------------------- */
1512
1513 /* defined in epcaconfig.h */
1514 bd = &boards[crd];
1515
1516 switch (bd->type)
1517 { /* Begin switch on bd->type {board type} */
1518 case PCXEM:
1519 case EISAXEM:
1520 bd->memwinon = pcxem_memwinon ;
1521 bd->memwinoff = pcxem_memwinoff ;
1522 bd->globalwinon = pcxem_globalwinon ;
1523 bd->txwinon = pcxem_txwinon ;
1524 bd->rxwinon = pcxem_rxwinon ;
1525 bd->memoff = pcxem_memoff ;
1526 bd->assertgwinon = dummy_assertgwinon;
1527 bd->assertmemoff = dummy_assertmemoff;
1528 break;
1529
1530 case PCIXEM:
1531 case PCIXRJ:
1532 case PCIXR:
1533 bd->memwinon = dummy_memwinon;
1534 bd->memwinoff = dummy_memwinoff;
1535 bd->globalwinon = dummy_globalwinon;
1536 bd->txwinon = dummy_txwinon;
1537 bd->rxwinon = dummy_rxwinon;
1538 bd->memoff = dummy_memoff;
1539 bd->assertgwinon = dummy_assertgwinon;
1540 bd->assertmemoff = dummy_assertmemoff;
1541 break;
1542
1543 case PCXE:
1544 case PCXEVE:
1545
1546 bd->memwinon = pcxe_memwinon;
1547 bd->memwinoff = pcxe_memwinoff;
1548 bd->globalwinon = pcxe_globalwinon;
1549 bd->txwinon = pcxe_txwinon;
1550 bd->rxwinon = pcxe_rxwinon;
1551 bd->memoff = pcxe_memoff;
1552 bd->assertgwinon = dummy_assertgwinon;
1553 bd->assertmemoff = dummy_assertmemoff;
1554 break;
1555
1556 case PCXI:
1557 case PC64XE:
1558
1559 bd->memwinon = pcxi_memwinon;
1560 bd->memwinoff = pcxi_memwinoff;
1561 bd->globalwinon = pcxi_globalwinon;
1562 bd->txwinon = pcxi_txwinon;
1563 bd->rxwinon = pcxi_rxwinon;
1564 bd->memoff = pcxi_memoff;
1565 bd->assertgwinon = pcxi_assertgwinon;
1566 bd->assertmemoff = pcxi_assertmemoff;
1567 break;
1568
1569 default:
1570 break;
1571
1572 } /* End switch on bd->type */
1573
1574 /* ---------------------------------------------------------------
1575 Some cards need a memory segment to be defined for use in
1576 transmit and receive windowing operations. These boards
1577 are listed in the below switch. In the case of the XI the
1578 amount of memory on the board is variable so the memory_seg
1579 is also variable. This code determines what they segment
1580 should be.
1581 ----------------------------------------------------------------- */
1582
1583 switch (bd->type)
1584 { /* Begin switch on bd->type {board type} */
1585
1586 case PCXE:
1587 case PCXEVE:
1588 case PC64XE:
1589 bd->memory_seg = 0xf000;
1590 break;
1591
1592 case PCXI:
1593 board_id = inb((int)bd->port);
1594 if ((board_id & 0x1) == 0x1)
1595 { /* Begin it's an XI card */
1596
1597 /* Is it a 64K board */
1598 if ((board_id & 0x30) == 0)
1599 bd->memory_seg = 0xf000;
1600
1601 /* Is it a 128K board */
1602 if ((board_id & 0x30) == 0x10)
1603 bd->memory_seg = 0xe000;
1604
1605 /* Is is a 256K board */
1606 if ((board_id & 0x30) == 0x20)
1607 bd->memory_seg = 0xc000;
1608
1609 /* Is it a 512K board */
1610 if ((board_id & 0x30) == 0x30)
1611 bd->memory_seg = 0x8000;
1612
1613 } /* End it is an XI card */
1614 else
1615 {
1616 printk(KERN_ERR "<Error> - Board at 0x%x doesn't appear to be an XI\n",(int)bd->port);
1617 }
1618 break;
1619
1620 } /* End switch on bd->type */
1621
1622 } /* End for each card */
1623
1624 if (tty_register_driver(pc_driver))
1625 panic("Couldn't register Digi PC/ driver");
1626
1627 if (tty_register_driver(pc_info))
1628 panic("Couldn't register Digi PC/ info ");
1629
1630 /* -------------------------------------------------------------------
1631 Start up the poller to check for events on all enabled boards
1632 ---------------------------------------------------------------------- */
1633
1634 init_timer(&epca_timer);
1635 epca_timer.function = epcapoll;
1636 mod_timer(&epca_timer, jiffies + HZ/25);
1637
1638 restore_flags(flags);
1639
1640 return 0;
1641
1642} /* End pc_init */
1643
1644/* ------------------ Begin post_fep_init ---------------------- */
1645
1646static void post_fep_init(unsigned int crd)
1647{ /* Begin post_fep_init */
1648
1649 int i;
1650 unchar *memaddr;
1651 volatile struct global_data *gd;
1652 struct board_info *bd;
1653 volatile struct board_chan *bc;
1654 struct channel *ch;
1655 int shrinkmem = 0, lowwater ;
1656
1657 /* -------------------------------------------------------------
1658 This call is made by the user via. the ioctl call DIGI_INIT.
1659 It is responsible for setting up all the card specific stuff.
1660 ---------------------------------------------------------------- */
1661 bd = &boards[crd];
1662
1663 /* -----------------------------------------------------------------
1664 If this is a PCI board, get the port info. Remember PCI cards
1665 do not have entries into the epcaconfig.h file, so we can't get
1666 the number of ports from it. Unfortunetly, this means that anyone
1667 doing a DIGI_GETINFO before the board has booted will get an invalid
1668 number of ports returned (It should return 0). Calls to DIGI_GETINFO
1669 after DIGI_INIT has been called will return the proper values.
1670 ------------------------------------------------------------------- */
1671
1672 if (bd->type >= PCIXEM) /* If the board in question is PCI */
1673 { /* Begin get PCI number of ports */
1674
1675 /* --------------------------------------------------------------------
1676 Below we use XEMPORTS as a memory offset regardless of which PCI
1677 card it is. This is because all of the supported PCI cards have
1678 the same memory offset for the channel data. This will have to be
1679 changed if we ever develop a PCI/XE card. NOTE : The FEP manual
1680 states that the port offset is 0xC22 as opposed to 0xC02. This is
1681 only true for PC/XE, and PC/XI cards; not for the XEM, or CX series.
1682 On the PCI cards the number of ports is determined by reading a
1683 ID PROM located in the box attached to the card. The card can then
1684 determine the index the id to determine the number of ports available.
1685 (FYI - The id should be located at 0x1ac (And may use up to 4 bytes
1686 if the box in question is a XEM or CX)).
1687 ------------------------------------------------------------------------ */
1688
1689 bd->numports = (unsigned short)*(unsigned char *)bus_to_virt((unsigned long)
1690 (bd->re_map_membase + XEMPORTS));
1691
1692
1693 epcaassert(bd->numports <= 64,"PCI returned a invalid number of ports");
1694 nbdevs += (bd->numports);
1695
1696 } /* End get PCI number of ports */
1697
1698 if (crd != 0)
1699 card_ptr[crd] = card_ptr[crd-1] + boards[crd-1].numports;
1700 else
1701 card_ptr[crd] = &digi_channels[crd]; /* <- For card 0 only */
1702
1703 ch = card_ptr[crd];
1704
1705
1706 epcaassert(ch <= &digi_channels[nbdevs - 1], "ch out of range");
1707
1708 memaddr = (unchar *)bd->re_map_membase;
1709
1710 /*
1711 The below command is necessary because newer kernels (2.1.x and
1712 up) do not have a 1:1 virtual to physical mapping. The below
1713 call adjust for that.
1714 */
1715
1716 memaddr = (unsigned char *)bus_to_virt((unsigned long)memaddr);
1717
1718 /* -----------------------------------------------------------------
1719 The below assignment will set bc to point at the BEGINING of
1720 the cards channel structures. For 1 card there will be between
1721 8 and 64 of these structures.
1722 -------------------------------------------------------------------- */
1723
1724 bc = (volatile struct board_chan *)((ulong)memaddr + CHANSTRUCT);
1725
1726 /* -------------------------------------------------------------------
1727 The below assignment will set gd to point at the BEGINING of
1728 global memory address 0xc00. The first data in that global
1729 memory actually starts at address 0xc1a. The command in
1730 pointer begins at 0xd10.
1731 ---------------------------------------------------------------------- */
1732
1733 gd = (volatile struct global_data *)((ulong)memaddr + GLOBAL);
1734
1735 /* --------------------------------------------------------------------
1736 XEPORTS (address 0xc22) points at the number of channels the
1737 card supports. (For 64XE, XI, XEM, and XR use 0xc02)
1738 ----------------------------------------------------------------------- */
1739
1740 if (((bd->type == PCXEVE) | (bd->type == PCXE)) &&
1741 (*(ushort *)((ulong)memaddr + XEPORTS) < 3))
1742 shrinkmem = 1;
1743 if (bd->type < PCIXEM)
1744 if (!request_region((int)bd->port, 4, board_desc[bd->type]))
1745 return;
1746
1747 memwinon(bd, 0);
1748
1749 /* --------------------------------------------------------------------
1750 Remember ch is the main drivers channels structure, while bc is
1751 the cards channel structure.
1752 ------------------------------------------------------------------------ */
1753
1754 /* For every port on the card do ..... */
1755
1756 for (i = 0; i < bd->numports; i++, ch++, bc++)
1757 { /* Begin for each port */
1758
1759 ch->brdchan = bc;
1760 ch->mailbox = gd;
1761 INIT_WORK(&ch->tqueue, do_softint, ch);
1762 ch->board = &boards[crd];
1763
1764 switch (bd->type)
1765 { /* Begin switch bd->type */
1766
1767 /* ----------------------------------------------------------------
1768 Since some of the boards use different bitmaps for their
1769 control signals we cannot hard code these values and retain
1770 portability. We virtualize this data here.
1771 ------------------------------------------------------------------- */
1772 case EISAXEM:
1773 case PCXEM:
1774 case PCIXEM:
1775 case PCIXRJ:
1776 case PCIXR:
1777 ch->m_rts = 0x02 ;
1778 ch->m_dcd = 0x80 ;
1779 ch->m_dsr = 0x20 ;
1780 ch->m_cts = 0x10 ;
1781 ch->m_ri = 0x40 ;
1782 ch->m_dtr = 0x01 ;
1783 break;
1784
1785 case PCXE:
1786 case PCXEVE:
1787 case PCXI:
1788 case PC64XE:
1789 ch->m_rts = 0x02 ;
1790 ch->m_dcd = 0x08 ;
1791 ch->m_dsr = 0x10 ;
1792 ch->m_cts = 0x20 ;
1793 ch->m_ri = 0x40 ;
1794 ch->m_dtr = 0x80 ;
1795 break;
1796
1797 } /* End switch bd->type */
1798
1799 if (boards[crd].altpin)
1800 {
1801 ch->dsr = ch->m_dcd;
1802 ch->dcd = ch->m_dsr;
1803 ch->digiext.digi_flags |= DIGI_ALTPIN;
1804 }
1805 else
1806 {
1807 ch->dcd = ch->m_dcd;
1808 ch->dsr = ch->m_dsr;
1809 }
1810
1811 ch->boardnum = crd;
1812 ch->channelnum = i;
1813 ch->magic = EPCA_MAGIC;
1814 ch->tty = NULL;
1815
1816 if (shrinkmem)
1817 {
1818 fepcmd(ch, SETBUFFER, 32, 0, 0, 0);
1819 shrinkmem = 0;
1820 }
1821
1822 switch (bd->type)
1823 { /* Begin switch bd->type */
1824
1825 case PCIXEM:
1826 case PCIXRJ:
1827 case PCIXR:
1828 /* Cover all the 2MEG cards */
1829 ch->txptr = memaddr + (((bc->tseg) << 4) & 0x1fffff);
1830 ch->rxptr = memaddr + (((bc->rseg) << 4) & 0x1fffff);
1831 ch->txwin = FEPWIN | ((bc->tseg) >> 11);
1832 ch->rxwin = FEPWIN | ((bc->rseg) >> 11);
1833 break;
1834
1835 case PCXEM:
1836 case EISAXEM:
1837 /* Cover all the 32K windowed cards */
1838 /* Mask equal to window size - 1 */
1839 ch->txptr = memaddr + (((bc->tseg) << 4) & 0x7fff);
1840 ch->rxptr = memaddr + (((bc->rseg) << 4) & 0x7fff);
1841 ch->txwin = FEPWIN | ((bc->tseg) >> 11);
1842 ch->rxwin = FEPWIN | ((bc->rseg) >> 11);
1843 break;
1844
1845 case PCXEVE:
1846 case PCXE:
1847 ch->txptr = memaddr + (((bc->tseg - bd->memory_seg) << 4) & 0x1fff);
1848 ch->txwin = FEPWIN | ((bc->tseg - bd->memory_seg) >> 9);
1849 ch->rxptr = memaddr + (((bc->rseg - bd->memory_seg) << 4) & 0x1fff);
1850 ch->rxwin = FEPWIN | ((bc->rseg - bd->memory_seg) >>9 );
1851 break;
1852
1853 case PCXI:
1854 case PC64XE:
1855 ch->txptr = memaddr + ((bc->tseg - bd->memory_seg) << 4);
1856 ch->rxptr = memaddr + ((bc->rseg - bd->memory_seg) << 4);
1857 ch->txwin = ch->rxwin = 0;
1858 break;
1859
1860 } /* End switch bd->type */
1861
1862 ch->txbufhead = 0;
1863 ch->txbufsize = bc->tmax + 1;
1864
1865 ch->rxbufhead = 0;
1866 ch->rxbufsize = bc->rmax + 1;
1867
1868 lowwater = ch->txbufsize >= 2000 ? 1024 : (ch->txbufsize / 2);
1869
1870 /* Set transmitter low water mark */
1871 fepcmd(ch, STXLWATER, lowwater, 0, 10, 0);
1872
1873 /* Set receiver low water mark */
1874
1875 fepcmd(ch, SRXLWATER, (ch->rxbufsize / 4), 0, 10, 0);
1876
1877 /* Set receiver high water mark */
1878
1879 fepcmd(ch, SRXHWATER, (3 * ch->rxbufsize / 4), 0, 10, 0);
1880
1881 bc->edelay = 100;
1882 bc->idata = 1;
1883
1884 ch->startc = bc->startc;
1885 ch->stopc = bc->stopc;
1886 ch->startca = bc->startca;
1887 ch->stopca = bc->stopca;
1888
1889 ch->fepcflag = 0;
1890 ch->fepiflag = 0;
1891 ch->fepoflag = 0;
1892 ch->fepstartc = 0;
1893 ch->fepstopc = 0;
1894 ch->fepstartca = 0;
1895 ch->fepstopca = 0;
1896
1897 ch->close_delay = 50;
1898 ch->count = 0;
1899 ch->blocked_open = 0;
1900 init_waitqueue_head(&ch->open_wait);
1901 init_waitqueue_head(&ch->close_wait);
1902 ch->tmp_buf = kmalloc(ch->txbufsize,GFP_KERNEL);
1903 if (!(ch->tmp_buf))
1904 {
1905 printk(KERN_ERR "POST FEP INIT : kmalloc failed for port 0x%x\n",i);
1906 release_region((int)bd->port, 4);
1907 while(i-- > 0)
1908 kfree((ch--)->tmp_buf);
1909 return;
1910 }
1911 else
1912 memset((void *)ch->tmp_buf,0,ch->txbufsize);
1913 } /* End for each port */
1914
1915 printk(KERN_INFO
1916 "Digi PC/Xx Driver V%s: %s I/O = 0x%lx Mem = 0x%lx Ports = %d\n",
1917 VERSION, board_desc[bd->type], (long)bd->port, (long)bd->membase, bd->numports);
1918 sprintf(mesg,
1919 "Digi PC/Xx Driver V%s: %s I/O = 0x%lx Mem = 0x%lx Ports = %d\n",
1920 VERSION, board_desc[bd->type], (long)bd->port, (long)bd->membase, bd->numports);
1921 console_print(mesg);
1922
1923 memwinoff(bd, 0);
1924
1925} /* End post_fep_init */
1926
1927/* --------------------- Begin epcapoll ------------------------ */
1928
1929static void epcapoll(unsigned long ignored)
1930{ /* Begin epcapoll */
1931
1932 unsigned long flags;
1933 int crd;
1934 volatile unsigned int head, tail;
1935 struct channel *ch;
1936 struct board_info *bd;
1937
1938 /* -------------------------------------------------------------------
1939 This routine is called upon every timer interrupt. Even though
1940 the Digi series cards are capable of generating interrupts this
1941 method of non-looping polling is more efficient. This routine
1942 checks for card generated events (Such as receive data, are transmit
1943 buffer empty) and acts on those events.
1944 ----------------------------------------------------------------------- */
1945
1946 save_flags(flags);
1947 cli();
1948
1949 for (crd = 0; crd < num_cards; crd++)
1950 { /* Begin for each card */
1951
1952 bd = &boards[crd];
1953 ch = card_ptr[crd];
1954
1955 if ((bd->status == DISABLED) || digi_poller_inhibited)
1956 continue; /* Begin loop next interation */
1957
1958 /* -----------------------------------------------------------
1959 assertmemoff is not needed here; indeed it is an empty subroutine.
1960 It is being kept because future boards may need this as well as
1961 some legacy boards.
1962 ---------------------------------------------------------------- */
1963
1964 assertmemoff(ch);
1965
1966 globalwinon(ch);
1967
1968 /* ---------------------------------------------------------------
1969 In this case head and tail actually refer to the event queue not
1970 the transmit or receive queue.
1971 ------------------------------------------------------------------- */
1972
1973 head = ch->mailbox->ein;
1974 tail = ch->mailbox->eout;
1975
1976 /* If head isn't equal to tail we have an event */
1977
1978 if (head != tail)
1979 doevent(crd);
1980
1981 memoff(ch);
1982
1983 } /* End for each card */
1984
1985 mod_timer(&epca_timer, jiffies + (HZ / 25));
1986
1987 restore_flags(flags);
1988} /* End epcapoll */
1989
1990/* --------------------- Begin doevent ------------------------ */
1991
1992static void doevent(int crd)
1993{ /* Begin doevent */
1994
1995 volatile unchar *eventbuf;
1996 struct channel *ch, *chan0;
1997 static struct tty_struct *tty;
1998 volatile struct board_info *bd;
1999 volatile struct board_chan *bc;
2000 register volatile unsigned int tail, head;
2001 register int event, channel;
2002 register int mstat, lstat;
2003
2004 /* -------------------------------------------------------------------
2005 This subroutine is called by epcapoll when an event is detected
2006 in the event queue. This routine responds to those events.
2007 --------------------------------------------------------------------- */
2008
2009 bd = &boards[crd];
2010
2011 chan0 = card_ptr[crd];
2012 epcaassert(chan0 <= &digi_channels[nbdevs - 1], "ch out of range");
2013
2014 assertgwinon(chan0);
2015
2016 while ((tail = chan0->mailbox->eout) != (head = chan0->mailbox->ein))
2017 { /* Begin while something in event queue */
2018
2019 assertgwinon(chan0);
2020
2021 eventbuf = (volatile unchar *)bus_to_virt((ulong)(bd->re_map_membase + tail + ISTART));
2022
2023 /* Get the channel the event occurred on */
2024 channel = eventbuf[0];
2025
2026 /* Get the actual event code that occurred */
2027 event = eventbuf[1];
2028
2029 /* ----------------------------------------------------------------
2030 The two assignments below get the current modem status (mstat)
2031 and the previous modem status (lstat). These are useful becuase
2032 an event could signal a change in modem signals itself.
2033 ------------------------------------------------------------------- */
2034
2035 mstat = eventbuf[2];
2036 lstat = eventbuf[3];
2037
2038 ch = chan0 + channel;
2039
2040 if ((unsigned)channel >= bd->numports || !ch)
2041 {
2042 if (channel >= bd->numports)
2043 ch = chan0;
2044 bc = ch->brdchan;
2045 goto next;
2046 }
2047
2048 if ((bc = ch->brdchan) == NULL)
2049 goto next;
2050
2051 if (event & DATA_IND)
2052 { /* Begin DATA_IND */
2053
2054 receive_data(ch);
2055 assertgwinon(ch);
2056
2057 } /* End DATA_IND */
2058 /* else *//* Fix for DCD transition missed bug */
2059 if (event & MODEMCHG_IND)
2060 { /* Begin MODEMCHG_IND */
2061
2062 /* A modem signal change has been indicated */
2063
2064 ch->imodem = mstat;
2065
2066 if (ch->asyncflags & ASYNC_CHECK_CD)
2067 {
2068 if (mstat & ch->dcd) /* We are now receiving dcd */
2069 wake_up_interruptible(&ch->open_wait);
2070 else
2071 pc_sched_event(ch, EPCA_EVENT_HANGUP); /* No dcd; hangup */
2072 }
2073
2074 } /* End MODEMCHG_IND */
2075
2076 tty = ch->tty;
2077 if (tty)
2078 { /* Begin if valid tty */
2079
2080 if (event & BREAK_IND)
2081 { /* Begin if BREAK_IND */
2082
2083 /* A break has been indicated */
2084
2085 tty->flip.count++;
2086 *tty->flip.flag_buf_ptr++ = TTY_BREAK;
2087
2088 *tty->flip.char_buf_ptr++ = 0;
2089
2090 tty_schedule_flip(tty);
2091
2092 } /* End if BREAK_IND */
2093 else
2094 if (event & LOWTX_IND)
2095 { /* Begin LOWTX_IND */
2096
2097 if (ch->statusflags & LOWWAIT)
2098 { /* Begin if LOWWAIT */
2099
2100 ch->statusflags &= ~LOWWAIT;
2101 tty_wakeup(tty);
2102 wake_up_interruptible(&tty->write_wait);
2103
2104 } /* End if LOWWAIT */
2105
2106 } /* End LOWTX_IND */
2107 else
2108 if (event & EMPTYTX_IND)
2109 { /* Begin EMPTYTX_IND */
2110
2111 /* This event is generated by setup_empty_event */
2112
2113 ch->statusflags &= ~TXBUSY;
2114 if (ch->statusflags & EMPTYWAIT)
2115 { /* Begin if EMPTYWAIT */
2116
2117 ch->statusflags &= ~EMPTYWAIT;
2118 tty_wakeup(tty);
2119
2120 wake_up_interruptible(&tty->write_wait);
2121
2122 } /* End if EMPTYWAIT */
2123
2124 } /* End EMPTYTX_IND */
2125
2126 } /* End if valid tty */
2127
2128
2129 next:
2130 globalwinon(ch);
2131
2132 if (!bc)
2133 printk(KERN_ERR "<Error> - bc == NULL in doevent!\n");
2134 else
2135 bc->idata = 1;
2136
2137 chan0->mailbox->eout = (tail + 4) & (IMAX - ISTART - 4);
2138 globalwinon(chan0);
2139
2140 } /* End while something in event queue */
2141
2142} /* End doevent */
2143
2144/* --------------------- Begin fepcmd ------------------------ */
2145
2146static void fepcmd(struct channel *ch, int cmd, int word_or_byte,
2147 int byte2, int ncmds, int bytecmd)
2148{ /* Begin fepcmd */
2149
2150 unchar *memaddr;
2151 unsigned int head, cmdTail, cmdStart, cmdMax;
2152 long count;
2153 int n;
2154
2155 /* This is the routine in which commands may be passed to the card. */
2156
2157 if (ch->board->status == DISABLED)
2158 {
2159 return;
2160 }
2161
2162 assertgwinon(ch);
2163
2164 /* Remember head (As well as max) is just an offset not a base addr */
2165 head = ch->mailbox->cin;
2166
2167 /* cmdStart is a base address */
2168 cmdStart = ch->mailbox->cstart;
2169
2170 /* ------------------------------------------------------------------
2171 We do the addition below because we do not want a max pointer
2172 relative to cmdStart. We want a max pointer that points at the
2173 physical end of the command queue.
2174 -------------------------------------------------------------------- */
2175
2176 cmdMax = (cmdStart + 4 + (ch->mailbox->cmax));
2177
2178 memaddr = ch->board->re_map_membase;
2179
2180 /*
2181 The below command is necessary because newer kernels (2.1.x and
2182 up) do not have a 1:1 virtual to physical mapping. The below
2183 call adjust for that.
2184 */
2185
2186 memaddr = (unsigned char *)bus_to_virt((unsigned long)memaddr);
2187
2188 if (head >= (cmdMax - cmdStart) || (head & 03))
2189 {
2190 printk(KERN_ERR "line %d: Out of range, cmd = %x, head = %x\n", __LINE__,
2191 cmd, head);
2192 printk(KERN_ERR "line %d: Out of range, cmdMax = %x, cmdStart = %x\n", __LINE__,
2193 cmdMax, cmdStart);
2194 return;
2195 }
2196
2197 if (bytecmd)
2198 {
2199 *(volatile unchar *)(memaddr + head + cmdStart + 0) = (unchar)cmd;
2200
2201 *(volatile unchar *)(memaddr + head + cmdStart + 1) = (unchar)ch->channelnum;
2202 /* Below word_or_byte is bits to set */
2203 *(volatile unchar *)(memaddr + head + cmdStart + 2) = (unchar)word_or_byte;
2204 /* Below byte2 is bits to reset */
2205 *(volatile unchar *)(memaddr + head + cmdStart + 3) = (unchar)byte2;
2206
2207 }
2208 else
2209 {
2210 *(volatile unchar *)(memaddr + head + cmdStart + 0) = (unchar)cmd;
2211 *(volatile unchar *)(memaddr + head + cmdStart + 1) = (unchar)ch->channelnum;
2212 *(volatile ushort*)(memaddr + head + cmdStart + 2) = (ushort)word_or_byte;
2213 }
2214
2215 head = (head + 4) & (cmdMax - cmdStart - 4);
2216 ch->mailbox->cin = head;
2217
2218 count = FEPTIMEOUT;
2219
2220 for (;;)
2221 { /* Begin forever loop */
2222
2223 count--;
2224 if (count == 0)
2225 {
2226 printk(KERN_ERR "<Error> - Fep not responding in fepcmd()\n");
2227 return;
2228 }
2229
2230 head = ch->mailbox->cin;
2231 cmdTail = ch->mailbox->cout;
2232
2233 n = (head - cmdTail) & (cmdMax - cmdStart - 4);
2234
2235 /* ----------------------------------------------------------
2236 Basically this will break when the FEP acknowledges the
2237 command by incrementing cmdTail (Making it equal to head).
2238 ------------------------------------------------------------- */
2239
2240 if (n <= ncmds * (sizeof(short) * 4))
2241 break; /* Well nearly forever :-) */
2242
2243 } /* End forever loop */
2244
2245} /* End fepcmd */
2246
2247/* ---------------------------------------------------------------------
2248 Digi products use fields in their channels structures that are very
2249 similar to the c_cflag and c_iflag fields typically found in UNIX
2250 termios structures. The below three routines allow mappings
2251 between these hardware "flags" and their respective Linux flags.
2252------------------------------------------------------------------------- */
2253
2254/* --------------------- Begin termios2digi_h -------------------- */
2255
2256static unsigned termios2digi_h(struct channel *ch, unsigned cflag)
2257{ /* Begin termios2digi_h */
2258
2259 unsigned res = 0;
2260
2261 if (cflag & CRTSCTS)
2262 {
2263 ch->digiext.digi_flags |= (RTSPACE | CTSPACE);
2264 res |= ((ch->m_cts) | (ch->m_rts));
2265 }
2266
2267 if (ch->digiext.digi_flags & RTSPACE)
2268 res |= ch->m_rts;
2269
2270 if (ch->digiext.digi_flags & DTRPACE)
2271 res |= ch->m_dtr;
2272
2273 if (ch->digiext.digi_flags & CTSPACE)
2274 res |= ch->m_cts;
2275
2276 if (ch->digiext.digi_flags & DSRPACE)
2277 res |= ch->dsr;
2278
2279 if (ch->digiext.digi_flags & DCDPACE)
2280 res |= ch->dcd;
2281
2282 if (res & (ch->m_rts))
2283 ch->digiext.digi_flags |= RTSPACE;
2284
2285 if (res & (ch->m_cts))
2286 ch->digiext.digi_flags |= CTSPACE;
2287
2288 return res;
2289
2290} /* End termios2digi_h */
2291
2292/* --------------------- Begin termios2digi_i -------------------- */
2293static unsigned termios2digi_i(struct channel *ch, unsigned iflag)
2294{ /* Begin termios2digi_i */
2295
2296 unsigned res = iflag & (IGNBRK | BRKINT | IGNPAR | PARMRK |
2297 INPCK | ISTRIP|IXON|IXANY|IXOFF);
2298
2299 if (ch->digiext.digi_flags & DIGI_AIXON)
2300 res |= IAIXON;
2301 return res;
2302
2303} /* End termios2digi_i */
2304
2305/* --------------------- Begin termios2digi_c -------------------- */
2306
2307static unsigned termios2digi_c(struct channel *ch, unsigned cflag)
2308{ /* Begin termios2digi_c */
2309
2310 unsigned res = 0;
2311
2312#ifdef SPEED_HACK
2313 /* CL: HACK to force 115200 at 38400 and 57600 at 19200 Baud */
2314 if ((cflag & CBAUD)== B38400) cflag=cflag - B38400 + B115200;
2315 if ((cflag & CBAUD)== B19200) cflag=cflag - B19200 + B57600;
2316#endif /* SPEED_HACK */
2317
2318 if (cflag & CBAUDEX)
2319 { /* Begin detected CBAUDEX */
2320
2321 ch->digiext.digi_flags |= DIGI_FAST;
2322
2323 /* -------------------------------------------------------------
2324 HUPCL bit is used by FEP to indicate fast baud
2325 table is to be used.
2326 ----------------------------------------------------------------- */
2327
2328 res |= FEP_HUPCL;
2329
2330 } /* End detected CBAUDEX */
2331 else ch->digiext.digi_flags &= ~DIGI_FAST;
2332
2333 /* -------------------------------------------------------------------
2334 CBAUD has bit position 0x1000 set these days to indicate Linux
2335 baud rate remap. Digi hardware can't handle the bit assignment.
2336 (We use a different bit assignment for high speed.). Clear this
2337 bit out.
2338 ---------------------------------------------------------------------- */
2339 res |= cflag & ((CBAUD ^ CBAUDEX) | PARODD | PARENB | CSTOPB | CSIZE);
2340
2341 /* -------------------------------------------------------------
2342 This gets a little confusing. The Digi cards have their own
2343 representation of c_cflags controling baud rate. For the most
2344 part this is identical to the Linux implementation. However;
2345 Digi supports one rate (76800) that Linux doesn't. This means
2346 that the c_cflag entry that would normally mean 76800 for Digi
2347 actually means 115200 under Linux. Without the below mapping,
2348 a stty 115200 would only drive the board at 76800. Since
2349 the rate 230400 is also found after 76800, the same problem afflicts
2350 us when we choose a rate of 230400. Without the below modificiation
2351 stty 230400 would actually give us 115200.
2352
2353 There are two additional differences. The Linux value for CLOCAL
2354 (0x800; 0004000) has no meaning to the Digi hardware. Also in
2355 later releases of Linux; the CBAUD define has CBAUDEX (0x1000;
2356 0010000) ored into it (CBAUD = 0x100f as opposed to 0xf). CBAUDEX
2357 should be checked for a screened out prior to termios2digi_c
2358 returning. Since CLOCAL isn't used by the board this can be
2359 ignored as long as the returned value is used only by Digi hardware.
2360 ----------------------------------------------------------------- */
2361
2362 if (cflag & CBAUDEX)
2363 {
2364 /* -------------------------------------------------------------
2365 The below code is trying to guarantee that only baud rates
2366 115200 and 230400 are remapped. We use exclusive or because
2367 the various baud rates share common bit positions and therefore
2368 can't be tested for easily.
2369 ----------------------------------------------------------------- */
2370
2371
2372 if ((!((cflag & 0x7) ^ (B115200 & ~CBAUDEX))) ||
2373 (!((cflag & 0x7) ^ (B230400 & ~CBAUDEX))))
2374 {
2375 res += 1;
2376 }
2377 }
2378
2379 return res;
2380
2381} /* End termios2digi_c */
2382
2383/* --------------------- Begin epcaparam ----------------------- */
2384
2385static void epcaparam(struct tty_struct *tty, struct channel *ch)
2386{ /* Begin epcaparam */
2387
2388 unsigned int cmdHead;
2389 struct termios *ts;
2390 volatile struct board_chan *bc;
2391 unsigned mval, hflow, cflag, iflag;
2392
2393 bc = ch->brdchan;
2394 epcaassert(bc !=0, "bc out of range");
2395
2396 assertgwinon(ch);
2397
2398 ts = tty->termios;
2399
2400 if ((ts->c_cflag & CBAUD) == 0)
2401 { /* Begin CBAUD detected */
2402
2403 cmdHead = bc->rin;
2404 bc->rout = cmdHead;
2405 cmdHead = bc->tin;
2406
2407 /* Changing baud in mid-stream transmission can be wonderful */
2408 /* ---------------------------------------------------------------
2409 Flush current transmit buffer by setting cmdTail pointer (tout)
2410 to cmdHead pointer (tin). Hopefully the transmit buffer is empty.
2411 ----------------------------------------------------------------- */
2412
2413 fepcmd(ch, STOUT, (unsigned) cmdHead, 0, 0, 0);
2414 mval = 0;
2415
2416 } /* End CBAUD detected */
2417 else
2418 { /* Begin CBAUD not detected */
2419
2420 /* -------------------------------------------------------------------
2421 c_cflags have changed but that change had nothing to do with BAUD.
2422 Propagate the change to the card.
2423 ---------------------------------------------------------------------- */
2424
2425 cflag = termios2digi_c(ch, ts->c_cflag);
2426
2427 if (cflag != ch->fepcflag)
2428 {
2429 ch->fepcflag = cflag;
2430 /* Set baud rate, char size, stop bits, parity */
2431 fepcmd(ch, SETCTRLFLAGS, (unsigned) cflag, 0, 0, 0);
2432 }
2433
2434
2435 /* ----------------------------------------------------------------
2436 If the user has not forced CLOCAL and if the device is not a
2437 CALLOUT device (Which is always CLOCAL) we set flags such that
2438 the driver will wait on carrier detect.
2439 ------------------------------------------------------------------- */
2440
2441 if (ts->c_cflag & CLOCAL)
2442 { /* Begin it is a cud device or a ttyD device with CLOCAL on */
2443 ch->asyncflags &= ~ASYNC_CHECK_CD;
2444 } /* End it is a cud device or a ttyD device with CLOCAL on */
2445 else
2446 { /* Begin it is a ttyD device */
2447 ch->asyncflags |= ASYNC_CHECK_CD;
2448 } /* End it is a ttyD device */
2449
2450 mval = ch->m_dtr | ch->m_rts;
2451
2452 } /* End CBAUD not detected */
2453
2454 iflag = termios2digi_i(ch, ts->c_iflag);
2455
2456 /* Check input mode flags */
2457
2458 if (iflag != ch->fepiflag)
2459 {
2460 ch->fepiflag = iflag;
2461
2462 /* ---------------------------------------------------------------
2463 Command sets channels iflag structure on the board. Such things
2464 as input soft flow control, handling of parity errors, and
2465 break handling are all set here.
2466 ------------------------------------------------------------------- */
2467
2468 /* break handling, parity handling, input stripping, flow control chars */
2469 fepcmd(ch, SETIFLAGS, (unsigned int) ch->fepiflag, 0, 0, 0);
2470 }
2471
2472 /* ---------------------------------------------------------------
2473 Set the board mint value for this channel. This will cause hardware
2474 events to be generated each time the DCD signal (Described in mint)
2475 changes.
2476 ------------------------------------------------------------------- */
2477 bc->mint = ch->dcd;
2478
2479 if ((ts->c_cflag & CLOCAL) || (ch->digiext.digi_flags & DIGI_FORCEDCD))
2480 if (ch->digiext.digi_flags & DIGI_FORCEDCD)
2481 bc->mint = 0;
2482
2483 ch->imodem = bc->mstat;
2484
2485 hflow = termios2digi_h(ch, ts->c_cflag);
2486
2487 if (hflow != ch->hflow)
2488 {
2489 ch->hflow = hflow;
2490
2491 /* --------------------------------------------------------------
2492 Hard flow control has been selected but the board is not
2493 using it. Activate hard flow control now.
2494 ----------------------------------------------------------------- */
2495
2496 fepcmd(ch, SETHFLOW, hflow, 0xff, 0, 1);
2497 }
2498
2499
2500 mval ^= ch->modemfake & (mval ^ ch->modem);
2501
2502 if (ch->omodem ^ mval)
2503 {
2504 ch->omodem = mval;
2505
2506 /* --------------------------------------------------------------
2507 The below command sets the DTR and RTS mstat structure. If
2508 hard flow control is NOT active these changes will drive the
2509 output of the actual DTR and RTS lines. If hard flow control
2510 is active, the changes will be saved in the mstat structure and
2511 only asserted when hard flow control is turned off.
2512 ----------------------------------------------------------------- */
2513
2514 /* First reset DTR & RTS; then set them */
2515 fepcmd(ch, SETMODEM, 0, ((ch->m_dtr)|(ch->m_rts)), 0, 1);
2516 fepcmd(ch, SETMODEM, mval, 0, 0, 1);
2517
2518 }
2519
2520 if (ch->startc != ch->fepstartc || ch->stopc != ch->fepstopc)
2521 {
2522 ch->fepstartc = ch->startc;
2523 ch->fepstopc = ch->stopc;
2524
2525 /* ------------------------------------------------------------
2526 The XON / XOFF characters have changed; propagate these
2527 changes to the card.
2528 --------------------------------------------------------------- */
2529
2530 fepcmd(ch, SONOFFC, ch->fepstartc, ch->fepstopc, 0, 1);
2531 }
2532
2533 if (ch->startca != ch->fepstartca || ch->stopca != ch->fepstopca)
2534 {
2535 ch->fepstartca = ch->startca;
2536 ch->fepstopca = ch->stopca;
2537
2538 /* ---------------------------------------------------------------
2539 Similar to the above, this time the auxilarly XON / XOFF
2540 characters have changed; propagate these changes to the card.
2541 ------------------------------------------------------------------ */
2542
2543 fepcmd(ch, SAUXONOFFC, ch->fepstartca, ch->fepstopca, 0, 1);
2544 }
2545
2546} /* End epcaparam */
2547
2548/* --------------------- Begin receive_data ----------------------- */
2549
2550static void receive_data(struct channel *ch)
2551{ /* Begin receive_data */
2552
2553 unchar *rptr;
2554 struct termios *ts = NULL;
2555 struct tty_struct *tty;
2556 volatile struct board_chan *bc;
2557 register int dataToRead, wrapgap, bytesAvailable;
2558 register unsigned int tail, head;
2559 unsigned int wrapmask;
2560 int rc;
2561
2562
2563 /* ---------------------------------------------------------------
2564 This routine is called by doint when a receive data event
2565 has taken place.
2566 ------------------------------------------------------------------- */
2567
2568 globalwinon(ch);
2569
2570 if (ch->statusflags & RXSTOPPED)
2571 return;
2572
2573 tty = ch->tty;
2574 if (tty)
2575 ts = tty->termios;
2576
2577 bc = ch->brdchan;
2578
2579 if (!bc)
2580 {
2581 printk(KERN_ERR "<Error> - bc is NULL in receive_data!\n");
2582 return;
2583 }
2584
2585 wrapmask = ch->rxbufsize - 1;
2586
2587 /* ---------------------------------------------------------------------
2588 Get the head and tail pointers to the receiver queue. Wrap the
2589 head pointer if it has reached the end of the buffer.
2590 ------------------------------------------------------------------------ */
2591
2592 head = bc->rin;
2593 head &= wrapmask;
2594 tail = bc->rout & wrapmask;
2595
2596 bytesAvailable = (head - tail) & wrapmask;
2597
2598 if (bytesAvailable == 0)
2599 return;
2600
2601 /* ------------------------------------------------------------------
2602 If CREAD bit is off or device not open, set TX tail to head
2603 --------------------------------------------------------------------- */
2604
2605 if (!tty || !ts || !(ts->c_cflag & CREAD))
2606 {
2607 bc->rout = head;
2608 return;
2609 }
2610
2611 if (tty->flip.count == TTY_FLIPBUF_SIZE)
2612 return;
2613
2614 if (bc->orun)
2615 {
2616 bc->orun = 0;
2617 printk(KERN_WARNING "overrun! DigiBoard device %s\n",tty->name);
2618 }
2619
2620 rxwinon(ch);
2621 rptr = tty->flip.char_buf_ptr;
2622 rc = tty->flip.count;
2623
2624 while (bytesAvailable > 0)
2625 { /* Begin while there is data on the card */
2626
2627 wrapgap = (head >= tail) ? head - tail : ch->rxbufsize - tail;
2628
2629 /* ---------------------------------------------------------------
2630 Even if head has wrapped around only report the amount of
2631 data to be equal to the size - tail. Remember memcpy can't
2632 automaticly wrap around the receive buffer.
2633 ----------------------------------------------------------------- */
2634
2635 dataToRead = (wrapgap < bytesAvailable) ? wrapgap : bytesAvailable;
2636
2637 /* --------------------------------------------------------------
2638 Make sure we don't overflow the buffer
2639 ----------------------------------------------------------------- */
2640
2641 if ((rc + dataToRead) > TTY_FLIPBUF_SIZE)
2642 dataToRead = TTY_FLIPBUF_SIZE - rc;
2643
2644 if (dataToRead == 0)
2645 break;
2646
2647 /* ---------------------------------------------------------------
2648 Move data read from our card into the line disciplines buffer
2649 for translation if necessary.
2650 ------------------------------------------------------------------ */
2651
2652 if ((memcpy(rptr, ch->rxptr + tail, dataToRead)) != rptr)
2653 printk(KERN_ERR "<Error> - receive_data : memcpy failed\n");
2654
2655 rc += dataToRead;
2656 rptr += dataToRead;
2657 tail = (tail + dataToRead) & wrapmask;
2658 bytesAvailable -= dataToRead;
2659
2660 } /* End while there is data on the card */
2661
2662
2663 tty->flip.count = rc;
2664 tty->flip.char_buf_ptr = rptr;
2665 globalwinon(ch);
2666 bc->rout = tail;
2667
2668 /* Must be called with global data */
2669 tty_schedule_flip(ch->tty);
2670 return;
2671
2672} /* End receive_data */
2673
2674static int info_ioctl(struct tty_struct *tty, struct file * file,
2675 unsigned int cmd, unsigned long arg)
2676{
2677 switch (cmd)
2678 { /* Begin switch cmd */
2679
2680 case DIGI_GETINFO:
2681 { /* Begin case DIGI_GETINFO */
2682
2683 struct digi_info di ;
2684 int brd;
2685
2686 getUser(brd, (unsigned int __user *)arg);
2687
2688 if ((brd < 0) || (brd >= num_cards) || (num_cards == 0))
2689 return (-ENODEV);
2690
2691 memset(&di, 0, sizeof(di));
2692
2693 di.board = brd ;
2694 di.status = boards[brd].status;
2695 di.type = boards[brd].type ;
2696 di.numports = boards[brd].numports ;
2697 di.port = boards[brd].port ;
2698 di.membase = boards[brd].membase ;
2699
2700 if (copy_to_user((void __user *)arg, &di, sizeof (di)))
2701 return -EFAULT;
2702 break;
2703
2704 } /* End case DIGI_GETINFO */
2705
2706 case DIGI_POLLER:
2707 { /* Begin case DIGI_POLLER */
2708
2709 int brd = arg & 0xff000000 >> 16 ;
2710 unsigned char state = arg & 0xff ;
2711
2712 if ((brd < 0) || (brd >= num_cards))
2713 {
2714 printk(KERN_ERR "<Error> - DIGI POLLER : brd not valid!\n");
2715 return (-ENODEV);
2716 }
2717
2718 digi_poller_inhibited = state ;
2719 break ;
2720
2721 } /* End case DIGI_POLLER */
2722
2723 case DIGI_INIT:
2724 { /* Begin case DIGI_INIT */
2725
2726 /* ------------------------------------------------------------
2727 This call is made by the apps to complete the initilization
2728 of the board(s). This routine is responsible for setting
2729 the card to its initial state and setting the drivers control
2730 fields to the sutianle settings for the card in question.
2731 ---------------------------------------------------------------- */
2732
2733 int crd ;
2734 for (crd = 0; crd < num_cards; crd++)
2735 post_fep_init (crd);
2736
2737 break ;
2738
2739 } /* End case DIGI_INIT */
2740
2741
2742 default:
2743 return -ENOIOCTLCMD;
2744
2745 } /* End switch cmd */
2746 return (0) ;
2747}
2748/* --------------------- Begin pc_ioctl ----------------------- */
2749
2750static int pc_tiocmget(struct tty_struct *tty, struct file *file)
2751{
2752 struct channel *ch = (struct channel *) tty->driver_data;
2753 volatile struct board_chan *bc;
2754 unsigned int mstat, mflag = 0;
2755 unsigned long flags;
2756
2757 if (ch)
2758 bc = ch->brdchan;
2759 else
2760 {
2761 printk(KERN_ERR "<Error> - ch is NULL in pc_tiocmget!\n");
2762 return(-EINVAL);
2763 }
2764
2765 save_flags(flags);
2766 cli();
2767 globalwinon(ch);
2768 mstat = bc->mstat;
2769 memoff(ch);
2770 restore_flags(flags);
2771
2772 if (mstat & ch->m_dtr)
2773 mflag |= TIOCM_DTR;
2774
2775 if (mstat & ch->m_rts)
2776 mflag |= TIOCM_RTS;
2777
2778 if (mstat & ch->m_cts)
2779 mflag |= TIOCM_CTS;
2780
2781 if (mstat & ch->dsr)
2782 mflag |= TIOCM_DSR;
2783
2784 if (mstat & ch->m_ri)
2785 mflag |= TIOCM_RI;
2786
2787 if (mstat & ch->dcd)
2788 mflag |= TIOCM_CD;
2789
2790 return mflag;
2791}
2792
2793static int pc_tiocmset(struct tty_struct *tty, struct file *file,
2794 unsigned int set, unsigned int clear)
2795{
2796 struct channel *ch = (struct channel *) tty->driver_data;
2797 unsigned long flags;
2798
2799 if (!ch) {
2800 printk(KERN_ERR "<Error> - ch is NULL in pc_tiocmset!\n");
2801 return(-EINVAL);
2802 }
2803
2804 save_flags(flags);
2805 cli();
2806 /*
2807 * I think this modemfake stuff is broken. It doesn't
2808 * correctly reflect the behaviour desired by the TIOCM*
2809 * ioctls. Therefore this is probably broken.
2810 */
2811 if (set & TIOCM_RTS) {
2812 ch->modemfake |= ch->m_rts;
2813 ch->modem |= ch->m_rts;
2814 }
2815 if (set & TIOCM_DTR) {
2816 ch->modemfake |= ch->m_dtr;
2817 ch->modem |= ch->m_dtr;
2818 }
2819 if (clear & TIOCM_RTS) {
2820 ch->modemfake |= ch->m_rts;
2821 ch->modem &= ~ch->m_rts;
2822 }
2823 if (clear & TIOCM_DTR) {
2824 ch->modemfake |= ch->m_dtr;
2825 ch->modem &= ~ch->m_dtr;
2826 }
2827
2828 globalwinon(ch);
2829
2830 /* --------------------------------------------------------------
2831 The below routine generally sets up parity, baud, flow control
2832 issues, etc.... It effect both control flags and input flags.
2833 ------------------------------------------------------------------ */
2834
2835 epcaparam(tty,ch);
2836 memoff(ch);
2837 restore_flags(flags);
2838 return 0;
2839}
2840
2841static int pc_ioctl(struct tty_struct *tty, struct file * file,
2842 unsigned int cmd, unsigned long arg)
2843{ /* Begin pc_ioctl */
2844
2845 digiflow_t dflow;
2846 int retval;
2847 unsigned long flags;
2848 unsigned int mflag, mstat;
2849 unsigned char startc, stopc;
2850 volatile struct board_chan *bc;
2851 struct channel *ch = (struct channel *) tty->driver_data;
2852 void __user *argp = (void __user *)arg;
2853
2854 if (ch)
2855 bc = ch->brdchan;
2856 else
2857 {
2858 printk(KERN_ERR "<Error> - ch is NULL in pc_ioctl!\n");
2859 return(-EINVAL);
2860 }
2861
2862 save_flags(flags);
2863
2864 /* -------------------------------------------------------------------
2865 For POSIX compliance we need to add more ioctls. See tty_ioctl.c
2866 in /usr/src/linux/drivers/char for a good example. In particular
2867 think about adding TCSETAF, TCSETAW, TCSETA, TCSETSF, TCSETSW, TCSETS.
2868 ---------------------------------------------------------------------- */
2869
2870 switch (cmd)
2871 { /* Begin switch cmd */
2872
2873 case TCGETS:
2874 if (copy_to_user(argp,
2875 tty->termios, sizeof(struct termios)))
2876 return -EFAULT;
2877 return(0);
2878
2879 case TCGETA:
2880 return get_termio(tty, argp);
2881
2882 case TCSBRK: /* SVID version: non-zero arg --> no break */
2883
2884 retval = tty_check_change(tty);
2885 if (retval)
2886 return retval;
2887
2888 /* Setup an event to indicate when the transmit buffer empties */
2889
2890 setup_empty_event(tty,ch);
2891 tty_wait_until_sent(tty, 0);
2892 if (!arg)
2893 digi_send_break(ch, HZ/4); /* 1/4 second */
2894 return 0;
2895
2896 case TCSBRKP: /* support for POSIX tcsendbreak() */
2897
2898 retval = tty_check_change(tty);
2899 if (retval)
2900 return retval;
2901
2902 /* Setup an event to indicate when the transmit buffer empties */
2903
2904 setup_empty_event(tty,ch);
2905 tty_wait_until_sent(tty, 0);
2906 digi_send_break(ch, arg ? arg*(HZ/10) : HZ/4);
2907 return 0;
2908
2909 case TIOCGSOFTCAR:
2910 if (put_user(C_CLOCAL(tty)?1:0, (unsigned long __user *)arg))
2911 return -EFAULT;
2912 return 0;
2913
2914 case TIOCSSOFTCAR:
2915 {
2916 unsigned int value;
2917
2918 if (get_user(value, (unsigned __user *)argp))
2919 return -EFAULT;
2920 tty->termios->c_cflag =
2921 ((tty->termios->c_cflag & ~CLOCAL) |
2922 (value ? CLOCAL : 0));
2923 return 0;
2924 }
2925
2926 case TIOCMODG:
2927 mflag = pc_tiocmget(tty, file);
2928 if (put_user(mflag, (unsigned long __user *)argp))
2929 return -EFAULT;
2930 break;
2931
2932 case TIOCMODS:
2933 if (get_user(mstat, (unsigned __user *)argp))
2934 return -EFAULT;
2935 return pc_tiocmset(tty, file, mstat, ~mstat);
2936
2937 case TIOCSDTR:
2938 ch->omodem |= ch->m_dtr;
2939 cli();
2940 globalwinon(ch);
2941 fepcmd(ch, SETMODEM, ch->m_dtr, 0, 10, 1);
2942 memoff(ch);
2943 restore_flags(flags);
2944 break;
2945
2946 case TIOCCDTR:
2947 ch->omodem &= ~ch->m_dtr;
2948 cli();
2949 globalwinon(ch);
2950 fepcmd(ch, SETMODEM, 0, ch->m_dtr, 10, 1);
2951 memoff(ch);
2952 restore_flags(flags);
2953 break;
2954
2955 case DIGI_GETA:
2956 if (copy_to_user(argp, &ch->digiext, sizeof(digi_t)))
2957 return -EFAULT;
2958 break;
2959
2960 case DIGI_SETAW:
2961 case DIGI_SETAF:
2962 if ((cmd) == (DIGI_SETAW))
2963 {
2964 /* Setup an event to indicate when the transmit buffer empties */
2965
2966 setup_empty_event(tty,ch);
2967 tty_wait_until_sent(tty, 0);
2968 }
2969 else
2970 {
2971 /* ldisc lock already held in ioctl */
2972 if (tty->ldisc.flush_buffer)
2973 tty->ldisc.flush_buffer(tty);
2974 }
2975
2976 /* Fall Thru */
2977
2978 case DIGI_SETA:
2979 if (copy_from_user(&ch->digiext, argp, sizeof(digi_t)))
2980 return -EFAULT;
2981
2982 if (ch->digiext.digi_flags & DIGI_ALTPIN)
2983 {
2984 ch->dcd = ch->m_dsr;
2985 ch->dsr = ch->m_dcd;
2986 }
2987 else
2988 {
2989 ch->dcd = ch->m_dcd;
2990 ch->dsr = ch->m_dsr;
2991 }
2992
2993 cli();
2994 globalwinon(ch);
2995
2996 /* -----------------------------------------------------------------
2997 The below routine generally sets up parity, baud, flow control
2998 issues, etc.... It effect both control flags and input flags.
2999 ------------------------------------------------------------------- */
3000
3001 epcaparam(tty,ch);
3002 memoff(ch);
3003 restore_flags(flags);
3004 break;
3005
3006 case DIGI_GETFLOW:
3007 case DIGI_GETAFLOW:
3008 cli();
3009 globalwinon(ch);
3010 if ((cmd) == (DIGI_GETFLOW))
3011 {
3012 dflow.startc = bc->startc;
3013 dflow.stopc = bc->stopc;
3014 }
3015 else
3016 {
3017 dflow.startc = bc->startca;
3018 dflow.stopc = bc->stopca;
3019 }
3020 memoff(ch);
3021 restore_flags(flags);
3022
3023 if (copy_to_user(argp, &dflow, sizeof(dflow)))
3024 return -EFAULT;
3025 break;
3026
3027 case DIGI_SETAFLOW:
3028 case DIGI_SETFLOW:
3029 if ((cmd) == (DIGI_SETFLOW))
3030 {
3031 startc = ch->startc;
3032 stopc = ch->stopc;
3033 }
3034 else
3035 {
3036 startc = ch->startca;
3037 stopc = ch->stopca;
3038 }
3039
3040 if (copy_from_user(&dflow, argp, sizeof(dflow)))
3041 return -EFAULT;
3042
3043 if (dflow.startc != startc || dflow.stopc != stopc)
3044 { /* Begin if setflow toggled */
3045 cli();
3046 globalwinon(ch);
3047
3048 if ((cmd) == (DIGI_SETFLOW))
3049 {
3050 ch->fepstartc = ch->startc = dflow.startc;
3051 ch->fepstopc = ch->stopc = dflow.stopc;
3052 fepcmd(ch, SONOFFC, ch->fepstartc, ch->fepstopc, 0, 1);
3053 }
3054 else
3055 {
3056 ch->fepstartca = ch->startca = dflow.startc;
3057 ch->fepstopca = ch->stopca = dflow.stopc;
3058 fepcmd(ch, SAUXONOFFC, ch->fepstartca, ch->fepstopca, 0, 1);
3059 }
3060
3061 if (ch->statusflags & TXSTOPPED)
3062 pc_start(tty);
3063
3064 memoff(ch);
3065 restore_flags(flags);
3066
3067 } /* End if setflow toggled */
3068 break;
3069
3070 default:
3071 return -ENOIOCTLCMD;
3072
3073 } /* End switch cmd */
3074
3075 return 0;
3076
3077} /* End pc_ioctl */
3078
3079/* --------------------- Begin pc_set_termios ----------------------- */
3080
3081static void pc_set_termios(struct tty_struct *tty, struct termios *old_termios)
3082{ /* Begin pc_set_termios */
3083
3084 struct channel *ch;
3085 unsigned long flags;
3086
3087 /* ---------------------------------------------------------
3088 verifyChannel returns the channel from the tty struct
3089 if it is valid. This serves as a sanity check.
3090 ------------------------------------------------------------- */
3091
3092 if ((ch = verifyChannel(tty)) != NULL)
3093 { /* Begin if channel valid */
3094
3095 save_flags(flags);
3096 cli();
3097 globalwinon(ch);
3098 epcaparam(tty, ch);
3099 memoff(ch);
3100
3101 if ((old_termios->c_cflag & CRTSCTS) &&
3102 ((tty->termios->c_cflag & CRTSCTS) == 0))
3103 tty->hw_stopped = 0;
3104
3105 if (!(old_termios->c_cflag & CLOCAL) &&
3106 (tty->termios->c_cflag & CLOCAL))
3107 wake_up_interruptible(&ch->open_wait);
3108
3109 restore_flags(flags);
3110
3111 } /* End if channel valid */
3112
3113} /* End pc_set_termios */
3114
3115/* --------------------- Begin do_softint ----------------------- */
3116
3117static void do_softint(void *private_)
3118{ /* Begin do_softint */
3119
3120 struct channel *ch = (struct channel *) private_;
3121
3122
3123 /* Called in response to a modem change event */
3124
3125 if (ch && ch->magic == EPCA_MAGIC)
3126 { /* Begin EPCA_MAGIC */
3127
3128 struct tty_struct *tty = ch->tty;
3129
3130 if (tty && tty->driver_data)
3131 {
3132 if (test_and_clear_bit(EPCA_EVENT_HANGUP, &ch->event))
3133 { /* Begin if clear_bit */
3134
3135 tty_hangup(tty); /* FIXME: module removal race here - AKPM */
3136 wake_up_interruptible(&ch->open_wait);
3137 ch->asyncflags &= ~ASYNC_NORMAL_ACTIVE;
3138
3139 } /* End if clear_bit */
3140 }
3141
3142 } /* End EPCA_MAGIC */
3143} /* End do_softint */
3144
3145/* ------------------------------------------------------------
3146 pc_stop and pc_start provide software flow control to the
3147 routine and the pc_ioctl routine.
3148---------------------------------------------------------------- */
3149
3150/* --------------------- Begin pc_stop ----------------------- */
3151
3152static void pc_stop(struct tty_struct *tty)
3153{ /* Begin pc_stop */
3154
3155 struct channel *ch;
3156 unsigned long flags;
3157
3158 /* ---------------------------------------------------------
3159 verifyChannel returns the channel from the tty struct
3160 if it is valid. This serves as a sanity check.
3161 ------------------------------------------------------------- */
3162
3163 if ((ch = verifyChannel(tty)) != NULL)
3164 { /* Begin if valid channel */
3165
3166 save_flags(flags);
3167 cli();
3168
3169 if ((ch->statusflags & TXSTOPPED) == 0)
3170 { /* Begin if transmit stop requested */
3171
3172 globalwinon(ch);
3173
3174 /* STOP transmitting now !! */
3175
3176 fepcmd(ch, PAUSETX, 0, 0, 0, 0);
3177
3178 ch->statusflags |= TXSTOPPED;
3179 memoff(ch);
3180
3181 } /* End if transmit stop requested */
3182
3183 restore_flags(flags);
3184
3185 } /* End if valid channel */
3186
3187} /* End pc_stop */
3188
3189/* --------------------- Begin pc_start ----------------------- */
3190
3191static void pc_start(struct tty_struct *tty)
3192{ /* Begin pc_start */
3193
3194 struct channel *ch;
3195
3196 /* ---------------------------------------------------------
3197 verifyChannel returns the channel from the tty struct
3198 if it is valid. This serves as a sanity check.
3199 ------------------------------------------------------------- */
3200
3201 if ((ch = verifyChannel(tty)) != NULL)
3202 { /* Begin if channel valid */
3203
3204 unsigned long flags;
3205
3206 save_flags(flags);
3207 cli();
3208
3209 /* Just in case output was resumed because of a change in Digi-flow */
3210 if (ch->statusflags & TXSTOPPED)
3211 { /* Begin transmit resume requested */
3212
3213 volatile struct board_chan *bc;
3214
3215 globalwinon(ch);
3216 bc = ch->brdchan;
3217 if (ch->statusflags & LOWWAIT)
3218 bc->ilow = 1;
3219
3220 /* Okay, you can start transmitting again... */
3221
3222 fepcmd(ch, RESUMETX, 0, 0, 0, 0);
3223
3224 ch->statusflags &= ~TXSTOPPED;
3225 memoff(ch);
3226
3227 } /* End transmit resume requested */
3228
3229 restore_flags(flags);
3230
3231 } /* End if channel valid */
3232
3233} /* End pc_start */
3234
3235/* ------------------------------------------------------------------
3236 The below routines pc_throttle and pc_unthrottle are used
3237 to slow (And resume) the receipt of data into the kernels
3238 receive buffers. The exact occurrence of this depends on the
3239 size of the kernels receive buffer and what the 'watermarks'
3240 are set to for that buffer. See the n_ttys.c file for more
3241 details.
3242______________________________________________________________________ */
3243/* --------------------- Begin throttle ----------------------- */
3244
3245static void pc_throttle(struct tty_struct * tty)
3246{ /* Begin pc_throttle */
3247
3248 struct channel *ch;
3249 unsigned long flags;
3250
3251 /* ---------------------------------------------------------
3252 verifyChannel returns the channel from the tty struct
3253 if it is valid. This serves as a sanity check.
3254 ------------------------------------------------------------- */
3255
3256 if ((ch = verifyChannel(tty)) != NULL)
3257 { /* Begin if channel valid */
3258
3259
3260 save_flags(flags);
3261 cli();
3262
3263 if ((ch->statusflags & RXSTOPPED) == 0)
3264 {
3265 globalwinon(ch);
3266 fepcmd(ch, PAUSERX, 0, 0, 0, 0);
3267
3268 ch->statusflags |= RXSTOPPED;
3269 memoff(ch);
3270 }
3271 restore_flags(flags);
3272
3273 } /* End if channel valid */
3274
3275} /* End pc_throttle */
3276
3277/* --------------------- Begin unthrottle ----------------------- */
3278
3279static void pc_unthrottle(struct tty_struct *tty)
3280{ /* Begin pc_unthrottle */
3281
3282 struct channel *ch;
3283 unsigned long flags;
3284 volatile struct board_chan *bc;
3285
3286
3287 /* ---------------------------------------------------------
3288 verifyChannel returns the channel from the tty struct
3289 if it is valid. This serves as a sanity check.
3290 ------------------------------------------------------------- */
3291
3292 if ((ch = verifyChannel(tty)) != NULL)
3293 { /* Begin if channel valid */
3294
3295
3296 /* Just in case output was resumed because of a change in Digi-flow */
3297 save_flags(flags);
3298 cli();
3299
3300 if (ch->statusflags & RXSTOPPED)
3301 {
3302
3303 globalwinon(ch);
3304 bc = ch->brdchan;
3305 fepcmd(ch, RESUMERX, 0, 0, 0, 0);
3306
3307 ch->statusflags &= ~RXSTOPPED;
3308 memoff(ch);
3309 }
3310 restore_flags(flags);
3311
3312 } /* End if channel valid */
3313
3314} /* End pc_unthrottle */
3315
3316/* --------------------- Begin digi_send_break ----------------------- */
3317
3318void digi_send_break(struct channel *ch, int msec)
3319{ /* Begin digi_send_break */
3320
3321 unsigned long flags;
3322
3323 save_flags(flags);
3324 cli();
3325 globalwinon(ch);
3326
3327 /* --------------------------------------------------------------------
3328 Maybe I should send an infinite break here, schedule() for
3329 msec amount of time, and then stop the break. This way,
3330 the user can't screw up the FEP by causing digi_send_break()
3331 to be called (i.e. via an ioctl()) more than once in msec amount
3332 of time. Try this for now...
3333 ------------------------------------------------------------------------ */
3334
3335 fepcmd(ch, SENDBREAK, msec, 0, 10, 0);
3336 memoff(ch);
3337
3338 restore_flags(flags);
3339
3340} /* End digi_send_break */
3341
3342/* --------------------- Begin setup_empty_event ----------------------- */
3343
3344static void setup_empty_event(struct tty_struct *tty, struct channel *ch)
3345{ /* Begin setup_empty_event */
3346
3347 volatile struct board_chan *bc = ch->brdchan;
3348 unsigned long int flags;
3349
3350 save_flags(flags);
3351 cli();
3352 globalwinon(ch);
3353 ch->statusflags |= EMPTYWAIT;
3354
3355 /* ------------------------------------------------------------------
3356 When set the iempty flag request a event to be generated when the
3357 transmit buffer is empty (If there is no BREAK in progress).
3358 --------------------------------------------------------------------- */
3359
3360 bc->iempty = 1;
3361 memoff(ch);
3362 restore_flags(flags);
3363
3364} /* End setup_empty_event */
3365
3366/* --------------------- Begin get_termio ----------------------- */
3367
3368static int get_termio(struct tty_struct * tty, struct termio __user * termio)
3369{ /* Begin get_termio */
3370 return kernel_termios_to_user_termio(termio, tty->termios);
3371} /* End get_termio */
3372/* ---------------------- Begin epca_setup -------------------------- */
3373void epca_setup(char *str, int *ints)
3374{ /* Begin epca_setup */
3375
3376 struct board_info board;
3377 int index, loop, last;
3378 char *temp, *t2;
3379 unsigned len;
3380
3381 /* ----------------------------------------------------------------------
3382 If this routine looks a little strange it is because it is only called
3383 if a LILO append command is given to boot the kernel with parameters.
3384 In this way, we can provide the user a method of changing his board
3385 configuration without rebuilding the kernel.
3386 ----------------------------------------------------------------------- */
3387 if (!liloconfig)
3388 liloconfig = 1;
3389
3390 memset(&board, 0, sizeof(board));
3391
3392 /* Assume the data is int first, later we can change it */
3393 /* I think that array position 0 of ints holds the number of args */
3394 for (last = 0, index = 1; index <= ints[0]; index++)
3395 switch(index)
3396 { /* Begin parse switch */
3397
3398 case 1:
3399 board.status = ints[index];
3400
3401 /* ---------------------------------------------------------
3402 We check for 2 (As opposed to 1; because 2 is a flag
3403 instructing the driver to ignore epcaconfig.) For this
3404 reason we check for 2.
3405 ------------------------------------------------------------ */
3406 if (board.status == 2)
3407 { /* Begin ignore epcaconfig as well as lilo cmd line */
3408 nbdevs = 0;
3409 num_cards = 0;
3410 return;
3411 } /* End ignore epcaconfig as well as lilo cmd line */
3412
3413 if (board.status > 2)
3414 {
3415 printk(KERN_ERR "<Error> - epca_setup: Invalid board status 0x%x\n", board.status);
3416 invalid_lilo_config = 1;
3417 setup_error_code |= INVALID_BOARD_STATUS;
3418 return;
3419 }
3420 last = index;
3421 break;
3422
3423 case 2:
3424 board.type = ints[index];
3425 if (board.type >= PCIXEM)
3426 {
3427 printk(KERN_ERR "<Error> - epca_setup: Invalid board type 0x%x\n", board.type);
3428 invalid_lilo_config = 1;
3429 setup_error_code |= INVALID_BOARD_TYPE;
3430 return;
3431 }
3432 last = index;
3433 break;
3434
3435 case 3:
3436 board.altpin = ints[index];
3437 if (board.altpin > 1)
3438 {
3439 printk(KERN_ERR "<Error> - epca_setup: Invalid board altpin 0x%x\n", board.altpin);
3440 invalid_lilo_config = 1;
3441 setup_error_code |= INVALID_ALTPIN;
3442 return;
3443 }
3444 last = index;
3445 break;
3446
3447 case 4:
3448 board.numports = ints[index];
3449 if ((board.numports < 2) || (board.numports > 256))
3450 {
3451 printk(KERN_ERR "<Error> - epca_setup: Invalid board numports 0x%x\n", board.numports);
3452 invalid_lilo_config = 1;
3453 setup_error_code |= INVALID_NUM_PORTS;
3454 return;
3455 }
3456 nbdevs += board.numports;
3457 last = index;
3458 break;
3459
3460 case 5:
3461 board.port = (unsigned char *)ints[index];
3462 if (ints[index] <= 0)
3463 {
3464 printk(KERN_ERR "<Error> - epca_setup: Invalid io port 0x%x\n", (unsigned int)board.port);
3465 invalid_lilo_config = 1;
3466 setup_error_code |= INVALID_PORT_BASE;
3467 return;
3468 }
3469 last = index;
3470 break;
3471
3472 case 6:
3473 board.membase = (unsigned char *)ints[index];
3474 if (ints[index] <= 0)
3475 {
3476 printk(KERN_ERR "<Error> - epca_setup: Invalid memory base 0x%x\n",(unsigned int)board.membase);
3477 invalid_lilo_config = 1;
3478 setup_error_code |= INVALID_MEM_BASE;
3479 return;
3480 }
3481 last = index;
3482 break;
3483
3484 default:
3485 printk(KERN_ERR "<Error> - epca_setup: Too many integer parms\n");
3486 return;
3487
3488 } /* End parse switch */
3489
3490 while (str && *str)
3491 { /* Begin while there is a string arg */
3492
3493 /* find the next comma or terminator */
3494 temp = str;
3495
3496 /* While string is not null, and a comma hasn't been found */
3497 while (*temp && (*temp != ','))
3498 temp++;
3499
3500 if (!*temp)
3501 temp = NULL;
3502 else
3503 *temp++ = 0;
3504
3505 /* Set index to the number of args + 1 */
3506 index = last + 1;
3507
3508 switch(index)
3509 {
3510 case 1:
3511 len = strlen(str);
3512 if (strncmp("Disable", str, len) == 0)
3513 board.status = 0;
3514 else
3515 if (strncmp("Enable", str, len) == 0)
3516 board.status = 1;
3517 else
3518 {
3519 printk(KERN_ERR "<Error> - epca_setup: Invalid status %s\n", str);
3520 invalid_lilo_config = 1;
3521 setup_error_code |= INVALID_BOARD_STATUS;
3522 return;
3523 }
3524 last = index;
3525 break;
3526
3527 case 2:
3528
3529 for(loop = 0; loop < EPCA_NUM_TYPES; loop++)
3530 if (strcmp(board_desc[loop], str) == 0)
3531 break;
3532
3533
3534 /* ---------------------------------------------------------------
3535 If the index incremented above refers to a legitamate board
3536 type set it here.
3537 ------------------------------------------------------------------*/
3538
3539 if (index < EPCA_NUM_TYPES)
3540 board.type = loop;
3541 else
3542 {
3543 printk(KERN_ERR "<Error> - epca_setup: Invalid board type: %s\n", str);
3544 invalid_lilo_config = 1;
3545 setup_error_code |= INVALID_BOARD_TYPE;
3546 return;
3547 }
3548 last = index;
3549 break;
3550
3551 case 3:
3552 len = strlen(str);
3553 if (strncmp("Disable", str, len) == 0)
3554 board.altpin = 0;
3555 else
3556 if (strncmp("Enable", str, len) == 0)
3557 board.altpin = 1;
3558 else
3559 {
3560 printk(KERN_ERR "<Error> - epca_setup: Invalid altpin %s\n", str);
3561 invalid_lilo_config = 1;
3562 setup_error_code |= INVALID_ALTPIN;
3563 return;
3564 }
3565 last = index;
3566 break;
3567
3568 case 4:
3569 t2 = str;
3570 while (isdigit(*t2))
3571 t2++;
3572
3573 if (*t2)
3574 {
3575 printk(KERN_ERR "<Error> - epca_setup: Invalid port count %s\n", str);
3576 invalid_lilo_config = 1;
3577 setup_error_code |= INVALID_NUM_PORTS;
3578 return;
3579 }
3580
3581 /* ------------------------------------------------------------
3582 There is not a man page for simple_strtoul but the code can be
3583 found in vsprintf.c. The first argument is the string to
3584 translate (To an unsigned long obviously), the second argument
3585 can be the address of any character variable or a NULL. If a
3586 variable is given, the end pointer of the string will be stored
3587 in that variable; if a NULL is given the end pointer will
3588 not be returned. The last argument is the base to use. If
3589 a 0 is indicated, the routine will attempt to determine the
3590 proper base by looking at the values prefix (A '0' for octal,
3591 a 'x' for hex, etc ... If a value is given it will use that
3592 value as the base.
3593 ---------------------------------------------------------------- */
3594 board.numports = simple_strtoul(str, NULL, 0);
3595 nbdevs += board.numports;
3596 last = index;
3597 break;
3598
3599 case 5:
3600 t2 = str;
3601 while (isxdigit(*t2))
3602 t2++;
3603
3604 if (*t2)
3605 {
3606 printk(KERN_ERR "<Error> - epca_setup: Invalid i/o address %s\n", str);
3607 invalid_lilo_config = 1;
3608 setup_error_code |= INVALID_PORT_BASE;
3609 return;
3610 }
3611
3612 board.port = (unsigned char *)simple_strtoul(str, NULL, 16);
3613 last = index;
3614 break;
3615
3616 case 6:
3617 t2 = str;
3618 while (isxdigit(*t2))
3619 t2++;
3620
3621 if (*t2)
3622 {
3623 printk(KERN_ERR "<Error> - epca_setup: Invalid memory base %s\n",str);
3624 invalid_lilo_config = 1;
3625 setup_error_code |= INVALID_MEM_BASE;
3626 return;
3627 }
3628
3629 board.membase = (unsigned char *)simple_strtoul(str, NULL, 16);
3630 last = index;
3631 break;
3632
3633 default:
3634 printk(KERN_ERR "PC/Xx: Too many string parms\n");
3635 return;
3636 }
3637 str = temp;
3638
3639 } /* End while there is a string arg */
3640
3641
3642 if (last < 6)
3643 {
3644 printk(KERN_ERR "PC/Xx: Insufficient parms specified\n");
3645 return;
3646 }
3647
3648 /* I should REALLY validate the stuff here */
3649
3650 /* Copies our local copy of board into boards */
3651 memcpy((void *)&boards[num_cards],(void *)&board, sizeof(board));
3652
3653
3654 /* Does this get called once per lilo arg are what ? */
3655
3656 printk(KERN_INFO "PC/Xx: Added board %i, %s %i ports at 0x%4.4X base 0x%6.6X\n",
3657 num_cards, board_desc[board.type],
3658 board.numports, (int)board.port, (unsigned int) board.membase);
3659
3660 num_cards++;
3661
3662} /* End epca_setup */
3663
3664
3665
3666#ifdef ENABLE_PCI
3667/* ------------------------ Begin init_PCI --------------------------- */
3668
3669enum epic_board_types {
3670 brd_xr = 0,
3671 brd_xem,
3672 brd_cx,
3673 brd_xrj,
3674};
3675
3676
3677/* indexed directly by epic_board_types enum */
3678static struct {
3679 unsigned char board_type;
3680 unsigned bar_idx; /* PCI base address region */
3681} epca_info_tbl[] = {
3682 { PCIXR, 0, },
3683 { PCIXEM, 0, },
3684 { PCICX, 0, },
3685 { PCIXRJ, 2, },
3686};
3687
3688
3689static int __devinit epca_init_one (struct pci_dev *pdev,
3690 const struct pci_device_id *ent)
3691{
3692 static int board_num = -1;
3693 int board_idx, info_idx = ent->driver_data;
3694 unsigned long addr;
3695
3696 if (pci_enable_device(pdev))
3697 return -EIO;
3698
3699 board_num++;
3700 board_idx = board_num + num_cards;
3701 if (board_idx >= MAXBOARDS)
3702 goto err_out;
3703
3704 addr = pci_resource_start (pdev, epca_info_tbl[info_idx].bar_idx);
3705 if (!addr) {
3706 printk (KERN_ERR PFX "PCI region #%d not available (size 0)\n",
3707 epca_info_tbl[info_idx].bar_idx);
3708 goto err_out;
3709 }
3710
3711 boards[board_idx].status = ENABLED;
3712 boards[board_idx].type = epca_info_tbl[info_idx].board_type;
3713 boards[board_idx].numports = 0x0;
3714 boards[board_idx].port =
3715 (unsigned char *)((char *) addr + PCI_IO_OFFSET);
3716 boards[board_idx].membase =
3717 (unsigned char *)((char *) addr);
3718
3719 if (!request_mem_region (addr + PCI_IO_OFFSET, 0x200000, "epca")) {
3720 printk (KERN_ERR PFX "resource 0x%x @ 0x%lx unavailable\n",
3721 0x200000, addr + PCI_IO_OFFSET);
3722 goto err_out;
3723 }
3724
3725 boards[board_idx].re_map_port = ioremap(addr + PCI_IO_OFFSET, 0x200000);
3726 if (!boards[board_idx].re_map_port) {
3727 printk (KERN_ERR PFX "cannot map 0x%x @ 0x%lx\n",
3728 0x200000, addr + PCI_IO_OFFSET);
3729 goto err_out_free_pciio;
3730 }
3731
3732 if (!request_mem_region (addr, 0x200000, "epca")) {
3733 printk (KERN_ERR PFX "resource 0x%x @ 0x%lx unavailable\n",
3734 0x200000, addr);
3735 goto err_out_free_iounmap;
3736 }
3737
3738 boards[board_idx].re_map_membase = ioremap(addr, 0x200000);
3739 if (!boards[board_idx].re_map_membase) {
3740 printk (KERN_ERR PFX "cannot map 0x%x @ 0x%lx\n",
3741 0x200000, addr + PCI_IO_OFFSET);
3742 goto err_out_free_memregion;
3743 }
3744
3745 /* --------------------------------------------------------------
3746 I don't know what the below does, but the hardware guys say
3747 its required on everything except PLX (In this case XRJ).
3748 ---------------------------------------------------------------- */
3749 if (info_idx != brd_xrj) {
3750 pci_write_config_byte(pdev, 0x40, 0);
3751 pci_write_config_byte(pdev, 0x46, 0);
3752 }
3753
3754 return 0;
3755
3756err_out_free_memregion:
3757 release_mem_region (addr, 0x200000);
3758err_out_free_iounmap:
3759 iounmap (boards[board_idx].re_map_port);
3760err_out_free_pciio:
3761 release_mem_region (addr + PCI_IO_OFFSET, 0x200000);
3762err_out:
3763 return -ENODEV;
3764}
3765
3766
3767static struct pci_device_id epca_pci_tbl[] = {
3768 { PCI_VENDOR_DIGI, PCI_DEVICE_XR, PCI_ANY_ID, PCI_ANY_ID, 0, 0, brd_xr },
3769 { PCI_VENDOR_DIGI, PCI_DEVICE_XEM, PCI_ANY_ID, PCI_ANY_ID, 0, 0, brd_xem },
3770 { PCI_VENDOR_DIGI, PCI_DEVICE_CX, PCI_ANY_ID, PCI_ANY_ID, 0, 0, brd_cx },
3771 { PCI_VENDOR_DIGI, PCI_DEVICE_XRJ, PCI_ANY_ID, PCI_ANY_ID, 0, 0, brd_xrj },
3772 { 0, }
3773};
3774
3775MODULE_DEVICE_TABLE(pci, epca_pci_tbl);
3776
3777int __init init_PCI (void)
3778{ /* Begin init_PCI */
3779 memset (&epca_driver, 0, sizeof (epca_driver));
3780 epca_driver.name = "epca";
3781 epca_driver.id_table = epca_pci_tbl;
3782 epca_driver.probe = epca_init_one;
3783
3784 return pci_register_driver(&epca_driver);
3785} /* End init_PCI */
3786
3787#endif /* ENABLE_PCI */
3788
3789MODULE_LICENSE("GPL");