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
;
835 channel
= info
->line
- card
->first_line
;
838 index
= card
->bus_index
;
839 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
841 if (set
& TIOCM_RTS
) {
842 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
843 if (info
->rtsdtr_inv
) {
844 cy_writeb(base_addr
+ (CyMSVR2
<< index
), CyDTR
);
846 cy_writeb(base_addr
+ (CyMSVR1
<< index
), CyRTS
);
849 if (clear
& TIOCM_RTS
) {
850 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
851 if (info
->rtsdtr_inv
) {
852 cy_writeb(base_addr
+ (CyMSVR2
<< index
), ~CyDTR
);
854 cy_writeb(base_addr
+ (CyMSVR1
<< index
), ~CyRTS
);
857 if (set
& TIOCM_DTR
) {
858 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
859 if (info
->rtsdtr_inv
) {
860 cy_writeb(base_addr
+ (CyMSVR1
<< index
), CyRTS
);
862 cy_writeb(base_addr
+ (CyMSVR2
<< index
), CyDTR
);
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
), (u_char
) channel
);
873 if (info
->rtsdtr_inv
) {
874 cy_writeb(base_addr
+ (CyMSVR1
<< index
), ~CyRTS
);
876 cy_writeb(base_addr
+ (CyMSVR2
<< index
), ~CyDTR
);
880 printk(KERN_DEBUG
"cyc:set_modem_info dropping DTR\n");
881 printk(KERN_DEBUG
" status: 0x%x, 0x%x\n",
882 readb(base_addr
+ (CyMSVR1
<< index
)),
883 readb(base_addr
+ (CyMSVR2
<< index
)));
888 /***********************************************************/
889 /********* End of block of Cyclom-Y specific code **********/
890 /******** Start of block of Cyclades-Z specific code *******/
891 /***********************************************************/
894 cyz_fetch_msg(struct cyclades_card
*cinfo
,
895 __u32
*channel
, __u8
*cmd
, __u32
*param
)
897 struct BOARD_CTRL __iomem
*board_ctrl
= cinfo
->board_ctrl
;
898 unsigned long loc_doorbell
;
900 loc_doorbell
= readl(&cinfo
->ctl_addr
.p9060
->loc_doorbell
);
902 *cmd
= (char)(0xff & loc_doorbell
);
903 *channel
= readl(&board_ctrl
->fwcmd_channel
);
904 *param
= (__u32
) readl(&board_ctrl
->fwcmd_param
);
905 cy_writel(&cinfo
->ctl_addr
.p9060
->loc_doorbell
, 0xffffffff);
909 } /* cyz_fetch_msg */
912 cyz_issue_cmd(struct cyclades_card
*cinfo
,
913 __u32 channel
, __u8 cmd
, __u32 param
)
915 struct BOARD_CTRL __iomem
*board_ctrl
= cinfo
->board_ctrl
;
916 __u32 __iomem
*pci_doorbell
;
919 if (!cyz_is_loaded(cinfo
))
923 pci_doorbell
= &cinfo
->ctl_addr
.p9060
->pci_doorbell
;
924 while ((readl(pci_doorbell
) & 0xff) != 0) {
926 return (int)(readl(pci_doorbell
) & 0xff);
929 cy_writel(&board_ctrl
->hcmd_channel
, channel
);
930 cy_writel(&board_ctrl
->hcmd_param
, param
);
931 cy_writel(pci_doorbell
, (long)cmd
);
934 } /* cyz_issue_cmd */
936 static void cyz_handle_rx(struct cyclades_port
*info
, struct tty_struct
*tty
)
938 struct BUF_CTRL __iomem
*buf_ctrl
= info
->u
.cyz
.buf_ctrl
;
939 struct cyclades_card
*cinfo
= info
->card
;
940 unsigned int char_count
;
947 __u32 rx_put
, rx_get
, new_rx_get
, rx_bufsize
, rx_bufaddr
;
949 rx_get
= new_rx_get
= readl(&buf_ctrl
->rx_get
);
950 rx_put
= readl(&buf_ctrl
->rx_put
);
951 rx_bufsize
= readl(&buf_ctrl
->rx_bufsize
);
952 rx_bufaddr
= readl(&buf_ctrl
->rx_bufaddr
);
953 if (rx_put
>= rx_get
)
954 char_count
= rx_put
- rx_get
;
956 char_count
= rx_put
- rx_get
+ rx_bufsize
;
959 #ifdef CY_ENABLE_MONITORING
960 info
->mon
.int_count
++;
961 info
->mon
.char_count
+= char_count
;
962 if (char_count
> info
->mon
.char_max
)
963 info
->mon
.char_max
= char_count
;
964 info
->mon
.char_last
= char_count
;
967 /* flush received characters */
968 new_rx_get
= (new_rx_get
+ char_count
) &
970 info
->rflush_count
++;
973 /* we'd like to use memcpy(t, f, n) and memset(s, c, count)
974 for performance, but because of buffer boundaries, there
975 may be several steps to the operation */
977 len
= tty_prepare_flip_string(tty
, &buf
,
982 len
= min_t(unsigned int, min(len
, char_count
),
983 rx_bufsize
- new_rx_get
);
985 memcpy_fromio(buf
, cinfo
->base_addr
+
986 rx_bufaddr
+ new_rx_get
, len
);
988 new_rx_get
= (new_rx_get
+ len
) &
991 info
->icount
.rx
+= len
;
992 info
->idle_stats
.recv_bytes
+= len
;
995 len
= tty_buffer_request_room(tty
, char_count
);
997 data
= readb(cinfo
->base_addr
+ rx_bufaddr
+
999 new_rx_get
= (new_rx_get
+ 1) &
1001 tty_insert_flip_char(tty
, data
, TTY_NORMAL
);
1002 info
->idle_stats
.recv_bytes
++;
1006 #ifdef CONFIG_CYZ_INTR
1007 /* Recalculate the number of chars in the RX buffer and issue
1008 a cmd in case it's higher than the RX high water mark */
1009 rx_put
= readl(&buf_ctrl
->rx_put
);
1010 if (rx_put
>= rx_get
)
1011 char_count
= rx_put
- rx_get
;
1013 char_count
= rx_put
- rx_get
+ rx_bufsize
;
1014 if (char_count
>= readl(&buf_ctrl
->rx_threshold
) &&
1015 !timer_pending(&cyz_rx_full_timer
[
1017 mod_timer(&cyz_rx_full_timer
[info
->line
],
1020 info
->idle_stats
.recv_idle
= jiffies
;
1021 tty_schedule_flip(tty
);
1024 cy_writel(&buf_ctrl
->rx_get
, new_rx_get
);
1028 static void cyz_handle_tx(struct cyclades_port
*info
, struct tty_struct
*tty
)
1030 struct BUF_CTRL __iomem
*buf_ctrl
= info
->u
.cyz
.buf_ctrl
;
1031 struct cyclades_card
*cinfo
= info
->card
;
1033 unsigned int char_count
;
1037 __u32 tx_put
, tx_get
, tx_bufsize
, tx_bufaddr
;
1039 if (info
->xmit_cnt
<= 0) /* Nothing to transmit */
1042 tx_get
= readl(&buf_ctrl
->tx_get
);
1043 tx_put
= readl(&buf_ctrl
->tx_put
);
1044 tx_bufsize
= readl(&buf_ctrl
->tx_bufsize
);
1045 tx_bufaddr
= readl(&buf_ctrl
->tx_bufaddr
);
1046 if (tx_put
>= tx_get
)
1047 char_count
= tx_get
- tx_put
- 1 + tx_bufsize
;
1049 char_count
= tx_get
- tx_put
- 1;
1056 if (info
->x_char
) { /* send special char */
1057 data
= info
->x_char
;
1059 cy_writeb(cinfo
->base_addr
+ tx_bufaddr
+ tx_put
, data
);
1060 tx_put
= (tx_put
+ 1) & (tx_bufsize
- 1);
1066 while (0 < (small_count
= min_t(unsigned int,
1067 tx_bufsize
- tx_put
, min_t(unsigned int,
1068 (SERIAL_XMIT_SIZE
- info
->xmit_tail
),
1069 min_t(unsigned int, info
->xmit_cnt
,
1072 memcpy_toio((char *)(cinfo
->base_addr
+ tx_bufaddr
+
1074 &info
->port
.xmit_buf
[info
->xmit_tail
],
1077 tx_put
= (tx_put
+ small_count
) & (tx_bufsize
- 1);
1078 char_count
-= small_count
;
1079 info
->icount
.tx
+= small_count
;
1080 info
->xmit_cnt
-= small_count
;
1081 info
->xmit_tail
= (info
->xmit_tail
+ small_count
) &
1082 (SERIAL_XMIT_SIZE
- 1);
1085 while (info
->xmit_cnt
&& char_count
) {
1086 data
= info
->port
.xmit_buf
[info
->xmit_tail
];
1088 info
->xmit_tail
= (info
->xmit_tail
+ 1) &
1089 (SERIAL_XMIT_SIZE
- 1);
1091 cy_writeb(cinfo
->base_addr
+ tx_bufaddr
+ tx_put
, data
);
1092 tx_put
= (tx_put
+ 1) & (tx_bufsize
- 1);
1100 cy_writel(&buf_ctrl
->tx_put
, tx_put
);
1104 static void cyz_handle_cmd(struct cyclades_card
*cinfo
)
1106 struct BOARD_CTRL __iomem
*board_ctrl
= cinfo
->board_ctrl
;
1107 struct tty_struct
*tty
;
1108 struct cyclades_port
*info
;
1109 __u32 channel
, param
, fw_ver
;
1114 fw_ver
= readl(&board_ctrl
->fw_version
);
1116 while (cyz_fetch_msg(cinfo
, &channel
, &cmd
, ¶m
) == 1) {
1119 info
= &cinfo
->ports
[channel
];
1120 tty
= tty_port_tty_get(&info
->port
);
1126 tty_insert_flip_char(tty
, 0, TTY_PARITY
);
1131 tty_insert_flip_char(tty
, 0, TTY_FRAME
);
1136 tty_insert_flip_char(tty
, 0, TTY_BREAK
);
1143 if (info
->port
.flags
& ASYNC_CHECK_CD
) {
1144 u32 dcd
= fw_ver
> 241 ? param
:
1145 readl(&info
->u
.cyz
.ch_ctrl
->rs_status
);
1147 wake_up_interruptible(&info
->port
.open_wait
);
1166 complete(&info
->shutdown_wait
);
1169 #ifdef CONFIG_CYZ_INTR
1173 /* Reception Interrupt */
1174 #ifdef CY_DEBUG_INTERRUPTS
1175 printk(KERN_DEBUG
"cyz_interrupt: rcvd intr, card %d, "
1176 "port %ld\n", info
->card
, channel
);
1178 cyz_handle_rx(info
, tty
);
1183 /* Transmission Interrupt */
1184 #ifdef CY_DEBUG_INTERRUPTS
1185 printk(KERN_DEBUG
"cyz_interrupt: xmit intr, card %d, "
1186 "port %ld\n", info
->card
, channel
);
1188 cyz_handle_tx(info
, tty
);
1190 #endif /* CONFIG_CYZ_INTR */
1192 /* should do something with this !!! */
1198 wake_up_interruptible(&info
->delta_msr_wait
);
1200 tty_schedule_flip(tty
);
1205 #ifdef CONFIG_CYZ_INTR
1206 static irqreturn_t
cyz_interrupt(int irq
, void *dev_id
)
1208 struct cyclades_card
*cinfo
= dev_id
;
1210 if (unlikely(!cyz_is_loaded(cinfo
))) {
1211 #ifdef CY_DEBUG_INTERRUPTS
1212 printk(KERN_DEBUG
"cyz_interrupt: board not yet loaded "
1218 /* Handle the interrupts */
1219 cyz_handle_cmd(cinfo
);
1222 } /* cyz_interrupt */
1224 static void cyz_rx_restart(unsigned long arg
)
1226 struct cyclades_port
*info
= (struct cyclades_port
*)arg
;
1227 struct cyclades_card
*card
= info
->card
;
1229 __u32 channel
= info
->line
- card
->first_line
;
1230 unsigned long flags
;
1232 spin_lock_irqsave(&card
->card_lock
, flags
);
1233 retval
= cyz_issue_cmd(card
, channel
, C_CM_INTBACK2
, 0L);
1235 printk(KERN_ERR
"cyc:cyz_rx_restart retval on ttyC%d was %x\n",
1236 info
->line
, retval
);
1238 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1241 #else /* CONFIG_CYZ_INTR */
1243 static void cyz_poll(unsigned long arg
)
1245 struct cyclades_card
*cinfo
;
1246 struct cyclades_port
*info
;
1247 unsigned long expires
= jiffies
+ HZ
;
1248 unsigned int port
, card
;
1250 for (card
= 0; card
< NR_CARDS
; card
++) {
1251 cinfo
= &cy_card
[card
];
1253 if (!cy_is_Z(cinfo
))
1255 if (!cyz_is_loaded(cinfo
))
1258 /* Skip first polling cycle to avoid racing conditions with the FW */
1259 if (!cinfo
->intr_enabled
) {
1260 cinfo
->intr_enabled
= 1;
1264 cyz_handle_cmd(cinfo
);
1266 for (port
= 0; port
< cinfo
->nports
; port
++) {
1267 struct tty_struct
*tty
;
1269 info
= &cinfo
->ports
[port
];
1270 tty
= tty_port_tty_get(&info
->port
);
1271 /* OK to pass NULL to the handle functions below.
1272 They need to drop the data in that case. */
1274 if (!info
->throttle
)
1275 cyz_handle_rx(info
, tty
);
1276 cyz_handle_tx(info
, tty
);
1279 /* poll every 'cyz_polling_cycle' period */
1280 expires
= jiffies
+ cyz_polling_cycle
;
1282 mod_timer(&cyz_timerlist
, expires
);
1285 #endif /* CONFIG_CYZ_INTR */
1287 /********** End of block of Cyclades-Z specific code *********/
1288 /***********************************************************/
1290 /* This is called whenever a port becomes active;
1291 interrupts are enabled and DTR & RTS are turned on.
1293 static int cy_startup(struct cyclades_port
*info
, struct tty_struct
*tty
)
1295 struct cyclades_card
*card
;
1296 unsigned long flags
;
1298 void __iomem
*base_addr
;
1303 channel
= info
->line
- card
->first_line
;
1305 page
= get_zeroed_page(GFP_KERNEL
);
1309 spin_lock_irqsave(&card
->card_lock
, flags
);
1311 if (info
->port
.flags
& ASYNC_INITIALIZED
)
1315 set_bit(TTY_IO_ERROR
, &tty
->flags
);
1319 if (info
->port
.xmit_buf
)
1322 info
->port
.xmit_buf
= (unsigned char *)page
;
1324 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1326 cy_set_line_char(info
, tty
);
1328 if (!cy_is_Z(card
)) {
1329 int chip
= channel
>> 2;
1330 int index
= card
->bus_index
;
1332 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
1334 #ifdef CY_DEBUG_OPEN
1335 printk(KERN_DEBUG
"cyc startup card %d, chip %d, channel %d, "
1337 card
, chip
, channel
, base_addr
);
1339 spin_lock_irqsave(&card
->card_lock
, flags
);
1341 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
1343 cy_writeb(base_addr
+ (CyRTPR
<< index
),
1344 (info
->default_timeout
? info
->default_timeout
: 0x02));
1345 /* 10ms rx timeout */
1347 cyy_issue_cmd(base_addr
, CyCHAN_CTL
| CyENB_RCVR
| CyENB_XMTR
,
1350 cyy_change_rts_dtr(info
, TIOCM_RTS
| TIOCM_DTR
, 0);
1352 cy_writeb(base_addr
+ (CySRER
<< index
),
1353 readb(base_addr
+ (CySRER
<< index
)) | CyRxData
);
1355 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
1357 if (!cyz_is_loaded(card
))
1360 #ifdef CY_DEBUG_OPEN
1361 printk(KERN_DEBUG
"cyc startup Z card %d, channel %d, "
1362 "base_addr %p\n", card
, channel
, card
->base_addr
);
1364 spin_lock_irqsave(&card
->card_lock
, flags
);
1366 cy_writel(&ch_ctrl
->op_mode
, C_CH_ENABLE
);
1368 #ifdef CONFIG_CYZ_INTR
1369 cy_writel(&ch_ctrl
->intr_enable
,
1370 C_IN_TXBEMPTY
| C_IN_TXLOWWM
| C_IN_RXHIWM
|
1371 C_IN_RXNNDT
| C_IN_IOCTLW
| C_IN_MDCD
);
1373 cy_writel(&ch_ctrl
->intr_enable
,
1374 C_IN_IOCTLW
| C_IN_MDCD
);
1375 #endif /* CONFIG_CYZ_INTR */
1377 #ifdef CONFIG_CYZ_INTR
1378 cy_writel(&ch_ctrl
->intr_enable
,
1379 C_IN_TXBEMPTY
| C_IN_TXLOWWM
| C_IN_RXHIWM
|
1380 C_IN_RXNNDT
| C_IN_MDCD
);
1382 cy_writel(&ch_ctrl
->intr_enable
, C_IN_MDCD
);
1383 #endif /* CONFIG_CYZ_INTR */
1386 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTL
, 0L);
1388 printk(KERN_ERR
"cyc:startup(1) retval on ttyC%d was "
1389 "%x\n", info
->line
, retval
);
1392 /* Flush RX buffers before raising DTR and RTS */
1393 retval
= cyz_issue_cmd(card
, channel
, C_CM_FLUSH_RX
, 0L);
1395 printk(KERN_ERR
"cyc:startup(2) retval on ttyC%d was "
1396 "%x\n", info
->line
, retval
);
1399 /* set timeout !!! */
1400 /* set RTS and DTR !!! */
1401 tty_port_raise_dtr_rts(&info
->port
);
1403 /* enable send, recv, modem !!! */
1406 info
->port
.flags
|= ASYNC_INITIALIZED
;
1408 clear_bit(TTY_IO_ERROR
, &tty
->flags
);
1409 info
->xmit_cnt
= info
->xmit_head
= info
->xmit_tail
= 0;
1410 info
->breakon
= info
->breakoff
= 0;
1411 memset((char *)&info
->idle_stats
, 0, sizeof(info
->idle_stats
));
1412 info
->idle_stats
.in_use
=
1413 info
->idle_stats
.recv_idle
=
1414 info
->idle_stats
.xmit_idle
= jiffies
;
1416 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1418 #ifdef CY_DEBUG_OPEN
1419 printk(KERN_DEBUG
"cyc startup done\n");
1424 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1429 static void start_xmit(struct cyclades_port
*info
)
1431 struct cyclades_card
*card
;
1432 unsigned long flags
;
1433 void __iomem
*base_addr
;
1434 int chip
, channel
, index
;
1437 channel
= info
->line
- card
->first_line
;
1438 if (!cy_is_Z(card
)) {
1439 chip
= channel
>> 2;
1441 index
= card
->bus_index
;
1442 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
1444 spin_lock_irqsave(&card
->card_lock
, flags
);
1445 cy_writeb(base_addr
+ (CyCAR
<< index
), channel
);
1446 cy_writeb(base_addr
+ (CySRER
<< index
),
1447 readb(base_addr
+ (CySRER
<< index
)) | CyTxRdy
);
1448 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1450 #ifdef CONFIG_CYZ_INTR
1453 spin_lock_irqsave(&card
->card_lock
, flags
);
1454 retval
= cyz_issue_cmd(card
, channel
, C_CM_INTBACK
, 0L);
1456 printk(KERN_ERR
"cyc:start_xmit retval on ttyC%d was "
1457 "%x\n", info
->line
, retval
);
1459 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1460 #else /* CONFIG_CYZ_INTR */
1461 /* Don't have to do anything at this time */
1462 #endif /* CONFIG_CYZ_INTR */
1467 * This routine shuts down a serial port; interrupts are disabled,
1468 * and DTR is dropped if the hangup on close termio flag is on.
1470 static void cy_shutdown(struct cyclades_port
*info
, struct tty_struct
*tty
)
1472 struct cyclades_card
*card
;
1473 unsigned long flags
;
1474 void __iomem
*base_addr
;
1475 int chip
, channel
, index
;
1477 if (!(info
->port
.flags
& ASYNC_INITIALIZED
))
1481 channel
= info
->line
- card
->first_line
;
1482 if (!cy_is_Z(card
)) {
1483 chip
= channel
>> 2;
1485 index
= card
->bus_index
;
1486 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
1488 #ifdef CY_DEBUG_OPEN
1489 printk(KERN_DEBUG
"cyc shutdown Y card %d, chip %d, "
1490 "channel %d, base_addr %p\n",
1491 card
, chip
, channel
, base_addr
);
1494 spin_lock_irqsave(&card
->card_lock
, flags
);
1496 /* Clear delta_msr_wait queue to avoid mem leaks. */
1497 wake_up_interruptible(&info
->delta_msr_wait
);
1499 if (info
->port
.xmit_buf
) {
1500 unsigned char *temp
;
1501 temp
= info
->port
.xmit_buf
;
1502 info
->port
.xmit_buf
= NULL
;
1503 free_page((unsigned long)temp
);
1505 if (tty
->termios
->c_cflag
& HUPCL
)
1506 cyy_change_rts_dtr(info
, 0, TIOCM_RTS
| TIOCM_DTR
);
1508 cyy_issue_cmd(base_addr
, CyCHAN_CTL
| CyDIS_RCVR
, index
);
1509 /* it may be appropriate to clear _XMIT at
1510 some later date (after testing)!!! */
1512 set_bit(TTY_IO_ERROR
, &tty
->flags
);
1513 info
->port
.flags
&= ~ASYNC_INITIALIZED
;
1514 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1516 #ifdef CY_DEBUG_OPEN
1517 printk(KERN_DEBUG
"cyc shutdown Z card %d, channel %d, "
1518 "base_addr %p\n", card
, channel
, card
->base_addr
);
1521 if (!cyz_is_loaded(card
))
1524 spin_lock_irqsave(&card
->card_lock
, flags
);
1526 if (info
->port
.xmit_buf
) {
1527 unsigned char *temp
;
1528 temp
= info
->port
.xmit_buf
;
1529 info
->port
.xmit_buf
= NULL
;
1530 free_page((unsigned long)temp
);
1533 if (tty
->termios
->c_cflag
& HUPCL
)
1534 tty_port_lower_dtr_rts(&info
->port
);
1536 set_bit(TTY_IO_ERROR
, &tty
->flags
);
1537 info
->port
.flags
&= ~ASYNC_INITIALIZED
;
1539 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1542 #ifdef CY_DEBUG_OPEN
1543 printk(KERN_DEBUG
"cyc shutdown done\n");
1548 * ------------------------------------------------------------
1549 * cy_open() and friends
1550 * ------------------------------------------------------------
1554 * This routine is called whenever a serial port is opened. It
1555 * performs the serial-specific initialization for the tty structure.
1557 static int cy_open(struct tty_struct
*tty
, struct file
*filp
)
1559 struct cyclades_port
*info
;
1560 unsigned int i
, line
;
1564 if (tty
->index
< 0 || NR_PORTS
<= line
)
1567 for (i
= 0; i
< NR_CARDS
; i
++)
1568 if (line
< cy_card
[i
].first_line
+ cy_card
[i
].nports
&&
1569 line
>= cy_card
[i
].first_line
)
1573 info
= &cy_card
[i
].ports
[line
- cy_card
[i
].first_line
];
1577 /* If the card's firmware hasn't been loaded,
1578 treat it as absent from the system. This
1579 will make the user pay attention.
1581 if (cy_is_Z(info
->card
)) {
1582 struct cyclades_card
*cinfo
= info
->card
;
1583 struct FIRM_ID __iomem
*firm_id
= cinfo
->base_addr
+ ID_ADDRESS
;
1585 if (!cyz_is_loaded(cinfo
)) {
1586 if (cinfo
->hw_ver
== ZE_V1
&& cyz_fpga_loaded(cinfo
) &&
1587 readl(&firm_id
->signature
) ==
1589 printk(KERN_ERR
"cyc:Cyclades-Z Error: you "
1590 "need an external power supply for "
1591 "this number of ports.\nFirmware "
1594 printk(KERN_ERR
"cyc:Cyclades-Z firmware not "
1599 #ifdef CONFIG_CYZ_INTR
1601 /* In case this Z board is operating in interrupt mode, its
1602 interrupts should be enabled as soon as the first open
1603 happens to one of its ports. */
1604 if (!cinfo
->intr_enabled
) {
1607 /* Enable interrupts on the PLX chip */
1608 intr
= readw(&cinfo
->ctl_addr
.p9060
->
1609 intr_ctrl_stat
) | 0x0900;
1610 cy_writew(&cinfo
->ctl_addr
.p9060
->
1611 intr_ctrl_stat
, intr
);
1612 /* Enable interrupts on the FW */
1613 retval
= cyz_issue_cmd(cinfo
, 0,
1616 printk(KERN_ERR
"cyc:IRQ enable retval "
1617 "was %x\n", retval
);
1619 cinfo
->intr_enabled
= 1;
1622 #endif /* CONFIG_CYZ_INTR */
1623 /* Make sure this Z port really exists in hardware */
1624 if (info
->line
> (cinfo
->first_line
+ cinfo
->nports
- 1))
1627 #ifdef CY_DEBUG_OTHER
1628 printk(KERN_DEBUG
"cyc:cy_open ttyC%d\n", info
->line
);
1630 tty
->driver_data
= info
;
1631 if (serial_paranoia_check(info
, tty
->name
, "cy_open"))
1634 #ifdef CY_DEBUG_OPEN
1635 printk(KERN_DEBUG
"cyc:cy_open ttyC%d, count = %d\n", info
->line
,
1639 #ifdef CY_DEBUG_COUNT
1640 printk(KERN_DEBUG
"cyc:cy_open (%d): incrementing count to %d\n",
1641 current
->pid
, info
->port
.count
);
1645 * If the port is the middle of closing, bail out now
1647 if (tty_hung_up_p(filp
) || (info
->port
.flags
& ASYNC_CLOSING
)) {
1648 wait_event_interruptible(info
->port
.close_wait
,
1649 !(info
->port
.flags
& ASYNC_CLOSING
));
1650 return (info
->port
.flags
& ASYNC_HUP_NOTIFY
) ? -EAGAIN
: -ERESTARTSYS
;
1654 * Start up serial port
1656 retval
= cy_startup(info
, tty
);
1660 retval
= tty_port_block_til_ready(&info
->port
, tty
, filp
);
1662 #ifdef CY_DEBUG_OPEN
1663 printk(KERN_DEBUG
"cyc:cy_open returning after block_til_ready "
1664 "with %d\n", retval
);
1670 tty_port_tty_set(&info
->port
, tty
);
1672 #ifdef CY_DEBUG_OPEN
1673 printk(KERN_DEBUG
"cyc:cy_open done\n");
1679 * cy_wait_until_sent() --- wait until the transmitter is empty
1681 static void cy_wait_until_sent(struct tty_struct
*tty
, int timeout
)
1683 struct cyclades_card
*card
;
1684 struct cyclades_port
*info
= tty
->driver_data
;
1685 void __iomem
*base_addr
;
1686 int chip
, channel
, index
;
1687 unsigned long orig_jiffies
;
1690 if (serial_paranoia_check(info
, tty
->name
, "cy_wait_until_sent"))
1693 if (info
->xmit_fifo_size
== 0)
1694 return; /* Just in case.... */
1696 orig_jiffies
= jiffies
;
1699 * Set the check interval to be 1/5 of the estimated time to
1700 * send a single character, and make it at least 1. The check
1701 * interval should also be less than the timeout.
1703 * Note: we have to use pretty tight timings here to satisfy
1706 char_time
= (info
->timeout
- HZ
/ 50) / info
->xmit_fifo_size
;
1707 char_time
= char_time
/ 5;
1713 char_time
= min(char_time
, timeout
);
1715 * If the transmitter hasn't cleared in twice the approximate
1716 * amount of time to send the entire FIFO, it probably won't
1717 * ever clear. This assumes the UART isn't doing flow
1718 * control, which is currently the case. Hence, if it ever
1719 * takes longer than info->timeout, this is probably due to a
1720 * UART bug of some kind. So, we clamp the timeout parameter at
1723 if (!timeout
|| timeout
> 2 * info
->timeout
)
1724 timeout
= 2 * info
->timeout
;
1725 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
1726 printk(KERN_DEBUG
"In cy_wait_until_sent(%d) check=%d, jiff=%lu...",
1727 timeout
, char_time
, jiffies
);
1730 channel
= (info
->line
) - (card
->first_line
);
1731 if (!cy_is_Z(card
)) {
1732 chip
= channel
>> 2;
1734 index
= card
->bus_index
;
1735 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
1736 while (readb(base_addr
+ (CySRER
<< index
)) & CyTxRdy
) {
1737 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
1738 printk(KERN_DEBUG
"Not clean (jiff=%lu)...", jiffies
);
1740 if (msleep_interruptible(jiffies_to_msecs(char_time
)))
1742 if (timeout
&& time_after(jiffies
, orig_jiffies
+
1747 /* Run one more char cycle */
1748 msleep_interruptible(jiffies_to_msecs(char_time
* 5));
1750 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
1751 printk(KERN_DEBUG
"Clean (jiff=%lu)...done\n", jiffies
);
1755 static void cy_flush_buffer(struct tty_struct
*tty
)
1757 struct cyclades_port
*info
= tty
->driver_data
;
1758 struct cyclades_card
*card
;
1759 int channel
, retval
;
1760 unsigned long flags
;
1763 printk(KERN_DEBUG
"cyc:cy_flush_buffer ttyC%d\n", info
->line
);
1766 if (serial_paranoia_check(info
, tty
->name
, "cy_flush_buffer"))
1770 channel
= info
->line
- card
->first_line
;
1772 spin_lock_irqsave(&card
->card_lock
, flags
);
1773 info
->xmit_cnt
= info
->xmit_head
= info
->xmit_tail
= 0;
1774 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1776 if (cy_is_Z(card
)) { /* If it is a Z card, flush the on-board
1778 spin_lock_irqsave(&card
->card_lock
, flags
);
1779 retval
= cyz_issue_cmd(card
, channel
, C_CM_FLUSH_TX
, 0L);
1781 printk(KERN_ERR
"cyc: flush_buffer retval on ttyC%d "
1782 "was %x\n", info
->line
, retval
);
1784 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1787 } /* cy_flush_buffer */
1791 * This routine is called when a particular tty device is closed.
1793 static void cy_close(struct tty_struct
*tty
, struct file
*filp
)
1795 struct cyclades_port
*info
= tty
->driver_data
;
1796 struct cyclades_card
*card
;
1797 unsigned long flags
;
1799 if (!info
|| serial_paranoia_check(info
, tty
->name
, "cy_close"))
1804 if (!tty_port_close_start(&info
->port
, tty
, filp
))
1807 spin_lock_irqsave(&card
->card_lock
, flags
);
1809 if (!cy_is_Z(card
)) {
1810 int channel
= info
->line
- card
->first_line
;
1811 int index
= card
->bus_index
;
1812 void __iomem
*base_addr
= card
->base_addr
+
1813 (cy_chip_offset
[channel
>> 2] << index
);
1814 /* Stop accepting input */
1816 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
1817 cy_writeb(base_addr
+ (CySRER
<< index
),
1818 readb(base_addr
+ (CySRER
<< index
)) & ~CyRxData
);
1819 if (info
->port
.flags
& ASYNC_INITIALIZED
) {
1820 /* Waiting for on-board buffers to be empty before
1822 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1823 cy_wait_until_sent(tty
, info
->timeout
);
1824 spin_lock_irqsave(&card
->card_lock
, flags
);
1828 /* Waiting for on-board buffers to be empty before closing
1830 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
1831 int channel
= info
->line
- card
->first_line
;
1834 if (readl(&ch_ctrl
->flow_status
) != C_FS_TXIDLE
) {
1835 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTLW
, 0L);
1837 printk(KERN_DEBUG
"cyc:cy_close retval on "
1838 "ttyC%d was %x\n", info
->line
, retval
);
1840 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1841 wait_for_completion_interruptible(&info
->shutdown_wait
);
1842 spin_lock_irqsave(&card
->card_lock
, flags
);
1847 spin_unlock_irqrestore(&card
->card_lock
, flags
);
1848 cy_shutdown(info
, tty
);
1849 cy_flush_buffer(tty
);
1851 tty_port_tty_set(&info
->port
, NULL
);
1853 tty_port_close_end(&info
->port
, tty
);
1856 /* This routine gets called when tty_write has put something into
1857 * the write_queue. The characters may come from user space or
1860 * This routine will return the number of characters actually
1861 * accepted for writing.
1863 * If the port is not already transmitting stuff, start it off by
1864 * enabling interrupts. The interrupt service routine will then
1865 * ensure that the characters are sent.
1866 * If the port is already active, there is no need to kick it.
1869 static int cy_write(struct tty_struct
*tty
, const unsigned char *buf
, int count
)
1871 struct cyclades_port
*info
= tty
->driver_data
;
1872 unsigned long flags
;
1876 printk(KERN_DEBUG
"cyc:cy_write ttyC%d\n", info
->line
);
1879 if (serial_paranoia_check(info
, tty
->name
, "cy_write"))
1882 if (!info
->port
.xmit_buf
)
1885 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
1887 c
= min(count
, (int)(SERIAL_XMIT_SIZE
- info
->xmit_cnt
- 1));
1888 c
= min(c
, (int)(SERIAL_XMIT_SIZE
- info
->xmit_head
));
1893 memcpy(info
->port
.xmit_buf
+ info
->xmit_head
, buf
, c
);
1894 info
->xmit_head
= (info
->xmit_head
+ c
) &
1895 (SERIAL_XMIT_SIZE
- 1);
1896 info
->xmit_cnt
+= c
;
1901 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
1903 info
->idle_stats
.xmit_bytes
+= ret
;
1904 info
->idle_stats
.xmit_idle
= jiffies
;
1906 if (info
->xmit_cnt
&& !tty
->stopped
&& !tty
->hw_stopped
)
1913 * This routine is called by the kernel to write a single
1914 * character to the tty device. If the kernel uses this routine,
1915 * it must call the flush_chars() routine (if defined) when it is
1916 * done stuffing characters into the driver. If there is no room
1917 * in the queue, the character is ignored.
1919 static int cy_put_char(struct tty_struct
*tty
, unsigned char ch
)
1921 struct cyclades_port
*info
= tty
->driver_data
;
1922 unsigned long flags
;
1925 printk(KERN_DEBUG
"cyc:cy_put_char ttyC%d\n", info
->line
);
1928 if (serial_paranoia_check(info
, tty
->name
, "cy_put_char"))
1931 if (!info
->port
.xmit_buf
)
1934 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
1935 if (info
->xmit_cnt
>= (int)(SERIAL_XMIT_SIZE
- 1)) {
1936 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
1940 info
->port
.xmit_buf
[info
->xmit_head
++] = ch
;
1941 info
->xmit_head
&= SERIAL_XMIT_SIZE
- 1;
1943 info
->idle_stats
.xmit_bytes
++;
1944 info
->idle_stats
.xmit_idle
= jiffies
;
1945 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
1950 * This routine is called by the kernel after it has written a
1951 * series of characters to the tty device using put_char().
1953 static void cy_flush_chars(struct tty_struct
*tty
)
1955 struct cyclades_port
*info
= tty
->driver_data
;
1958 printk(KERN_DEBUG
"cyc:cy_flush_chars ttyC%d\n", info
->line
);
1961 if (serial_paranoia_check(info
, tty
->name
, "cy_flush_chars"))
1964 if (info
->xmit_cnt
<= 0 || tty
->stopped
|| tty
->hw_stopped
||
1965 !info
->port
.xmit_buf
)
1969 } /* cy_flush_chars */
1972 * This routine returns the numbers of characters the tty driver
1973 * will accept for queuing to be written. This number is subject
1974 * to change as output buffers get emptied, or if the output flow
1975 * control is activated.
1977 static int cy_write_room(struct tty_struct
*tty
)
1979 struct cyclades_port
*info
= tty
->driver_data
;
1983 printk(KERN_DEBUG
"cyc:cy_write_room ttyC%d\n", info
->line
);
1986 if (serial_paranoia_check(info
, tty
->name
, "cy_write_room"))
1988 ret
= SERIAL_XMIT_SIZE
- info
->xmit_cnt
- 1;
1992 } /* cy_write_room */
1994 static int cy_chars_in_buffer(struct tty_struct
*tty
)
1996 struct cyclades_port
*info
= tty
->driver_data
;
1998 if (serial_paranoia_check(info
, tty
->name
, "cy_chars_in_buffer"))
2001 #ifdef Z_EXT_CHARS_IN_BUFFER
2002 if (!cy_is_Z(info
->card
)) {
2003 #endif /* Z_EXT_CHARS_IN_BUFFER */
2005 printk(KERN_DEBUG
"cyc:cy_chars_in_buffer ttyC%d %d\n",
2006 info
->line
, info
->xmit_cnt
);
2008 return info
->xmit_cnt
;
2009 #ifdef Z_EXT_CHARS_IN_BUFFER
2011 struct BUF_CTRL __iomem
*buf_ctrl
= info
->u
.cyz
.buf_ctrl
;
2013 __u32 tx_put
, tx_get
, tx_bufsize
;
2016 tx_get
= readl(&buf_ctrl
->tx_get
);
2017 tx_put
= readl(&buf_ctrl
->tx_put
);
2018 tx_bufsize
= readl(&buf_ctrl
->tx_bufsize
);
2019 if (tx_put
>= tx_get
)
2020 char_count
= tx_put
- tx_get
;
2022 char_count
= tx_put
- tx_get
+ tx_bufsize
;
2024 printk(KERN_DEBUG
"cyc:cy_chars_in_buffer ttyC%d %d\n",
2025 info
->line
, info
->xmit_cnt
+ char_count
);
2028 return info
->xmit_cnt
+ char_count
;
2030 #endif /* Z_EXT_CHARS_IN_BUFFER */
2031 } /* cy_chars_in_buffer */
2034 * ------------------------------------------------------------
2035 * cy_ioctl() and friends
2036 * ------------------------------------------------------------
2039 static void cyy_baud_calc(struct cyclades_port
*info
, __u32 baud
)
2041 int co
, co_val
, bpr
;
2042 __u32 cy_clock
= ((info
->chip_rev
>= CD1400_REV_J
) ? 60000000 :
2046 info
->tbpr
= info
->tco
= info
->rbpr
= info
->rco
= 0;
2050 /* determine which prescaler to use */
2051 for (co
= 4, co_val
= 2048; co
; co
--, co_val
>>= 2) {
2052 if (cy_clock
/ co_val
/ baud
> 63)
2056 bpr
= (cy_clock
/ co_val
* 2 / baud
+ 1) / 2;
2060 info
->tbpr
= info
->rbpr
= bpr
;
2061 info
->tco
= info
->rco
= co
;
2065 * This routine finds or computes the various line characteristics.
2066 * It used to be called config_setup
2068 static void cy_set_line_char(struct cyclades_port
*info
, struct tty_struct
*tty
)
2070 struct cyclades_card
*card
;
2071 unsigned long flags
;
2072 void __iomem
*base_addr
;
2073 int chip
, channel
, index
;
2074 unsigned cflag
, iflag
;
2075 int baud
, baud_rate
= 0;
2078 if (!tty
->termios
) /* XXX can this happen at all? */
2081 if (info
->line
== -1)
2084 cflag
= tty
->termios
->c_cflag
;
2085 iflag
= tty
->termios
->c_iflag
;
2088 * Set up the tty->alt_speed kludge
2090 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_HI
)
2091 tty
->alt_speed
= 57600;
2092 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_VHI
)
2093 tty
->alt_speed
= 115200;
2094 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_SHI
)
2095 tty
->alt_speed
= 230400;
2096 if ((info
->port
.flags
& ASYNC_SPD_MASK
) == ASYNC_SPD_WARP
)
2097 tty
->alt_speed
= 460800;
2100 channel
= info
->line
- card
->first_line
;
2102 if (!cy_is_Z(card
)) {
2104 index
= card
->bus_index
;
2107 baud
= tty_get_baud_rate(tty
);
2108 if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2110 if (info
->custom_divisor
)
2111 baud_rate
= info
->baud
/ info
->custom_divisor
;
2113 baud_rate
= info
->baud
;
2114 } else if (baud
> CD1400_MAX_SPEED
) {
2115 baud
= CD1400_MAX_SPEED
;
2117 /* find the baud index */
2118 for (i
= 0; i
< 20; i
++) {
2119 if (baud
== baud_table
[i
])
2123 i
= 19; /* CD1400_MAX_SPEED */
2125 if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2127 cyy_baud_calc(info
, baud_rate
);
2129 if (info
->chip_rev
>= CD1400_REV_J
) {
2130 /* It is a CD1400 rev. J or later */
2131 info
->tbpr
= baud_bpr_60
[i
]; /* Tx BPR */
2132 info
->tco
= baud_co_60
[i
]; /* Tx CO */
2133 info
->rbpr
= baud_bpr_60
[i
]; /* Rx BPR */
2134 info
->rco
= baud_co_60
[i
]; /* Rx CO */
2136 info
->tbpr
= baud_bpr_25
[i
]; /* Tx BPR */
2137 info
->tco
= baud_co_25
[i
]; /* Tx CO */
2138 info
->rbpr
= baud_bpr_25
[i
]; /* Rx BPR */
2139 info
->rco
= baud_co_25
[i
]; /* Rx CO */
2142 if (baud_table
[i
] == 134) {
2143 /* get it right for 134.5 baud */
2144 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 30 / 269) +
2146 } else if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2148 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2150 } else if (baud_table
[i
]) {
2151 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2153 /* this needs to be propagated into the card info */
2157 /* By tradition (is it a standard?) a baud rate of zero
2158 implies the line should be/has been closed. A bit
2159 later in this routine such a test is performed. */
2161 /* byte size and parity */
2164 /* receive threshold */
2165 info
->cor3
= (info
->default_threshold
?
2166 info
->default_threshold
: baud_cor3
[i
]);
2168 switch (cflag
& CSIZE
) {
2170 info
->cor1
= Cy_5_BITS
;
2173 info
->cor1
= Cy_6_BITS
;
2176 info
->cor1
= Cy_7_BITS
;
2179 info
->cor1
= Cy_8_BITS
;
2183 info
->cor1
|= Cy_2_STOP
;
2185 if (cflag
& PARENB
) {
2187 info
->cor1
|= CyPARITY_O
;
2189 info
->cor1
|= CyPARITY_E
;
2191 info
->cor1
|= CyPARITY_NONE
;
2193 /* CTS flow control flag */
2194 if (cflag
& CRTSCTS
) {
2195 info
->port
.flags
|= ASYNC_CTS_FLOW
;
2196 info
->cor2
|= CyCtsAE
;
2198 info
->port
.flags
&= ~ASYNC_CTS_FLOW
;
2199 info
->cor2
&= ~CyCtsAE
;
2202 info
->port
.flags
&= ~ASYNC_CHECK_CD
;
2204 info
->port
.flags
|= ASYNC_CHECK_CD
;
2206 /***********************************************
2207 The hardware option, CyRtsAO, presents RTS when
2208 the chip has characters to send. Since most modems
2209 use RTS as reverse (inbound) flow control, this
2210 option is not used. If inbound flow control is
2211 necessary, DTR can be programmed to provide the
2212 appropriate signals for use with a non-standard
2213 cable. Contact Marcio Saito for details.
2214 ***********************************************/
2216 chip
= channel
>> 2;
2218 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2220 spin_lock_irqsave(&card
->card_lock
, flags
);
2221 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
2223 /* tx and rx baud rate */
2225 cy_writeb(base_addr
+ (CyTCOR
<< index
), info
->tco
);
2226 cy_writeb(base_addr
+ (CyTBPR
<< index
), info
->tbpr
);
2227 cy_writeb(base_addr
+ (CyRCOR
<< index
), info
->rco
);
2228 cy_writeb(base_addr
+ (CyRBPR
<< index
), info
->rbpr
);
2230 /* set line characteristics according configuration */
2232 cy_writeb(base_addr
+ (CySCHR1
<< index
), START_CHAR(tty
));
2233 cy_writeb(base_addr
+ (CySCHR2
<< index
), STOP_CHAR(tty
));
2234 cy_writeb(base_addr
+ (CyCOR1
<< index
), info
->cor1
);
2235 cy_writeb(base_addr
+ (CyCOR2
<< index
), info
->cor2
);
2236 cy_writeb(base_addr
+ (CyCOR3
<< index
), info
->cor3
);
2237 cy_writeb(base_addr
+ (CyCOR4
<< index
), info
->cor4
);
2238 cy_writeb(base_addr
+ (CyCOR5
<< index
), info
->cor5
);
2240 cyy_issue_cmd(base_addr
, CyCOR_CHANGE
| CyCOR1ch
| CyCOR2ch
|
2243 /* !!! Is this needed? */
2244 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
2245 cy_writeb(base_addr
+ (CyRTPR
<< index
),
2246 (info
->default_timeout
? info
->default_timeout
: 0x02));
2247 /* 10ms rx timeout */
2249 if (C_CLOCAL(tty
)) {
2250 /* without modem intr */
2251 cy_writeb(base_addr
+ (CySRER
<< index
),
2252 readb(base_addr
+ (CySRER
<< index
)) | CyMdmCh
);
2253 /* act on 1->0 modem transitions */
2254 if ((cflag
& CRTSCTS
) && info
->rflow
) {
2255 cy_writeb(base_addr
+ (CyMCOR1
<< index
),
2256 (CyCTS
| rflow_thr
[i
]));
2258 cy_writeb(base_addr
+ (CyMCOR1
<< index
),
2261 /* act on 0->1 modem transitions */
2262 cy_writeb(base_addr
+ (CyMCOR2
<< index
), CyCTS
);
2264 /* without modem intr */
2265 cy_writeb(base_addr
+ (CySRER
<< index
),
2267 (CySRER
<< index
)) | CyMdmCh
);
2268 /* act on 1->0 modem transitions */
2269 if ((cflag
& CRTSCTS
) && info
->rflow
) {
2270 cy_writeb(base_addr
+ (CyMCOR1
<< index
),
2271 (CyDSR
| CyCTS
| CyRI
| CyDCD
|
2274 cy_writeb(base_addr
+ (CyMCOR1
<< index
),
2275 CyDSR
| CyCTS
| CyRI
| CyDCD
);
2277 /* act on 0->1 modem transitions */
2278 cy_writeb(base_addr
+ (CyMCOR2
<< index
),
2279 CyDSR
| CyCTS
| CyRI
| CyDCD
);
2282 if (i
== 0) /* baud rate is zero, turn off line */
2283 cyy_change_rts_dtr(info
, 0, TIOCM_DTR
);
2285 cyy_change_rts_dtr(info
, TIOCM_DTR
, 0);
2287 clear_bit(TTY_IO_ERROR
, &tty
->flags
);
2288 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2291 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
2295 if (!cyz_is_loaded(card
))
2299 baud
= tty_get_baud_rate(tty
);
2300 if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2302 if (info
->custom_divisor
)
2303 baud_rate
= info
->baud
/ info
->custom_divisor
;
2305 baud_rate
= info
->baud
;
2306 } else if (baud
> CYZ_MAX_SPEED
) {
2307 baud
= CYZ_MAX_SPEED
;
2309 cy_writel(&ch_ctrl
->comm_baud
, baud
);
2312 /* get it right for 134.5 baud */
2313 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 30 / 269) +
2315 } else if (baud
== 38400 && (info
->port
.flags
& ASYNC_SPD_MASK
) ==
2317 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2320 info
->timeout
= (info
->xmit_fifo_size
* HZ
* 15 /
2322 /* this needs to be propagated into the card info */
2327 /* byte size and parity */
2328 switch (cflag
& CSIZE
) {
2330 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS5
);
2333 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS6
);
2336 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS7
);
2339 cy_writel(&ch_ctrl
->comm_data_l
, C_DL_CS8
);
2342 if (cflag
& CSTOPB
) {
2343 cy_writel(&ch_ctrl
->comm_data_l
,
2344 readl(&ch_ctrl
->comm_data_l
) | C_DL_2STOP
);
2346 cy_writel(&ch_ctrl
->comm_data_l
,
2347 readl(&ch_ctrl
->comm_data_l
) | C_DL_1STOP
);
2349 if (cflag
& PARENB
) {
2351 cy_writel(&ch_ctrl
->comm_parity
, C_PR_ODD
);
2353 cy_writel(&ch_ctrl
->comm_parity
, C_PR_EVEN
);
2355 cy_writel(&ch_ctrl
->comm_parity
, C_PR_NONE
);
2357 /* CTS flow control flag */
2358 if (cflag
& CRTSCTS
) {
2359 cy_writel(&ch_ctrl
->hw_flow
,
2360 readl(&ch_ctrl
->hw_flow
) | C_RS_CTS
| C_RS_RTS
);
2362 cy_writel(&ch_ctrl
->hw_flow
, readl(&ch_ctrl
->hw_flow
) &
2363 ~(C_RS_CTS
| C_RS_RTS
));
2365 /* As the HW flow control is done in firmware, the driver
2366 doesn't need to care about it */
2367 info
->port
.flags
&= ~ASYNC_CTS_FLOW
;
2369 /* XON/XOFF/XANY flow control flags */
2372 sw_flow
|= C_FL_OXX
;
2374 sw_flow
|= C_FL_OIXANY
;
2376 cy_writel(&ch_ctrl
->sw_flow
, sw_flow
);
2378 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTL
, 0L);
2380 printk(KERN_ERR
"cyc:set_line_char retval on ttyC%d "
2381 "was %x\n", info
->line
, retval
);
2384 /* CD sensitivity */
2386 info
->port
.flags
&= ~ASYNC_CHECK_CD
;
2388 info
->port
.flags
|= ASYNC_CHECK_CD
;
2390 if (baud
== 0) { /* baud rate is zero, turn off line */
2391 cy_writel(&ch_ctrl
->rs_control
,
2392 readl(&ch_ctrl
->rs_control
) & ~C_RS_DTR
);
2394 printk(KERN_DEBUG
"cyc:set_line_char dropping Z DTR\n");
2397 cy_writel(&ch_ctrl
->rs_control
,
2398 readl(&ch_ctrl
->rs_control
) | C_RS_DTR
);
2400 printk(KERN_DEBUG
"cyc:set_line_char raising Z DTR\n");
2404 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTLM
, 0L);
2406 printk(KERN_ERR
"cyc:set_line_char(2) retval on ttyC%d "
2407 "was %x\n", info
->line
, retval
);
2410 clear_bit(TTY_IO_ERROR
, &tty
->flags
);
2412 } /* set_line_char */
2414 static int cy_get_serial_info(struct cyclades_port
*info
,
2415 struct serial_struct __user
*retinfo
)
2417 struct cyclades_card
*cinfo
= info
->card
;
2418 struct serial_struct tmp
= {
2421 .port
= (info
->card
- cy_card
) * 0x100 + info
->line
-
2424 .flags
= info
->port
.flags
,
2425 .close_delay
= info
->port
.close_delay
,
2426 .closing_wait
= info
->port
.closing_wait
,
2427 .baud_base
= info
->baud
,
2428 .custom_divisor
= info
->custom_divisor
,
2431 return copy_to_user(retinfo
, &tmp
, sizeof(*retinfo
)) ? -EFAULT
: 0;
2435 cy_set_serial_info(struct cyclades_port
*info
, struct tty_struct
*tty
,
2436 struct serial_struct __user
*new_info
)
2438 struct serial_struct new_serial
;
2440 if (copy_from_user(&new_serial
, new_info
, sizeof(new_serial
)))
2443 if (!capable(CAP_SYS_ADMIN
)) {
2444 if (new_serial
.close_delay
!= info
->port
.close_delay
||
2445 new_serial
.baud_base
!= info
->baud
||
2446 (new_serial
.flags
& ASYNC_FLAGS
&
2448 (info
->port
.flags
& ASYNC_FLAGS
& ~ASYNC_USR_MASK
))
2450 info
->port
.flags
= (info
->port
.flags
& ~ASYNC_USR_MASK
) |
2451 (new_serial
.flags
& ASYNC_USR_MASK
);
2452 info
->baud
= new_serial
.baud_base
;
2453 info
->custom_divisor
= new_serial
.custom_divisor
;
2454 goto check_and_exit
;
2458 * OK, past this point, all the error checking has been done.
2459 * At this point, we start making changes.....
2462 info
->baud
= new_serial
.baud_base
;
2463 info
->custom_divisor
= new_serial
.custom_divisor
;
2464 info
->port
.flags
= (info
->port
.flags
& ~ASYNC_FLAGS
) |
2465 (new_serial
.flags
& ASYNC_FLAGS
);
2466 info
->port
.close_delay
= new_serial
.close_delay
* HZ
/ 100;
2467 info
->port
.closing_wait
= new_serial
.closing_wait
* HZ
/ 100;
2470 if (info
->port
.flags
& ASYNC_INITIALIZED
) {
2471 cy_set_line_char(info
, tty
);
2474 return cy_startup(info
, tty
);
2476 } /* set_serial_info */
2479 * get_lsr_info - get line status register info
2481 * Purpose: Let user call ioctl() to get info when the UART physically
2482 * is emptied. On bus types like RS485, the transmitter must
2483 * release the bus after transmitting. This must be done when
2484 * the transmit shift register is empty, not be done when the
2485 * transmit holding register is empty. This functionality
2486 * allows an RS485 driver to be written in user space.
2488 static int get_lsr_info(struct cyclades_port
*info
, unsigned int __user
*value
)
2490 struct cyclades_card
*card
;
2491 int chip
, channel
, index
;
2492 unsigned char status
;
2493 unsigned int result
;
2494 unsigned long flags
;
2495 void __iomem
*base_addr
;
2498 channel
= (info
->line
) - (card
->first_line
);
2499 if (!cy_is_Z(card
)) {
2500 chip
= channel
>> 2;
2502 index
= card
->bus_index
;
2503 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2505 spin_lock_irqsave(&card
->card_lock
, flags
);
2506 status
= readb(base_addr
+ (CySRER
<< index
)) &
2507 (CyTxRdy
| CyTxMpty
);
2508 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2509 result
= (status
? 0 : TIOCSER_TEMT
);
2511 /* Not supported yet */
2514 return put_user(result
, (unsigned long __user
*)value
);
2517 static int cy_tiocmget(struct tty_struct
*tty
, struct file
*file
)
2519 struct cyclades_port
*info
= tty
->driver_data
;
2520 struct cyclades_card
*card
;
2521 int chip
, channel
, index
;
2522 void __iomem
*base_addr
;
2523 unsigned long flags
;
2524 unsigned char status
;
2525 unsigned long lstatus
;
2526 unsigned int result
;
2528 if (serial_paranoia_check(info
, tty
->name
, __func__
))
2534 channel
= info
->line
- card
->first_line
;
2535 if (!cy_is_Z(card
)) {
2536 chip
= channel
>> 2;
2538 index
= card
->bus_index
;
2539 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2541 spin_lock_irqsave(&card
->card_lock
, flags
);
2542 cy_writeb(base_addr
+ (CyCAR
<< index
), (u_char
) channel
);
2543 status
= readb(base_addr
+ (CyMSVR1
<< index
));
2544 status
|= readb(base_addr
+ (CyMSVR2
<< index
));
2545 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2547 if (info
->rtsdtr_inv
) {
2548 result
= ((status
& CyRTS
) ? TIOCM_DTR
: 0) |
2549 ((status
& CyDTR
) ? TIOCM_RTS
: 0);
2551 result
= ((status
& CyRTS
) ? TIOCM_RTS
: 0) |
2552 ((status
& CyDTR
) ? TIOCM_DTR
: 0);
2554 result
|= ((status
& CyDCD
) ? TIOCM_CAR
: 0) |
2555 ((status
& CyRI
) ? TIOCM_RNG
: 0) |
2556 ((status
& CyDSR
) ? TIOCM_DSR
: 0) |
2557 ((status
& CyCTS
) ? TIOCM_CTS
: 0);
2559 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);
2579 cy_tiocmset(struct tty_struct
*tty
, struct file
*file
,
2580 unsigned int set
, unsigned int clear
)
2582 struct cyclades_port
*info
= tty
->driver_data
;
2583 struct cyclades_card
*card
;
2584 unsigned long flags
;
2585 int channel
, retval
;
2587 if (serial_paranoia_check(info
, tty
->name
, __func__
))
2591 channel
= (info
->line
) - (card
->first_line
);
2592 if (!cy_is_Z(card
)) {
2593 spin_lock_irqsave(&card
->card_lock
, flags
);
2594 cyy_change_rts_dtr(info
, set
, clear
);
2595 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2597 if (cyz_is_loaded(card
)) {
2598 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
2600 if (set
& TIOCM_RTS
) {
2601 spin_lock_irqsave(&card
->card_lock
, flags
);
2602 cy_writel(&ch_ctrl
->rs_control
,
2603 readl(&ch_ctrl
->rs_control
) | C_RS_RTS
);
2604 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2606 if (clear
& TIOCM_RTS
) {
2607 spin_lock_irqsave(&card
->card_lock
, flags
);
2608 cy_writel(&ch_ctrl
->rs_control
,
2609 readl(&ch_ctrl
->rs_control
) &
2611 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2613 if (set
& TIOCM_DTR
) {
2614 spin_lock_irqsave(&card
->card_lock
, flags
);
2615 cy_writel(&ch_ctrl
->rs_control
,
2616 readl(&ch_ctrl
->rs_control
) | C_RS_DTR
);
2618 printk(KERN_DEBUG
"cyc:set_modem_info raising "
2621 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2623 if (clear
& TIOCM_DTR
) {
2624 spin_lock_irqsave(&card
->card_lock
, flags
);
2625 cy_writel(&ch_ctrl
->rs_control
,
2626 readl(&ch_ctrl
->rs_control
) &
2629 printk(KERN_DEBUG
"cyc:set_modem_info clearing "
2632 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2637 spin_lock_irqsave(&card
->card_lock
, flags
);
2638 retval
= cyz_issue_cmd(card
, channel
, C_CM_IOCTLM
, 0L);
2640 printk(KERN_ERR
"cyc:set_modem_info retval on ttyC%d "
2641 "was %x\n", info
->line
, retval
);
2643 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2649 * cy_break() --- routine which turns the break handling on or off
2651 static int cy_break(struct tty_struct
*tty
, int break_state
)
2653 struct cyclades_port
*info
= tty
->driver_data
;
2654 struct cyclades_card
*card
;
2655 unsigned long flags
;
2658 if (serial_paranoia_check(info
, tty
->name
, "cy_break"))
2663 spin_lock_irqsave(&card
->card_lock
, flags
);
2664 if (!cy_is_Z(card
)) {
2665 /* Let the transmit ISR take care of this (since it
2666 requires stuffing characters into the output stream).
2668 if (break_state
== -1) {
2669 if (!info
->breakon
) {
2671 if (!info
->xmit_cnt
) {
2672 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2674 spin_lock_irqsave(&card
->card_lock
, flags
);
2678 if (!info
->breakoff
) {
2680 if (!info
->xmit_cnt
) {
2681 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2683 spin_lock_irqsave(&card
->card_lock
, flags
);
2688 if (break_state
== -1) {
2689 retval
= cyz_issue_cmd(card
,
2690 info
->line
- card
->first_line
,
2691 C_CM_SET_BREAK
, 0L);
2693 printk(KERN_ERR
"cyc:cy_break (set) retval on "
2694 "ttyC%d was %x\n", info
->line
, retval
);
2697 retval
= cyz_issue_cmd(card
,
2698 info
->line
- card
->first_line
,
2699 C_CM_CLR_BREAK
, 0L);
2701 printk(KERN_DEBUG
"cyc:cy_break (clr) retval "
2702 "on ttyC%d was %x\n", info
->line
,
2707 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2711 static int set_threshold(struct cyclades_port
*info
, unsigned long value
)
2713 struct cyclades_card
*card
;
2714 void __iomem
*base_addr
;
2715 int channel
, chip
, index
;
2716 unsigned long flags
;
2719 channel
= info
->line
- card
->first_line
;
2720 if (!cy_is_Z(card
)) {
2721 chip
= channel
>> 2;
2723 index
= card
->bus_index
;
2725 card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2727 info
->cor3
&= ~CyREC_FIFO
;
2728 info
->cor3
|= value
& CyREC_FIFO
;
2730 spin_lock_irqsave(&card
->card_lock
, flags
);
2731 cy_writeb(base_addr
+ (CyCOR3
<< index
), info
->cor3
);
2732 cyy_issue_cmd(base_addr
, CyCOR_CHANGE
| CyCOR3ch
, index
);
2733 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2736 } /* set_threshold */
2738 static int get_threshold(struct cyclades_port
*info
,
2739 unsigned long __user
*value
)
2741 struct cyclades_card
*card
;
2742 void __iomem
*base_addr
;
2743 int channel
, chip
, index
;
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 tmp
= readb(base_addr
+ (CyCOR3
<< index
)) & CyREC_FIFO
;
2755 return put_user(tmp
, value
);
2758 } /* get_threshold */
2760 static int set_timeout(struct cyclades_port
*info
, unsigned long value
)
2762 struct cyclades_card
*card
;
2763 void __iomem
*base_addr
;
2764 int channel
, chip
, index
;
2765 unsigned long flags
;
2768 channel
= info
->line
- card
->first_line
;
2769 if (!cy_is_Z(card
)) {
2770 chip
= channel
>> 2;
2772 index
= card
->bus_index
;
2773 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2775 spin_lock_irqsave(&card
->card_lock
, flags
);
2776 cy_writeb(base_addr
+ (CyRTPR
<< index
), value
& 0xff);
2777 spin_unlock_irqrestore(&card
->card_lock
, flags
);
2782 static int get_timeout(struct cyclades_port
*info
,
2783 unsigned long __user
*value
)
2785 struct cyclades_card
*card
;
2786 void __iomem
*base_addr
;
2787 int channel
, chip
, index
;
2791 channel
= info
->line
- card
->first_line
;
2792 if (!cy_is_Z(card
)) {
2793 chip
= channel
>> 2;
2795 index
= card
->bus_index
;
2796 base_addr
= card
->base_addr
+ (cy_chip_offset
[chip
] << index
);
2798 tmp
= readb(base_addr
+ (CyRTPR
<< index
));
2799 return put_user(tmp
, value
);
2804 static int cy_cflags_changed(struct cyclades_port
*info
, unsigned long arg
,
2805 struct cyclades_icount
*cprev
)
2807 struct cyclades_icount cnow
;
2808 unsigned long flags
;
2811 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
2812 cnow
= info
->icount
; /* atomic copy */
2813 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
2815 ret
= ((arg
& TIOCM_RNG
) && (cnow
.rng
!= cprev
->rng
)) ||
2816 ((arg
& TIOCM_DSR
) && (cnow
.dsr
!= cprev
->dsr
)) ||
2817 ((arg
& TIOCM_CD
) && (cnow
.dcd
!= cprev
->dcd
)) ||
2818 ((arg
& TIOCM_CTS
) && (cnow
.cts
!= cprev
->cts
));
2826 * This routine allows the tty driver to implement device-
2827 * specific ioctl's. If the ioctl number passed in cmd is
2828 * not recognized by the driver, it should return ENOIOCTLCMD.
2831 cy_ioctl(struct tty_struct
*tty
, struct file
*file
,
2832 unsigned int cmd
, unsigned long arg
)
2834 struct cyclades_port
*info
= tty
->driver_data
;
2835 struct cyclades_icount cnow
; /* kernel counter temps */
2837 unsigned long flags
;
2838 void __user
*argp
= (void __user
*)arg
;
2840 if (serial_paranoia_check(info
, tty
->name
, "cy_ioctl"))
2843 #ifdef CY_DEBUG_OTHER
2844 printk(KERN_DEBUG
"cyc:cy_ioctl ttyC%d, cmd = %x arg = %lx\n",
2845 info
->line
, cmd
, arg
);
2851 if (copy_to_user(argp
, &info
->mon
, sizeof(info
->mon
))) {
2855 memset(&info
->mon
, 0, sizeof(info
->mon
));
2858 ret_val
= get_threshold(info
, argp
);
2861 ret_val
= set_threshold(info
, arg
);
2863 case CYGETDEFTHRESH
:
2864 ret_val
= put_user(info
->default_threshold
,
2865 (unsigned long __user
*)argp
);
2867 case CYSETDEFTHRESH
:
2868 info
->default_threshold
= arg
& 0x0f;
2871 ret_val
= get_timeout(info
, argp
);
2874 ret_val
= set_timeout(info
, arg
);
2876 case CYGETDEFTIMEOUT
:
2877 ret_val
= put_user(info
->default_timeout
,
2878 (unsigned long __user
*)argp
);
2880 case CYSETDEFTIMEOUT
:
2881 info
->default_timeout
= arg
& 0xff;
2884 info
->rflow
= (int)arg
;
2887 ret_val
= info
->rflow
;
2889 case CYSETRTSDTR_INV
:
2890 info
->rtsdtr_inv
= (int)arg
;
2892 case CYGETRTSDTR_INV
:
2893 ret_val
= info
->rtsdtr_inv
;
2895 case CYGETCD1400VER
:
2896 ret_val
= info
->chip_rev
;
2898 #ifndef CONFIG_CYZ_INTR
2899 case CYZSETPOLLCYCLE
:
2900 cyz_polling_cycle
= (arg
* HZ
) / 1000;
2902 case CYZGETPOLLCYCLE
:
2903 ret_val
= (cyz_polling_cycle
* 1000) / HZ
;
2905 #endif /* CONFIG_CYZ_INTR */
2907 info
->port
.closing_wait
= (unsigned short)arg
* HZ
/ 100;
2910 ret_val
= info
->port
.closing_wait
/ (HZ
/ 100);
2913 ret_val
= cy_get_serial_info(info
, argp
);
2916 ret_val
= cy_set_serial_info(info
, tty
, argp
);
2918 case TIOCSERGETLSR
: /* Get line status register */
2919 ret_val
= get_lsr_info(info
, argp
);
2922 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
2923 * - mask passed in arg for lines of interest
2924 * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
2925 * Caller should use TIOCGICOUNT to see which one it was
2928 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
2929 /* note the counters on entry */
2930 cnow
= info
->icount
;
2931 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
2932 ret_val
= wait_event_interruptible(info
->delta_msr_wait
,
2933 cy_cflags_changed(info
, arg
, &cnow
));
2937 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
2938 * Return: write counters to the user passed counter struct
2939 * NB: both 1->0 and 0->1 transitions are counted except for
2940 * RI where only 0->1 is counted.
2943 struct serial_icounter_struct sic
= { };
2945 spin_lock_irqsave(&info
->card
->card_lock
, flags
);
2946 cnow
= info
->icount
;
2947 spin_unlock_irqrestore(&info
->card
->card_lock
, flags
);
2955 sic
.frame
= cnow
.frame
;
2956 sic
.overrun
= cnow
.overrun
;
2957 sic
.parity
= cnow
.parity
;
2959 sic
.buf_overrun
= cnow
.buf_overrun
;
2961 if (copy_to_user(argp
, &sic
, sizeof(sic
)))
2966 ret_val
= -ENOIOCTLCMD
;
2970 #ifdef CY_DEBUG_OTHER
2971 printk(KERN_DEBUG
"cyc:cy_ioctl done\n");
2977 * This routine allows the tty driver to be notified when
2978 * device's termios settings have changed. Note that a
2979 * well-designed tty driver should be prepared to accept the case
2980 * where old == NULL, and try to do something rational.
2982 static void cy_set_termios(struct tty_struct
*tty
, struct ktermios
*old_termios
)
2984 struct cyclades_port
*info
= tty
->driver_data
;
2986 #ifdef CY_DEBUG_OTHER
2987 printk(KERN_DEBUG
"cyc:cy_set_termios ttyC%d\n", info
->line
);
2990 cy_set_line_char(info
, tty
);
2992 if ((old_termios
->c_cflag
& CRTSCTS
) &&
2993 !(tty
->termios
->c_cflag
& CRTSCTS
)) {
2994 tty
->hw_stopped
= 0;
2999 * No need to wake up processes in open wait, since they
3000 * sample the CLOCAL flag once, and don't recheck it.
3001 * XXX It's not clear whether the current behavior is correct
3002 * or not. Hence, this may change.....
3004 if (!(old_termios
->c_cflag
& CLOCAL
) &&
3005 (tty
->termios
->c_cflag
& CLOCAL
))
3006 wake_up_interruptible(&info
->port
.open_wait
);
3008 } /* cy_set_termios */
3010 /* This function is used to send a high-priority XON/XOFF character to
3013 static void cy_send_xchar(struct tty_struct
*tty
, char ch
)
3015 struct cyclades_port
*info
= tty
->driver_data
;
3016 struct cyclades_card
*card
;
3019 if (serial_paranoia_check(info
, tty
->name
, "cy_send_xchar"))
3028 channel
= info
->line
- card
->first_line
;
3030 if (cy_is_Z(card
)) {
3031 if (ch
== STOP_CHAR(tty
))
3032 cyz_issue_cmd(card
, channel
, C_CM_SENDXOFF
, 0L);
3033 else if (ch
== START_CHAR(tty
))
3034 cyz_issue_cmd(card
, channel
, C_CM_SENDXON
, 0L);
3038 /* This routine is called by the upper-layer tty layer to signal
3039 that incoming characters should be throttled because the input
3040 buffers are close to full.
3042 static void cy_throttle(struct tty_struct
*tty
)
3044 struct cyclades_port
*info
= tty
->driver_data
;
3045 struct cyclades_card
*card
;
3046 unsigned long flags
;
3048 #ifdef CY_DEBUG_THROTTLE
3051 printk(KERN_DEBUG
"cyc:throttle %s: %ld...ttyC%d\n", tty_name(tty
, buf
),
3052 tty
->ldisc
.chars_in_buffer(tty
), info
->line
);
3055 if (serial_paranoia_check(info
, tty
->name
, "cy_throttle"))
3062 cy_send_xchar(tty
, STOP_CHAR(tty
));
3067 if (tty
->termios
->c_cflag
& CRTSCTS
) {
3068 if (!cy_is_Z(card
)) {
3069 spin_lock_irqsave(&card
->card_lock
, flags
);
3070 cyy_change_rts_dtr(info
, 0, TIOCM_RTS
);
3071 spin_unlock_irqrestore(&card
->card_lock
, flags
);
3079 * This routine notifies the tty driver that it should signal
3080 * that characters can now be sent to the tty without fear of
3081 * overrunning the input buffers of the line disciplines.
3083 static void cy_unthrottle(struct tty_struct
*tty
)
3085 struct cyclades_port
*info
= tty
->driver_data
;
3086 struct cyclades_card
*card
;
3087 unsigned long flags
;
3089 #ifdef CY_DEBUG_THROTTLE
3092 printk(KERN_DEBUG
"cyc:unthrottle %s: %ld...ttyC%d\n",
3093 tty_name(tty
, buf
), tty_chars_in_buffer(tty
), info
->line
);
3096 if (serial_paranoia_check(info
, tty
->name
, "cy_unthrottle"))
3103 cy_send_xchar(tty
, START_CHAR(tty
));
3106 if (tty
->termios
->c_cflag
& CRTSCTS
) {
3108 if (!cy_is_Z(card
)) {
3109 spin_lock_irqsave(&card
->card_lock
, flags
);
3110 cyy_change_rts_dtr(info
, TIOCM_RTS
, 0);
3111 spin_unlock_irqrestore(&card
->card_lock
, flags
);
3116 } /* cy_unthrottle */
3118 /* cy_start and cy_stop provide software output flow control as a
3119 function of XON/XOFF, software CTS, and other such stuff.
3121 static void cy_stop(struct tty_struct
*tty
)
3123 struct cyclades_card
*cinfo
;
3124 struct cyclades_port
*info
= tty
->driver_data
;
3125 void __iomem
*base_addr
;
3126 int chip
, channel
, index
;
3127 unsigned long flags
;
3129 #ifdef CY_DEBUG_OTHER
3130 printk(KERN_DEBUG
"cyc:cy_stop ttyC%d\n", info
->line
);
3133 if (serial_paranoia_check(info
, tty
->name
, "cy_stop"))
3137 channel
= info
->line
- cinfo
->first_line
;
3138 if (!cy_is_Z(cinfo
)) {
3139 index
= cinfo
->bus_index
;
3140 chip
= channel
>> 2;
3142 base_addr
= cinfo
->base_addr
+ (cy_chip_offset
[chip
] << index
);
3144 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3145 cy_writeb(base_addr
+ (CyCAR
<< index
),
3146 (u_char
)(channel
& 0x0003)); /* index channel */
3147 cy_writeb(base_addr
+ (CySRER
<< index
),
3148 readb(base_addr
+ (CySRER
<< index
)) & ~CyTxRdy
);
3149 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3153 static void cy_start(struct tty_struct
*tty
)
3155 struct cyclades_card
*cinfo
;
3156 struct cyclades_port
*info
= tty
->driver_data
;
3157 void __iomem
*base_addr
;
3158 int chip
, channel
, index
;
3159 unsigned long flags
;
3161 #ifdef CY_DEBUG_OTHER
3162 printk(KERN_DEBUG
"cyc:cy_start ttyC%d\n", info
->line
);
3165 if (serial_paranoia_check(info
, tty
->name
, "cy_start"))
3169 channel
= info
->line
- cinfo
->first_line
;
3170 index
= cinfo
->bus_index
;
3171 if (!cy_is_Z(cinfo
)) {
3172 chip
= channel
>> 2;
3174 base_addr
= cinfo
->base_addr
+ (cy_chip_offset
[chip
] << index
);
3176 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3177 cy_writeb(base_addr
+ (CyCAR
<< index
),
3178 (u_char
) (channel
& 0x0003)); /* index channel */
3179 cy_writeb(base_addr
+ (CySRER
<< index
),
3180 readb(base_addr
+ (CySRER
<< index
)) | CyTxRdy
);
3181 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3186 * cy_hangup() --- called by tty_hangup() when a hangup is signaled.
3188 static void cy_hangup(struct tty_struct
*tty
)
3190 struct cyclades_port
*info
= tty
->driver_data
;
3192 #ifdef CY_DEBUG_OTHER
3193 printk(KERN_DEBUG
"cyc:cy_hangup ttyC%d\n", info
->line
);
3196 if (serial_paranoia_check(info
, tty
->name
, "cy_hangup"))
3199 cy_flush_buffer(tty
);
3200 cy_shutdown(info
, tty
);
3201 tty_port_hangup(&info
->port
);
3204 static int cyy_carrier_raised(struct tty_port
*port
)
3206 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3208 struct cyclades_card
*cinfo
= info
->card
;
3209 void __iomem
*base
= cinfo
->base_addr
;
3210 unsigned long flags
;
3211 int channel
= info
->line
- cinfo
->first_line
;
3212 int chip
= channel
>> 2, index
= cinfo
->bus_index
;
3216 base
+= cy_chip_offset
[chip
] << index
;
3218 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3219 cy_writeb(base
+ (CyCAR
<< index
), (u8
)channel
);
3220 cd
= readb(base
+ (CyMSVR1
<< index
)) & CyDCD
;
3221 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3226 static void cyy_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 unsigned long flags
;
3233 spin_lock_irqsave(&cinfo
->card_lock
, flags
);
3234 cyy_change_rts_dtr(info
, raise
? TIOCM_RTS
| TIOCM_DTR
: 0,
3235 raise
? 0 : TIOCM_RTS
| TIOCM_DTR
);
3236 spin_unlock_irqrestore(&cinfo
->card_lock
, flags
);
3239 static int cyz_carrier_raised(struct tty_port
*port
)
3241 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3244 return readl(&info
->u
.cyz
.ch_ctrl
->rs_status
) & C_RS_DCD
;
3247 static void cyz_dtr_rts(struct tty_port
*port
, int raise
)
3249 struct cyclades_port
*info
= container_of(port
, struct cyclades_port
,
3251 struct cyclades_card
*cinfo
= info
->card
;
3252 struct CH_CTRL __iomem
*ch_ctrl
= info
->u
.cyz
.ch_ctrl
;
3253 int ret
, channel
= info
->line
- cinfo
->first_line
;
3256 rs
= readl(&ch_ctrl
->rs_control
);
3258 rs
|= C_RS_RTS
| C_RS_DTR
;
3260 rs
&= ~(C_RS_RTS
| C_RS_DTR
);
3261 cy_writel(&ch_ctrl
->rs_control
, rs
);
3262 ret
= cyz_issue_cmd(cinfo
, channel
, C_CM_IOCTLM
, 0L);
3264 printk(KERN_ERR
"%s: retval on ttyC%d was %x\n",
3265 __func__
, info
->line
, ret
);
3267 printk(KERN_DEBUG
"%s: raising Z DTR\n", __func__
);
3271 static const struct tty_port_operations cyy_port_ops
= {
3272 .carrier_raised
= cyy_carrier_raised
,
3273 .dtr_rts
= cyy_dtr_rts
,
3276 static const struct tty_port_operations cyz_port_ops
= {
3277 .carrier_raised
= cyz_carrier_raised
,
3278 .dtr_rts
= cyz_dtr_rts
,
3282 * ---------------------------------------------------------------------
3283 * cy_init() and friends
3285 * cy_init() is called at boot-time to initialize the serial driver.
3286 * ---------------------------------------------------------------------
3289 static int __devinit
cy_init_card(struct cyclades_card
*cinfo
)
3291 struct cyclades_port
*info
;
3292 unsigned int channel
, port
;
3294 spin_lock_init(&cinfo
->card_lock
);
3295 cinfo
->intr_enabled
= 0;
3297 cinfo
->ports
= kcalloc(cinfo
->nports
, sizeof(*cinfo
->ports
),
3299 if (cinfo
->ports
== NULL
) {
3300 printk(KERN_ERR
"Cyclades: cannot allocate ports\n");
3304 for (channel
= 0, port
= cinfo
->first_line
; channel
< cinfo
->nports
;
3305 channel
++, port
++) {
3306 info
= &cinfo
->ports
[channel
];
3307 tty_port_init(&info
->port
);
3308 info
->magic
= CYCLADES_MAGIC
;
3312 info
->port
.closing_wait
= CLOSING_WAIT_DELAY
;
3313 info
->port
.close_delay
= 5 * HZ
/ 10;
3314 info
->port
.flags
= STD_COM_FLAGS
;
3315 init_completion(&info
->shutdown_wait
);
3316 init_waitqueue_head(&info
->delta_msr_wait
);
3318 if (cy_is_Z(cinfo
)) {
3319 struct FIRM_ID
*firm_id
= cinfo
->base_addr
+ ID_ADDRESS
;
3320 struct ZFW_CTRL
*zfw_ctrl
;
3322 info
->port
.ops
= &cyz_port_ops
;
3323 info
->type
= PORT_STARTECH
;
3325 zfw_ctrl
= cinfo
->base_addr
+
3326 (readl(&firm_id
->zfwctrl_addr
) & 0xfffff);
3327 info
->u
.cyz
.ch_ctrl
= &zfw_ctrl
->ch_ctrl
[channel
];
3328 info
->u
.cyz
.buf_ctrl
= &zfw_ctrl
->buf_ctrl
[channel
];
3330 if (cinfo
->hw_ver
== ZO_V1
)
3331 info
->xmit_fifo_size
= CYZ_FIFO_SIZE
;
3333 info
->xmit_fifo_size
= 4 * CYZ_FIFO_SIZE
;
3334 #ifdef CONFIG_CYZ_INTR
3335 setup_timer(&cyz_rx_full_timer
[port
],
3336 cyz_rx_restart
, (unsigned long)info
);
3339 unsigned short chip_number
;
3340 int index
= cinfo
->bus_index
;
3342 info
->port
.ops
= &cyy_port_ops
;
3343 info
->type
= PORT_CIRRUS
;
3344 info
->xmit_fifo_size
= CyMAX_CHAR_FIFO
;
3345 info
->cor1
= CyPARITY_NONE
| Cy_1_STOP
| Cy_8_BITS
;
3347 info
->cor3
= 0x08; /* _very_ small rcv threshold */
3349 chip_number
= channel
/ CyPORTS_PER_CHIP
;
3350 info
->chip_rev
= readb(cinfo
->base_addr
+
3351 (cy_chip_offset
[chip_number
] << index
) +
3352 (CyGFRCR
<< index
));
3354 if (info
->chip_rev
>= CD1400_REV_J
) {
3355 /* It is a CD1400 rev. J or later */
3356 info
->tbpr
= baud_bpr_60
[13]; /* Tx BPR */
3357 info
->tco
= baud_co_60
[13]; /* Tx CO */
3358 info
->rbpr
= baud_bpr_60
[13]; /* Rx BPR */
3359 info
->rco
= baud_co_60
[13]; /* Rx CO */
3360 info
->rtsdtr_inv
= 1;
3362 info
->tbpr
= baud_bpr_25
[13]; /* Tx BPR */
3363 info
->tco
= baud_co_25
[13]; /* Tx CO */
3364 info
->rbpr
= baud_bpr_25
[13]; /* Rx BPR */
3365 info
->rco
= baud_co_25
[13]; /* Rx CO */
3366 info
->rtsdtr_inv
= 0;
3368 info
->read_status_mask
= CyTIMEOUT
| CySPECHAR
|
3369 CyBREAK
| CyPARITY
| CyFRAME
| CyOVERRUN
;
3374 #ifndef CONFIG_CYZ_INTR
3375 if (cy_is_Z(cinfo
) && !timer_pending(&cyz_timerlist
)) {
3376 mod_timer(&cyz_timerlist
, jiffies
+ 1);
3378 printk(KERN_DEBUG
"Cyclades-Z polling initialized\n");
3385 /* initialize chips on Cyclom-Y card -- return number of valid
3386 chips (which is number of ports/4) */
3387 static unsigned short __devinit
cyy_init_card(void __iomem
*true_base_addr
,
3390 unsigned int chip_number
;
3391 void __iomem
*base_addr
;
3393 cy_writeb(true_base_addr
+ (Cy_HwReset
<< index
), 0);
3394 /* Cy_HwReset is 0x1400 */
3395 cy_writeb(true_base_addr
+ (Cy_ClrIntr
<< index
), 0);
3396 /* Cy_ClrIntr is 0x1800 */
3399 for (chip_number
= 0; chip_number
< CyMAX_CHIPS_PER_CARD
;
3402 true_base_addr
+ (cy_chip_offset
[chip_number
] << index
);
3404 if (readb(base_addr
+ (CyCCR
<< index
)) != 0x00) {
3406 printk(" chip #%d at %#6lx is never idle (CCR != 0)\n",
3407 chip_number, (unsigned long)base_addr);
3412 cy_writeb(base_addr
+ (CyGFRCR
<< index
), 0);
3415 /* The Cyclom-16Y does not decode address bit 9 and therefore
3416 cannot distinguish between references to chip 0 and a non-
3417 existent chip 4. If the preceding clearing of the supposed
3418 chip 4 GFRCR register appears at chip 0, there is no chip 4
3419 and this must be a Cyclom-16Y, not a Cyclom-32Ye.
3421 if (chip_number
== 4 && readb(true_base_addr
+
3422 (cy_chip_offset
[0] << index
) +
3423 (CyGFRCR
<< index
)) == 0) {
3427 cy_writeb(base_addr
+ (CyCCR
<< index
), CyCHIP_RESET
);
3430 if (readb(base_addr
+ (CyGFRCR
<< index
)) == 0x00) {
3432 printk(" chip #%d at %#6lx is not responding ",
3433 chip_number, (unsigned long)base_addr);
3434 printk("(GFRCR stayed 0)\n",
3438 if ((0xf0 & (readb(base_addr
+ (CyGFRCR
<< index
)))) !=
3441 printk(" chip #%d at %#6lx is not valid (GFRCR == "
3443 chip_number, (unsigned long)base_addr,
3444 base_addr[CyGFRCR<<index]);
3448 cy_writeb(base_addr
+ (CyGCR
<< index
), CyCH0_SERIAL
);
3449 if (readb(base_addr
+ (CyGFRCR
<< index
)) >= CD1400_REV_J
) {
3450 /* It is a CD1400 rev. J or later */
3451 /* Impossible to reach 5ms with this chip.
3452 Changed to 2ms instead (f = 500 Hz). */
3453 cy_writeb(base_addr
+ (CyPPR
<< index
), CyCLOCK_60_2MS
);
3456 cy_writeb(base_addr
+ (CyPPR
<< index
), CyCLOCK_25_5MS
);
3460 printk(" chip #%d at %#6lx is rev 0x%2x\n",
3461 chip_number, (unsigned long)base_addr,
3462 readb(base_addr+(CyGFRCR<<index)));
3466 } /* cyy_init_card */
3469 * ---------------------------------------------------------------------
3470 * cy_detect_isa() - Probe for Cyclom-Y/ISA boards.
3471 * sets global variables and return the number of ISA boards found.
3472 * ---------------------------------------------------------------------
3474 static int __init
cy_detect_isa(void)
3477 unsigned short cy_isa_irq
, nboard
;
3478 void __iomem
*cy_isa_address
;
3479 unsigned short i
, j
, cy_isa_nchan
;
3487 /* Check for module parameters */
3488 for (i
= 0; i
< NR_CARDS
; i
++) {
3489 if (maddr
[i
] || i
) {
3491 cy_isa_addresses
[i
] = maddr
[i
];
3498 /* scan the address table probing for Cyclom-Y/ISA boards */
3499 for (i
= 0; i
< NR_ISA_ADDRS
; i
++) {
3500 unsigned int isa_address
= cy_isa_addresses
[i
];
3501 if (isa_address
== 0x0000)
3504 /* probe for CD1400... */
3505 cy_isa_address
= ioremap_nocache(isa_address
, CyISA_Ywin
);
3506 if (cy_isa_address
== NULL
) {
3507 printk(KERN_ERR
"Cyclom-Y/ISA: can't remap base "
3511 cy_isa_nchan
= CyPORTS_PER_CHIP
*
3512 cyy_init_card(cy_isa_address
, 0);
3513 if (cy_isa_nchan
== 0) {
3514 iounmap(cy_isa_address
);
3518 if (isparam
&& irq
[i
])
3519 cy_isa_irq
= irq
[i
];
3522 /* find out the board's irq by probing */
3523 cy_isa_irq
= detect_isa_irq(cy_isa_address
);
3524 if (cy_isa_irq
== 0) {
3525 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but the "
3526 "IRQ could not be detected.\n",
3527 (unsigned long)cy_isa_address
);
3528 iounmap(cy_isa_address
);
3532 if ((cy_next_channel
+ cy_isa_nchan
) > NR_PORTS
) {
3533 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but no "
3534 "more channels are available. Change NR_PORTS "
3535 "in cyclades.c and recompile kernel.\n",
3536 (unsigned long)cy_isa_address
);
3537 iounmap(cy_isa_address
);
3540 /* fill the next cy_card structure available */
3541 for (j
= 0; j
< NR_CARDS
; j
++) {
3542 if (cy_card
[j
].base_addr
== NULL
)
3545 if (j
== NR_CARDS
) { /* no more cy_cards available */
3546 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but no "
3547 "more cards can be used. Change NR_CARDS in "
3548 "cyclades.c and recompile kernel.\n",
3549 (unsigned long)cy_isa_address
);
3550 iounmap(cy_isa_address
);
3555 if (request_irq(cy_isa_irq
, cyy_interrupt
,
3556 IRQF_DISABLED
, "Cyclom-Y", &cy_card
[j
])) {
3557 printk(KERN_ERR
"Cyclom-Y/ISA found at 0x%lx, but "
3558 "could not allocate IRQ#%d.\n",
3559 (unsigned long)cy_isa_address
, cy_isa_irq
);
3560 iounmap(cy_isa_address
);
3565 cy_card
[j
].base_addr
= cy_isa_address
;
3566 cy_card
[j
].ctl_addr
.p9050
= NULL
;
3567 cy_card
[j
].irq
= (int)cy_isa_irq
;
3568 cy_card
[j
].bus_index
= 0;
3569 cy_card
[j
].first_line
= cy_next_channel
;
3570 cy_card
[j
].num_chips
= cy_isa_nchan
/ CyPORTS_PER_CHIP
;
3571 cy_card
[j
].nports
= cy_isa_nchan
;
3572 if (cy_init_card(&cy_card
[j
])) {
3573 cy_card
[j
].base_addr
= NULL
;
3574 free_irq(cy_isa_irq
, &cy_card
[j
]);
3575 iounmap(cy_isa_address
);
3580 printk(KERN_INFO
"Cyclom-Y/ISA #%d: 0x%lx-0x%lx, IRQ%d found: "
3581 "%d channels starting from port %d\n",
3582 j
+ 1, (unsigned long)cy_isa_address
,
3583 (unsigned long)(cy_isa_address
+ (CyISA_Ywin
- 1)),
3584 cy_isa_irq
, cy_isa_nchan
, cy_next_channel
);
3586 for (j
= cy_next_channel
;
3587 j
< cy_next_channel
+ cy_isa_nchan
; j
++)
3588 tty_register_device(cy_serial_driver
, j
, NULL
);
3589 cy_next_channel
+= cy_isa_nchan
;
3594 #endif /* CONFIG_ISA */
3595 } /* cy_detect_isa */
3598 static inline int __devinit
cyc_isfwstr(const char *str
, unsigned int size
)
3602 for (a
= 0; a
< size
&& *str
; a
++, str
++)
3606 for (; a
< size
; a
++, str
++)
3613 static inline void __devinit
cyz_fpga_copy(void __iomem
*fpga
, const u8
*data
,
3616 for (; size
> 0; size
--) {
3617 cy_writel(fpga
, *data
++);
3622 static void __devinit
plx_init(struct pci_dev
*pdev
, int irq
,
3623 struct RUNTIME_9060 __iomem
*addr
)
3626 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) | 0x40000000);
3628 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) & ~0x40000000);
3630 /* Reload Config. Registers from EEPROM */
3631 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) | 0x20000000);
3633 cy_writel(&addr
->init_ctrl
, readl(&addr
->init_ctrl
) & ~0x20000000);
3635 /* For some yet unknown reason, once the PLX9060 reloads the EEPROM,
3636 * the IRQ is lost and, thus, we have to re-write it to the PCI config.
3637 * registers. This will remain here until we find a permanent fix.
3639 pci_write_config_byte(pdev
, PCI_INTERRUPT_LINE
, irq
);
3642 static int __devinit
__cyz_load_fw(const struct firmware
*fw
,
3643 const char *name
, const u32 mailbox
, void __iomem
*base
,
3646 const void *ptr
= fw
->data
;
3647 const struct zfile_header
*h
= ptr
;
3648 const struct zfile_config
*c
, *cs
;
3649 const struct zfile_block
*b
, *bs
;
3650 unsigned int a
, tmp
, len
= fw
->size
;
3651 #define BAD_FW KERN_ERR "Bad firmware: "
3652 if (len
< sizeof(*h
)) {
3653 printk(BAD_FW
"too short: %u<%zu\n", len
, sizeof(*h
));
3657 cs
= ptr
+ h
->config_offset
;
3658 bs
= ptr
+ h
->block_offset
;
3660 if ((void *)(cs
+ h
->n_config
) > ptr
+ len
||
3661 (void *)(bs
+ h
->n_blocks
) > ptr
+ len
) {
3662 printk(BAD_FW
"too short");
3666 if (cyc_isfwstr(h
->name
, sizeof(h
->name
)) ||
3667 cyc_isfwstr(h
->date
, sizeof(h
->date
))) {
3668 printk(BAD_FW
"bad formatted header string\n");
3672 if (strncmp(name
, h
->name
, sizeof(h
->name
))) {
3673 printk(BAD_FW
"bad name '%s' (expected '%s')\n", h
->name
, name
);
3678 for (c
= cs
; c
< cs
+ h
->n_config
; c
++) {
3679 for (a
= 0; a
< c
->n_blocks
; a
++)
3680 if (c
->block_list
[a
] > h
->n_blocks
) {
3681 printk(BAD_FW
"bad block ref number in cfgs\n");
3684 if (c
->mailbox
== mailbox
&& c
->function
== 0) /* 0 is normal */
3688 printk(BAD_FW
"nothing appropriate\n");
3692 for (b
= bs
; b
< bs
+ h
->n_blocks
; b
++)
3693 if (b
->file_offset
+ b
->size
> len
) {
3694 printk(BAD_FW
"bad block data offset\n");
3698 /* everything is OK, let's seek'n'load it */
3699 for (c
= cs
; c
< cs
+ h
->n_config
; c
++)
3700 if (c
->mailbox
== mailbox
&& c
->function
== 0)
3703 for (a
= 0; a
< c
->n_blocks
; a
++) {
3704 b
= &bs
[c
->block_list
[a
]];
3705 if (b
->type
== ZBLOCK_FPGA
) {
3707 cyz_fpga_copy(fpga
, ptr
+ b
->file_offset
,
3711 memcpy_toio(base
+ b
->ram_offset
,
3712 ptr
+ b
->file_offset
, b
->size
);
3719 static int __devinit
cyz_load_fw(struct pci_dev
*pdev
, void __iomem
*base_addr
,
3720 struct RUNTIME_9060 __iomem
*ctl_addr
, int irq
)
3722 const struct firmware
*fw
;
3723 struct FIRM_ID __iomem
*fid
= base_addr
+ ID_ADDRESS
;
3724 struct CUSTOM_REG __iomem
*cust
= base_addr
;
3725 struct ZFW_CTRL __iomem
*pt_zfwctrl
;
3727 u32 mailbox
, status
, nchan
;
3731 retval
= request_firmware(&fw
, "cyzfirm.bin", &pdev
->dev
);
3733 dev_err(&pdev
->dev
, "can't get firmware\n");
3737 /* Check whether the firmware is already loaded and running. If
3738 positive, skip this board */
3739 if (__cyz_fpga_loaded(ctl_addr
) && readl(&fid
->signature
) == ZFIRM_ID
) {
3740 u32 cntval
= readl(base_addr
+ 0x190);
3743 if (cntval
!= readl(base_addr
+ 0x190)) {
3744 /* FW counter is working, FW is running */
3745 dev_dbg(&pdev
->dev
, "Cyclades-Z FW already loaded. "
3746 "Skipping board.\n");
3753 cy_writel(&ctl_addr
->intr_ctrl_stat
, readl(&ctl_addr
->intr_ctrl_stat
) &
3756 mailbox
= readl(&ctl_addr
->mail_box_0
);
3758 if (mailbox
== 0 || __cyz_fpga_loaded(ctl_addr
)) {
3759 /* stops CPU and set window to beginning of RAM */
3760 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3761 cy_writel(&cust
->cpu_stop
, 0);
3762 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3766 plx_init(pdev
, irq
, ctl_addr
);
3770 retval
= __cyz_load_fw(fw
, "Cyclom-Z", mailbox
, NULL
,
3774 if (!__cyz_fpga_loaded(ctl_addr
)) {
3775 dev_err(&pdev
->dev
, "fw upload successful, but fw is "
3781 /* stops CPU and set window to beginning of RAM */
3782 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3783 cy_writel(&cust
->cpu_stop
, 0);
3784 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3788 for (tmp
= base_addr
; tmp
< base_addr
+ RAM_SIZE
; tmp
++)
3789 cy_writeb(tmp
, 255);
3791 /* set window to last 512K of RAM */
3792 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
+ RAM_SIZE
);
3793 for (tmp
= base_addr
; tmp
< base_addr
+ RAM_SIZE
; tmp
++)
3794 cy_writeb(tmp
, 255);
3795 /* set window to beginning of RAM */
3796 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3799 retval
= __cyz_load_fw(fw
, "Cyclom-Z", mailbox
, base_addr
, NULL
);
3800 release_firmware(fw
);
3804 /* finish boot and start boards */
3805 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3806 cy_writel(&cust
->cpu_start
, 0);
3807 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3809 while ((status
= readl(&fid
->signature
)) != ZFIRM_ID
&& i
++ < 40)
3811 if (status
!= ZFIRM_ID
) {
3812 if (status
== ZFIRM_HLT
) {
3813 dev_err(&pdev
->dev
, "you need an external power supply "
3814 "for this number of ports. Firmware halted and "
3819 dev_warn(&pdev
->dev
, "fid->signature = 0x%x... Waiting "
3820 "some more time\n", status
);
3821 while ((status
= readl(&fid
->signature
)) != ZFIRM_ID
&&
3824 if (status
!= ZFIRM_ID
) {
3825 dev_err(&pdev
->dev
, "Board not started in 20 seconds! "
3826 "Giving up. (fid->signature = 0x%x)\n",
3828 dev_info(&pdev
->dev
, "*** Warning ***: if you are "
3829 "upgrading the FW, please power cycle the "
3830 "system before loading the new FW to the "
3833 if (__cyz_fpga_loaded(ctl_addr
))
3834 plx_init(pdev
, irq
, ctl_addr
);
3839 dev_dbg(&pdev
->dev
, "Firmware started after %d seconds.\n",
3842 pt_zfwctrl
= base_addr
+ readl(&fid
->zfwctrl_addr
);
3844 dev_dbg(&pdev
->dev
, "fid=> %p, zfwctrl_addr=> %x, npt_zfwctrl=> %p\n",
3845 base_addr
+ ID_ADDRESS
, readl(&fid
->zfwctrl_addr
),
3846 base_addr
+ readl(&fid
->zfwctrl_addr
));
3848 nchan
= readl(&pt_zfwctrl
->board_ctrl
.n_channel
);
3849 dev_info(&pdev
->dev
, "Cyclades-Z FW loaded: version = %x, ports = %u\n",
3850 readl(&pt_zfwctrl
->board_ctrl
.fw_version
), nchan
);
3853 dev_warn(&pdev
->dev
, "no Cyclades-Z ports were found. Please "
3854 "check the connection between the Z host card and the "
3855 "serial expanders.\n");
3857 if (__cyz_fpga_loaded(ctl_addr
))
3858 plx_init(pdev
, irq
, ctl_addr
);
3860 dev_info(&pdev
->dev
, "Null number of ports detected. Board "
3866 cy_writel(&pt_zfwctrl
->board_ctrl
.op_system
, C_OS_LINUX
);
3867 cy_writel(&pt_zfwctrl
->board_ctrl
.dr_version
, DRIVER_VERSION
);
3870 Early firmware failed to start looking for commands.
3871 This enables firmware interrupts for those commands.
3873 cy_writel(&ctl_addr
->intr_ctrl_stat
, readl(&ctl_addr
->intr_ctrl_stat
) |
3875 cy_writel(&ctl_addr
->intr_ctrl_stat
, readl(&ctl_addr
->intr_ctrl_stat
) |
3880 release_firmware(fw
);
3885 static int __devinit
cy_pci_probe(struct pci_dev
*pdev
,
3886 const struct pci_device_id
*ent
)
3888 void __iomem
*addr0
= NULL
, *addr2
= NULL
;
3889 char *card_name
= NULL
;
3890 u32
uninitialized_var(mailbox
);
3891 unsigned int device_id
, nchan
= 0, card_no
, i
;
3892 unsigned char plx_ver
;
3895 retval
= pci_enable_device(pdev
);
3897 dev_err(&pdev
->dev
, "cannot enable device\n");
3901 /* read PCI configuration area */
3903 device_id
= pdev
->device
& ~PCI_DEVICE_ID_MASK
;
3905 #if defined(__alpha__)
3906 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
) { /* below 1M? */
3907 dev_err(&pdev
->dev
, "Cyclom-Y/PCI not supported for low "
3908 "addresses on Alpha systems.\n");
3913 if (device_id
== PCI_DEVICE_ID_CYCLOM_Z_Lo
) {
3914 dev_err(&pdev
->dev
, "Cyclades-Z/PCI not supported for low "
3920 if (pci_resource_flags(pdev
, 2) & IORESOURCE_IO
) {
3921 dev_warn(&pdev
->dev
, "PCI I/O bit incorrectly set. Ignoring "
3923 pdev
->resource
[2].flags
&= ~IORESOURCE_IO
;
3926 retval
= pci_request_regions(pdev
, "cyclades");
3928 dev_err(&pdev
->dev
, "failed to reserve resources\n");
3933 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
||
3934 device_id
== PCI_DEVICE_ID_CYCLOM_Y_Hi
) {
3935 card_name
= "Cyclom-Y";
3937 addr0
= ioremap_nocache(pci_resource_start(pdev
, 0),
3939 if (addr0
== NULL
) {
3940 dev_err(&pdev
->dev
, "can't remap ctl region\n");
3943 addr2
= ioremap_nocache(pci_resource_start(pdev
, 2),
3945 if (addr2
== NULL
) {
3946 dev_err(&pdev
->dev
, "can't remap base region\n");
3950 nchan
= CyPORTS_PER_CHIP
* cyy_init_card(addr2
, 1);
3952 dev_err(&pdev
->dev
, "Cyclom-Y PCI host card with no "
3953 "Serial-Modules\n");
3956 } else if (device_id
== PCI_DEVICE_ID_CYCLOM_Z_Hi
) {
3957 struct RUNTIME_9060 __iomem
*ctl_addr
;
3959 ctl_addr
= addr0
= ioremap_nocache(pci_resource_start(pdev
, 0),
3961 if (addr0
== NULL
) {
3962 dev_err(&pdev
->dev
, "can't remap ctl region\n");
3966 /* Disable interrupts on the PLX before resetting it */
3967 cy_writew(&ctl_addr
->intr_ctrl_stat
,
3968 readw(&ctl_addr
->intr_ctrl_stat
) & ~0x0900);
3970 plx_init(pdev
, irq
, addr0
);
3972 mailbox
= readl(&ctl_addr
->mail_box_0
);
3974 addr2
= ioremap_nocache(pci_resource_start(pdev
, 2),
3975 mailbox
== ZE_V1
? CyPCI_Ze_win
: CyPCI_Zwin
);
3976 if (addr2
== NULL
) {
3977 dev_err(&pdev
->dev
, "can't remap base region\n");
3981 if (mailbox
== ZE_V1
) {
3982 card_name
= "Cyclades-Ze";
3984 card_name
= "Cyclades-8Zo";
3986 if (mailbox
== ZO_V1
) {
3987 cy_writel(&ctl_addr
->loc_addr_base
, WIN_CREG
);
3988 dev_info(&pdev
->dev
, "Cyclades-8Zo/PCI: FPGA "
3989 "id %lx, ver %lx\n", (ulong
)(0xff &
3990 readl(&((struct CUSTOM_REG
*)addr2
)->
3991 fpga_id
)), (ulong
)(0xff &
3992 readl(&((struct CUSTOM_REG
*)addr2
)->
3994 cy_writel(&ctl_addr
->loc_addr_base
, WIN_RAM
);
3996 dev_info(&pdev
->dev
, "Cyclades-Z/PCI: New "
3997 "Cyclades-Z board. FPGA not loaded\n");
4000 /* The following clears the firmware id word. This
4001 ensures that the driver will not attempt to talk to
4002 the board until it has been properly initialized.
4004 if ((mailbox
== ZO_V1
) || (mailbox
== ZO_V2
))
4005 cy_writel(addr2
+ ID_ADDRESS
, 0L);
4008 retval
= cyz_load_fw(pdev
, addr2
, addr0
, irq
);
4014 if ((cy_next_channel
+ nchan
) > NR_PORTS
) {
4015 dev_err(&pdev
->dev
, "Cyclades-8Zo/PCI found, but no "
4016 "channels are available. Change NR_PORTS in "
4017 "cyclades.c and recompile kernel.\n");
4020 /* fill the next cy_card structure available */
4021 for (card_no
= 0; card_no
< NR_CARDS
; card_no
++) {
4022 if (cy_card
[card_no
].base_addr
== NULL
)
4025 if (card_no
== NR_CARDS
) { /* no more cy_cards available */
4026 dev_err(&pdev
->dev
, "Cyclades-8Zo/PCI found, but no "
4027 "more cards can be used. Change NR_CARDS in "
4028 "cyclades.c and recompile kernel.\n");
4032 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
||
4033 device_id
== PCI_DEVICE_ID_CYCLOM_Y_Hi
) {
4035 retval
= request_irq(irq
, cyy_interrupt
,
4036 IRQF_SHARED
, "Cyclom-Y", &cy_card
[card_no
]);
4038 dev_err(&pdev
->dev
, "could not allocate IRQ\n");
4041 cy_card
[card_no
].num_chips
= nchan
/ CyPORTS_PER_CHIP
;
4043 struct FIRM_ID __iomem
*firm_id
= addr2
+ ID_ADDRESS
;
4044 struct ZFW_CTRL __iomem
*zfw_ctrl
;
4046 zfw_ctrl
= addr2
+ (readl(&firm_id
->zfwctrl_addr
) & 0xfffff);
4048 cy_card
[card_no
].hw_ver
= mailbox
;
4049 cy_card
[card_no
].num_chips
= (unsigned int)-1;
4050 cy_card
[card_no
].board_ctrl
= &zfw_ctrl
->board_ctrl
;
4051 #ifdef CONFIG_CYZ_INTR
4052 /* allocate IRQ only if board has an IRQ */
4053 if (irq
!= 0 && irq
!= 255) {
4054 retval
= request_irq(irq
, cyz_interrupt
,
4055 IRQF_SHARED
, "Cyclades-Z",
4058 dev_err(&pdev
->dev
, "could not allocate IRQ\n");
4062 #endif /* CONFIG_CYZ_INTR */
4066 cy_card
[card_no
].base_addr
= addr2
;
4067 cy_card
[card_no
].ctl_addr
.p9050
= addr0
;
4068 cy_card
[card_no
].irq
= irq
;
4069 cy_card
[card_no
].bus_index
= 1;
4070 cy_card
[card_no
].first_line
= cy_next_channel
;
4071 cy_card
[card_no
].nports
= nchan
;
4072 retval
= cy_init_card(&cy_card
[card_no
]);
4076 pci_set_drvdata(pdev
, &cy_card
[card_no
]);
4078 if (device_id
== PCI_DEVICE_ID_CYCLOM_Y_Lo
||
4079 device_id
== PCI_DEVICE_ID_CYCLOM_Y_Hi
) {
4080 /* enable interrupts in the PCI interface */
4081 plx_ver
= readb(addr2
+ CyPLX_VER
) & 0x0f;
4084 cy_writeb(addr0
+ 0x4c, 0x43);
4089 default: /* Old boards, use PLX_9060 */
4091 struct RUNTIME_9060 __iomem
*ctl_addr
= addr0
;
4092 plx_init(pdev
, irq
, ctl_addr
);
4093 cy_writew(&ctl_addr
->intr_ctrl_stat
,
4094 readw(&ctl_addr
->intr_ctrl_stat
) | 0x0900);
4100 dev_info(&pdev
->dev
, "%s/PCI #%d found: %d channels starting from "
4101 "port %d.\n", card_name
, card_no
+ 1, nchan
, cy_next_channel
);
4102 for (i
= cy_next_channel
; i
< cy_next_channel
+ nchan
; i
++)
4103 tty_register_device(cy_serial_driver
, i
, &pdev
->dev
);
4104 cy_next_channel
+= nchan
;
4108 cy_card
[card_no
].base_addr
= NULL
;
4109 free_irq(irq
, &cy_card
[card_no
]);
4115 pci_release_regions(pdev
);
4117 pci_disable_device(pdev
);
4122 static void __devexit
cy_pci_remove(struct pci_dev
*pdev
)
4124 struct cyclades_card
*cinfo
= pci_get_drvdata(pdev
);
4127 /* non-Z with old PLX */
4128 if (!cy_is_Z(cinfo
) && (readb(cinfo
->base_addr
+ CyPLX_VER
) & 0x0f) ==
4130 cy_writeb(cinfo
->ctl_addr
.p9050
+ 0x4c, 0);
4132 #ifndef CONFIG_CYZ_INTR
4133 if (!cy_is_Z(cinfo
))
4135 cy_writew(&cinfo
->ctl_addr
.p9060
->intr_ctrl_stat
,
4136 readw(&cinfo
->ctl_addr
.p9060
->intr_ctrl_stat
) &
4139 iounmap(cinfo
->base_addr
);
4140 if (cinfo
->ctl_addr
.p9050
)
4141 iounmap(cinfo
->ctl_addr
.p9050
);
4143 #ifndef CONFIG_CYZ_INTR
4145 #endif /* CONFIG_CYZ_INTR */
4147 free_irq(cinfo
->irq
, cinfo
);
4148 pci_release_regions(pdev
);
4150 cinfo
->base_addr
= NULL
;
4151 for (i
= cinfo
->first_line
; i
< cinfo
->first_line
+
4153 tty_unregister_device(cy_serial_driver
, i
);
4155 kfree(cinfo
->ports
);
4158 static struct pci_driver cy_pci_driver
= {
4160 .id_table
= cy_pci_dev_id
,
4161 .probe
= cy_pci_probe
,
4162 .remove
= __devexit_p(cy_pci_remove
)
4166 static int cyclades_proc_show(struct seq_file
*m
, void *v
)
4168 struct cyclades_port
*info
;
4170 __u32 cur_jifs
= jiffies
;
4172 seq_puts(m
, "Dev TimeOpen BytesOut IdleOut BytesIn "
4173 "IdleIn Overruns Ldisc\n");
4175 /* Output one line for each known port */
4176 for (i
= 0; i
< NR_CARDS
; i
++)
4177 for (j
= 0; j
< cy_card
[i
].nports
; j
++) {
4178 info
= &cy_card
[i
].ports
[j
];
4180 if (info
->port
.count
) {
4181 /* XXX is the ldisc num worth this? */
4182 struct tty_struct
*tty
;
4183 struct tty_ldisc
*ld
;
4185 tty
= tty_port_tty_get(&info
->port
);
4187 ld
= tty_ldisc_ref(tty
);
4190 tty_ldisc_deref(ld
);
4194 seq_printf(m
, "%3d %8lu %10lu %8lu "
4195 "%10lu %8lu %9lu %6d\n", info
->line
,
4196 (cur_jifs
- info
->idle_stats
.in_use
) /
4197 HZ
, info
->idle_stats
.xmit_bytes
,
4198 (cur_jifs
- info
->idle_stats
.xmit_idle
)/
4199 HZ
, info
->idle_stats
.recv_bytes
,
4200 (cur_jifs
- info
->idle_stats
.recv_idle
)/
4201 HZ
, info
->idle_stats
.overruns
,
4204 seq_printf(m
, "%3d %8lu %10lu %8lu "
4205 "%10lu %8lu %9lu %6ld\n",
4206 info
->line
, 0L, 0L, 0L, 0L, 0L, 0L, 0L);
4211 static int cyclades_proc_open(struct inode
*inode
, struct file
*file
)
4213 return single_open(file
, cyclades_proc_show
, NULL
);
4216 static const struct file_operations cyclades_proc_fops
= {
4217 .owner
= THIS_MODULE
,
4218 .open
= cyclades_proc_open
,
4220 .llseek
= seq_lseek
,
4221 .release
= single_release
,
4224 /* The serial driver boot-time initialization code!
4225 Hardware I/O ports are mapped to character special devices on a
4226 first found, first allocated manner. That is, this code searches
4227 for Cyclom cards in the system. As each is found, it is probed
4228 to discover how many chips (and thus how many ports) are present.
4229 These ports are mapped to the tty ports 32 and upward in monotonic
4230 fashion. If an 8-port card is replaced with a 16-port card, the
4231 port mapping on a following card will shift.
4233 This approach is different from what is used in the other serial
4234 device driver because the Cyclom is more properly a multiplexer,
4235 not just an aggregation of serial ports on one card.
4237 If there are more cards with more ports than have been
4238 statically allocated above, a warning is printed and the
4239 extra ports are ignored.
4242 static const struct tty_operations cy_ops
= {
4246 .put_char
= cy_put_char
,
4247 .flush_chars
= cy_flush_chars
,
4248 .write_room
= cy_write_room
,
4249 .chars_in_buffer
= cy_chars_in_buffer
,
4250 .flush_buffer
= cy_flush_buffer
,
4252 .throttle
= cy_throttle
,
4253 .unthrottle
= cy_unthrottle
,
4254 .set_termios
= cy_set_termios
,
4257 .hangup
= cy_hangup
,
4258 .break_ctl
= cy_break
,
4259 .wait_until_sent
= cy_wait_until_sent
,
4260 .tiocmget
= cy_tiocmget
,
4261 .tiocmset
= cy_tiocmset
,
4262 .proc_fops
= &cyclades_proc_fops
,
4265 static int __init
cy_init(void)
4267 unsigned int nboards
;
4268 int retval
= -ENOMEM
;
4270 cy_serial_driver
= alloc_tty_driver(NR_PORTS
);
4271 if (!cy_serial_driver
)
4274 printk(KERN_INFO
"Cyclades driver " CY_VERSION
" (built %s %s)\n",
4275 __DATE__
, __TIME__
);
4277 /* Initialize the tty_driver structure */
4279 cy_serial_driver
->owner
= THIS_MODULE
;
4280 cy_serial_driver
->driver_name
= "cyclades";
4281 cy_serial_driver
->name
= "ttyC";
4282 cy_serial_driver
->major
= CYCLADES_MAJOR
;
4283 cy_serial_driver
->minor_start
= 0;
4284 cy_serial_driver
->type
= TTY_DRIVER_TYPE_SERIAL
;
4285 cy_serial_driver
->subtype
= SERIAL_TYPE_NORMAL
;
4286 cy_serial_driver
->init_termios
= tty_std_termios
;
4287 cy_serial_driver
->init_termios
.c_cflag
=
4288 B9600
| CS8
| CREAD
| HUPCL
| CLOCAL
;
4289 cy_serial_driver
->flags
= TTY_DRIVER_REAL_RAW
| TTY_DRIVER_DYNAMIC_DEV
;
4290 tty_set_operations(cy_serial_driver
, &cy_ops
);
4292 retval
= tty_register_driver(cy_serial_driver
);
4294 printk(KERN_ERR
"Couldn't register Cyclades serial driver\n");
4298 /* the code below is responsible to find the boards. Each different
4299 type of board has its own detection routine. If a board is found,
4300 the next cy_card structure available is set by the detection
4301 routine. These functions are responsible for checking the
4302 availability of cy_card and cy_port data structures and updating
4303 the cy_next_channel. */
4305 /* look for isa boards */
4306 nboards
= cy_detect_isa();
4309 /* look for pci boards */
4310 retval
= pci_register_driver(&cy_pci_driver
);
4311 if (retval
&& !nboards
) {
4312 tty_unregister_driver(cy_serial_driver
);
4319 put_tty_driver(cy_serial_driver
);
4324 static void __exit
cy_cleanup_module(void)
4326 struct cyclades_card
*card
;
4329 #ifndef CONFIG_CYZ_INTR
4330 del_timer_sync(&cyz_timerlist
);
4331 #endif /* CONFIG_CYZ_INTR */
4333 e1
= tty_unregister_driver(cy_serial_driver
);
4335 printk(KERN_ERR
"failed to unregister Cyclades serial "
4336 "driver(%d)\n", e1
);
4339 pci_unregister_driver(&cy_pci_driver
);
4342 for (i
= 0; i
< NR_CARDS
; i
++) {
4344 if (card
->base_addr
) {
4345 /* clear interrupt */
4346 cy_writeb(card
->base_addr
+ Cy_ClrIntr
, 0);
4347 iounmap(card
->base_addr
);
4348 if (card
->ctl_addr
.p9050
)
4349 iounmap(card
->ctl_addr
.p9050
);
4351 #ifndef CONFIG_CYZ_INTR
4353 #endif /* CONFIG_CYZ_INTR */
4355 free_irq(card
->irq
, card
);
4356 for (e1
= card
->first_line
; e1
< card
->first_line
+
4358 tty_unregister_device(cy_serial_driver
, e1
);
4363 put_tty_driver(cy_serial_driver
);
4364 } /* cy_cleanup_module */
4366 module_init(cy_init
);
4367 module_exit(cy_cleanup_module
);
4369 MODULE_LICENSE("GPL");
4370 MODULE_VERSION(CY_VERSION
);
4371 MODULE_ALIAS_CHARDEV_MAJOR(CYCLADES_MAJOR
);