Linux Audio

Check our new training course

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