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