3 #undef Z_EXT_CHARS_IN_BUFFER
6 * linux/drivers/char/cyclades.c
8 * This file contains the driver for the Cyclades async multiport
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. */
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. */
43 #define SERIAL_PARANOIA_CHECK
45 #undef CY_DEBUG_THROTTLE
50 #undef CY_DEBUG_WAIT_UNTIL_SENT
51 #undef CY_DEBUG_INTERRUPTS
53 #undef CY_ENABLE_MONITORING
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>
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>
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_send_xchar(struct tty_struct
*tty
, char ch
);
95 #ifndef SERIAL_XMIT_SIZE
96 #define SERIAL_XMIT_SIZE (min(PAGE_SIZE, 4096))
99 #define STD_COM_FLAGS (0)
102 #define ZL_MAX_BLOCKS 16
103 #define DRIVER_VERSION 0x02010203
104 #define RAM_SIZE 0x80000
111 struct zfile_header
{
120 } __attribute__ ((packed
));
122 struct zfile_config
{
127 u32 block_list
[ZL_MAX_BLOCKS
];
128 } __attribute__ ((packed
));
135 } __attribute__ ((packed
));
137 static struct tty_driver
*cy_serial_driver
;
140 /* This is the address lookup table. The driver will probe for
141 Cyclom-Y/ISA boards at all addresses in here. If you want the
142 driver to probe addresses at a different address, add it to
143 this table. If the driver is probing some other board and
144 causing problems, remove the offending address from this table.
147 static unsigned int cy_isa_addresses
[] = {
156 0, 0, 0, 0, 0, 0, 0, 0
159 #define NR_ISA_ADDRS ARRAY_SIZE(cy_isa_addresses)
161 static long maddr
[NR_CARDS
];
162 static int irq
[NR_CARDS
];
164 module_param_array(maddr
, long, NULL
, 0);
165 module_param_array(irq
, int, NULL
, 0);
167 #endif /* CONFIG_ISA */
169 /* This is the per-card data structure containing address, irq, number of
170 channels, etc. This driver supports a maximum of NR_CARDS cards.
172 static struct cyclades_card cy_card
[NR_CARDS
];
174 static int cy_next_channel
; /* next minor available */
177 * This is used to look up the divisor speeds and the timeouts
178 * We're normally limited to 15 distinct baud rates. The extra
179 * are accessed via settings in info->port.flags.
180 * 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
181 * 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
185 static const int baud_table
[] = {
186 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
187 1800, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200, 150000,
191 static const char baud_co_25
[] = { /* 25 MHz clock option table */
192 /* value => 00 01 02 03 04 */
193 /* divide by 8 32 128 512 2048 */
194 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02,
195 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
198 static const char baud_bpr_25
[] = { /* 25 MHz baud rate period table */
199 0x00, 0xf5, 0xa3, 0x6f, 0x5c, 0x51, 0xf5, 0xa3, 0x51, 0xa3,
200 0x6d, 0x51, 0xa3, 0x51, 0xa3, 0x51, 0x36, 0x29, 0x1b, 0x15
203 static const char baud_co_60
[] = { /* 60 MHz clock option table (CD1400 J) */
204 /* value => 00 01 02 03 04 */
205 /* divide by 8 32 128 512 2048 */
206 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03,
207 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
211 static const char baud_bpr_60
[] = { /* 60 MHz baud rate period table (CD1400 J) */
212 0x00, 0x82, 0x21, 0xff, 0xdb, 0xc3, 0x92, 0x62, 0xc3, 0x62,
213 0x41, 0xc3, 0x62, 0xc3, 0x62, 0xc3, 0x82, 0x62, 0x41, 0x32,
217 static const char baud_cor3
[] = { /* receive threshold */
218 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
219 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07,
224 * The Cyclades driver implements HW flow control as any serial driver.
225 * The cyclades_port structure member rflow and the vector rflow_thr
226 * allows us to take advantage of a special feature in the CD1400 to avoid
227 * data loss even when the system interrupt latency is too high. These flags
228 * are to be used only with very special applications. Setting these flags
229 * requires the use of a special cable (DTR and RTS reversed). In the new
230 * CD1400-based boards (rev. 6.00 or later), there is no need for special
234 static const char rflow_thr
[] = { /* rflow threshold */
235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
240 /* The Cyclom-Ye has placed the sequential chips in non-sequential
241 * address order. This look-up table overcomes that problem.
243 static const unsigned int cy_chip_offset
[] = { 0x0000,
253 /* PCI related definitions */
256 static const struct pci_device_id cy_pci_dev_id
[] = {
258 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_Y_Lo
) },
260 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_Y_Hi
) },
262 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_4Y_Lo
) },
264 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_4Y_Hi
) },
266 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_8Y_Lo
) },
268 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_8Y_Hi
) },
270 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_Z_Lo
) },
272 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_Z_Hi
) },
273 { } /* end of table */
275 MODULE_DEVICE_TABLE(pci
, cy_pci_dev_id
);
278 static void cy_start(struct tty_struct
*);
279 static void cy_set_line_char(struct cyclades_port
*, struct tty_struct
*);
280 static int cyz_issue_cmd(struct cyclades_card
*, __u32
, __u8
, __u32
);
282 static unsigned detect_isa_irq(void __iomem
*);
283 #endif /* CONFIG_ISA */
285 #ifndef CONFIG_CYZ_INTR
286 static void cyz_poll(unsigned long);
288 /* The Cyclades-Z polling cycle is defined by this variable */
289 static long cyz_polling_cycle
= CZ_DEF_POLL
;
291 static DEFINE_TIMER(cyz_timerlist
, cyz_poll
, 0, 0);
293 #else /* CONFIG_CYZ_INTR */
294 static void cyz_rx_restart(unsigned long);
295 static struct timer_list cyz_rx_full_timer
[NR_PORTS
];
296 #endif /* CONFIG_CYZ_INTR */
298 static inline void cyy_writeb(struct cyclades_port
*port
, u32 reg
, u8 val
)
300 struct cyclades_card
*card
= port
->card
;
302 cy_writeb(port
->u
.cyy
.base_addr
+ (reg
<< card
->bus_index
), val
);
305 static inline u8
cyy_readb(struct cyclades_port
*port
, u32 reg
)
307 struct cyclades_card
*card
= port
->card
;
309 return readb(port
->u
.cyy
.base_addr
+ (reg
<< card
->bus_index
));
312 static inline bool cy_is_Z(struct cyclades_card
*card
)
314 return card
->num_chips
== (unsigned int)-1;
317 static inline bool __cyz_fpga_loaded(struct RUNTIME_9060 __iomem
*ctl_addr
)
319 return readl(&ctl_addr
->init_ctrl
) & (1 << 17);
322 static inline bool cyz_fpga_loaded(struct cyclades_card
*card
)
324 return __cyz_fpga_loaded(card
->ctl_addr
.p9060
);
327 static inline bool cyz_is_loaded(struct cyclades_card
*card
)
329 struct FIRM_ID __iomem
*fw_id
= card
->base_addr
+ ID_ADDRESS
;
331 return (card
->hw_ver
== ZO_V1
|| cyz_fpga_loaded(card
)) &&
332 readl(&fw_id
->signature
) == ZFIRM_ID
;
335 static inline int serial_paranoia_check(struct cyclades_port
*info
,
336 const char *name
, const char *routine
)
338 #ifdef SERIAL_PARANOIA_CHECK
340 printk(KERN_WARNING
"cyc Warning: null cyclades_port for (%s) "
341 "in %s\n", name
, routine
);
345 if (info
->magic
!= CYCLADES_MAGIC
) {
346 printk(KERN_WARNING
"cyc Warning: bad magic number for serial "
347 "struct (%s) in %s\n", name
, routine
);
354 /***********************************************************/
355 /********* Start of block of Cyclom-Y specific code ********/
357 /* This routine waits up to 1000 micro-seconds for the previous
358 command to the Cirrus chip to complete and then issues the
359 new command. An error is returned if the previous command
360 didn't finish within the time limit.
362 This function is only called from inside spinlock-protected code.
364 static int __cyy_issue_cmd(void __iomem
*base_addr
, u8 cmd
, int index
)
366 void __iomem
*ccr
= base_addr
+ (CyCCR
<< index
);
369 /* Check to see that the previous command has completed */
370 for (i
= 0; i
< 100; i
++) {
375 /* if the CCR never cleared, the previous command
376 didn't finish within the "reasonable time" */
380 /* Issue the new command */
386 static inline int cyy_issue_cmd(struct cyclades_port
*port
, u8 cmd
)
388 return __cyy_issue_cmd(port
->u
.cyy
.base_addr
, cmd
,
389 port
->card
->bus_index
);
393 /* ISA interrupt detection code */
394 static unsigned detect_isa_irq(void __iomem
*address
)
397 unsigned long irqs
, flags
;
398 int save_xir
, save_car
;
399 int index
= 0; /* IRQ probing is only for ISA */
401 /* forget possible initially masked and pending IRQ */
402 irq
= probe_irq_off(probe_irq_on());
404 /* Clear interrupts on the board first */
405 cy_writeb(address
+ (Cy_ClrIntr
<< index
), 0);
406 /* Cy_ClrIntr is 0x1800 */
408 irqs
= probe_irq_on();
412 /* Enable the Tx interrupts on the CD1400 */
413 local_irq_save(flags
);
414 cy_writeb(address
+ (CyCAR
<< index
), 0);
415 __cyy_issue_cmd(address
, CyCHAN_CTL
| CyENB_XMTR
, index
);
417 cy_writeb(address
+ (CyCAR
<< index
), 0);
418 cy_writeb(address
+ (CySRER
<< index
),
419 readb(address
+ (CySRER
<< index
)) | CyTxRdy
);
420 local_irq_restore(flags
);
425 /* Check which interrupt is in use */
426 irq
= probe_irq_off(irqs
);
429 save_xir
= (u_char
) readb(address
+ (CyTIR
<< index
));
430 save_car
= readb(address
+ (CyCAR
<< index
));
431 cy_writeb(address
+ (CyCAR
<< index
), (save_xir
& 0x3));
432 cy_writeb(address
+ (CySRER
<< index
),
433 readb(address
+ (CySRER
<< index
)) & ~CyTxRdy
);
434 cy_writeb(address
+ (CyTIR
<< index
), (save_xir
& 0x3f));
435 cy_writeb(address
+ (CyCAR
<< index
), (save_car
));
436 cy_writeb(address
+ (Cy_ClrIntr
<< index
), 0);
437 /* Cy_ClrIntr is 0x1800 */
439 return (irq
> 0) ? irq
: 0;
441 #endif /* CONFIG_ISA */
443 static void cyy_chip_rx(struct cyclades_card
*cinfo
, int chip
,
444 void __iomem
*base_addr
)
446 struct cyclades_port
*info
;
447 struct tty_struct
*tty
;
448 int len
, index
= cinfo
->bus_index
;
449 u8 ivr
, save_xir
, channel
, save_car
, data
, char_count
;
451 #ifdef CY_DEBUG_INTERRUPTS
452 printk(KERN_DEBUG
"cyy_interrupt: rcvd intr, chip %d\n", chip
);
454 /* determine the channel & change to that context */
455 save_xir
= readb(base_addr
+ (CyRIR
<< index
));
456 channel
= save_xir
& CyIRChannel
;
457 info
= &cinfo
->ports
[channel
+ chip
* 4];
458 save_car
= cyy_readb(info
, CyCAR
);
459 cyy_writeb(info
, CyCAR
, save_xir
);
460 ivr
= cyy_readb(info
, CyRIVR
) & CyIVRMask
;
462 tty
= tty_port_tty_get(&info
->port
);
463 /* if there is nowhere to put the data, discard it */
465 if (ivr
== CyIVRRxEx
) { /* exception */
466 data
= cyy_readb(info
, CyRDSR
);
467 } else { /* normal character reception */
468 char_count
= cyy_readb(info
, CyRDCR
);
470 data
= cyy_readb(info
, CyRDSR
);
474 /* there is an open port for this data */
475 if (ivr
== CyIVRRxEx
) { /* exception */
476 data
= cyy_readb(info
, CyRDSR
);
478 /* For statistics only */
481 else if (data
& CyFRAME
)
482 info
->icount
.frame
++;
483 else if (data
& CyPARITY
)
484 info
->icount
.parity
++;
485 else if (data
& CyOVERRUN
)
486 info
->icount
.overrun
++;
488 if (data
& info
->ignore_status_mask
) {
493 if (tty_buffer_request_room(tty
, 1)) {
494 if (data
& info
->read_status_mask
) {
495 if (data
& CyBREAK
) {
496 tty_insert_flip_char(tty
,
497 cyy_readb(info
, CyRDSR
),
500 if (info
->port
.flags
& ASYNC_SAK
)
502 } else if (data
& CyFRAME
) {
503 tty_insert_flip_char(tty
,
504 cyy_readb(info
, CyRDSR
),
507 info
->idle_stats
.frame_errs
++;
508 } else if (data
& CyPARITY
) {
509 /* Pieces of seven... */
510 tty_insert_flip_char(tty
,
511 cyy_readb(info
, CyRDSR
),
514 info
->idle_stats
.parity_errs
++;
515 } else if (data
& CyOVERRUN
) {
516 tty_insert_flip_char(tty
, 0,
519 /* If the flip buffer itself is
520 overflowing, we still lose
521 the next incoming character.
523 tty_insert_flip_char(tty
,
524 cyy_readb(info
, CyRDSR
),
527 info
->idle_stats
.overruns
++;
528 /* These two conditions may imply */
529 /* a normal read should be done. */
530 /* } else if(data & CyTIMEOUT) { */
531 /* } else if(data & CySPECHAR) { */
533 tty_insert_flip_char(tty
, 0,
538 tty_insert_flip_char(tty
, 0, TTY_NORMAL
);
542 /* there was a software buffer overrun and nothing
543 * could be done about it!!! */
544 info
->icount
.buf_overrun
++;
545 info
->idle_stats
.overruns
++;
547 } else { /* normal character reception */
548 /* load # chars available from the chip */
549 char_count
= cyy_readb(info
, CyRDCR
);
551 #ifdef CY_ENABLE_MONITORING
552 ++info
->mon
.int_count
;
553 info
->mon
.char_count
+= char_count
;
554 if (char_count
> info
->mon
.char_max
)
555 info
->mon
.char_max
= char_count
;
556 info
->mon
.char_last
= char_count
;
558 len
= tty_buffer_request_room(tty
, char_count
);
560 data
= cyy_readb(info
, CyRDSR
);
561 tty_insert_flip_char(tty
, data
, TTY_NORMAL
);
562 info
->idle_stats
.recv_bytes
++;
568 info
->idle_stats
.recv_idle
= jiffies
;
570 tty_schedule_flip(tty
);
574 cyy_writeb(info
, CyRIR
, save_xir
& 0x3f);
575 cyy_writeb(info
, CyCAR
, save_car
);
578 static void cyy_chip_tx(struct cyclades_card
*cinfo
, unsigned int chip
,
579 void __iomem
*base_addr
)
581 struct cyclades_port
*info
;
582 struct tty_struct
*tty
;
583 int char_count
, index
= cinfo
->bus_index
;
584 u8 save_xir
, channel
, save_car
, outch
;
586 /* Since we only get here when the transmit buffer
587 is empty, we know we can always stuff a dozen
589 #ifdef CY_DEBUG_INTERRUPTS
590 printk(KERN_DEBUG
"cyy_interrupt: xmit intr, chip %d\n", chip
);
593 /* determine the channel & change to that context */
594 save_xir
= readb(base_addr
+ (CyTIR
<< index
));
595 channel
= save_xir
& CyIRChannel
;
596 save_car
= readb(base_addr
+ (CyCAR
<< index
));
597 cy_writeb(base_addr
+ (CyCAR
<< index
), save_xir
);
599 /* validate the port# (as configured and open) */
600 if (channel
+ chip
* 4 >= cinfo
->nports
) {
601 cy_writeb(base_addr
+ (CySRER
<< index
),
602 readb(base_addr
+ (CySRER
<< index
)) & ~CyTxRdy
);
605 info
= &cinfo
->ports
[channel
+ chip
* 4];
606 tty
= tty_port_tty_get(&info
->port
);
608 cyy_writeb(info
, CySRER
, cyy_readb(info
, CySRER
) & ~CyTxRdy
);
612 /* load the on-chip space for outbound data */
613 char_count
= info
->xmit_fifo_size
;
615 if (info
->x_char
) { /* send special char */
616 outch
= info
->x_char
;
617 cyy_writeb(info
, CyTDR
, outch
);
623 if (info
->breakon
|| info
->breakoff
) {
625 cyy_writeb(info
, CyTDR
, 0);
626 cyy_writeb(info
, CyTDR
, 0x81);
630 if (info
->breakoff
) {
631 cyy_writeb(info
, CyTDR
, 0);
632 cyy_writeb(info
, CyTDR
, 0x83);
638 while (char_count
-- > 0) {
639 if (!info
->xmit_cnt
) {
640 if (cyy_readb(info
, CySRER
) & CyTxMpty
) {
641 cyy_writeb(info
, CySRER
,
642 cyy_readb(info
, CySRER
) & ~CyTxMpty
);
644 cyy_writeb(info
, CySRER
, CyTxMpty
|
645 (cyy_readb(info
, CySRER
) & ~CyTxRdy
));
649 if (info
->port
.xmit_buf
== NULL
) {
650 cyy_writeb(info
, CySRER
,
651 cyy_readb(info
, CySRER
) & ~CyTxRdy
);
654 if (tty
->stopped
|| tty
->hw_stopped
) {
655 cyy_writeb(info
, CySRER
,
656 cyy_readb(info
, CySRER
) & ~CyTxRdy
);
659 /* Because the Embedded Transmit Commands have been enabled,
660 * we must check to see if the escape character, NULL, is being
661 * sent. If it is, we must ensure that there is room for it to
662 * be doubled in the output stream. Therefore we no longer
663 * advance the pointer when the character is fetched, but
664 * rather wait until after the check for a NULL output
665 * character. This is necessary because there may not be room
666 * for the two chars needed to send a NULL.)
668 outch
= info
->port
.xmit_buf
[info
->xmit_tail
];
671 info
->xmit_tail
= (info
->xmit_tail
+ 1) &
672 (SERIAL_XMIT_SIZE
- 1);
673 cyy_writeb(info
, CyTDR
, outch
);
676 if (char_count
> 1) {
678 info
->xmit_tail
= (info
->xmit_tail
+ 1) &
679 (SERIAL_XMIT_SIZE
- 1);
680 cyy_writeb(info
, CyTDR
, outch
);
681 cyy_writeb(info
, CyTDR
, 0);
693 cyy_writeb(info
, CyTIR
, save_xir
& 0x3f);
694 cyy_writeb(info
, CyCAR
, save_car
);
697 static void cyy_chip_modem(struct cyclades_card
*cinfo
, int chip
,
698 void __iomem
*base_addr
)
700 struct cyclades_port
*info
;
701 struct tty_struct
*tty
;
702 int index
= cinfo
->bus_index
;
703 u8 save_xir
, channel
, save_car
, mdm_change
, mdm_status
;
705 /* determine the channel & change to that context */
706 save_xir
= readb(base_addr
+ (CyMIR
<< index
));
707 channel
= save_xir
& CyIRChannel
;
708 info
= &cinfo
->ports
[channel
+ chip
* 4];
709 save_car
= cyy_readb(info
, CyCAR
);
710 cyy_writeb(info
, CyCAR
, save_xir
);
712 mdm_change
= cyy_readb(info
, CyMISR
);
713 mdm_status
= cyy_readb(info
, CyMSVR1
);
715 tty
= tty_port_tty_get(&info
->port
);
719 if (mdm_change
& CyANY_DELTA
) {
720 /* For statistics only */
721 if (mdm_change
& CyDCD
)
723 if (mdm_change
& CyCTS
)
725 if (mdm_change
& CyDSR
)
727 if (mdm_change
& CyRI
)
730 wake_up_interruptible(&info
->port
.delta_msr_wait
);
733 if ((mdm_change
& CyDCD
) && (info
->port
.flags
& ASYNC_CHECK_CD
)) {
734 if (mdm_status
& CyDCD
)
735 wake_up_interruptible(&info
->port
.open_wait
);
739 if ((mdm_change
& CyCTS
) && (info
->port
.flags
& ASYNC_CTS_FLOW
)) {
740 if (tty
->hw_stopped
) {
741 if (mdm_status
& CyCTS
) {
742 /* cy_start isn't used
745 cyy_writeb(info
, CySRER
,
746 cyy_readb(info
, CySRER
) | CyTxRdy
);
750 if (!(mdm_status
& CyCTS
)) {
751 /* cy_stop isn't used
754 cyy_writeb(info
, CySRER
,
755 cyy_readb(info
, CySRER
) & ~CyTxRdy
);
759 /* if (mdm_change & CyDSR) {
761 if (mdm_change & CyRI) {
766 cyy_writeb(info
, CyMIR
, save_xir
& 0x3f);
767 cyy_writeb(info
, CyCAR
, save_car
);
770 /* The real interrupt service routine is called
771 whenever the card wants its hand held--chars
772 received, out buffer empty, modem change, etc.
774 static irqreturn_t
cyy_interrupt(int irq
, void *dev_id
)
777 struct cyclades_card
*cinfo
= dev_id
;
778 void __iomem
*base_addr
, *card_base_addr
;
779 unsigned int chip
, too_many
, had_work
;
782 if (unlikely(cinfo
== NULL
)) {
783 #ifdef CY_DEBUG_INTERRUPTS
784 printk(KERN_DEBUG
"cyy_interrupt: spurious interrupt %d\n",
787 return IRQ_NONE
; /* spurious interrupt */
790 card_base_addr
= cinfo
->base_addr
;
791 index
= cinfo
->bus_index
;
793 /* card was not initialized yet (e.g. DEBUG_SHIRQ) */
794 if (unlikely(card_base_addr
== NULL
))
797 /* This loop checks all chips in the card. Make a note whenever
798 _any_ chip had some work to do, as this is considered an
799 indication that there will be more to do. Only when no chip
800 has any work does this outermost loop exit.
804 for (chip
= 0; chip
< cinfo
->num_chips
; chip
++) {
805 base_addr
= cinfo
->base_addr
+
806 (cy_chip_offset
[chip
] << index
);
808 while ((status
= readb(base_addr
+
809 (CySVRR
<< index
))) != 0x00) {
811 /* The purpose of the following test is to ensure that
812 no chip can monopolize the driver. This forces the
813 chips to be checked in a round-robin fashion (after
814 draining each of a bunch (1000) of characters).
816 if (1000 < too_many
++)
818 spin_lock(&cinfo
->card_lock
);
819 if (status
& CySRReceive
) /* rx intr */
820 cyy_chip_rx(cinfo
, chip
, base_addr
);
821 if (status
& CySRTransmit
) /* tx intr */
822 cyy_chip_tx(cinfo
, chip
, base_addr
);
823 if (status
& CySRModem
) /* modem intr */
824 cyy_chip_modem(cinfo
, chip
, base_addr
);
825 spin_unlock(&cinfo
->card_lock
);
830 /* clear interrupts */
831 spin_lock(&cinfo
->card_lock
);
832 cy_writeb(card_base_addr
+ (Cy_ClrIntr
<< index
), 0);
833 /* Cy_ClrIntr is 0x1800 */
834 spin_unlock(&cinfo
->card_lock
);
836 } /* cyy_interrupt */
838 static void cyy_change_rts_dtr(struct cyclades_port
*info
, unsigned int set
,
841 struct cyclades_card
*card
= info
->card
;
842 int channel
= info
->line
- card
->first_line
;
843 u32 rts
, dtr
, msvrr
, msvrd
;
847 if (info
->rtsdtr_inv
) {
858 if (set
& TIOCM_RTS
) {
859 cyy_writeb(info
, CyCAR
, channel
);
860 cyy_writeb(info
, msvrr
, rts
);
862 if (clear
& TIOCM_RTS
) {
863 cyy_writeb(info
, CyCAR
, channel
);
864 cyy_writeb(info
, msvrr
, ~rts
);
866 if (set
& TIOCM_DTR
) {
867 cyy_writeb(info
, CyCAR
, channel
);
868 cyy_writeb(info
, msvrd
, dtr
);
870 printk(KERN_DEBUG
"cyc:set_modem_info raising DTR\n");
871 printk(KERN_DEBUG
" status: 0x%x, 0x%x\n",
872 cyy_readb(info
, CyMSVR1
),
873 cyy_readb(info
, CyMSVR2
));
876 if (clear
& TIOCM_DTR
) {
877 cyy_writeb(info
, CyCAR
, channel
);
878 cyy_writeb(info
, msvrd
, ~dtr
);
880 printk(KERN_DEBUG
"cyc:set_modem_info dropping DTR\n");
881 printk(KERN_DEBUG
" status: 0x%x, 0x%x\n",
882 cyy_readb(info
, CyMSVR1
),
883 cyy_readb(info
, CyMSVR2
));
888 /***********************************************************/
889 /********* End of block of Cyclom-Y specific code **********/
890 /******** Start of block of Cyclades-Z specific code *******/
891 /***********************************************************/
894 cyz_fetch_msg(struct cyclades_card
*cinfo
,
895 __u32
*channel
, __u8
*cmd
, __u32
*param
)
897 struct BOARD_CTRL __iomem
*board_ctrl
= cinfo
->board_ctrl
;
898 unsigned long loc_doorbell
;
900 loc_doorbell
= readl(&cinfo
->ctl_addr
.p9060
->loc_doorbell
);
902 *cmd
= (char)(0xff & loc_doorbell
);
903 *channel
= readl(&board_ctrl
->fwcmd_channel
);
904 *param
= (__u32
) readl(&board_ctrl
->fwcmd_param
);
905 cy_writel(&cinfo
->ctl_addr
.p9060
->loc_doorbell
, 0xffffffff);
909 } /* cyz_fetch_msg */
912 cyz_issue_cmd(struct cyclades_card
*cinfo
,
913 __u32 channel
, __u8 cmd
, __u32 param
)
915 struct BOARD_CTRL __iomem
*board_ctrl
= cinfo
->board_ctrl
;
916 __u32 __iomem
*pci_doorbell
;
919 if (!cyz_is_loaded(cinfo
))
923 pci_doorbell
= &cinfo
->ctl_addr
.p9060
->pci_doorbell
;
924 while ((readl(pci_doorbell
) & 0xff) != 0) {
926 return (int)(readl(pci_doorbell
) & 0xff);
929 cy_writel(&board_ctrl
->hcmd_channel
, channel
);
930 cy_writel(&board_ctrl
->hcmd_param
, param
);
931 cy_writel(pci_doorbell
, (long)cmd
);
934 } /* cyz_issue_cmd */
936 static void cyz_handle_rx(struct cyclades_port
*info
, struct tty_struct
*tty
)
938 struct BUF_CTRL __iomem
*buf_ctrl
= info
->u
.cyz
.buf_ctrl
;
939 struct cyclades_card
*cinfo
= info
->card
;
940 unsigned int char_count
;
947 __u32 rx_put
, rx_get
, new_rx_get
, rx_bufsize
, rx_bufaddr
;
949 rx_get
= new_rx_get
= readl(&buf_ctrl
->rx_get
);
950 rx_put
= readl(&buf_ctrl
->rx_put
);
951 rx_bufsize
= readl(&buf_ctrl
->rx_bufsize
);
952 rx_bufaddr
= readl(&buf_ctrl
->rx_bufaddr
);
953 if (rx_put
>= rx_get
)
954 char_count
= rx_put
- rx_get
;
956 char_count
= rx_put
- rx_get
+ rx_bufsize
;
959 #ifdef CY_ENABLE_MONITORING
960 info
->mon
.int_count
++;
961 info
->mon
.char_count
+= char_count
;
962 if (char_count
> info
->mon
.char_max
)
963 info
->mon
.char_max
= char_count
;
964 info
->mon
.char_last
= char_count
;
967 /* flush received characters */
968 new_rx_get
= (new_rx_get
+ char_count
) &
970 info
->rflush_count
++;
973 /* we'd like to use memcpy(t, f, n) and memset(s, c, count)
974 for performance, but because of buffer boundaries, there
975 may be several steps to the operation */
977 len
= tty_prepare_flip_string(tty
, &buf
,
982 len
= min_t(unsigned int, min(len
, char_count
),
983 rx_bufsize
- new_rx_get
);
985 memcpy_fromio(buf
, cinfo
->base_addr
+
986 rx_bufaddr
+ new_rx_get
, len
);
988 new_rx_get
= (new_rx_get
+ len
) &
991 info
->icount
.rx
+= len
;
992 info
->idle_stats
.recv_bytes
+= len
;
995 len
= tty_buffer_request_room(tty
, char_count
);
997 data
= readb(cinfo
->base_addr
+ rx_bufaddr
+
999 new_rx_get
= (new_rx_get
+ 1) &
1001 tty_insert_flip_char(tty
, data
, TTY_NORMAL
);
1002 info
->idle_stats
.recv_bytes
++;
1006 #ifdef CONFIG_CYZ_INTR
1007 /* Recalculate the number of chars in the RX buffer and issue
1008 a cmd in case it's higher than the RX high water mark */
1009 rx_put
= readl(&buf_ctrl
->rx_put
);
1010 if (rx_put
>= rx_get
)
1011 char_count
= rx_put
- rx_get
;
1013 char_count
= rx_put
- rx_get
+ rx_bufsize
;
1014 if (char_count
>= readl(&buf_ctrl
->rx_threshold
) &&
1015 !timer_pending(&cyz_rx_full_timer
[
1017 mod_timer(&cyz_rx_full_timer
[info
->line
],
1020 info
->idle_stats
.recv_idle
= jiffies
;
1021 tty_schedule_flip(tty
);
1024 cy_writel(&buf_ctrl
->rx_get
, new_rx_get
);
1028 static void cyz_handle_tx(struct cyclades_port
*info
, struct tty_struct
*tty
)
1030 struct BUF_CTRL __iomem
*buf_ctrl
= info
->u
.cyz
.buf_ctrl
;
1031 struct cyclades_card
*cinfo
= info
->card
;
1033 unsigned int char_count
;
1037 __u32 tx_put
, tx_get
, tx_bufsize
, tx_bufaddr
;
1039 if (info
->xmit_cnt
<= 0) /* Nothing to transmit */
1042 tx_get
= readl(&buf_ctrl
->tx_get
);
1043 tx_put
= readl(&buf_ctrl
->tx_put
);
1044 tx_bufsize
= readl(&buf_ctrl
->tx_bufsize
);
1045 tx_bufaddr
= readl(&buf_ctrl
->tx_bufaddr
);
1046 if (tx_put
>= tx_get
)
1047 char_count
= tx_get
- tx_put
- 1 + tx_bufsize
;
1049 char_count
= tx_get
- tx_put
- 1;
1056 if (info
->x_char
) { /* send special char */
1057 data
= info
->x_char
;
1059 cy_writeb(cinfo
->base_addr
+ tx_bufaddr
+ tx_put
, data
);
1060 tx_put
= (tx_put
+ 1) & (tx_bufsize
- 1);
1066 while (0 < (small_count
= min_t(unsigned int,
1067 tx_bufsize
- tx_put
, min_t(unsigned int,
1068 (SERIAL_XMIT_SIZE
- info
->xmit_tail
),
1069 min_t(unsigned int, info
->xmit_cnt
,
1072 memcpy_toio((char *)(cinfo
->base_addr
+ tx_bufaddr
+
1074 &info
->port
.xmit_buf
[info
->xmit_tail
],
1077 tx_put
= (tx_put
+ small_count
) & (tx_bufsize
- 1);
1078 char_count
-= small_count
;
1079 info
->icount
.tx
+= small_count
;
1080 info
->xmit_cnt
-= small_count
;
1081 info
->xmit_tail
= (info
->xmit_tail
+ small_count
) &
1082 (SERIAL_XMIT_SIZE
- 1);
1085 while (info
->xmit_cnt
&& char_count
) {
1086 data
= info
->port
.xmit_buf
[info
->xmit_tail
];
1088 info
->xmit_tail
= (info
->xmit_tail
+ 1) &
1089 (SERIAL_XMIT_SIZE
- 1);
1091 cy_writeb(cinfo
->base_addr
+ tx_bufaddr
+ tx_put
, data
);
1092 tx_put
= (tx_put
+ 1) & (tx_bufsize
- 1);
1100 cy_writel(&buf_ctrl
->tx_put
, tx_put
);
1104 static void cyz_handle_cmd(struct cyclades_card
*cinfo
)
1106 struct BOARD_CTRL __iomem
*board_ctrl
= cinfo
->board_ctrl
;
1107 struct tty_struct
*tty
;
1108 struct cyclades_port
*info
;
1109 __u32 channel
, param
, fw_ver
;
1114 fw_ver
= readl(&board_ctrl
->fw_version
);
1116 while (cyz_fetch_msg(cinfo
, &channel
, &cmd
, ¶m
) == 1) {
1119 info
= &cinfo
->ports
[channel
];
1120 tty
= tty_port_tty_get(&info
->port
);
1126 tty_insert_flip_char(tty
, 0, TTY_PARITY
);
1131 tty_insert_flip_char(tty
, 0, TTY_FRAME
);
1136 tty_insert_flip_char(tty
, 0, TTY_BREAK
);
1143 if (info
->port
.flags
& ASYNC_CHECK_CD
) {
1144 u32 dcd
= fw_ver
> 241 ? param
:
1145 readl(&info
->u
.cyz
.ch_ctrl
->rs_status
);
1147 wake_up_interruptible(&info
->port
.open_wait
);
1166 complete(&info
->shutdown_wait
);
1169 #ifdef CONFIG_CYZ_INTR
1173 /* Reception Interrupt */
1174 #ifdef CY_DEBUG_INTERRUPTS
1175 printk(KERN_DEBUG
"cyz_interrupt: rcvd intr, card %d, "
1176 "port %ld\n", info
->card
, channel
);
1178 cyz_handle_rx(info
, tty
);
1183 /* Transmission Interrupt */
1184 #ifdef CY_DEBUG_INTERRUPTS
1185 printk(KERN_DEBUG
"cyz_interrupt: xmit intr, card %d, "
1186 "port %ld\n", info
->card
, channel
);
1188 cyz_handle_tx(info
, tty
);
1190 #endif /* CONFIG_CYZ_INTR */
1192 /* should do something with this !!! */
1198 wake_up_interruptible(&info
->port
.delta_msr_wait
);
1200 tty_schedule_flip(tty
);
1205 #ifdef CONFIG_CYZ_INTR
1206 static irqreturn_t
cyz_interrupt(int irq
, void *dev_id
)
1208 struct cyclades_card
*cinfo
= dev_id
;
1210 if (unlikely(!cyz_is_loaded(cinfo
))) {
1211 #ifdef CY_DEBUG_INTERRUPTS
1212 printk(KERN_DEBUG
"cyz_interrupt: board not yet loaded "
1218 /* Handle the interrupts */
1219 cyz_handle_cmd(cinfo
);
1222 } /* cyz_interrupt */
1224 static void cyz_rx_restart(unsigned long arg
)
1226 struct cyclades_port
*info
= (struct cyclades_port
*)arg
;
1227 struct cyclades_card
*card
= info
->card
;
1229 __u32 channel
= info
->line
- card
->first_line
;
1230 unsigned long flags
;
1232 spin_lock_irqsave(&card
->card_lock
, flags
);
1233 retval
= cyz_issue_cmd(card
, channel
, C_CM_INTBACK2
, 0L);
1235 printk(KERN_ERR
"cyc:cyz_rx_restart retval on ttyC%d was %x\n",
1236 info
->line
, retval
);
1238 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1241 #else /* CONFIG_CYZ_INTR */
1243 static void cyz_poll(unsigned long arg
)
1245 struct cyclades_card
*cinfo
;
1246 struct cyclades_port
*info
;
1247 unsigned long expires
= jiffies
+ HZ
;
1248 unsigned int port
, card
;
1250 for (card
= 0; card
< NR_CARDS
; card
++) {
1251 cinfo
= &cy_card
[card
];
1253 if (!cy_is_Z(cinfo
))
1255 if (!cyz_is_loaded(cinfo
))
1258 /* Skip first polling cycle to avoid racing conditions with the FW */
1259 if (!cinfo
->intr_enabled
) {
1260 cinfo
->intr_enabled
= 1;
1264 cyz_handle_cmd(cinfo
);
1266 for (port
= 0; port
< cinfo
->nports
; port
++) {
1267 struct tty_struct
*tty
;
1269 info
= &cinfo
->ports
[port
];
1270 tty
= tty_port_tty_get(&info
->port
);
1271 /* OK to pass NULL to the handle functions below.
1272 They need to drop the data in that case. */
1274 if (!info
->throttle
)
1275 cyz_handle_rx(info
, tty
);
1276 cyz_handle_tx(info
, tty
);
1279 /* poll every 'cyz_polling_cycle' period */
1280 expires
= jiffies
+ cyz_polling_cycle
;
1282 mod_timer(&cyz_timerlist
, expires
);
1285 #endif /* CONFIG_CYZ_INTR */
1287 /********** End of block of Cyclades-Z specific code *********/
1288 /***********************************************************/
1290 /* This is called whenever a port becomes active;
1291 interrupts are enabled and DTR & RTS are turned on.
1293 static int cy_startup(struct cyclades_port
*info
, struct tty_struct
*tty
)
1295 struct cyclades_card
*card
;
1296 unsigned long flags
;
1302 channel
= info
->line
- card
->first_line
;
1304 page
= get_zeroed_page(GFP_KERNEL
);
1308 spin_lock_irqsave(&card
->card_lock
, flags
);
1310 if (info
->port
.flags
& ASYNC_INITIALIZED
)
1314 set_bit(TTY_IO_ERROR
, &tty
->flags
);
1318 if (info
->port
.xmit_buf
)
1321 info
->port
.xmit_buf
= (unsigned char *)page
;
1323 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1325 cy_set_line_char(info
, tty
);
1327 if (!cy_is_Z(card
)) {
1330 spin_lock_irqsave(&card
->card_lock
, flags
);
1332 cyy_writeb(info
, CyCAR
, channel
);
1334 cyy_writeb(info
, CyRTPR
,
1335 (info
->default_timeout
? info
->default_timeout
: 0x02));
1336 /* 10ms rx timeout */
1338 cyy_issue_cmd(info
, CyCHAN_CTL
| CyENB_RCVR
| CyENB_XMTR
);
1340 cyy_change_rts_dtr(info
, TIOCM_RTS
| TIOCM_DTR
, 0);
1342 cyy_writeb(info
, CySRER
, cyy_readb(info
, CySRER
) | CyRxData
);
1344 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
1346 if (!cyz_is_loaded(card
))
1349 #ifdef CY_DEBUG_OPEN
1350 printk(KERN_DEBUG
"cyc startup Z card %d, channel %d, "
1351 "base_addr %p\n", card
, channel
, card
->base_addr
);
1353 spin_lock_irqsave(&card
->card_lock
, flags
);
1355 cy_writel(&ch_ctrl
->op_mode
, C_CH_ENABLE
);
1357 #ifdef CONFIG_CYZ_INTR
1358 cy_writel(&ch_ctrl
->intr_enable
,
1359 C_IN_TXBEMPTY
| C_IN_TXLOWWM
| C_IN_RXHIWM
|
1360 C_IN_RXNNDT
| C_IN_IOCTLW
| C_IN_MDCD
);
1362 cy_writel(&ch_ctrl
->intr_enable
,
1363 C_IN_IOCTLW
| C_IN_MDCD
);
1364 #endif /* CONFIG_CYZ_INTR */
1366 #ifdef CONFIG_CYZ_INTR
1367 cy_writel(&ch_ctrl
->intr_enable
,
1368 C_IN_TXBEMPTY
| C_IN_TXLOWWM
| C_IN_RXHIWM
|
1369 C_IN_RXNNDT
| C_IN_MDCD
);
1371 cy_writel(&ch_ctrl
->intr_enable
, C_IN_MDCD
);
1372 #endif /* CONFIG_CYZ_INTR */
1375 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTL
, 0L);
1377 printk(KERN_ERR
"cyc:startup(1) retval on ttyC%d was "
1378 "%x\n", info
->line
, retval
);
1381 /* Flush RX buffers before raising DTR and RTS */
1382 retval
= cyz_issue_cmd(card
, channel
, C_CM_FLUSH_RX
, 0L);
1384 printk(KERN_ERR
"cyc:startup(2) retval on ttyC%d was "
1385 "%x\n", info
->line
, retval
);
1388 /* set timeout !!! */
1389 /* set RTS and DTR !!! */
1390 tty_port_raise_dtr_rts(&info
->port
);
1392 /* enable send, recv, modem !!! */
1395 info
->port
.flags
|= ASYNC_INITIALIZED
;
1397 clear_bit(TTY_IO_ERROR
, &tty
->flags
);
1398 info
->xmit_cnt
= info
->xmit_head
= info
->xmit_tail
= 0;
1399 info
->breakon
= info
->breakoff
= 0;
1400 memset((char *)&info
->idle_stats
, 0, sizeof(info
->idle_stats
));
1401 info
->idle_stats
.in_use
=
1402 info
->idle_stats
.recv_idle
=
1403 info
->idle_stats
.xmit_idle
= jiffies
;
1405 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1407 #ifdef CY_DEBUG_OPEN
1408 printk(KERN_DEBUG
"cyc startup done\n");
1413 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1418 static void start_xmit(struct cyclades_port
*info
)
1420 struct cyclades_card
*card
= info
->card
;
1421 unsigned long flags
;
1422 int channel
= info
->line
- card
->first_line
;
1424 if (!cy_is_Z(card
)) {
1425 spin_lock_irqsave(&card
->card_lock
, flags
);
1426 cyy_writeb(info
, CyCAR
, channel
& 0x03);
1427 cyy_writeb(info
, CySRER
, cyy_readb(info
, CySRER
) | CyTxRdy
);
1428 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1430 #ifdef CONFIG_CYZ_INTR
1433 spin_lock_irqsave(&card
->card_lock
, flags
);
1434 retval
= cyz_issue_cmd(card
, channel
, C_CM_INTBACK
, 0L);
1436 printk(KERN_ERR
"cyc:start_xmit retval on ttyC%d was "
1437 "%x\n", info
->line
, retval
);
1439 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1440 #else /* CONFIG_CYZ_INTR */
1441 /* Don't have to do anything at this time */
1442 #endif /* CONFIG_CYZ_INTR */
1447 * This routine shuts down a serial port; interrupts are disabled,
1448 * and DTR is dropped if the hangup on close termio flag is on.
1450 static void cy_shutdown(struct cyclades_port
*info
, struct tty_struct
*tty
)
1452 struct cyclades_card
*card
;
1453 unsigned long flags
;
1456 if (!(info
->port
.flags
& ASYNC_INITIALIZED
))
1460 channel
= info
->line
- card
->first_line
;
1461 if (!cy_is_Z(card
)) {
1462 spin_lock_irqsave(&card
->card_lock
, flags
);
1464 /* Clear delta_msr_wait queue to avoid mem leaks. */
1465 wake_up_interruptible(&info
->port
.delta_msr_wait
);
1467 if (info
->port
.xmit_buf
) {
1468 unsigned char *temp
;
1469 temp
= info
->port
.xmit_buf
;
1470 info
->port
.xmit_buf
= NULL
;
1471 free_page((unsigned long)temp
);
1473 if (tty
->termios
->c_cflag
& HUPCL
)
1474 cyy_change_rts_dtr(info
, 0, TIOCM_RTS
| TIOCM_DTR
);
1476 cyy_issue_cmd(info
, CyCHAN_CTL
| CyDIS_RCVR
);
1477 /* it may be appropriate to clear _XMIT at
1478 some later date (after testing)!!! */
1480 set_bit(TTY_IO_ERROR
, &tty
->flags
);
1481 info
->port
.flags
&= ~ASYNC_INITIALIZED
;
1482 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1484 #ifdef CY_DEBUG_OPEN
1485 printk(KERN_DEBUG
"cyc shutdown Z card %d, channel %d, "
1486 "base_addr %p\n", card
, channel
, card
->base_addr
);
1489 if (!cyz_is_loaded(card
))
1492 spin_lock_irqsave(&card
->card_lock
, flags
);
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
);
1501 if (tty
->termios
->c_cflag
& HUPCL
)
1502 tty_port_lower_dtr_rts(&info
->port
);
1504 set_bit(TTY_IO_ERROR
, &tty
->flags
);
1505 info
->port
.flags
&= ~ASYNC_INITIALIZED
;
1507 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1510 #ifdef CY_DEBUG_OPEN
1511 printk(KERN_DEBUG
"cyc shutdown done\n");
1516 * ------------------------------------------------------------
1517 * cy_open() and friends
1518 * ------------------------------------------------------------
1522 * This routine is called whenever a serial port is opened. It
1523 * performs the serial-specific initialization for the tty structure.
1525 static int cy_open(struct tty_struct
*tty
, struct file
*filp
)
1527 struct cyclades_port
*info
;
1528 unsigned int i
, line
;
1532 if (tty
->index
< 0 || NR_PORTS
<= line
)
1535 for (i
= 0; i
< NR_CARDS
; i
++)
1536 if (line
< cy_card
[i
].first_line
+ cy_card
[i
].nports
&&
1537 line
>= cy_card
[i
].first_line
)
1541 info
= &cy_card
[i
].ports
[line
- cy_card
[i
].first_line
];
1545 /* If the card's firmware hasn't been loaded,
1546 treat it as absent from the system. This
1547 will make the user pay attention.
1549 if (cy_is_Z(info
->card
)) {
1550 struct cyclades_card
*cinfo
= info
->card
;
1551 struct FIRM_ID __iomem
*firm_id
= cinfo
->base_addr
+ ID_ADDRESS
;
1553 if (!cyz_is_loaded(cinfo
)) {
1554 if (cinfo
->hw_ver
== ZE_V1
&& cyz_fpga_loaded(cinfo
) &&
1555 readl(&firm_id
->signature
) ==
1557 printk(KERN_ERR
"cyc:Cyclades-Z Error: you "
1558 "need an external power supply for "
1559 "this number of ports.\nFirmware "
1562 printk(KERN_ERR
"cyc:Cyclades-Z firmware not "
1567 #ifdef CONFIG_CYZ_INTR
1569 /* In case this Z board is operating in interrupt mode, its
1570 interrupts should be enabled as soon as the first open
1571 happens to one of its ports. */
1572 if (!cinfo
->intr_enabled
) {
1575 /* Enable interrupts on the PLX chip */
1576 intr
= readw(&cinfo
->ctl_addr
.p9060
->
1577 intr_ctrl_stat
) | 0x0900;
1578 cy_writew(&cinfo
->ctl_addr
.p9060
->
1579 intr_ctrl_stat
, intr
);
1580 /* Enable interrupts on the FW */
1581 retval
= cyz_issue_cmd(cinfo
, 0,
1584 printk(KERN_ERR
"cyc:IRQ enable retval "
1585 "was %x\n", retval
);
1587 cinfo
->intr_enabled
= 1;
1590 #endif /* CONFIG_CYZ_INTR */
1591 /* Make sure this Z port really exists in hardware */
1592 if (info
->line
> (cinfo
->first_line
+ cinfo
->nports
- 1))
1595 #ifdef CY_DEBUG_OTHER
1596 printk(KERN_DEBUG
"cyc:cy_open ttyC%d\n", info
->line
);
1598 tty
->driver_data
= info
;
1599 if (serial_paranoia_check(info
, tty
->name
, "cy_open"))
1602 #ifdef CY_DEBUG_OPEN
1603 printk(KERN_DEBUG
"cyc:cy_open ttyC%d, count = %d\n", info
->line
,
1607 #ifdef CY_DEBUG_COUNT
1608 printk(KERN_DEBUG
"cyc:cy_open (%d): incrementing count to %d\n",
1609 current
->pid
, info
->port
.count
);
1613 * If the port is the middle of closing, bail out now
1615 if (tty_hung_up_p(filp
) || (info
->port
.flags
& ASYNC_CLOSING
)) {
1616 wait_event_interruptible(info
->port
.close_wait
,
1617 !(info
->port
.flags
& ASYNC_CLOSING
));
1618 return (info
->port
.flags
& ASYNC_HUP_NOTIFY
) ? -EAGAIN
: -ERESTARTSYS
;
1622 * Start up serial port
1624 retval
= cy_startup(info
, tty
);
1628 retval
= tty_port_block_til_ready(&info
->port
, tty
, filp
);
1630 #ifdef CY_DEBUG_OPEN
1631 printk(KERN_DEBUG
"cyc:cy_open returning after block_til_ready "
1632 "with %d\n", retval
);
1638 tty_port_tty_set(&info
->port
, tty
);
1640 #ifdef CY_DEBUG_OPEN
1641 printk(KERN_DEBUG
"cyc:cy_open done\n");
1647 * cy_wait_until_sent() --- wait until the transmitter is empty
1649 static void cy_wait_until_sent(struct tty_struct
*tty
, int timeout
)
1651 struct cyclades_card
*card
;
1652 struct cyclades_port
*info
= tty
->driver_data
;
1653 unsigned long orig_jiffies
;
1656 if (serial_paranoia_check(info
, tty
->name
, "cy_wait_until_sent"))
1659 if (info
->xmit_fifo_size
== 0)
1660 return; /* Just in case.... */
1662 orig_jiffies
= jiffies
;
1665 * Set the check interval to be 1/5 of the estimated time to
1666 * send a single character, and make it at least 1. The check
1667 * interval should also be less than the timeout.
1669 * Note: we have to use pretty tight timings here to satisfy
1672 char_time
= (info
->timeout
- HZ
/ 50) / info
->xmit_fifo_size
;
1673 char_time
= char_time
/ 5;
1679 char_time
= min(char_time
, timeout
);
1681 * If the transmitter hasn't cleared in twice the approximate
1682 * amount of time to send the entire FIFO, it probably won't
1683 * ever clear. This assumes the UART isn't doing flow
1684 * control, which is currently the case. Hence, if it ever
1685 * takes longer than info->timeout, this is probably due to a
1686 * UART bug of some kind. So, we clamp the timeout parameter at
1689 if (!timeout
|| timeout
> 2 * info
->timeout
)
1690 timeout
= 2 * info
->timeout
;
1691 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
1692 printk(KERN_DEBUG
"In cy_wait_until_sent(%d) check=%d, jiff=%lu...",
1693 timeout
, char_time
, jiffies
);
1696 if (!cy_is_Z(card
)) {
1697 while (cyy_readb(info
, CySRER
) & CyTxRdy
) {
1698 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
1699 printk(KERN_DEBUG
"Not clean (jiff=%lu)...", jiffies
);
1701 if (msleep_interruptible(jiffies_to_msecs(char_time
)))
1703 if (timeout
&& time_after(jiffies
, orig_jiffies
+
1708 /* Run one more char cycle */
1709 msleep_interruptible(jiffies_to_msecs(char_time
* 5));
1711 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
1712 printk(KERN_DEBUG
"Clean (jiff=%lu)...done\n", jiffies
);
1716 static void cy_flush_buffer(struct tty_struct
*tty
)
1718 struct cyclades_port
*info
= tty
->driver_data
;
1719 struct cyclades_card
*card
;
1720 int channel
, retval
;
1721 unsigned long flags
;
1724 printk(KERN_DEBUG
"cyc:cy_flush_buffer ttyC%d\n", info
->line
);
1727 if (serial_paranoia_check(info
, tty
->name
, "cy_flush_buffer"))
1731 channel
= info
->line
- card
->first_line
;
1733 spin_lock_irqsave(&card
->card_lock
, flags
);
1734 info
->xmit_cnt
= info
->xmit_head
= info
->xmit_tail
= 0;
1735 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1737 if (cy_is_Z(card
)) { /* If it is a Z card, flush the on-board
1739 spin_lock_irqsave(&card
->card_lock
, flags
);
1740 retval
= cyz_issue_cmd(card
, channel
, C_CM_FLUSH_TX
, 0L);
1742 printk(KERN_ERR
"cyc: flush_buffer retval on ttyC%d "
1743 "was %x\n", info
->line
, retval
);
1745 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1748 } /* cy_flush_buffer */
1751 static void cy_do_close(struct tty_port
*port
)
1753 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
1755 struct cyclades_card
*card
;
1756 unsigned long flags
;
1760 channel
= info
->line
- card
->first_line
;
1761 spin_lock_irqsave(&card
->card_lock
, flags
);
1763 if (!cy_is_Z(card
)) {
1764 /* Stop accepting input */
1765 cyy_writeb(info
, CyCAR
, channel
& 0x03);
1766 cyy_writeb(info
, CySRER
, cyy_readb(info
, CySRER
) & ~CyRxData
);
1767 if (info
->port
.flags
& ASYNC_INITIALIZED
) {
1768 /* Waiting for on-board buffers to be empty before
1770 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1771 cy_wait_until_sent(port
->tty
, info
->timeout
);
1772 spin_lock_irqsave(&card
->card_lock
, flags
);
1776 /* Waiting for on-board buffers to be empty before closing
1778 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
1781 if (readl(&ch_ctrl
->flow_status
) != C_FS_TXIDLE
) {
1782 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTLW
, 0L);
1784 printk(KERN_DEBUG
"cyc:cy_close retval on "
1785 "ttyC%d was %x\n", info
->line
, retval
);
1787 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1788 wait_for_completion_interruptible(&info
->shutdown_wait
);
1789 spin_lock_irqsave(&card
->card_lock
, flags
);
1793 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1794 cy_shutdown(info
, port
->tty
);
1798 * This routine is called when a particular tty device is closed.
1800 static void cy_close(struct tty_struct
*tty
, struct file
*filp
)
1802 struct cyclades_port
*info
= tty
->driver_data
;
1803 if (!info
|| serial_paranoia_check(info
, tty
->name
, "cy_close"))
1805 tty_port_close(&info
->port
, tty
, filp
);
1808 /* This routine gets called when tty_write has put something into
1809 * the write_queue. The characters may come from user space or
1812 * This routine will return the number of characters actually
1813 * accepted for writing.
1815 * If the port is not already transmitting stuff, start it off by
1816 * enabling interrupts. The interrupt service routine will then
1817 * ensure that the characters are sent.
1818 * If the port is already active, there is no need to kick it.
1821 static int cy_write(struct tty_struct
*tty
, const unsigned char *buf
, int count
)
1823 struct cyclades_port
*info
= tty
->driver_data
;
1824 unsigned long flags
;
1828 printk(KERN_DEBUG
"cyc:cy_write ttyC%d\n", info
->line
);
1831 if (serial_paranoia_check(info
, tty
->name
, "cy_write"))
1834 if (!info
->port
.xmit_buf
)
1837 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
1839 c
= min(count
, (int)(SERIAL_XMIT_SIZE
- info
->xmit_cnt
- 1));
1840 c
= min(c
, (int)(SERIAL_XMIT_SIZE
- info
->xmit_head
));
1845 memcpy(info
->port
.xmit_buf
+ info
->xmit_head
, buf
, c
);
1846 info
->xmit_head
= (info
->xmit_head
+ c
) &
1847 (SERIAL_XMIT_SIZE
- 1);
1848 info
->xmit_cnt
+= c
;
1853 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
1855 info
->idle_stats
.xmit_bytes
+= ret
;
1856 info
->idle_stats
.xmit_idle
= jiffies
;
1858 if (info
->xmit_cnt
&& !tty
->stopped
&& !tty
->hw_stopped
)
1865 * This routine is called by the kernel to write a single
1866 * character to the tty device. If the kernel uses this routine,
1867 * it must call the flush_chars() routine (if defined) when it is
1868 * done stuffing characters into the driver. If there is no room
1869 * in the queue, the character is ignored.
1871 static int cy_put_char(struct tty_struct
*tty
, unsigned char ch
)
1873 struct cyclades_port
*info
= tty
->driver_data
;
1874 unsigned long flags
;
1877 printk(KERN_DEBUG
"cyc:cy_put_char ttyC%d\n", info
->line
);
1880 if (serial_paranoia_check(info
, tty
->name
, "cy_put_char"))
1883 if (!info
->port
.xmit_buf
)
1886 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
1887 if (info
->xmit_cnt
>= (int)(SERIAL_XMIT_SIZE
- 1)) {
1888 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
1892 info
->port
.xmit_buf
[info
->xmit_head
++] = ch
;
1893 info
->xmit_head
&= SERIAL_XMIT_SIZE
- 1;
1895 info
->idle_stats
.xmit_bytes
++;
1896 info
->idle_stats
.xmit_idle
= jiffies
;
1897 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
1902 * This routine is called by the kernel after it has written a
1903 * series of characters to the tty device using put_char().
1905 static void cy_flush_chars(struct tty_struct
*tty
)
1907 struct cyclades_port
*info
= tty
->driver_data
;
1910 printk(KERN_DEBUG
"cyc:cy_flush_chars ttyC%d\n", info
->line
);
1913 if (serial_paranoia_check(info
, tty
->name
, "cy_flush_chars"))
1916 if (info
->xmit_cnt
<= 0 || tty
->stopped
|| tty
->hw_stopped
||
1917 !info
->port
.xmit_buf
)
1921 } /* cy_flush_chars */
1924 * This routine returns the numbers of characters the tty driver
1925 * will accept for queuing to be written. This number is subject
1926 * to change as output buffers get emptied, or if the output flow
1927 * control is activated.
1929 static int cy_write_room(struct tty_struct
*tty
)
1931 struct cyclades_port
*info
= tty
->driver_data
;
1935 printk(KERN_DEBUG
"cyc:cy_write_room ttyC%d\n", info
->line
);
1938 if (serial_paranoia_check(info
, tty
->name
, "cy_write_room"))
1940 ret
= SERIAL_XMIT_SIZE
- info
->xmit_cnt
- 1;
1944 } /* cy_write_room */
1946 static int cy_chars_in_buffer(struct tty_struct
*tty
)
1948 struct cyclades_port
*info
= tty
->driver_data
;
1950 if (serial_paranoia_check(info
, tty
->name
, "cy_chars_in_buffer"))
1953 #ifdef Z_EXT_CHARS_IN_BUFFER
1954 if (!cy_is_Z(info
->card
)) {
1955 #endif /* Z_EXT_CHARS_IN_BUFFER */
1957 printk(KERN_DEBUG
"cyc:cy_chars_in_buffer ttyC%d %d\n",
1958 info
->line
, info
->xmit_cnt
);
1960 return info
->xmit_cnt
;
1961 #ifdef Z_EXT_CHARS_IN_BUFFER
1963 struct BUF_CTRL __iomem
*buf_ctrl
= info
->u
.cyz
.buf_ctrl
;
1965 __u32 tx_put
, tx_get
, tx_bufsize
;
1968 tx_get
= readl(&buf_ctrl
->tx_get
);
1969 tx_put
= readl(&buf_ctrl
->tx_put
);
1970 tx_bufsize
= readl(&buf_ctrl
->tx_bufsize
);
1971 if (tx_put
>= tx_get
)
1972 char_count
= tx_put
- tx_get
;
1974 char_count
= tx_put
- tx_get
+ tx_bufsize
;
1976 printk(KERN_DEBUG
"cyc:cy_chars_in_buffer ttyC%d %d\n",
1977 info
->line
, info
->xmit_cnt
+ char_count
);
1980 return info
->xmit_cnt
+ char_count
;
1982 #endif /* Z_EXT_CHARS_IN_BUFFER */
1983 } /* cy_chars_in_buffer */
1986 * ------------------------------------------------------------
1987 * cy_ioctl() and friends
1988 * ------------------------------------------------------------
1991 static void cyy_baud_calc(struct cyclades_port
*info
, __u32 baud
)
1993 int co
, co_val
, bpr
;
1994 __u32 cy_clock
= ((info
->chip_rev
>= CD1400_REV_J
) ? 60000000 :
1998 info
->tbpr
= info
->tco
= info
->rbpr
= info
->rco
= 0;
2002 /* determine which prescaler to use */
2003 for (co
= 4, co_val
= 2048; co
; co
--, co_val
>>= 2) {
2004 if (cy_clock
/ co_val
/ baud
> 63)
2008 bpr
= (cy_clock
/ co_val
* 2 / baud
+ 1) / 2;
2012 info
->tbpr
= info
->rbpr
= bpr
;
2013 info
->tco
= info
->rco
= co
;
2017 * This routine finds or computes the various line characteristics.
2018 * It used to be called config_setup
2020 static void cy_set_line_char(struct cyclades_port
*info
, struct tty_struct
*tty
)
2022 struct cyclades_card
*card
;
2023 unsigned long flags
;
2025 unsigned cflag
, iflag
;
2026 int baud
, baud_rate
= 0;
2029 if (!tty
->termios
) /* XXX can this happen at all? */
2032 if (info
->line
== -1)
2035 cflag
= tty
->termios
->c_cflag
;
2036 iflag
= tty
->termios
->c_iflag
;
2039 * Set up the tty->alt_speed kludge
2041 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_HI
)
2042 tty
->alt_speed
= 57600;
2043 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_VHI
)
2044 tty
->alt_speed
= 115200;
2045 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_SHI
)
2046 tty
->alt_speed
= 230400;
2047 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_WARP
)
2048 tty
->alt_speed
= 460800;
2051 channel
= info
->line
- card
->first_line
;
2053 if (!cy_is_Z(card
)) {
2057 baud
= tty_get_baud_rate(tty
);
2058 if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2060 if (info
->custom_divisor
)
2061 baud_rate
= info
->baud
/ info
->custom_divisor
;
2063 baud_rate
= info
->baud
;
2064 } else if (baud
> CD1400_MAX_SPEED
) {
2065 baud
= CD1400_MAX_SPEED
;
2067 /* find the baud index */
2068 for (i
= 0; i
< 20; i
++) {
2069 if (baud
== baud_table
[i
])
2073 i
= 19; /* CD1400_MAX_SPEED */
2075 if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2077 cyy_baud_calc(info
, baud_rate
);
2079 if (info
->chip_rev
>= CD1400_REV_J
) {
2080 /* It is a CD1400 rev. J or later */
2081 info
->tbpr
= baud_bpr_60
[i
]; /* Tx BPR */
2082 info
->tco
= baud_co_60
[i
]; /* Tx CO */
2083 info
->rbpr
= baud_bpr_60
[i
]; /* Rx BPR */
2084 info
->rco
= baud_co_60
[i
]; /* Rx CO */
2086 info
->tbpr
= baud_bpr_25
[i
]; /* Tx BPR */
2087 info
->tco
= baud_co_25
[i
]; /* Tx CO */
2088 info
->rbpr
= baud_bpr_25
[i
]; /* Rx BPR */
2089 info
->rco
= baud_co_25
[i
]; /* Rx CO */
2092 if (baud_table
[i
] == 134) {
2093 /* get it right for 134.5 baud */
2094 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 30 / 269) +
2096 } else if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2098 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2100 } else if (baud_table
[i
]) {
2101 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2103 /* this needs to be propagated into the card info */
2107 /* By tradition (is it a standard?) a baud rate of zero
2108 implies the line should be/has been closed. A bit
2109 later in this routine such a test is performed. */
2111 /* byte size and parity */
2114 /* receive threshold */
2115 info
->cor3
= (info
->default_threshold
?
2116 info
->default_threshold
: baud_cor3
[i
]);
2118 switch (cflag
& CSIZE
) {
2120 info
->cor1
= Cy_5_BITS
;
2123 info
->cor1
= Cy_6_BITS
;
2126 info
->cor1
= Cy_7_BITS
;
2129 info
->cor1
= Cy_8_BITS
;
2133 info
->cor1
|= Cy_2_STOP
;
2135 if (cflag
& PARENB
) {
2137 info
->cor1
|= CyPARITY_O
;
2139 info
->cor1
|= CyPARITY_E
;
2141 info
->cor1
|= CyPARITY_NONE
;
2143 /* CTS flow control flag */
2144 if (cflag
& CRTSCTS
) {
2145 info
->port
.flags
|= ASYNC_CTS_FLOW
;
2146 info
->cor2
|= CyCtsAE
;
2148 info
->port
.flags
&= ~ASYNC_CTS_FLOW
;
2149 info
->cor2
&= ~CyCtsAE
;
2152 info
->port
.flags
&= ~ASYNC_CHECK_CD
;
2154 info
->port
.flags
|= ASYNC_CHECK_CD
;
2156 /***********************************************
2157 The hardware option, CyRtsAO, presents RTS when
2158 the chip has characters to send. Since most modems
2159 use RTS as reverse (inbound) flow control, this
2160 option is not used. If inbound flow control is
2161 necessary, DTR can be programmed to provide the
2162 appropriate signals for use with a non-standard
2163 cable. Contact Marcio Saito for details.
2164 ***********************************************/
2168 spin_lock_irqsave(&card
->card_lock
, flags
);
2169 cyy_writeb(info
, CyCAR
, channel
);
2171 /* tx and rx baud rate */
2173 cyy_writeb(info
, CyTCOR
, info
->tco
);
2174 cyy_writeb(info
, CyTBPR
, info
->tbpr
);
2175 cyy_writeb(info
, CyRCOR
, info
->rco
);
2176 cyy_writeb(info
, CyRBPR
, info
->rbpr
);
2178 /* set line characteristics according configuration */
2180 cyy_writeb(info
, CySCHR1
, START_CHAR(tty
));
2181 cyy_writeb(info
, CySCHR2
, STOP_CHAR(tty
));
2182 cyy_writeb(info
, CyCOR1
, info
->cor1
);
2183 cyy_writeb(info
, CyCOR2
, info
->cor2
);
2184 cyy_writeb(info
, CyCOR3
, info
->cor3
);
2185 cyy_writeb(info
, CyCOR4
, info
->cor4
);
2186 cyy_writeb(info
, CyCOR5
, info
->cor5
);
2188 cyy_issue_cmd(info
, CyCOR_CHANGE
| CyCOR1ch
| CyCOR2ch
|
2191 /* !!! Is this needed? */
2192 cyy_writeb(info
, CyCAR
, channel
);
2193 cyy_writeb(info
, CyRTPR
,
2194 (info
->default_timeout
? info
->default_timeout
: 0x02));
2195 /* 10ms rx timeout */
2199 cflags
|= CyDSR
| CyRI
| CyDCD
;
2200 /* without modem intr */
2201 cyy_writeb(info
, CySRER
, cyy_readb(info
, CySRER
) | CyMdmCh
);
2202 /* act on 1->0 modem transitions */
2203 if ((cflag
& CRTSCTS
) && info
->rflow
)
2204 cyy_writeb(info
, CyMCOR1
, cflags
| rflow_thr
[i
]);
2206 cyy_writeb(info
, CyMCOR1
, cflags
);
2207 /* act on 0->1 modem transitions */
2208 cyy_writeb(info
, CyMCOR2
, cflags
);
2210 if (i
== 0) /* baud rate is zero, turn off line */
2211 cyy_change_rts_dtr(info
, 0, TIOCM_DTR
);
2213 cyy_change_rts_dtr(info
, TIOCM_DTR
, 0);
2215 clear_bit(TTY_IO_ERROR
, &tty
->flags
);
2216 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2219 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
2223 if (!cyz_is_loaded(card
))
2227 baud
= tty_get_baud_rate(tty
);
2228 if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2230 if (info
->custom_divisor
)
2231 baud_rate
= info
->baud
/ info
->custom_divisor
;
2233 baud_rate
= info
->baud
;
2234 } else if (baud
> CYZ_MAX_SPEED
) {
2235 baud
= CYZ_MAX_SPEED
;
2237 cy_writel(&ch_ctrl
->comm_baud
, baud
);
2240 /* get it right for 134.5 baud */
2241 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 30 / 269) +
2243 } else if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2245 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2248 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2250 /* this needs to be propagated into the card info */
2255 /* byte size and parity */
2256 switch (cflag
& CSIZE
) {
2258 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS5
);
2261 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS6
);
2264 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS7
);
2267 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS8
);
2270 if (cflag
& CSTOPB
) {
2271 cy_writel(&ch_ctrl
->comm_data_l
,
2272 readl(&ch_ctrl
->comm_data_l
) | C_DL_2STOP
);
2274 cy_writel(&ch_ctrl
->comm_data_l
,
2275 readl(&ch_ctrl
->comm_data_l
) | C_DL_1STOP
);
2277 if (cflag
& PARENB
) {
2279 cy_writel(&ch_ctrl
->comm_parity
, C_PR_ODD
);
2281 cy_writel(&ch_ctrl
->comm_parity
, C_PR_EVEN
);
2283 cy_writel(&ch_ctrl
->comm_parity
, C_PR_NONE
);
2285 /* CTS flow control flag */
2286 if (cflag
& CRTSCTS
) {
2287 cy_writel(&ch_ctrl
->hw_flow
,
2288 readl(&ch_ctrl
->hw_flow
) | C_RS_CTS
| C_RS_RTS
);
2290 cy_writel(&ch_ctrl
->hw_flow
, readl(&ch_ctrl
->hw_flow
) &
2291 ~(C_RS_CTS
| C_RS_RTS
));
2293 /* As the HW flow control is done in firmware, the driver
2294 doesn't need to care about it */
2295 info
->port
.flags
&= ~ASYNC_CTS_FLOW
;
2297 /* XON/XOFF/XANY flow control flags */
2300 sw_flow
|= C_FL_OXX
;
2302 sw_flow
|= C_FL_OIXANY
;
2304 cy_writel(&ch_ctrl
->sw_flow
, sw_flow
);
2306 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTL
, 0L);
2308 printk(KERN_ERR
"cyc:set_line_char retval on ttyC%d "
2309 "was %x\n", info
->line
, retval
);
2312 /* CD sensitivity */
2314 info
->port
.flags
&= ~ASYNC_CHECK_CD
;
2316 info
->port
.flags
|= ASYNC_CHECK_CD
;
2318 if (baud
== 0) { /* baud rate is zero, turn off line */
2319 cy_writel(&ch_ctrl
->rs_control
,
2320 readl(&ch_ctrl
->rs_control
) & ~C_RS_DTR
);
2322 printk(KERN_DEBUG
"cyc:set_line_char dropping Z DTR\n");
2325 cy_writel(&ch_ctrl
->rs_control
,
2326 readl(&ch_ctrl
->rs_control
) | C_RS_DTR
);
2328 printk(KERN_DEBUG
"cyc:set_line_char raising Z DTR\n");
2332 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTLM
, 0L);
2334 printk(KERN_ERR
"cyc:set_line_char(2) retval on ttyC%d "
2335 "was %x\n", info
->line
, retval
);
2338 clear_bit(TTY_IO_ERROR
, &tty
->flags
);
2340 } /* set_line_char */
2342 static int cy_get_serial_info(struct cyclades_port
*info
,
2343 struct serial_struct __user
*retinfo
)
2345 struct cyclades_card
*cinfo
= info
->card
;
2346 struct serial_struct tmp
= {
2349 .port
= (info
->card
- cy_card
) * 0x100 + info
->line
-
2352 .flags
= info
->port
.flags
,
2353 .close_delay
= info
->port
.close_delay
,
2354 .closing_wait
= info
->port
.closing_wait
,
2355 .baud_base
= info
->baud
,
2356 .custom_divisor
= info
->custom_divisor
,
2359 return copy_to_user(retinfo
, &tmp
, sizeof(*retinfo
)) ? -EFAULT
: 0;
2363 cy_set_serial_info(struct cyclades_port
*info
, struct tty_struct
*tty
,
2364 struct serial_struct __user
*new_info
)
2366 struct serial_struct new_serial
;
2368 if (copy_from_user(&new_serial
, new_info
, sizeof(new_serial
)))
2371 if (!capable(CAP_SYS_ADMIN
)) {
2372 if (new_serial
.close_delay
!= info
->port
.close_delay
||
2373 new_serial
.baud_base
!= info
->baud
||
2374 (new_serial
.flags
& ASYNC_FLAGS
&
2376 (info
->port
.flags
& ASYNC_FLAGS
& ~ASYNC_USR_MASK
))
2378 info
->port
.flags
= (info
->port
.flags
& ~ASYNC_USR_MASK
) |
2379 (new_serial
.flags
& ASYNC_USR_MASK
);
2380 info
->baud
= new_serial
.baud_base
;
2381 info
->custom_divisor
= new_serial
.custom_divisor
;
2382 goto check_and_exit
;
2386 * OK, past this point, all the error checking has been done.
2387 * At this point, we start making changes.....
2390 info
->baud
= new_serial
.baud_base
;
2391 info
->custom_divisor
= new_serial
.custom_divisor
;
2392 info
->port
.flags
= (info
->port
.flags
& ~ASYNC_FLAGS
) |
2393 (new_serial
.flags
& ASYNC_FLAGS
);
2394 info
->port
.close_delay
= new_serial
.close_delay
* HZ
/ 100;
2395 info
->port
.closing_wait
= new_serial
.closing_wait
* HZ
/ 100;
2398 if (info
->port
.flags
& ASYNC_INITIALIZED
) {
2399 cy_set_line_char(info
, tty
);
2402 return cy_startup(info
, tty
);
2404 } /* set_serial_info */
2407 * get_lsr_info - get line status register info
2409 * Purpose: Let user call ioctl() to get info when the UART physically
2410 * is emptied. On bus types like RS485, the transmitter must
2411 * release the bus after transmitting. This must be done when
2412 * the transmit shift register is empty, not be done when the
2413 * transmit holding register is empty. This functionality
2414 * allows an RS485 driver to be written in user space.
2416 static int get_lsr_info(struct cyclades_port
*info
, unsigned int __user
*value
)
2418 struct cyclades_card
*card
= info
->card
;
2419 unsigned int result
;
2420 unsigned long flags
;
2423 if (!cy_is_Z(card
)) {
2424 spin_lock_irqsave(&card
->card_lock
, flags
);
2425 status
= cyy_readb(info
, CySRER
) & (CyTxRdy
| CyTxMpty
);
2426 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2427 result
= (status
? 0 : TIOCSER_TEMT
);
2429 /* Not supported yet */
2432 return put_user(result
, (unsigned long __user
*)value
);
2435 static int cy_tiocmget(struct tty_struct
*tty
, struct file
*file
)
2437 struct cyclades_port
*info
= tty
->driver_data
;
2438 struct cyclades_card
*card
;
2441 if (serial_paranoia_check(info
, tty
->name
, __func__
))
2447 if (!cy_is_Z(card
)) {
2448 unsigned long flags
;
2449 int channel
= info
->line
- card
->first_line
;
2452 spin_lock_irqsave(&card
->card_lock
, flags
);
2453 cyy_writeb(info
, CyCAR
, channel
& 0x03);
2454 status
= cyy_readb(info
, CyMSVR1
);
2455 status
|= cyy_readb(info
, CyMSVR2
);
2456 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2458 if (info
->rtsdtr_inv
) {
2459 result
= ((status
& CyRTS
) ? TIOCM_DTR
: 0) |
2460 ((status
& CyDTR
) ? TIOCM_RTS
: 0);
2462 result
= ((status
& CyRTS
) ? TIOCM_RTS
: 0) |
2463 ((status
& CyDTR
) ? TIOCM_DTR
: 0);
2465 result
|= ((status
& CyDCD
) ? TIOCM_CAR
: 0) |
2466 ((status
& CyRI
) ? TIOCM_RNG
: 0) |
2467 ((status
& CyDSR
) ? TIOCM_DSR
: 0) |
2468 ((status
& CyCTS
) ? TIOCM_CTS
: 0);
2472 if (!cyz_is_loaded(card
)) {
2477 lstatus
= readl(&info
->u
.cyz
.ch_ctrl
->rs_status
);
2478 result
= ((lstatus
& C_RS_RTS
) ? TIOCM_RTS
: 0) |
2479 ((lstatus
& C_RS_DTR
) ? TIOCM_DTR
: 0) |
2480 ((lstatus
& C_RS_DCD
) ? TIOCM_CAR
: 0) |
2481 ((lstatus
& C_RS_RI
) ? TIOCM_RNG
: 0) |
2482 ((lstatus
& C_RS_DSR
) ? TIOCM_DSR
: 0) |
2483 ((lstatus
& C_RS_CTS
) ? TIOCM_CTS
: 0);
2491 cy_tiocmset(struct tty_struct
*tty
, struct file
*file
,
2492 unsigned int set
, unsigned int clear
)
2494 struct cyclades_port
*info
= tty
->driver_data
;
2495 struct cyclades_card
*card
;
2496 unsigned long flags
;
2498 if (serial_paranoia_check(info
, tty
->name
, __func__
))
2502 if (!cy_is_Z(card
)) {
2503 spin_lock_irqsave(&card
->card_lock
, flags
);
2504 cyy_change_rts_dtr(info
, set
, clear
);
2505 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2507 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
2508 int retval
, channel
= info
->line
- card
->first_line
;
2511 if (!cyz_is_loaded(card
))
2514 spin_lock_irqsave(&card
->card_lock
, flags
);
2515 rs
= readl(&ch_ctrl
->rs_control
);
2516 if (set
& TIOCM_RTS
)
2518 if (clear
& TIOCM_RTS
)
2520 if (set
& TIOCM_DTR
) {
2523 printk(KERN_DEBUG
"cyc:set_modem_info raising Z DTR\n");
2526 if (clear
& TIOCM_DTR
) {
2529 printk(KERN_DEBUG
"cyc:set_modem_info clearing "
2533 cy_writel(&ch_ctrl
->rs_control
, rs
);
2534 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTLM
, 0L);
2535 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2537 printk(KERN_ERR
"cyc:set_modem_info retval on ttyC%d "
2538 "was %x\n", info
->line
, retval
);
2545 * cy_break() --- routine which turns the break handling on or off
2547 static int cy_break(struct tty_struct
*tty
, int break_state
)
2549 struct cyclades_port
*info
= tty
->driver_data
;
2550 struct cyclades_card
*card
;
2551 unsigned long flags
;
2554 if (serial_paranoia_check(info
, tty
->name
, "cy_break"))
2559 spin_lock_irqsave(&card
->card_lock
, flags
);
2560 if (!cy_is_Z(card
)) {
2561 /* Let the transmit ISR take care of this (since it
2562 requires stuffing characters into the output stream).
2564 if (break_state
== -1) {
2565 if (!info
->breakon
) {
2567 if (!info
->xmit_cnt
) {
2568 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2570 spin_lock_irqsave(&card
->card_lock
, flags
);
2574 if (!info
->breakoff
) {
2576 if (!info
->xmit_cnt
) {
2577 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2579 spin_lock_irqsave(&card
->card_lock
, flags
);
2584 if (break_state
== -1) {
2585 retval
= cyz_issue_cmd(card
,
2586 info
->line
- card
->first_line
,
2587 C_CM_SET_BREAK
, 0L);
2589 printk(KERN_ERR
"cyc:cy_break (set) retval on "
2590 "ttyC%d was %x\n", info
->line
, retval
);
2593 retval
= cyz_issue_cmd(card
,
2594 info
->line
- card
->first_line
,
2595 C_CM_CLR_BREAK
, 0L);
2597 printk(KERN_DEBUG
"cyc:cy_break (clr) retval "
2598 "on ttyC%d was %x\n", info
->line
,
2603 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2607 static int set_threshold(struct cyclades_port
*info
, unsigned long value
)
2609 struct cyclades_card
*card
= info
->card
;
2610 unsigned long flags
;
2612 if (!cy_is_Z(card
)) {
2613 info
->cor3
&= ~CyREC_FIFO
;
2614 info
->cor3
|= value
& CyREC_FIFO
;
2616 spin_lock_irqsave(&card
->card_lock
, flags
);
2617 cyy_writeb(info
, CyCOR3
, info
->cor3
);
2618 cyy_issue_cmd(info
, CyCOR_CHANGE
| CyCOR3ch
);
2619 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2622 } /* set_threshold */
2624 static int get_threshold(struct cyclades_port
*info
,
2625 unsigned long __user
*value
)
2627 struct cyclades_card
*card
= info
->card
;
2629 if (!cy_is_Z(card
)) {
2630 u8 tmp
= cyy_readb(info
, CyCOR3
) & CyREC_FIFO
;
2631 return put_user(tmp
, value
);
2634 } /* get_threshold */
2636 static int set_timeout(struct cyclades_port
*info
, unsigned long value
)
2638 struct cyclades_card
*card
= info
->card
;
2639 unsigned long flags
;
2641 if (!cy_is_Z(card
)) {
2642 spin_lock_irqsave(&card
->card_lock
, flags
);
2643 cyy_writeb(info
, CyRTPR
, value
& 0xff);
2644 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2649 static int get_timeout(struct cyclades_port
*info
,
2650 unsigned long __user
*value
)
2652 struct cyclades_card
*card
= info
->card
;
2654 if (!cy_is_Z(card
)) {
2655 u8 tmp
= cyy_readb(info
, CyRTPR
);
2656 return put_user(tmp
, value
);
2661 static int cy_cflags_changed(struct cyclades_port
*info
, unsigned long arg
,
2662 struct cyclades_icount
*cprev
)
2664 struct cyclades_icount cnow
;
2665 unsigned long flags
;
2668 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
2669 cnow
= info
->icount
; /* atomic copy */
2670 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
2672 ret
= ((arg
& TIOCM_RNG
) && (cnow
.rng
!= cprev
->rng
)) ||
2673 ((arg
& TIOCM_DSR
) && (cnow
.dsr
!= cprev
->dsr
)) ||
2674 ((arg
& TIOCM_CD
) && (cnow
.dcd
!= cprev
->dcd
)) ||
2675 ((arg
& TIOCM_CTS
) && (cnow
.cts
!= cprev
->cts
));
2683 * This routine allows the tty driver to implement device-
2684 * specific ioctl's. If the ioctl number passed in cmd is
2685 * not recognized by the driver, it should return ENOIOCTLCMD.
2688 cy_ioctl(struct tty_struct
*tty
, struct file
*file
,
2689 unsigned int cmd
, unsigned long arg
)
2691 struct cyclades_port
*info
= tty
->driver_data
;
2692 struct cyclades_icount cnow
; /* kernel counter temps */
2694 unsigned long flags
;
2695 void __user
*argp
= (void __user
*)arg
;
2697 if (serial_paranoia_check(info
, tty
->name
, "cy_ioctl"))
2700 #ifdef CY_DEBUG_OTHER
2701 printk(KERN_DEBUG
"cyc:cy_ioctl ttyC%d, cmd = %x arg = %lx\n",
2702 info
->line
, cmd
, arg
);
2708 if (copy_to_user(argp
, &info
->mon
, sizeof(info
->mon
))) {
2712 memset(&info
->mon
, 0, sizeof(info
->mon
));
2715 ret_val
= get_threshold(info
, argp
);
2718 ret_val
= set_threshold(info
, arg
);
2720 case CYGETDEFTHRESH
:
2721 ret_val
= put_user(info
->default_threshold
,
2722 (unsigned long __user
*)argp
);
2724 case CYSETDEFTHRESH
:
2725 info
->default_threshold
= arg
& 0x0f;
2728 ret_val
= get_timeout(info
, argp
);
2731 ret_val
= set_timeout(info
, arg
);
2733 case CYGETDEFTIMEOUT
:
2734 ret_val
= put_user(info
->default_timeout
,
2735 (unsigned long __user
*)argp
);
2737 case CYSETDEFTIMEOUT
:
2738 info
->default_timeout
= arg
& 0xff;
2741 info
->rflow
= (int)arg
;
2744 ret_val
= info
->rflow
;
2746 case CYSETRTSDTR_INV
:
2747 info
->rtsdtr_inv
= (int)arg
;
2749 case CYGETRTSDTR_INV
:
2750 ret_val
= info
->rtsdtr_inv
;
2752 case CYGETCD1400VER
:
2753 ret_val
= info
->chip_rev
;
2755 #ifndef CONFIG_CYZ_INTR
2756 case CYZSETPOLLCYCLE
:
2757 cyz_polling_cycle
= (arg
* HZ
) / 1000;
2759 case CYZGETPOLLCYCLE
:
2760 ret_val
= (cyz_polling_cycle
* 1000) / HZ
;
2762 #endif /* CONFIG_CYZ_INTR */
2764 info
->port
.closing_wait
= (unsigned short)arg
* HZ
/ 100;
2767 ret_val
= info
->port
.closing_wait
/ (HZ
/ 100);
2770 ret_val
= cy_get_serial_info(info
, argp
);
2773 ret_val
= cy_set_serial_info(info
, tty
, argp
);
2775 case TIOCSERGETLSR
: /* Get line status register */
2776 ret_val
= get_lsr_info(info
, argp
);
2779 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
2780 * - mask passed in arg for lines of interest
2781 * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
2782 * Caller should use TIOCGICOUNT to see which one it was
2785 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
2786 /* note the counters on entry */
2787 cnow
= info
->icount
;
2788 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
2789 ret_val
= wait_event_interruptible(info
->port
.delta_msr_wait
,
2790 cy_cflags_changed(info
, arg
, &cnow
));
2794 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
2795 * Return: write counters to the user passed counter struct
2796 * NB: both 1->0 and 0->1 transitions are counted except for
2797 * RI where only 0->1 is counted.
2800 struct serial_icounter_struct sic
= { };
2802 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
2803 cnow
= info
->icount
;
2804 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
2812 sic
.frame
= cnow
.frame
;
2813 sic
.overrun
= cnow
.overrun
;
2814 sic
.parity
= cnow
.parity
;
2816 sic
.buf_overrun
= cnow
.buf_overrun
;
2818 if (copy_to_user(argp
, &sic
, sizeof(sic
)))
2823 ret_val
= -ENOIOCTLCMD
;
2827 #ifdef CY_DEBUG_OTHER
2828 printk(KERN_DEBUG
"cyc:cy_ioctl done\n");
2834 * This routine allows the tty driver to be notified when
2835 * device's termios settings have changed. Note that a
2836 * well-designed tty driver should be prepared to accept the case
2837 * where old == NULL, and try to do something rational.
2839 static void cy_set_termios(struct tty_struct
*tty
, struct ktermios
*old_termios
)
2841 struct cyclades_port
*info
= tty
->driver_data
;
2843 #ifdef CY_DEBUG_OTHER
2844 printk(KERN_DEBUG
"cyc:cy_set_termios ttyC%d\n", info
->line
);
2847 cy_set_line_char(info
, tty
);
2849 if ((old_termios
->c_cflag
& CRTSCTS
) &&
2850 !(tty
->termios
->c_cflag
& CRTSCTS
)) {
2851 tty
->hw_stopped
= 0;
2856 * No need to wake up processes in open wait, since they
2857 * sample the CLOCAL flag once, and don't recheck it.
2858 * XXX It's not clear whether the current behavior is correct
2859 * or not. Hence, this may change.....
2861 if (!(old_termios
->c_cflag
& CLOCAL
) &&
2862 (tty
->termios
->c_cflag
& CLOCAL
))
2863 wake_up_interruptible(&info
->port
.open_wait
);
2865 } /* cy_set_termios */
2867 /* This function is used to send a high-priority XON/XOFF character to
2870 static void cy_send_xchar(struct tty_struct
*tty
, char ch
)
2872 struct cyclades_port
*info
= tty
->driver_data
;
2873 struct cyclades_card
*card
;
2876 if (serial_paranoia_check(info
, tty
->name
, "cy_send_xchar"))
2885 channel
= info
->line
- card
->first_line
;
2887 if (cy_is_Z(card
)) {
2888 if (ch
== STOP_CHAR(tty
))
2889 cyz_issue_cmd(card
, channel
, C_CM_SENDXOFF
, 0L);
2890 else if (ch
== START_CHAR(tty
))
2891 cyz_issue_cmd(card
, channel
, C_CM_SENDXON
, 0L);
2895 /* This routine is called by the upper-layer tty layer to signal
2896 that incoming characters should be throttled because the input
2897 buffers are close to full.
2899 static void cy_throttle(struct tty_struct
*tty
)
2901 struct cyclades_port
*info
= tty
->driver_data
;
2902 struct cyclades_card
*card
;
2903 unsigned long flags
;
2905 #ifdef CY_DEBUG_THROTTLE
2908 printk(KERN_DEBUG
"cyc:throttle %s: %ld...ttyC%d\n", tty_name(tty
, buf
),
2909 tty
->ldisc
.chars_in_buffer(tty
), info
->line
);
2912 if (serial_paranoia_check(info
, tty
->name
, "cy_throttle"))
2919 cy_send_xchar(tty
, STOP_CHAR(tty
));
2924 if (tty
->termios
->c_cflag
& CRTSCTS
) {
2925 if (!cy_is_Z(card
)) {
2926 spin_lock_irqsave(&card
->card_lock
, flags
);
2927 cyy_change_rts_dtr(info
, 0, TIOCM_RTS
);
2928 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2936 * This routine notifies the tty driver that it should signal
2937 * that characters can now be sent to the tty without fear of
2938 * overrunning the input buffers of the line disciplines.
2940 static void cy_unthrottle(struct tty_struct
*tty
)
2942 struct cyclades_port
*info
= tty
->driver_data
;
2943 struct cyclades_card
*card
;
2944 unsigned long flags
;
2946 #ifdef CY_DEBUG_THROTTLE
2949 printk(KERN_DEBUG
"cyc:unthrottle %s: %ld...ttyC%d\n",
2950 tty_name(tty
, buf
), tty_chars_in_buffer(tty
), info
->line
);
2953 if (serial_paranoia_check(info
, tty
->name
, "cy_unthrottle"))
2960 cy_send_xchar(tty
, START_CHAR(tty
));
2963 if (tty
->termios
->c_cflag
& CRTSCTS
) {
2965 if (!cy_is_Z(card
)) {
2966 spin_lock_irqsave(&card
->card_lock
, flags
);
2967 cyy_change_rts_dtr(info
, TIOCM_RTS
, 0);
2968 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2973 } /* cy_unthrottle */
2975 /* cy_start and cy_stop provide software output flow control as a
2976 function of XON/XOFF, software CTS, and other such stuff.
2978 static void cy_stop(struct tty_struct
*tty
)
2980 struct cyclades_card
*cinfo
;
2981 struct cyclades_port
*info
= tty
->driver_data
;
2983 unsigned long flags
;
2985 #ifdef CY_DEBUG_OTHER
2986 printk(KERN_DEBUG
"cyc:cy_stop ttyC%d\n", info
->line
);
2989 if (serial_paranoia_check(info
, tty
->name
, "cy_stop"))
2993 channel
= info
->line
- cinfo
->first_line
;
2994 if (!cy_is_Z(cinfo
)) {
2995 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
2996 cyy_writeb(info
, CyCAR
, channel
& 0x03);
2997 cyy_writeb(info
, CySRER
, cyy_readb(info
, CySRER
) & ~CyTxRdy
);
2998 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3002 static void cy_start(struct tty_struct
*tty
)
3004 struct cyclades_card
*cinfo
;
3005 struct cyclades_port
*info
= tty
->driver_data
;
3007 unsigned long flags
;
3009 #ifdef CY_DEBUG_OTHER
3010 printk(KERN_DEBUG
"cyc:cy_start ttyC%d\n", info
->line
);
3013 if (serial_paranoia_check(info
, tty
->name
, "cy_start"))
3017 channel
= info
->line
- cinfo
->first_line
;
3018 if (!cy_is_Z(cinfo
)) {
3019 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3020 cyy_writeb(info
, CyCAR
, channel
& 0x03);
3021 cyy_writeb(info
, CySRER
, cyy_readb(info
, CySRER
) | CyTxRdy
);
3022 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3027 * cy_hangup() --- called by tty_hangup() when a hangup is signaled.
3029 static void cy_hangup(struct tty_struct
*tty
)
3031 struct cyclades_port
*info
= tty
->driver_data
;
3033 #ifdef CY_DEBUG_OTHER
3034 printk(KERN_DEBUG
"cyc:cy_hangup ttyC%d\n", info
->line
);
3037 if (serial_paranoia_check(info
, tty
->name
, "cy_hangup"))
3040 cy_flush_buffer(tty
);
3041 cy_shutdown(info
, tty
);
3042 tty_port_hangup(&info
->port
);
3045 static int cyy_carrier_raised(struct tty_port
*port
)
3047 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3049 struct cyclades_card
*cinfo
= info
->card
;
3050 unsigned long flags
;
3051 int channel
= info
->line
- cinfo
->first_line
;
3054 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3055 cyy_writeb(info
, CyCAR
, channel
& 0x03);
3056 cd
= cyy_readb(info
, CyMSVR1
) & CyDCD
;
3057 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3062 static void cyy_dtr_rts(struct tty_port
*port
, int raise
)
3064 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3066 struct cyclades_card
*cinfo
= info
->card
;
3067 unsigned long flags
;
3069 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3070 cyy_change_rts_dtr(info
, raise
? TIOCM_RTS
| TIOCM_DTR
: 0,
3071 raise
? 0 : TIOCM_RTS
| TIOCM_DTR
);
3072 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3075 static int cyz_carrier_raised(struct tty_port
*port
)
3077 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3080 return readl(&info
->u
.cyz
.ch_ctrl
->rs_status
) & C_RS_DCD
;
3083 static void cyz_dtr_rts(struct tty_port
*port
, int raise
)
3085 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3087 struct cyclades_card
*cinfo
= info
->card
;
3088 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
3089 int ret
, channel
= info
->line
- cinfo
->first_line
;
3092 rs
= readl(&ch_ctrl
->rs_control
);
3094 rs
|= C_RS_RTS
| C_RS_DTR
;
3096 rs
&= ~(C_RS_RTS
| C_RS_DTR
);
3097 cy_writel(&ch_ctrl
->rs_control
, rs
);
3098 ret
= cyz_issue_cmd(cinfo
, channel
, C_CM_IOCTLM
, 0L);
3100 printk(KERN_ERR
"%s: retval on ttyC%d was %x\n",
3101 __func__
, info
->line
, ret
);
3103 printk(KERN_DEBUG
"%s: raising Z DTR\n", __func__
);
3107 static const struct tty_port_operations cyy_port_ops
= {
3108 .carrier_raised
= cyy_carrier_raised
,
3109 .dtr_rts
= cyy_dtr_rts
,
3110 .shutdown
= cy_do_close
,
3113 static const struct tty_port_operations cyz_port_ops
= {
3114 .carrier_raised
= cyz_carrier_raised
,
3115 .dtr_rts
= cyz_dtr_rts
,
3116 .shutdown
= cy_do_close
,
3120 * ---------------------------------------------------------------------
3121 * cy_init() and friends
3123 * cy_init() is called at boot-time to initialize the serial driver.
3124 * ---------------------------------------------------------------------
3127 static int __devinit
cy_init_card(struct cyclades_card
*cinfo
)
3129 struct cyclades_port
*info
;
3130 unsigned int channel
, port
;
3132 spin_lock_init(&cinfo
->card_lock
);
3133 cinfo
->intr_enabled
= 0;
3135 cinfo
->ports
= kcalloc(cinfo
->nports
, sizeof(*cinfo
->ports
),
3137 if (cinfo
->ports
== NULL
) {
3138 printk(KERN_ERR
"Cyclades: cannot allocate ports\n");
3142 for (channel
= 0, port
= cinfo
->first_line
; channel
< cinfo
->nports
;
3143 channel
++, port
++) {
3144 info
= &cinfo
->ports
[channel
];
3145 tty_port_init(&info
->port
);
3146 info
->magic
= CYCLADES_MAGIC
;
3150 info
->port
.closing_wait
= CLOSING_WAIT_DELAY
;
3151 info
->port
.close_delay
= 5 * HZ
/ 10;
3152 info
->port
.flags
= STD_COM_FLAGS
;
3153 init_completion(&info
->shutdown_wait
);
3155 if (cy_is_Z(cinfo
)) {
3156 struct FIRM_ID
*firm_id
= cinfo
->base_addr
+ ID_ADDRESS
;
3157 struct ZFW_CTRL
*zfw_ctrl
;
3159 info
->port
.ops
= &cyz_port_ops
;
3160 info
->type
= PORT_STARTECH
;
3162 zfw_ctrl
= cinfo
->base_addr
+
3163 (readl(&firm_id
->zfwctrl_addr
) & 0xfffff);
3164 info
->u
.cyz
.ch_ctrl
= &zfw_ctrl
->ch_ctrl
[channel
];
3165 info
->u
.cyz
.buf_ctrl
= &zfw_ctrl
->buf_ctrl
[channel
];
3167 if (cinfo
->hw_ver
== ZO_V1
)
3168 info
->xmit_fifo_size
= CYZ_FIFO_SIZE
;
3170 info
->xmit_fifo_size
= 4 * CYZ_FIFO_SIZE
;
3171 #ifdef CONFIG_CYZ_INTR
3172 setup_timer(&cyz_rx_full_timer
[port
],
3173 cyz_rx_restart
, (unsigned long)info
);
3176 unsigned short chip_number
;
3177 int index
= cinfo
->bus_index
;
3179 info
->port
.ops
= &cyy_port_ops
;
3180 info
->type
= PORT_CIRRUS
;
3181 info
->xmit_fifo_size
= CyMAX_CHAR_FIFO
;
3182 info
->cor1
= CyPARITY_NONE
| Cy_1_STOP
| Cy_8_BITS
;
3184 info
->cor3
= 0x08; /* _very_ small rcv threshold */
3186 chip_number
= channel
/ CyPORTS_PER_CHIP
;
3187 info
->u
.cyy
.base_addr
= cinfo
->base_addr
+
3188 (cy_chip_offset
[chip_number
] << index
);
3189 info
->chip_rev
= cyy_readb(info
, CyGFRCR
);
3191 if (info
->chip_rev
>= CD1400_REV_J
) {
3192 /* It is a CD1400 rev. J or later */
3193 info
->tbpr
= baud_bpr_60
[13]; /* Tx BPR */
3194 info
->tco
= baud_co_60
[13]; /* Tx CO */
3195 info
->rbpr
= baud_bpr_60
[13]; /* Rx BPR */
3196 info
->rco
= baud_co_60
[13]; /* Rx CO */
3197 info
->rtsdtr_inv
= 1;
3199 info
->tbpr
= baud_bpr_25
[13]; /* Tx BPR */
3200 info
->tco
= baud_co_25
[13]; /* Tx CO */
3201 info
->rbpr
= baud_bpr_25
[13]; /* Rx BPR */
3202 info
->rco
= baud_co_25
[13]; /* Rx CO */
3203 info
->rtsdtr_inv
= 0;
3205 info
->read_status_mask
= CyTIMEOUT
| CySPECHAR
|
3206 CyBREAK
| CyPARITY
| CyFRAME
| CyOVERRUN
;
3211 #ifndef CONFIG_CYZ_INTR
3212 if (cy_is_Z(cinfo
) && !timer_pending(&cyz_timerlist
)) {
3213 mod_timer(&cyz_timerlist
, jiffies
+ 1);
3215 printk(KERN_DEBUG
"Cyclades-Z polling initialized\n");
3222 /* initialize chips on Cyclom-Y card -- return number of valid
3223 chips (which is number of ports/4) */
3224 static unsigned short __devinit
cyy_init_card(void __iomem
*true_base_addr
,
3227 unsigned int chip_number
;
3228 void __iomem
*base_addr
;
3230 cy_writeb(true_base_addr
+ (Cy_HwReset
<< index
), 0);
3231 /* Cy_HwReset is 0x1400 */
3232 cy_writeb(true_base_addr
+ (Cy_ClrIntr
<< index
), 0);
3233 /* Cy_ClrIntr is 0x1800 */
3236 for (chip_number
= 0; chip_number
< CyMAX_CHIPS_PER_CARD
;
3239 true_base_addr
+ (cy_chip_offset
[chip_number
] << index
);
3241 if (readb(base_addr
+ (CyCCR
<< index
)) != 0x00) {
3243 printk(" chip #%d at %#6lx is never idle (CCR != 0)\n",
3244 chip_number, (unsigned long)base_addr);
3249 cy_writeb(base_addr
+ (CyGFRCR
<< index
), 0);
3252 /* The Cyclom-16Y does not decode address bit 9 and therefore
3253 cannot distinguish between references to chip 0 and a non-
3254 existent chip 4. If the preceding clearing of the supposed
3255 chip 4 GFRCR register appears at chip 0, there is no chip 4
3256 and this must be a Cyclom-16Y, not a Cyclom-32Ye.
3258 if (chip_number
== 4 && readb(true_base_addr
+
3259 (cy_chip_offset
[0] << index
) +
3260 (CyGFRCR
<< index
)) == 0) {
3264 cy_writeb(base_addr
+ (CyCCR
<< index
), CyCHIP_RESET
);
3267 if (readb(base_addr
+ (CyGFRCR
<< index
)) == 0x00) {
3269 printk(" chip #%d at %#6lx is not responding ",
3270 chip_number, (unsigned long)base_addr);
3271 printk("(GFRCR stayed 0)\n",
3275 if ((0xf0 & (readb(base_addr
+ (CyGFRCR
<< index
)))) !=
3278 printk(" chip #%d at %#6lx is not valid (GFRCR == "
3280 chip_number, (unsigned long)base_addr,
3281 base_addr[CyGFRCR<<index]);
3285 cy_writeb(base_addr
+ (CyGCR
<< index
), CyCH0_SERIAL
);
3286 if (readb(base_addr
+ (CyGFRCR
<< index
)) >= CD1400_REV_J
) {
3287 /* It is a CD1400 rev. J or later */
3288 /* Impossible to reach 5ms with this chip.
3289 Changed to 2ms instead (f = 500 Hz). */
3290 cy_writeb(base_addr
+ (CyPPR
<< index
), CyCLOCK_60_2MS
);
3293 cy_writeb(base_addr
+ (CyPPR
<< index
), CyCLOCK_25_5MS
);
3297 printk(" chip #%d at %#6lx is rev 0x%2x\n",
3298 chip_number, (unsigned long)base_addr,
3299 readb(base_addr+(CyGFRCR<<index)));
3303 } /* cyy_init_card */
3306 * ---------------------------------------------------------------------
3307 * cy_detect_isa() - Probe for Cyclom-Y/ISA boards.
3308 * sets global variables and return the number of ISA boards found.
3309 * ---------------------------------------------------------------------
3311 static int __init
cy_detect_isa(void)
3314 unsigned short cy_isa_irq
, nboard
;
3315 void __iomem
*cy_isa_address
;
3316 unsigned short i
, j
, cy_isa_nchan
;
3321 /* Check for module parameters */
3322 for (i
= 0; i
< NR_CARDS
; i
++) {
3323 if (maddr
[i
] || i
) {
3325 cy_isa_addresses
[i
] = maddr
[i
];
3331 /* scan the address table probing for Cyclom-Y/ISA boards */
3332 for (i
= 0; i
< NR_ISA_ADDRS
; i
++) {
3333 unsigned int isa_address
= cy_isa_addresses
[i
];
3334 if (isa_address
== 0x0000)
3337 /* probe for CD1400... */
3338 cy_isa_address
= ioremap_nocache(isa_address
, CyISA_Ywin
);
3339 if (cy_isa_address
== NULL
) {
3340 printk(KERN_ERR
"Cyclom-Y/ISA: can't remap base "
3344 cy_isa_nchan
= CyPORTS_PER_CHIP
*
3345 cyy_init_card(cy_isa_address
, 0);
3346 if (cy_isa_nchan
== 0) {
3347 iounmap(cy_isa_address
);
3351 if (isparam
&& i
< NR_CARDS
&& irq
[i
])
3352 cy_isa_irq
= irq
[i
];
3354 /* find out the board's irq by probing */
3355 cy_isa_irq
= detect_isa_irq(cy_isa_address
);
3356 if (cy_isa_irq
== 0) {
3357 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but the "
3358 "IRQ could not be detected.\n",
3359 (unsigned long)cy_isa_address
);
3360 iounmap(cy_isa_address
);
3364 if ((cy_next_channel
+ cy_isa_nchan
) > NR_PORTS
) {
3365 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but no "
3366 "more channels are available. Change NR_PORTS "
3367 "in cyclades.c and recompile kernel.\n",
3368 (unsigned long)cy_isa_address
);
3369 iounmap(cy_isa_address
);
3372 /* fill the next cy_card structure available */
3373 for (j
= 0; j
< NR_CARDS
; j
++) {
3374 if (cy_card
[j
].base_addr
== NULL
)
3377 if (j
== NR_CARDS
) { /* no more cy_cards available */
3378 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but no "
3379 "more cards can be used. Change NR_CARDS in "
3380 "cyclades.c and recompile kernel.\n",
3381 (unsigned long)cy_isa_address
);
3382 iounmap(cy_isa_address
);
3387 if (request_irq(cy_isa_irq
, cyy_interrupt
,
3388 IRQF_DISABLED
, "Cyclom-Y", &cy_card
[j
])) {
3389 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but "
3390 "could not allocate IRQ#%d.\n",
3391 (unsigned long)cy_isa_address
, cy_isa_irq
);
3392 iounmap(cy_isa_address
);
3397 cy_card
[j
].base_addr
= cy_isa_address
;
3398 cy_card
[j
].ctl_addr
.p9050
= NULL
;
3399 cy_card
[j
].irq
= (int)cy_isa_irq
;
3400 cy_card
[j
].bus_index
= 0;
3401 cy_card
[j
].first_line
= cy_next_channel
;
3402 cy_card
[j
].num_chips
= cy_isa_nchan
/ CyPORTS_PER_CHIP
;
3403 cy_card
[j
].nports
= cy_isa_nchan
;
3404 if (cy_init_card(&cy_card
[j
])) {
3405 cy_card
[j
].base_addr
= NULL
;
3406 free_irq(cy_isa_irq
, &cy_card
[j
]);
3407 iounmap(cy_isa_address
);
3412 printk(KERN_INFO
"Cyclom-Y/ISA #%d: 0x%lx-0x%lx, IRQ%d found: "
3413 "%d channels starting from port %d\n",
3414 j
+ 1, (unsigned long)cy_isa_address
,
3415 (unsigned long)(cy_isa_address
+ (CyISA_Ywin
- 1)),
3416 cy_isa_irq
, cy_isa_nchan
, cy_next_channel
);
3418 for (j
= cy_next_channel
;
3419 j
< cy_next_channel
+ cy_isa_nchan
; j
++)
3420 tty_register_device(cy_serial_driver
, j
, NULL
);
3421 cy_next_channel
+= cy_isa_nchan
;
3426 #endif /* CONFIG_ISA */
3427 } /* cy_detect_isa */
3430 static inline int __devinit
cyc_isfwstr(const char *str
, unsigned int size
)
3434 for (a
= 0; a
< size
&& *str
; a
++, str
++)
3438 for (; a
< size
; a
++, str
++)
3445 static inline void __devinit
cyz_fpga_copy(void __iomem
*fpga
, const u8
*data
,
3448 for (; size
> 0; size
--) {
3449 cy_writel(fpga
, *data
++);
3454 static void __devinit
plx_init(struct pci_dev
*pdev
, int irq
,
3455 struct RUNTIME_9060 __iomem
*addr
)
3458 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) | 0x40000000);
3460 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) & ~0x40000000);
3462 /* Reload Config. Registers from EEPROM */
3463 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) | 0x20000000);
3465 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) & ~0x20000000);
3467 /* For some yet unknown reason, once the PLX9060 reloads the EEPROM,
3468 * the IRQ is lost and, thus, we have to re-write it to the PCI config.
3469 * registers. This will remain here until we find a permanent fix.
3471 pci_write_config_byte(pdev
, PCI_INTERRUPT_LINE
, irq
);
3474 static int __devinit
__cyz_load_fw(const struct firmware
*fw
,
3475 const char *name
, const u32 mailbox
, void __iomem
*base
,
3478 const void *ptr
= fw
->data
;
3479 const struct zfile_header
*h
= ptr
;
3480 const struct zfile_config
*c
, *cs
;
3481 const struct zfile_block
*b
, *bs
;
3482 unsigned int a
, tmp
, len
= fw
->size
;
3483 #define BAD_FW KERN_ERR "Bad firmware: "
3484 if (len
< sizeof(*h
)) {
3485 printk(BAD_FW
"too short: %u<%zu\n", len
, sizeof(*h
));
3489 cs
= ptr
+ h
->config_offset
;
3490 bs
= ptr
+ h
->block_offset
;
3492 if ((void *)(cs
+ h
->n_config
) > ptr
+ len
||
3493 (void *)(bs
+ h
->n_blocks
) > ptr
+ len
) {
3494 printk(BAD_FW
"too short");
3498 if (cyc_isfwstr(h
->name
, sizeof(h
->name
)) ||
3499 cyc_isfwstr(h
->date
, sizeof(h
->date
))) {
3500 printk(BAD_FW
"bad formatted header string\n");
3504 if (strncmp(name
, h
->name
, sizeof(h
->name
))) {
3505 printk(BAD_FW
"bad name '%s' (expected '%s')\n", h
->name
, name
);
3510 for (c
= cs
; c
< cs
+ h
->n_config
; c
++) {
3511 for (a
= 0; a
< c
->n_blocks
; a
++)
3512 if (c
->block_list
[a
] > h
->n_blocks
) {
3513 printk(BAD_FW
"bad block ref number in cfgs\n");
3516 if (c
->mailbox
== mailbox
&& c
->function
== 0) /* 0 is normal */
3520 printk(BAD_FW
"nothing appropriate\n");
3524 for (b
= bs
; b
< bs
+ h
->n_blocks
; b
++)
3525 if (b
->file_offset
+ b
->size
> len
) {
3526 printk(BAD_FW
"bad block data offset\n");
3530 /* everything is OK, let's seek'n'load it */
3531 for (c
= cs
; c
< cs
+ h
->n_config
; c
++)
3532 if (c
->mailbox
== mailbox
&& c
->function
== 0)
3535 for (a
= 0; a
< c
->n_blocks
; a
++) {
3536 b
= &bs
[c
->block_list
[a
]];
3537 if (b
->type
== ZBLOCK_FPGA
) {
3539 cyz_fpga_copy(fpga
, ptr
+ b
->file_offset
,
3543 memcpy_toio(base
+ b
->ram_offset
,
3544 ptr
+ b
->file_offset
, b
->size
);
3551 static int __devinit
cyz_load_fw(struct pci_dev
*pdev
, void __iomem
*base_addr
,
3552 struct RUNTIME_9060 __iomem
*ctl_addr
, int irq
)
3554 const struct firmware
*fw
;
3555 struct FIRM_ID __iomem
*fid
= base_addr
+ ID_ADDRESS
;
3556 struct CUSTOM_REG __iomem
*cust
= base_addr
;
3557 struct ZFW_CTRL __iomem
*pt_zfwctrl
;
3559 u32 mailbox
, status
, nchan
;
3563 retval
= request_firmware(&fw
, "cyzfirm.bin", &pdev
->dev
);
3565 dev_err(&pdev
->dev
, "can't get firmware\n");
3569 /* Check whether the firmware is already loaded and running. If
3570 positive, skip this board */
3571 if (__cyz_fpga_loaded(ctl_addr
) && readl(&fid
->signature
) == ZFIRM_ID
) {
3572 u32 cntval
= readl(base_addr
+ 0x190);
3575 if (cntval
!= readl(base_addr
+ 0x190)) {
3576 /* FW counter is working, FW is running */
3577 dev_dbg(&pdev
->dev
, "Cyclades-Z FW already loaded. "
3578 "Skipping board.\n");
3585 cy_writel(&ctl_addr
->intr_ctrl_stat
, readl(&ctl_addr
->intr_ctrl_stat
) &
3588 mailbox
= readl(&ctl_addr
->mail_box_0
);
3590 if (mailbox
== 0 || __cyz_fpga_loaded(ctl_addr
)) {
3591 /* stops CPU and set window to beginning of RAM */
3592 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3593 cy_writel(&cust
->cpu_stop
, 0);
3594 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3598 plx_init(pdev
, irq
, ctl_addr
);
3602 retval
= __cyz_load_fw(fw
, "Cyclom-Z", mailbox
, NULL
,
3606 if (!__cyz_fpga_loaded(ctl_addr
)) {
3607 dev_err(&pdev
->dev
, "fw upload successful, but fw is "
3613 /* stops CPU and set window to beginning of RAM */
3614 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3615 cy_writel(&cust
->cpu_stop
, 0);
3616 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3620 for (tmp
= base_addr
; tmp
< base_addr
+ RAM_SIZE
; tmp
++)
3621 cy_writeb(tmp
, 255);
3623 /* set window to last 512K of RAM */
3624 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
+ RAM_SIZE
);
3625 for (tmp
= base_addr
; tmp
< base_addr
+ RAM_SIZE
; tmp
++)
3626 cy_writeb(tmp
, 255);
3627 /* set window to beginning of RAM */
3628 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3631 retval
= __cyz_load_fw(fw
, "Cyclom-Z", mailbox
, base_addr
, NULL
);
3632 release_firmware(fw
);
3636 /* finish boot and start boards */
3637 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3638 cy_writel(&cust
->cpu_start
, 0);
3639 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3641 while ((status
= readl(&fid
->signature
)) != ZFIRM_ID
&& i
++ < 40)
3643 if (status
!= ZFIRM_ID
) {
3644 if (status
== ZFIRM_HLT
) {
3645 dev_err(&pdev
->dev
, "you need an external power supply "
3646 "for this number of ports. Firmware halted and "
3651 dev_warn(&pdev
->dev
, "fid->signature = 0x%x... Waiting "
3652 "some more time\n", status
);
3653 while ((status
= readl(&fid
->signature
)) != ZFIRM_ID
&&
3656 if (status
!= ZFIRM_ID
) {
3657 dev_err(&pdev
->dev
, "Board not started in 20 seconds! "
3658 "Giving up. (fid->signature = 0x%x)\n",
3660 dev_info(&pdev
->dev
, "*** Warning ***: if you are "
3661 "upgrading the FW, please power cycle the "
3662 "system before loading the new FW to the "
3665 if (__cyz_fpga_loaded(ctl_addr
))
3666 plx_init(pdev
, irq
, ctl_addr
);
3671 dev_dbg(&pdev
->dev
, "Firmware started after %d seconds.\n",
3674 pt_zfwctrl
= base_addr
+ readl(&fid
->zfwctrl_addr
);
3676 dev_dbg(&pdev
->dev
, "fid=> %p, zfwctrl_addr=> %x, npt_zfwctrl=> %p\n",
3677 base_addr
+ ID_ADDRESS
, readl(&fid
->zfwctrl_addr
),
3678 base_addr
+ readl(&fid
->zfwctrl_addr
));
3680 nchan
= readl(&pt_zfwctrl
->board_ctrl
.n_channel
);
3681 dev_info(&pdev
->dev
, "Cyclades-Z FW loaded: version = %x, ports = %u\n",
3682 readl(&pt_zfwctrl
->board_ctrl
.fw_version
), nchan
);
3685 dev_warn(&pdev
->dev
, "no Cyclades-Z ports were found. Please "
3686 "check the connection between the Z host card and the "
3687 "serial expanders.\n");
3689 if (__cyz_fpga_loaded(ctl_addr
))
3690 plx_init(pdev
, irq
, ctl_addr
);
3692 dev_info(&pdev
->dev
, "Null number of ports detected. Board "
3698 cy_writel(&pt_zfwctrl
->board_ctrl
.op_system
, C_OS_LINUX
);
3699 cy_writel(&pt_zfwctrl
->board_ctrl
.dr_version
, DRIVER_VERSION
);
3702 Early firmware failed to start looking for commands.
3703 This enables firmware interrupts for those commands.
3705 cy_writel(&ctl_addr
->intr_ctrl_stat
, readl(&ctl_addr
->intr_ctrl_stat
) |
3707 cy_writel(&ctl_addr
->intr_ctrl_stat
, readl(&ctl_addr
->intr_ctrl_stat
) |
3712 release_firmware(fw
);
3717 static int __devinit
cy_pci_probe(struct pci_dev
*pdev
,
3718 const struct pci_device_id
*ent
)
3720 void __iomem
*addr0
= NULL
, *addr2
= NULL
;
3721 char *card_name
= NULL
;
3722 u32
uninitialized_var(mailbox
);
3723 unsigned int device_id
, nchan
= 0, card_no
, i
;
3724 unsigned char plx_ver
;
3727 retval
= pci_enable_device(pdev
);
3729 dev_err(&pdev
->dev
, "cannot enable device\n");
3733 /* read PCI configuration area */
3735 device_id
= pdev
->device
& ~PCI_DEVICE_ID_MASK
;
3737 #if defined(__alpha__)
3738 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
) { /* below 1M? */
3739 dev_err(&pdev
->dev
, "Cyclom-Y/PCI not supported for low "
3740 "addresses on Alpha systems.\n");
3745 if (device_id
== PCI_DEVICE_ID_CYCLOM_Z_Lo
) {
3746 dev_err(&pdev
->dev
, "Cyclades-Z/PCI not supported for low "
3752 if (pci_resource_flags(pdev
, 2) & IORESOURCE_IO
) {
3753 dev_warn(&pdev
->dev
, "PCI I/O bit incorrectly set. Ignoring "
3755 pdev
->resource
[2].flags
&= ~IORESOURCE_IO
;
3758 retval
= pci_request_regions(pdev
, "cyclades");
3760 dev_err(&pdev
->dev
, "failed to reserve resources\n");
3765 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
||
3766 device_id
== PCI_DEVICE_ID_CYCLOM_Y_Hi
) {
3767 card_name
= "Cyclom-Y";
3769 addr0
= ioremap_nocache(pci_resource_start(pdev
, 0),
3771 if (addr0
== NULL
) {
3772 dev_err(&pdev
->dev
, "can't remap ctl region\n");
3775 addr2
= ioremap_nocache(pci_resource_start(pdev
, 2),
3777 if (addr2
== NULL
) {
3778 dev_err(&pdev
->dev
, "can't remap base region\n");
3782 nchan
= CyPORTS_PER_CHIP
* cyy_init_card(addr2
, 1);
3784 dev_err(&pdev
->dev
, "Cyclom-Y PCI host card with no "
3785 "Serial-Modules\n");
3788 } else if (device_id
== PCI_DEVICE_ID_CYCLOM_Z_Hi
) {
3789 struct RUNTIME_9060 __iomem
*ctl_addr
;
3791 ctl_addr
= addr0
= ioremap_nocache(pci_resource_start(pdev
, 0),
3793 if (addr0
== NULL
) {
3794 dev_err(&pdev
->dev
, "can't remap ctl region\n");
3798 /* Disable interrupts on the PLX before resetting it */
3799 cy_writew(&ctl_addr
->intr_ctrl_stat
,
3800 readw(&ctl_addr
->intr_ctrl_stat
) & ~0x0900);
3802 plx_init(pdev
, irq
, addr0
);
3804 mailbox
= readl(&ctl_addr
->mail_box_0
);
3806 addr2
= ioremap_nocache(pci_resource_start(pdev
, 2),
3807 mailbox
== ZE_V1
? CyPCI_Ze_win
: CyPCI_Zwin
);
3808 if (addr2
== NULL
) {
3809 dev_err(&pdev
->dev
, "can't remap base region\n");
3813 if (mailbox
== ZE_V1
) {
3814 card_name
= "Cyclades-Ze";
3816 card_name
= "Cyclades-8Zo";
3818 if (mailbox
== ZO_V1
) {
3819 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3820 dev_info(&pdev
->dev
, "Cyclades-8Zo/PCI: FPGA "
3821 "id %lx, ver %lx\n", (ulong
)(0xff &
3822 readl(&((struct CUSTOM_REG
*)addr2
)->
3823 fpga_id
)), (ulong
)(0xff &
3824 readl(&((struct CUSTOM_REG
*)addr2
)->
3826 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3828 dev_info(&pdev
->dev
, "Cyclades-Z/PCI: New "
3829 "Cyclades-Z board. FPGA not loaded\n");
3832 /* The following clears the firmware id word. This
3833 ensures that the driver will not attempt to talk to
3834 the board until it has been properly initialized.
3836 if ((mailbox
== ZO_V1
) || (mailbox
== ZO_V2
))
3837 cy_writel(addr2
+ ID_ADDRESS
, 0L);
3840 retval
= cyz_load_fw(pdev
, addr2
, addr0
, irq
);
3846 if ((cy_next_channel
+ nchan
) > NR_PORTS
) {
3847 dev_err(&pdev
->dev
, "Cyclades-8Zo/PCI found, but no "
3848 "channels are available. Change NR_PORTS in "
3849 "cyclades.c and recompile kernel.\n");
3852 /* fill the next cy_card structure available */
3853 for (card_no
= 0; card_no
< NR_CARDS
; card_no
++) {
3854 if (cy_card
[card_no
].base_addr
== NULL
)
3857 if (card_no
== NR_CARDS
) { /* no more cy_cards available */
3858 dev_err(&pdev
->dev
, "Cyclades-8Zo/PCI found, but no "
3859 "more cards can be used. Change NR_CARDS in "
3860 "cyclades.c and recompile kernel.\n");
3864 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
||
3865 device_id
== PCI_DEVICE_ID_CYCLOM_Y_Hi
) {
3867 retval
= request_irq(irq
, cyy_interrupt
,
3868 IRQF_SHARED
, "Cyclom-Y", &cy_card
[card_no
]);
3870 dev_err(&pdev
->dev
, "could not allocate IRQ\n");
3873 cy_card
[card_no
].num_chips
= nchan
/ CyPORTS_PER_CHIP
;
3875 struct FIRM_ID __iomem
*firm_id
= addr2
+ ID_ADDRESS
;
3876 struct ZFW_CTRL __iomem
*zfw_ctrl
;
3878 zfw_ctrl
= addr2
+ (readl(&firm_id
->zfwctrl_addr
) & 0xfffff);
3880 cy_card
[card_no
].hw_ver
= mailbox
;
3881 cy_card
[card_no
].num_chips
= (unsigned int)-1;
3882 cy_card
[card_no
].board_ctrl
= &zfw_ctrl
->board_ctrl
;
3883 #ifdef CONFIG_CYZ_INTR
3884 /* allocate IRQ only if board has an IRQ */
3885 if (irq
!= 0 && irq
!= 255) {
3886 retval
= request_irq(irq
, cyz_interrupt
,
3887 IRQF_SHARED
, "Cyclades-Z",
3890 dev_err(&pdev
->dev
, "could not allocate IRQ\n");
3894 #endif /* CONFIG_CYZ_INTR */
3898 cy_card
[card_no
].base_addr
= addr2
;
3899 cy_card
[card_no
].ctl_addr
.p9050
= addr0
;
3900 cy_card
[card_no
].irq
= irq
;
3901 cy_card
[card_no
].bus_index
= 1;
3902 cy_card
[card_no
].first_line
= cy_next_channel
;
3903 cy_card
[card_no
].nports
= nchan
;
3904 retval
= cy_init_card(&cy_card
[card_no
]);
3908 pci_set_drvdata(pdev
, &cy_card
[card_no
]);
3910 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
||
3911 device_id
== PCI_DEVICE_ID_CYCLOM_Y_Hi
) {
3912 /* enable interrupts in the PCI interface */
3913 plx_ver
= readb(addr2
+ CyPLX_VER
) & 0x0f;
3916 cy_writeb(addr0
+ 0x4c, 0x43);
3921 default: /* Old boards, use PLX_9060 */
3923 struct RUNTIME_9060 __iomem
*ctl_addr
= addr0
;
3924 plx_init(pdev
, irq
, ctl_addr
);
3925 cy_writew(&ctl_addr
->intr_ctrl_stat
,
3926 readw(&ctl_addr
->intr_ctrl_stat
) | 0x0900);
3932 dev_info(&pdev
->dev
, "%s/PCI #%d found: %d channels starting from "
3933 "port %d.\n", card_name
, card_no
+ 1, nchan
, cy_next_channel
);
3934 for (i
= cy_next_channel
; i
< cy_next_channel
+ nchan
; i
++)
3935 tty_register_device(cy_serial_driver
, i
, &pdev
->dev
);
3936 cy_next_channel
+= nchan
;
3940 cy_card
[card_no
].base_addr
= NULL
;
3941 free_irq(irq
, &cy_card
[card_no
]);
3947 pci_release_regions(pdev
);
3949 pci_disable_device(pdev
);
3954 static void __devexit
cy_pci_remove(struct pci_dev
*pdev
)
3956 struct cyclades_card
*cinfo
= pci_get_drvdata(pdev
);
3959 /* non-Z with old PLX */
3960 if (!cy_is_Z(cinfo
) && (readb(cinfo
->base_addr
+ CyPLX_VER
) & 0x0f) ==
3962 cy_writeb(cinfo
->ctl_addr
.p9050
+ 0x4c, 0);
3964 #ifndef CONFIG_CYZ_INTR
3965 if (!cy_is_Z(cinfo
))
3967 cy_writew(&cinfo
->ctl_addr
.p9060
->intr_ctrl_stat
,
3968 readw(&cinfo
->ctl_addr
.p9060
->intr_ctrl_stat
) &
3971 iounmap(cinfo
->base_addr
);
3972 if (cinfo
->ctl_addr
.p9050
)
3973 iounmap(cinfo
->ctl_addr
.p9050
);
3975 #ifndef CONFIG_CYZ_INTR
3977 #endif /* CONFIG_CYZ_INTR */
3979 free_irq(cinfo
->irq
, cinfo
);
3980 pci_release_regions(pdev
);
3982 cinfo
->base_addr
= NULL
;
3983 for (i
= cinfo
->first_line
; i
< cinfo
->first_line
+
3985 tty_unregister_device(cy_serial_driver
, i
);
3987 kfree(cinfo
->ports
);
3990 static struct pci_driver cy_pci_driver
= {
3992 .id_table
= cy_pci_dev_id
,
3993 .probe
= cy_pci_probe
,
3994 .remove
= __devexit_p(cy_pci_remove
)
3998 static int cyclades_proc_show(struct seq_file
*m
, void *v
)
4000 struct cyclades_port
*info
;
4002 __u32 cur_jifs
= jiffies
;
4004 seq_puts(m
, "Dev TimeOpen BytesOut IdleOut BytesIn "
4005 "IdleIn Overruns Ldisc\n");
4007 /* Output one line for each known port */
4008 for (i
= 0; i
< NR_CARDS
; i
++)
4009 for (j
= 0; j
< cy_card
[i
].nports
; j
++) {
4010 info
= &cy_card
[i
].ports
[j
];
4012 if (info
->port
.count
) {
4013 /* XXX is the ldisc num worth this? */
4014 struct tty_struct
*tty
;
4015 struct tty_ldisc
*ld
;
4017 tty
= tty_port_tty_get(&info
->port
);
4019 ld
= tty_ldisc_ref(tty
);
4022 tty_ldisc_deref(ld
);
4026 seq_printf(m
, "%3d %8lu %10lu %8lu "
4027 "%10lu %8lu %9lu %6d\n", info
->line
,
4028 (cur_jifs
- info
->idle_stats
.in_use
) /
4029 HZ
, info
->idle_stats
.xmit_bytes
,
4030 (cur_jifs
- info
->idle_stats
.xmit_idle
)/
4031 HZ
, info
->idle_stats
.recv_bytes
,
4032 (cur_jifs
- info
->idle_stats
.recv_idle
)/
4033 HZ
, info
->idle_stats
.overruns
,
4036 seq_printf(m
, "%3d %8lu %10lu %8lu "
4037 "%10lu %8lu %9lu %6ld\n",
4038 info
->line
, 0L, 0L, 0L, 0L, 0L, 0L, 0L);
4043 static int cyclades_proc_open(struct inode
*inode
, struct file
*file
)
4045 return single_open(file
, cyclades_proc_show
, NULL
);
4048 static const struct file_operations cyclades_proc_fops
= {
4049 .owner
= THIS_MODULE
,
4050 .open
= cyclades_proc_open
,
4052 .llseek
= seq_lseek
,
4053 .release
= single_release
,
4056 /* The serial driver boot-time initialization code!
4057 Hardware I/O ports are mapped to character special devices on a
4058 first found, first allocated manner. That is, this code searches
4059 for Cyclom cards in the system. As each is found, it is probed
4060 to discover how many chips (and thus how many ports) are present.
4061 These ports are mapped to the tty ports 32 and upward in monotonic
4062 fashion. If an 8-port card is replaced with a 16-port card, the
4063 port mapping on a following card will shift.
4065 This approach is different from what is used in the other serial
4066 device driver because the Cyclom is more properly a multiplexer,
4067 not just an aggregation of serial ports on one card.
4069 If there are more cards with more ports than have been
4070 statically allocated above, a warning is printed and the
4071 extra ports are ignored.
4074 static const struct tty_operations cy_ops
= {
4078 .put_char
= cy_put_char
,
4079 .flush_chars
= cy_flush_chars
,
4080 .write_room
= cy_write_room
,
4081 .chars_in_buffer
= cy_chars_in_buffer
,
4082 .flush_buffer
= cy_flush_buffer
,
4084 .throttle
= cy_throttle
,
4085 .unthrottle
= cy_unthrottle
,
4086 .set_termios
= cy_set_termios
,
4089 .hangup
= cy_hangup
,
4090 .break_ctl
= cy_break
,
4091 .wait_until_sent
= cy_wait_until_sent
,
4092 .tiocmget
= cy_tiocmget
,
4093 .tiocmset
= cy_tiocmset
,
4094 .proc_fops
= &cyclades_proc_fops
,
4097 static int __init
cy_init(void)
4099 unsigned int nboards
;
4100 int retval
= -ENOMEM
;
4102 cy_serial_driver
= alloc_tty_driver(NR_PORTS
);
4103 if (!cy_serial_driver
)
4106 printk(KERN_INFO
"Cyclades driver " CY_VERSION
" (built %s %s)\n",
4107 __DATE__
, __TIME__
);
4109 /* Initialize the tty_driver structure */
4111 cy_serial_driver
->owner
= THIS_MODULE
;
4112 cy_serial_driver
->driver_name
= "cyclades";
4113 cy_serial_driver
->name
= "ttyC";
4114 cy_serial_driver
->major
= CYCLADES_MAJOR
;
4115 cy_serial_driver
->minor_start
= 0;
4116 cy_serial_driver
->type
= TTY_DRIVER_TYPE_SERIAL
;
4117 cy_serial_driver
->subtype
= SERIAL_TYPE_NORMAL
;
4118 cy_serial_driver
->init_termios
= tty_std_termios
;
4119 cy_serial_driver
->init_termios
.c_cflag
=
4120 B9600
| CS8
| CREAD
| HUPCL
| CLOCAL
;
4121 cy_serial_driver
->flags
= TTY_DRIVER_REAL_RAW
| TTY_DRIVER_DYNAMIC_DEV
;
4122 tty_set_operations(cy_serial_driver
, &cy_ops
);
4124 retval
= tty_register_driver(cy_serial_driver
);
4126 printk(KERN_ERR
"Couldn't register Cyclades serial driver\n");
4130 /* the code below is responsible to find the boards. Each different
4131 type of board has its own detection routine. If a board is found,
4132 the next cy_card structure available is set by the detection
4133 routine. These functions are responsible for checking the
4134 availability of cy_card and cy_port data structures and updating
4135 the cy_next_channel. */
4137 /* look for isa boards */
4138 nboards
= cy_detect_isa();
4141 /* look for pci boards */
4142 retval
= pci_register_driver(&cy_pci_driver
);
4143 if (retval
&& !nboards
) {
4144 tty_unregister_driver(cy_serial_driver
);
4151 put_tty_driver(cy_serial_driver
);
4156 static void __exit
cy_cleanup_module(void)
4158 struct cyclades_card
*card
;
4161 #ifndef CONFIG_CYZ_INTR
4162 del_timer_sync(&cyz_timerlist
);
4163 #endif /* CONFIG_CYZ_INTR */
4165 e1
= tty_unregister_driver(cy_serial_driver
);
4167 printk(KERN_ERR
"failed to unregister Cyclades serial "
4168 "driver(%d)\n", e1
);
4171 pci_unregister_driver(&cy_pci_driver
);
4174 for (i
= 0; i
< NR_CARDS
; i
++) {
4176 if (card
->base_addr
) {
4177 /* clear interrupt */
4178 cy_writeb(card
->base_addr
+ Cy_ClrIntr
, 0);
4179 iounmap(card
->base_addr
);
4180 if (card
->ctl_addr
.p9050
)
4181 iounmap(card
->ctl_addr
.p9050
);
4183 #ifndef CONFIG_CYZ_INTR
4185 #endif /* CONFIG_CYZ_INTR */
4187 free_irq(card
->irq
, card
);
4188 for (e1
= card
->first_line
; e1
< card
->first_line
+
4190 tty_unregister_device(cy_serial_driver
, e1
);
4195 put_tty_driver(cy_serial_driver
);
4196 } /* cy_cleanup_module */
4198 module_init(cy_init
);
4199 module_exit(cy_cleanup_module
);
4201 MODULE_LICENSE("GPL");
4202 MODULE_VERSION(CY_VERSION
);
4203 MODULE_ALIAS_CHARDEV_MAJOR(CYCLADES_MAJOR
);