linux/drivers/tty/cyclades.c
<<
>>
Prefs
   1#undef  BLOCKMOVE
   2#define Z_WAKE
   3#undef  Z_EXT_CHARS_IN_BUFFER
   4
   5/*
   6 * This file contains the driver for the Cyclades async multiport
   7 * serial boards.
   8 *
   9 * Initially written by Randolph Bentson <bentson@grieg.seaslug.org>.
  10 * Modified and maintained by Marcio Saito <marcio@cyclades.com>.
  11 *
  12 * Copyright (C) 2007-2009 Jiri Slaby <jirislaby@gmail.com>
  13 *
  14 * Much of the design and some of the code came from serial.c
  15 * which was copyright (C) 1991, 1992  Linus Torvalds.  It was
  16 * extensively rewritten by Theodore Ts'o, 8/16/92 -- 9/14/92,
  17 * and then fixed as suggested by Michael K. Johnson 12/12/92.
  18 * Converted to pci probing and cleaned up by Jiri Slaby.
  19 *
  20 */
  21
  22#define CY_VERSION      "2.6"
  23
  24/* If you need to install more boards than NR_CARDS, change the constant
  25   in the definition below. No other change is necessary to support up to
  26   eight boards. Beyond that you'll have to extend cy_isa_addresses. */
  27
  28#define NR_CARDS        4
  29
  30/*
  31   If the total number of ports is larger than NR_PORTS, change this
  32   constant in the definition below. No other change is necessary to
  33   support more boards/ports. */
  34
  35#define NR_PORTS        256
  36
  37#define ZO_V1   0
  38#define ZO_V2   1
  39#define ZE_V1   2
  40
  41#define SERIAL_PARANOIA_CHECK
  42#undef  CY_DEBUG_OPEN
  43#undef  CY_DEBUG_THROTTLE
  44#undef  CY_DEBUG_OTHER
  45#undef  CY_DEBUG_IO
  46#undef  CY_DEBUG_COUNT
  47#undef  CY_DEBUG_DTR
  48#undef  CY_DEBUG_INTERRUPTS
  49#undef  CY_16Y_HACK
  50#undef  CY_ENABLE_MONITORING
  51#undef  CY_PCI_DEBUG
  52
  53/*
  54 * Include section
  55 */
  56#include <linux/module.h>
  57#include <linux/errno.h>
  58#include <linux/signal.h>
  59#include <linux/sched.h>
  60#include <linux/timer.h>
  61#include <linux/interrupt.h>
  62#include <linux/tty.h>
  63#include <linux/tty_flip.h>
  64#include <linux/serial.h>
  65#include <linux/major.h>
  66#include <linux/string.h>
  67#include <linux/fcntl.h>
  68#include <linux/ptrace.h>
  69#include <linux/cyclades.h>
  70#include <linux/mm.h>
  71#include <linux/ioport.h>
  72#include <linux/init.h>
  73#include <linux/delay.h>
  74#include <linux/spinlock.h>
  75#include <linux/bitops.h>
  76#include <linux/firmware.h>
  77#include <linux/device.h>
  78#include <linux/slab.h>
  79
  80#include <linux/io.h>
  81#include <linux/uaccess.h>
  82
  83#include <linux/kernel.h>
  84#include <linux/pci.h>
  85
  86#include <linux/stat.h>
  87#include <linux/proc_fs.h>
  88#include <linux/seq_file.h>
  89
  90static void cy_send_xchar(struct tty_struct *tty, char ch);
  91
  92#ifndef SERIAL_XMIT_SIZE
  93#define SERIAL_XMIT_SIZE        (min(PAGE_SIZE, 4096))
  94#endif
  95
  96/* firmware stuff */
  97#define ZL_MAX_BLOCKS   16
  98#define DRIVER_VERSION  0x02010203
  99#define RAM_SIZE 0x80000
 100
 101enum zblock_type {
 102        ZBLOCK_PRG = 0,
 103        ZBLOCK_FPGA = 1
 104};
 105
 106struct zfile_header {
 107        char name[64];
 108        char date[32];
 109        char aux[32];
 110        u32 n_config;
 111        u32 config_offset;
 112        u32 n_blocks;
 113        u32 block_offset;
 114        u32 reserved[9];
 115} __attribute__ ((packed));
 116
 117struct zfile_config {
 118        char name[64];
 119        u32 mailbox;
 120        u32 function;
 121        u32 n_blocks;
 122        u32 block_list[ZL_MAX_BLOCKS];
 123} __attribute__ ((packed));
 124
 125struct zfile_block {
 126        u32 type;
 127        u32 file_offset;
 128        u32 ram_offset;
 129        u32 size;
 130} __attribute__ ((packed));
 131
 132static struct tty_driver *cy_serial_driver;
 133
 134#ifdef CONFIG_ISA
 135/* This is the address lookup table. The driver will probe for
 136   Cyclom-Y/ISA boards at all addresses in here. If you want the
 137   driver to probe addresses at a different address, add it to
 138   this table.  If the driver is probing some other board and
 139   causing problems, remove the offending address from this table.
 140*/
 141
 142static unsigned int cy_isa_addresses[] = {
 143        0xD0000,
 144        0xD2000,
 145        0xD4000,
 146        0xD6000,
 147        0xD8000,
 148        0xDA000,
 149        0xDC000,
 150        0xDE000,
 151        0, 0, 0, 0, 0, 0, 0, 0
 152};
 153
 154#define NR_ISA_ADDRS ARRAY_SIZE(cy_isa_addresses)
 155
 156static long maddr[NR_CARDS];
 157static int irq[NR_CARDS];
 158
 159module_param_hw_array(maddr, long, iomem, NULL, 0);
 160module_param_hw_array(irq, int, irq, NULL, 0);
 161
 162#endif                          /* CONFIG_ISA */
 163
 164/* This is the per-card data structure containing address, irq, number of
 165   channels, etc. This driver supports a maximum of NR_CARDS cards.
 166*/
 167static struct cyclades_card cy_card[NR_CARDS];
 168
 169static int cy_next_channel;     /* next minor available */
 170
 171/*
 172 * This is used to look up the divisor speeds and the timeouts
 173 * We're normally limited to 15 distinct baud rates.  The extra
 174 * are accessed via settings in info->port.flags.
 175 *      0,     1,     2,     3,     4,     5,     6,     7,     8,     9,
 176 *     10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
 177 *                                               HI            VHI
 178 *     20
 179 */
 180static const int baud_table[] = {
 181        0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
 182        1800, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200, 150000,
 183        230400, 0
 184};
 185
 186static const char baud_co_25[] = {      /* 25 MHz clock option table */
 187        /* value =>    00    01   02    03    04 */
 188        /* divide by    8    32   128   512  2048 */
 189        0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02,
 190        0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 191};
 192
 193static const char baud_bpr_25[] = {     /* 25 MHz baud rate period table */
 194        0x00, 0xf5, 0xa3, 0x6f, 0x5c, 0x51, 0xf5, 0xa3, 0x51, 0xa3,
 195        0x6d, 0x51, 0xa3, 0x51, 0xa3, 0x51, 0x36, 0x29, 0x1b, 0x15
 196};
 197
 198static const char baud_co_60[] = {      /* 60 MHz clock option table (CD1400 J) */
 199        /* value =>    00    01   02    03    04 */
 200        /* divide by    8    32   128   512  2048 */
 201        0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03,
 202        0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
 203        0x00
 204};
 205
 206static const char baud_bpr_60[] = {     /* 60 MHz baud rate period table (CD1400 J) */
 207        0x00, 0x82, 0x21, 0xff, 0xdb, 0xc3, 0x92, 0x62, 0xc3, 0x62,
 208        0x41, 0xc3, 0x62, 0xc3, 0x62, 0xc3, 0x82, 0x62, 0x41, 0x32,
 209        0x21
 210};
 211
 212static const char baud_cor3[] = {       /* receive threshold */
 213        0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
 214        0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07,
 215        0x07
 216};
 217
 218/*
 219 * The Cyclades driver implements HW flow control as any serial driver.
 220 * The cyclades_port structure member rflow and the vector rflow_thr
 221 * allows us to take advantage of a special feature in the CD1400 to avoid
 222 * data loss even when the system interrupt latency is too high. These flags
 223 * are to be used only with very special applications. Setting these flags
 224 * requires the use of a special cable (DTR and RTS reversed). In the new
 225 * CD1400-based boards (rev. 6.00 or later), there is no need for special
 226 * cables.
 227 */
 228
 229static const char rflow_thr[] = {       /* rflow threshold */
 230        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 231        0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
 232        0x0a
 233};
 234
 235/*  The Cyclom-Ye has placed the sequential chips in non-sequential
 236 *  address order.  This look-up table overcomes that problem.
 237 */
 238static const unsigned int cy_chip_offset[] = { 0x0000,
 239        0x0400,
 240        0x0800,
 241        0x0C00,
 242        0x0200,
 243        0x0600,
 244        0x0A00,
 245        0x0E00
 246};
 247
 248/* PCI related definitions */
 249
 250#ifdef CONFIG_PCI
 251static const struct pci_device_id cy_pci_dev_id[] = {
 252        /* PCI < 1Mb */
 253        { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Y_Lo) },
 254        /* PCI > 1Mb */
 255        { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Y_Hi) },
 256        /* 4Y PCI < 1Mb */
 257        { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_4Y_Lo) },
 258        /* 4Y PCI > 1Mb */
 259        { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_4Y_Hi) },
 260        /* 8Y PCI < 1Mb */
 261        { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_8Y_Lo) },
 262        /* 8Y PCI > 1Mb */
 263        { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_8Y_Hi) },
 264        /* Z PCI < 1Mb */
 265        { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Z_Lo) },
 266        /* Z PCI > 1Mb */
 267        { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Z_Hi) },
 268        { }                     /* end of table */
 269};
 270MODULE_DEVICE_TABLE(pci, cy_pci_dev_id);
 271#endif
 272
 273static void cy_start(struct tty_struct *);
 274static void cy_set_line_char(struct cyclades_port *, struct tty_struct *);
 275static int cyz_issue_cmd(struct cyclades_card *, __u32, __u8, __u32);
 276#ifdef CONFIG_ISA
 277static unsigned detect_isa_irq(void __iomem *);
 278#endif                          /* CONFIG_ISA */
 279
 280#ifndef CONFIG_CYZ_INTR
 281static void cyz_poll(unsigned long);
 282
 283/* The Cyclades-Z polling cycle is defined by this variable */
 284static long cyz_polling_cycle = CZ_DEF_POLL;
 285
 286static DEFINE_TIMER(cyz_timerlist, cyz_poll, 0, 0);
 287
 288#else                           /* CONFIG_CYZ_INTR */
 289static void cyz_rx_restart(unsigned long);
 290static struct timer_list cyz_rx_full_timer[NR_PORTS];
 291#endif                          /* CONFIG_CYZ_INTR */
 292
 293static void cyy_writeb(struct cyclades_port *port, u32 reg, u8 val)
 294{
 295        struct cyclades_card *card = port->card;
 296
 297        cy_writeb(port->u.cyy.base_addr + (reg << card->bus_index), val);
 298}
 299
 300static u8 cyy_readb(struct cyclades_port *port, u32 reg)
 301{
 302        struct cyclades_card *card = port->card;
 303
 304        return readb(port->u.cyy.base_addr + (reg << card->bus_index));
 305}
 306
 307static inline bool cy_is_Z(struct cyclades_card *card)
 308{
 309        return card->num_chips == (unsigned int)-1;
 310}
 311
 312static inline bool __cyz_fpga_loaded(struct RUNTIME_9060 __iomem *ctl_addr)
 313{
 314        return readl(&ctl_addr->init_ctrl) & (1 << 17);
 315}
 316
 317static inline bool cyz_fpga_loaded(struct cyclades_card *card)
 318{
 319        return __cyz_fpga_loaded(card->ctl_addr.p9060);
 320}
 321
 322static bool cyz_is_loaded(struct cyclades_card *card)
 323{
 324        struct FIRM_ID __iomem *fw_id = card->base_addr + ID_ADDRESS;
 325
 326        return (card->hw_ver == ZO_V1 || cyz_fpga_loaded(card)) &&
 327                        readl(&fw_id->signature) == ZFIRM_ID;
 328}
 329
 330static int serial_paranoia_check(struct cyclades_port *info,
 331                const char *name, const char *routine)
 332{
 333#ifdef SERIAL_PARANOIA_CHECK
 334        if (!info) {
 335                printk(KERN_WARNING "cyc Warning: null cyclades_port for (%s) "
 336                                "in %s\n", name, routine);
 337                return 1;
 338        }
 339
 340        if (info->magic != CYCLADES_MAGIC) {
 341                printk(KERN_WARNING "cyc Warning: bad magic number for serial "
 342                                "struct (%s) in %s\n", name, routine);
 343                return 1;
 344        }
 345#endif
 346        return 0;
 347}
 348
 349/***********************************************************/
 350/********* Start of block of Cyclom-Y specific code ********/
 351
 352/* This routine waits up to 1000 micro-seconds for the previous
 353   command to the Cirrus chip to complete and then issues the
 354   new command.  An error is returned if the previous command
 355   didn't finish within the time limit.
 356
 357   This function is only called from inside spinlock-protected code.
 358 */
 359static int __cyy_issue_cmd(void __iomem *base_addr, u8 cmd, int index)
 360{
 361        void __iomem *ccr = base_addr + (CyCCR << index);
 362        unsigned int i;
 363
 364        /* Check to see that the previous command has completed */
 365        for (i = 0; i < 100; i++) {
 366                if (readb(ccr) == 0)
 367                        break;
 368                udelay(10L);
 369        }
 370        /* if the CCR never cleared, the previous command
 371           didn't finish within the "reasonable time" */
 372        if (i == 100)
 373                return -1;
 374
 375        /* Issue the new command */
 376        cy_writeb(ccr, cmd);
 377
 378        return 0;
 379}
 380
 381static inline int cyy_issue_cmd(struct cyclades_port *port, u8 cmd)
 382{
 383        return __cyy_issue_cmd(port->u.cyy.base_addr, cmd,
 384                        port->card->bus_index);
 385}
 386
 387#ifdef CONFIG_ISA
 388/* ISA interrupt detection code */
 389static unsigned detect_isa_irq(void __iomem *address)
 390{
 391        int irq;
 392        unsigned long irqs, flags;
 393        int save_xir, save_car;
 394        int index = 0;          /* IRQ probing is only for ISA */
 395
 396        /* forget possible initially masked and pending IRQ */
 397        irq = probe_irq_off(probe_irq_on());
 398
 399        /* Clear interrupts on the board first */
 400        cy_writeb(address + (Cy_ClrIntr << index), 0);
 401        /* Cy_ClrIntr is 0x1800 */
 402
 403        irqs = probe_irq_on();
 404        /* Wait ... */
 405        msleep(5);
 406
 407        /* Enable the Tx interrupts on the CD1400 */
 408        local_irq_save(flags);
 409        cy_writeb(address + (CyCAR << index), 0);
 410        __cyy_issue_cmd(address, CyCHAN_CTL | CyENB_XMTR, index);
 411
 412        cy_writeb(address + (CyCAR << index), 0);
 413        cy_writeb(address + (CySRER << index),
 414                  readb(address + (CySRER << index)) | CyTxRdy);
 415        local_irq_restore(flags);
 416
 417        /* Wait ... */
 418        msleep(5);
 419
 420        /* Check which interrupt is in use */
 421        irq = probe_irq_off(irqs);
 422
 423        /* Clean up */
 424        save_xir = (u_char) readb(address + (CyTIR << index));
 425        save_car = readb(address + (CyCAR << index));
 426        cy_writeb(address + (CyCAR << index), (save_xir & 0x3));
 427        cy_writeb(address + (CySRER << index),
 428                  readb(address + (CySRER << index)) & ~CyTxRdy);
 429        cy_writeb(address + (CyTIR << index), (save_xir & 0x3f));
 430        cy_writeb(address + (CyCAR << index), (save_car));
 431        cy_writeb(address + (Cy_ClrIntr << index), 0);
 432        /* Cy_ClrIntr is 0x1800 */
 433
 434        return (irq > 0) ? irq : 0;
 435}
 436#endif                          /* CONFIG_ISA */
 437
 438static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
 439                void __iomem *base_addr)
 440{
 441        struct cyclades_port *info;
 442        struct tty_port *port;
 443        int len, index = cinfo->bus_index;
 444        u8 ivr, save_xir, channel, save_car, data, char_count;
 445
 446#ifdef CY_DEBUG_INTERRUPTS
 447        printk(KERN_DEBUG "cyy_interrupt: rcvd intr, chip %d\n", chip);
 448#endif
 449        /* determine the channel & change to that context */
 450        save_xir = readb(base_addr + (CyRIR << index));
 451        channel = save_xir & CyIRChannel;
 452        info = &cinfo->ports[channel + chip * 4];
 453        port = &info->port;
 454        save_car = cyy_readb(info, CyCAR);
 455        cyy_writeb(info, CyCAR, save_xir);
 456        ivr = cyy_readb(info, CyRIVR) & CyIVRMask;
 457
 458        /* there is an open port for this data */
 459        if (ivr == CyIVRRxEx) { /* exception */
 460                data = cyy_readb(info, CyRDSR);
 461
 462                /* For statistics only */
 463                if (data & CyBREAK)
 464                        info->icount.brk++;
 465                else if (data & CyFRAME)
 466                        info->icount.frame++;
 467                else if (data & CyPARITY)
 468                        info->icount.parity++;
 469                else if (data & CyOVERRUN)
 470                        info->icount.overrun++;
 471
 472                if (data & info->ignore_status_mask) {
 473                        info->icount.rx++;
 474                        return;
 475                }
 476                if (tty_buffer_request_room(port, 1)) {
 477                        if (data & info->read_status_mask) {
 478                                if (data & CyBREAK) {
 479                                        tty_insert_flip_char(port,
 480                                                cyy_readb(info, CyRDSR),
 481                                                TTY_BREAK);
 482                                        info->icount.rx++;
 483                                        if (port->flags & ASYNC_SAK) {
 484                                                struct tty_struct *tty =
 485                                                        tty_port_tty_get(port);
 486                                                if (tty) {
 487                                                        do_SAK(tty);
 488                                                        tty_kref_put(tty);
 489                                                }
 490                                        }
 491                                } else if (data & CyFRAME) {
 492                                        tty_insert_flip_char(port,
 493                                                cyy_readb(info, CyRDSR),
 494                                                TTY_FRAME);
 495                                        info->icount.rx++;
 496                                        info->idle_stats.frame_errs++;
 497                                } else if (data & CyPARITY) {
 498                                        /* Pieces of seven... */
 499                                        tty_insert_flip_char(port,
 500                                                cyy_readb(info, CyRDSR),
 501                                                TTY_PARITY);
 502                                        info->icount.rx++;
 503                                        info->idle_stats.parity_errs++;
 504                                } else if (data & CyOVERRUN) {
 505                                        tty_insert_flip_char(port, 0,
 506                                                        TTY_OVERRUN);
 507                                        info->icount.rx++;
 508                                        /* If the flip buffer itself is
 509                                           overflowing, we still lose
 510                                           the next incoming character.
 511                                         */
 512                                        tty_insert_flip_char(port,
 513                                                cyy_readb(info, CyRDSR),
 514                                                TTY_FRAME);
 515                                        info->icount.rx++;
 516                                        info->idle_stats.overruns++;
 517                                /* These two conditions may imply */
 518                                /* a normal read should be done. */
 519                                /* } else if(data & CyTIMEOUT) { */
 520                                /* } else if(data & CySPECHAR) { */
 521                                } else {
 522                                        tty_insert_flip_char(port, 0,
 523                                                        TTY_NORMAL);
 524                                        info->icount.rx++;
 525                                }
 526                        } else {
 527                                tty_insert_flip_char(port, 0, TTY_NORMAL);
 528                                info->icount.rx++;
 529                        }
 530                } else {
 531                        /* there was a software buffer overrun and nothing
 532                         * could be done about it!!! */
 533                        info->icount.buf_overrun++;
 534                        info->idle_stats.overruns++;
 535                }
 536        } else {        /* normal character reception */
 537                /* load # chars available from the chip */
 538                char_count = cyy_readb(info, CyRDCR);
 539
 540#ifdef CY_ENABLE_MONITORING
 541                ++info->mon.int_count;
 542                info->mon.char_count += char_count;
 543                if (char_count > info->mon.char_max)
 544                        info->mon.char_max = char_count;
 545                info->mon.char_last = char_count;
 546#endif
 547                len = tty_buffer_request_room(port, char_count);
 548                while (len--) {
 549                        data = cyy_readb(info, CyRDSR);
 550                        tty_insert_flip_char(port, data, TTY_NORMAL);
 551                        info->idle_stats.recv_bytes++;
 552                        info->icount.rx++;
 553#ifdef CY_16Y_HACK
 554                        udelay(10L);
 555#endif
 556                }
 557                info->idle_stats.recv_idle = jiffies;
 558        }
 559        tty_schedule_flip(port);
 560
 561        /* end of service */
 562        cyy_writeb(info, CyRIR, save_xir & 0x3f);
 563        cyy_writeb(info, CyCAR, save_car);
 564}
 565
 566static void cyy_chip_tx(struct cyclades_card *cinfo, unsigned int chip,
 567                void __iomem *base_addr)
 568{
 569        struct cyclades_port *info;
 570        struct tty_struct *tty;
 571        int char_count, index = cinfo->bus_index;
 572        u8 save_xir, channel, save_car, outch;
 573
 574        /* Since we only get here when the transmit buffer
 575           is empty, we know we can always stuff a dozen
 576           characters. */
 577#ifdef CY_DEBUG_INTERRUPTS
 578        printk(KERN_DEBUG "cyy_interrupt: xmit intr, chip %d\n", chip);
 579#endif
 580
 581        /* determine the channel & change to that context */
 582        save_xir = readb(base_addr + (CyTIR << index));
 583        channel = save_xir & CyIRChannel;
 584        save_car = readb(base_addr + (CyCAR << index));
 585        cy_writeb(base_addr + (CyCAR << index), save_xir);
 586
 587        info = &cinfo->ports[channel + chip * 4];
 588        tty = tty_port_tty_get(&info->port);
 589        if (tty == NULL) {
 590                cyy_writeb(info, CySRER, cyy_readb(info, CySRER) & ~CyTxRdy);
 591                goto end;
 592        }
 593
 594        /* load the on-chip space for outbound data */
 595        char_count = info->xmit_fifo_size;
 596
 597        if (info->x_char) {     /* send special char */
 598                outch = info->x_char;
 599                cyy_writeb(info, CyTDR, outch);
 600                char_count--;
 601                info->icount.tx++;
 602                info->x_char = 0;
 603        }
 604
 605        if (info->breakon || info->breakoff) {
 606                if (info->breakon) {
 607                        cyy_writeb(info, CyTDR, 0);
 608                        cyy_writeb(info, CyTDR, 0x81);
 609                        info->breakon = 0;
 610                        char_count -= 2;
 611                }
 612                if (info->breakoff) {
 613                        cyy_writeb(info, CyTDR, 0);
 614                        cyy_writeb(info, CyTDR, 0x83);
 615                        info->breakoff = 0;
 616                        char_count -= 2;
 617                }
 618        }
 619
 620        while (char_count-- > 0) {
 621                if (!info->xmit_cnt) {
 622                        if (cyy_readb(info, CySRER) & CyTxMpty) {
 623                                cyy_writeb(info, CySRER,
 624                                        cyy_readb(info, CySRER) & ~CyTxMpty);
 625                        } else {
 626                                cyy_writeb(info, CySRER, CyTxMpty |
 627                                        (cyy_readb(info, CySRER) & ~CyTxRdy));
 628                        }
 629                        goto done;
 630                }
 631                if (info->port.xmit_buf == NULL) {
 632                        cyy_writeb(info, CySRER,
 633                                cyy_readb(info, CySRER) & ~CyTxRdy);
 634                        goto done;
 635                }
 636                if (tty->stopped || tty->hw_stopped) {
 637                        cyy_writeb(info, CySRER,
 638                                cyy_readb(info, CySRER) & ~CyTxRdy);
 639                        goto done;
 640                }
 641                /* Because the Embedded Transmit Commands have been enabled,
 642                 * we must check to see if the escape character, NULL, is being
 643                 * sent. If it is, we must ensure that there is room for it to
 644                 * be doubled in the output stream.  Therefore we no longer
 645                 * advance the pointer when the character is fetched, but
 646                 * rather wait until after the check for a NULL output
 647                 * character. This is necessary because there may not be room
 648                 * for the two chars needed to send a NULL.)
 649                 */
 650                outch = info->port.xmit_buf[info->xmit_tail];
 651                if (outch) {
 652                        info->xmit_cnt--;
 653                        info->xmit_tail = (info->xmit_tail + 1) &
 654                                        (SERIAL_XMIT_SIZE - 1);
 655                        cyy_writeb(info, CyTDR, outch);
 656                        info->icount.tx++;
 657                } else {
 658                        if (char_count > 1) {
 659                                info->xmit_cnt--;
 660                                info->xmit_tail = (info->xmit_tail + 1) &
 661                                        (SERIAL_XMIT_SIZE - 1);
 662                                cyy_writeb(info, CyTDR, outch);
 663                                cyy_writeb(info, CyTDR, 0);
 664                                info->icount.tx++;
 665                                char_count--;
 666                        }
 667                }
 668        }
 669
 670done:
 671        tty_wakeup(tty);
 672        tty_kref_put(tty);
 673end:
 674        /* end of service */
 675        cyy_writeb(info, CyTIR, save_xir & 0x3f);
 676        cyy_writeb(info, CyCAR, save_car);
 677}
 678
 679static void cyy_chip_modem(struct cyclades_card *cinfo, int chip,
 680                void __iomem *base_addr)
 681{
 682        struct cyclades_port *info;
 683        struct tty_struct *tty;
 684        int index = cinfo->bus_index;
 685        u8 save_xir, channel, save_car, mdm_change, mdm_status;
 686
 687        /* determine the channel & change to that context */
 688        save_xir = readb(base_addr + (CyMIR << index));
 689        channel = save_xir & CyIRChannel;
 690        info = &cinfo->ports[channel + chip * 4];
 691        save_car = cyy_readb(info, CyCAR);
 692        cyy_writeb(info, CyCAR, save_xir);
 693
 694        mdm_change = cyy_readb(info, CyMISR);
 695        mdm_status = cyy_readb(info, CyMSVR1);
 696
 697        tty = tty_port_tty_get(&info->port);
 698        if (!tty)
 699                goto end;
 700
 701        if (mdm_change & CyANY_DELTA) {
 702                /* For statistics only */
 703                if (mdm_change & CyDCD)
 704                        info->icount.dcd++;
 705                if (mdm_change & CyCTS)
 706                        info->icount.cts++;
 707                if (mdm_change & CyDSR)
 708                        info->icount.dsr++;
 709                if (mdm_change & CyRI)
 710                        info->icount.rng++;
 711
 712                wake_up_interruptible(&info->port.delta_msr_wait);
 713        }
 714
 715        if ((mdm_change & CyDCD) && tty_port_check_carrier(&info->port)) {
 716                if (mdm_status & CyDCD)
 717                        wake_up_interruptible(&info->port.open_wait);
 718                else
 719                        tty_hangup(tty);
 720        }
 721        if ((mdm_change & CyCTS) && tty_port_cts_enabled(&info->port)) {
 722                if (tty->hw_stopped) {
 723                        if (mdm_status & CyCTS) {
 724                                /* cy_start isn't used
 725                                   because... !!! */
 726                                tty->hw_stopped = 0;
 727                                cyy_writeb(info, CySRER,
 728                                        cyy_readb(info, CySRER) | CyTxRdy);
 729                                tty_wakeup(tty);
 730                        }
 731                } else {
 732                        if (!(mdm_status & CyCTS)) {
 733                                /* cy_stop isn't used
 734                                   because ... !!! */
 735                                tty->hw_stopped = 1;
 736                                cyy_writeb(info, CySRER,
 737                                        cyy_readb(info, CySRER) & ~CyTxRdy);
 738                        }
 739                }
 740        }
 741/*      if (mdm_change & CyDSR) {
 742        }
 743        if (mdm_change & CyRI) {
 744        }*/
 745        tty_kref_put(tty);
 746end:
 747        /* end of service */
 748        cyy_writeb(info, CyMIR, save_xir & 0x3f);
 749        cyy_writeb(info, CyCAR, save_car);
 750}
 751
 752/* The real interrupt service routine is called
 753   whenever the card wants its hand held--chars
 754   received, out buffer empty, modem change, etc.
 755 */
 756static irqreturn_t cyy_interrupt(int irq, void *dev_id)
 757{
 758        int status;
 759        struct cyclades_card *cinfo = dev_id;
 760        void __iomem *base_addr, *card_base_addr;
 761        unsigned int chip, too_many, had_work;
 762        int index;
 763
 764        if (unlikely(cinfo == NULL)) {
 765#ifdef CY_DEBUG_INTERRUPTS
 766                printk(KERN_DEBUG "cyy_interrupt: spurious interrupt %d\n",
 767                                irq);
 768#endif
 769                return IRQ_NONE;        /* spurious interrupt */
 770        }
 771
 772        card_base_addr = cinfo->base_addr;
 773        index = cinfo->bus_index;
 774
 775        /* card was not initialized yet (e.g. DEBUG_SHIRQ) */
 776        if (unlikely(card_base_addr == NULL))
 777                return IRQ_HANDLED;
 778
 779        /* This loop checks all chips in the card.  Make a note whenever
 780           _any_ chip had some work to do, as this is considered an
 781           indication that there will be more to do.  Only when no chip
 782           has any work does this outermost loop exit.
 783         */
 784        do {
 785                had_work = 0;
 786                for (chip = 0; chip < cinfo->num_chips; chip++) {
 787                        base_addr = cinfo->base_addr +
 788                                        (cy_chip_offset[chip] << index);
 789                        too_many = 0;
 790                        while ((status = readb(base_addr +
 791                                                (CySVRR << index))) != 0x00) {
 792                                had_work++;
 793                        /* The purpose of the following test is to ensure that
 794                           no chip can monopolize the driver.  This forces the
 795                           chips to be checked in a round-robin fashion (after
 796                           draining each of a bunch (1000) of characters).
 797                         */
 798                                if (1000 < too_many++)
 799                                        break;
 800                                spin_lock(&cinfo->card_lock);
 801                                if (status & CySRReceive) /* rx intr */
 802                                        cyy_chip_rx(cinfo, chip, base_addr);
 803                                if (status & CySRTransmit) /* tx intr */
 804                                        cyy_chip_tx(cinfo, chip, base_addr);
 805                                if (status & CySRModem) /* modem intr */
 806                                        cyy_chip_modem(cinfo, chip, base_addr);
 807                                spin_unlock(&cinfo->card_lock);
 808                        }
 809                }
 810        } while (had_work);
 811
 812        /* clear interrupts */
 813        spin_lock(&cinfo->card_lock);
 814        cy_writeb(card_base_addr + (Cy_ClrIntr << index), 0);
 815        /* Cy_ClrIntr is 0x1800 */
 816        spin_unlock(&cinfo->card_lock);
 817        return IRQ_HANDLED;
 818}                               /* cyy_interrupt */
 819
 820static void cyy_change_rts_dtr(struct cyclades_port *info, unsigned int set,
 821                unsigned int clear)
 822{
 823        struct cyclades_card *card = info->card;
 824        int channel = info->line - card->first_line;
 825        u32 rts, dtr, msvrr, msvrd;
 826
 827        channel &= 0x03;
 828
 829        if (info->rtsdtr_inv) {
 830                msvrr = CyMSVR2;
 831                msvrd = CyMSVR1;
 832                rts = CyDTR;
 833                dtr = CyRTS;
 834        } else {
 835                msvrr = CyMSVR1;
 836                msvrd = CyMSVR2;
 837                rts = CyRTS;
 838                dtr = CyDTR;
 839        }
 840        if (set & TIOCM_RTS) {
 841                cyy_writeb(info, CyCAR, channel);
 842                cyy_writeb(info, msvrr, rts);
 843        }
 844        if (clear & TIOCM_RTS) {
 845                cyy_writeb(info, CyCAR, channel);
 846                cyy_writeb(info, msvrr, ~rts);
 847        }
 848        if (set & TIOCM_DTR) {
 849                cyy_writeb(info, CyCAR, channel);
 850                cyy_writeb(info, msvrd, dtr);
 851#ifdef CY_DEBUG_DTR
 852                printk(KERN_DEBUG "cyc:set_modem_info raising DTR\n");
 853                printk(KERN_DEBUG "     status: 0x%x, 0x%x\n",
 854                        cyy_readb(info, CyMSVR1),
 855                        cyy_readb(info, CyMSVR2));
 856#endif
 857        }
 858        if (clear & TIOCM_DTR) {
 859                cyy_writeb(info, CyCAR, channel);
 860                cyy_writeb(info, msvrd, ~dtr);
 861#ifdef CY_DEBUG_DTR
 862                printk(KERN_DEBUG "cyc:set_modem_info dropping DTR\n");
 863                printk(KERN_DEBUG "     status: 0x%x, 0x%x\n",
 864                        cyy_readb(info, CyMSVR1),
 865                        cyy_readb(info, CyMSVR2));
 866#endif
 867        }
 868}
 869
 870/***********************************************************/
 871/********* End of block of Cyclom-Y specific code **********/
 872/******** Start of block of Cyclades-Z specific code *******/
 873/***********************************************************/
 874
 875static int
 876cyz_fetch_msg(struct cyclades_card *cinfo,
 877                __u32 *channel, __u8 *cmd, __u32 *param)
 878{
 879        struct BOARD_CTRL __iomem *board_ctrl = cinfo->board_ctrl;
 880        unsigned long loc_doorbell;
 881
 882        loc_doorbell = readl(&cinfo->ctl_addr.p9060->loc_doorbell);
 883        if (loc_doorbell) {
 884                *cmd = (char)(0xff & loc_doorbell);
 885                *channel = readl(&board_ctrl->fwcmd_channel);
 886                *param = (__u32) readl(&board_ctrl->fwcmd_param);
 887                cy_writel(&cinfo->ctl_addr.p9060->loc_doorbell, 0xffffffff);
 888                return 1;
 889        }
 890        return 0;
 891}                               /* cyz_fetch_msg */
 892
 893static int
 894cyz_issue_cmd(struct cyclades_card *cinfo,
 895                __u32 channel, __u8 cmd, __u32 param)
 896{
 897        struct BOARD_CTRL __iomem *board_ctrl = cinfo->board_ctrl;
 898        __u32 __iomem *pci_doorbell;
 899        unsigned int index;
 900
 901        if (!cyz_is_loaded(cinfo))
 902                return -1;
 903
 904        index = 0;
 905        pci_doorbell = &cinfo->ctl_addr.p9060->pci_doorbell;
 906        while ((readl(pci_doorbell) & 0xff) != 0) {
 907                if (index++ == 1000)
 908                        return (int)(readl(pci_doorbell) & 0xff);
 909                udelay(50L);
 910        }
 911        cy_writel(&board_ctrl->hcmd_channel, channel);
 912        cy_writel(&board_ctrl->hcmd_param, param);
 913        cy_writel(pci_doorbell, (long)cmd);
 914
 915        return 0;
 916}                               /* cyz_issue_cmd */
 917
 918static void cyz_handle_rx(struct cyclades_port *info)
 919{
 920        struct BUF_CTRL __iomem *buf_ctrl = info->u.cyz.buf_ctrl;
 921        struct cyclades_card *cinfo = info->card;
 922        struct tty_port *port = &info->port;
 923        unsigned int char_count;
 924        int len;
 925#ifdef BLOCKMOVE
 926        unsigned char *buf;
 927#else
 928        char data;
 929#endif
 930        __u32 rx_put, rx_get, new_rx_get, rx_bufsize, rx_bufaddr;
 931
 932        rx_get = new_rx_get = readl(&buf_ctrl->rx_get);
 933        rx_put = readl(&buf_ctrl->rx_put);
 934        rx_bufsize = readl(&buf_ctrl->rx_bufsize);
 935        rx_bufaddr = readl(&buf_ctrl->rx_bufaddr);
 936        if (rx_put >= rx_get)
 937                char_count = rx_put - rx_get;
 938        else
 939                char_count = rx_put - rx_get + rx_bufsize;
 940
 941        if (!char_count)
 942                return;
 943
 944#ifdef CY_ENABLE_MONITORING
 945        info->mon.int_count++;
 946        info->mon.char_count += char_count;
 947        if (char_count > info->mon.char_max)
 948                info->mon.char_max = char_count;
 949        info->mon.char_last = char_count;
 950#endif
 951
 952#ifdef BLOCKMOVE
 953        /* we'd like to use memcpy(t, f, n) and memset(s, c, count)
 954           for performance, but because of buffer boundaries, there
 955           may be several steps to the operation */
 956        while (1) {
 957                len = tty_prepare_flip_string(port, &buf,
 958                                char_count);
 959                if (!len)
 960                        break;
 961
 962                len = min_t(unsigned int, min(len, char_count),
 963                                rx_bufsize - new_rx_get);
 964
 965                memcpy_fromio(buf, cinfo->base_addr +
 966                                rx_bufaddr + new_rx_get, len);
 967
 968                new_rx_get = (new_rx_get + len) &
 969                                (rx_bufsize - 1);
 970                char_count -= len;
 971                info->icount.rx += len;
 972                info->idle_stats.recv_bytes += len;
 973        }
 974#else
 975        len = tty_buffer_request_room(port, char_count);
 976        while (len--) {
 977                data = readb(cinfo->base_addr + rx_bufaddr +
 978                                new_rx_get);
 979                new_rx_get = (new_rx_get + 1) &
 980                                        (rx_bufsize - 1);
 981                tty_insert_flip_char(port, data, TTY_NORMAL);
 982                info->idle_stats.recv_bytes++;
 983                info->icount.rx++;
 984        }
 985#endif
 986#ifdef CONFIG_CYZ_INTR
 987        /* Recalculate the number of chars in the RX buffer and issue
 988           a cmd in case it's higher than the RX high water mark */
 989        rx_put = readl(&buf_ctrl->rx_put);
 990        if (rx_put >= rx_get)
 991                char_count = rx_put - rx_get;
 992        else
 993                char_count = rx_put - rx_get + rx_bufsize;
 994        if (char_count >= readl(&buf_ctrl->rx_threshold) &&
 995                        !timer_pending(&cyz_rx_full_timer[
 996                                        info->line]))
 997                mod_timer(&cyz_rx_full_timer[info->line],
 998                                jiffies + 1);
 999#endif
1000        info->idle_stats.recv_idle = jiffies;
1001        tty_schedule_flip(&info->port);
1002
1003        /* Update rx_get */
1004        cy_writel(&buf_ctrl->rx_get, new_rx_get);
1005}
1006
1007static void cyz_handle_tx(struct cyclades_port *info)
1008{
1009        struct BUF_CTRL __iomem *buf_ctrl = info->u.cyz.buf_ctrl;
1010        struct cyclades_card *cinfo = info->card;
1011        struct tty_struct *tty;
1012        u8 data;
1013        unsigned int char_count;
1014#ifdef BLOCKMOVE
1015        int small_count;
1016#endif
1017        __u32 tx_put, tx_get, tx_bufsize, tx_bufaddr;
1018
1019        if (info->xmit_cnt <= 0)        /* Nothing to transmit */
1020                return;
1021
1022        tx_get = readl(&buf_ctrl->tx_get);
1023        tx_put = readl(&buf_ctrl->tx_put);
1024        tx_bufsize = readl(&buf_ctrl->tx_bufsize);
1025        tx_bufaddr = readl(&buf_ctrl->tx_bufaddr);
1026        if (tx_put >= tx_get)
1027                char_count = tx_get - tx_put - 1 + tx_bufsize;
1028        else
1029                char_count = tx_get - tx_put - 1;
1030
1031        if (!char_count)
1032                return;
1033                
1034        tty = tty_port_tty_get(&info->port);
1035        if (tty == NULL)
1036                goto ztxdone;
1037
1038        if (info->x_char) {     /* send special char */
1039                data = info->x_char;
1040
1041                cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data);
1042                tx_put = (tx_put + 1) & (tx_bufsize - 1);
1043                info->x_char = 0;
1044                char_count--;
1045                info->icount.tx++;
1046        }
1047#ifdef BLOCKMOVE
1048        while (0 < (small_count = min_t(unsigned int,
1049                        tx_bufsize - tx_put, min_t(unsigned int,
1050                                (SERIAL_XMIT_SIZE - info->xmit_tail),
1051                                min_t(unsigned int, info->xmit_cnt,
1052                                        char_count))))) {
1053
1054                memcpy_toio((char *)(cinfo->base_addr + tx_bufaddr + tx_put),
1055                                &info->port.xmit_buf[info->xmit_tail],
1056                                small_count);
1057
1058                tx_put = (tx_put + small_count) & (tx_bufsize - 1);
1059                char_count -= small_count;
1060                info->icount.tx += small_count;
1061                info->xmit_cnt -= small_count;
1062                info->xmit_tail = (info->xmit_tail + small_count) &
1063                                (SERIAL_XMIT_SIZE - 1);
1064        }
1065#else
1066        while (info->xmit_cnt && char_count) {
1067                data = info->port.xmit_buf[info->xmit_tail];
1068                info->xmit_cnt--;
1069                info->xmit_tail = (info->xmit_tail + 1) &
1070                                (SERIAL_XMIT_SIZE - 1);
1071
1072                cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data);
1073                tx_put = (tx_put + 1) & (tx_bufsize - 1);
1074                char_count--;
1075                info->icount.tx++;
1076        }
1077#endif
1078        tty_wakeup(tty);
1079        tty_kref_put(tty);
1080ztxdone:
1081        /* Update tx_put */
1082        cy_writel(&buf_ctrl->tx_put, tx_put);
1083}
1084
1085static void cyz_handle_cmd(struct cyclades_card *cinfo)
1086{
1087        struct BOARD_CTRL __iomem *board_ctrl = cinfo->board_ctrl;
1088        struct cyclades_port *info;
1089        __u32 channel, param, fw_ver;
1090        __u8 cmd;
1091        int special_count;
1092        int delta_count;
1093
1094        fw_ver = readl(&board_ctrl->fw_version);
1095
1096        while (cyz_fetch_msg(cinfo, &channel, &cmd, &param) == 1) {
1097                special_count = 0;
1098                delta_count = 0;
1099                info = &cinfo->ports[channel];
1100
1101                switch (cmd) {
1102                case C_CM_PR_ERROR:
1103                        tty_insert_flip_char(&info->port, 0, TTY_PARITY);
1104                        info->icount.rx++;
1105                        special_count++;
1106                        break;
1107                case C_CM_FR_ERROR:
1108                        tty_insert_flip_char(&info->port, 0, TTY_FRAME);
1109                        info->icount.rx++;
1110                        special_count++;
1111                        break;
1112                case C_CM_RXBRK:
1113                        tty_insert_flip_char(&info->port, 0, TTY_BREAK);
1114                        info->icount.rx++;
1115                        special_count++;
1116                        break;
1117                case C_CM_MDCD:
1118                        info->icount.dcd++;
1119                        delta_count++;
1120                        if (tty_port_check_carrier(&info->port)) {
1121                                u32 dcd = fw_ver > 241 ? param :
1122                                        readl(&info->u.cyz.ch_ctrl->rs_status);
1123                                if (dcd & C_RS_DCD)
1124                                        wake_up_interruptible(&info->port.open_wait);
1125                                else
1126                                        tty_port_tty_hangup(&info->port, false);
1127                        }
1128                        break;
1129                case C_CM_MCTS:
1130                        info->icount.cts++;
1131                        delta_count++;
1132                        break;
1133                case C_CM_MRI:
1134                        info->icount.rng++;
1135                        delta_count++;
1136                        break;
1137                case C_CM_MDSR:
1138                        info->icount.dsr++;
1139                        delta_count++;
1140                        break;
1141#ifdef Z_WAKE
1142                case C_CM_IOCTLW:
1143                        complete(&info->shutdown_wait);
1144                        break;
1145#endif
1146#ifdef CONFIG_CYZ_INTR
1147                case C_CM_RXHIWM:
1148                case C_CM_RXNNDT:
1149                case C_CM_INTBACK2:
1150                        /* Reception Interrupt */
1151#ifdef CY_DEBUG_INTERRUPTS
1152                        printk(KERN_DEBUG "cyz_interrupt: rcvd intr, card %d, "
1153                                        "port %ld\n", info->card, channel);
1154#endif
1155                        cyz_handle_rx(info);
1156                        break;
1157                case C_CM_TXBEMPTY:
1158                case C_CM_TXLOWWM:
1159                case C_CM_INTBACK:
1160                        /* Transmission Interrupt */
1161#ifdef CY_DEBUG_INTERRUPTS
1162                        printk(KERN_DEBUG "cyz_interrupt: xmit intr, card %d, "
1163                                        "port %ld\n", info->card, channel);
1164#endif
1165                        cyz_handle_tx(info);
1166                        break;
1167#endif                          /* CONFIG_CYZ_INTR */
1168                case C_CM_FATAL:
1169                        /* should do something with this !!! */
1170                        break;
1171                default:
1172                        break;
1173                }
1174                if (delta_count)
1175                        wake_up_interruptible(&info->port.delta_msr_wait);
1176                if (special_count)
1177                        tty_schedule_flip(&info->port);
1178        }
1179}
1180
1181#ifdef CONFIG_CYZ_INTR
1182static irqreturn_t cyz_interrupt(int irq, void *dev_id)
1183{
1184        struct cyclades_card *cinfo = dev_id;
1185
1186        if (unlikely(!cyz_is_loaded(cinfo))) {
1187#ifdef CY_DEBUG_INTERRUPTS
1188                printk(KERN_DEBUG "cyz_interrupt: board not yet loaded "
1189                                "(IRQ%d).\n", irq);
1190#endif
1191                return IRQ_NONE;
1192        }
1193
1194        /* Handle the interrupts */
1195        cyz_handle_cmd(cinfo);
1196
1197        return IRQ_HANDLED;
1198}                               /* cyz_interrupt */
1199
1200static void cyz_rx_restart(unsigned long arg)
1201{
1202        struct cyclades_port *info = (struct cyclades_port *)arg;
1203        struct cyclades_card *card = info->card;
1204        int retval;
1205        __u32 channel = info->line - card->first_line;
1206        unsigned long flags;
1207
1208        spin_lock_irqsave(&card->card_lock, flags);
1209        retval = cyz_issue_cmd(card, channel, C_CM_INTBACK2, 0L);
1210        if (retval != 0) {
1211                printk(KERN_ERR "cyc:cyz_rx_restart retval on ttyC%d was %x\n",
1212                        info->line, retval);
1213        }
1214        spin_unlock_irqrestore(&card->card_lock, flags);
1215}
1216
1217#else                           /* CONFIG_CYZ_INTR */
1218
1219static void cyz_poll(unsigned long arg)
1220{
1221        struct cyclades_card *cinfo;
1222        struct cyclades_port *info;
1223        unsigned long expires = jiffies + HZ;
1224        unsigned int port, card;
1225
1226        for (card = 0; card < NR_CARDS; card++) {
1227                cinfo = &cy_card[card];
1228
1229                if (!cy_is_Z(cinfo))
1230                        continue;
1231                if (!cyz_is_loaded(cinfo))
1232                        continue;
1233
1234        /* Skip first polling cycle to avoid racing conditions with the FW */
1235                if (!cinfo->intr_enabled) {
1236                        cinfo->intr_enabled = 1;
1237                        continue;
1238                }
1239
1240                cyz_handle_cmd(cinfo);
1241
1242                for (port = 0; port < cinfo->nports; port++) {
1243                        info = &cinfo->ports[port];
1244
1245                        if (!info->throttle)
1246                                cyz_handle_rx(info);
1247                        cyz_handle_tx(info);
1248                }
1249                /* poll every 'cyz_polling_cycle' period */
1250                expires = jiffies + cyz_polling_cycle;
1251        }
1252        mod_timer(&cyz_timerlist, expires);
1253}                               /* cyz_poll */
1254
1255#endif                          /* CONFIG_CYZ_INTR */
1256
1257/********** End of block of Cyclades-Z specific code *********/
1258/***********************************************************/
1259
1260/* This is called whenever a port becomes active;
1261   interrupts are enabled and DTR & RTS are turned on.
1262 */
1263static int cy_startup(struct cyclades_port *info, struct tty_struct *tty)
1264{
1265        struct cyclades_card *card;
1266        unsigned long flags;
1267        int retval = 0;
1268        int channel;
1269        unsigned long page;
1270
1271        card = info->card;
1272        channel = info->line - card->first_line;
1273
1274        page = get_zeroed_page(GFP_KERNEL);
1275        if (!page)
1276                return -ENOMEM;
1277
1278        spin_lock_irqsave(&card->card_lock, flags);
1279
1280        if (tty_port_initialized(&info->port))
1281                goto errout;
1282
1283        if (!info->type) {
1284                set_bit(TTY_IO_ERROR, &tty->flags);
1285                goto errout;
1286        }
1287
1288        if (info->port.xmit_buf)
1289                free_page(page);
1290        else
1291                info->port.xmit_buf = (unsigned char *)page;
1292
1293        spin_unlock_irqrestore(&card->card_lock, flags);
1294
1295        cy_set_line_char(info, tty);
1296
1297        if (!cy_is_Z(card)) {
1298                channel &= 0x03;
1299
1300                spin_lock_irqsave(&card->card_lock, flags);
1301
1302                cyy_writeb(info, CyCAR, channel);
1303
1304                cyy_writeb(info, CyRTPR,
1305                        (info->default_timeout ? info->default_timeout : 0x02));
1306                /* 10ms rx timeout */
1307
1308                cyy_issue_cmd(info, CyCHAN_CTL | CyENB_RCVR | CyENB_XMTR);
1309
1310                cyy_change_rts_dtr(info, TIOCM_RTS | TIOCM_DTR, 0);
1311
1312                cyy_writeb(info, CySRER, cyy_readb(info, CySRER) | CyRxData);
1313        } else {
1314                struct CH_CTRL __iomem *ch_ctrl = info->u.cyz.ch_ctrl;
1315
1316                if (!cyz_is_loaded(card))
1317                        return -ENODEV;
1318
1319#ifdef CY_DEBUG_OPEN
1320                printk(KERN_DEBUG "cyc startup Z card %d, channel %d, "
1321                        "base_addr %p\n", card, channel, card->base_addr);
1322#endif
1323                spin_lock_irqsave(&card->card_lock, flags);
1324
1325                cy_writel(&ch_ctrl->op_mode, C_CH_ENABLE);
1326#ifdef Z_WAKE
1327#ifdef CONFIG_CYZ_INTR
1328                cy_writel(&ch_ctrl->intr_enable,
1329                          C_IN_TXBEMPTY | C_IN_TXLOWWM | C_IN_RXHIWM |
1330                          C_IN_RXNNDT | C_IN_IOCTLW | C_IN_MDCD);
1331#else
1332                cy_writel(&ch_ctrl->intr_enable,
1333                          C_IN_IOCTLW | C_IN_MDCD);
1334#endif                          /* CONFIG_CYZ_INTR */
1335#else
1336#ifdef CONFIG_CYZ_INTR
1337                cy_writel(&ch_ctrl->intr_enable,
1338                          C_IN_TXBEMPTY | C_IN_TXLOWWM | C_IN_RXHIWM |
1339                          C_IN_RXNNDT | C_IN_MDCD);
1340#else
1341                cy_writel(&ch_ctrl->intr_enable, C_IN_MDCD);
1342#endif                          /* CONFIG_CYZ_INTR */
1343#endif                          /* Z_WAKE */
1344
1345                retval = cyz_issue_cmd(card, channel, C_CM_IOCTL, 0L);
1346                if (retval != 0) {
1347                        printk(KERN_ERR "cyc:startup(1) retval on ttyC%d was "
1348                                "%x\n", info->line, retval);
1349                }
1350
1351                /* Flush RX buffers before raising DTR and RTS */
1352                retval = cyz_issue_cmd(card, channel, C_CM_FLUSH_RX, 0L);
1353                if (retval != 0) {
1354                        printk(KERN_ERR "cyc:startup(2) retval on ttyC%d was "
1355                                "%x\n", info->line, retval);
1356                }
1357
1358                /* set timeout !!! */
1359                /* set RTS and DTR !!! */
1360                tty_port_raise_dtr_rts(&info->port);
1361
1362                /* enable send, recv, modem !!! */
1363        }
1364
1365        tty_port_set_initialized(&info->port, 1);
1366
1367        clear_bit(TTY_IO_ERROR, &tty->flags);
1368        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
1369        info->breakon = info->breakoff = 0;
1370        memset((char *)&info->idle_stats, 0, sizeof(info->idle_stats));
1371        info->idle_stats.in_use =
1372        info->idle_stats.recv_idle =
1373        info->idle_stats.xmit_idle = jiffies;
1374
1375        spin_unlock_irqrestore(&card->card_lock, flags);
1376
1377#ifdef CY_DEBUG_OPEN
1378        printk(KERN_DEBUG "cyc startup done\n");
1379#endif
1380        return 0;
1381
1382errout:
1383        spin_unlock_irqrestore(&card->card_lock, flags);
1384        free_page(page);
1385        return retval;
1386}                               /* startup */
1387
1388static void start_xmit(struct cyclades_port *info)
1389{
1390        struct cyclades_card *card = info->card;
1391        unsigned long flags;
1392        int channel = info->line - card->first_line;
1393
1394        if (!cy_is_Z(card)) {
1395                spin_lock_irqsave(&card->card_lock, flags);
1396                cyy_writeb(info, CyCAR, channel & 0x03);
1397                cyy_writeb(info, CySRER, cyy_readb(info, CySRER) | CyTxRdy);
1398                spin_unlock_irqrestore(&card->card_lock, flags);
1399        } else {
1400#ifdef CONFIG_CYZ_INTR
1401                int retval;
1402
1403                spin_lock_irqsave(&card->card_lock, flags);
1404                retval = cyz_issue_cmd(card, channel, C_CM_INTBACK, 0L);
1405                if (retval != 0) {
1406                        printk(KERN_ERR "cyc:start_xmit retval on ttyC%d was "
1407                                "%x\n", info->line, retval);
1408                }
1409                spin_unlock_irqrestore(&card->card_lock, flags);
1410#else                           /* CONFIG_CYZ_INTR */
1411                /* Don't have to do anything at this time */
1412#endif                          /* CONFIG_CYZ_INTR */
1413        }
1414}                               /* start_xmit */
1415
1416/*
1417 * This routine shuts down a serial port; interrupts are disabled,
1418 * and DTR is dropped if the hangup on close termio flag is on.
1419 */
1420static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty)
1421{
1422        struct cyclades_card *card;
1423        unsigned long flags;
1424
1425        if (!tty_port_initialized(&info->port))
1426                return;
1427
1428        card = info->card;
1429        if (!cy_is_Z(card)) {
1430                spin_lock_irqsave(&card->card_lock, flags);
1431
1432                /* Clear delta_msr_wait queue to avoid mem leaks. */
1433                wake_up_interruptible(&info->port.delta_msr_wait);
1434
1435                if (info->port.xmit_buf) {
1436                        unsigned char *temp;
1437                        temp = info->port.xmit_buf;
1438                        info->port.xmit_buf = NULL;
1439                        free_page((unsigned long)temp);
1440                }
1441                if (C_HUPCL(tty))
1442                        cyy_change_rts_dtr(info, 0, TIOCM_RTS | TIOCM_DTR);
1443
1444                cyy_issue_cmd(info, CyCHAN_CTL | CyDIS_RCVR);
1445                /* it may be appropriate to clear _XMIT at
1446                   some later date (after testing)!!! */
1447
1448                set_bit(TTY_IO_ERROR, &tty->flags);
1449                tty_port_set_initialized(&info->port, 0);
1450                spin_unlock_irqrestore(&card->card_lock, flags);
1451        } else {
1452#ifdef CY_DEBUG_OPEN
1453                int channel = info->line - card->first_line;
1454                printk(KERN_DEBUG "cyc shutdown Z card %d, channel %d, "
1455                        "base_addr %p\n", card, channel, card->base_addr);
1456#endif
1457
1458                if (!cyz_is_loaded(card))
1459                        return;
1460
1461                spin_lock_irqsave(&card->card_lock, flags);
1462
1463                if (info->port.xmit_buf) {
1464                        unsigned char *temp;
1465                        temp = info->port.xmit_buf;
1466                        info->port.xmit_buf = NULL;
1467                        free_page((unsigned long)temp);
1468                }
1469
1470                if (C_HUPCL(tty))
1471                        tty_port_lower_dtr_rts(&info->port);
1472
1473                set_bit(TTY_IO_ERROR, &tty->flags);
1474                tty_port_set_initialized(&info->port, 0);
1475
1476                spin_unlock_irqrestore(&card->card_lock, flags);
1477        }
1478
1479#ifdef CY_DEBUG_OPEN
1480        printk(KERN_DEBUG "cyc shutdown done\n");
1481#endif
1482}                               /* shutdown */
1483
1484/*
1485 * ------------------------------------------------------------
1486 * cy_open() and friends
1487 * ------------------------------------------------------------
1488 */
1489
1490/*
1491 * This routine is called whenever a serial port is opened.  It
1492 * performs the serial-specific initialization for the tty structure.
1493 */
1494static int cy_open(struct tty_struct *tty, struct file *filp)
1495{
1496        struct cyclades_port *info;
1497        unsigned int i, line = tty->index;
1498        int retval;
1499
1500        for (i = 0; i < NR_CARDS; i++)
1501                if (line < cy_card[i].first_line + cy_card[i].nports &&
1502                                line >= cy_card[i].first_line)
1503                        break;
1504        if (i >= NR_CARDS)
1505                return -ENODEV;
1506        info = &cy_card[i].ports[line - cy_card[i].first_line];
1507        if (info->line < 0)
1508                return -ENODEV;
1509
1510        /* If the card's firmware hasn't been loaded,
1511           treat it as absent from the system.  This
1512           will make the user pay attention.
1513         */
1514        if (cy_is_Z(info->card)) {
1515                struct cyclades_card *cinfo = info->card;
1516                struct FIRM_ID __iomem *firm_id = cinfo->base_addr + ID_ADDRESS;
1517
1518                if (!cyz_is_loaded(cinfo)) {
1519                        if (cinfo->hw_ver == ZE_V1 && cyz_fpga_loaded(cinfo) &&
1520                                        readl(&firm_id->signature) ==
1521                                        ZFIRM_HLT) {
1522                                printk(KERN_ERR "cyc:Cyclades-Z Error: you "
1523                                        "need an external power supply for "
1524                                        "this number of ports.\nFirmware "
1525                                        "halted.\n");
1526                        } else {
1527                                printk(KERN_ERR "cyc:Cyclades-Z firmware not "
1528                                        "yet loaded\n");
1529                        }
1530                        return -ENODEV;
1531                }
1532#ifdef CONFIG_CYZ_INTR
1533                else {
1534                /* In case this Z board is operating in interrupt mode, its
1535                   interrupts should be enabled as soon as the first open
1536                   happens to one of its ports. */
1537                        if (!cinfo->intr_enabled) {
1538                                u16 intr;
1539
1540                                /* Enable interrupts on the PLX chip */
1541                                intr = readw(&cinfo->ctl_addr.p9060->
1542                                                intr_ctrl_stat) | 0x0900;
1543                                cy_writew(&cinfo->ctl_addr.p9060->
1544                                                intr_ctrl_stat, intr);
1545                                /* Enable interrupts on the FW */
1546                                retval = cyz_issue_cmd(cinfo, 0,
1547                                                C_CM_IRQ_ENBL, 0L);
1548                                if (retval != 0) {
1549                                        printk(KERN_ERR "cyc:IRQ enable retval "
1550                                                "was %x\n", retval);
1551                                }
1552                                cinfo->intr_enabled = 1;
1553                        }
1554                }
1555#endif                          /* CONFIG_CYZ_INTR */
1556                /* Make sure this Z port really exists in hardware */
1557                if (info->line > (cinfo->first_line + cinfo->nports - 1))
1558                        return -ENODEV;
1559        }
1560#ifdef CY_DEBUG_OTHER
1561        printk(KERN_DEBUG "cyc:cy_open ttyC%d\n", info->line);
1562#endif
1563        tty->driver_data = info;
1564        if (serial_paranoia_check(info, tty->name, "cy_open"))
1565                return -ENODEV;
1566
1567#ifdef CY_DEBUG_OPEN
1568        printk(KERN_DEBUG "cyc:cy_open ttyC%d, count = %d\n", info->line,
1569                        info->port.count);
1570#endif
1571        info->port.count++;
1572#ifdef CY_DEBUG_COUNT
1573        printk(KERN_DEBUG "cyc:cy_open (%d): incrementing count to %d\n",
1574                current->pid, info->port.count);
1575#endif
1576
1577        /*
1578         * Start up serial port
1579         */
1580        retval = cy_startup(info, tty);
1581        if (retval)
1582                return retval;
1583
1584        retval = tty_port_block_til_ready(&info->port, tty, filp);
1585        if (retval) {
1586#ifdef CY_DEBUG_OPEN
1587                printk(KERN_DEBUG "cyc:cy_open returning after block_til_ready "
1588                        "with %d\n", retval);
1589#endif
1590                return retval;
1591        }
1592
1593        info->throttle = 0;
1594        tty_port_tty_set(&info->port, tty);
1595
1596#ifdef CY_DEBUG_OPEN
1597        printk(KERN_DEBUG "cyc:cy_open done\n");
1598#endif
1599        return 0;
1600}                               /* cy_open */
1601
1602/*
1603 * cy_wait_until_sent() --- wait until the transmitter is empty
1604 */
1605static void cy_wait_until_sent(struct tty_struct *tty, int timeout)
1606{
1607        struct cyclades_card *card;
1608        struct cyclades_port *info = tty->driver_data;
1609        unsigned long orig_jiffies;
1610        int char_time;
1611
1612        if (serial_paranoia_check(info, tty->name, "cy_wait_until_sent"))
1613                return;
1614
1615        if (info->xmit_fifo_size == 0)
1616                return;         /* Just in case.... */
1617
1618        orig_jiffies = jiffies;
1619        /*
1620         * Set the check interval to be 1/5 of the estimated time to
1621         * send a single character, and make it at least 1.  The check
1622         * interval should also be less than the timeout.
1623         *
1624         * Note: we have to use pretty tight timings here to satisfy
1625         * the NIST-PCTS.
1626         */
1627        char_time = (info->timeout - HZ / 50) / info->xmit_fifo_size;
1628        char_time = char_time / 5;
1629        if (char_time <= 0)
1630                char_time = 1;
1631        if (timeout < 0)
1632                timeout = 0;
1633        if (timeout)
1634                char_time = min(char_time, timeout);
1635        /*
1636         * If the transmitter hasn't cleared in twice the approximate
1637         * amount of time to send the entire FIFO, it probably won't
1638         * ever clear.  This assumes the UART isn't doing flow
1639         * control, which is currently the case.  Hence, if it ever
1640         * takes longer than info->timeout, this is probably due to a
1641         * UART bug of some kind.  So, we clamp the timeout parameter at
1642         * 2*info->timeout.
1643         */
1644        if (!timeout || timeout > 2 * info->timeout)
1645                timeout = 2 * info->timeout;
1646
1647        card = info->card;
1648        if (!cy_is_Z(card)) {
1649                while (cyy_readb(info, CySRER) & CyTxRdy) {
1650                        if (msleep_interruptible(jiffies_to_msecs(char_time)))
1651                                break;
1652                        if (timeout && time_after(jiffies, orig_jiffies +
1653                                        timeout))
1654                                break;
1655                }
1656        }
1657        /* Run one more char cycle */
1658        msleep_interruptible(jiffies_to_msecs(char_time * 5));
1659}
1660
1661static void cy_flush_buffer(struct tty_struct *tty)
1662{
1663        struct cyclades_port *info = tty->driver_data;
1664        struct cyclades_card *card;
1665        int channel, retval;
1666        unsigned long flags;
1667
1668#ifdef CY_DEBUG_IO
1669        printk(KERN_DEBUG "cyc:cy_flush_buffer ttyC%d\n", info->line);
1670#endif
1671
1672        if (serial_paranoia_check(info, tty->name, "cy_flush_buffer"))
1673                return;
1674
1675        card = info->card;
1676        channel = info->line - card->first_line;
1677
1678        spin_lock_irqsave(&card->card_lock, flags);
1679        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
1680        spin_unlock_irqrestore(&card->card_lock, flags);
1681
1682        if (cy_is_Z(card)) {    /* If it is a Z card, flush the on-board
1683                                           buffers as well */
1684                spin_lock_irqsave(&card->card_lock, flags);
1685                retval = cyz_issue_cmd(card, channel, C_CM_FLUSH_TX, 0L);
1686                if (retval != 0) {
1687                        printk(KERN_ERR "cyc: flush_buffer retval on ttyC%d "
1688                                "was %x\n", info->line, retval);
1689                }
1690                spin_unlock_irqrestore(&card->card_lock, flags);
1691        }
1692        tty_wakeup(tty);
1693}                               /* cy_flush_buffer */
1694
1695
1696static void cy_do_close(struct tty_port *port)
1697{
1698        struct cyclades_port *info = container_of(port, struct cyclades_port,
1699                                                                port);
1700        struct cyclades_card *card;
1701        unsigned long flags;
1702        int channel;
1703
1704        card = info->card;
1705        channel = info->line - card->first_line;
1706        spin_lock_irqsave(&card->card_lock, flags);
1707
1708        if (!cy_is_Z(card)) {
1709                /* Stop accepting input */
1710                cyy_writeb(info, CyCAR, channel & 0x03);
1711                cyy_writeb(info, CySRER, cyy_readb(info, CySRER) & ~CyRxData);
1712                if (tty_port_initialized(&info->port)) {
1713                        /* Waiting for on-board buffers to be empty before
1714                           closing the port */
1715                        spin_unlock_irqrestore(&card->card_lock, flags);
1716                        cy_wait_until_sent(port->tty, info->timeout);
1717                        spin_lock_irqsave(&card->card_lock, flags);
1718                }
1719        } else {
1720#ifdef Z_WAKE
1721                /* Waiting for on-board buffers to be empty before closing
1722                   the port */
1723                struct CH_CTRL __iomem *ch_ctrl = info->u.cyz.ch_ctrl;
1724                int retval;
1725
1726                if (readl(&ch_ctrl->flow_status) != C_FS_TXIDLE) {
1727                        retval = cyz_issue_cmd(card, channel, C_CM_IOCTLW, 0L);
1728                        if (retval != 0) {
1729                                printk(KERN_DEBUG "cyc:cy_close retval on "
1730                                        "ttyC%d was %x\n", info->line, retval);
1731                        }
1732                        spin_unlock_irqrestore(&card->card_lock, flags);
1733                        wait_for_completion_interruptible(&info->shutdown_wait);
1734                        spin_lock_irqsave(&card->card_lock, flags);
1735                }
1736#endif
1737        }
1738        spin_unlock_irqrestore(&card->card_lock, flags);
1739        cy_shutdown(info, port->tty);
1740}
1741
1742/*
1743 * This routine is called when a particular tty device is closed.
1744 */
1745static void cy_close(struct tty_struct *tty, struct file *filp)
1746{
1747        struct cyclades_port *info = tty->driver_data;
1748        if (!info || serial_paranoia_check(info, tty->name, "cy_close"))
1749                return;
1750        tty_port_close(&info->port, tty, filp);
1751}                               /* cy_close */
1752
1753/* This routine gets called when tty_write has put something into
1754 * the write_queue.  The characters may come from user space or
1755 * kernel space.
1756 *
1757 * This routine will return the number of characters actually
1758 * accepted for writing.
1759 *
1760 * If the port is not already transmitting stuff, start it off by
1761 * enabling interrupts.  The interrupt service routine will then
1762 * ensure that the characters are sent.
1763 * If the port is already active, there is no need to kick it.
1764 *
1765 */
1766static int cy_write(struct tty_struct *tty, const unsigned char *buf, int count)
1767{
1768        struct cyclades_port *info = tty->driver_data;
1769        unsigned long flags;
1770        int c, ret = 0;
1771
1772#ifdef CY_DEBUG_IO
1773        printk(KERN_DEBUG "cyc:cy_write ttyC%d\n", info->line);
1774#endif
1775
1776        if (serial_paranoia_check(info, tty->name, "cy_write"))
1777                return 0;
1778
1779        if (!info->port.xmit_buf)
1780                return 0;
1781
1782        spin_lock_irqsave(&info->card->card_lock, flags);
1783        while (1) {
1784                c = min(count, (int)(SERIAL_XMIT_SIZE - info->xmit_cnt - 1));
1785                c = min(c, (int)(SERIAL_XMIT_SIZE - info->xmit_head));
1786
1787                if (c <= 0)
1788                        break;
1789
1790                memcpy(info->port.xmit_buf + info->xmit_head, buf, c);
1791                info->xmit_head = (info->xmit_head + c) &
1792                        (SERIAL_XMIT_SIZE - 1);
1793                info->xmit_cnt += c;
1794                buf += c;
1795                count -= c;
1796                ret += c;
1797        }
1798        spin_unlock_irqrestore(&info->card->card_lock, flags);
1799
1800        info->idle_stats.xmit_bytes += ret;
1801        info->idle_stats.xmit_idle = jiffies;
1802
1803        if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped)
1804                start_xmit(info);
1805
1806        return ret;
1807}                               /* cy_write */
1808
1809/*
1810 * This routine is called by the kernel to write a single
1811 * character to the tty device.  If the kernel uses this routine,
1812 * it must call the flush_chars() routine (if defined) when it is
1813 * done stuffing characters into the driver.  If there is no room
1814 * in the queue, the character is ignored.
1815 */
1816static int cy_put_char(struct tty_struct *tty, unsigned char ch)
1817{
1818        struct cyclades_port *info = tty->driver_data;
1819        unsigned long flags;
1820
1821#ifdef CY_DEBUG_IO
1822        printk(KERN_DEBUG "cyc:cy_put_char ttyC%d\n", info->line);
1823#endif
1824
1825        if (serial_paranoia_check(info, tty->name, "cy_put_char"))
1826                return 0;
1827
1828        if (!info->port.xmit_buf)
1829                return 0;
1830
1831        spin_lock_irqsave(&info->card->card_lock, flags);
1832        if (info->xmit_cnt >= (int)(SERIAL_XMIT_SIZE - 1)) {
1833                spin_unlock_irqrestore(&info->card->card_lock, flags);
1834                return 0;
1835        }
1836
1837        info->port.xmit_buf[info->xmit_head++] = ch;
1838        info->xmit_head &= SERIAL_XMIT_SIZE - 1;
1839        info->xmit_cnt++;
1840        info->idle_stats.xmit_bytes++;
1841        info->idle_stats.xmit_idle = jiffies;
1842        spin_unlock_irqrestore(&info->card->card_lock, flags);
1843        return 1;
1844}                               /* cy_put_char */
1845
1846/*
1847 * This routine is called by the kernel after it has written a
1848 * series of characters to the tty device using put_char().
1849 */
1850static void cy_flush_chars(struct tty_struct *tty)
1851{
1852        struct cyclades_port *info = tty->driver_data;
1853
1854#ifdef CY_DEBUG_IO
1855        printk(KERN_DEBUG "cyc:cy_flush_chars ttyC%d\n", info->line);
1856#endif
1857
1858        if (serial_paranoia_check(info, tty->name, "cy_flush_chars"))
1859                return;
1860
1861        if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
1862                        !info->port.xmit_buf)
1863                return;
1864
1865        start_xmit(info);
1866}                               /* cy_flush_chars */
1867
1868/*
1869 * This routine returns the numbers of characters the tty driver
1870 * will accept for queuing to be written.  This number is subject
1871 * to change as output buffers get emptied, or if the output flow
1872 * control is activated.
1873 */
1874static int cy_write_room(struct tty_struct *tty)
1875{
1876        struct cyclades_port *info = tty->driver_data;
1877        int ret;
1878
1879#ifdef CY_DEBUG_IO
1880        printk(KERN_DEBUG "cyc:cy_write_room ttyC%d\n", info->line);
1881#endif
1882
1883        if (serial_paranoia_check(info, tty->name, "cy_write_room"))
1884                return 0;
1885        ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
1886        if (ret < 0)
1887                ret = 0;
1888        return ret;
1889}                               /* cy_write_room */
1890
1891static int cy_chars_in_buffer(struct tty_struct *tty)
1892{
1893        struct cyclades_port *info = tty->driver_data;
1894
1895        if (serial_paranoia_check(info, tty->name, "cy_chars_in_buffer"))
1896                return 0;
1897
1898#ifdef Z_EXT_CHARS_IN_BUFFER
1899        if (!cy_is_Z(info->card)) {
1900#endif                          /* Z_EXT_CHARS_IN_BUFFER */
1901#ifdef CY_DEBUG_IO
1902                printk(KERN_DEBUG "cyc:cy_chars_in_buffer ttyC%d %d\n",
1903                        info->line, info->xmit_cnt);
1904#endif
1905                return info->xmit_cnt;
1906#ifdef Z_EXT_CHARS_IN_BUFFER
1907        } else {
1908                struct BUF_CTRL __iomem *buf_ctrl = info->u.cyz.buf_ctrl;
1909                int char_count;
1910                __u32 tx_put, tx_get, tx_bufsize;
1911
1912                tx_get = readl(&buf_ctrl->tx_get);
1913                tx_put = readl(&buf_ctrl->tx_put);
1914                tx_bufsize = readl(&buf_ctrl->tx_bufsize);
1915                if (tx_put >= tx_get)
1916                        char_count = tx_put - tx_get;
1917                else
1918                        char_count = tx_put - tx_get + tx_bufsize;
1919#ifdef CY_DEBUG_IO
1920                printk(KERN_DEBUG "cyc:cy_chars_in_buffer ttyC%d %d\n",
1921                        info->line, info->xmit_cnt + char_count);
1922#endif
1923                return info->xmit_cnt + char_count;
1924        }
1925#endif                          /* Z_EXT_CHARS_IN_BUFFER */
1926}                               /* cy_chars_in_buffer */
1927
1928/*
1929 * ------------------------------------------------------------
1930 * cy_ioctl() and friends
1931 * ------------------------------------------------------------
1932 */
1933
1934static void cyy_baud_calc(struct cyclades_port *info, __u32 baud)
1935{
1936        int co, co_val, bpr;
1937        __u32 cy_clock = ((info->chip_rev >= CD1400_REV_J) ? 60000000 :
1938                        25000000);
1939
1940        if (baud == 0) {
1941                info->tbpr = info->tco = info->rbpr = info->rco = 0;
1942                return;
1943        }
1944
1945        /* determine which prescaler to use */
1946        for (co = 4, co_val = 2048; co; co--, co_val >>= 2) {
1947                if (cy_clock / co_val / baud > 63)
1948                        break;
1949        }
1950
1951        bpr = (cy_clock / co_val * 2 / baud + 1) / 2;
1952        if (bpr > 255)
1953                bpr = 255;
1954
1955        info->tbpr = info->rbpr = bpr;
1956        info->tco = info->rco = co;
1957}
1958
1959/*
1960 * This routine finds or computes the various line characteristics.
1961 * It used to be called config_setup
1962 */
1963static void cy_set_line_char(struct cyclades_port *info, struct tty_struct *tty)
1964{
1965        struct cyclades_card *card;
1966        unsigned long flags;
1967        int channel;
1968        unsigned cflag, iflag;
1969        int baud, baud_rate = 0;
1970        int i;
1971
1972        if (info->line == -1)
1973                return;
1974
1975        cflag = tty->termios.c_cflag;
1976        iflag = tty->termios.c_iflag;
1977
1978        /*
1979         * Set up the tty->alt_speed kludge
1980         */
1981        if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
1982                tty->alt_speed = 57600;
1983        if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
1984                tty->alt_speed = 115200;
1985        if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
1986                tty->alt_speed = 230400;
1987        if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
1988                tty->alt_speed = 460800;
1989
1990        card = info->card;
1991        channel = info->line - card->first_line;
1992
1993        if (!cy_is_Z(card)) {
1994                u32 cflags;
1995
1996                /* baud rate */
1997                baud = tty_get_baud_rate(tty);
1998                if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
1999                                ASYNC_SPD_CUST) {
2000                        if (info->custom_divisor)
2001                                baud_rate = info->baud / info->custom_divisor;
2002                        else
2003                                baud_rate = info->baud;
2004                } else if (baud > CD1400_MAX_SPEED) {
2005                        baud = CD1400_MAX_SPEED;
2006                }
2007                /* find the baud index */
2008                for (i = 0; i < 20; i++) {
2009                        if (baud == baud_table[i])
2010                                break;
2011                }
2012                if (i == 20)
2013                        i = 19; /* CD1400_MAX_SPEED */
2014
2015                if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
2016                                ASYNC_SPD_CUST) {
2017                        cyy_baud_calc(info, baud_rate);
2018                } else {
2019                        if (info->chip_rev >= CD1400_REV_J) {
2020                                /* It is a CD1400 rev. J or later */
2021                                info->tbpr = baud_bpr_60[i];    /* Tx BPR */
2022                                info->tco = baud_co_60[i];      /* Tx CO */
2023                                info->rbpr = baud_bpr_60[i];    /* Rx BPR */
2024                                info->rco = baud_co_60[i];      /* Rx CO */
2025                        } else {
2026                                info->tbpr = baud_bpr_25[i];    /* Tx BPR */
2027                                info->tco = baud_co_25[i];      /* Tx CO */
2028                                info->rbpr = baud_bpr_25[i];    /* Rx BPR */
2029                                info->rco = baud_co_25[i];      /* Rx CO */
2030                        }
2031                }
2032                if (baud_table[i] == 134) {
2033                        /* get it right for 134.5 baud */
2034                        info->timeout = (info->xmit_fifo_size * HZ * 30 / 269) +
2035                                        2;
2036                } else if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
2037                                ASYNC_SPD_CUST) {
2038                        info->timeout = (info->xmit_fifo_size * HZ * 15 /
2039                                        baud_rate) + 2;
2040                } else if (baud_table[i]) {
2041                        info->timeout = (info->xmit_fifo_size * HZ * 15 /
2042                                        baud_table[i]) + 2;
2043                        /* this needs to be propagated into the card info */
2044                } else {
2045                        info->timeout = 0;
2046                }
2047                /* By tradition (is it a standard?) a baud rate of zero
2048                   implies the line should be/has been closed.  A bit
2049                   later in this routine such a test is performed. */
2050
2051                /* byte size and parity */
2052                info->cor5 = 0;
2053                info->cor4 = 0;
2054                /* receive threshold */
2055                info->cor3 = (info->default_threshold ?
2056                                info->default_threshold : baud_cor3[i]);
2057                info->cor2 = CyETC;
2058                switch (cflag & CSIZE) {
2059                case CS5:
2060                        info->cor1 = Cy_5_BITS;
2061                        break;
2062                case CS6:
2063                        info->cor1 = Cy_6_BITS;
2064                        break;
2065                case CS7:
2066                        info->cor1 = Cy_7_BITS;
2067                        break;
2068                case CS8:
2069                        info->cor1 = Cy_8_BITS;
2070                        break;
2071                }
2072                if (cflag & CSTOPB)
2073                        info->cor1 |= Cy_2_STOP;
2074
2075                if (cflag & PARENB) {
2076                        if (cflag & PARODD)
2077                                info->cor1 |= CyPARITY_O;
2078                        else
2079                                info->cor1 |= CyPARITY_E;
2080                } else
2081                        info->cor1 |= CyPARITY_NONE;
2082
2083                /* CTS flow control flag */
2084                tty_port_set_cts_flow(&info->port, cflag & CRTSCTS);
2085                if (cflag & CRTSCTS)
2086                        info->cor2 |= CyCtsAE;
2087                else
2088                        info->cor2 &= ~CyCtsAE;
2089                tty_port_set_check_carrier(&info->port, ~cflag & CLOCAL);
2090
2091         /***********************************************
2092            The hardware option, CyRtsAO, presents RTS when
2093            the chip has characters to send.  Since most modems
2094            use RTS as reverse (inbound) flow control, this
2095            option is not used.  If inbound flow control is
2096            necessary, DTR can be programmed to provide the
2097            appropriate signals for use with a non-standard
2098            cable.  Contact Marcio Saito for details.
2099         ***********************************************/
2100
2101                channel &= 0x03;
2102
2103                spin_lock_irqsave(&card->card_lock, flags);
2104                cyy_writeb(info, CyCAR, channel);
2105
2106                /* tx and rx baud rate */
2107
2108                cyy_writeb(info, CyTCOR, info->tco);
2109                cyy_writeb(info, CyTBPR, info->tbpr);
2110                cyy_writeb(info, CyRCOR, info->rco);
2111                cyy_writeb(info, CyRBPR, info->rbpr);
2112
2113                /* set line characteristics  according configuration */
2114
2115                cyy_writeb(info, CySCHR1, START_CHAR(tty));
2116                cyy_writeb(info, CySCHR2, STOP_CHAR(tty));
2117                cyy_writeb(info, CyCOR1, info->cor1);
2118                cyy_writeb(info, CyCOR2, info->cor2);
2119                cyy_writeb(info, CyCOR3, info->cor3);
2120                cyy_writeb(info, CyCOR4, info->cor4);
2121                cyy_writeb(info, CyCOR5, info->cor5);
2122
2123                cyy_issue_cmd(info, CyCOR_CHANGE | CyCOR1ch | CyCOR2ch |
2124                                CyCOR3ch);
2125
2126                /* !!! Is this needed? */
2127                cyy_writeb(info, CyCAR, channel);
2128                cyy_writeb(info, CyRTPR,
2129                        (info->default_timeout ? info->default_timeout : 0x02));
2130                /* 10ms rx timeout */
2131
2132                cflags = CyCTS;
2133                if (!C_CLOCAL(tty))
2134                        cflags |= CyDSR | CyRI | CyDCD;
2135                /* without modem intr */
2136                cyy_writeb(info, CySRER, cyy_readb(info, CySRER) | CyMdmCh);
2137                /* act on 1->0 modem transitions */
2138                if ((cflag & CRTSCTS) && info->rflow)
2139                        cyy_writeb(info, CyMCOR1, cflags | rflow_thr[i]);
2140                else
2141                        cyy_writeb(info, CyMCOR1, cflags);
2142                /* act on 0->1 modem transitions */
2143                cyy_writeb(info, CyMCOR2, cflags);
2144
2145                if (i == 0)     /* baud rate is zero, turn off line */
2146                        cyy_change_rts_dtr(info, 0, TIOCM_DTR);
2147                else
2148                        cyy_change_rts_dtr(info, TIOCM_DTR, 0);
2149
2150                clear_bit(TTY_IO_ERROR, &tty->flags);
2151                spin_unlock_irqrestore(&card->card_lock, flags);
2152
2153        } else {
2154                struct CH_CTRL __iomem *ch_ctrl = info->u.cyz.ch_ctrl;
2155                __u32 sw_flow;
2156                int retval;
2157
2158                if (!cyz_is_loaded(card))
2159                        return;
2160
2161                /* baud rate */
2162                baud = tty_get_baud_rate(tty);
2163                if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
2164                                ASYNC_SPD_CUST) {
2165                        if (info->custom_divisor)
2166                                baud_rate = info->baud / info->custom_divisor;
2167                        else
2168                                baud_rate = info->baud;
2169                } else if (baud > CYZ_MAX_SPEED) {
2170                        baud = CYZ_MAX_SPEED;
2171                }
2172                cy_writel(&ch_ctrl->comm_baud, baud);
2173
2174                if (baud == 134) {
2175                        /* get it right for 134.5 baud */
2176                        info->timeout = (info->xmit_fifo_size * HZ * 30 / 269) +
2177                                        2;
2178                } else if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
2179                                ASYNC_SPD_CUST) {
2180                        info->timeout = (info->xmit_fifo_size * HZ * 15 /
2181                                        baud_rate) + 2;
2182                } else if (baud) {
2183                        info->timeout = (info->xmit_fifo_size * HZ * 15 /
2184                                        baud) + 2;
2185                        /* this needs to be propagated into the card info */
2186                } else {
2187                        info->timeout = 0;
2188                }
2189
2190                /* byte size and parity */
2191                switch (cflag & CSIZE) {
2192                case CS5:
2193                        cy_writel(&ch_ctrl->comm_data_l, C_DL_CS5);
2194                        break;
2195                case CS6:
2196                        cy_writel(&ch_ctrl->comm_data_l, C_DL_CS6);
2197                        break;
2198                case CS7:
2199                        cy_writel(&ch_ctrl->comm_data_l, C_DL_CS7);
2200                        break;
2201                case CS8:
2202                        cy_writel(&ch_ctrl->comm_data_l, C_DL_CS8);
2203                        break;
2204                }
2205                if (cflag & CSTOPB) {
2206                        cy_writel(&ch_ctrl->comm_data_l,
2207                                  readl(&ch_ctrl->comm_data_l) | C_DL_2STOP);
2208                } else {
2209                        cy_writel(&ch_ctrl->comm_data_l,
2210                                  readl(&ch_ctrl->comm_data_l) | C_DL_1STOP);
2211                }
2212                if (cflag & PARENB) {
2213                        if (cflag & PARODD)
2214                                cy_writel(&ch_ctrl->comm_parity, C_PR_ODD);
2215                        else
2216                                cy_writel(&ch_ctrl->comm_parity, C_PR_EVEN);
2217                } else
2218                        cy_writel(&ch_ctrl->comm_parity, C_PR_NONE);
2219
2220                /* CTS flow control flag */
2221                if (cflag & CRTSCTS) {
2222                        cy_writel(&ch_ctrl->hw_flow,
2223                                readl(&ch_ctrl->hw_flow) | C_RS_CTS | C_RS_RTS);
2224                } else {
2225                        cy_writel(&ch_ctrl->hw_flow, readl(&ch_ctrl->hw_flow) &
2226                                        ~(C_RS_CTS | C_RS_RTS));
2227                }
2228                /* As the HW flow control is done in firmware, the driver
2229                   doesn't need to care about it */
2230                tty_port_set_cts_flow(&info->port, 0);
2231
2232                /* XON/XOFF/XANY flow control flags */
2233                sw_flow = 0;
2234                if (iflag & IXON) {
2235                        sw_flow |= C_FL_OXX;
2236                        if (iflag & IXANY)
2237                                sw_flow |= C_FL_OIXANY;
2238                }
2239                cy_writel(&ch_ctrl->sw_flow, sw_flow);
2240
2241                retval = cyz_issue_cmd(card, channel, C_CM_IOCTL, 0L);
2242                if (retval != 0) {
2243                        printk(KERN_ERR "cyc:set_line_char retval on ttyC%d "
2244                                "was %x\n", info->line, retval);
2245                }
2246
2247                /* CD sensitivity */
2248                tty_port_set_check_carrier(&info->port, ~cflag & CLOCAL);
2249
2250                if (baud == 0) {        /* baud rate is zero, turn off line */
2251                        cy_writel(&ch_ctrl->rs_control,
2252                                  readl(&ch_ctrl->rs_control) & ~C_RS_DTR);
2253#ifdef CY_DEBUG_DTR
2254                        printk(KERN_DEBUG "cyc:set_line_char dropping Z DTR\n");
2255#endif
2256                } else {
2257                        cy_writel(&ch_ctrl->rs_control,
2258                                  readl(&ch_ctrl->rs_control) | C_RS_DTR);
2259#ifdef CY_DEBUG_DTR
2260                        printk(KERN_DEBUG "cyc:set_line_char raising Z DTR\n");
2261#endif
2262                }
2263
2264                retval = cyz_issue_cmd(card, channel, C_CM_IOCTLM, 0L);
2265                if (retval != 0) {
2266                        printk(KERN_ERR "cyc:set_line_char(2) retval on ttyC%d "
2267                                "was %x\n", info->line, retval);
2268                }
2269
2270                clear_bit(TTY_IO_ERROR, &tty->flags);
2271        }
2272}                               /* set_line_char */
2273
2274static int cy_get_serial_info(struct cyclades_port *info,
2275                struct serial_struct __user *retinfo)
2276{
2277        struct cyclades_card *cinfo = info->card;
2278        struct serial_struct tmp = {
2279                .type = info->type,
2280                .line = info->line,
2281                .port = (info->card - cy_card) * 0x100 + info->line -
2282                        cinfo->first_line,
2283                .irq = cinfo->irq,
2284                .flags = info->port.flags,
2285                .close_delay = info->port.close_delay,
2286                .closing_wait = info->port.closing_wait,
2287                .baud_base = info->baud,
2288                .custom_divisor = info->custom_divisor,
2289        };
2290        return copy_to_user(retinfo, &tmp, sizeof(*retinfo)) ? -EFAULT : 0;
2291}
2292
2293static int
2294cy_set_serial_info(struct cyclades_port *info, struct tty_struct *tty,
2295                struct serial_struct __user *new_info)
2296{
2297        struct serial_struct new_serial;
2298        int ret;
2299
2300        if (copy_from_user(&new_serial, new_info, sizeof(new_serial)))
2301                return -EFAULT;
2302
2303        mutex_lock(&info->port.mutex);
2304        if (!capable(CAP_SYS_ADMIN)) {
2305                if (new_serial.close_delay != info->port.close_delay ||
2306                                new_serial.baud_base != info->baud ||
2307                                (new_serial.flags & ASYNC_FLAGS &
2308                                        ~ASYNC_USR_MASK) !=
2309                                (info->port.flags & ASYNC_FLAGS & ~ASYNC_USR_MASK))
2310                {
2311                        mutex_unlock(&info->port.mutex);
2312                        return -EPERM;
2313                }
2314                info->port.flags = (info->port.flags & ~ASYNC_USR_MASK) |
2315                                (new_serial.flags & ASYNC_USR_MASK);
2316                info->baud = new_serial.baud_base;
2317                info->custom_divisor = new_serial.custom_divisor;
2318                goto check_and_exit;
2319        }
2320
2321        /*
2322         * OK, past this point, all the error checking has been done.
2323         * At this point, we start making changes.....
2324         */
2325
2326        info->baud = new_serial.baud_base;
2327        info->custom_divisor = new_serial.custom_divisor;
2328        info->port.flags = (info->port.flags & ~ASYNC_FLAGS) |
2329                        (new_serial.flags & ASYNC_FLAGS);
2330        info->port.close_delay = new_serial.close_delay * HZ / 100;
2331        info->port.closing_wait = new_serial.closing_wait * HZ / 100;
2332
2333check_and_exit:
2334        if (tty_port_initialized(&info->port)) {
2335                cy_set_line_char(info, tty);
2336                ret = 0;
2337        } else {
2338                ret = cy_startup(info, tty);
2339        }
2340        mutex_unlock(&info->port.mutex);
2341        return ret;
2342}                               /* set_serial_info */
2343
2344/*
2345 * get_lsr_info - get line status register info
2346 *
2347 * Purpose: Let user call ioctl() to get info when the UART physically
2348 *          is emptied.  On bus types like RS485, the transmitter must
2349 *          release the bus after transmitting. This must be done when
2350 *          the transmit shift register is empty, not be done when the
2351 *          transmit holding register is empty.  This functionality
2352 *          allows an RS485 driver to be written in user space.
2353 */
2354static int get_lsr_info(struct cyclades_port *info, unsigned int __user *value)
2355{
2356        struct cyclades_card *card = info->card;
2357        unsigned int result;
2358        unsigned long flags;
2359        u8 status;
2360
2361        if (!cy_is_Z(card)) {
2362                spin_lock_irqsave(&card->card_lock, flags);
2363                status = cyy_readb(info, CySRER) & (CyTxRdy | CyTxMpty);
2364                spin_unlock_irqrestore(&card->card_lock, flags);
2365                result = (status ? 0 : TIOCSER_TEMT);
2366        } else {
2367                /* Not supported yet */
2368                return -EINVAL;
2369        }
2370        return put_user(result, value);
2371}
2372
2373static int cy_tiocmget(struct tty_struct *tty)
2374{
2375        struct cyclades_port *info = tty->driver_data;
2376        struct cyclades_card *card;
2377        int result;
2378
2379        if (serial_paranoia_check(info, tty->name, __func__))
2380                return -ENODEV;
2381
2382        card = info->card;
2383
2384        if (!cy_is_Z(card)) {
2385                unsigned long flags;
2386                int channel = info->line - card->first_line;
2387                u8 status;
2388
2389                spin_lock_irqsave(&card->card_lock, flags);
2390                cyy_writeb(info, CyCAR, channel & 0x03);
2391                status = cyy_readb(info, CyMSVR1);
2392                status |= cyy_readb(info, CyMSVR2);
2393                spin_unlock_irqrestore(&card->card_lock, flags);
2394
2395                if (info->rtsdtr_inv) {
2396                        result = ((status & CyRTS) ? TIOCM_DTR : 0) |
2397                                ((status & CyDTR) ? TIOCM_RTS : 0);
2398                } else {
2399                        result = ((status & CyRTS) ? TIOCM_RTS : 0) |
2400                                ((status & CyDTR) ? TIOCM_DTR : 0);
2401                }
2402                result |= ((status & CyDCD) ? TIOCM_CAR : 0) |
2403                        ((status & CyRI) ? TIOCM_RNG : 0) |
2404                        ((status & CyDSR) ? TIOCM_DSR : 0) |
2405                        ((status & CyCTS) ? TIOCM_CTS : 0);
2406        } else {
2407                u32 lstatus;
2408
2409                if (!cyz_is_loaded(card)) {
2410                        result = -ENODEV;
2411                        goto end;
2412                }
2413
2414                lstatus = readl(&info->u.cyz.ch_ctrl->rs_status);
2415                result = ((lstatus & C_RS_RTS) ? TIOCM_RTS : 0) |
2416                        ((lstatus & C_RS_DTR) ? TIOCM_DTR : 0) |
2417                        ((lstatus & C_RS_DCD) ? TIOCM_CAR : 0) |
2418                        ((lstatus & C_RS_RI) ? TIOCM_RNG : 0) |
2419                        ((lstatus & C_RS_DSR) ? TIOCM_DSR : 0) |
2420                        ((lstatus & C_RS_CTS) ? TIOCM_CTS : 0);
2421        }
2422end:
2423        return result;
2424}                               /* cy_tiomget */
2425
2426static int
2427cy_tiocmset(struct tty_struct *tty,
2428                unsigned int set, unsigned int clear)
2429{
2430        struct cyclades_port *info = tty->driver_data;
2431        struct cyclades_card *card;
2432        unsigned long flags;
2433
2434        if (serial_paranoia_check(info, tty->name, __func__))
2435                return -ENODEV;
2436
2437        card = info->card;
2438        if (!cy_is_Z(card)) {
2439                spin_lock_irqsave(&card->card_lock, flags);
2440                cyy_change_rts_dtr(info, set, clear);
2441                spin_unlock_irqrestore(&card->card_lock, flags);
2442        } else {
2443                struct CH_CTRL __iomem *ch_ctrl = info->u.cyz.ch_ctrl;
2444                int retval, channel = info->line - card->first_line;
2445                u32 rs;
2446
2447                if (!cyz_is_loaded(card))
2448                        return -ENODEV;
2449
2450                spin_lock_irqsave(&card->card_lock, flags);
2451                rs = readl(&ch_ctrl->rs_control);
2452                if (set & TIOCM_RTS)
2453                        rs |= C_RS_RTS;
2454                if (clear & TIOCM_RTS)
2455                        rs &= ~C_RS_RTS;
2456                if (set & TIOCM_DTR) {
2457                        rs |= C_RS_DTR;
2458#ifdef CY_DEBUG_DTR
2459                        printk(KERN_DEBUG "cyc:set_modem_info raising Z DTR\n");
2460#endif
2461                }
2462                if (clear & TIOCM_DTR) {
2463                        rs &= ~C_RS_DTR;
2464#ifdef CY_DEBUG_DTR
2465                        printk(KERN_DEBUG "cyc:set_modem_info clearing "
2466                                "Z DTR\n");
2467#endif
2468                }
2469                cy_writel(&ch_ctrl->rs_control, rs);
2470                retval = cyz_issue_cmd(card, channel, C_CM_IOCTLM, 0L);
2471                spin_unlock_irqrestore(&card->card_lock, flags);
2472                if (retval != 0) {
2473                        printk(KERN_ERR "cyc:set_modem_info retval on ttyC%d "
2474                                "was %x\n", info->line, retval);
2475                }
2476        }
2477        return 0;
2478}
2479
2480/*
2481 * cy_break() --- routine which turns the break handling on or off
2482 */
2483static int cy_break(struct tty_struct *tty, int break_state)
2484{
2485        struct cyclades_port *info = tty->driver_data;
2486        struct cyclades_card *card;
2487        unsigned long flags;
2488        int retval = 0;
2489
2490        if (serial_paranoia_check(info, tty->name, "cy_break"))
2491                return -EINVAL;
2492
2493        card = info->card;
2494
2495        spin_lock_irqsave(&card->card_lock, flags);
2496        if (!cy_is_Z(card)) {
2497                /* Let the transmit ISR take care of this (since it
2498                   requires stuffing characters into the output stream).
2499                 */
2500                if (break_state == -1) {
2501                        if (!info->breakon) {
2502                                info->breakon = 1;
2503                                if (!info->xmit_cnt) {
2504                                        spin_unlock_irqrestore(&card->card_lock, flags);
2505                                        start_xmit(info);
2506                                        spin_lock_irqsave(&card->card_lock, flags);
2507                                }
2508                        }
2509                } else {
2510                        if (!info->breakoff) {
2511                                info->breakoff = 1;
2512                                if (!info->xmit_cnt) {
2513                                        spin_unlock_irqrestore(&card->card_lock, flags);
2514                                        start_xmit(info);
2515                                        spin_lock_irqsave(&card->card_lock, flags);
2516                                }
2517                        }
2518                }
2519        } else {
2520                if (break_state == -1) {
2521                        retval = cyz_issue_cmd(card,
2522                                info->line - card->first_line,
2523                                C_CM_SET_BREAK, 0L);
2524                        if (retval != 0) {
2525                                printk(KERN_ERR "cyc:cy_break (set) retval on "
2526                                        "ttyC%d was %x\n", info->line, retval);
2527                        }
2528                } else {
2529                        retval = cyz_issue_cmd(card,
2530                                info->line - card->first_line,
2531                                C_CM_CLR_BREAK, 0L);
2532                        if (retval != 0) {
2533                                printk(KERN_DEBUG "cyc:cy_break (clr) retval "
2534                                        "on ttyC%d was %x\n", info->line,
2535                                        retval);
2536                        }
2537                }
2538        }
2539        spin_unlock_irqrestore(&card->card_lock, flags);
2540        return retval;
2541}                               /* cy_break */
2542
2543static int set_threshold(struct cyclades_port *info, unsigned long value)
2544{
2545        struct cyclades_card *card = info->card;
2546        unsigned long flags;
2547
2548        if (!cy_is_Z(card)) {
2549                info->cor3 &= ~CyREC_FIFO;
2550                info->cor3 |= value & CyREC_FIFO;
2551
2552                spin_lock_irqsave(&card->card_lock, flags);
2553                cyy_writeb(info, CyCOR3, info->cor3);
2554                cyy_issue_cmd(info, CyCOR_CHANGE | CyCOR3ch);
2555                spin_unlock_irqrestore(&card->card_lock, flags);
2556        }
2557        return 0;
2558}                               /* set_threshold */
2559
2560static int get_threshold(struct cyclades_port *info,
2561                                                unsigned long __user *value)
2562{
2563        struct cyclades_card *card = info->card;
2564
2565        if (!cy_is_Z(card)) {
2566                u8 tmp = cyy_readb(info, CyCOR3) & CyREC_FIFO;
2567                return put_user(tmp, value);
2568        }
2569        return 0;
2570}                               /* get_threshold */
2571
2572static int set_timeout(struct cyclades_port *info, unsigned long value)
2573{
2574        struct cyclades_card *card = info->card;
2575        unsigned long flags;
2576
2577        if (!cy_is_Z(card)) {
2578                spin_lock_irqsave(&card->card_lock, flags);
2579                cyy_writeb(info, CyRTPR, value & 0xff);
2580                spin_unlock_irqrestore(&card->card_lock, flags);
2581        }
2582        return 0;
2583}                               /* set_timeout */
2584
2585static int get_timeout(struct cyclades_port *info,
2586                                                unsigned long __user *value)
2587{
2588        struct cyclades_card *card = info->card;
2589
2590        if (!cy_is_Z(card)) {
2591                u8 tmp = cyy_readb(info, CyRTPR);
2592                return put_user(tmp, value);
2593        }
2594        return 0;
2595}                               /* get_timeout */
2596
2597static int cy_cflags_changed(struct cyclades_port *info, unsigned long arg,
2598                struct cyclades_icount *cprev)
2599{
2600        struct cyclades_icount cnow;
2601        unsigned long flags;
2602        int ret;
2603
2604        spin_lock_irqsave(&info->card->card_lock, flags);
2605        cnow = info->icount;    /* atomic copy */
2606        spin_unlock_irqrestore(&info->card->card_lock, flags);
2607
2608        ret =   ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) ||
2609                ((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) ||
2610                ((arg & TIOCM_CD)  && (cnow.dcd != cprev->dcd)) ||
2611                ((arg & TIOCM_CTS) && (cnow.cts != cprev->cts));
2612
2613        *cprev = cnow;
2614
2615        return ret;
2616}
2617
2618/*
2619 * This routine allows the tty driver to implement device-
2620 * specific ioctl's.  If the ioctl number passed in cmd is
2621 * not recognized by the driver, it should return ENOIOCTLCMD.
2622 */
2623static int
2624cy_ioctl(struct tty_struct *tty,
2625         unsigned int cmd, unsigned long arg)
2626{
2627        struct cyclades_port *info = tty->driver_data;
2628        struct cyclades_icount cnow;    /* kernel counter temps */
2629        int ret_val = 0;
2630        unsigned long flags;
2631        void __user *argp = (void __user *)arg;
2632
2633        if (serial_paranoia_check(info, tty->name, "cy_ioctl"))
2634                return -ENODEV;
2635
2636#ifdef CY_DEBUG_OTHER
2637        printk(KERN_DEBUG "cyc:cy_ioctl ttyC%d, cmd = %x arg = %lx\n",
2638                info->line, cmd, arg);
2639#endif
2640
2641        switch (cmd) {
2642        case CYGETMON:
2643                if (copy_to_user(argp, &info->mon, sizeof(info->mon))) {
2644                        ret_val = -EFAULT;
2645                        break;
2646                }
2647                memset(&info->mon, 0, sizeof(info->mon));
2648                break;
2649        case CYGETTHRESH:
2650                ret_val = get_threshold(info, argp);
2651                break;
2652        case CYSETTHRESH:
2653                ret_val = set_threshold(info, arg);
2654                break;
2655        case CYGETDEFTHRESH:
2656                ret_val = put_user(info->default_threshold,
2657                                (unsigned long __user *)argp);
2658                break;
2659        case CYSETDEFTHRESH:
2660                info->default_threshold = arg & 0x0f;
2661                break;
2662        case CYGETTIMEOUT:
2663                ret_val = get_timeout(info, argp);
2664                break;
2665        case CYSETTIMEOUT:
2666                ret_val = set_timeout(info, arg);
2667                break;
2668        case CYGETDEFTIMEOUT:
2669                ret_val = put_user(info->default_timeout,
2670                                (unsigned long __user *)argp);
2671                break;
2672        case CYSETDEFTIMEOUT:
2673                info->default_timeout = arg & 0xff;
2674                break;
2675        case CYSETRFLOW:
2676                info->rflow = (int)arg;
2677                break;
2678        case CYGETRFLOW:
2679                ret_val = info->rflow;
2680                break;
2681        case CYSETRTSDTR_INV:
2682                info->rtsdtr_inv = (int)arg;
2683                break;
2684        case CYGETRTSDTR_INV:
2685                ret_val = info->rtsdtr_inv;
2686                break;
2687        case CYGETCD1400VER:
2688                ret_val = info->chip_rev;
2689                break;
2690#ifndef CONFIG_CYZ_INTR
2691        case CYZSETPOLLCYCLE:
2692                if (arg > LONG_MAX / HZ)
2693                        return -ENODEV;
2694                cyz_polling_cycle = (arg * HZ) / 1000;
2695                break;
2696        case CYZGETPOLLCYCLE:
2697                ret_val = (cyz_polling_cycle * 1000) / HZ;
2698                break;
2699#endif                          /* CONFIG_CYZ_INTR */
2700        case CYSETWAIT:
2701                info->port.closing_wait = (unsigned short)arg * HZ / 100;
2702                break;
2703        case CYGETWAIT:
2704                ret_val = info->port.closing_wait / (HZ / 100);
2705                break;
2706        case TIOCGSERIAL:
2707                ret_val = cy_get_serial_info(info, argp);
2708                break;
2709        case TIOCSSERIAL:
2710                ret_val = cy_set_serial_info(info, tty, argp);
2711                break;
2712        case TIOCSERGETLSR:     /* Get line status register */
2713                ret_val = get_lsr_info(info, argp);
2714                break;
2715                /*
2716                 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
2717                 * - mask passed in arg for lines of interest
2718                 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
2719                 * Caller should use TIOCGICOUNT to see which one it was
2720                 */
2721        case TIOCMIWAIT:
2722                spin_lock_irqsave(&info->card->card_lock, flags);
2723                /* note the counters on entry */
2724                cnow = info->icount;
2725                spin_unlock_irqrestore(&info->card->card_lock, flags);
2726                ret_val = wait_event_interruptible(info->port.delta_msr_wait,
2727                                cy_cflags_changed(info, arg, &cnow));
2728                break;
2729
2730                /*
2731                 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
2732                 * Return: write counters to the user passed counter struct
2733                 * NB: both 1->0 and 0->1 transitions are counted except for
2734                 *     RI where only 0->1 is counted.
2735                 */
2736        default:
2737                ret_val = -ENOIOCTLCMD;
2738        }
2739
2740#ifdef CY_DEBUG_OTHER
2741        printk(KERN_DEBUG "cyc:cy_ioctl done\n");
2742#endif
2743        return ret_val;
2744}                               /* cy_ioctl */
2745
2746static int cy_get_icount(struct tty_struct *tty,
2747                                struct serial_icounter_struct *sic)
2748{
2749        struct cyclades_port *info = tty->driver_data;
2750        struct cyclades_icount cnow;    /* Used to snapshot */
2751        unsigned long flags;
2752
2753        spin_lock_irqsave(&info->card->card_lock, flags);
2754        cnow = info->icount;
2755        spin_unlock_irqrestore(&info->card->card_lock, flags);
2756
2757        sic->cts = cnow.cts;
2758        sic->dsr = cnow.dsr;
2759        sic->rng = cnow.rng;
2760        sic->dcd = cnow.dcd;
2761        sic->rx = cnow.rx;
2762        sic->tx = cnow.tx;
2763        sic->frame = cnow.frame;
2764        sic->overrun = cnow.overrun;
2765        sic->parity = cnow.parity;
2766        sic->brk = cnow.brk;
2767        sic->buf_overrun = cnow.buf_overrun;
2768        return 0;
2769}
2770
2771/*
2772 * This routine allows the tty driver to be notified when
2773 * device's termios settings have changed.  Note that a
2774 * well-designed tty driver should be prepared to accept the case
2775 * where old == NULL, and try to do something rational.
2776 */
2777static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
2778{
2779        struct cyclades_port *info = tty->driver_data;
2780
2781#ifdef CY_DEBUG_OTHER
2782        printk(KERN_DEBUG "cyc:cy_set_termios ttyC%d\n", info->line);
2783#endif
2784
2785        cy_set_line_char(info, tty);
2786
2787        if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) {
2788                tty->hw_stopped = 0;
2789                cy_start(tty);
2790        }
2791#if 0
2792        /*
2793         * No need to wake up processes in open wait, since they
2794         * sample the CLOCAL flag once, and don't recheck it.
2795         * XXX  It's not clear whether the current behavior is correct
2796         * or not.  Hence, this may change.....
2797         */
2798        if (!(old_termios->c_cflag & CLOCAL) && C_CLOCAL(tty))
2799                wake_up_interruptible(&info->port.open_wait);
2800#endif
2801}                               /* cy_set_termios */
2802
2803/* This function is used to send a high-priority XON/XOFF character to
2804   the device.
2805*/
2806static void cy_send_xchar(struct tty_struct *tty, char ch)
2807{
2808        struct cyclades_port *info = tty->driver_data;
2809        struct cyclades_card *card;
2810        int channel;
2811
2812        if (serial_paranoia_check(info, tty->name, "cy_send_xchar"))
2813                return;
2814
2815        info->x_char = ch;
2816
2817        if (ch)
2818                cy_start(tty);
2819
2820        card = info->card;
2821        channel = info->line - card->first_line;
2822
2823        if (cy_is_Z(card)) {
2824                if (ch == STOP_CHAR(tty))
2825                        cyz_issue_cmd(card, channel, C_CM_SENDXOFF, 0L);
2826                else if (ch == START_CHAR(tty))
2827                        cyz_issue_cmd(card, channel, C_CM_SENDXON, 0L);
2828        }
2829}
2830
2831/* This routine is called by the upper-layer tty layer to signal
2832   that incoming characters should be throttled because the input
2833   buffers are close to full.
2834 */
2835static void cy_throttle(struct tty_struct *tty)
2836{
2837        struct cyclades_port *info = tty->driver_data;
2838        struct cyclades_card *card;
2839        unsigned long flags;
2840
2841#ifdef CY_DEBUG_THROTTLE
2842        printk(KERN_DEBUG "cyc:throttle %s ...ttyC%d\n", tty_name(tty),
2843                         info->line);
2844#endif
2845
2846        if (serial_paranoia_check(info, tty->name, "cy_throttle"))
2847                return;
2848
2849        card = info->card;
2850
2851        if (I_IXOFF(tty)) {
2852                if (!cy_is_Z(card))
2853                        cy_send_xchar(tty, STOP_CHAR(tty));
2854                else
2855                        info->throttle = 1;
2856        }
2857
2858        if (C_CRTSCTS(tty)) {
2859                if (!cy_is_Z(card)) {
2860                        spin_lock_irqsave(&card->card_lock, flags);
2861                        cyy_change_rts_dtr(info, 0, TIOCM_RTS);
2862                        spin_unlock_irqrestore(&card->card_lock, flags);
2863                } else {
2864                        info->throttle = 1;
2865                }
2866        }
2867}                               /* cy_throttle */
2868
2869/*
2870 * This routine notifies the tty driver that it should signal
2871 * that characters can now be sent to the tty without fear of
2872 * overrunning the input buffers of the line disciplines.
2873 */
2874static void cy_unthrottle(struct tty_struct *tty)
2875{
2876        struct cyclades_port *info = tty->driver_data;
2877        struct cyclades_card *card;
2878        unsigned long flags;
2879
2880#ifdef CY_DEBUG_THROTTLE
2881        printk(KERN_DEBUG "cyc:unthrottle %s ...ttyC%d\n",
2882                tty_name(tty), info->line);
2883#endif
2884
2885        if (serial_paranoia_check(info, tty->name, "cy_unthrottle"))
2886                return;
2887
2888        if (I_IXOFF(tty)) {
2889                if (info->x_char)
2890                        info->x_char = 0;
2891                else
2892                        cy_send_xchar(tty, START_CHAR(tty));
2893        }
2894
2895        if (C_CRTSCTS(tty)) {
2896                card = info->card;
2897                if (!cy_is_Z(card)) {
2898                        spin_lock_irqsave(&card->card_lock, flags);
2899                        cyy_change_rts_dtr(info, TIOCM_RTS, 0);
2900                        spin_unlock_irqrestore(&card->card_lock, flags);
2901                } else {
2902                        info->throttle = 0;
2903                }
2904        }
2905}                               /* cy_unthrottle */
2906
2907/* cy_start and cy_stop provide software output flow control as a
2908   function of XON/XOFF, software CTS, and other such stuff.
2909*/
2910static void cy_stop(struct tty_struct *tty)
2911{
2912        struct cyclades_card *cinfo;
2913        struct cyclades_port *info = tty->driver_data;
2914        int channel;
2915        unsigned long flags;
2916
2917#ifdef CY_DEBUG_OTHER
2918        printk(KERN_DEBUG "cyc:cy_stop ttyC%d\n", info->line);
2919#endif
2920
2921        if (serial_paranoia_check(info, tty->name, "cy_stop"))
2922                return;
2923
2924        cinfo = info->card;
2925        channel = info->line - cinfo->first_line;
2926        if (!cy_is_Z(cinfo)) {
2927                spin_lock_irqsave(&cinfo->card_lock, flags);
2928                cyy_writeb(info, CyCAR, channel & 0x03);
2929                cyy_writeb(info, CySRER, cyy_readb(info, CySRER) & ~CyTxRdy);
2930                spin_unlock_irqrestore(&cinfo->card_lock, flags);
2931        }
2932}                               /* cy_stop */
2933
2934static void cy_start(struct tty_struct *tty)
2935{
2936        struct cyclades_card *cinfo;
2937        struct cyclades_port *info = tty->driver_data;
2938        int channel;
2939        unsigned long flags;
2940
2941#ifdef CY_DEBUG_OTHER
2942        printk(KERN_DEBUG "cyc:cy_start ttyC%d\n", info->line);
2943#endif
2944
2945        if (serial_paranoia_check(info, tty->name, "cy_start"))
2946                return;
2947
2948        cinfo = info->card;
2949        channel = info->line - cinfo->first_line;
2950        if (!cy_is_Z(cinfo)) {
2951                spin_lock_irqsave(&cinfo->card_lock, flags);
2952                cyy_writeb(info, CyCAR, channel & 0x03);
2953                cyy_writeb(info, CySRER, cyy_readb(info, CySRER) | CyTxRdy);
2954                spin_unlock_irqrestore(&cinfo->card_lock, flags);
2955        }
2956}                               /* cy_start */
2957
2958/*
2959 * cy_hangup() --- called by tty_hangup() when a hangup is signaled.
2960 */
2961static void cy_hangup(struct tty_struct *tty)
2962{
2963        struct cyclades_port *info = tty->driver_data;
2964
2965#ifdef CY_DEBUG_OTHER
2966        printk(KERN_DEBUG "cyc:cy_hangup ttyC%d\n", info->line);
2967#endif
2968
2969        if (serial_paranoia_check(info, tty->name, "cy_hangup"))
2970                return;
2971
2972        cy_flush_buffer(tty);
2973        cy_shutdown(info, tty);
2974        tty_port_hangup(&info->port);
2975}                               /* cy_hangup */
2976
2977static int cyy_carrier_raised(struct tty_port *port)
2978{
2979        struct cyclades_port *info = container_of(port, struct cyclades_port,
2980                        port);
2981        struct cyclades_card *cinfo = info->card;
2982        unsigned long flags;
2983        int channel = info->line - cinfo->first_line;
2984        u32 cd;
2985
2986        spin_lock_irqsave(&cinfo->card_lock, flags);
2987        cyy_writeb(info, CyCAR, channel & 0x03);
2988        cd = cyy_readb(info, CyMSVR1) & CyDCD;
2989        spin_unlock_irqrestore(&cinfo->card_lock, flags);
2990
2991        return cd;
2992}
2993
2994static void cyy_dtr_rts(struct tty_port *port, int raise)
2995{
2996        struct cyclades_port *info = container_of(port, struct cyclades_port,
2997                        port);
2998        struct cyclades_card *cinfo = info->card;
2999        unsigned long flags;
3000
3001        spin_lock_irqsave(&cinfo->card_lock, flags);
3002        cyy_change_rts_dtr(info, raise ? TIOCM_RTS | TIOCM_DTR : 0,
3003                        raise ? 0 : TIOCM_RTS | TIOCM_DTR);
3004        spin_unlock_irqrestore(&cinfo->card_lock, flags);
3005}
3006
3007static int cyz_carrier_raised(struct tty_port *port)
3008{
3009        struct cyclades_port *info = container_of(port, struct cyclades_port,
3010                        port);
3011
3012        return readl(&info->u.cyz.ch_ctrl->rs_status) & C_RS_DCD;
3013}
3014
3015static void cyz_dtr_rts(struct tty_port *port, int raise)
3016{
3017        struct cyclades_port *info = container_of(port, struct cyclades_port,
3018                        port);
3019        struct cyclades_card *cinfo = info->card;
3020        struct CH_CTRL __iomem *ch_ctrl = info->u.cyz.ch_ctrl;
3021        int ret, channel = info->line - cinfo->first_line;
3022        u32 rs;
3023
3024        rs = readl(&ch_ctrl->rs_control);
3025        if (raise)
3026                rs |= C_RS_RTS | C_RS_DTR;
3027        else
3028                rs &= ~(C_RS_RTS | C_RS_DTR);
3029        cy_writel(&ch_ctrl->rs_control, rs);
3030        ret = cyz_issue_cmd(cinfo, channel, C_CM_IOCTLM, 0L);
3031        if (ret != 0)
3032                printk(KERN_ERR "%s: retval on ttyC%d was %x\n",
3033                                __func__, info->line, ret);
3034#ifdef CY_DEBUG_DTR
3035        printk(KERN_DEBUG "%s: raising Z DTR\n", __func__);
3036#endif
3037}
3038
3039static const struct tty_port_operations cyy_port_ops = {
3040        .carrier_raised = cyy_carrier_raised,
3041        .dtr_rts = cyy_dtr_rts,
3042        .shutdown = cy_do_close,
3043};
3044
3045static const struct tty_port_operations cyz_port_ops = {
3046        .carrier_raised = cyz_carrier_raised,
3047        .dtr_rts = cyz_dtr_rts,
3048        .shutdown = cy_do_close,
3049};
3050
3051/*
3052 * ---------------------------------------------------------------------
3053 * cy_init() and friends
3054 *
3055 * cy_init() is called at boot-time to initialize the serial driver.
3056 * ---------------------------------------------------------------------
3057 */
3058
3059static int cy_init_card(struct cyclades_card *cinfo)
3060{
3061        struct cyclades_port *info;
3062        unsigned int channel, port;
3063
3064        spin_lock_init(&cinfo->card_lock);
3065        cinfo->intr_enabled = 0;
3066
3067        cinfo->ports = kcalloc(cinfo->nports, sizeof(*cinfo->ports),
3068                        GFP_KERNEL);
3069        if (cinfo->ports == NULL) {
3070                printk(KERN_ERR "Cyclades: cannot allocate ports\n");
3071                return -ENOMEM;
3072        }
3073
3074        for (channel = 0, port = cinfo->first_line; channel < cinfo->nports;
3075                        channel++, port++) {
3076                info = &cinfo->ports[channel];
3077                tty_port_init(&info->port);
3078                info->magic = CYCLADES_MAGIC;
3079                info->card = cinfo;
3080                info->line = port;
3081
3082                info->port.closing_wait = CLOSING_WAIT_DELAY;
3083                info->port.close_delay = 5 * HZ / 10;
3084                init_completion(&info->shutdown_wait);
3085
3086                if (cy_is_Z(cinfo)) {
3087                        struct FIRM_ID *firm_id = cinfo->base_addr + ID_ADDRESS;
3088                        struct ZFW_CTRL *zfw_ctrl;
3089
3090                        info->port.ops = &cyz_port_ops;
3091                        info->type = PORT_STARTECH;
3092
3093                        zfw_ctrl = cinfo->base_addr +
3094                                (readl(&firm_id->zfwctrl_addr) & 0xfffff);
3095                        info->u.cyz.ch_ctrl = &zfw_ctrl->ch_ctrl[channel];
3096                        info->u.cyz.buf_ctrl = &zfw_ctrl->buf_ctrl[channel];
3097
3098                        if (cinfo->hw_ver == ZO_V1)
3099                                info->xmit_fifo_size = CYZ_FIFO_SIZE;
3100                        else
3101                                info->xmit_fifo_size = 4 * CYZ_FIFO_SIZE;
3102#ifdef CONFIG_CYZ_INTR
3103                        setup_timer(&cyz_rx_full_timer[port],
3104                                cyz_rx_restart, (unsigned long)info);
3105#endif
3106                } else {
3107                        unsigned short chip_number;
3108                        int index = cinfo->bus_index;
3109
3110                        info->port.ops = &cyy_port_ops;
3111                        info->type = PORT_CIRRUS;
3112                        info->xmit_fifo_size = CyMAX_CHAR_FIFO;
3113                        info->cor1 = CyPARITY_NONE | Cy_1_STOP | Cy_8_BITS;
3114                        info->cor2 = CyETC;
3115                        info->cor3 = 0x08;      /* _very_ small rcv threshold */
3116
3117                        chip_number = channel / CyPORTS_PER_CHIP;
3118                        info->u.cyy.base_addr = cinfo->base_addr +
3119                                (cy_chip_offset[chip_number] << index);
3120                        info->chip_rev = cyy_readb(info, CyGFRCR);
3121
3122                        if (info->chip_rev >= CD1400_REV_J) {
3123                                /* It is a CD1400 rev. J or later */
3124                                info->tbpr = baud_bpr_60[13];   /* Tx BPR */
3125                                info->tco = baud_co_60[13];     /* Tx CO */
3126                                info->rbpr = baud_bpr_60[13];   /* Rx BPR */
3127                                info->rco = baud_co_60[13];     /* Rx CO */
3128                                info->rtsdtr_inv = 1;
3129                        } else {
3130                                info->tbpr = baud_bpr_25[13];   /* Tx BPR */
3131                                info->tco = baud_co_25[13];     /* Tx CO */
3132                                info->rbpr = baud_bpr_25[13];   /* Rx BPR */
3133                                info->rco = baud_co_25[13];     /* Rx CO */
3134                                info->rtsdtr_inv = 0;
3135                        }
3136                        info->read_status_mask = CyTIMEOUT | CySPECHAR |
3137                                CyBREAK | CyPARITY | CyFRAME | CyOVERRUN;
3138                }
3139
3140        }
3141
3142#ifndef CONFIG_CYZ_INTR
3143        if (cy_is_Z(cinfo) && !timer_pending(&cyz_timerlist)) {
3144                mod_timer(&cyz_timerlist, jiffies + 1);
3145#ifdef CY_PCI_DEBUG
3146                printk(KERN_DEBUG "Cyclades-Z polling initialized\n");
3147#endif
3148        }
3149#endif
3150        return 0;
3151}
3152
3153/* initialize chips on Cyclom-Y card -- return number of valid
3154   chips (which is number of ports/4) */
3155static unsigned short cyy_init_card(void __iomem *true_base_addr,
3156                int index)
3157{
3158        unsigned int chip_number;
3159        void __iomem *base_addr;
3160
3161        cy_writeb(true_base_addr + (Cy_HwReset << index), 0);
3162        /* Cy_HwReset is 0x1400 */
3163        cy_writeb(true_base_addr + (Cy_ClrIntr << index), 0);
3164        /* Cy_ClrIntr is 0x1800 */
3165        udelay(500L);
3166
3167        for (chip_number = 0; chip_number < CyMAX_CHIPS_PER_CARD;
3168                                                        chip_number++) {
3169                base_addr =
3170                    true_base_addr + (cy_chip_offset[chip_number] << index);
3171                mdelay(1);
3172                if (readb(base_addr + (CyCCR << index)) != 0x00) {
3173                        /*************
3174                        printk(" chip #%d at %#6lx is never idle (CCR != 0)\n",
3175                        chip_number, (unsigned long)base_addr);
3176                        *************/
3177                        return chip_number;
3178                }
3179
3180                cy_writeb(base_addr + (CyGFRCR << index), 0);
3181                udelay(10L);
3182
3183                /* The Cyclom-16Y does not decode address bit 9 and therefore
3184                   cannot distinguish between references to chip 0 and a non-
3185                   existent chip 4.  If the preceding clearing of the supposed
3186                   chip 4 GFRCR register appears at chip 0, there is no chip 4
3187                   and this must be a Cyclom-16Y, not a Cyclom-32Ye.
3188                 */
3189                if (chip_number == 4 && readb(true_base_addr +
3190                                (cy_chip_offset[0] << index) +
3191                                (CyGFRCR << index)) == 0) {
3192                        return chip_number;
3193                }
3194
3195                cy_writeb(base_addr + (CyCCR << index), CyCHIP_RESET);
3196                mdelay(1);
3197
3198                if (readb(base_addr + (CyGFRCR << index)) == 0x00) {
3199                        /*
3200                           printk(" chip #%d at %#6lx is not responding ",
3201                           chip_number, (unsigned long)base_addr);
3202                           printk("(GFRCR stayed 0)\n",
3203                         */
3204                        return chip_number;
3205                }
3206                if ((0xf0 & (readb(base_addr + (CyGFRCR << index)))) !=
3207                                0x40) {
3208                        /*
3209                        printk(" chip #%d at %#6lx is not valid (GFRCR == "
3210                                        "%#2x)\n",
3211                                        chip_number, (unsigned long)base_addr,
3212                                        base_addr[CyGFRCR<<index]);
3213                         */
3214                        return chip_number;
3215                }
3216                cy_writeb(base_addr + (CyGCR << index), CyCH0_SERIAL);
3217                if (readb(base_addr + (CyGFRCR << index)) >= CD1400_REV_J) {
3218                        /* It is a CD1400 rev. J or later */
3219                        /* Impossible to reach 5ms with this chip.
3220                           Changed to 2ms instead (f = 500 Hz). */
3221                        cy_writeb(base_addr + (CyPPR << index), CyCLOCK_60_2MS);
3222                } else {
3223                        /* f = 200 Hz */
3224                        cy_writeb(base_addr + (CyPPR << index), CyCLOCK_25_5MS);
3225                }
3226
3227                /*
3228                   printk(" chip #%d at %#6lx is rev 0x%2x\n",
3229                   chip_number, (unsigned long)base_addr,
3230                   readb(base_addr+(CyGFRCR<<index)));
3231                 */
3232        }
3233        return chip_number;
3234}                               /* cyy_init_card */
3235
3236/*
3237 * ---------------------------------------------------------------------
3238 * cy_detect_isa() - Probe for Cyclom-Y/ISA boards.
3239 * sets global variables and return the number of ISA boards found.
3240 * ---------------------------------------------------------------------
3241 */
3242static int __init cy_detect_isa(void)
3243{
3244#ifdef CONFIG_ISA
3245        struct cyclades_card *card;
3246        unsigned short cy_isa_irq, nboard;
3247        void __iomem *cy_isa_address;
3248        unsigned short i, j, k, cy_isa_nchan;
3249        int isparam = 0;
3250
3251        nboard = 0;
3252
3253        /* Check for module parameters */
3254        for (i = 0; i < NR_CARDS; i++) {
3255                if (maddr[i] || i) {
3256                        isparam = 1;
3257                        cy_isa_addresses[i] = maddr[i];
3258                }
3259                if (!maddr[i])
3260                        break;
3261        }
3262
3263        /* scan the address table probing for Cyclom-Y/ISA boards */
3264        for (i = 0; i < NR_ISA_ADDRS; i++) {
3265                unsigned int isa_address = cy_isa_addresses[i];
3266                if (isa_address == 0x0000)
3267                        return nboard;
3268
3269                /* probe for CD1400... */
3270                cy_isa_address = ioremap_nocache(isa_address, CyISA_Ywin);
3271                if (cy_isa_address == NULL) {
3272                        printk(KERN_ERR "Cyclom-Y/ISA: can't remap base "
3273                                        "address\n");
3274                        continue;
3275                }
3276                cy_isa_nchan = CyPORTS_PER_CHIP *
3277                        cyy_init_card(cy_isa_address, 0);
3278                if (cy_isa_nchan == 0) {
3279                        iounmap(cy_isa_address);
3280                        continue;
3281                }
3282
3283                if (isparam && i < NR_CARDS && irq[i])
3284                        cy_isa_irq = irq[i];
3285                else
3286                        /* find out the board's irq by probing */
3287                        cy_isa_irq = detect_isa_irq(cy_isa_address);
3288                if (cy_isa_irq == 0) {
3289                        printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but the "
3290                                "IRQ could not be detected.\n",
3291                                (unsigned long)cy_isa_address);
3292                        iounmap(cy_isa_address);
3293                        continue;
3294                }
3295
3296                if ((cy_next_channel + cy_isa_nchan) > NR_PORTS) {
3297                        printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but no "
3298                                "more channels are available. Change NR_PORTS "
3299                                "in cyclades.c and recompile kernel.\n",
3300                                (unsigned long)cy_isa_address);
3301                        iounmap(cy_isa_address);
3302                        return nboard;
3303                }
3304                /* fill the next cy_card structure available */
3305                for (j = 0; j < NR_CARDS; j++) {
3306                        card = &cy_card[j];
3307                        if (card->base_addr == NULL)
3308                                break;
3309                }
3310                if (j == NR_CARDS) {    /* no more cy_cards available */
3311                        printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but no "
3312                                "more cards can be used. Change NR_CARDS in "
3313                                "cyclades.c and recompile kernel.\n",
3314                                (unsigned long)cy_isa_address);
3315                        iounmap(cy_isa_address);
3316                        return nboard;
3317                }
3318
3319                /* allocate IRQ */
3320                if (request_irq(cy_isa_irq, cyy_interrupt,
3321                                0, "Cyclom-Y", card)) {
3322                        printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but "
3323                                "could not allocate IRQ#%d.\n",
3324                                (unsigned long)cy_isa_address, cy_isa_irq);
3325                        iounmap(cy_isa_address);
3326                        return nboard;
3327                }
3328
3329                /* set cy_card */
3330                card->base_addr = cy_isa_address;
3331                card->ctl_addr.p9050 = NULL;
3332                card->irq = (int)cy_isa_irq;
3333                card->bus_index = 0;
3334                card->first_line = cy_next_channel;
3335                card->num_chips = cy_isa_nchan / CyPORTS_PER_CHIP;
3336                card->nports = cy_isa_nchan;
3337                if (cy_init_card(card)) {
3338                        card->base_addr = NULL;
3339                        free_irq(cy_isa_irq, card);
3340                        iounmap(cy_isa_address);
3341                        continue;
3342                }
3343                nboard++;
3344
3345                printk(KERN_INFO "Cyclom-Y/ISA #%d: 0x%lx-0x%lx, IRQ%d found: "
3346                        "%d channels starting from port %d\n",
3347                        j + 1, (unsigned long)cy_isa_address,
3348                        (unsigned long)(cy_isa_address + (CyISA_Ywin - 1)),
3349                        cy_isa_irq, cy_isa_nchan, cy_next_channel);
3350
3351                for (k = 0, j = cy_next_channel;
3352                                j < cy_next_channel + cy_isa_nchan; j++, k++)
3353                        tty_port_register_device(&card->ports[k].port,
3354                                        cy_serial_driver, j, NULL);
3355                cy_next_channel += cy_isa_nchan;
3356        }
3357        return nboard;
3358#else
3359        return 0;
3360#endif                          /* CONFIG_ISA */
3361}                               /* cy_detect_isa */
3362
3363#ifdef CONFIG_PCI
3364static inline int cyc_isfwstr(const char *str, unsigned int size)
3365{
3366        unsigned int a;
3367
3368        for (a = 0; a < size && *str; a++, str++)
3369                if (*str & 0x80)
3370                        return -EINVAL;
3371
3372        for (; a < size; a++, str++)
3373                if (*str)
3374                        return -EINVAL;
3375
3376        return 0;
3377}
3378
3379static inline void cyz_fpga_copy(void __iomem *fpga, const u8 *data,
3380                unsigned int size)
3381{
3382        for (; size > 0; size--) {
3383                cy_writel(fpga, *data++);
3384                udelay(10);
3385        }
3386}
3387
3388static void plx_init(struct pci_dev *pdev, int irq,
3389                struct RUNTIME_9060 __iomem *addr)
3390{
3391        /* Reset PLX */
3392        cy_writel(&addr->init_ctrl, readl(&addr->init_ctrl) | 0x40000000);
3393        udelay(100L);
3394        cy_writel(&addr->init_ctrl, readl(&addr->init_ctrl) & ~0x40000000);
3395
3396        /* Reload Config. Registers from EEPROM */
3397        cy_writel(&addr->init_ctrl, readl(&addr->init_ctrl) | 0x20000000);
3398        udelay(100L);
3399        cy_writel(&addr->init_ctrl, readl(&addr->init_ctrl) & ~0x20000000);
3400
3401        /* For some yet unknown reason, once the PLX9060 reloads the EEPROM,
3402         * the IRQ is lost and, thus, we have to re-write it to the PCI config.
3403         * registers. This will remain here until we find a permanent fix.
3404         */
3405        pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, irq);
3406}
3407
3408static int __cyz_load_fw(const struct firmware *fw,
3409                const char *name, const u32 mailbox, void __iomem *base,
3410                void __iomem *fpga)
3411{
3412        const void *ptr = fw->data;
3413        const struct zfile_header *h = ptr;
3414        const struct zfile_config *c, *cs;
3415        const struct zfile_block *b, *bs;
3416        unsigned int a, tmp, len = fw->size;
3417#define BAD_FW KERN_ERR "Bad firmware: "
3418        if (len < sizeof(*h)) {
3419                printk(BAD_FW "too short: %u<%zu\n", len, sizeof(*h));
3420                return -EINVAL;
3421        }
3422
3423        cs = ptr + h->config_offset;
3424        bs = ptr + h->block_offset;
3425
3426        if ((void *)(cs + h->n_config) > ptr + len ||
3427                        (void *)(bs + h->n_blocks) > ptr + len) {
3428                printk(BAD_FW "too short");
3429                return  -EINVAL;
3430        }
3431
3432        if (cyc_isfwstr(h->name, sizeof(h->name)) ||
3433                        cyc_isfwstr(h->date, sizeof(h->date))) {
3434                printk(BAD_FW "bad formatted header string\n");
3435                return -EINVAL;
3436        }
3437
3438        if (strncmp(name, h->name, sizeof(h->name))) {
3439                printk(BAD_FW "bad name '%s' (expected '%s')\n", h->name, name);
3440                return -EINVAL;
3441        }
3442
3443        tmp = 0;
3444        for (c = cs; c < cs + h->n_config; c++) {
3445                for (a = 0; a < c->n_blocks; a++)
3446                        if (c->block_list[a] > h->n_blocks) {
3447                                printk(BAD_FW "bad block ref number in cfgs\n");
3448                                return -EINVAL;
3449                        }
3450                if (c->mailbox == mailbox && c->function == 0) /* 0 is normal */
3451                        tmp++;
3452        }
3453        if (!tmp) {
3454                printk(BAD_FW "nothing appropriate\n");
3455                return -EINVAL;
3456        }
3457
3458        for (b = bs; b < bs + h->n_blocks; b++)
3459                if (b->file_offset + b->size > len) {
3460                        printk(BAD_FW "bad block data offset\n");
3461                        return -EINVAL;
3462                }
3463
3464        /* everything is OK, let's seek'n'load it */
3465        for (c = cs; c < cs + h->n_config; c++)
3466                if (c->mailbox == mailbox && c->function == 0)
3467                        break;
3468
3469        for (a = 0; a < c->n_blocks; a++) {
3470                b = &bs[c->block_list[a]];
3471                if (b->type == ZBLOCK_FPGA) {
3472                        if (fpga != NULL)
3473                                cyz_fpga_copy(fpga, ptr + b->file_offset,
3474                                                b->size);
3475                } else {
3476                        if (base != NULL)
3477                                memcpy_toio(base + b->ram_offset,
3478                                               ptr + b->file_offset, b->size);
3479                }
3480        }
3481#undef BAD_FW
3482        return 0;
3483}
3484
3485static int cyz_load_fw(struct pci_dev *pdev, void __iomem *base_addr,
3486                struct RUNTIME_9060 __iomem *ctl_addr, int irq)
3487{
3488        const struct firmware *fw;
3489        struct FIRM_ID __iomem *fid = base_addr + ID_ADDRESS;
3490        struct CUSTOM_REG __iomem *cust = base_addr;
3491        struct ZFW_CTRL __iomem *pt_zfwctrl;
3492        void __iomem *tmp;
3493        u32 mailbox, status, nchan;
3494        unsigned int i;
3495        int retval;
3496
3497        retval = request_firmware(&fw, "cyzfirm.bin", &pdev->dev);
3498        if (retval) {
3499                dev_err(&pdev->dev, "can't get firmware\n");
3500                goto err;
3501        }
3502
3503        /* Check whether the firmware is already loaded and running. If
3504           positive, skip this board */
3505        if (__cyz_fpga_loaded(ctl_addr) && readl(&fid->signature) == ZFIRM_ID) {
3506                u32 cntval = readl(base_addr + 0x190);
3507
3508                udelay(100);
3509                if (cntval != readl(base_addr + 0x190)) {
3510                        /* FW counter is working, FW is running */
3511                        dev_dbg(&pdev->dev, "Cyclades-Z FW already loaded. "
3512                                        "Skipping board.\n");
3513                        retval = 0;
3514                        goto err_rel;
3515                }
3516        }
3517
3518        /* start boot */
3519        cy_writel(&ctl_addr->intr_ctrl_stat, readl(&ctl_addr->intr_ctrl_stat) &
3520                        ~0x00030800UL);
3521
3522        mailbox = readl(&ctl_addr->mail_box_0);
3523
3524        if (mailbox == 0 || __cyz_fpga_loaded(ctl_addr)) {
3525                /* stops CPU and set window to beginning of RAM */
3526                cy_writel(&ctl_addr->loc_addr_base, WIN_CREG);
3527                cy_writel(&cust->cpu_stop, 0);
3528                cy_writel(&ctl_addr->loc_addr_base, WIN_RAM);
3529                udelay(100);
3530        }
3531
3532        plx_init(pdev, irq, ctl_addr);
3533
3534        if (mailbox != 0) {
3535                /* load FPGA */
3536                retval = __cyz_load_fw(fw, "Cyclom-Z", mailbox, NULL,
3537                                base_addr);
3538                if (retval)
3539                        goto err_rel;
3540                if (!__cyz_fpga_loaded(ctl_addr)) {
3541                        dev_err(&pdev->dev, "fw upload successful, but fw is "
3542                                        "not loaded\n");
3543                        goto err_rel;
3544                }
3545        }
3546
3547        /* stops CPU and set window to beginning of RAM */
3548        cy_writel(&ctl_addr->loc_addr_base, WIN_CREG);
3549        cy_writel(&cust->cpu_stop, 0);
3550        cy_writel(&ctl_addr->loc_addr_base, WIN_RAM);
3551        udelay(100);
3552
3553        /* clear memory */
3554        for (tmp = base_addr; tmp < base_addr + RAM_SIZE; tmp++)
3555                cy_writeb(tmp, 255);
3556        if (mailbox != 0) {
3557                /* set window to last 512K of RAM */
3558                cy_writel(&ctl_addr->loc_addr_base, WIN_RAM + RAM_SIZE);
3559                for (tmp = base_addr; tmp < base_addr + RAM_SIZE; tmp++)
3560                        cy_writeb(tmp, 255);
3561                /* set window to beginning of RAM */
3562                cy_writel(&ctl_addr->loc_addr_base, WIN_RAM);
3563        }
3564
3565        retval = __cyz_load_fw(fw, "Cyclom-Z", mailbox, base_addr, NULL);
3566        release_firmware(fw);
3567        if (retval)
3568                goto err;
3569
3570        /* finish boot and start boards */
3571        cy_writel(&ctl_addr->loc_addr_base, WIN_CREG);
3572        cy_writel(&cust->cpu_start, 0);
3573        cy_writel(&ctl_addr->loc_addr_base, WIN_RAM);
3574        i = 0;
3575        while ((status = readl(&fid->signature)) != ZFIRM_ID && i++ < 40)
3576                msleep(100);
3577        if (status != ZFIRM_ID) {
3578                if (status == ZFIRM_HLT) {
3579                        dev_err(&pdev->dev, "you need an external power supply "
3580                                "for this number of ports. Firmware halted and "
3581                                "board reset.\n");
3582                        retval = -EIO;
3583                        goto err;
3584                }
3585                dev_warn(&pdev->dev, "fid->signature = 0x%x... Waiting "
3586                                "some more time\n", status);
3587                while ((status = readl(&fid->signature)) != ZFIRM_ID &&
3588                                i++ < 200)
3589                        msleep(100);
3590                if (status != ZFIRM_ID) {
3591                        dev_err(&pdev->dev, "Board not started in 20 seconds! "
3592                                        "Giving up. (fid->signature = 0x%x)\n",
3593                                        status);
3594                        dev_info(&pdev->dev, "*** Warning ***: if you are "
3595                                "upgrading the FW, please power cycle the "
3596                                "system before loading the new FW to the "
3597                                "Cyclades-Z.\n");
3598
3599                        if (__cyz_fpga_loaded(ctl_addr))
3600                                plx_init(pdev, irq, ctl_addr);
3601
3602                        retval = -EIO;
3603                        goto err;
3604                }
3605                dev_dbg(&pdev->dev, "Firmware started after %d seconds.\n",
3606                                i / 10);
3607        }
3608        pt_zfwctrl = base_addr + readl(&fid->zfwctrl_addr);
3609
3610        dev_dbg(&pdev->dev, "fid=> %p, zfwctrl_addr=> %x, npt_zfwctrl=> %p\n",
3611                        base_addr + ID_ADDRESS, readl(&fid->zfwctrl_addr),
3612                        base_addr + readl(&fid->zfwctrl_addr));
3613
3614        nchan = readl(&pt_zfwctrl->board_ctrl.n_channel);
3615        dev_info(&pdev->dev, "Cyclades-Z FW loaded: version = %x, ports = %u\n",
3616                readl(&pt_zfwctrl->board_ctrl.fw_version), nchan);
3617
3618        if (nchan == 0) {
3619                dev_warn(&pdev->dev, "no Cyclades-Z ports were found. Please "
3620                        "check the connection between the Z host card and the "
3621                        "serial expanders.\n");
3622
3623                if (__cyz_fpga_loaded(ctl_addr))
3624                        plx_init(pdev, irq, ctl_addr);
3625
3626                dev_info(&pdev->dev, "Null number of ports detected. Board "
3627                                "reset.\n");
3628                retval = 0;
3629                goto err;
3630        }
3631
3632        cy_writel(&pt_zfwctrl->board_ctrl.op_system, C_OS_LINUX);
3633        cy_writel(&pt_zfwctrl->board_ctrl.dr_version, DRIVER_VERSION);
3634
3635        /*
3636           Early firmware failed to start looking for commands.
3637           This enables firmware interrupts for those commands.
3638         */
3639        cy_writel(&ctl_addr->intr_ctrl_stat, readl(&ctl_addr->intr_ctrl_stat) |
3640                        (1 << 17));
3641        cy_writel(&ctl_addr->intr_ctrl_stat, readl(&ctl_addr->intr_ctrl_stat) |
3642                        0x00030800UL);
3643
3644        return nchan;
3645err_rel:
3646        release_firmware(fw);
3647err:
3648        return retval;
3649}
3650
3651static int cy_pci_probe(struct pci_dev *pdev,
3652                const struct pci_device_id *ent)
3653{
3654        struct cyclades_card *card;
3655        void __iomem *addr0 = NULL, *addr2 = NULL;
3656        char *card_name = NULL;
3657        u32 uninitialized_var(mailbox);
3658        unsigned int device_id, nchan = 0, card_no, i, j;
3659        unsigned char plx_ver;
3660        int retval, irq;
3661
3662        retval = pci_enable_device(pdev);
3663        if (retval) {
3664                dev_err(&pdev->dev, "cannot enable device\n");
3665                goto err;
3666        }
3667
3668        /* read PCI configuration area */
3669        irq = pdev->irq;
3670        device_id = pdev->device & ~PCI_DEVICE_ID_MASK;
3671
3672#if defined(__alpha__)
3673        if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo) {   /* below 1M? */
3674                dev_err(&pdev->dev, "Cyclom-Y/PCI not supported for low "
3675                        "addresses on Alpha systems.\n");
3676                retval = -EIO;
3677                goto err_dis;
3678        }
3679#endif
3680        if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Lo) {
3681                dev_err(&pdev->dev, "Cyclades-Z/PCI not supported for low "
3682                        "addresses\n");
3683                retval = -EIO;
3684                goto err_dis;
3685        }
3686
3687        if (pci_resource_flags(pdev, 2) & IORESOURCE_IO) {
3688                dev_warn(&pdev->dev, "PCI I/O bit incorrectly set. Ignoring "
3689                                "it...\n");
3690                pdev->resource[2].flags &= ~IORESOURCE_IO;
3691        }
3692
3693        retval = pci_request_regions(pdev, "cyclades");
3694        if (retval) {
3695                dev_err(&pdev->dev, "failed to reserve resources\n");
3696                goto err_dis;
3697        }
3698
3699        retval = -EIO;
3700        if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
3701                        device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
3702                card_name = "Cyclom-Y";
3703
3704                addr0 = ioremap_nocache(pci_resource_start(pdev, 0),
3705                                CyPCI_Yctl);
3706                if (addr0 == NULL) {
3707                        dev_err(&pdev->dev, "can't remap ctl region\n");
3708                        goto err_reg;
3709                }
3710                addr2 = ioremap_nocache(pci_resource_start(pdev, 2),
3711                                CyPCI_Ywin);
3712                if (addr2 == NULL) {
3713                        dev_err(&pdev->dev, "can't remap base region\n");
3714                        goto err_unmap;
3715                }
3716
3717                nchan = CyPORTS_PER_CHIP * cyy_init_card(addr2, 1);
3718                if (nchan == 0) {
3719                        dev_err(&pdev->dev, "Cyclom-Y PCI host card with no "
3720                                        "Serial-Modules\n");
3721                        goto err_unmap;
3722                }
3723        } else if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Hi) {
3724                struct RUNTIME_9060 __iomem *ctl_addr;
3725
3726                ctl_addr = addr0 = ioremap_nocache(pci_resource_start(pdev, 0),
3727                                CyPCI_Zctl);
3728                if (addr0 == NULL) {
3729                        dev_err(&pdev->dev, "can't remap ctl region\n");
3730                        goto err_reg;
3731                }
3732
3733                /* Disable interrupts on the PLX before resetting it */
3734                cy_writew(&ctl_addr->intr_ctrl_stat,
3735                                readw(&ctl_addr->intr_ctrl_stat) & ~0x0900);
3736
3737                plx_init(pdev, irq, addr0);
3738
3739                mailbox = readl(&ctl_addr->mail_box_0);
3740
3741                addr2 = ioremap_nocache(pci_resource_start(pdev, 2),
3742                                mailbox == ZE_V1 ? CyPCI_Ze_win : CyPCI_Zwin);
3743                if (addr2 == NULL) {
3744                        dev_err(&pdev->dev, "can't remap base region\n");
3745                        goto err_unmap;
3746                }
3747
3748                if (mailbox == ZE_V1) {
3749                        card_name = "Cyclades-Ze";
3750                } else {
3751                        card_name = "Cyclades-8Zo";
3752#ifdef CY_PCI_DEBUG
3753                        if (mailbox == ZO_V1) {
3754                                cy_writel(&ctl_addr->loc_addr_base, WIN_CREG);
3755                                dev_info(&pdev->dev, "Cyclades-8Zo/PCI: FPGA "
3756                                        "id %lx, ver %lx\n", (ulong)(0xff &
3757                                        readl(&((struct CUSTOM_REG *)addr2)->
3758                                                fpga_id)), (ulong)(0xff &
3759                                        readl(&((struct CUSTOM_REG *)addr2)->
3760                                                fpga_version)));
3761                                cy_writel(&ctl_addr->loc_addr_base, WIN_RAM);
3762                        } else {
3763                                dev_info(&pdev->dev, "Cyclades-Z/PCI: New "
3764                                        "Cyclades-Z board.  FPGA not loaded\n");
3765                        }
3766#endif
3767                        /* The following clears the firmware id word.  This
3768                           ensures that the driver will not attempt to talk to
3769                           the board until it has been properly initialized.
3770                         */
3771                        if ((mailbox == ZO_V1) || (mailbox == ZO_V2))
3772                                cy_writel(addr2 + ID_ADDRESS, 0L);
3773                }
3774
3775                retval = cyz_load_fw(pdev, addr2, addr0, irq);
3776                if (retval <= 0)
3777                        goto err_unmap;
3778                nchan = retval;
3779        }
3780
3781        if ((cy_next_channel + nchan) > NR_PORTS) {
3782                dev_err(&pdev->dev, "Cyclades-8Zo/PCI found, but no "
3783                        "channels are available. Change NR_PORTS in "
3784                        "cyclades.c and recompile kernel.\n");
3785                goto err_unmap;
3786        }
3787        /* fill the next cy_card structure available */
3788        for (card_no = 0; card_no < NR_CARDS; card_no++) {
3789                card = &cy_card[card_no];
3790                if (card->base_addr == NULL)
3791                        break;
3792        }
3793        if (card_no == NR_CARDS) {      /* no more cy_cards available */
3794                dev_err(&pdev->dev, "Cyclades-8Zo/PCI found, but no "
3795                        "more cards can be used. Change NR_CARDS in "
3796                        "cyclades.c and recompile kernel.\n");
3797                goto err_unmap;
3798        }
3799
3800        if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
3801                        device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
3802                /* allocate IRQ */
3803                retval = request_irq(irq, cyy_interrupt,
3804                                IRQF_SHARED, "Cyclom-Y", card);
3805                if (retval) {
3806                        dev_err(&pdev->dev, "could not allocate IRQ\n");
3807                        goto err_unmap;
3808                }
3809                card->num_chips = nchan / CyPORTS_PER_CHIP;
3810        } else {
3811                struct FIRM_ID __iomem *firm_id = addr2 + ID_ADDRESS;
3812                struct ZFW_CTRL __iomem *zfw_ctrl;
3813
3814                zfw_ctrl = addr2 + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
3815
3816                card->hw_ver = mailbox;
3817                card->num_chips = (unsigned int)-1;
3818                card->board_ctrl = &zfw_ctrl->board_ctrl;
3819#ifdef CONFIG_CYZ_INTR
3820                /* allocate IRQ only if board has an IRQ */
3821                if (irq != 0 && irq != 255) {
3822                        retval = request_irq(irq, cyz_interrupt,
3823                                        IRQF_SHARED, "Cyclades-Z", card);
3824                        if (retval) {
3825                                dev_err(&pdev->dev, "could not allocate IRQ\n");
3826                                goto err_unmap;
3827                        }
3828                }
3829#endif                          /* CONFIG_CYZ_INTR */
3830        }
3831
3832        /* set cy_card */
3833        card->base_addr = addr2;
3834        card->ctl_addr.p9050 = addr0;
3835        card->irq = irq;
3836        card->bus_index = 1;
3837        card->first_line = cy_next_channel;
3838        card->nports = nchan;
3839        retval = cy_init_card(card);
3840        if (retval)
3841                goto err_null;
3842
3843        pci_set_drvdata(pdev, card);
3844
3845        if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
3846                        device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
3847                /* enable interrupts in the PCI interface */
3848                plx_ver = readb(addr2 + CyPLX_VER) & 0x0f;
3849                switch (plx_ver) {
3850                case PLX_9050:
3851                        cy_writeb(addr0 + 0x4c, 0x43);
3852                        break;
3853
3854                case PLX_9060:
3855                case PLX_9080:
3856                default:        /* Old boards, use PLX_9060 */
3857                {
3858                        struct RUNTIME_9060 __iomem *ctl_addr = addr0;
3859                        plx_init(pdev, irq, ctl_addr);
3860                        cy_writew(&ctl_addr->intr_ctrl_stat,
3861                                readw(&ctl_addr->intr_ctrl_stat) | 0x0900);
3862                        break;
3863                }
3864                }
3865        }
3866
3867        dev_info(&pdev->dev, "%s/PCI #%d found: %d channels starting from "
3868                "port %d.\n", card_name, card_no + 1, nchan, cy_next_channel);
3869        for (j = 0, i = cy_next_channel; i < cy_next_channel + nchan; i++, j++)
3870                tty_port_register_device(&card->ports[j].port,
3871                                cy_serial_driver, i, &pdev->dev);
3872        cy_next_channel += nchan;
3873
3874        return 0;
3875err_null:
3876        card->base_addr = NULL;
3877        free_irq(irq, card);
3878err_unmap:
3879        iounmap(addr0);
3880        if (addr2)
3881                iounmap(addr2);
3882err_reg:
3883        pci_release_regions(pdev);
3884err_dis:
3885        pci_disable_device(pdev);
3886err:
3887        return retval;
3888}
3889
3890static void cy_pci_remove(struct pci_dev *pdev)
3891{
3892        struct cyclades_card *cinfo = pci_get_drvdata(pdev);
3893        unsigned int i, channel;
3894
3895        /* non-Z with old PLX */
3896        if (!cy_is_Z(cinfo) && (readb(cinfo->base_addr + CyPLX_VER) & 0x0f) ==
3897                        PLX_9050)
3898                cy_writeb(cinfo->ctl_addr.p9050 + 0x4c, 0);
3899        else
3900#ifndef CONFIG_CYZ_INTR
3901                if (!cy_is_Z(cinfo))
3902#endif
3903                cy_writew(&cinfo->ctl_addr.p9060->intr_ctrl_stat,
3904                        readw(&cinfo->ctl_addr.p9060->intr_ctrl_stat) &
3905                        ~0x0900);
3906
3907        iounmap(cinfo->base_addr);
3908        if (cinfo->ctl_addr.p9050)
3909                iounmap(cinfo->ctl_addr.p9050);
3910        if (cinfo->irq
3911#ifndef CONFIG_CYZ_INTR
3912                && !cy_is_Z(cinfo)
3913#endif /* CONFIG_CYZ_INTR */
3914                )
3915                free_irq(cinfo->irq, cinfo);
3916        pci_release_regions(pdev);
3917
3918        cinfo->base_addr = NULL;
3919        for (channel = 0, i = cinfo->first_line; i < cinfo->first_line +
3920                        cinfo->nports; i++, channel++) {
3921                tty_unregister_device(cy_serial_driver, i);
3922                tty_port_destroy(&cinfo->ports[channel].port);
3923        }
3924        cinfo->nports = 0;
3925        kfree(cinfo->ports);
3926}
3927
3928static struct pci_driver cy_pci_driver = {
3929        .name = "cyclades",
3930        .id_table = cy_pci_dev_id,
3931        .probe = cy_pci_probe,
3932        .remove = cy_pci_remove
3933};
3934#endif
3935
3936static int cyclades_proc_show(struct seq_file *m, void *v)
3937{
3938        struct cyclades_port *info;
3939        unsigned int i, j;
3940        __u32 cur_jifs = jiffies;
3941
3942        seq_puts(m, "Dev TimeOpen   BytesOut  IdleOut    BytesIn   "
3943                        "IdleIn  Overruns  Ldisc\n");
3944
3945        /* Output one line for each known port */
3946        for (i = 0; i < NR_CARDS; i++)
3947                for (j = 0; j < cy_card[i].nports; j++) {
3948                        info = &cy_card[i].ports[j];
3949
3950                        if (info->port.count) {
3951                                /* XXX is the ldisc num worth this? */
3952                                struct tty_struct *tty;
3953                                struct tty_ldisc *ld;
3954                                int num = 0;
3955                                tty = tty_port_tty_get(&info->port);
3956                                if (tty) {
3957                                        ld = tty_ldisc_ref(tty);
3958                                        if (ld) {
3959                                                num = ld->ops->num;
3960                                                tty_ldisc_deref(ld);
3961                                        }
3962                                        tty_kref_put(tty);
3963                                }
3964                                seq_printf(m, "%3d %8lu %10lu %8lu "
3965                                        "%10lu %8lu %9lu %6d\n", info->line,
3966                                        (cur_jifs - info->idle_stats.in_use) /
3967                                        HZ, info->idle_stats.xmit_bytes,
3968                                        (cur_jifs - info->idle_stats.xmit_idle)/
3969                                        HZ, info->idle_stats.recv_bytes,
3970                                        (cur_jifs - info->idle_stats.recv_idle)/
3971                                        HZ, info->idle_stats.overruns,
3972                                        num);
3973                        } else
3974                                seq_printf(m, "%3d %8lu %10lu %8lu "
3975                                        "%10lu %8lu %9lu %6ld\n",
3976                                        info->line, 0L, 0L, 0L, 0L, 0L, 0L, 0L);
3977                }
3978        return 0;
3979}
3980
3981static int cyclades_proc_open(struct inode *inode, struct file *file)
3982{
3983        return single_open(file, cyclades_proc_show, NULL);
3984}
3985
3986static const struct file_operations cyclades_proc_fops = {
3987        .owner          = THIS_MODULE,
3988        .open           = cyclades_proc_open,
3989        .read           = seq_read,
3990        .llseek         = seq_lseek,
3991        .release        = single_release,
3992};
3993
3994/* The serial driver boot-time initialization code!
3995    Hardware I/O ports are mapped to character special devices on a
3996    first found, first allocated manner.  That is, this code searches
3997    for Cyclom cards in the system.  As each is found, it is probed
3998    to discover how many chips (and thus how many ports) are present.
3999    These ports are mapped to the tty ports 32 and upward in monotonic
4000    fashion.  If an 8-port card is replaced with a 16-port card, the
4001    port mapping on a following card will shift.
4002
4003    This approach is different from what is used in the other serial
4004    device driver because the Cyclom is more properly a multiplexer,
4005    not just an aggregation of serial ports on one card.
4006
4007    If there are more cards with more ports than have been
4008    statically allocated above, a warning is printed and the
4009    extra ports are ignored.
4010 */
4011
4012static const struct tty_operations cy_ops = {
4013        .open = cy_open,
4014        .close = cy_close,
4015        .write = cy_write,
4016        .put_char = cy_put_char,
4017        .flush_chars = cy_flush_chars,
4018        .write_room = cy_write_room,
4019        .chars_in_buffer = cy_chars_in_buffer,
4020        .flush_buffer = cy_flush_buffer,
4021        .ioctl = cy_ioctl,
4022        .throttle = cy_throttle,
4023        .unthrottle = cy_unthrottle,
4024        .set_termios = cy_set_termios,
4025        .stop = cy_stop,
4026        .start = cy_start,
4027        .hangup = cy_hangup,
4028        .break_ctl = cy_break,
4029        .wait_until_sent = cy_wait_until_sent,
4030        .tiocmget = cy_tiocmget,
4031        .tiocmset = cy_tiocmset,
4032        .get_icount = cy_get_icount,
4033        .proc_fops = &cyclades_proc_fops,
4034};
4035
4036static int __init cy_init(void)
4037{
4038        unsigned int nboards;
4039        int retval = -ENOMEM;
4040
4041        cy_serial_driver = alloc_tty_driver(NR_PORTS);
4042        if (!cy_serial_driver)
4043                goto err;
4044
4045        printk(KERN_INFO "Cyclades driver " CY_VERSION "\n");
4046
4047        /* Initialize the tty_driver structure */
4048
4049        cy_serial_driver->driver_name = "cyclades";
4050        cy_serial_driver->name = "ttyC";
4051        cy_serial_driver->major = CYCLADES_MAJOR;
4052        cy_serial_driver->minor_start = 0;
4053        cy_serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
4054        cy_serial_driver->subtype = SERIAL_TYPE_NORMAL;
4055        cy_serial_driver->init_termios = tty_std_termios;
4056        cy_serial_driver->init_termios.c_cflag =
4057            B9600 | CS8 | CREAD | HUPCL | CLOCAL;
4058        cy_serial_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
4059        tty_set_operations(cy_serial_driver, &cy_ops);
4060
4061        retval = tty_register_driver(cy_serial_driver);
4062        if (retval) {
4063                printk(KERN_ERR "Couldn't register Cyclades serial driver\n");
4064                goto err_frtty;
4065        }
4066
4067        /* the code below is responsible to find the boards. Each different
4068           type of board has its own detection routine. If a board is found,
4069           the next cy_card structure available is set by the detection
4070           routine. These functions are responsible for checking the
4071           availability of cy_card and cy_port data structures and updating
4072           the cy_next_channel. */
4073
4074        /* look for isa boards */
4075        nboards = cy_detect_isa();
4076
4077#ifdef CONFIG_PCI
4078        /* look for pci boards */
4079        retval = pci_register_driver(&cy_pci_driver);
4080        if (retval && !nboards) {
4081                tty_unregister_driver(cy_serial_driver);
4082                goto err_frtty;
4083        }
4084#endif
4085
4086        return 0;
4087err_frtty:
4088        put_tty_driver(cy_serial_driver);
4089err:
4090        return retval;
4091}                               /* cy_init */
4092
4093static void __exit cy_cleanup_module(void)
4094{
4095        struct cyclades_card *card;
4096        unsigned int i, e1;
4097
4098#ifndef CONFIG_CYZ_INTR
4099        del_timer_sync(&cyz_timerlist);
4100#endif /* CONFIG_CYZ_INTR */
4101
4102        e1 = tty_unregister_driver(cy_serial_driver);
4103        if (e1)
4104                printk(KERN_ERR "failed to unregister Cyclades serial "
4105                                "driver(%d)\n", e1);
4106
4107#ifdef CONFIG_PCI
4108        pci_unregister_driver(&cy_pci_driver);
4109#endif
4110
4111        for (i = 0; i < NR_CARDS; i++) {
4112                card = &cy_card[i];
4113                if (card->base_addr) {
4114                        /* clear interrupt */
4115                        cy_writeb(card->base_addr + Cy_ClrIntr, 0);
4116                        iounmap(card->base_addr);
4117                        if (card->ctl_addr.p9050)
4118                                iounmap(card->ctl_addr.p9050);
4119                        if (card->irq
4120#ifndef CONFIG_CYZ_INTR
4121                                && !cy_is_Z(card)
4122#endif /* CONFIG_CYZ_INTR */
4123                                )
4124                                free_irq(card->irq, card);
4125                        for (e1 = card->first_line; e1 < card->first_line +
4126                                        card->nports; e1++)
4127                                tty_unregister_device(cy_serial_driver, e1);
4128                        kfree(card->ports);
4129                }
4130        }
4131
4132        put_tty_driver(cy_serial_driver);
4133} /* cy_cleanup_module */
4134
4135module_init(cy_init);
4136module_exit(cy_cleanup_module);
4137
4138MODULE_LICENSE("GPL");
4139MODULE_VERSION(CY_VERSION);
4140MODULE_ALIAS_CHARDEV_MAJOR(CYCLADES_MAJOR);
4141MODULE_FIRMWARE("cyzfirm.bin");
4142