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