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