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