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