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