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_throttle(struct tty_struct
*tty
);
94 static void cy_send_xchar(struct tty_struct
*tty
, char ch
);
96 #ifndef SERIAL_XMIT_SIZE
97 #define SERIAL_XMIT_SIZE (min(PAGE_SIZE, 4096))
100 #define STD_COM_FLAGS (0)
103 #define ZL_MAX_BLOCKS 16
104 #define DRIVER_VERSION 0x02010203
105 #define RAM_SIZE 0x80000
112 struct zfile_header
{
121 } __attribute__ ((packed
));
123 struct zfile_config
{
128 u32 block_list
[ZL_MAX_BLOCKS
];
129 } __attribute__ ((packed
));
136 } __attribute__ ((packed
));
138 static struct tty_driver
*cy_serial_driver
;
141 /* This is the address lookup table. The driver will probe for
142 Cyclom-Y/ISA boards at all addresses in here. If you want the
143 driver to probe addresses at a different address, add it to
144 this table. If the driver is probing some other board and
145 causing problems, remove the offending address from this table.
148 static unsigned int cy_isa_addresses
[] = {
157 0, 0, 0, 0, 0, 0, 0, 0
160 #define NR_ISA_ADDRS ARRAY_SIZE(cy_isa_addresses)
163 static long maddr
[NR_CARDS
];
164 static int irq
[NR_CARDS
];
166 module_param_array(maddr
, long, NULL
, 0);
167 module_param_array(irq
, int, NULL
, 0);
170 #endif /* CONFIG_ISA */
172 /* This is the per-card data structure containing address, irq, number of
173 channels, etc. This driver supports a maximum of NR_CARDS cards.
175 static struct cyclades_card cy_card
[NR_CARDS
];
177 static int cy_next_channel
; /* next minor available */
180 * This is used to look up the divisor speeds and the timeouts
181 * We're normally limited to 15 distinct baud rates. The extra
182 * are accessed via settings in info->port.flags.
183 * 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
184 * 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
188 static const int baud_table
[] = {
189 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
190 1800, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200, 150000,
194 static const char baud_co_25
[] = { /* 25 MHz clock option table */
195 /* value => 00 01 02 03 04 */
196 /* divide by 8 32 128 512 2048 */
197 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02,
198 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
201 static const char baud_bpr_25
[] = { /* 25 MHz baud rate period table */
202 0x00, 0xf5, 0xa3, 0x6f, 0x5c, 0x51, 0xf5, 0xa3, 0x51, 0xa3,
203 0x6d, 0x51, 0xa3, 0x51, 0xa3, 0x51, 0x36, 0x29, 0x1b, 0x15
206 static const char baud_co_60
[] = { /* 60 MHz clock option table (CD1400 J) */
207 /* value => 00 01 02 03 04 */
208 /* divide by 8 32 128 512 2048 */
209 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03,
210 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
214 static const char baud_bpr_60
[] = { /* 60 MHz baud rate period table (CD1400 J) */
215 0x00, 0x82, 0x21, 0xff, 0xdb, 0xc3, 0x92, 0x62, 0xc3, 0x62,
216 0x41, 0xc3, 0x62, 0xc3, 0x62, 0xc3, 0x82, 0x62, 0x41, 0x32,
220 static const char baud_cor3
[] = { /* receive threshold */
221 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
222 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07,
227 * The Cyclades driver implements HW flow control as any serial driver.
228 * The cyclades_port structure member rflow and the vector rflow_thr
229 * allows us to take advantage of a special feature in the CD1400 to avoid
230 * data loss even when the system interrupt latency is too high. These flags
231 * are to be used only with very special applications. Setting these flags
232 * requires the use of a special cable (DTR and RTS reversed). In the new
233 * CD1400-based boards (rev. 6.00 or later), there is no need for special
237 static const char rflow_thr
[] = { /* rflow threshold */
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
243 /* The Cyclom-Ye has placed the sequential chips in non-sequential
244 * address order. This look-up table overcomes that problem.
246 static const unsigned int cy_chip_offset
[] = { 0x0000,
256 /* PCI related definitions */
259 static const struct pci_device_id cy_pci_dev_id
[] = {
261 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_Y_Lo
) },
263 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_Y_Hi
) },
265 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_4Y_Lo
) },
267 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_4Y_Hi
) },
269 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_8Y_Lo
) },
271 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_8Y_Hi
) },
273 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_Z_Lo
) },
275 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES
, PCI_DEVICE_ID_CYCLOM_Z_Hi
) },
276 { } /* end of table */
278 MODULE_DEVICE_TABLE(pci
, cy_pci_dev_id
);
281 static void cy_start(struct tty_struct
*);
282 static void cy_set_line_char(struct cyclades_port
*, struct tty_struct
*);
283 static int cyz_issue_cmd(struct cyclades_card
*, __u32
, __u8
, __u32
);
285 static unsigned detect_isa_irq(void __iomem
*);
286 #endif /* CONFIG_ISA */
288 #ifndef CONFIG_CYZ_INTR
289 static void cyz_poll(unsigned long);
291 /* The Cyclades-Z polling cycle is defined by this variable */
292 static long cyz_polling_cycle
= CZ_DEF_POLL
;
294 static DEFINE_TIMER(cyz_timerlist
, cyz_poll
, 0, 0);
296 #else /* CONFIG_CYZ_INTR */
297 static void cyz_rx_restart(unsigned long);
298 static struct timer_list cyz_rx_full_timer
[NR_PORTS
];
299 #endif /* CONFIG_CYZ_INTR */
301 static inline bool cy_is_Z(struct cyclades_card
*card
)
303 return card
->num_chips
== (unsigned int)-1;
306 static inline bool __cyz_fpga_loaded(struct RUNTIME_9060 __iomem
*ctl_addr
)
308 return readl(&ctl_addr
->init_ctrl
) & (1 << 17);
311 static inline bool cyz_fpga_loaded(struct cyclades_card
*card
)
313 return __cyz_fpga_loaded(card
->ctl_addr
.p9060
);
316 static inline bool cyz_is_loaded(struct cyclades_card
*card
)
318 struct FIRM_ID __iomem
*fw_id
= card
->base_addr
+ ID_ADDRESS
;
320 return (card
->hw_ver
== ZO_V1
|| cyz_fpga_loaded(card
)) &&
321 readl(&fw_id
->signature
) == ZFIRM_ID
;
324 static inline int serial_paranoia_check(struct cyclades_port
*info
,
325 const char *name
, const char *routine
)
327 #ifdef SERIAL_PARANOIA_CHECK
329 printk(KERN_WARNING
"cyc Warning: null cyclades_port for (%s) "
330 "in %s\n", name
, routine
);
334 if (info
->magic
!= CYCLADES_MAGIC
) {
335 printk(KERN_WARNING
"cyc Warning: bad magic number for serial "
336 "struct (%s) in %s\n", name
, routine
);
343 /***********************************************************/
344 /********* Start of block of Cyclom-Y specific code ********/
346 /* This routine waits up to 1000 micro-seconds for the previous
347 command to the Cirrus chip to complete and then issues the
348 new command. An error is returned if the previous command
349 didn't finish within the time limit.
351 This function is only called from inside spinlock-protected code.
353 static int cyy_issue_cmd(void __iomem
*base_addr
, u_char cmd
, int index
)
357 /* Check to see that the previous command has completed */
358 for (i
= 0; i
< 100; i
++) {
359 if (readb(base_addr
+ (CyCCR
<< index
)) == 0)
363 /* if the CCR never cleared, the previous command
364 didn't finish within the "reasonable time" */
368 /* Issue the new command */
369 cy_writeb(base_addr
+ (CyCCR
<< index
), cmd
);
372 } /* cyy_issue_cmd */
375 /* ISA interrupt detection code */
376 static unsigned detect_isa_irq(void __iomem
*address
)
379 unsigned long irqs
, flags
;
380 int save_xir
, save_car
;
381 int index
= 0; /* IRQ probing is only for ISA */
383 /* forget possible initially masked and pending IRQ */
384 irq
= probe_irq_off(probe_irq_on());
386 /* Clear interrupts on the board first */
387 cy_writeb(address
+ (Cy_ClrIntr
<< index
), 0);
388 /* Cy_ClrIntr is 0x1800 */
390 irqs
= probe_irq_on();
394 /* Enable the Tx interrupts on the CD1400 */
395 local_irq_save(flags
);
396 cy_writeb(address
+ (CyCAR
<< index
), 0);
397 cyy_issue_cmd(address
, CyCHAN_CTL
| CyENB_XMTR
, index
);
399 cy_writeb(address
+ (CyCAR
<< index
), 0);
400 cy_writeb(address
+ (CySRER
<< index
),
401 readb(address
+ (CySRER
<< index
)) | CyTxRdy
);
402 local_irq_restore(flags
);
407 /* Check which interrupt is in use */
408 irq
= probe_irq_off(irqs
);
411 save_xir
= (u_char
) readb(address
+ (CyTIR
<< index
));
412 save_car
= readb(address
+ (CyCAR
<< index
));
413 cy_writeb(address
+ (CyCAR
<< index
), (save_xir
& 0x3));
414 cy_writeb(address
+ (CySRER
<< index
),
415 readb(address
+ (CySRER
<< index
)) & ~CyTxRdy
);
416 cy_writeb(address
+ (CyTIR
<< index
), (save_xir
& 0x3f));
417 cy_writeb(address
+ (CyCAR
<< index
), (save_car
));
418 cy_writeb(address
+ (Cy_ClrIntr
<< index
), 0);
419 /* Cy_ClrIntr is 0x1800 */
421 return (irq
> 0) ? irq
: 0;
423 #endif /* CONFIG_ISA */
425 static void cyy_chip_rx(struct cyclades_card
*cinfo
, int chip
,
426 void __iomem
*base_addr
)
428 struct cyclades_port
*info
;
429 struct tty_struct
*tty
;
430 int len
, index
= cinfo
->bus_index
;
431 u8 save_xir
, channel
, save_car
, data
, char_count
;
433 #ifdef CY_DEBUG_INTERRUPTS
434 printk(KERN_DEBUG
"cyy_interrupt: rcvd intr, chip %d\n", chip
);
436 /* determine the channel & change to that context */
437 save_xir
= readb(base_addr
+ (CyRIR
<< index
));
438 channel
= save_xir
& CyIRChannel
;
439 info
= &cinfo
->ports
[channel
+ chip
* 4];
440 save_car
= readb(base_addr
+ (CyCAR
<< index
));
441 cy_writeb(base_addr
+ (CyCAR
<< index
), save_xir
);
443 tty
= tty_port_tty_get(&info
->port
);
444 /* if there is nowhere to put the data, discard it */
446 if ((readb(base_addr
+ (CyRIVR
<< index
)) & CyIVRMask
) ==
447 CyIVRRxEx
) { /* exception */
448 data
= readb(base_addr
+ (CyRDSR
<< index
));
449 } else { /* normal character reception */
450 char_count
= readb(base_addr
+ (CyRDCR
<< index
));
452 data
= readb(base_addr
+ (CyRDSR
<< index
));
456 /* there is an open port for this data */
457 if ((readb(base_addr
+ (CyRIVR
<< index
)) & CyIVRMask
) ==
458 CyIVRRxEx
) { /* exception */
459 data
= readb(base_addr
+ (CyRDSR
<< index
));
461 /* For statistics only */
464 else if (data
& CyFRAME
)
465 info
->icount
.frame
++;
466 else if (data
& CyPARITY
)
467 info
->icount
.parity
++;
468 else if (data
& CyOVERRUN
)
469 info
->icount
.overrun
++;
471 if (data
& info
->ignore_status_mask
) {
476 if (tty_buffer_request_room(tty
, 1)) {
477 if (data
& info
->read_status_mask
) {
478 if (data
& CyBREAK
) {
479 tty_insert_flip_char(tty
,
480 readb(base_addr
+ (CyRDSR
<<
483 if (info
->port
.flags
& ASYNC_SAK
)
485 } else if (data
& CyFRAME
) {
486 tty_insert_flip_char(tty
,
487 readb(base_addr
+ (CyRDSR
<<
490 info
->idle_stats
.frame_errs
++;
491 } else if (data
& CyPARITY
) {
492 /* Pieces of seven... */
493 tty_insert_flip_char(tty
,
494 readb(base_addr
+ (CyRDSR
<<
495 index
)), TTY_PARITY
);
497 info
->idle_stats
.parity_errs
++;
498 } else if (data
& CyOVERRUN
) {
499 tty_insert_flip_char(tty
, 0,
502 /* If the flip buffer itself is
503 overflowing, we still lose
504 the next incoming character.
506 tty_insert_flip_char(tty
,
507 readb(base_addr
+ (CyRDSR
<<
510 info
->idle_stats
.overruns
++;
511 /* These two conditions may imply */
512 /* a normal read should be done. */
513 /* } else if(data & CyTIMEOUT) { */
514 /* } else if(data & CySPECHAR) { */
516 tty_insert_flip_char(tty
, 0,
521 tty_insert_flip_char(tty
, 0, TTY_NORMAL
);
525 /* there was a software buffer overrun and nothing
526 * could be done about it!!! */
527 info
->icount
.buf_overrun
++;
528 info
->idle_stats
.overruns
++;
530 } else { /* normal character reception */
531 /* load # chars available from the chip */
532 char_count
= readb(base_addr
+ (CyRDCR
<< index
));
534 #ifdef CY_ENABLE_MONITORING
535 ++info
->mon
.int_count
;
536 info
->mon
.char_count
+= char_count
;
537 if (char_count
> info
->mon
.char_max
)
538 info
->mon
.char_max
= char_count
;
539 info
->mon
.char_last
= char_count
;
541 len
= tty_buffer_request_room(tty
, char_count
);
543 data
= readb(base_addr
+ (CyRDSR
<< index
));
544 tty_insert_flip_char(tty
, data
, TTY_NORMAL
);
545 info
->idle_stats
.recv_bytes
++;
551 info
->idle_stats
.recv_idle
= jiffies
;
553 tty_schedule_flip(tty
);
557 cy_writeb(base_addr
+ (CyRIR
<< index
), save_xir
& 0x3f);
558 cy_writeb(base_addr
+ (CyCAR
<< index
), save_car
);
561 static void cyy_chip_tx(struct cyclades_card
*cinfo
, unsigned int chip
,
562 void __iomem
*base_addr
)
564 struct cyclades_port
*info
;
565 struct tty_struct
*tty
;
566 int char_count
, index
= cinfo
->bus_index
;
567 u8 save_xir
, channel
, save_car
, outch
;
569 /* Since we only get here when the transmit buffer
570 is empty, we know we can always stuff a dozen
572 #ifdef CY_DEBUG_INTERRUPTS
573 printk(KERN_DEBUG
"cyy_interrupt: xmit intr, chip %d\n", chip
);
576 /* determine the channel & change to that context */
577 save_xir
= readb(base_addr
+ (CyTIR
<< index
));
578 channel
= save_xir
& CyIRChannel
;
579 save_car
= readb(base_addr
+ (CyCAR
<< index
));
580 cy_writeb(base_addr
+ (CyCAR
<< index
), save_xir
);
582 /* validate the port# (as configured and open) */
583 if (channel
+ chip
* 4 >= cinfo
->nports
) {
584 cy_writeb(base_addr
+ (CySRER
<< index
),
585 readb(base_addr
+ (CySRER
<< index
)) & ~CyTxRdy
);
588 info
= &cinfo
->ports
[channel
+ chip
* 4];
589 tty
= tty_port_tty_get(&info
->port
);
591 cy_writeb(base_addr
+ (CySRER
<< index
),
592 readb(base_addr
+ (CySRER
<< index
)) & ~CyTxRdy
);
596 /* load the on-chip space for outbound data */
597 char_count
= info
->xmit_fifo_size
;
599 if (info
->x_char
) { /* send special char */
600 outch
= info
->x_char
;
601 cy_writeb(base_addr
+ (CyTDR
<< index
), outch
);
607 if (info
->breakon
|| info
->breakoff
) {
609 cy_writeb(base_addr
+ (CyTDR
<< index
), 0);
610 cy_writeb(base_addr
+ (CyTDR
<< index
), 0x81);
614 if (info
->breakoff
) {
615 cy_writeb(base_addr
+ (CyTDR
<< index
), 0);
616 cy_writeb(base_addr
+ (CyTDR
<< index
), 0x83);
622 while (char_count
-- > 0) {
623 if (!info
->xmit_cnt
) {
624 if (readb(base_addr
+ (CySRER
<< index
)) & CyTxMpty
) {
625 cy_writeb(base_addr
+ (CySRER
<< index
),
626 readb(base_addr
+ (CySRER
<< index
)) &
629 cy_writeb(base_addr
+ (CySRER
<< index
),
630 (readb(base_addr
+ (CySRER
<< index
)) &
631 ~CyTxRdy
) | CyTxMpty
);
635 if (info
->port
.xmit_buf
== NULL
) {
636 cy_writeb(base_addr
+ (CySRER
<< index
),
637 readb(base_addr
+ (CySRER
<< index
)) &
641 if (tty
->stopped
|| tty
->hw_stopped
) {
642 cy_writeb(base_addr
+ (CySRER
<< index
),
643 readb(base_addr
+ (CySRER
<< index
)) &
647 /* Because the Embedded Transmit Commands have been enabled,
648 * we must check to see if the escape character, NULL, is being
649 * sent. If it is, we must ensure that there is room for it to
650 * be doubled in the output stream. Therefore we no longer
651 * advance the pointer when the character is fetched, but
652 * rather wait until after the check for a NULL output
653 * character. This is necessary because there may not be room
654 * for the two chars needed to send a NULL.)
656 outch
= info
->port
.xmit_buf
[info
->xmit_tail
];
659 info
->xmit_tail
= (info
->xmit_tail
+ 1) &
660 (SERIAL_XMIT_SIZE
- 1);
661 cy_writeb(base_addr
+ (CyTDR
<< index
), outch
);
664 if (char_count
> 1) {
666 info
->xmit_tail
= (info
->xmit_tail
+ 1) &
667 (SERIAL_XMIT_SIZE
- 1);
668 cy_writeb(base_addr
+ (CyTDR
<< index
), outch
);
669 cy_writeb(base_addr
+ (CyTDR
<< index
), 0);
681 cy_writeb(base_addr
+ (CyTIR
<< index
), save_xir
& 0x3f);
682 cy_writeb(base_addr
+ (CyCAR
<< index
), save_car
);
685 static void cyy_chip_modem(struct cyclades_card
*cinfo
, int chip
,
686 void __iomem
*base_addr
)
688 struct cyclades_port
*info
;
689 struct tty_struct
*tty
;
690 int index
= cinfo
->bus_index
;
691 u8 save_xir
, channel
, save_car
, mdm_change
, mdm_status
;
693 /* determine the channel & change to that context */
694 save_xir
= readb(base_addr
+ (CyMIR
<< index
));
695 channel
= save_xir
& CyIRChannel
;
696 info
= &cinfo
->ports
[channel
+ chip
* 4];
697 save_car
= readb(base_addr
+ (CyCAR
<< index
));
698 cy_writeb(base_addr
+ (CyCAR
<< index
), save_xir
);
700 mdm_change
= readb(base_addr
+ (CyMISR
<< index
));
701 mdm_status
= readb(base_addr
+ (CyMSVR1
<< index
));
703 tty
= tty_port_tty_get(&info
->port
);
707 if (mdm_change
& CyANY_DELTA
) {
708 /* For statistics only */
709 if (mdm_change
& CyDCD
)
711 if (mdm_change
& CyCTS
)
713 if (mdm_change
& CyDSR
)
715 if (mdm_change
& CyRI
)
718 wake_up_interruptible(&info
->delta_msr_wait
);
721 if ((mdm_change
& CyDCD
) && (info
->port
.flags
& ASYNC_CHECK_CD
)) {
722 if (mdm_status
& CyDCD
)
723 wake_up_interruptible(&info
->port
.open_wait
);
727 if ((mdm_change
& CyCTS
) && (info
->port
.flags
& ASYNC_CTS_FLOW
)) {
728 if (tty
->hw_stopped
) {
729 if (mdm_status
& CyCTS
) {
730 /* cy_start isn't used
733 cy_writeb(base_addr
+ (CySRER
<< index
),
734 readb(base_addr
+ (CySRER
<< index
)) |
739 if (!(mdm_status
& CyCTS
)) {
740 /* cy_stop isn't used
743 cy_writeb(base_addr
+ (CySRER
<< index
),
744 readb(base_addr
+ (CySRER
<< index
)) &
749 /* if (mdm_change & CyDSR) {
751 if (mdm_change & CyRI) {
756 cy_writeb(base_addr
+ (CyMIR
<< index
), save_xir
& 0x3f);
757 cy_writeb(base_addr
+ (CyCAR
<< index
), save_car
);
760 /* The real interrupt service routine is called
761 whenever the card wants its hand held--chars
762 received, out buffer empty, modem change, etc.
764 static irqreturn_t
cyy_interrupt(int irq
, void *dev_id
)
767 struct cyclades_card
*cinfo
= dev_id
;
768 void __iomem
*base_addr
, *card_base_addr
;
769 unsigned int chip
, too_many
, had_work
;
772 if (unlikely(cinfo
== NULL
)) {
773 #ifdef CY_DEBUG_INTERRUPTS
774 printk(KERN_DEBUG
"cyy_interrupt: spurious interrupt %d\n",
777 return IRQ_NONE
; /* spurious interrupt */
780 card_base_addr
= cinfo
->base_addr
;
781 index
= cinfo
->bus_index
;
783 /* card was not initialized yet (e.g. DEBUG_SHIRQ) */
784 if (unlikely(card_base_addr
== NULL
))
787 /* This loop checks all chips in the card. Make a note whenever
788 _any_ chip had some work to do, as this is considered an
789 indication that there will be more to do. Only when no chip
790 has any work does this outermost loop exit.
794 for (chip
= 0; chip
< cinfo
->num_chips
; chip
++) {
795 base_addr
= cinfo
->base_addr
+
796 (cy_chip_offset
[chip
] << index
);
798 while ((status
= readb(base_addr
+
799 (CySVRR
<< index
))) != 0x00) {
801 /* The purpose of the following test is to ensure that
802 no chip can monopolize the driver. This forces the
803 chips to be checked in a round-robin fashion (after
804 draining each of a bunch (1000) of characters).
806 if (1000 < too_many
++)
808 spin_lock(&cinfo
->card_lock
);
809 if (status
& CySRReceive
) /* rx intr */
810 cyy_chip_rx(cinfo
, chip
, base_addr
);
811 if (status
& CySRTransmit
) /* tx intr */
812 cyy_chip_tx(cinfo
, chip
, base_addr
);
813 if (status
& CySRModem
) /* modem intr */
814 cyy_chip_modem(cinfo
, chip
, base_addr
);
815 spin_unlock(&cinfo
->card_lock
);
820 /* clear interrupts */
821 spin_lock(&cinfo
->card_lock
);
822 cy_writeb(card_base_addr
+ (Cy_ClrIntr
<< index
), 0);
823 /* Cy_ClrIntr is 0x1800 */
824 spin_unlock(&cinfo
->card_lock
);
826 } /* cyy_interrupt */
828 static void cyy_change_rts_dtr(struct cyclades_port
*info
, unsigned int set
,
831 struct cyclades_card
*card
= info
->card
;
832 void __iomem
*base_addr
;
833 int chip
, channel
, index
;
834 u32 rts
, dtr
, msvrr
, msvrd
;
836 channel
= info
->line
- card
->first_line
;
839 index
= card
->bus_index
;
840 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
842 if (info
->rtsdtr_inv
) {
853 if (set
& TIOCM_RTS
) {
854 cy_writeb(base_addr
+ (CyCAR
<< index
), (u8
)channel
);
855 cy_writeb(base_addr
+ (msvrr
<< index
), rts
);
857 if (clear
& TIOCM_RTS
) {
858 cy_writeb(base_addr
+ (CyCAR
<< index
), (u8
)channel
);
859 cy_writeb(base_addr
+ (msvrr
<< index
), ~rts
);
861 if (set
& TIOCM_DTR
) {
862 cy_writeb(base_addr
+ (CyCAR
<< index
), (u8
)channel
);
863 cy_writeb(base_addr
+ (msvrd
<< index
), dtr
);
865 printk(KERN_DEBUG
"cyc:set_modem_info raising DTR\n");
866 printk(KERN_DEBUG
" status: 0x%x, 0x%x\n",
867 readb(base_addr
+ (CyMSVR1
<< index
)),
868 readb(base_addr
+ (CyMSVR2
<< index
)));
871 if (clear
& TIOCM_DTR
) {
872 cy_writeb(base_addr
+ (CyCAR
<< index
), (u8
)channel
);
873 cy_writeb(base_addr
+ (msvrd
<< index
), ~dtr
);
875 printk(KERN_DEBUG
"cyc:set_modem_info dropping DTR\n");
876 printk(KERN_DEBUG
" status: 0x%x, 0x%x\n",
877 readb(base_addr
+ (CyMSVR1
<< index
)),
878 readb(base_addr
+ (CyMSVR2
<< index
)));
883 /***********************************************************/
884 /********* End of block of Cyclom-Y specific code **********/
885 /******** Start of block of Cyclades-Z specific code *******/
886 /***********************************************************/
889 cyz_fetch_msg(struct cyclades_card
*cinfo
,
890 __u32
*channel
, __u8
*cmd
, __u32
*param
)
892 struct BOARD_CTRL __iomem
*board_ctrl
= cinfo
->board_ctrl
;
893 unsigned long loc_doorbell
;
895 loc_doorbell
= readl(&cinfo
->ctl_addr
.p9060
->loc_doorbell
);
897 *cmd
= (char)(0xff & loc_doorbell
);
898 *channel
= readl(&board_ctrl
->fwcmd_channel
);
899 *param
= (__u32
) readl(&board_ctrl
->fwcmd_param
);
900 cy_writel(&cinfo
->ctl_addr
.p9060
->loc_doorbell
, 0xffffffff);
904 } /* cyz_fetch_msg */
907 cyz_issue_cmd(struct cyclades_card
*cinfo
,
908 __u32 channel
, __u8 cmd
, __u32 param
)
910 struct BOARD_CTRL __iomem
*board_ctrl
= cinfo
->board_ctrl
;
911 __u32 __iomem
*pci_doorbell
;
914 if (!cyz_is_loaded(cinfo
))
918 pci_doorbell
= &cinfo
->ctl_addr
.p9060
->pci_doorbell
;
919 while ((readl(pci_doorbell
) & 0xff) != 0) {
921 return (int)(readl(pci_doorbell
) & 0xff);
924 cy_writel(&board_ctrl
->hcmd_channel
, channel
);
925 cy_writel(&board_ctrl
->hcmd_param
, param
);
926 cy_writel(pci_doorbell
, (long)cmd
);
929 } /* cyz_issue_cmd */
931 static void cyz_handle_rx(struct cyclades_port
*info
, struct tty_struct
*tty
)
933 struct BUF_CTRL __iomem
*buf_ctrl
= info
->u
.cyz
.buf_ctrl
;
934 struct cyclades_card
*cinfo
= info
->card
;
935 unsigned int char_count
;
942 __u32 rx_put
, rx_get
, new_rx_get
, rx_bufsize
, rx_bufaddr
;
944 rx_get
= new_rx_get
= readl(&buf_ctrl
->rx_get
);
945 rx_put
= readl(&buf_ctrl
->rx_put
);
946 rx_bufsize
= readl(&buf_ctrl
->rx_bufsize
);
947 rx_bufaddr
= readl(&buf_ctrl
->rx_bufaddr
);
948 if (rx_put
>= rx_get
)
949 char_count
= rx_put
- rx_get
;
951 char_count
= rx_put
- rx_get
+ rx_bufsize
;
954 #ifdef CY_ENABLE_MONITORING
955 info
->mon
.int_count
++;
956 info
->mon
.char_count
+= char_count
;
957 if (char_count
> info
->mon
.char_max
)
958 info
->mon
.char_max
= char_count
;
959 info
->mon
.char_last
= char_count
;
962 /* flush received characters */
963 new_rx_get
= (new_rx_get
+ char_count
) &
965 info
->rflush_count
++;
968 /* we'd like to use memcpy(t, f, n) and memset(s, c, count)
969 for performance, but because of buffer boundaries, there
970 may be several steps to the operation */
972 len
= tty_prepare_flip_string(tty
, &buf
,
977 len
= min_t(unsigned int, min(len
, char_count
),
978 rx_bufsize
- new_rx_get
);
980 memcpy_fromio(buf
, cinfo
->base_addr
+
981 rx_bufaddr
+ new_rx_get
, len
);
983 new_rx_get
= (new_rx_get
+ len
) &
986 info
->icount
.rx
+= len
;
987 info
->idle_stats
.recv_bytes
+= len
;
990 len
= tty_buffer_request_room(tty
, char_count
);
992 data
= readb(cinfo
->base_addr
+ rx_bufaddr
+
994 new_rx_get
= (new_rx_get
+ 1) &
996 tty_insert_flip_char(tty
, data
, TTY_NORMAL
);
997 info
->idle_stats
.recv_bytes
++;
1001 #ifdef CONFIG_CYZ_INTR
1002 /* Recalculate the number of chars in the RX buffer and issue
1003 a cmd in case it's higher than the RX high water mark */
1004 rx_put
= readl(&buf_ctrl
->rx_put
);
1005 if (rx_put
>= rx_get
)
1006 char_count
= rx_put
- rx_get
;
1008 char_count
= rx_put
- rx_get
+ rx_bufsize
;
1009 if (char_count
>= readl(&buf_ctrl
->rx_threshold
) &&
1010 !timer_pending(&cyz_rx_full_timer
[
1012 mod_timer(&cyz_rx_full_timer
[info
->line
],
1015 info
->idle_stats
.recv_idle
= jiffies
;
1016 tty_schedule_flip(tty
);
1019 cy_writel(&buf_ctrl
->rx_get
, new_rx_get
);
1023 static void cyz_handle_tx(struct cyclades_port
*info
, struct tty_struct
*tty
)
1025 struct BUF_CTRL __iomem
*buf_ctrl
= info
->u
.cyz
.buf_ctrl
;
1026 struct cyclades_card
*cinfo
= info
->card
;
1028 unsigned int char_count
;
1032 __u32 tx_put
, tx_get
, tx_bufsize
, tx_bufaddr
;
1034 if (info
->xmit_cnt
<= 0) /* Nothing to transmit */
1037 tx_get
= readl(&buf_ctrl
->tx_get
);
1038 tx_put
= readl(&buf_ctrl
->tx_put
);
1039 tx_bufsize
= readl(&buf_ctrl
->tx_bufsize
);
1040 tx_bufaddr
= readl(&buf_ctrl
->tx_bufaddr
);
1041 if (tx_put
>= tx_get
)
1042 char_count
= tx_get
- tx_put
- 1 + tx_bufsize
;
1044 char_count
= tx_get
- tx_put
- 1;
1051 if (info
->x_char
) { /* send special char */
1052 data
= info
->x_char
;
1054 cy_writeb(cinfo
->base_addr
+ tx_bufaddr
+ tx_put
, data
);
1055 tx_put
= (tx_put
+ 1) & (tx_bufsize
- 1);
1061 while (0 < (small_count
= min_t(unsigned int,
1062 tx_bufsize
- tx_put
, min_t(unsigned int,
1063 (SERIAL_XMIT_SIZE
- info
->xmit_tail
),
1064 min_t(unsigned int, info
->xmit_cnt
,
1067 memcpy_toio((char *)(cinfo
->base_addr
+ tx_bufaddr
+
1069 &info
->port
.xmit_buf
[info
->xmit_tail
],
1072 tx_put
= (tx_put
+ small_count
) & (tx_bufsize
- 1);
1073 char_count
-= small_count
;
1074 info
->icount
.tx
+= small_count
;
1075 info
->xmit_cnt
-= small_count
;
1076 info
->xmit_tail
= (info
->xmit_tail
+ small_count
) &
1077 (SERIAL_XMIT_SIZE
- 1);
1080 while (info
->xmit_cnt
&& char_count
) {
1081 data
= info
->port
.xmit_buf
[info
->xmit_tail
];
1083 info
->xmit_tail
= (info
->xmit_tail
+ 1) &
1084 (SERIAL_XMIT_SIZE
- 1);
1086 cy_writeb(cinfo
->base_addr
+ tx_bufaddr
+ tx_put
, data
);
1087 tx_put
= (tx_put
+ 1) & (tx_bufsize
- 1);
1095 cy_writel(&buf_ctrl
->tx_put
, tx_put
);
1099 static void cyz_handle_cmd(struct cyclades_card
*cinfo
)
1101 struct BOARD_CTRL __iomem
*board_ctrl
= cinfo
->board_ctrl
;
1102 struct tty_struct
*tty
;
1103 struct cyclades_port
*info
;
1104 __u32 channel
, param
, fw_ver
;
1109 fw_ver
= readl(&board_ctrl
->fw_version
);
1111 while (cyz_fetch_msg(cinfo
, &channel
, &cmd
, ¶m
) == 1) {
1114 info
= &cinfo
->ports
[channel
];
1115 tty
= tty_port_tty_get(&info
->port
);
1121 tty_insert_flip_char(tty
, 0, TTY_PARITY
);
1126 tty_insert_flip_char(tty
, 0, TTY_FRAME
);
1131 tty_insert_flip_char(tty
, 0, TTY_BREAK
);
1138 if (info
->port
.flags
& ASYNC_CHECK_CD
) {
1139 u32 dcd
= fw_ver
> 241 ? param
:
1140 readl(&info
->u
.cyz
.ch_ctrl
->rs_status
);
1142 wake_up_interruptible(&info
->port
.open_wait
);
1161 complete(&info
->shutdown_wait
);
1164 #ifdef CONFIG_CYZ_INTR
1168 /* Reception Interrupt */
1169 #ifdef CY_DEBUG_INTERRUPTS
1170 printk(KERN_DEBUG
"cyz_interrupt: rcvd intr, card %d, "
1171 "port %ld\n", info
->card
, channel
);
1173 cyz_handle_rx(info
, tty
);
1178 /* Transmission Interrupt */
1179 #ifdef CY_DEBUG_INTERRUPTS
1180 printk(KERN_DEBUG
"cyz_interrupt: xmit intr, card %d, "
1181 "port %ld\n", info
->card
, channel
);
1183 cyz_handle_tx(info
, tty
);
1185 #endif /* CONFIG_CYZ_INTR */
1187 /* should do something with this !!! */
1193 wake_up_interruptible(&info
->delta_msr_wait
);
1195 tty_schedule_flip(tty
);
1200 #ifdef CONFIG_CYZ_INTR
1201 static irqreturn_t
cyz_interrupt(int irq
, void *dev_id
)
1203 struct cyclades_card
*cinfo
= dev_id
;
1205 if (unlikely(!cyz_is_loaded(cinfo
))) {
1206 #ifdef CY_DEBUG_INTERRUPTS
1207 printk(KERN_DEBUG
"cyz_interrupt: board not yet loaded "
1213 /* Handle the interrupts */
1214 cyz_handle_cmd(cinfo
);
1217 } /* cyz_interrupt */
1219 static void cyz_rx_restart(unsigned long arg
)
1221 struct cyclades_port
*info
= (struct cyclades_port
*)arg
;
1222 struct cyclades_card
*card
= info
->card
;
1224 __u32 channel
= info
->line
- card
->first_line
;
1225 unsigned long flags
;
1227 spin_lock_irqsave(&card
->card_lock
, flags
);
1228 retval
= cyz_issue_cmd(card
, channel
, C_CM_INTBACK2
, 0L);
1230 printk(KERN_ERR
"cyc:cyz_rx_restart retval on ttyC%d was %x\n",
1231 info
->line
, retval
);
1233 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1236 #else /* CONFIG_CYZ_INTR */
1238 static void cyz_poll(unsigned long arg
)
1240 struct cyclades_card
*cinfo
;
1241 struct cyclades_port
*info
;
1242 unsigned long expires
= jiffies
+ HZ
;
1243 unsigned int port
, card
;
1245 for (card
= 0; card
< NR_CARDS
; card
++) {
1246 cinfo
= &cy_card
[card
];
1248 if (!cy_is_Z(cinfo
))
1250 if (!cyz_is_loaded(cinfo
))
1253 /* Skip first polling cycle to avoid racing conditions with the FW */
1254 if (!cinfo
->intr_enabled
) {
1255 cinfo
->intr_enabled
= 1;
1259 cyz_handle_cmd(cinfo
);
1261 for (port
= 0; port
< cinfo
->nports
; port
++) {
1262 struct tty_struct
*tty
;
1264 info
= &cinfo
->ports
[port
];
1265 tty
= tty_port_tty_get(&info
->port
);
1266 /* OK to pass NULL to the handle functions below.
1267 They need to drop the data in that case. */
1269 if (!info
->throttle
)
1270 cyz_handle_rx(info
, tty
);
1271 cyz_handle_tx(info
, tty
);
1274 /* poll every 'cyz_polling_cycle' period */
1275 expires
= jiffies
+ cyz_polling_cycle
;
1277 mod_timer(&cyz_timerlist
, expires
);
1280 #endif /* CONFIG_CYZ_INTR */
1282 /********** End of block of Cyclades-Z specific code *********/
1283 /***********************************************************/
1285 /* This is called whenever a port becomes active;
1286 interrupts are enabled and DTR & RTS are turned on.
1288 static int cy_startup(struct cyclades_port
*info
, struct tty_struct
*tty
)
1290 struct cyclades_card
*card
;
1291 unsigned long flags
;
1293 void __iomem
*base_addr
;
1298 channel
= info
->line
- card
->first_line
;
1300 page
= get_zeroed_page(GFP_KERNEL
);
1304 spin_lock_irqsave(&card
->card_lock
, flags
);
1306 if (info
->port
.flags
& ASYNC_INITIALIZED
)
1310 set_bit(TTY_IO_ERROR
, &tty
->flags
);
1314 if (info
->port
.xmit_buf
)
1317 info
->port
.xmit_buf
= (unsigned char *)page
;
1319 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1321 cy_set_line_char(info
, tty
);
1323 if (!cy_is_Z(card
)) {
1324 int chip
= channel
>> 2;
1325 int index
= card
->bus_index
;
1327 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
1329 #ifdef CY_DEBUG_OPEN
1330 printk(KERN_DEBUG
"cyc startup card %d, chip %d, channel %d, "
1332 card
, chip
, channel
, base_addr
);
1334 spin_lock_irqsave(&card
->card_lock
, flags
);
1336 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
1338 cy_writeb(base_addr
+ (CyRTPR
<< index
),
1339 (info
->default_timeout
? info
->default_timeout
: 0x02));
1340 /* 10ms rx timeout */
1342 cyy_issue_cmd(base_addr
, CyCHAN_CTL
| CyENB_RCVR
| CyENB_XMTR
,
1345 cyy_change_rts_dtr(info
, TIOCM_RTS
| TIOCM_DTR
, 0);
1347 cy_writeb(base_addr
+ (CySRER
<< index
),
1348 readb(base_addr
+ (CySRER
<< index
)) | CyRxData
);
1350 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
1352 if (!cyz_is_loaded(card
))
1355 #ifdef CY_DEBUG_OPEN
1356 printk(KERN_DEBUG
"cyc startup Z card %d, channel %d, "
1357 "base_addr %p\n", card
, channel
, card
->base_addr
);
1359 spin_lock_irqsave(&card
->card_lock
, flags
);
1361 cy_writel(&ch_ctrl
->op_mode
, C_CH_ENABLE
);
1363 #ifdef CONFIG_CYZ_INTR
1364 cy_writel(&ch_ctrl
->intr_enable
,
1365 C_IN_TXBEMPTY
| C_IN_TXLOWWM
| C_IN_RXHIWM
|
1366 C_IN_RXNNDT
| C_IN_IOCTLW
| C_IN_MDCD
);
1368 cy_writel(&ch_ctrl
->intr_enable
,
1369 C_IN_IOCTLW
| C_IN_MDCD
);
1370 #endif /* CONFIG_CYZ_INTR */
1372 #ifdef CONFIG_CYZ_INTR
1373 cy_writel(&ch_ctrl
->intr_enable
,
1374 C_IN_TXBEMPTY
| C_IN_TXLOWWM
| C_IN_RXHIWM
|
1375 C_IN_RXNNDT
| C_IN_MDCD
);
1377 cy_writel(&ch_ctrl
->intr_enable
, C_IN_MDCD
);
1378 #endif /* CONFIG_CYZ_INTR */
1381 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTL
, 0L);
1383 printk(KERN_ERR
"cyc:startup(1) retval on ttyC%d was "
1384 "%x\n", info
->line
, retval
);
1387 /* Flush RX buffers before raising DTR and RTS */
1388 retval
= cyz_issue_cmd(card
, channel
, C_CM_FLUSH_RX
, 0L);
1390 printk(KERN_ERR
"cyc:startup(2) retval on ttyC%d was "
1391 "%x\n", info
->line
, retval
);
1394 /* set timeout !!! */
1395 /* set RTS and DTR !!! */
1396 tty_port_raise_dtr_rts(&info
->port
);
1398 /* enable send, recv, modem !!! */
1401 info
->port
.flags
|= ASYNC_INITIALIZED
;
1403 clear_bit(TTY_IO_ERROR
, &tty
->flags
);
1404 info
->xmit_cnt
= info
->xmit_head
= info
->xmit_tail
= 0;
1405 info
->breakon
= info
->breakoff
= 0;
1406 memset((char *)&info
->idle_stats
, 0, sizeof(info
->idle_stats
));
1407 info
->idle_stats
.in_use
=
1408 info
->idle_stats
.recv_idle
=
1409 info
->idle_stats
.xmit_idle
= jiffies
;
1411 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1413 #ifdef CY_DEBUG_OPEN
1414 printk(KERN_DEBUG
"cyc startup done\n");
1419 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1424 static void start_xmit(struct cyclades_port
*info
)
1426 struct cyclades_card
*card
;
1427 unsigned long flags
;
1428 void __iomem
*base_addr
;
1429 int chip
, channel
, index
;
1432 channel
= info
->line
- card
->first_line
;
1433 if (!cy_is_Z(card
)) {
1434 chip
= channel
>> 2;
1436 index
= card
->bus_index
;
1437 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
1439 spin_lock_irqsave(&card
->card_lock
, flags
);
1440 cy_writeb(base_addr
+ (CyCAR
<< index
), channel
);
1441 cy_writeb(base_addr
+ (CySRER
<< index
),
1442 readb(base_addr
+ (CySRER
<< index
)) | CyTxRdy
);
1443 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1445 #ifdef CONFIG_CYZ_INTR
1448 spin_lock_irqsave(&card
->card_lock
, flags
);
1449 retval
= cyz_issue_cmd(card
, channel
, C_CM_INTBACK
, 0L);
1451 printk(KERN_ERR
"cyc:start_xmit retval on ttyC%d was "
1452 "%x\n", info
->line
, retval
);
1454 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1455 #else /* CONFIG_CYZ_INTR */
1456 /* Don't have to do anything at this time */
1457 #endif /* CONFIG_CYZ_INTR */
1462 * This routine shuts down a serial port; interrupts are disabled,
1463 * and DTR is dropped if the hangup on close termio flag is on.
1465 static void cy_shutdown(struct cyclades_port
*info
, struct tty_struct
*tty
)
1467 struct cyclades_card
*card
;
1468 unsigned long flags
;
1469 void __iomem
*base_addr
;
1470 int chip
, channel
, index
;
1472 if (!(info
->port
.flags
& ASYNC_INITIALIZED
))
1476 channel
= info
->line
- card
->first_line
;
1477 if (!cy_is_Z(card
)) {
1478 chip
= channel
>> 2;
1480 index
= card
->bus_index
;
1481 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
1483 #ifdef CY_DEBUG_OPEN
1484 printk(KERN_DEBUG
"cyc shutdown Y card %d, chip %d, "
1485 "channel %d, base_addr %p\n",
1486 card
, chip
, channel
, base_addr
);
1489 spin_lock_irqsave(&card
->card_lock
, flags
);
1491 /* Clear delta_msr_wait queue to avoid mem leaks. */
1492 wake_up_interruptible(&info
->delta_msr_wait
);
1494 if (info
->port
.xmit_buf
) {
1495 unsigned char *temp
;
1496 temp
= info
->port
.xmit_buf
;
1497 info
->port
.xmit_buf
= NULL
;
1498 free_page((unsigned long)temp
);
1500 if (tty
->termios
->c_cflag
& HUPCL
)
1501 cyy_change_rts_dtr(info
, 0, TIOCM_RTS
| TIOCM_DTR
);
1503 cyy_issue_cmd(base_addr
, CyCHAN_CTL
| CyDIS_RCVR
, index
);
1504 /* it may be appropriate to clear _XMIT at
1505 some later date (after testing)!!! */
1507 set_bit(TTY_IO_ERROR
, &tty
->flags
);
1508 info
->port
.flags
&= ~ASYNC_INITIALIZED
;
1509 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1511 #ifdef CY_DEBUG_OPEN
1512 printk(KERN_DEBUG
"cyc shutdown Z card %d, channel %d, "
1513 "base_addr %p\n", card
, channel
, card
->base_addr
);
1516 if (!cyz_is_loaded(card
))
1519 spin_lock_irqsave(&card
->card_lock
, flags
);
1521 if (info
->port
.xmit_buf
) {
1522 unsigned char *temp
;
1523 temp
= info
->port
.xmit_buf
;
1524 info
->port
.xmit_buf
= NULL
;
1525 free_page((unsigned long)temp
);
1528 if (tty
->termios
->c_cflag
& HUPCL
)
1529 tty_port_lower_dtr_rts(&info
->port
);
1531 set_bit(TTY_IO_ERROR
, &tty
->flags
);
1532 info
->port
.flags
&= ~ASYNC_INITIALIZED
;
1534 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1537 #ifdef CY_DEBUG_OPEN
1538 printk(KERN_DEBUG
"cyc shutdown done\n");
1543 * ------------------------------------------------------------
1544 * cy_open() and friends
1545 * ------------------------------------------------------------
1549 * This routine is called whenever a serial port is opened. It
1550 * performs the serial-specific initialization for the tty structure.
1552 static int cy_open(struct tty_struct
*tty
, struct file
*filp
)
1554 struct cyclades_port
*info
;
1555 unsigned int i
, line
;
1559 if (tty
->index
< 0 || NR_PORTS
<= line
)
1562 for (i
= 0; i
< NR_CARDS
; i
++)
1563 if (line
< cy_card
[i
].first_line
+ cy_card
[i
].nports
&&
1564 line
>= cy_card
[i
].first_line
)
1568 info
= &cy_card
[i
].ports
[line
- cy_card
[i
].first_line
];
1572 /* If the card's firmware hasn't been loaded,
1573 treat it as absent from the system. This
1574 will make the user pay attention.
1576 if (cy_is_Z(info
->card
)) {
1577 struct cyclades_card
*cinfo
= info
->card
;
1578 struct FIRM_ID __iomem
*firm_id
= cinfo
->base_addr
+ ID_ADDRESS
;
1580 if (!cyz_is_loaded(cinfo
)) {
1581 if (cinfo
->hw_ver
== ZE_V1
&& cyz_fpga_loaded(cinfo
) &&
1582 readl(&firm_id
->signature
) ==
1584 printk(KERN_ERR
"cyc:Cyclades-Z Error: you "
1585 "need an external power supply for "
1586 "this number of ports.\nFirmware "
1589 printk(KERN_ERR
"cyc:Cyclades-Z firmware not "
1594 #ifdef CONFIG_CYZ_INTR
1596 /* In case this Z board is operating in interrupt mode, its
1597 interrupts should be enabled as soon as the first open
1598 happens to one of its ports. */
1599 if (!cinfo
->intr_enabled
) {
1602 /* Enable interrupts on the PLX chip */
1603 intr
= readw(&cinfo
->ctl_addr
.p9060
->
1604 intr_ctrl_stat
) | 0x0900;
1605 cy_writew(&cinfo
->ctl_addr
.p9060
->
1606 intr_ctrl_stat
, intr
);
1607 /* Enable interrupts on the FW */
1608 retval
= cyz_issue_cmd(cinfo
, 0,
1611 printk(KERN_ERR
"cyc:IRQ enable retval "
1612 "was %x\n", retval
);
1614 cinfo
->intr_enabled
= 1;
1617 #endif /* CONFIG_CYZ_INTR */
1618 /* Make sure this Z port really exists in hardware */
1619 if (info
->line
> (cinfo
->first_line
+ cinfo
->nports
- 1))
1622 #ifdef CY_DEBUG_OTHER
1623 printk(KERN_DEBUG
"cyc:cy_open ttyC%d\n", info
->line
);
1625 tty
->driver_data
= info
;
1626 if (serial_paranoia_check(info
, tty
->name
, "cy_open"))
1629 #ifdef CY_DEBUG_OPEN
1630 printk(KERN_DEBUG
"cyc:cy_open ttyC%d, count = %d\n", info
->line
,
1634 #ifdef CY_DEBUG_COUNT
1635 printk(KERN_DEBUG
"cyc:cy_open (%d): incrementing count to %d\n",
1636 current
->pid
, info
->port
.count
);
1640 * If the port is the middle of closing, bail out now
1642 if (tty_hung_up_p(filp
) || (info
->port
.flags
& ASYNC_CLOSING
)) {
1643 wait_event_interruptible(info
->port
.close_wait
,
1644 !(info
->port
.flags
& ASYNC_CLOSING
));
1645 return (info
->port
.flags
& ASYNC_HUP_NOTIFY
) ? -EAGAIN
: -ERESTARTSYS
;
1649 * Start up serial port
1651 retval
= cy_startup(info
, tty
);
1655 retval
= tty_port_block_til_ready(&info
->port
, tty
, filp
);
1657 #ifdef CY_DEBUG_OPEN
1658 printk(KERN_DEBUG
"cyc:cy_open returning after block_til_ready "
1659 "with %d\n", retval
);
1665 tty_port_tty_set(&info
->port
, tty
);
1667 #ifdef CY_DEBUG_OPEN
1668 printk(KERN_DEBUG
"cyc:cy_open done\n");
1674 * cy_wait_until_sent() --- wait until the transmitter is empty
1676 static void cy_wait_until_sent(struct tty_struct
*tty
, int timeout
)
1678 struct cyclades_card
*card
;
1679 struct cyclades_port
*info
= tty
->driver_data
;
1680 void __iomem
*base_addr
;
1681 int chip
, channel
, index
;
1682 unsigned long orig_jiffies
;
1685 if (serial_paranoia_check(info
, tty
->name
, "cy_wait_until_sent"))
1688 if (info
->xmit_fifo_size
== 0)
1689 return; /* Just in case.... */
1691 orig_jiffies
= jiffies
;
1694 * Set the check interval to be 1/5 of the estimated time to
1695 * send a single character, and make it at least 1. The check
1696 * interval should also be less than the timeout.
1698 * Note: we have to use pretty tight timings here to satisfy
1701 char_time
= (info
->timeout
- HZ
/ 50) / info
->xmit_fifo_size
;
1702 char_time
= char_time
/ 5;
1708 char_time
= min(char_time
, timeout
);
1710 * If the transmitter hasn't cleared in twice the approximate
1711 * amount of time to send the entire FIFO, it probably won't
1712 * ever clear. This assumes the UART isn't doing flow
1713 * control, which is currently the case. Hence, if it ever
1714 * takes longer than info->timeout, this is probably due to a
1715 * UART bug of some kind. So, we clamp the timeout parameter at
1718 if (!timeout
|| timeout
> 2 * info
->timeout
)
1719 timeout
= 2 * info
->timeout
;
1720 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
1721 printk(KERN_DEBUG
"In cy_wait_until_sent(%d) check=%d, jiff=%lu...",
1722 timeout
, char_time
, jiffies
);
1725 channel
= (info
->line
) - (card
->first_line
);
1726 if (!cy_is_Z(card
)) {
1727 chip
= channel
>> 2;
1729 index
= card
->bus_index
;
1730 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
1731 while (readb(base_addr
+ (CySRER
<< index
)) & CyTxRdy
) {
1732 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
1733 printk(KERN_DEBUG
"Not clean (jiff=%lu)...", jiffies
);
1735 if (msleep_interruptible(jiffies_to_msecs(char_time
)))
1737 if (timeout
&& time_after(jiffies
, orig_jiffies
+
1742 /* Run one more char cycle */
1743 msleep_interruptible(jiffies_to_msecs(char_time
* 5));
1745 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
1746 printk(KERN_DEBUG
"Clean (jiff=%lu)...done\n", jiffies
);
1750 static void cy_flush_buffer(struct tty_struct
*tty
)
1752 struct cyclades_port
*info
= tty
->driver_data
;
1753 struct cyclades_card
*card
;
1754 int channel
, retval
;
1755 unsigned long flags
;
1758 printk(KERN_DEBUG
"cyc:cy_flush_buffer ttyC%d\n", info
->line
);
1761 if (serial_paranoia_check(info
, tty
->name
, "cy_flush_buffer"))
1765 channel
= info
->line
- card
->first_line
;
1767 spin_lock_irqsave(&card
->card_lock
, flags
);
1768 info
->xmit_cnt
= info
->xmit_head
= info
->xmit_tail
= 0;
1769 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1771 if (cy_is_Z(card
)) { /* If it is a Z card, flush the on-board
1773 spin_lock_irqsave(&card
->card_lock
, flags
);
1774 retval
= cyz_issue_cmd(card
, channel
, C_CM_FLUSH_TX
, 0L);
1776 printk(KERN_ERR
"cyc: flush_buffer retval on ttyC%d "
1777 "was %x\n", info
->line
, retval
);
1779 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1782 } /* cy_flush_buffer */
1786 * This routine is called when a particular tty device is closed.
1788 static void cy_close(struct tty_struct
*tty
, struct file
*filp
)
1790 struct cyclades_port
*info
= tty
->driver_data
;
1791 struct cyclades_card
*card
;
1792 unsigned long flags
;
1794 if (!info
|| serial_paranoia_check(info
, tty
->name
, "cy_close"))
1799 if (!tty_port_close_start(&info
->port
, tty
, filp
))
1802 spin_lock_irqsave(&card
->card_lock
, flags
);
1804 if (!cy_is_Z(card
)) {
1805 int channel
= info
->line
- card
->first_line
;
1806 int index
= card
->bus_index
;
1807 void __iomem
*base_addr
= card
->base_addr
+
1808 (cy_chip_offset
[channel
>> 2] << index
);
1809 /* Stop accepting input */
1811 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
1812 cy_writeb(base_addr
+ (CySRER
<< index
),
1813 readb(base_addr
+ (CySRER
<< index
)) & ~CyRxData
);
1814 if (info
->port
.flags
& ASYNC_INITIALIZED
) {
1815 /* Waiting for on-board buffers to be empty before
1817 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1818 cy_wait_until_sent(tty
, info
->timeout
);
1819 spin_lock_irqsave(&card
->card_lock
, flags
);
1823 /* Waiting for on-board buffers to be empty before closing
1825 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
1826 int channel
= info
->line
- card
->first_line
;
1829 if (readl(&ch_ctrl
->flow_status
) != C_FS_TXIDLE
) {
1830 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTLW
, 0L);
1832 printk(KERN_DEBUG
"cyc:cy_close retval on "
1833 "ttyC%d was %x\n", info
->line
, retval
);
1835 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1836 wait_for_completion_interruptible(&info
->shutdown_wait
);
1837 spin_lock_irqsave(&card
->card_lock
, flags
);
1842 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1843 cy_shutdown(info
, tty
);
1844 cy_flush_buffer(tty
);
1846 tty_port_tty_set(&info
->port
, NULL
);
1848 tty_port_close_end(&info
->port
, tty
);
1851 /* This routine gets called when tty_write has put something into
1852 * the write_queue. The characters may come from user space or
1855 * This routine will return the number of characters actually
1856 * accepted for writing.
1858 * If the port is not already transmitting stuff, start it off by
1859 * enabling interrupts. The interrupt service routine will then
1860 * ensure that the characters are sent.
1861 * If the port is already active, there is no need to kick it.
1864 static int cy_write(struct tty_struct
*tty
, const unsigned char *buf
, int count
)
1866 struct cyclades_port
*info
= tty
->driver_data
;
1867 unsigned long flags
;
1871 printk(KERN_DEBUG
"cyc:cy_write ttyC%d\n", info
->line
);
1874 if (serial_paranoia_check(info
, tty
->name
, "cy_write"))
1877 if (!info
->port
.xmit_buf
)
1880 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
1882 c
= min(count
, (int)(SERIAL_XMIT_SIZE
- info
->xmit_cnt
- 1));
1883 c
= min(c
, (int)(SERIAL_XMIT_SIZE
- info
->xmit_head
));
1888 memcpy(info
->port
.xmit_buf
+ info
->xmit_head
, buf
, c
);
1889 info
->xmit_head
= (info
->xmit_head
+ c
) &
1890 (SERIAL_XMIT_SIZE
- 1);
1891 info
->xmit_cnt
+= c
;
1896 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
1898 info
->idle_stats
.xmit_bytes
+= ret
;
1899 info
->idle_stats
.xmit_idle
= jiffies
;
1901 if (info
->xmit_cnt
&& !tty
->stopped
&& !tty
->hw_stopped
)
1908 * This routine is called by the kernel to write a single
1909 * character to the tty device. If the kernel uses this routine,
1910 * it must call the flush_chars() routine (if defined) when it is
1911 * done stuffing characters into the driver. If there is no room
1912 * in the queue, the character is ignored.
1914 static int cy_put_char(struct tty_struct
*tty
, unsigned char ch
)
1916 struct cyclades_port
*info
= tty
->driver_data
;
1917 unsigned long flags
;
1920 printk(KERN_DEBUG
"cyc:cy_put_char ttyC%d\n", info
->line
);
1923 if (serial_paranoia_check(info
, tty
->name
, "cy_put_char"))
1926 if (!info
->port
.xmit_buf
)
1929 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
1930 if (info
->xmit_cnt
>= (int)(SERIAL_XMIT_SIZE
- 1)) {
1931 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
1935 info
->port
.xmit_buf
[info
->xmit_head
++] = ch
;
1936 info
->xmit_head
&= SERIAL_XMIT_SIZE
- 1;
1938 info
->idle_stats
.xmit_bytes
++;
1939 info
->idle_stats
.xmit_idle
= jiffies
;
1940 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
1945 * This routine is called by the kernel after it has written a
1946 * series of characters to the tty device using put_char().
1948 static void cy_flush_chars(struct tty_struct
*tty
)
1950 struct cyclades_port
*info
= tty
->driver_data
;
1953 printk(KERN_DEBUG
"cyc:cy_flush_chars ttyC%d\n", info
->line
);
1956 if (serial_paranoia_check(info
, tty
->name
, "cy_flush_chars"))
1959 if (info
->xmit_cnt
<= 0 || tty
->stopped
|| tty
->hw_stopped
||
1960 !info
->port
.xmit_buf
)
1964 } /* cy_flush_chars */
1967 * This routine returns the numbers of characters the tty driver
1968 * will accept for queuing to be written. This number is subject
1969 * to change as output buffers get emptied, or if the output flow
1970 * control is activated.
1972 static int cy_write_room(struct tty_struct
*tty
)
1974 struct cyclades_port
*info
= tty
->driver_data
;
1978 printk(KERN_DEBUG
"cyc:cy_write_room ttyC%d\n", info
->line
);
1981 if (serial_paranoia_check(info
, tty
->name
, "cy_write_room"))
1983 ret
= SERIAL_XMIT_SIZE
- info
->xmit_cnt
- 1;
1987 } /* cy_write_room */
1989 static int cy_chars_in_buffer(struct tty_struct
*tty
)
1991 struct cyclades_port
*info
= tty
->driver_data
;
1993 if (serial_paranoia_check(info
, tty
->name
, "cy_chars_in_buffer"))
1996 #ifdef Z_EXT_CHARS_IN_BUFFER
1997 if (!cy_is_Z(info
->card
)) {
1998 #endif /* Z_EXT_CHARS_IN_BUFFER */
2000 printk(KERN_DEBUG
"cyc:cy_chars_in_buffer ttyC%d %d\n",
2001 info
->line
, info
->xmit_cnt
);
2003 return info
->xmit_cnt
;
2004 #ifdef Z_EXT_CHARS_IN_BUFFER
2006 struct BUF_CTRL __iomem
*buf_ctrl
= info
->u
.cyz
.buf_ctrl
;
2008 __u32 tx_put
, tx_get
, tx_bufsize
;
2011 tx_get
= readl(&buf_ctrl
->tx_get
);
2012 tx_put
= readl(&buf_ctrl
->tx_put
);
2013 tx_bufsize
= readl(&buf_ctrl
->tx_bufsize
);
2014 if (tx_put
>= tx_get
)
2015 char_count
= tx_put
- tx_get
;
2017 char_count
= tx_put
- tx_get
+ tx_bufsize
;
2019 printk(KERN_DEBUG
"cyc:cy_chars_in_buffer ttyC%d %d\n",
2020 info
->line
, info
->xmit_cnt
+ char_count
);
2023 return info
->xmit_cnt
+ char_count
;
2025 #endif /* Z_EXT_CHARS_IN_BUFFER */
2026 } /* cy_chars_in_buffer */
2029 * ------------------------------------------------------------
2030 * cy_ioctl() and friends
2031 * ------------------------------------------------------------
2034 static void cyy_baud_calc(struct cyclades_port
*info
, __u32 baud
)
2036 int co
, co_val
, bpr
;
2037 __u32 cy_clock
= ((info
->chip_rev
>= CD1400_REV_J
) ? 60000000 :
2041 info
->tbpr
= info
->tco
= info
->rbpr
= info
->rco
= 0;
2045 /* determine which prescaler to use */
2046 for (co
= 4, co_val
= 2048; co
; co
--, co_val
>>= 2) {
2047 if (cy_clock
/ co_val
/ baud
> 63)
2051 bpr
= (cy_clock
/ co_val
* 2 / baud
+ 1) / 2;
2055 info
->tbpr
= info
->rbpr
= bpr
;
2056 info
->tco
= info
->rco
= co
;
2060 * This routine finds or computes the various line characteristics.
2061 * It used to be called config_setup
2063 static void cy_set_line_char(struct cyclades_port
*info
, struct tty_struct
*tty
)
2065 struct cyclades_card
*card
;
2066 unsigned long flags
;
2067 void __iomem
*base_addr
;
2068 int chip
, channel
, index
;
2069 unsigned cflag
, iflag
;
2070 int baud
, baud_rate
= 0;
2073 if (!tty
->termios
) /* XXX can this happen at all? */
2076 if (info
->line
== -1)
2079 cflag
= tty
->termios
->c_cflag
;
2080 iflag
= tty
->termios
->c_iflag
;
2083 * Set up the tty->alt_speed kludge
2085 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_HI
)
2086 tty
->alt_speed
= 57600;
2087 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_VHI
)
2088 tty
->alt_speed
= 115200;
2089 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_SHI
)
2090 tty
->alt_speed
= 230400;
2091 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_WARP
)
2092 tty
->alt_speed
= 460800;
2095 channel
= info
->line
- card
->first_line
;
2097 if (!cy_is_Z(card
)) {
2099 index
= card
->bus_index
;
2102 baud
= tty_get_baud_rate(tty
);
2103 if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2105 if (info
->custom_divisor
)
2106 baud_rate
= info
->baud
/ info
->custom_divisor
;
2108 baud_rate
= info
->baud
;
2109 } else if (baud
> CD1400_MAX_SPEED
) {
2110 baud
= CD1400_MAX_SPEED
;
2112 /* find the baud index */
2113 for (i
= 0; i
< 20; i
++) {
2114 if (baud
== baud_table
[i
])
2118 i
= 19; /* CD1400_MAX_SPEED */
2120 if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2122 cyy_baud_calc(info
, baud_rate
);
2124 if (info
->chip_rev
>= CD1400_REV_J
) {
2125 /* It is a CD1400 rev. J or later */
2126 info
->tbpr
= baud_bpr_60
[i
]; /* Tx BPR */
2127 info
->tco
= baud_co_60
[i
]; /* Tx CO */
2128 info
->rbpr
= baud_bpr_60
[i
]; /* Rx BPR */
2129 info
->rco
= baud_co_60
[i
]; /* Rx CO */
2131 info
->tbpr
= baud_bpr_25
[i
]; /* Tx BPR */
2132 info
->tco
= baud_co_25
[i
]; /* Tx CO */
2133 info
->rbpr
= baud_bpr_25
[i
]; /* Rx BPR */
2134 info
->rco
= baud_co_25
[i
]; /* Rx CO */
2137 if (baud_table
[i
] == 134) {
2138 /* get it right for 134.5 baud */
2139 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 30 / 269) +
2141 } else if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2143 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2145 } else if (baud_table
[i
]) {
2146 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2148 /* this needs to be propagated into the card info */
2152 /* By tradition (is it a standard?) a baud rate of zero
2153 implies the line should be/has been closed. A bit
2154 later in this routine such a test is performed. */
2156 /* byte size and parity */
2159 /* receive threshold */
2160 info
->cor3
= (info
->default_threshold
?
2161 info
->default_threshold
: baud_cor3
[i
]);
2163 switch (cflag
& CSIZE
) {
2165 info
->cor1
= Cy_5_BITS
;
2168 info
->cor1
= Cy_6_BITS
;
2171 info
->cor1
= Cy_7_BITS
;
2174 info
->cor1
= Cy_8_BITS
;
2178 info
->cor1
|= Cy_2_STOP
;
2180 if (cflag
& PARENB
) {
2182 info
->cor1
|= CyPARITY_O
;
2184 info
->cor1
|= CyPARITY_E
;
2186 info
->cor1
|= CyPARITY_NONE
;
2188 /* CTS flow control flag */
2189 if (cflag
& CRTSCTS
) {
2190 info
->port
.flags
|= ASYNC_CTS_FLOW
;
2191 info
->cor2
|= CyCtsAE
;
2193 info
->port
.flags
&= ~ASYNC_CTS_FLOW
;
2194 info
->cor2
&= ~CyCtsAE
;
2197 info
->port
.flags
&= ~ASYNC_CHECK_CD
;
2199 info
->port
.flags
|= ASYNC_CHECK_CD
;
2201 /***********************************************
2202 The hardware option, CyRtsAO, presents RTS when
2203 the chip has characters to send. Since most modems
2204 use RTS as reverse (inbound) flow control, this
2205 option is not used. If inbound flow control is
2206 necessary, DTR can be programmed to provide the
2207 appropriate signals for use with a non-standard
2208 cable. Contact Marcio Saito for details.
2209 ***********************************************/
2211 chip
= channel
>> 2;
2213 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2215 spin_lock_irqsave(&card
->card_lock
, flags
);
2216 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
2218 /* tx and rx baud rate */
2220 cy_writeb(base_addr
+ (CyTCOR
<< index
), info
->tco
);
2221 cy_writeb(base_addr
+ (CyTBPR
<< index
), info
->tbpr
);
2222 cy_writeb(base_addr
+ (CyRCOR
<< index
), info
->rco
);
2223 cy_writeb(base_addr
+ (CyRBPR
<< index
), info
->rbpr
);
2225 /* set line characteristics according configuration */
2227 cy_writeb(base_addr
+ (CySCHR1
<< index
), START_CHAR(tty
));
2228 cy_writeb(base_addr
+ (CySCHR2
<< index
), STOP_CHAR(tty
));
2229 cy_writeb(base_addr
+ (CyCOR1
<< index
), info
->cor1
);
2230 cy_writeb(base_addr
+ (CyCOR2
<< index
), info
->cor2
);
2231 cy_writeb(base_addr
+ (CyCOR3
<< index
), info
->cor3
);
2232 cy_writeb(base_addr
+ (CyCOR4
<< index
), info
->cor4
);
2233 cy_writeb(base_addr
+ (CyCOR5
<< index
), info
->cor5
);
2235 cyy_issue_cmd(base_addr
, CyCOR_CHANGE
| CyCOR1ch
| CyCOR2ch
|
2238 /* !!! Is this needed? */
2239 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
2240 cy_writeb(base_addr
+ (CyRTPR
<< index
),
2241 (info
->default_timeout
? info
->default_timeout
: 0x02));
2242 /* 10ms rx timeout */
2244 if (C_CLOCAL(tty
)) {
2245 /* without modem intr */
2246 cy_writeb(base_addr
+ (CySRER
<< index
),
2247 readb(base_addr
+ (CySRER
<< index
)) | CyMdmCh
);
2248 /* act on 1->0 modem transitions */
2249 if ((cflag
& CRTSCTS
) && info
->rflow
) {
2250 cy_writeb(base_addr
+ (CyMCOR1
<< index
),
2251 (CyCTS
| rflow_thr
[i
]));
2253 cy_writeb(base_addr
+ (CyMCOR1
<< index
),
2256 /* act on 0->1 modem transitions */
2257 cy_writeb(base_addr
+ (CyMCOR2
<< index
), CyCTS
);
2259 /* without modem intr */
2260 cy_writeb(base_addr
+ (CySRER
<< index
),
2262 (CySRER
<< index
)) | CyMdmCh
);
2263 /* act on 1->0 modem transitions */
2264 if ((cflag
& CRTSCTS
) && info
->rflow
) {
2265 cy_writeb(base_addr
+ (CyMCOR1
<< index
),
2266 (CyDSR
| CyCTS
| CyRI
| CyDCD
|
2269 cy_writeb(base_addr
+ (CyMCOR1
<< index
),
2270 CyDSR
| CyCTS
| CyRI
| CyDCD
);
2272 /* act on 0->1 modem transitions */
2273 cy_writeb(base_addr
+ (CyMCOR2
<< index
),
2274 CyDSR
| CyCTS
| CyRI
| CyDCD
);
2277 if (i
== 0) /* baud rate is zero, turn off line */
2278 cyy_change_rts_dtr(info
, 0, TIOCM_DTR
);
2280 cyy_change_rts_dtr(info
, TIOCM_DTR
, 0);
2282 clear_bit(TTY_IO_ERROR
, &tty
->flags
);
2283 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2286 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
2290 if (!cyz_is_loaded(card
))
2294 baud
= tty_get_baud_rate(tty
);
2295 if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2297 if (info
->custom_divisor
)
2298 baud_rate
= info
->baud
/ info
->custom_divisor
;
2300 baud_rate
= info
->baud
;
2301 } else if (baud
> CYZ_MAX_SPEED
) {
2302 baud
= CYZ_MAX_SPEED
;
2304 cy_writel(&ch_ctrl
->comm_baud
, baud
);
2307 /* get it right for 134.5 baud */
2308 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 30 / 269) +
2310 } else if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2312 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2315 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2317 /* this needs to be propagated into the card info */
2322 /* byte size and parity */
2323 switch (cflag
& CSIZE
) {
2325 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS5
);
2328 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS6
);
2331 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS7
);
2334 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS8
);
2337 if (cflag
& CSTOPB
) {
2338 cy_writel(&ch_ctrl
->comm_data_l
,
2339 readl(&ch_ctrl
->comm_data_l
) | C_DL_2STOP
);
2341 cy_writel(&ch_ctrl
->comm_data_l
,
2342 readl(&ch_ctrl
->comm_data_l
) | C_DL_1STOP
);
2344 if (cflag
& PARENB
) {
2346 cy_writel(&ch_ctrl
->comm_parity
, C_PR_ODD
);
2348 cy_writel(&ch_ctrl
->comm_parity
, C_PR_EVEN
);
2350 cy_writel(&ch_ctrl
->comm_parity
, C_PR_NONE
);
2352 /* CTS flow control flag */
2353 if (cflag
& CRTSCTS
) {
2354 cy_writel(&ch_ctrl
->hw_flow
,
2355 readl(&ch_ctrl
->hw_flow
) | C_RS_CTS
| C_RS_RTS
);
2357 cy_writel(&ch_ctrl
->hw_flow
, readl(&ch_ctrl
->hw_flow
) &
2358 ~(C_RS_CTS
| C_RS_RTS
));
2360 /* As the HW flow control is done in firmware, the driver
2361 doesn't need to care about it */
2362 info
->port
.flags
&= ~ASYNC_CTS_FLOW
;
2364 /* XON/XOFF/XANY flow control flags */
2367 sw_flow
|= C_FL_OXX
;
2369 sw_flow
|= C_FL_OIXANY
;
2371 cy_writel(&ch_ctrl
->sw_flow
, sw_flow
);
2373 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTL
, 0L);
2375 printk(KERN_ERR
"cyc:set_line_char retval on ttyC%d "
2376 "was %x\n", info
->line
, retval
);
2379 /* CD sensitivity */
2381 info
->port
.flags
&= ~ASYNC_CHECK_CD
;
2383 info
->port
.flags
|= ASYNC_CHECK_CD
;
2385 if (baud
== 0) { /* baud rate is zero, turn off line */
2386 cy_writel(&ch_ctrl
->rs_control
,
2387 readl(&ch_ctrl
->rs_control
) & ~C_RS_DTR
);
2389 printk(KERN_DEBUG
"cyc:set_line_char dropping Z DTR\n");
2392 cy_writel(&ch_ctrl
->rs_control
,
2393 readl(&ch_ctrl
->rs_control
) | C_RS_DTR
);
2395 printk(KERN_DEBUG
"cyc:set_line_char raising Z DTR\n");
2399 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTLM
, 0L);
2401 printk(KERN_ERR
"cyc:set_line_char(2) retval on ttyC%d "
2402 "was %x\n", info
->line
, retval
);
2405 clear_bit(TTY_IO_ERROR
, &tty
->flags
);
2407 } /* set_line_char */
2409 static int cy_get_serial_info(struct cyclades_port
*info
,
2410 struct serial_struct __user
*retinfo
)
2412 struct cyclades_card
*cinfo
= info
->card
;
2413 struct serial_struct tmp
= {
2416 .port
= (info
->card
- cy_card
) * 0x100 + info
->line
-
2419 .flags
= info
->port
.flags
,
2420 .close_delay
= info
->port
.close_delay
,
2421 .closing_wait
= info
->port
.closing_wait
,
2422 .baud_base
= info
->baud
,
2423 .custom_divisor
= info
->custom_divisor
,
2426 return copy_to_user(retinfo
, &tmp
, sizeof(*retinfo
)) ? -EFAULT
: 0;
2430 cy_set_serial_info(struct cyclades_port
*info
, struct tty_struct
*tty
,
2431 struct serial_struct __user
*new_info
)
2433 struct serial_struct new_serial
;
2435 if (copy_from_user(&new_serial
, new_info
, sizeof(new_serial
)))
2438 if (!capable(CAP_SYS_ADMIN
)) {
2439 if (new_serial
.close_delay
!= info
->port
.close_delay
||
2440 new_serial
.baud_base
!= info
->baud
||
2441 (new_serial
.flags
& ASYNC_FLAGS
&
2443 (info
->port
.flags
& ASYNC_FLAGS
& ~ASYNC_USR_MASK
))
2445 info
->port
.flags
= (info
->port
.flags
& ~ASYNC_USR_MASK
) |
2446 (new_serial
.flags
& ASYNC_USR_MASK
);
2447 info
->baud
= new_serial
.baud_base
;
2448 info
->custom_divisor
= new_serial
.custom_divisor
;
2449 goto check_and_exit
;
2453 * OK, past this point, all the error checking has been done.
2454 * At this point, we start making changes.....
2457 info
->baud
= new_serial
.baud_base
;
2458 info
->custom_divisor
= new_serial
.custom_divisor
;
2459 info
->port
.flags
= (info
->port
.flags
& ~ASYNC_FLAGS
) |
2460 (new_serial
.flags
& ASYNC_FLAGS
);
2461 info
->port
.close_delay
= new_serial
.close_delay
* HZ
/ 100;
2462 info
->port
.closing_wait
= new_serial
.closing_wait
* HZ
/ 100;
2465 if (info
->port
.flags
& ASYNC_INITIALIZED
) {
2466 cy_set_line_char(info
, tty
);
2469 return cy_startup(info
, tty
);
2471 } /* set_serial_info */
2474 * get_lsr_info - get line status register info
2476 * Purpose: Let user call ioctl() to get info when the UART physically
2477 * is emptied. On bus types like RS485, the transmitter must
2478 * release the bus after transmitting. This must be done when
2479 * the transmit shift register is empty, not be done when the
2480 * transmit holding register is empty. This functionality
2481 * allows an RS485 driver to be written in user space.
2483 static int get_lsr_info(struct cyclades_port
*info
, unsigned int __user
*value
)
2485 struct cyclades_card
*card
;
2486 int chip
, channel
, index
;
2487 unsigned char status
;
2488 unsigned int result
;
2489 unsigned long flags
;
2490 void __iomem
*base_addr
;
2493 channel
= (info
->line
) - (card
->first_line
);
2494 if (!cy_is_Z(card
)) {
2495 chip
= channel
>> 2;
2497 index
= card
->bus_index
;
2498 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2500 spin_lock_irqsave(&card
->card_lock
, flags
);
2501 status
= readb(base_addr
+ (CySRER
<< index
)) &
2502 (CyTxRdy
| CyTxMpty
);
2503 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2504 result
= (status
? 0 : TIOCSER_TEMT
);
2506 /* Not supported yet */
2509 return put_user(result
, (unsigned long __user
*)value
);
2512 static int cy_tiocmget(struct tty_struct
*tty
, struct file
*file
)
2514 struct cyclades_port
*info
= tty
->driver_data
;
2515 struct cyclades_card
*card
;
2516 void __iomem
*base_addr
;
2517 int result
, channel
;
2519 if (serial_paranoia_check(info
, tty
->name
, __func__
))
2523 channel
= info
->line
- card
->first_line
;
2526 if (!cy_is_Z(card
)) {
2527 unsigned long flags
;
2528 unsigned char status
;
2529 int chip
= channel
>> 2;
2530 int index
= card
->bus_index
;
2533 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2535 spin_lock_irqsave(&card
->card_lock
, flags
);
2536 cy_writeb(base_addr
+ (CyCAR
<< index
), (u8
)channel
);
2537 status
= readb(base_addr
+ (CyMSVR1
<< index
));
2538 status
|= readb(base_addr
+ (CyMSVR2
<< index
));
2539 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2541 if (info
->rtsdtr_inv
) {
2542 result
= ((status
& CyRTS
) ? TIOCM_DTR
: 0) |
2543 ((status
& CyDTR
) ? TIOCM_RTS
: 0);
2545 result
= ((status
& CyRTS
) ? TIOCM_RTS
: 0) |
2546 ((status
& CyDTR
) ? TIOCM_DTR
: 0);
2548 result
|= ((status
& CyDCD
) ? TIOCM_CAR
: 0) |
2549 ((status
& CyRI
) ? TIOCM_RNG
: 0) |
2550 ((status
& CyDSR
) ? TIOCM_DSR
: 0) |
2551 ((status
& CyCTS
) ? TIOCM_CTS
: 0);
2555 if (!cyz_is_loaded(card
)) {
2560 lstatus
= readl(&info
->u
.cyz
.ch_ctrl
->rs_status
);
2561 result
= ((lstatus
& C_RS_RTS
) ? TIOCM_RTS
: 0) |
2562 ((lstatus
& C_RS_DTR
) ? TIOCM_DTR
: 0) |
2563 ((lstatus
& C_RS_DCD
) ? TIOCM_CAR
: 0) |
2564 ((lstatus
& C_RS_RI
) ? TIOCM_RNG
: 0) |
2565 ((lstatus
& C_RS_DSR
) ? TIOCM_DSR
: 0) |
2566 ((lstatus
& C_RS_CTS
) ? TIOCM_CTS
: 0);
2574 cy_tiocmset(struct tty_struct
*tty
, struct file
*file
,
2575 unsigned int set
, unsigned int clear
)
2577 struct cyclades_port
*info
= tty
->driver_data
;
2578 struct cyclades_card
*card
;
2579 unsigned long flags
;
2581 if (serial_paranoia_check(info
, tty
->name
, __func__
))
2585 if (!cy_is_Z(card
)) {
2586 spin_lock_irqsave(&card
->card_lock
, flags
);
2587 cyy_change_rts_dtr(info
, set
, clear
);
2588 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2590 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
2591 int retval
, channel
= info
->line
- card
->first_line
;
2594 if (!cyz_is_loaded(card
))
2597 spin_lock_irqsave(&card
->card_lock
, flags
);
2598 rs
= readl(&ch_ctrl
->rs_control
);
2599 if (set
& TIOCM_RTS
)
2601 if (clear
& TIOCM_RTS
)
2603 if (set
& TIOCM_DTR
) {
2606 printk(KERN_DEBUG
"cyc:set_modem_info raising Z DTR\n");
2609 if (clear
& TIOCM_DTR
) {
2612 printk(KERN_DEBUG
"cyc:set_modem_info clearing "
2616 cy_writel(&ch_ctrl
->rs_control
, rs
);
2617 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTLM
, 0L);
2618 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2620 printk(KERN_ERR
"cyc:set_modem_info retval on ttyC%d "
2621 "was %x\n", info
->line
, retval
);
2628 * cy_break() --- routine which turns the break handling on or off
2630 static int cy_break(struct tty_struct
*tty
, int break_state
)
2632 struct cyclades_port
*info
= tty
->driver_data
;
2633 struct cyclades_card
*card
;
2634 unsigned long flags
;
2637 if (serial_paranoia_check(info
, tty
->name
, "cy_break"))
2642 spin_lock_irqsave(&card
->card_lock
, flags
);
2643 if (!cy_is_Z(card
)) {
2644 /* Let the transmit ISR take care of this (since it
2645 requires stuffing characters into the output stream).
2647 if (break_state
== -1) {
2648 if (!info
->breakon
) {
2650 if (!info
->xmit_cnt
) {
2651 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2653 spin_lock_irqsave(&card
->card_lock
, flags
);
2657 if (!info
->breakoff
) {
2659 if (!info
->xmit_cnt
) {
2660 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2662 spin_lock_irqsave(&card
->card_lock
, flags
);
2667 if (break_state
== -1) {
2668 retval
= cyz_issue_cmd(card
,
2669 info
->line
- card
->first_line
,
2670 C_CM_SET_BREAK
, 0L);
2672 printk(KERN_ERR
"cyc:cy_break (set) retval on "
2673 "ttyC%d was %x\n", info
->line
, retval
);
2676 retval
= cyz_issue_cmd(card
,
2677 info
->line
- card
->first_line
,
2678 C_CM_CLR_BREAK
, 0L);
2680 printk(KERN_DEBUG
"cyc:cy_break (clr) retval "
2681 "on ttyC%d was %x\n", info
->line
,
2686 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2690 static int set_threshold(struct cyclades_port
*info
, unsigned long value
)
2692 struct cyclades_card
*card
;
2693 void __iomem
*base_addr
;
2694 int channel
, chip
, index
;
2695 unsigned long flags
;
2698 channel
= info
->line
- card
->first_line
;
2699 if (!cy_is_Z(card
)) {
2700 chip
= channel
>> 2;
2702 index
= card
->bus_index
;
2704 card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2706 info
->cor3
&= ~CyREC_FIFO
;
2707 info
->cor3
|= value
& CyREC_FIFO
;
2709 spin_lock_irqsave(&card
->card_lock
, flags
);
2710 cy_writeb(base_addr
+ (CyCOR3
<< index
), info
->cor3
);
2711 cyy_issue_cmd(base_addr
, CyCOR_CHANGE
| CyCOR3ch
, index
);
2712 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2715 } /* set_threshold */
2717 static int get_threshold(struct cyclades_port
*info
,
2718 unsigned long __user
*value
)
2720 struct cyclades_card
*card
;
2721 void __iomem
*base_addr
;
2722 int channel
, chip
, index
;
2726 channel
= info
->line
- card
->first_line
;
2727 if (!cy_is_Z(card
)) {
2728 chip
= channel
>> 2;
2730 index
= card
->bus_index
;
2731 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2733 tmp
= readb(base_addr
+ (CyCOR3
<< index
)) & CyREC_FIFO
;
2734 return put_user(tmp
, value
);
2737 } /* get_threshold */
2739 static int set_timeout(struct cyclades_port
*info
, unsigned long value
)
2741 struct cyclades_card
*card
;
2742 void __iomem
*base_addr
;
2743 int channel
, chip
, index
;
2744 unsigned long flags
;
2747 channel
= info
->line
- card
->first_line
;
2748 if (!cy_is_Z(card
)) {
2749 chip
= channel
>> 2;
2751 index
= card
->bus_index
;
2752 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2754 spin_lock_irqsave(&card
->card_lock
, flags
);
2755 cy_writeb(base_addr
+ (CyRTPR
<< index
), value
& 0xff);
2756 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2761 static int get_timeout(struct cyclades_port
*info
,
2762 unsigned long __user
*value
)
2764 struct cyclades_card
*card
;
2765 void __iomem
*base_addr
;
2766 int channel
, chip
, index
;
2770 channel
= info
->line
- card
->first_line
;
2771 if (!cy_is_Z(card
)) {
2772 chip
= channel
>> 2;
2774 index
= card
->bus_index
;
2775 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2777 tmp
= readb(base_addr
+ (CyRTPR
<< index
));
2778 return put_user(tmp
, value
);
2783 static int cy_cflags_changed(struct cyclades_port
*info
, unsigned long arg
,
2784 struct cyclades_icount
*cprev
)
2786 struct cyclades_icount cnow
;
2787 unsigned long flags
;
2790 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
2791 cnow
= info
->icount
; /* atomic copy */
2792 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
2794 ret
= ((arg
& TIOCM_RNG
) && (cnow
.rng
!= cprev
->rng
)) ||
2795 ((arg
& TIOCM_DSR
) && (cnow
.dsr
!= cprev
->dsr
)) ||
2796 ((arg
& TIOCM_CD
) && (cnow
.dcd
!= cprev
->dcd
)) ||
2797 ((arg
& TIOCM_CTS
) && (cnow
.cts
!= cprev
->cts
));
2805 * This routine allows the tty driver to implement device-
2806 * specific ioctl's. If the ioctl number passed in cmd is
2807 * not recognized by the driver, it should return ENOIOCTLCMD.
2810 cy_ioctl(struct tty_struct
*tty
, struct file
*file
,
2811 unsigned int cmd
, unsigned long arg
)
2813 struct cyclades_port
*info
= tty
->driver_data
;
2814 struct cyclades_icount cnow
; /* kernel counter temps */
2816 unsigned long flags
;
2817 void __user
*argp
= (void __user
*)arg
;
2819 if (serial_paranoia_check(info
, tty
->name
, "cy_ioctl"))
2822 #ifdef CY_DEBUG_OTHER
2823 printk(KERN_DEBUG
"cyc:cy_ioctl ttyC%d, cmd = %x arg = %lx\n",
2824 info
->line
, cmd
, arg
);
2830 if (copy_to_user(argp
, &info
->mon
, sizeof(info
->mon
))) {
2834 memset(&info
->mon
, 0, sizeof(info
->mon
));
2837 ret_val
= get_threshold(info
, argp
);
2840 ret_val
= set_threshold(info
, arg
);
2842 case CYGETDEFTHRESH
:
2843 ret_val
= put_user(info
->default_threshold
,
2844 (unsigned long __user
*)argp
);
2846 case CYSETDEFTHRESH
:
2847 info
->default_threshold
= arg
& 0x0f;
2850 ret_val
= get_timeout(info
, argp
);
2853 ret_val
= set_timeout(info
, arg
);
2855 case CYGETDEFTIMEOUT
:
2856 ret_val
= put_user(info
->default_timeout
,
2857 (unsigned long __user
*)argp
);
2859 case CYSETDEFTIMEOUT
:
2860 info
->default_timeout
= arg
& 0xff;
2863 info
->rflow
= (int)arg
;
2866 ret_val
= info
->rflow
;
2868 case CYSETRTSDTR_INV
:
2869 info
->rtsdtr_inv
= (int)arg
;
2871 case CYGETRTSDTR_INV
:
2872 ret_val
= info
->rtsdtr_inv
;
2874 case CYGETCD1400VER
:
2875 ret_val
= info
->chip_rev
;
2877 #ifndef CONFIG_CYZ_INTR
2878 case CYZSETPOLLCYCLE
:
2879 cyz_polling_cycle
= (arg
* HZ
) / 1000;
2881 case CYZGETPOLLCYCLE
:
2882 ret_val
= (cyz_polling_cycle
* 1000) / HZ
;
2884 #endif /* CONFIG_CYZ_INTR */
2886 info
->port
.closing_wait
= (unsigned short)arg
* HZ
/ 100;
2889 ret_val
= info
->port
.closing_wait
/ (HZ
/ 100);
2892 ret_val
= cy_get_serial_info(info
, argp
);
2895 ret_val
= cy_set_serial_info(info
, tty
, argp
);
2897 case TIOCSERGETLSR
: /* Get line status register */
2898 ret_val
= get_lsr_info(info
, argp
);
2901 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
2902 * - mask passed in arg for lines of interest
2903 * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
2904 * Caller should use TIOCGICOUNT to see which one it was
2907 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
2908 /* note the counters on entry */
2909 cnow
= info
->icount
;
2910 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
2911 ret_val
= wait_event_interruptible(info
->delta_msr_wait
,
2912 cy_cflags_changed(info
, arg
, &cnow
));
2916 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
2917 * Return: write counters to the user passed counter struct
2918 * NB: both 1->0 and 0->1 transitions are counted except for
2919 * RI where only 0->1 is counted.
2922 struct serial_icounter_struct sic
= { };
2924 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
2925 cnow
= info
->icount
;
2926 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
2934 sic
.frame
= cnow
.frame
;
2935 sic
.overrun
= cnow
.overrun
;
2936 sic
.parity
= cnow
.parity
;
2938 sic
.buf_overrun
= cnow
.buf_overrun
;
2940 if (copy_to_user(argp
, &sic
, sizeof(sic
)))
2945 ret_val
= -ENOIOCTLCMD
;
2949 #ifdef CY_DEBUG_OTHER
2950 printk(KERN_DEBUG
"cyc:cy_ioctl done\n");
2956 * This routine allows the tty driver to be notified when
2957 * device's termios settings have changed. Note that a
2958 * well-designed tty driver should be prepared to accept the case
2959 * where old == NULL, and try to do something rational.
2961 static void cy_set_termios(struct tty_struct
*tty
, struct ktermios
*old_termios
)
2963 struct cyclades_port
*info
= tty
->driver_data
;
2965 #ifdef CY_DEBUG_OTHER
2966 printk(KERN_DEBUG
"cyc:cy_set_termios ttyC%d\n", info
->line
);
2969 cy_set_line_char(info
, tty
);
2971 if ((old_termios
->c_cflag
& CRTSCTS
) &&
2972 !(tty
->termios
->c_cflag
& CRTSCTS
)) {
2973 tty
->hw_stopped
= 0;
2978 * No need to wake up processes in open wait, since they
2979 * sample the CLOCAL flag once, and don't recheck it.
2980 * XXX It's not clear whether the current behavior is correct
2981 * or not. Hence, this may change.....
2983 if (!(old_termios
->c_cflag
& CLOCAL
) &&
2984 (tty
->termios
->c_cflag
& CLOCAL
))
2985 wake_up_interruptible(&info
->port
.open_wait
);
2987 } /* cy_set_termios */
2989 /* This function is used to send a high-priority XON/XOFF character to
2992 static void cy_send_xchar(struct tty_struct
*tty
, char ch
)
2994 struct cyclades_port
*info
= tty
->driver_data
;
2995 struct cyclades_card
*card
;
2998 if (serial_paranoia_check(info
, tty
->name
, "cy_send_xchar"))
3007 channel
= info
->line
- card
->first_line
;
3009 if (cy_is_Z(card
)) {
3010 if (ch
== STOP_CHAR(tty
))
3011 cyz_issue_cmd(card
, channel
, C_CM_SENDXOFF
, 0L);
3012 else if (ch
== START_CHAR(tty
))
3013 cyz_issue_cmd(card
, channel
, C_CM_SENDXON
, 0L);
3017 /* This routine is called by the upper-layer tty layer to signal
3018 that incoming characters should be throttled because the input
3019 buffers are close to full.
3021 static void cy_throttle(struct tty_struct
*tty
)
3023 struct cyclades_port
*info
= tty
->driver_data
;
3024 struct cyclades_card
*card
;
3025 unsigned long flags
;
3027 #ifdef CY_DEBUG_THROTTLE
3030 printk(KERN_DEBUG
"cyc:throttle %s: %ld...ttyC%d\n", tty_name(tty
, buf
),
3031 tty
->ldisc
.chars_in_buffer(tty
), info
->line
);
3034 if (serial_paranoia_check(info
, tty
->name
, "cy_throttle"))
3041 cy_send_xchar(tty
, STOP_CHAR(tty
));
3046 if (tty
->termios
->c_cflag
& CRTSCTS
) {
3047 if (!cy_is_Z(card
)) {
3048 spin_lock_irqsave(&card
->card_lock
, flags
);
3049 cyy_change_rts_dtr(info
, 0, TIOCM_RTS
);
3050 spin_unlock_irqrestore(&card
->card_lock
, flags
);
3058 * This routine notifies the tty driver that it should signal
3059 * that characters can now be sent to the tty without fear of
3060 * overrunning the input buffers of the line disciplines.
3062 static void cy_unthrottle(struct tty_struct
*tty
)
3064 struct cyclades_port
*info
= tty
->driver_data
;
3065 struct cyclades_card
*card
;
3066 unsigned long flags
;
3068 #ifdef CY_DEBUG_THROTTLE
3071 printk(KERN_DEBUG
"cyc:unthrottle %s: %ld...ttyC%d\n",
3072 tty_name(tty
, buf
), tty_chars_in_buffer(tty
), info
->line
);
3075 if (serial_paranoia_check(info
, tty
->name
, "cy_unthrottle"))
3082 cy_send_xchar(tty
, START_CHAR(tty
));
3085 if (tty
->termios
->c_cflag
& CRTSCTS
) {
3087 if (!cy_is_Z(card
)) {
3088 spin_lock_irqsave(&card
->card_lock
, flags
);
3089 cyy_change_rts_dtr(info
, TIOCM_RTS
, 0);
3090 spin_unlock_irqrestore(&card
->card_lock
, flags
);
3095 } /* cy_unthrottle */
3097 /* cy_start and cy_stop provide software output flow control as a
3098 function of XON/XOFF, software CTS, and other such stuff.
3100 static void cy_stop(struct tty_struct
*tty
)
3102 struct cyclades_card
*cinfo
;
3103 struct cyclades_port
*info
= tty
->driver_data
;
3104 void __iomem
*base_addr
;
3105 int chip
, channel
, index
;
3106 unsigned long flags
;
3108 #ifdef CY_DEBUG_OTHER
3109 printk(KERN_DEBUG
"cyc:cy_stop ttyC%d\n", info
->line
);
3112 if (serial_paranoia_check(info
, tty
->name
, "cy_stop"))
3116 channel
= info
->line
- cinfo
->first_line
;
3117 if (!cy_is_Z(cinfo
)) {
3118 index
= cinfo
->bus_index
;
3119 chip
= channel
>> 2;
3121 base_addr
= cinfo
->base_addr
+ (cy_chip_offset
[chip
] << index
);
3123 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3124 cy_writeb(base_addr
+ (CyCAR
<< index
),
3125 (u_char
)(channel
& 0x0003)); /* index channel */
3126 cy_writeb(base_addr
+ (CySRER
<< index
),
3127 readb(base_addr
+ (CySRER
<< index
)) & ~CyTxRdy
);
3128 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3132 static void cy_start(struct tty_struct
*tty
)
3134 struct cyclades_card
*cinfo
;
3135 struct cyclades_port
*info
= tty
->driver_data
;
3136 void __iomem
*base_addr
;
3137 int chip
, channel
, index
;
3138 unsigned long flags
;
3140 #ifdef CY_DEBUG_OTHER
3141 printk(KERN_DEBUG
"cyc:cy_start ttyC%d\n", info
->line
);
3144 if (serial_paranoia_check(info
, tty
->name
, "cy_start"))
3148 channel
= info
->line
- cinfo
->first_line
;
3149 index
= cinfo
->bus_index
;
3150 if (!cy_is_Z(cinfo
)) {
3151 chip
= channel
>> 2;
3153 base_addr
= cinfo
->base_addr
+ (cy_chip_offset
[chip
] << index
);
3155 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3156 cy_writeb(base_addr
+ (CyCAR
<< index
),
3157 (u_char
) (channel
& 0x0003)); /* index channel */
3158 cy_writeb(base_addr
+ (CySRER
<< index
),
3159 readb(base_addr
+ (CySRER
<< index
)) | CyTxRdy
);
3160 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3165 * cy_hangup() --- called by tty_hangup() when a hangup is signaled.
3167 static void cy_hangup(struct tty_struct
*tty
)
3169 struct cyclades_port
*info
= tty
->driver_data
;
3171 #ifdef CY_DEBUG_OTHER
3172 printk(KERN_DEBUG
"cyc:cy_hangup ttyC%d\n", info
->line
);
3175 if (serial_paranoia_check(info
, tty
->name
, "cy_hangup"))
3178 cy_flush_buffer(tty
);
3179 cy_shutdown(info
, tty
);
3180 tty_port_hangup(&info
->port
);
3183 static int cyy_carrier_raised(struct tty_port
*port
)
3185 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3187 struct cyclades_card
*cinfo
= info
->card
;
3188 void __iomem
*base
= cinfo
->base_addr
;
3189 unsigned long flags
;
3190 int channel
= info
->line
- cinfo
->first_line
;
3191 int chip
= channel
>> 2, index
= cinfo
->bus_index
;
3195 base
+= cy_chip_offset
[chip
] << index
;
3197 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3198 cy_writeb(base
+ (CyCAR
<< index
), (u8
)channel
);
3199 cd
= readb(base
+ (CyMSVR1
<< index
)) & CyDCD
;
3200 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3205 static void cyy_dtr_rts(struct tty_port
*port
, int raise
)
3207 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3209 struct cyclades_card
*cinfo
= info
->card
;
3210 unsigned long flags
;
3212 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3213 cyy_change_rts_dtr(info
, raise
? TIOCM_RTS
| TIOCM_DTR
: 0,
3214 raise
? 0 : TIOCM_RTS
| TIOCM_DTR
);
3215 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3218 static int cyz_carrier_raised(struct tty_port
*port
)
3220 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3223 return readl(&info
->u
.cyz
.ch_ctrl
->rs_status
) & C_RS_DCD
;
3226 static void cyz_dtr_rts(struct tty_port
*port
, int raise
)
3228 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3230 struct cyclades_card
*cinfo
= info
->card
;
3231 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
3232 int ret
, channel
= info
->line
- cinfo
->first_line
;
3235 rs
= readl(&ch_ctrl
->rs_control
);
3237 rs
|= C_RS_RTS
| C_RS_DTR
;
3239 rs
&= ~(C_RS_RTS
| C_RS_DTR
);
3240 cy_writel(&ch_ctrl
->rs_control
, rs
);
3241 ret
= cyz_issue_cmd(cinfo
, channel
, C_CM_IOCTLM
, 0L);
3243 printk(KERN_ERR
"%s: retval on ttyC%d was %x\n",
3244 __func__
, info
->line
, ret
);
3246 printk(KERN_DEBUG
"%s: raising Z DTR\n", __func__
);
3250 static const struct tty_port_operations cyy_port_ops
= {
3251 .carrier_raised
= cyy_carrier_raised
,
3252 .dtr_rts
= cyy_dtr_rts
,
3255 static const struct tty_port_operations cyz_port_ops
= {
3256 .carrier_raised
= cyz_carrier_raised
,
3257 .dtr_rts
= cyz_dtr_rts
,
3261 * ---------------------------------------------------------------------
3262 * cy_init() and friends
3264 * cy_init() is called at boot-time to initialize the serial driver.
3265 * ---------------------------------------------------------------------
3268 static int __devinit
cy_init_card(struct cyclades_card
*cinfo
)
3270 struct cyclades_port
*info
;
3271 unsigned int channel
, port
;
3273 spin_lock_init(&cinfo
->card_lock
);
3274 cinfo
->intr_enabled
= 0;
3276 cinfo
->ports
= kcalloc(cinfo
->nports
, sizeof(*cinfo
->ports
),
3278 if (cinfo
->ports
== NULL
) {
3279 printk(KERN_ERR
"Cyclades: cannot allocate ports\n");
3283 for (channel
= 0, port
= cinfo
->first_line
; channel
< cinfo
->nports
;
3284 channel
++, port
++) {
3285 info
= &cinfo
->ports
[channel
];
3286 tty_port_init(&info
->port
);
3287 info
->magic
= CYCLADES_MAGIC
;
3291 info
->port
.closing_wait
= CLOSING_WAIT_DELAY
;
3292 info
->port
.close_delay
= 5 * HZ
/ 10;
3293 info
->port
.flags
= STD_COM_FLAGS
;
3294 init_completion(&info
->shutdown_wait
);
3295 init_waitqueue_head(&info
->delta_msr_wait
);
3297 if (cy_is_Z(cinfo
)) {
3298 struct FIRM_ID
*firm_id
= cinfo
->base_addr
+ ID_ADDRESS
;
3299 struct ZFW_CTRL
*zfw_ctrl
;
3301 info
->port
.ops
= &cyz_port_ops
;
3302 info
->type
= PORT_STARTECH
;
3304 zfw_ctrl
= cinfo
->base_addr
+
3305 (readl(&firm_id
->zfwctrl_addr
) & 0xfffff);
3306 info
->u
.cyz
.ch_ctrl
= &zfw_ctrl
->ch_ctrl
[channel
];
3307 info
->u
.cyz
.buf_ctrl
= &zfw_ctrl
->buf_ctrl
[channel
];
3309 if (cinfo
->hw_ver
== ZO_V1
)
3310 info
->xmit_fifo_size
= CYZ_FIFO_SIZE
;
3312 info
->xmit_fifo_size
= 4 * CYZ_FIFO_SIZE
;
3313 #ifdef CONFIG_CYZ_INTR
3314 setup_timer(&cyz_rx_full_timer
[port
],
3315 cyz_rx_restart
, (unsigned long)info
);
3318 unsigned short chip_number
;
3319 int index
= cinfo
->bus_index
;
3321 info
->port
.ops
= &cyy_port_ops
;
3322 info
->type
= PORT_CIRRUS
;
3323 info
->xmit_fifo_size
= CyMAX_CHAR_FIFO
;
3324 info
->cor1
= CyPARITY_NONE
| Cy_1_STOP
| Cy_8_BITS
;
3326 info
->cor3
= 0x08; /* _very_ small rcv threshold */
3328 chip_number
= channel
/ CyPORTS_PER_CHIP
;
3329 info
->chip_rev
= readb(cinfo
->base_addr
+
3330 (cy_chip_offset
[chip_number
] << index
) +
3331 (CyGFRCR
<< index
));
3333 if (info
->chip_rev
>= CD1400_REV_J
) {
3334 /* It is a CD1400 rev. J or later */
3335 info
->tbpr
= baud_bpr_60
[13]; /* Tx BPR */
3336 info
->tco
= baud_co_60
[13]; /* Tx CO */
3337 info
->rbpr
= baud_bpr_60
[13]; /* Rx BPR */
3338 info
->rco
= baud_co_60
[13]; /* Rx CO */
3339 info
->rtsdtr_inv
= 1;
3341 info
->tbpr
= baud_bpr_25
[13]; /* Tx BPR */
3342 info
->tco
= baud_co_25
[13]; /* Tx CO */
3343 info
->rbpr
= baud_bpr_25
[13]; /* Rx BPR */
3344 info
->rco
= baud_co_25
[13]; /* Rx CO */
3345 info
->rtsdtr_inv
= 0;
3347 info
->read_status_mask
= CyTIMEOUT
| CySPECHAR
|
3348 CyBREAK
| CyPARITY
| CyFRAME
| CyOVERRUN
;
3353 #ifndef CONFIG_CYZ_INTR
3354 if (cy_is_Z(cinfo
) && !timer_pending(&cyz_timerlist
)) {
3355 mod_timer(&cyz_timerlist
, jiffies
+ 1);
3357 printk(KERN_DEBUG
"Cyclades-Z polling initialized\n");
3364 /* initialize chips on Cyclom-Y card -- return number of valid
3365 chips (which is number of ports/4) */
3366 static unsigned short __devinit
cyy_init_card(void __iomem
*true_base_addr
,
3369 unsigned int chip_number
;
3370 void __iomem
*base_addr
;
3372 cy_writeb(true_base_addr
+ (Cy_HwReset
<< index
), 0);
3373 /* Cy_HwReset is 0x1400 */
3374 cy_writeb(true_base_addr
+ (Cy_ClrIntr
<< index
), 0);
3375 /* Cy_ClrIntr is 0x1800 */
3378 for (chip_number
= 0; chip_number
< CyMAX_CHIPS_PER_CARD
;
3381 true_base_addr
+ (cy_chip_offset
[chip_number
] << index
);
3383 if (readb(base_addr
+ (CyCCR
<< index
)) != 0x00) {
3385 printk(" chip #%d at %#6lx is never idle (CCR != 0)\n",
3386 chip_number, (unsigned long)base_addr);
3391 cy_writeb(base_addr
+ (CyGFRCR
<< index
), 0);
3394 /* The Cyclom-16Y does not decode address bit 9 and therefore
3395 cannot distinguish between references to chip 0 and a non-
3396 existent chip 4. If the preceding clearing of the supposed
3397 chip 4 GFRCR register appears at chip 0, there is no chip 4
3398 and this must be a Cyclom-16Y, not a Cyclom-32Ye.
3400 if (chip_number
== 4 && readb(true_base_addr
+
3401 (cy_chip_offset
[0] << index
) +
3402 (CyGFRCR
<< index
)) == 0) {
3406 cy_writeb(base_addr
+ (CyCCR
<< index
), CyCHIP_RESET
);
3409 if (readb(base_addr
+ (CyGFRCR
<< index
)) == 0x00) {
3411 printk(" chip #%d at %#6lx is not responding ",
3412 chip_number, (unsigned long)base_addr);
3413 printk("(GFRCR stayed 0)\n",
3417 if ((0xf0 & (readb(base_addr
+ (CyGFRCR
<< index
)))) !=
3420 printk(" chip #%d at %#6lx is not valid (GFRCR == "
3422 chip_number, (unsigned long)base_addr,
3423 base_addr[CyGFRCR<<index]);
3427 cy_writeb(base_addr
+ (CyGCR
<< index
), CyCH0_SERIAL
);
3428 if (readb(base_addr
+ (CyGFRCR
<< index
)) >= CD1400_REV_J
) {
3429 /* It is a CD1400 rev. J or later */
3430 /* Impossible to reach 5ms with this chip.
3431 Changed to 2ms instead (f = 500 Hz). */
3432 cy_writeb(base_addr
+ (CyPPR
<< index
), CyCLOCK_60_2MS
);
3435 cy_writeb(base_addr
+ (CyPPR
<< index
), CyCLOCK_25_5MS
);
3439 printk(" chip #%d at %#6lx is rev 0x%2x\n",
3440 chip_number, (unsigned long)base_addr,
3441 readb(base_addr+(CyGFRCR<<index)));
3445 } /* cyy_init_card */
3448 * ---------------------------------------------------------------------
3449 * cy_detect_isa() - Probe for Cyclom-Y/ISA boards.
3450 * sets global variables and return the number of ISA boards found.
3451 * ---------------------------------------------------------------------
3453 static int __init
cy_detect_isa(void)
3456 unsigned short cy_isa_irq
, nboard
;
3457 void __iomem
*cy_isa_address
;
3458 unsigned short i
, j
, cy_isa_nchan
;
3466 /* Check for module parameters */
3467 for (i
= 0; i
< NR_CARDS
; i
++) {
3468 if (maddr
[i
] || i
) {
3470 cy_isa_addresses
[i
] = maddr
[i
];
3477 /* scan the address table probing for Cyclom-Y/ISA boards */
3478 for (i
= 0; i
< NR_ISA_ADDRS
; i
++) {
3479 unsigned int isa_address
= cy_isa_addresses
[i
];
3480 if (isa_address
== 0x0000)
3483 /* probe for CD1400... */
3484 cy_isa_address
= ioremap_nocache(isa_address
, CyISA_Ywin
);
3485 if (cy_isa_address
== NULL
) {
3486 printk(KERN_ERR
"Cyclom-Y/ISA: can't remap base "
3490 cy_isa_nchan
= CyPORTS_PER_CHIP
*
3491 cyy_init_card(cy_isa_address
, 0);
3492 if (cy_isa_nchan
== 0) {
3493 iounmap(cy_isa_address
);
3497 if (isparam
&& irq
[i
])
3498 cy_isa_irq
= irq
[i
];
3501 /* find out the board's irq by probing */
3502 cy_isa_irq
= detect_isa_irq(cy_isa_address
);
3503 if (cy_isa_irq
== 0) {
3504 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but the "
3505 "IRQ could not be detected.\n",
3506 (unsigned long)cy_isa_address
);
3507 iounmap(cy_isa_address
);
3511 if ((cy_next_channel
+ cy_isa_nchan
) > NR_PORTS
) {
3512 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but no "
3513 "more channels are available. Change NR_PORTS "
3514 "in cyclades.c and recompile kernel.\n",
3515 (unsigned long)cy_isa_address
);
3516 iounmap(cy_isa_address
);
3519 /* fill the next cy_card structure available */
3520 for (j
= 0; j
< NR_CARDS
; j
++) {
3521 if (cy_card
[j
].base_addr
== NULL
)
3524 if (j
== NR_CARDS
) { /* no more cy_cards available */
3525 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but no "
3526 "more cards can be used. Change NR_CARDS in "
3527 "cyclades.c and recompile kernel.\n",
3528 (unsigned long)cy_isa_address
);
3529 iounmap(cy_isa_address
);
3534 if (request_irq(cy_isa_irq
, cyy_interrupt
,
3535 IRQF_DISABLED
, "Cyclom-Y", &cy_card
[j
])) {
3536 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but "
3537 "could not allocate IRQ#%d.\n",
3538 (unsigned long)cy_isa_address
, cy_isa_irq
);
3539 iounmap(cy_isa_address
);
3544 cy_card
[j
].base_addr
= cy_isa_address
;
3545 cy_card
[j
].ctl_addr
.p9050
= NULL
;
3546 cy_card
[j
].irq
= (int)cy_isa_irq
;
3547 cy_card
[j
].bus_index
= 0;
3548 cy_card
[j
].first_line
= cy_next_channel
;
3549 cy_card
[j
].num_chips
= cy_isa_nchan
/ CyPORTS_PER_CHIP
;
3550 cy_card
[j
].nports
= cy_isa_nchan
;
3551 if (cy_init_card(&cy_card
[j
])) {
3552 cy_card
[j
].base_addr
= NULL
;
3553 free_irq(cy_isa_irq
, &cy_card
[j
]);
3554 iounmap(cy_isa_address
);
3559 printk(KERN_INFO
"Cyclom-Y/ISA #%d: 0x%lx-0x%lx, IRQ%d found: "
3560 "%d channels starting from port %d\n",
3561 j
+ 1, (unsigned long)cy_isa_address
,
3562 (unsigned long)(cy_isa_address
+ (CyISA_Ywin
- 1)),
3563 cy_isa_irq
, cy_isa_nchan
, cy_next_channel
);
3565 for (j
= cy_next_channel
;
3566 j
< cy_next_channel
+ cy_isa_nchan
; j
++)
3567 tty_register_device(cy_serial_driver
, j
, NULL
);
3568 cy_next_channel
+= cy_isa_nchan
;
3573 #endif /* CONFIG_ISA */
3574 } /* cy_detect_isa */
3577 static inline int __devinit
cyc_isfwstr(const char *str
, unsigned int size
)
3581 for (a
= 0; a
< size
&& *str
; a
++, str
++)
3585 for (; a
< size
; a
++, str
++)
3592 static inline void __devinit
cyz_fpga_copy(void __iomem
*fpga
, const u8
*data
,
3595 for (; size
> 0; size
--) {
3596 cy_writel(fpga
, *data
++);
3601 static void __devinit
plx_init(struct pci_dev
*pdev
, int irq
,
3602 struct RUNTIME_9060 __iomem
*addr
)
3605 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) | 0x40000000);
3607 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) & ~0x40000000);
3609 /* Reload Config. Registers from EEPROM */
3610 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) | 0x20000000);
3612 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) & ~0x20000000);
3614 /* For some yet unknown reason, once the PLX9060 reloads the EEPROM,
3615 * the IRQ is lost and, thus, we have to re-write it to the PCI config.
3616 * registers. This will remain here until we find a permanent fix.
3618 pci_write_config_byte(pdev
, PCI_INTERRUPT_LINE
, irq
);
3621 static int __devinit
__cyz_load_fw(const struct firmware
*fw
,
3622 const char *name
, const u32 mailbox
, void __iomem
*base
,
3625 const void *ptr
= fw
->data
;
3626 const struct zfile_header
*h
= ptr
;
3627 const struct zfile_config
*c
, *cs
;
3628 const struct zfile_block
*b
, *bs
;
3629 unsigned int a
, tmp
, len
= fw
->size
;
3630 #define BAD_FW KERN_ERR "Bad firmware: "
3631 if (len
< sizeof(*h
)) {
3632 printk(BAD_FW
"too short: %u<%zu\n", len
, sizeof(*h
));
3636 cs
= ptr
+ h
->config_offset
;
3637 bs
= ptr
+ h
->block_offset
;
3639 if ((void *)(cs
+ h
->n_config
) > ptr
+ len
||
3640 (void *)(bs
+ h
->n_blocks
) > ptr
+ len
) {
3641 printk(BAD_FW
"too short");
3645 if (cyc_isfwstr(h
->name
, sizeof(h
->name
)) ||
3646 cyc_isfwstr(h
->date
, sizeof(h
->date
))) {
3647 printk(BAD_FW
"bad formatted header string\n");
3651 if (strncmp(name
, h
->name
, sizeof(h
->name
))) {
3652 printk(BAD_FW
"bad name '%s' (expected '%s')\n", h
->name
, name
);
3657 for (c
= cs
; c
< cs
+ h
->n_config
; c
++) {
3658 for (a
= 0; a
< c
->n_blocks
; a
++)
3659 if (c
->block_list
[a
] > h
->n_blocks
) {
3660 printk(BAD_FW
"bad block ref number in cfgs\n");
3663 if (c
->mailbox
== mailbox
&& c
->function
== 0) /* 0 is normal */
3667 printk(BAD_FW
"nothing appropriate\n");
3671 for (b
= bs
; b
< bs
+ h
->n_blocks
; b
++)
3672 if (b
->file_offset
+ b
->size
> len
) {
3673 printk(BAD_FW
"bad block data offset\n");
3677 /* everything is OK, let's seek'n'load it */
3678 for (c
= cs
; c
< cs
+ h
->n_config
; c
++)
3679 if (c
->mailbox
== mailbox
&& c
->function
== 0)
3682 for (a
= 0; a
< c
->n_blocks
; a
++) {
3683 b
= &bs
[c
->block_list
[a
]];
3684 if (b
->type
== ZBLOCK_FPGA
) {
3686 cyz_fpga_copy(fpga
, ptr
+ b
->file_offset
,
3690 memcpy_toio(base
+ b
->ram_offset
,
3691 ptr
+ b
->file_offset
, b
->size
);
3698 static int __devinit
cyz_load_fw(struct pci_dev
*pdev
, void __iomem
*base_addr
,
3699 struct RUNTIME_9060 __iomem
*ctl_addr
, int irq
)
3701 const struct firmware
*fw
;
3702 struct FIRM_ID __iomem
*fid
= base_addr
+ ID_ADDRESS
;
3703 struct CUSTOM_REG __iomem
*cust
= base_addr
;
3704 struct ZFW_CTRL __iomem
*pt_zfwctrl
;
3706 u32 mailbox
, status
, nchan
;
3710 retval
= request_firmware(&fw
, "cyzfirm.bin", &pdev
->dev
);
3712 dev_err(&pdev
->dev
, "can't get firmware\n");
3716 /* Check whether the firmware is already loaded and running. If
3717 positive, skip this board */
3718 if (__cyz_fpga_loaded(ctl_addr
) && readl(&fid
->signature
) == ZFIRM_ID
) {
3719 u32 cntval
= readl(base_addr
+ 0x190);
3722 if (cntval
!= readl(base_addr
+ 0x190)) {
3723 /* FW counter is working, FW is running */
3724 dev_dbg(&pdev
->dev
, "Cyclades-Z FW already loaded. "
3725 "Skipping board.\n");
3732 cy_writel(&ctl_addr
->intr_ctrl_stat
, readl(&ctl_addr
->intr_ctrl_stat
) &
3735 mailbox
= readl(&ctl_addr
->mail_box_0
);
3737 if (mailbox
== 0 || __cyz_fpga_loaded(ctl_addr
)) {
3738 /* stops CPU and set window to beginning of RAM */
3739 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3740 cy_writel(&cust
->cpu_stop
, 0);
3741 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3745 plx_init(pdev
, irq
, ctl_addr
);
3749 retval
= __cyz_load_fw(fw
, "Cyclom-Z", mailbox
, NULL
,
3753 if (!__cyz_fpga_loaded(ctl_addr
)) {
3754 dev_err(&pdev
->dev
, "fw upload successful, but fw is "
3760 /* stops CPU and set window to beginning of RAM */
3761 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3762 cy_writel(&cust
->cpu_stop
, 0);
3763 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3767 for (tmp
= base_addr
; tmp
< base_addr
+ RAM_SIZE
; tmp
++)
3768 cy_writeb(tmp
, 255);
3770 /* set window to last 512K of RAM */
3771 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
+ RAM_SIZE
);
3772 for (tmp
= base_addr
; tmp
< base_addr
+ RAM_SIZE
; tmp
++)
3773 cy_writeb(tmp
, 255);
3774 /* set window to beginning of RAM */
3775 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3778 retval
= __cyz_load_fw(fw
, "Cyclom-Z", mailbox
, base_addr
, NULL
);
3779 release_firmware(fw
);
3783 /* finish boot and start boards */
3784 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3785 cy_writel(&cust
->cpu_start
, 0);
3786 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3788 while ((status
= readl(&fid
->signature
)) != ZFIRM_ID
&& i
++ < 40)
3790 if (status
!= ZFIRM_ID
) {
3791 if (status
== ZFIRM_HLT
) {
3792 dev_err(&pdev
->dev
, "you need an external power supply "
3793 "for this number of ports. Firmware halted and "
3798 dev_warn(&pdev
->dev
, "fid->signature = 0x%x... Waiting "
3799 "some more time\n", status
);
3800 while ((status
= readl(&fid
->signature
)) != ZFIRM_ID
&&
3803 if (status
!= ZFIRM_ID
) {
3804 dev_err(&pdev
->dev
, "Board not started in 20 seconds! "
3805 "Giving up. (fid->signature = 0x%x)\n",
3807 dev_info(&pdev
->dev
, "*** Warning ***: if you are "
3808 "upgrading the FW, please power cycle the "
3809 "system before loading the new FW to the "
3812 if (__cyz_fpga_loaded(ctl_addr
))
3813 plx_init(pdev
, irq
, ctl_addr
);
3818 dev_dbg(&pdev
->dev
, "Firmware started after %d seconds.\n",
3821 pt_zfwctrl
= base_addr
+ readl(&fid
->zfwctrl_addr
);
3823 dev_dbg(&pdev
->dev
, "fid=> %p, zfwctrl_addr=> %x, npt_zfwctrl=> %p\n",
3824 base_addr
+ ID_ADDRESS
, readl(&fid
->zfwctrl_addr
),
3825 base_addr
+ readl(&fid
->zfwctrl_addr
));
3827 nchan
= readl(&pt_zfwctrl
->board_ctrl
.n_channel
);
3828 dev_info(&pdev
->dev
, "Cyclades-Z FW loaded: version = %x, ports = %u\n",
3829 readl(&pt_zfwctrl
->board_ctrl
.fw_version
), nchan
);
3832 dev_warn(&pdev
->dev
, "no Cyclades-Z ports were found. Please "
3833 "check the connection between the Z host card and the "
3834 "serial expanders.\n");
3836 if (__cyz_fpga_loaded(ctl_addr
))
3837 plx_init(pdev
, irq
, ctl_addr
);
3839 dev_info(&pdev
->dev
, "Null number of ports detected. Board "
3845 cy_writel(&pt_zfwctrl
->board_ctrl
.op_system
, C_OS_LINUX
);
3846 cy_writel(&pt_zfwctrl
->board_ctrl
.dr_version
, DRIVER_VERSION
);
3849 Early firmware failed to start looking for commands.
3850 This enables firmware interrupts for those commands.
3852 cy_writel(&ctl_addr
->intr_ctrl_stat
, readl(&ctl_addr
->intr_ctrl_stat
) |
3854 cy_writel(&ctl_addr
->intr_ctrl_stat
, readl(&ctl_addr
->intr_ctrl_stat
) |
3859 release_firmware(fw
);
3864 static int __devinit
cy_pci_probe(struct pci_dev
*pdev
,
3865 const struct pci_device_id
*ent
)
3867 void __iomem
*addr0
= NULL
, *addr2
= NULL
;
3868 char *card_name
= NULL
;
3869 u32
uninitialized_var(mailbox
);
3870 unsigned int device_id
, nchan
= 0, card_no
, i
;
3871 unsigned char plx_ver
;
3874 retval
= pci_enable_device(pdev
);
3876 dev_err(&pdev
->dev
, "cannot enable device\n");
3880 /* read PCI configuration area */
3882 device_id
= pdev
->device
& ~PCI_DEVICE_ID_MASK
;
3884 #if defined(__alpha__)
3885 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
) { /* below 1M? */
3886 dev_err(&pdev
->dev
, "Cyclom-Y/PCI not supported for low "
3887 "addresses on Alpha systems.\n");
3892 if (device_id
== PCI_DEVICE_ID_CYCLOM_Z_Lo
) {
3893 dev_err(&pdev
->dev
, "Cyclades-Z/PCI not supported for low "
3899 if (pci_resource_flags(pdev
, 2) & IORESOURCE_IO
) {
3900 dev_warn(&pdev
->dev
, "PCI I/O bit incorrectly set. Ignoring "
3902 pdev
->resource
[2].flags
&= ~IORESOURCE_IO
;
3905 retval
= pci_request_regions(pdev
, "cyclades");
3907 dev_err(&pdev
->dev
, "failed to reserve resources\n");
3912 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
||
3913 device_id
== PCI_DEVICE_ID_CYCLOM_Y_Hi
) {
3914 card_name
= "Cyclom-Y";
3916 addr0
= ioremap_nocache(pci_resource_start(pdev
, 0),
3918 if (addr0
== NULL
) {
3919 dev_err(&pdev
->dev
, "can't remap ctl region\n");
3922 addr2
= ioremap_nocache(pci_resource_start(pdev
, 2),
3924 if (addr2
== NULL
) {
3925 dev_err(&pdev
->dev
, "can't remap base region\n");
3929 nchan
= CyPORTS_PER_CHIP
* cyy_init_card(addr2
, 1);
3931 dev_err(&pdev
->dev
, "Cyclom-Y PCI host card with no "
3932 "Serial-Modules\n");
3935 } else if (device_id
== PCI_DEVICE_ID_CYCLOM_Z_Hi
) {
3936 struct RUNTIME_9060 __iomem
*ctl_addr
;
3938 ctl_addr
= addr0
= ioremap_nocache(pci_resource_start(pdev
, 0),
3940 if (addr0
== NULL
) {
3941 dev_err(&pdev
->dev
, "can't remap ctl region\n");
3945 /* Disable interrupts on the PLX before resetting it */
3946 cy_writew(&ctl_addr
->intr_ctrl_stat
,
3947 readw(&ctl_addr
->intr_ctrl_stat
) & ~0x0900);
3949 plx_init(pdev
, irq
, addr0
);
3951 mailbox
= readl(&ctl_addr
->mail_box_0
);
3953 addr2
= ioremap_nocache(pci_resource_start(pdev
, 2),
3954 mailbox
== ZE_V1
? CyPCI_Ze_win
: CyPCI_Zwin
);
3955 if (addr2
== NULL
) {
3956 dev_err(&pdev
->dev
, "can't remap base region\n");
3960 if (mailbox
== ZE_V1
) {
3961 card_name
= "Cyclades-Ze";
3963 card_name
= "Cyclades-8Zo";
3965 if (mailbox
== ZO_V1
) {
3966 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3967 dev_info(&pdev
->dev
, "Cyclades-8Zo/PCI: FPGA "
3968 "id %lx, ver %lx\n", (ulong
)(0xff &
3969 readl(&((struct CUSTOM_REG
*)addr2
)->
3970 fpga_id
)), (ulong
)(0xff &
3971 readl(&((struct CUSTOM_REG
*)addr2
)->
3973 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3975 dev_info(&pdev
->dev
, "Cyclades-Z/PCI: New "
3976 "Cyclades-Z board. FPGA not loaded\n");
3979 /* The following clears the firmware id word. This
3980 ensures that the driver will not attempt to talk to
3981 the board until it has been properly initialized.
3983 if ((mailbox
== ZO_V1
) || (mailbox
== ZO_V2
))
3984 cy_writel(addr2
+ ID_ADDRESS
, 0L);
3987 retval
= cyz_load_fw(pdev
, addr2
, addr0
, irq
);
3993 if ((cy_next_channel
+ nchan
) > NR_PORTS
) {
3994 dev_err(&pdev
->dev
, "Cyclades-8Zo/PCI found, but no "
3995 "channels are available. Change NR_PORTS in "
3996 "cyclades.c and recompile kernel.\n");
3999 /* fill the next cy_card structure available */
4000 for (card_no
= 0; card_no
< NR_CARDS
; card_no
++) {
4001 if (cy_card
[card_no
].base_addr
== NULL
)
4004 if (card_no
== NR_CARDS
) { /* no more cy_cards available */
4005 dev_err(&pdev
->dev
, "Cyclades-8Zo/PCI found, but no "
4006 "more cards can be used. Change NR_CARDS in "
4007 "cyclades.c and recompile kernel.\n");
4011 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
||
4012 device_id
== PCI_DEVICE_ID_CYCLOM_Y_Hi
) {
4014 retval
= request_irq(irq
, cyy_interrupt
,
4015 IRQF_SHARED
, "Cyclom-Y", &cy_card
[card_no
]);
4017 dev_err(&pdev
->dev
, "could not allocate IRQ\n");
4020 cy_card
[card_no
].num_chips
= nchan
/ CyPORTS_PER_CHIP
;
4022 struct FIRM_ID __iomem
*firm_id
= addr2
+ ID_ADDRESS
;
4023 struct ZFW_CTRL __iomem
*zfw_ctrl
;
4025 zfw_ctrl
= addr2
+ (readl(&firm_id
->zfwctrl_addr
) & 0xfffff);
4027 cy_card
[card_no
].hw_ver
= mailbox
;
4028 cy_card
[card_no
].num_chips
= (unsigned int)-1;
4029 cy_card
[card_no
].board_ctrl
= &zfw_ctrl
->board_ctrl
;
4030 #ifdef CONFIG_CYZ_INTR
4031 /* allocate IRQ only if board has an IRQ */
4032 if (irq
!= 0 && irq
!= 255) {
4033 retval
= request_irq(irq
, cyz_interrupt
,
4034 IRQF_SHARED
, "Cyclades-Z",
4037 dev_err(&pdev
->dev
, "could not allocate IRQ\n");
4041 #endif /* CONFIG_CYZ_INTR */
4045 cy_card
[card_no
].base_addr
= addr2
;
4046 cy_card
[card_no
].ctl_addr
.p9050
= addr0
;
4047 cy_card
[card_no
].irq
= irq
;
4048 cy_card
[card_no
].bus_index
= 1;
4049 cy_card
[card_no
].first_line
= cy_next_channel
;
4050 cy_card
[card_no
].nports
= nchan
;
4051 retval
= cy_init_card(&cy_card
[card_no
]);
4055 pci_set_drvdata(pdev
, &cy_card
[card_no
]);
4057 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
||
4058 device_id
== PCI_DEVICE_ID_CYCLOM_Y_Hi
) {
4059 /* enable interrupts in the PCI interface */
4060 plx_ver
= readb(addr2
+ CyPLX_VER
) & 0x0f;
4063 cy_writeb(addr0
+ 0x4c, 0x43);
4068 default: /* Old boards, use PLX_9060 */
4070 struct RUNTIME_9060 __iomem
*ctl_addr
= addr0
;
4071 plx_init(pdev
, irq
, ctl_addr
);
4072 cy_writew(&ctl_addr
->intr_ctrl_stat
,
4073 readw(&ctl_addr
->intr_ctrl_stat
) | 0x0900);
4079 dev_info(&pdev
->dev
, "%s/PCI #%d found: %d channels starting from "
4080 "port %d.\n", card_name
, card_no
+ 1, nchan
, cy_next_channel
);
4081 for (i
= cy_next_channel
; i
< cy_next_channel
+ nchan
; i
++)
4082 tty_register_device(cy_serial_driver
, i
, &pdev
->dev
);
4083 cy_next_channel
+= nchan
;
4087 cy_card
[card_no
].base_addr
= NULL
;
4088 free_irq(irq
, &cy_card
[card_no
]);
4094 pci_release_regions(pdev
);
4096 pci_disable_device(pdev
);
4101 static void __devexit
cy_pci_remove(struct pci_dev
*pdev
)
4103 struct cyclades_card
*cinfo
= pci_get_drvdata(pdev
);
4106 /* non-Z with old PLX */
4107 if (!cy_is_Z(cinfo
) && (readb(cinfo
->base_addr
+ CyPLX_VER
) & 0x0f) ==
4109 cy_writeb(cinfo
->ctl_addr
.p9050
+ 0x4c, 0);
4111 #ifndef CONFIG_CYZ_INTR
4112 if (!cy_is_Z(cinfo
))
4114 cy_writew(&cinfo
->ctl_addr
.p9060
->intr_ctrl_stat
,
4115 readw(&cinfo
->ctl_addr
.p9060
->intr_ctrl_stat
) &
4118 iounmap(cinfo
->base_addr
);
4119 if (cinfo
->ctl_addr
.p9050
)
4120 iounmap(cinfo
->ctl_addr
.p9050
);
4122 #ifndef CONFIG_CYZ_INTR
4124 #endif /* CONFIG_CYZ_INTR */
4126 free_irq(cinfo
->irq
, cinfo
);
4127 pci_release_regions(pdev
);
4129 cinfo
->base_addr
= NULL
;
4130 for (i
= cinfo
->first_line
; i
< cinfo
->first_line
+
4132 tty_unregister_device(cy_serial_driver
, i
);
4134 kfree(cinfo
->ports
);
4137 static struct pci_driver cy_pci_driver
= {
4139 .id_table
= cy_pci_dev_id
,
4140 .probe
= cy_pci_probe
,
4141 .remove
= __devexit_p(cy_pci_remove
)
4145 static int cyclades_proc_show(struct seq_file
*m
, void *v
)
4147 struct cyclades_port
*info
;
4149 __u32 cur_jifs
= jiffies
;
4151 seq_puts(m
, "Dev TimeOpen BytesOut IdleOut BytesIn "
4152 "IdleIn Overruns Ldisc\n");
4154 /* Output one line for each known port */
4155 for (i
= 0; i
< NR_CARDS
; i
++)
4156 for (j
= 0; j
< cy_card
[i
].nports
; j
++) {
4157 info
= &cy_card
[i
].ports
[j
];
4159 if (info
->port
.count
) {
4160 /* XXX is the ldisc num worth this? */
4161 struct tty_struct
*tty
;
4162 struct tty_ldisc
*ld
;
4164 tty
= tty_port_tty_get(&info
->port
);
4166 ld
= tty_ldisc_ref(tty
);
4169 tty_ldisc_deref(ld
);
4173 seq_printf(m
, "%3d %8lu %10lu %8lu "
4174 "%10lu %8lu %9lu %6d\n", info
->line
,
4175 (cur_jifs
- info
->idle_stats
.in_use
) /
4176 HZ
, info
->idle_stats
.xmit_bytes
,
4177 (cur_jifs
- info
->idle_stats
.xmit_idle
)/
4178 HZ
, info
->idle_stats
.recv_bytes
,
4179 (cur_jifs
- info
->idle_stats
.recv_idle
)/
4180 HZ
, info
->idle_stats
.overruns
,
4183 seq_printf(m
, "%3d %8lu %10lu %8lu "
4184 "%10lu %8lu %9lu %6ld\n",
4185 info
->line
, 0L, 0L, 0L, 0L, 0L, 0L, 0L);
4190 static int cyclades_proc_open(struct inode
*inode
, struct file
*file
)
4192 return single_open(file
, cyclades_proc_show
, NULL
);
4195 static const struct file_operations cyclades_proc_fops
= {
4196 .owner
= THIS_MODULE
,
4197 .open
= cyclades_proc_open
,
4199 .llseek
= seq_lseek
,
4200 .release
= single_release
,
4203 /* The serial driver boot-time initialization code!
4204 Hardware I/O ports are mapped to character special devices on a
4205 first found, first allocated manner. That is, this code searches
4206 for Cyclom cards in the system. As each is found, it is probed
4207 to discover how many chips (and thus how many ports) are present.
4208 These ports are mapped to the tty ports 32 and upward in monotonic
4209 fashion. If an 8-port card is replaced with a 16-port card, the
4210 port mapping on a following card will shift.
4212 This approach is different from what is used in the other serial
4213 device driver because the Cyclom is more properly a multiplexer,
4214 not just an aggregation of serial ports on one card.
4216 If there are more cards with more ports than have been
4217 statically allocated above, a warning is printed and the
4218 extra ports are ignored.
4221 static const struct tty_operations cy_ops
= {
4225 .put_char
= cy_put_char
,
4226 .flush_chars
= cy_flush_chars
,
4227 .write_room
= cy_write_room
,
4228 .chars_in_buffer
= cy_chars_in_buffer
,
4229 .flush_buffer
= cy_flush_buffer
,
4231 .throttle
= cy_throttle
,
4232 .unthrottle
= cy_unthrottle
,
4233 .set_termios
= cy_set_termios
,
4236 .hangup
= cy_hangup
,
4237 .break_ctl
= cy_break
,
4238 .wait_until_sent
= cy_wait_until_sent
,
4239 .tiocmget
= cy_tiocmget
,
4240 .tiocmset
= cy_tiocmset
,
4241 .proc_fops
= &cyclades_proc_fops
,
4244 static int __init
cy_init(void)
4246 unsigned int nboards
;
4247 int retval
= -ENOMEM
;
4249 cy_serial_driver
= alloc_tty_driver(NR_PORTS
);
4250 if (!cy_serial_driver
)
4253 printk(KERN_INFO
"Cyclades driver " CY_VERSION
" (built %s %s)\n",
4254 __DATE__
, __TIME__
);
4256 /* Initialize the tty_driver structure */
4258 cy_serial_driver
->owner
= THIS_MODULE
;
4259 cy_serial_driver
->driver_name
= "cyclades";
4260 cy_serial_driver
->name
= "ttyC";
4261 cy_serial_driver
->major
= CYCLADES_MAJOR
;
4262 cy_serial_driver
->minor_start
= 0;
4263 cy_serial_driver
->type
= TTY_DRIVER_TYPE_SERIAL
;
4264 cy_serial_driver
->subtype
= SERIAL_TYPE_NORMAL
;
4265 cy_serial_driver
->init_termios
= tty_std_termios
;
4266 cy_serial_driver
->init_termios
.c_cflag
=
4267 B9600
| CS8
| CREAD
| HUPCL
| CLOCAL
;
4268 cy_serial_driver
->flags
= TTY_DRIVER_REAL_RAW
| TTY_DRIVER_DYNAMIC_DEV
;
4269 tty_set_operations(cy_serial_driver
, &cy_ops
);
4271 retval
= tty_register_driver(cy_serial_driver
);
4273 printk(KERN_ERR
"Couldn't register Cyclades serial driver\n");
4277 /* the code below is responsible to find the boards. Each different
4278 type of board has its own detection routine. If a board is found,
4279 the next cy_card structure available is set by the detection
4280 routine. These functions are responsible for checking the
4281 availability of cy_card and cy_port data structures and updating
4282 the cy_next_channel. */
4284 /* look for isa boards */
4285 nboards
= cy_detect_isa();
4288 /* look for pci boards */
4289 retval
= pci_register_driver(&cy_pci_driver
);
4290 if (retval
&& !nboards
) {
4291 tty_unregister_driver(cy_serial_driver
);
4298 put_tty_driver(cy_serial_driver
);
4303 static void __exit
cy_cleanup_module(void)
4305 struct cyclades_card
*card
;
4308 #ifndef CONFIG_CYZ_INTR
4309 del_timer_sync(&cyz_timerlist
);
4310 #endif /* CONFIG_CYZ_INTR */
4312 e1
= tty_unregister_driver(cy_serial_driver
);
4314 printk(KERN_ERR
"failed to unregister Cyclades serial "
4315 "driver(%d)\n", e1
);
4318 pci_unregister_driver(&cy_pci_driver
);
4321 for (i
= 0; i
< NR_CARDS
; i
++) {
4323 if (card
->base_addr
) {
4324 /* clear interrupt */
4325 cy_writeb(card
->base_addr
+ Cy_ClrIntr
, 0);
4326 iounmap(card
->base_addr
);
4327 if (card
->ctl_addr
.p9050
)
4328 iounmap(card
->ctl_addr
.p9050
);
4330 #ifndef CONFIG_CYZ_INTR
4332 #endif /* CONFIG_CYZ_INTR */
4334 free_irq(card
->irq
, card
);
4335 for (e1
= card
->first_line
; e1
< card
->first_line
+
4337 tty_unregister_device(cy_serial_driver
, e1
);
4342 put_tty_driver(cy_serial_driver
);
4343 } /* cy_cleanup_module */
4345 module_init(cy_init
);
4346 module_exit(cy_cleanup_module
);
4348 MODULE_LICENSE("GPL");
4349 MODULE_VERSION(CY_VERSION
);
4350 MODULE_ALIAS_CHARDEV_MAJOR(CYCLADES_MAJOR
);