Linux Audio

Check our new training course

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