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