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