Linux Audio

Check our new training course

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