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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592#define CY_VERSION "2.5"
593
594
595
596
597
598#define NR_CARDS 4
599
600
601
602
603
604
605#define NR_PORTS 256
606
607#define ZE_V1_NPORTS 64
608#define ZO_V1 0
609#define ZO_V2 1
610#define ZE_V1 2
611
612#define SERIAL_PARANOIA_CHECK
613#undef CY_DEBUG_OPEN
614#undef CY_DEBUG_THROTTLE
615#undef CY_DEBUG_OTHER
616#undef CY_DEBUG_IO
617#undef CY_DEBUG_COUNT
618#undef CY_DEBUG_DTR
619#undef CY_DEBUG_WAIT_UNTIL_SENT
620#undef CY_DEBUG_INTERRUPTS
621#undef CY_16Y_HACK
622#undef CY_ENABLE_MONITORING
623#undef CY_PCI_DEBUG
624
625
626
627
628#include <linux/module.h>
629#include <linux/errno.h>
630#include <linux/signal.h>
631#include <linux/sched.h>
632#include <linux/timer.h>
633#include <linux/interrupt.h>
634#include <linux/tty.h>
635#include <linux/tty_flip.h>
636#include <linux/serial.h>
637#include <linux/major.h>
638#include <linux/string.h>
639#include <linux/fcntl.h>
640#include <linux/ptrace.h>
641#include <linux/cyclades.h>
642#include <linux/mm.h>
643#include <linux/ioport.h>
644#include <linux/init.h>
645#include <linux/delay.h>
646#include <linux/spinlock.h>
647#include <linux/bitops.h>
648#include <linux/firmware.h>
649
650#include <asm/system.h>
651#include <linux/io.h>
652#include <asm/irq.h>
653#include <linux/uaccess.h>
654
655#include <linux/kernel.h>
656#include <linux/pci.h>
657
658#include <linux/stat.h>
659#include <linux/proc_fs.h>
660
661static void cy_throttle(struct tty_struct *tty);
662static void cy_send_xchar(struct tty_struct *tty, char ch);
663
664#define IS_CYC_Z(card) ((card).num_chips == (unsigned int)-1)
665
666#define Z_FPGA_CHECK(card) \
667 ((readl(&((struct RUNTIME_9060 __iomem *) \
668 ((card).ctl_addr))->init_ctrl) & (1<<17)) != 0)
669
670#define ISZLOADED(card) (((ZO_V1 == readl(&((struct RUNTIME_9060 __iomem *) \
671 ((card).ctl_addr))->mail_box_0)) || \
672 Z_FPGA_CHECK(card)) && \
673 (ZFIRM_ID == readl(&((struct FIRM_ID __iomem *) \
674 ((card).base_addr+ID_ADDRESS))->signature)))
675
676#ifndef SERIAL_XMIT_SIZE
677#define SERIAL_XMIT_SIZE (min(PAGE_SIZE, 4096))
678#endif
679#define WAKEUP_CHARS 256
680
681#define STD_COM_FLAGS (0)
682
683
684#define ZL_MAX_BLOCKS 16
685#define DRIVER_VERSION 0x02010203
686#define RAM_SIZE 0x80000
687
688#define Z_FPGA_LOADED(X) ((readl(&(X)->init_ctrl) & (1<<17)) != 0)
689
690enum zblock_type {
691 ZBLOCK_PRG = 0,
692 ZBLOCK_FPGA = 1
693};
694
695struct zfile_header {
696 char name[64];
697 char date[32];
698 char aux[32];
699 u32 n_config;
700 u32 config_offset;
701 u32 n_blocks;
702 u32 block_offset;
703 u32 reserved[9];
704} __attribute__ ((packed));
705
706struct zfile_config {
707 char name[64];
708 u32 mailbox;
709 u32 function;
710 u32 n_blocks;
711 u32 block_list[ZL_MAX_BLOCKS];
712} __attribute__ ((packed));
713
714struct zfile_block {
715 u32 type;
716 u32 file_offset;
717 u32 ram_offset;
718 u32 size;
719} __attribute__ ((packed));
720
721static struct tty_driver *cy_serial_driver;
722
723#ifdef CONFIG_ISA
724
725
726
727
728
729
730
731static unsigned int cy_isa_addresses[] = {
732 0xD0000,
733 0xD2000,
734 0xD4000,
735 0xD6000,
736 0xD8000,
737 0xDA000,
738 0xDC000,
739 0xDE000,
740 0, 0, 0, 0, 0, 0, 0, 0
741};
742
743#define NR_ISA_ADDRS ARRAY_SIZE(cy_isa_addresses)
744
745#ifdef MODULE
746static long maddr[NR_CARDS];
747static int irq[NR_CARDS];
748
749module_param_array(maddr, long, NULL, 0);
750module_param_array(irq, int, NULL, 0);
751#endif
752
753#endif
754
755
756
757
758static struct cyclades_card cy_card[NR_CARDS];
759
760static int cy_next_channel;
761
762
763
764
765
766
767
768
769
770
771static int baud_table[] = {
772 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
773 1800, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200, 150000,
774 230400, 0
775};
776
777static char baud_co_25[] = {
778
779
780 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02,
781 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
782};
783
784static char baud_bpr_25[] = {
785 0x00, 0xf5, 0xa3, 0x6f, 0x5c, 0x51, 0xf5, 0xa3, 0x51, 0xa3,
786 0x6d, 0x51, 0xa3, 0x51, 0xa3, 0x51, 0x36, 0x29, 0x1b, 0x15
787};
788
789static char baud_co_60[] = {
790
791
792 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03,
793 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
794 0x00
795};
796
797static char baud_bpr_60[] = {
798 0x00, 0x82, 0x21, 0xff, 0xdb, 0xc3, 0x92, 0x62, 0xc3, 0x62,
799 0x41, 0xc3, 0x62, 0xc3, 0x62, 0xc3, 0x82, 0x62, 0x41, 0x32,
800 0x21
801};
802
803static char baud_cor3[] = {
804 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
805 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07,
806 0x07
807};
808
809
810
811
812
813
814
815
816
817
818
819
820static char rflow_thr[] = {
821 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
822 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
823 0x0a
824};
825
826
827
828
829static int cy_chip_offset[] = { 0x0000,
830 0x0400,
831 0x0800,
832 0x0C00,
833 0x0200,
834 0x0600,
835 0x0A00,
836 0x0E00
837};
838
839
840
841#ifdef CONFIG_PCI
842static struct pci_device_id cy_pci_dev_id[] __devinitdata = {
843
844 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Y_Lo) },
845
846 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Y_Hi) },
847
848 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_4Y_Lo) },
849
850 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_4Y_Hi) },
851
852 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_8Y_Lo) },
853
854 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_8Y_Hi) },
855
856 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Z_Lo) },
857
858 { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Z_Hi) },
859 { }
860};
861MODULE_DEVICE_TABLE(pci, cy_pci_dev_id);
862#endif
863
864static void cy_start(struct tty_struct *);
865static void set_line_char(struct cyclades_port *);
866static int cyz_issue_cmd(struct cyclades_card *, __u32, __u8, __u32);
867#ifdef CONFIG_ISA
868static unsigned detect_isa_irq(void __iomem *);
869#endif
870
871static int cyclades_get_proc_info(char *, char **, off_t, int, int *, void *);
872
873#ifndef CONFIG_CYZ_INTR
874static void cyz_poll(unsigned long);
875
876
877static long cyz_polling_cycle = CZ_DEF_POLL;
878
879static DEFINE_TIMER(cyz_timerlist, cyz_poll, 0, 0);
880
881#else
882static void cyz_rx_restart(unsigned long);
883static struct timer_list cyz_rx_full_timer[NR_PORTS];
884#endif
885
886static inline int serial_paranoia_check(struct cyclades_port *info,
887 char *name, const char *routine)
888{
889#ifdef SERIAL_PARANOIA_CHECK
890 if (!info) {
891 printk(KERN_WARNING "cyc Warning: null cyclades_port for (%s) "
892 "in %s\n", name, routine);
893 return 1;
894 }
895
896 if (info->magic != CYCLADES_MAGIC) {
897 printk(KERN_WARNING "cyc Warning: bad magic number for serial "
898 "struct (%s) in %s\n", name, routine);
899 return 1;
900 }
901#endif
902 return 0;
903}
904
905
906
907
908
909
910
911
912
913
914
915static int cyy_issue_cmd(void __iomem *base_addr, u_char cmd, int index)
916{
917 unsigned int i;
918
919
920 for (i = 0; i < 100; i++) {
921 if (readb(base_addr + (CyCCR << index)) == 0)
922 break;
923 udelay(10L);
924 }
925
926
927 if (i == 100)
928 return -1;
929
930
931 cy_writeb(base_addr + (CyCCR << index), cmd);
932
933 return 0;
934}
935
936#ifdef CONFIG_ISA
937
938static unsigned detect_isa_irq(void __iomem *address)
939{
940 int irq;
941 unsigned long irqs, flags;
942 int save_xir, save_car;
943 int index = 0;
944
945
946 irq = probe_irq_off(probe_irq_on());
947
948
949 cy_writeb(address + (Cy_ClrIntr << index), 0);
950
951
952 irqs = probe_irq_on();
953
954 udelay(5000L);
955
956
957 local_irq_save(flags);
958 cy_writeb(address + (CyCAR << index), 0);
959 cyy_issue_cmd(address, CyCHAN_CTL | CyENB_XMTR, index);
960
961 cy_writeb(address + (CyCAR << index), 0);
962 cy_writeb(address + (CySRER << index),
963 readb(address + (CySRER << index)) | CyTxRdy);
964 local_irq_restore(flags);
965
966
967 udelay(5000L);
968
969
970 irq = probe_irq_off(irqs);
971
972
973 save_xir = (u_char) readb(address + (CyTIR << index));
974 save_car = readb(address + (CyCAR << index));
975 cy_writeb(address + (CyCAR << index), (save_xir & 0x3));
976 cy_writeb(address + (CySRER << index),
977 readb(address + (CySRER << index)) & ~CyTxRdy);
978 cy_writeb(address + (CyTIR << index), (save_xir & 0x3f));
979 cy_writeb(address + (CyCAR << index), (save_car));
980 cy_writeb(address + (Cy_ClrIntr << index), 0);
981
982
983 return (irq > 0) ? irq : 0;
984}
985#endif
986
987static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
988 void __iomem *base_addr)
989{
990 struct cyclades_port *info;
991 struct tty_struct *tty;
992 int len, index = cinfo->bus_index;
993 u8 save_xir, channel, save_car, data, char_count;
994
995#ifdef CY_DEBUG_INTERRUPTS
996 printk(KERN_DEBUG "cyy_interrupt: rcvd intr, chip %d\n", chip);
997#endif
998
999 save_xir = readb(base_addr + (CyRIR << index));
1000 channel = save_xir & CyIRChannel;
1001 info = &cinfo->ports[channel + chip * 4];
1002 save_car = readb(base_addr + (CyCAR << index));
1003 cy_writeb(base_addr + (CyCAR << index), save_xir);
1004
1005
1006 if (info->port.tty == NULL) {
1007 if ((readb(base_addr + (CyRIVR << index)) & CyIVRMask) ==
1008 CyIVRRxEx) {
1009 data = readb(base_addr + (CyRDSR << index));
1010 } else {
1011 char_count = readb(base_addr + (CyRDCR << index));
1012 while (char_count--)
1013 data = readb(base_addr + (CyRDSR << index));
1014 }
1015 goto end;
1016 }
1017
1018 tty = info->port.tty;
1019 if ((readb(base_addr + (CyRIVR << index)) & CyIVRMask) ==
1020 CyIVRRxEx) {
1021 data = readb(base_addr + (CyRDSR << index));
1022
1023
1024 if (data & CyBREAK)
1025 info->icount.brk++;
1026 else if (data & CyFRAME)
1027 info->icount.frame++;
1028 else if (data & CyPARITY)
1029 info->icount.parity++;
1030 else if (data & CyOVERRUN)
1031 info->icount.overrun++;
1032
1033 if (data & info->ignore_status_mask) {
1034 info->icount.rx++;
1035 return;
1036 }
1037 if (tty_buffer_request_room(tty, 1)) {
1038 if (data & info->read_status_mask) {
1039 if (data & CyBREAK) {
1040 tty_insert_flip_char(tty,
1041 readb(base_addr + (CyRDSR <<
1042 index)), TTY_BREAK);
1043 info->icount.rx++;
1044 if (info->port.flags & ASYNC_SAK)
1045 do_SAK(tty);
1046 } else if (data & CyFRAME) {
1047 tty_insert_flip_char(tty,
1048 readb(base_addr + (CyRDSR <<
1049 index)), TTY_FRAME);
1050 info->icount.rx++;
1051 info->idle_stats.frame_errs++;
1052 } else if (data & CyPARITY) {
1053
1054 tty_insert_flip_char(tty,
1055 readb(base_addr + (CyRDSR <<
1056 index)), TTY_PARITY);
1057 info->icount.rx++;
1058 info->idle_stats.parity_errs++;
1059 } else if (data & CyOVERRUN) {
1060 tty_insert_flip_char(tty, 0,
1061 TTY_OVERRUN);
1062 info->icount.rx++;
1063
1064
1065
1066
1067 tty_insert_flip_char(tty,
1068 readb(base_addr + (CyRDSR <<
1069 index)), TTY_FRAME);
1070 info->icount.rx++;
1071 info->idle_stats.overruns++;
1072
1073
1074
1075
1076 } else {
1077 tty_insert_flip_char(tty, 0,
1078 TTY_NORMAL);
1079 info->icount.rx++;
1080 }
1081 } else {
1082 tty_insert_flip_char(tty, 0, TTY_NORMAL);
1083 info->icount.rx++;
1084 }
1085 } else {
1086
1087
1088 info->icount.buf_overrun++;
1089 info->idle_stats.overruns++;
1090 }
1091 } else {
1092
1093 char_count = readb(base_addr + (CyRDCR << index));
1094
1095#ifdef CY_ENABLE_MONITORING
1096 ++info->mon.int_count;
1097 info->mon.char_count += char_count;
1098 if (char_count > info->mon.char_max)
1099 info->mon.char_max = char_count;
1100 info->mon.char_last = char_count;
1101#endif
1102 len = tty_buffer_request_room(tty, char_count);
1103 while (len--) {
1104 data = readb(base_addr + (CyRDSR << index));
1105 tty_insert_flip_char(tty, data, TTY_NORMAL);
1106 info->idle_stats.recv_bytes++;
1107 info->icount.rx++;
1108#ifdef CY_16Y_HACK
1109 udelay(10L);
1110#endif
1111 }
1112 info->idle_stats.recv_idle = jiffies;
1113 }
1114 tty_schedule_flip(tty);
1115end:
1116
1117 cy_writeb(base_addr + (CyRIR << index), save_xir & 0x3f);
1118 cy_writeb(base_addr + (CyCAR << index), save_car);
1119}
1120
1121static void cyy_chip_tx(struct cyclades_card *cinfo, unsigned int chip,
1122 void __iomem *base_addr)
1123{
1124 struct cyclades_port *info;
1125 int char_count, index = cinfo->bus_index;
1126 u8 save_xir, channel, save_car, outch;
1127
1128
1129
1130
1131#ifdef CY_DEBUG_INTERRUPTS
1132 printk(KERN_DEBUG "cyy_interrupt: xmit intr, chip %d\n", chip);
1133#endif
1134
1135
1136 save_xir = readb(base_addr + (CyTIR << index));
1137 channel = save_xir & CyIRChannel;
1138 save_car = readb(base_addr + (CyCAR << index));
1139 cy_writeb(base_addr + (CyCAR << index), save_xir);
1140
1141
1142 if (channel + chip * 4 >= cinfo->nports) {
1143 cy_writeb(base_addr + (CySRER << index),
1144 readb(base_addr + (CySRER << index)) & ~CyTxRdy);
1145 goto end;
1146 }
1147 info = &cinfo->ports[channel + chip * 4];
1148 if (info->port.tty == NULL) {
1149 cy_writeb(base_addr + (CySRER << index),
1150 readb(base_addr + (CySRER << index)) & ~CyTxRdy);
1151 goto end;
1152 }
1153
1154
1155 char_count = info->xmit_fifo_size;
1156
1157 if (info->x_char) {
1158 outch = info->x_char;
1159 cy_writeb(base_addr + (CyTDR << index), outch);
1160 char_count--;
1161 info->icount.tx++;
1162 info->x_char = 0;
1163 }
1164
1165 if (info->breakon || info->breakoff) {
1166 if (info->breakon) {
1167 cy_writeb(base_addr + (CyTDR << index), 0);
1168 cy_writeb(base_addr + (CyTDR << index), 0x81);
1169 info->breakon = 0;
1170 char_count -= 2;
1171 }
1172 if (info->breakoff) {
1173 cy_writeb(base_addr + (CyTDR << index), 0);
1174 cy_writeb(base_addr + (CyTDR << index), 0x83);
1175 info->breakoff = 0;
1176 char_count -= 2;
1177 }
1178 }
1179
1180 while (char_count-- > 0) {
1181 if (!info->xmit_cnt) {
1182 if (readb(base_addr + (CySRER << index)) & CyTxMpty) {
1183 cy_writeb(base_addr + (CySRER << index),
1184 readb(base_addr + (CySRER << index)) &
1185 ~CyTxMpty);
1186 } else {
1187 cy_writeb(base_addr + (CySRER << index),
1188 (readb(base_addr + (CySRER << index)) &
1189 ~CyTxRdy) | CyTxMpty);
1190 }
1191 goto done;
1192 }
1193 if (info->port.xmit_buf == NULL) {
1194 cy_writeb(base_addr + (CySRER << index),
1195 readb(base_addr + (CySRER << index)) &
1196 ~CyTxRdy);
1197 goto done;
1198 }
1199 if (info->port.tty->stopped || info->port.tty->hw_stopped) {
1200 cy_writeb(base_addr + (CySRER << index),
1201 readb(base_addr + (CySRER << index)) &
1202 ~CyTxRdy);
1203 goto done;
1204 }
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214 outch = info->port.xmit_buf[info->xmit_tail];
1215 if (outch) {
1216 info->xmit_cnt--;
1217 info->xmit_tail = (info->xmit_tail + 1) &
1218 (SERIAL_XMIT_SIZE - 1);
1219 cy_writeb(base_addr + (CyTDR << index), outch);
1220 info->icount.tx++;
1221 } else {
1222 if (char_count > 1) {
1223 info->xmit_cnt--;
1224 info->xmit_tail = (info->xmit_tail + 1) &
1225 (SERIAL_XMIT_SIZE - 1);
1226 cy_writeb(base_addr + (CyTDR << index), outch);
1227 cy_writeb(base_addr + (CyTDR << index), 0);
1228 info->icount.tx++;
1229 char_count--;
1230 }
1231 }
1232 }
1233
1234done:
1235 tty_wakeup(info->port.tty);
1236end:
1237
1238 cy_writeb(base_addr + (CyTIR << index), save_xir & 0x3f);
1239 cy_writeb(base_addr + (CyCAR << index), save_car);
1240}
1241
1242static void cyy_chip_modem(struct cyclades_card *cinfo, int chip,
1243 void __iomem *base_addr)
1244{
1245 struct cyclades_port *info;
1246 int index = cinfo->bus_index;
1247 u8 save_xir, channel, save_car, mdm_change, mdm_status;
1248
1249
1250 save_xir = readb(base_addr + (CyMIR << index));
1251 channel = save_xir & CyIRChannel;
1252 info = &cinfo->ports[channel + chip * 4];
1253 save_car = readb(base_addr + (CyCAR << index));
1254 cy_writeb(base_addr + (CyCAR << index), save_xir);
1255
1256 mdm_change = readb(base_addr + (CyMISR << index));
1257 mdm_status = readb(base_addr + (CyMSVR1 << index));
1258
1259 if (!info->port.tty)
1260 goto end;
1261
1262 if (mdm_change & CyANY_DELTA) {
1263
1264 if (mdm_change & CyDCD)
1265 info->icount.dcd++;
1266 if (mdm_change & CyCTS)
1267 info->icount.cts++;
1268 if (mdm_change & CyDSR)
1269 info->icount.dsr++;
1270 if (mdm_change & CyRI)
1271 info->icount.rng++;
1272
1273 wake_up_interruptible(&info->delta_msr_wait);
1274 }
1275
1276 if ((mdm_change & CyDCD) && (info->port.flags & ASYNC_CHECK_CD)) {
1277 if (!(mdm_status & CyDCD)) {
1278 tty_hangup(info->port.tty);
1279 info->port.flags &= ~ASYNC_NORMAL_ACTIVE;
1280 }
1281 wake_up_interruptible(&info->port.open_wait);
1282 }
1283 if ((mdm_change & CyCTS) && (info->port.flags & ASYNC_CTS_FLOW)) {
1284 if (info->port.tty->hw_stopped) {
1285 if (mdm_status & CyCTS) {
1286
1287
1288 info->port.tty->hw_stopped = 0;
1289 cy_writeb(base_addr + (CySRER << index),
1290 readb(base_addr + (CySRER << index)) |
1291 CyTxRdy);
1292 tty_wakeup(info->port.tty);
1293 }
1294 } else {
1295 if (!(mdm_status & CyCTS)) {
1296
1297
1298 info->port.tty->hw_stopped = 1;
1299 cy_writeb(base_addr + (CySRER << index),
1300 readb(base_addr + (CySRER << index)) &
1301 ~CyTxRdy);
1302 }
1303 }
1304 }
1305
1306
1307
1308
1309end:
1310
1311 cy_writeb(base_addr + (CyMIR << index), save_xir & 0x3f);
1312 cy_writeb(base_addr + (CyCAR << index), save_car);
1313}
1314
1315
1316
1317
1318
1319static irqreturn_t cyy_interrupt(int irq, void *dev_id)
1320{
1321 int status;
1322 struct cyclades_card *cinfo = dev_id;
1323 void __iomem *base_addr, *card_base_addr;
1324 unsigned int chip, too_many, had_work;
1325 int index;
1326
1327 if (unlikely(cinfo == NULL)) {
1328#ifdef CY_DEBUG_INTERRUPTS
1329 printk(KERN_DEBUG "cyy_interrupt: spurious interrupt %d\n",
1330 irq);
1331#endif
1332 return IRQ_NONE;
1333 }
1334
1335 card_base_addr = cinfo->base_addr;
1336 index = cinfo->bus_index;
1337
1338
1339 if (unlikely(card_base_addr == NULL))
1340 return IRQ_HANDLED;
1341
1342
1343
1344
1345
1346
1347 do {
1348 had_work = 0;
1349 for (chip = 0; chip < cinfo->num_chips; chip++) {
1350 base_addr = cinfo->base_addr +
1351 (cy_chip_offset[chip] << index);
1352 too_many = 0;
1353 while ((status = readb(base_addr +
1354 (CySVRR << index))) != 0x00) {
1355 had_work++;
1356
1357
1358
1359
1360
1361 if (1000 < too_many++)
1362 break;
1363 spin_lock(&cinfo->card_lock);
1364 if (status & CySRReceive)
1365 cyy_chip_rx(cinfo, chip, base_addr);
1366 if (status & CySRTransmit)
1367 cyy_chip_tx(cinfo, chip, base_addr);
1368 if (status & CySRModem)
1369 cyy_chip_modem(cinfo, chip, base_addr);
1370 spin_unlock(&cinfo->card_lock);
1371 }
1372 }
1373 } while (had_work);
1374
1375
1376 spin_lock(&cinfo->card_lock);
1377 cy_writeb(card_base_addr + (Cy_ClrIntr << index), 0);
1378
1379 spin_unlock(&cinfo->card_lock);
1380 return IRQ_HANDLED;
1381}
1382
1383
1384
1385
1386
1387
1388static int
1389cyz_fetch_msg(struct cyclades_card *cinfo,
1390 __u32 *channel, __u8 *cmd, __u32 *param)
1391{
1392 struct FIRM_ID __iomem *firm_id;
1393 struct ZFW_CTRL __iomem *zfw_ctrl;
1394 struct BOARD_CTRL __iomem *board_ctrl;
1395 unsigned long loc_doorbell;
1396
1397 firm_id = cinfo->base_addr + ID_ADDRESS;
1398 if (!ISZLOADED(*cinfo))
1399 return -1;
1400 zfw_ctrl = cinfo->base_addr + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
1401 board_ctrl = &zfw_ctrl->board_ctrl;
1402
1403 loc_doorbell = readl(&((struct RUNTIME_9060 __iomem *)
1404 (cinfo->ctl_addr))->loc_doorbell);
1405 if (loc_doorbell) {
1406 *cmd = (char)(0xff & loc_doorbell);
1407 *channel = readl(&board_ctrl->fwcmd_channel);
1408 *param = (__u32) readl(&board_ctrl->fwcmd_param);
1409 cy_writel(&((struct RUNTIME_9060 __iomem *)(cinfo->ctl_addr))->
1410 loc_doorbell, 0xffffffff);
1411 return 1;
1412 }
1413 return 0;
1414}
1415
1416static int
1417cyz_issue_cmd(struct cyclades_card *cinfo,
1418 __u32 channel, __u8 cmd, __u32 param)
1419{
1420 struct FIRM_ID __iomem *firm_id;
1421 struct ZFW_CTRL __iomem *zfw_ctrl;
1422 struct BOARD_CTRL __iomem *board_ctrl;
1423 __u32 __iomem *pci_doorbell;
1424 unsigned int index;
1425
1426 firm_id = cinfo->base_addr + ID_ADDRESS;
1427 if (!ISZLOADED(*cinfo))
1428 return -1;
1429
1430 zfw_ctrl = cinfo->base_addr + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
1431 board_ctrl = &zfw_ctrl->board_ctrl;
1432
1433 index = 0;
1434 pci_doorbell =
1435 &((struct RUNTIME_9060 __iomem *)(cinfo->ctl_addr))->pci_doorbell;
1436 while ((readl(pci_doorbell) & 0xff) != 0) {
1437 if (index++ == 1000)
1438 return (int)(readl(pci_doorbell) & 0xff);
1439 udelay(50L);
1440 }
1441 cy_writel(&board_ctrl->hcmd_channel, channel);
1442 cy_writel(&board_ctrl->hcmd_param, param);
1443 cy_writel(pci_doorbell, (long)cmd);
1444
1445 return 0;
1446}
1447
1448static void cyz_handle_rx(struct cyclades_port *info,
1449 struct BUF_CTRL __iomem *buf_ctrl)
1450{
1451 struct cyclades_card *cinfo = info->card;
1452 struct tty_struct *tty = info->port.tty;
1453 unsigned int char_count;
1454 int len;
1455#ifdef BLOCKMOVE
1456 unsigned char *buf;
1457#else
1458 char data;
1459#endif
1460 __u32 rx_put, rx_get, new_rx_get, rx_bufsize, rx_bufaddr;
1461
1462 rx_get = new_rx_get = readl(&buf_ctrl->rx_get);
1463 rx_put = readl(&buf_ctrl->rx_put);
1464 rx_bufsize = readl(&buf_ctrl->rx_bufsize);
1465 rx_bufaddr = readl(&buf_ctrl->rx_bufaddr);
1466 if (rx_put >= rx_get)
1467 char_count = rx_put - rx_get;
1468 else
1469 char_count = rx_put - rx_get + rx_bufsize;
1470
1471 if (char_count) {
1472#ifdef CY_ENABLE_MONITORING
1473 info->mon.int_count++;
1474 info->mon.char_count += char_count;
1475 if (char_count > info->mon.char_max)
1476 info->mon.char_max = char_count;
1477 info->mon.char_last = char_count;
1478#endif
1479 if (tty == NULL) {
1480
1481 new_rx_get = (new_rx_get + char_count) &
1482 (rx_bufsize - 1);
1483 info->rflush_count++;
1484 } else {
1485#ifdef BLOCKMOVE
1486
1487
1488
1489 while (1) {
1490 len = tty_prepare_flip_string(tty, &buf,
1491 char_count);
1492 if (!len)
1493 break;
1494
1495 len = min_t(unsigned int, min(len, char_count),
1496 rx_bufsize - new_rx_get);
1497
1498 memcpy_fromio(buf, cinfo->base_addr +
1499 rx_bufaddr + new_rx_get, len);
1500
1501 new_rx_get = (new_rx_get + len) &
1502 (rx_bufsize - 1);
1503 char_count -= len;
1504 info->icount.rx += len;
1505 info->idle_stats.recv_bytes += len;
1506 }
1507#else
1508 len = tty_buffer_request_room(tty, char_count);
1509 while (len--) {
1510 data = readb(cinfo->base_addr + rx_bufaddr +
1511 new_rx_get);
1512 new_rx_get = (new_rx_get + 1) &
1513 (rx_bufsize - 1);
1514 tty_insert_flip_char(tty, data, TTY_NORMAL);
1515 info->idle_stats.recv_bytes++;
1516 info->icount.rx++;
1517 }
1518#endif
1519#ifdef CONFIG_CYZ_INTR
1520
1521
1522 rx_put = readl(&buf_ctrl->rx_put);
1523 if (rx_put >= rx_get)
1524 char_count = rx_put - rx_get;
1525 else
1526 char_count = rx_put - rx_get + rx_bufsize;
1527 if (char_count >= readl(&buf_ctrl->rx_threshold) &&
1528 !timer_pending(&cyz_rx_full_timer[
1529 info->line]))
1530 mod_timer(&cyz_rx_full_timer[info->line],
1531 jiffies + 1);
1532#endif
1533 info->idle_stats.recv_idle = jiffies;
1534 tty_schedule_flip(tty);
1535 }
1536
1537 cy_writel(&buf_ctrl->rx_get, new_rx_get);
1538 }
1539}
1540
1541static void cyz_handle_tx(struct cyclades_port *info,
1542 struct BUF_CTRL __iomem *buf_ctrl)
1543{
1544 struct cyclades_card *cinfo = info->card;
1545 struct tty_struct *tty = info->port.tty;
1546 u8 data;
1547 unsigned int char_count;
1548#ifdef BLOCKMOVE
1549 int small_count;
1550#endif
1551 __u32 tx_put, tx_get, tx_bufsize, tx_bufaddr;
1552
1553 if (info->xmit_cnt <= 0)
1554 return;
1555
1556 tx_get = readl(&buf_ctrl->tx_get);
1557 tx_put = readl(&buf_ctrl->tx_put);
1558 tx_bufsize = readl(&buf_ctrl->tx_bufsize);
1559 tx_bufaddr = readl(&buf_ctrl->tx_bufaddr);
1560 if (tx_put >= tx_get)
1561 char_count = tx_get - tx_put - 1 + tx_bufsize;
1562 else
1563 char_count = tx_get - tx_put - 1;
1564
1565 if (char_count) {
1566
1567 if (tty == NULL)
1568 goto ztxdone;
1569
1570 if (info->x_char) {
1571 data = info->x_char;
1572
1573 cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data);
1574 tx_put = (tx_put + 1) & (tx_bufsize - 1);
1575 info->x_char = 0;
1576 char_count--;
1577 info->icount.tx++;
1578 }
1579#ifdef BLOCKMOVE
1580 while (0 < (small_count = min_t(unsigned int,
1581 tx_bufsize - tx_put, min_t(unsigned int,
1582 (SERIAL_XMIT_SIZE - info->xmit_tail),
1583 min_t(unsigned int, info->xmit_cnt,
1584 char_count))))) {
1585
1586 memcpy_toio((char *)(cinfo->base_addr + tx_bufaddr +
1587 tx_put),
1588 &info->port.xmit_buf[info->xmit_tail],
1589 small_count);
1590
1591 tx_put = (tx_put + small_count) & (tx_bufsize - 1);
1592 char_count -= small_count;
1593 info->icount.tx += small_count;
1594 info->xmit_cnt -= small_count;
1595 info->xmit_tail = (info->xmit_tail + small_count) &
1596 (SERIAL_XMIT_SIZE - 1);
1597 }
1598#else
1599 while (info->xmit_cnt && char_count) {
1600 data = info->port.xmit_buf[info->xmit_tail];
1601 info->xmit_cnt--;
1602 info->xmit_tail = (info->xmit_tail + 1) &
1603 (SERIAL_XMIT_SIZE - 1);
1604
1605 cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data);
1606 tx_put = (tx_put + 1) & (tx_bufsize - 1);
1607 char_count--;
1608 info->icount.tx++;
1609 }
1610#endif
1611 tty_wakeup(tty);
1612ztxdone:
1613
1614 cy_writel(&buf_ctrl->tx_put, tx_put);
1615 }
1616}
1617
1618static void cyz_handle_cmd(struct cyclades_card *cinfo)
1619{
1620 struct tty_struct *tty;
1621 struct cyclades_port *info;
1622 static struct FIRM_ID __iomem *firm_id;
1623 static struct ZFW_CTRL __iomem *zfw_ctrl;
1624 static struct BOARD_CTRL __iomem *board_ctrl;
1625 static struct CH_CTRL __iomem *ch_ctrl;
1626 static struct BUF_CTRL __iomem *buf_ctrl;
1627 __u32 channel;
1628 __u8 cmd;
1629 __u32 param;
1630 __u32 hw_ver, fw_ver;
1631 int special_count;
1632 int delta_count;
1633
1634 firm_id = cinfo->base_addr + ID_ADDRESS;
1635 zfw_ctrl = cinfo->base_addr + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
1636 board_ctrl = &zfw_ctrl->board_ctrl;
1637 fw_ver = readl(&board_ctrl->fw_version);
1638 hw_ver = readl(&((struct RUNTIME_9060 __iomem *)(cinfo->ctl_addr))->
1639 mail_box_0);
1640
1641 while (cyz_fetch_msg(cinfo, &channel, &cmd, ¶m) == 1) {
1642 special_count = 0;
1643 delta_count = 0;
1644 info = &cinfo->ports[channel];
1645 tty = info->port.tty;
1646 if (tty == NULL)
1647 continue;
1648
1649 ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]);
1650 buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]);
1651
1652 switch (cmd) {
1653 case C_CM_PR_ERROR:
1654 tty_insert_flip_char(tty, 0, TTY_PARITY);
1655 info->icount.rx++;
1656 special_count++;
1657 break;
1658 case C_CM_FR_ERROR:
1659 tty_insert_flip_char(tty, 0, TTY_FRAME);
1660 info->icount.rx++;
1661 special_count++;
1662 break;
1663 case C_CM_RXBRK:
1664 tty_insert_flip_char(tty, 0, TTY_BREAK);
1665 info->icount.rx++;
1666 special_count++;
1667 break;
1668 case C_CM_MDCD:
1669 info->icount.dcd++;
1670 delta_count++;
1671 if (info->port.flags & ASYNC_CHECK_CD) {
1672 if ((fw_ver > 241 ? ((u_long) param) :
1673 readl(&ch_ctrl->rs_status)) &
1674 C_RS_DCD) {
1675 wake_up_interruptible(&info->port.open_wait);
1676 } else {
1677 tty_hangup(info->port.tty);
1678 wake_up_interruptible(&info->port.open_wait);
1679 info->port.flags &= ~ASYNC_NORMAL_ACTIVE;
1680 }
1681 }
1682 break;
1683 case C_CM_MCTS:
1684 info->icount.cts++;
1685 delta_count++;
1686 break;
1687 case C_CM_MRI:
1688 info->icount.rng++;
1689 delta_count++;
1690 break;
1691 case C_CM_MDSR:
1692 info->icount.dsr++;
1693 delta_count++;
1694 break;
1695#ifdef Z_WAKE
1696 case C_CM_IOCTLW:
1697 complete(&info->shutdown_wait);
1698 break;
1699#endif
1700#ifdef CONFIG_CYZ_INTR
1701 case C_CM_RXHIWM:
1702 case C_CM_RXNNDT:
1703 case C_CM_INTBACK2:
1704
1705#ifdef CY_DEBUG_INTERRUPTS
1706 printk(KERN_DEBUG "cyz_interrupt: rcvd intr, card %d, "
1707 "port %ld\n", info->card, channel);
1708#endif
1709 cyz_handle_rx(info, buf_ctrl);
1710 break;
1711 case C_CM_TXBEMPTY:
1712 case C_CM_TXLOWWM:
1713 case C_CM_INTBACK:
1714
1715#ifdef CY_DEBUG_INTERRUPTS
1716 printk(KERN_DEBUG "cyz_interrupt: xmit intr, card %d, "
1717 "port %ld\n", info->card, channel);
1718#endif
1719 cyz_handle_tx(info, buf_ctrl);
1720 break;
1721#endif
1722 case C_CM_FATAL:
1723
1724 break;
1725 default:
1726 break;
1727 }
1728 if (delta_count)
1729 wake_up_interruptible(&info->delta_msr_wait);
1730 if (special_count)
1731 tty_schedule_flip(tty);
1732 }
1733}
1734
1735#ifdef CONFIG_CYZ_INTR
1736static irqreturn_t cyz_interrupt(int irq, void *dev_id)
1737{
1738 struct cyclades_card *cinfo = dev_id;
1739
1740 if (unlikely(cinfo == NULL)) {
1741#ifdef CY_DEBUG_INTERRUPTS
1742 printk(KERN_DEBUG "cyz_interrupt: spurious interrupt %d\n",
1743 irq);
1744#endif
1745 return IRQ_NONE;
1746 }
1747
1748 if (unlikely(!ISZLOADED(*cinfo))) {
1749#ifdef CY_DEBUG_INTERRUPTS
1750 printk(KERN_DEBUG "cyz_interrupt: board not yet loaded "
1751 "(IRQ%d).\n", irq);
1752#endif
1753 return IRQ_NONE;
1754 }
1755
1756
1757 cyz_handle_cmd(cinfo);
1758
1759 return IRQ_HANDLED;
1760}
1761
1762static void cyz_rx_restart(unsigned long arg)
1763{
1764 struct cyclades_port *info = (struct cyclades_port *)arg;
1765 struct cyclades_card *card = info->card;
1766 int retval;
1767 __u32 channel = info->line - card->first_line;
1768 unsigned long flags;
1769
1770 spin_lock_irqsave(&card->card_lock, flags);
1771 retval = cyz_issue_cmd(card, channel, C_CM_INTBACK2, 0L);
1772 if (retval != 0) {
1773 printk(KERN_ERR "cyc:cyz_rx_restart retval on ttyC%d was %x\n",
1774 info->line, retval);
1775 }
1776 spin_unlock_irqrestore(&card->card_lock, flags);
1777}
1778
1779#else
1780
1781static void cyz_poll(unsigned long arg)
1782{
1783 struct cyclades_card *cinfo;
1784 struct cyclades_port *info;
1785 struct tty_struct *tty;
1786 struct FIRM_ID __iomem *firm_id;
1787 struct ZFW_CTRL __iomem *zfw_ctrl;
1788 struct BOARD_CTRL __iomem *board_ctrl;
1789 struct BUF_CTRL __iomem *buf_ctrl;
1790 unsigned long expires = jiffies + HZ;
1791 unsigned int port, card;
1792
1793 for (card = 0; card < NR_CARDS; card++) {
1794 cinfo = &cy_card[card];
1795
1796 if (!IS_CYC_Z(*cinfo))
1797 continue;
1798 if (!ISZLOADED(*cinfo))
1799 continue;
1800
1801 firm_id = cinfo->base_addr + ID_ADDRESS;
1802 zfw_ctrl = cinfo->base_addr +
1803 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
1804 board_ctrl = &(zfw_ctrl->board_ctrl);
1805
1806
1807 if (!cinfo->intr_enabled) {
1808 cinfo->nports = (int)readl(&board_ctrl->n_channel);
1809 cinfo->intr_enabled = 1;
1810 continue;
1811 }
1812
1813 cyz_handle_cmd(cinfo);
1814
1815 for (port = 0; port < cinfo->nports; port++) {
1816 info = &cinfo->ports[port];
1817 tty = info->port.tty;
1818 buf_ctrl = &(zfw_ctrl->buf_ctrl[port]);
1819
1820 if (!info->throttle)
1821 cyz_handle_rx(info, buf_ctrl);
1822 cyz_handle_tx(info, buf_ctrl);
1823 }
1824
1825 expires = jiffies + cyz_polling_cycle;
1826 }
1827 mod_timer(&cyz_timerlist, expires);
1828}
1829
1830#endif
1831
1832
1833
1834
1835
1836
1837
1838static int startup(struct cyclades_port *info)
1839{
1840 struct cyclades_card *card;
1841 unsigned long flags;
1842 int retval = 0;
1843 void __iomem *base_addr;
1844 int chip, channel, index;
1845 unsigned long page;
1846
1847 card = info->card;
1848 channel = info->line - card->first_line;
1849
1850 page = get_zeroed_page(GFP_KERNEL);
1851 if (!page)
1852 return -ENOMEM;
1853
1854 spin_lock_irqsave(&card->card_lock, flags);
1855
1856 if (info->port.flags & ASYNC_INITIALIZED) {
1857 free_page(page);
1858 goto errout;
1859 }
1860
1861 if (!info->type) {
1862 if (info->port.tty)
1863 set_bit(TTY_IO_ERROR, &info->port.tty->flags);
1864 free_page(page);
1865 goto errout;
1866 }
1867
1868 if (info->port.xmit_buf)
1869 free_page(page);
1870 else
1871 info->port.xmit_buf = (unsigned char *)page;
1872
1873 spin_unlock_irqrestore(&card->card_lock, flags);
1874
1875 set_line_char(info);
1876
1877 if (!IS_CYC_Z(*card)) {
1878 chip = channel >> 2;
1879 channel &= 0x03;
1880 index = card->bus_index;
1881 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
1882
1883#ifdef CY_DEBUG_OPEN
1884 printk(KERN_DEBUG "cyc startup card %d, chip %d, channel %d, "
1885 "base_addr %p\n",
1886 card, chip, channel, base_addr);
1887#endif
1888 spin_lock_irqsave(&card->card_lock, flags);
1889
1890 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
1891
1892 cy_writeb(base_addr + (CyRTPR << index),
1893 (info->default_timeout ? info->default_timeout : 0x02));
1894
1895
1896 cyy_issue_cmd(base_addr, CyCHAN_CTL | CyENB_RCVR | CyENB_XMTR,
1897 index);
1898
1899 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
1900 cy_writeb(base_addr + (CyMSVR1 << index), CyRTS);
1901 cy_writeb(base_addr + (CyMSVR2 << index), CyDTR);
1902
1903#ifdef CY_DEBUG_DTR
1904 printk(KERN_DEBUG "cyc:startup raising DTR\n");
1905 printk(KERN_DEBUG " status: 0x%x, 0x%x\n",
1906 readb(base_addr + (CyMSVR1 << index)),
1907 readb(base_addr + (CyMSVR2 << index)));
1908#endif
1909
1910 cy_writeb(base_addr + (CySRER << index),
1911 readb(base_addr + (CySRER << index)) | CyRxData);
1912 info->port.flags |= ASYNC_INITIALIZED;
1913
1914 if (info->port.tty)
1915 clear_bit(TTY_IO_ERROR, &info->port.tty->flags);
1916 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
1917 info->breakon = info->breakoff = 0;
1918 memset((char *)&info->idle_stats, 0, sizeof(info->idle_stats));
1919 info->idle_stats.in_use =
1920 info->idle_stats.recv_idle =
1921 info->idle_stats.xmit_idle = jiffies;
1922
1923 spin_unlock_irqrestore(&card->card_lock, flags);
1924
1925 } else {
1926 struct FIRM_ID __iomem *firm_id;
1927 struct ZFW_CTRL __iomem *zfw_ctrl;
1928 struct BOARD_CTRL __iomem *board_ctrl;
1929 struct CH_CTRL __iomem *ch_ctrl;
1930
1931 base_addr = card->base_addr;
1932
1933 firm_id = base_addr + ID_ADDRESS;
1934 if (!ISZLOADED(*card))
1935 return -ENODEV;
1936
1937 zfw_ctrl = card->base_addr +
1938 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
1939 board_ctrl = &zfw_ctrl->board_ctrl;
1940 ch_ctrl = zfw_ctrl->ch_ctrl;
1941
1942#ifdef CY_DEBUG_OPEN
1943 printk(KERN_DEBUG "cyc startup Z card %d, channel %d, "
1944 "base_addr %p\n", card, channel, base_addr);
1945#endif
1946 spin_lock_irqsave(&card->card_lock, flags);
1947
1948 cy_writel(&ch_ctrl[channel].op_mode, C_CH_ENABLE);
1949#ifdef Z_WAKE
1950#ifdef CONFIG_CYZ_INTR
1951 cy_writel(&ch_ctrl[channel].intr_enable,
1952 C_IN_TXBEMPTY | C_IN_TXLOWWM | C_IN_RXHIWM |
1953 C_IN_RXNNDT | C_IN_IOCTLW | C_IN_MDCD);
1954#else
1955 cy_writel(&ch_ctrl[channel].intr_enable,
1956 C_IN_IOCTLW | C_IN_MDCD);
1957#endif
1958#else
1959#ifdef CONFIG_CYZ_INTR
1960 cy_writel(&ch_ctrl[channel].intr_enable,
1961 C_IN_TXBEMPTY | C_IN_TXLOWWM | C_IN_RXHIWM |
1962 C_IN_RXNNDT | C_IN_MDCD);
1963#else
1964 cy_writel(&ch_ctrl[channel].intr_enable, C_IN_MDCD);
1965#endif
1966#endif
1967
1968 retval = cyz_issue_cmd(card, channel, C_CM_IOCTL, 0L);
1969 if (retval != 0) {
1970 printk(KERN_ERR "cyc:startup(1) retval on ttyC%d was "
1971 "%x\n", info->line, retval);
1972 }
1973
1974
1975 retval = cyz_issue_cmd(card, channel, C_CM_FLUSH_RX, 0L);
1976 if (retval != 0) {
1977 printk(KERN_ERR "cyc:startup(2) retval on ttyC%d was "
1978 "%x\n", info->line, retval);
1979 }
1980
1981
1982
1983 cy_writel(&ch_ctrl[channel].rs_control,
1984 readl(&ch_ctrl[channel].rs_control) | C_RS_RTS |
1985 C_RS_DTR);
1986 retval = cyz_issue_cmd(card, channel, C_CM_IOCTLM, 0L);
1987 if (retval != 0) {
1988 printk(KERN_ERR "cyc:startup(3) retval on ttyC%d was "
1989 "%x\n", info->line, retval);
1990 }
1991#ifdef CY_DEBUG_DTR
1992 printk(KERN_DEBUG "cyc:startup raising Z DTR\n");
1993#endif
1994
1995
1996
1997 info->port.flags |= ASYNC_INITIALIZED;
1998 if (info->port.tty)
1999 clear_bit(TTY_IO_ERROR, &info->port.tty->flags);
2000 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
2001 info->breakon = info->breakoff = 0;
2002 memset((char *)&info->idle_stats, 0, sizeof(info->idle_stats));
2003 info->idle_stats.in_use =
2004 info->idle_stats.recv_idle =
2005 info->idle_stats.xmit_idle = jiffies;
2006
2007 spin_unlock_irqrestore(&card->card_lock, flags);
2008 }
2009
2010#ifdef CY_DEBUG_OPEN
2011 printk(KERN_DEBUG "cyc startup done\n");
2012#endif
2013 return 0;
2014
2015errout:
2016 spin_unlock_irqrestore(&card->card_lock, flags);
2017 return retval;
2018}
2019
2020static void start_xmit(struct cyclades_port *info)
2021{
2022 struct cyclades_card *card;
2023 unsigned long flags;
2024 void __iomem *base_addr;
2025 int chip, channel, index;
2026
2027 card = info->card;
2028 channel = info->line - card->first_line;
2029 if (!IS_CYC_Z(*card)) {
2030 chip = channel >> 2;
2031 channel &= 0x03;
2032 index = card->bus_index;
2033 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
2034
2035 spin_lock_irqsave(&card->card_lock, flags);
2036 cy_writeb(base_addr + (CyCAR << index), channel);
2037 cy_writeb(base_addr + (CySRER << index),
2038 readb(base_addr + (CySRER << index)) | CyTxRdy);
2039 spin_unlock_irqrestore(&card->card_lock, flags);
2040 } else {
2041#ifdef CONFIG_CYZ_INTR
2042 int retval;
2043
2044 spin_lock_irqsave(&card->card_lock, flags);
2045 retval = cyz_issue_cmd(card, channel, C_CM_INTBACK, 0L);
2046 if (retval != 0) {
2047 printk(KERN_ERR "cyc:start_xmit retval on ttyC%d was "
2048 "%x\n", info->line, retval);
2049 }
2050 spin_unlock_irqrestore(&card->card_lock, flags);
2051#else
2052
2053#endif
2054 }
2055}
2056
2057
2058
2059
2060
2061static void shutdown(struct cyclades_port *info)
2062{
2063 struct cyclades_card *card;
2064 unsigned long flags;
2065 void __iomem *base_addr;
2066 int chip, channel, index;
2067
2068 if (!(info->port.flags & ASYNC_INITIALIZED))
2069 return;
2070
2071 card = info->card;
2072 channel = info->line - card->first_line;
2073 if (!IS_CYC_Z(*card)) {
2074 chip = channel >> 2;
2075 channel &= 0x03;
2076 index = card->bus_index;
2077 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
2078
2079#ifdef CY_DEBUG_OPEN
2080 printk(KERN_DEBUG "cyc shutdown Y card %d, chip %d, "
2081 "channel %d, base_addr %p\n",
2082 card, chip, channel, base_addr);
2083#endif
2084
2085 spin_lock_irqsave(&card->card_lock, flags);
2086
2087
2088 wake_up_interruptible(&info->delta_msr_wait);
2089
2090 if (info->port.xmit_buf) {
2091 unsigned char *temp;
2092 temp = info->port.xmit_buf;
2093 info->port.xmit_buf = NULL;
2094 free_page((unsigned long)temp);
2095 }
2096 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
2097 if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) {
2098 cy_writeb(base_addr + (CyMSVR1 << index), ~CyRTS);
2099 cy_writeb(base_addr + (CyMSVR2 << index), ~CyDTR);
2100#ifdef CY_DEBUG_DTR
2101 printk(KERN_DEBUG "cyc shutdown dropping DTR\n");
2102 printk(KERN_DEBUG " status: 0x%x, 0x%x\n",
2103 readb(base_addr + (CyMSVR1 << index)),
2104 readb(base_addr + (CyMSVR2 << index)));
2105#endif
2106 }
2107 cyy_issue_cmd(base_addr, CyCHAN_CTL | CyDIS_RCVR, index);
2108
2109
2110
2111 if (info->port.tty)
2112 set_bit(TTY_IO_ERROR, &info->port.tty->flags);
2113 info->port.flags &= ~ASYNC_INITIALIZED;
2114 spin_unlock_irqrestore(&card->card_lock, flags);
2115 } else {
2116 struct FIRM_ID __iomem *firm_id;
2117 struct ZFW_CTRL __iomem *zfw_ctrl;
2118 struct BOARD_CTRL __iomem *board_ctrl;
2119 struct CH_CTRL __iomem *ch_ctrl;
2120 int retval;
2121
2122 base_addr = card->base_addr;
2123#ifdef CY_DEBUG_OPEN
2124 printk(KERN_DEBUG "cyc shutdown Z card %d, channel %d, "
2125 "base_addr %p\n", card, channel, base_addr);
2126#endif
2127
2128 firm_id = base_addr + ID_ADDRESS;
2129 if (!ISZLOADED(*card))
2130 return;
2131
2132 zfw_ctrl = card->base_addr +
2133 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
2134 board_ctrl = &zfw_ctrl->board_ctrl;
2135 ch_ctrl = zfw_ctrl->ch_ctrl;
2136
2137 spin_lock_irqsave(&card->card_lock, flags);
2138
2139 if (info->port.xmit_buf) {
2140 unsigned char *temp;
2141 temp = info->port.xmit_buf;
2142 info->port.xmit_buf = NULL;
2143 free_page((unsigned long)temp);
2144 }
2145
2146 if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) {
2147 cy_writel(&ch_ctrl[channel].rs_control,
2148 (__u32)(readl(&ch_ctrl[channel].rs_control) &
2149 ~(C_RS_RTS | C_RS_DTR)));
2150 retval = cyz_issue_cmd(info->card, channel,
2151 C_CM_IOCTLM, 0L);
2152 if (retval != 0) {
2153 printk(KERN_ERR"cyc:shutdown retval on ttyC%d "
2154 "was %x\n", info->line, retval);
2155 }
2156#ifdef CY_DEBUG_DTR
2157 printk(KERN_DEBUG "cyc:shutdown dropping Z DTR\n");
2158#endif
2159 }
2160
2161 if (info->port.tty)
2162 set_bit(TTY_IO_ERROR, &info->port.tty->flags);
2163 info->port.flags &= ~ASYNC_INITIALIZED;
2164
2165 spin_unlock_irqrestore(&card->card_lock, flags);
2166 }
2167
2168#ifdef CY_DEBUG_OPEN
2169 printk(KERN_DEBUG "cyc shutdown done\n");
2170#endif
2171}
2172
2173
2174
2175
2176
2177
2178
2179static int
2180block_til_ready(struct tty_struct *tty, struct file *filp,
2181 struct cyclades_port *info)
2182{
2183 DECLARE_WAITQUEUE(wait, current);
2184 struct cyclades_card *cinfo;
2185 unsigned long flags;
2186 int chip, channel, index;
2187 int retval;
2188 void __iomem *base_addr;
2189
2190 cinfo = info->card;
2191 channel = info->line - cinfo->first_line;
2192
2193
2194
2195
2196
2197 if (tty_hung_up_p(filp) || (info->port.flags & ASYNC_CLOSING)) {
2198 wait_event_interruptible(info->port.close_wait,
2199 !(info->port.flags & ASYNC_CLOSING));
2200 return (info->port.flags & ASYNC_HUP_NOTIFY) ? -EAGAIN: -ERESTARTSYS;
2201 }
2202
2203
2204
2205
2206
2207 if ((filp->f_flags & O_NONBLOCK) ||
2208 (tty->flags & (1 << TTY_IO_ERROR))) {
2209 info->port.flags |= ASYNC_NORMAL_ACTIVE;
2210 return 0;
2211 }
2212
2213
2214
2215
2216
2217
2218
2219
2220 retval = 0;
2221 add_wait_queue(&info->port.open_wait, &wait);
2222#ifdef CY_DEBUG_OPEN
2223 printk(KERN_DEBUG "cyc block_til_ready before block: ttyC%d, "
2224 "count = %d\n", info->line, info->port.count);
2225#endif
2226 spin_lock_irqsave(&cinfo->card_lock, flags);
2227 if (!tty_hung_up_p(filp))
2228 info->port.count--;
2229 spin_unlock_irqrestore(&cinfo->card_lock, flags);
2230#ifdef CY_DEBUG_COUNT
2231 printk(KERN_DEBUG "cyc block_til_ready: (%d): decrementing count to "
2232 "%d\n", current->pid, info->port.count);
2233#endif
2234 info->port.blocked_open++;
2235
2236 if (!IS_CYC_Z(*cinfo)) {
2237 chip = channel >> 2;
2238 channel &= 0x03;
2239 index = cinfo->bus_index;
2240 base_addr = cinfo->base_addr + (cy_chip_offset[chip] << index);
2241
2242 while (1) {
2243 spin_lock_irqsave(&cinfo->card_lock, flags);
2244 if ((tty->termios->c_cflag & CBAUD)) {
2245 cy_writeb(base_addr + (CyCAR << index),
2246 (u_char) channel);
2247 cy_writeb(base_addr + (CyMSVR1 << index),
2248 CyRTS);
2249 cy_writeb(base_addr + (CyMSVR2 << index),
2250 CyDTR);
2251#ifdef CY_DEBUG_DTR
2252 printk(KERN_DEBUG "cyc:block_til_ready raising "
2253 "DTR\n");
2254 printk(KERN_DEBUG " status: 0x%x, 0x%x\n",
2255 readb(base_addr + (CyMSVR1 << index)),
2256 readb(base_addr + (CyMSVR2 << index)));
2257#endif
2258 }
2259 spin_unlock_irqrestore(&cinfo->card_lock, flags);
2260
2261 set_current_state(TASK_INTERRUPTIBLE);
2262 if (tty_hung_up_p(filp) ||
2263 !(info->port.flags & ASYNC_INITIALIZED)) {
2264 retval = ((info->port.flags & ASYNC_HUP_NOTIFY) ?
2265 -EAGAIN : -ERESTARTSYS);
2266 break;
2267 }
2268
2269 spin_lock_irqsave(&cinfo->card_lock, flags);
2270 cy_writeb(base_addr + (CyCAR << index),
2271 (u_char) channel);
2272 if (!(info->port.flags & ASYNC_CLOSING) && (C_CLOCAL(tty) ||
2273 (readb(base_addr +
2274 (CyMSVR1 << index)) & CyDCD))) {
2275 spin_unlock_irqrestore(&cinfo->card_lock, flags);
2276 break;
2277 }
2278 spin_unlock_irqrestore(&cinfo->card_lock, flags);
2279
2280 if (signal_pending(current)) {
2281 retval = -ERESTARTSYS;
2282 break;
2283 }
2284#ifdef CY_DEBUG_OPEN
2285 printk(KERN_DEBUG "cyc block_til_ready blocking: "
2286 "ttyC%d, count = %d\n",
2287 info->line, info->port.count);
2288#endif
2289 schedule();
2290 }
2291 } else {
2292 struct FIRM_ID __iomem *firm_id;
2293 struct ZFW_CTRL __iomem *zfw_ctrl;
2294 struct BOARD_CTRL __iomem *board_ctrl;
2295 struct CH_CTRL __iomem *ch_ctrl;
2296
2297 base_addr = cinfo->base_addr;
2298 firm_id = base_addr + ID_ADDRESS;
2299 if (!ISZLOADED(*cinfo)) {
2300 __set_current_state(TASK_RUNNING);
2301 remove_wait_queue(&info->port.open_wait, &wait);
2302 return -EINVAL;
2303 }
2304
2305 zfw_ctrl = base_addr + (readl(&firm_id->zfwctrl_addr)
2306 & 0xfffff);
2307 board_ctrl = &zfw_ctrl->board_ctrl;
2308 ch_ctrl = zfw_ctrl->ch_ctrl;
2309
2310 while (1) {
2311 if ((tty->termios->c_cflag & CBAUD)) {
2312 cy_writel(&ch_ctrl[channel].rs_control,
2313 readl(&ch_ctrl[channel].rs_control) |
2314 C_RS_RTS | C_RS_DTR);
2315 retval = cyz_issue_cmd(cinfo,
2316 channel, C_CM_IOCTLM, 0L);
2317 if (retval != 0) {
2318 printk(KERN_ERR "cyc:block_til_ready "
2319 "retval on ttyC%d was %x\n",
2320 info->line, retval);
2321 }
2322#ifdef CY_DEBUG_DTR
2323 printk(KERN_DEBUG "cyc:block_til_ready raising "
2324 "Z DTR\n");
2325#endif
2326 }
2327
2328 set_current_state(TASK_INTERRUPTIBLE);
2329 if (tty_hung_up_p(filp) ||
2330 !(info->port.flags & ASYNC_INITIALIZED)) {
2331 retval = ((info->port.flags & ASYNC_HUP_NOTIFY) ?
2332 -EAGAIN : -ERESTARTSYS);
2333 break;
2334 }
2335 if (!(info->port.flags & ASYNC_CLOSING) && (C_CLOCAL(tty) ||
2336 (readl(&ch_ctrl[channel].rs_status) &
2337 C_RS_DCD))) {
2338 break;
2339 }
2340 if (signal_pending(current)) {
2341 retval = -ERESTARTSYS;
2342 break;
2343 }
2344#ifdef CY_DEBUG_OPEN
2345 printk(KERN_DEBUG "cyc block_til_ready blocking: "
2346 "ttyC%d, count = %d\n",
2347 info->line, info->port.count);
2348#endif
2349 schedule();
2350 }
2351 }
2352 __set_current_state(TASK_RUNNING);
2353 remove_wait_queue(&info->port.open_wait, &wait);
2354 if (!tty_hung_up_p(filp)) {
2355 info->port.count++;
2356#ifdef CY_DEBUG_COUNT
2357 printk(KERN_DEBUG "cyc:block_til_ready (%d): incrementing "
2358 "count to %d\n", current->pid, info->port.count);
2359#endif
2360 }
2361 info->port.blocked_open--;
2362#ifdef CY_DEBUG_OPEN
2363 printk(KERN_DEBUG "cyc:block_til_ready after blocking: ttyC%d, "
2364 "count = %d\n", info->line, info->port.count);
2365#endif
2366 if (retval)
2367 return retval;
2368 info->port.flags |= ASYNC_NORMAL_ACTIVE;
2369 return 0;
2370}
2371
2372
2373
2374
2375
2376static int cy_open(struct tty_struct *tty, struct file *filp)
2377{
2378 struct cyclades_port *info;
2379 unsigned int i, line;
2380 int retval;
2381
2382 line = tty->index;
2383 if (tty->index < 0 || NR_PORTS <= line)
2384 return -ENODEV;
2385
2386 for (i = 0; i < NR_CARDS; i++)
2387 if (line < cy_card[i].first_line + cy_card[i].nports &&
2388 line >= cy_card[i].first_line)
2389 break;
2390 if (i >= NR_CARDS)
2391 return -ENODEV;
2392 info = &cy_card[i].ports[line - cy_card[i].first_line];
2393 if (info->line < 0)
2394 return -ENODEV;
2395
2396
2397
2398
2399
2400 if (IS_CYC_Z(*info->card)) {
2401 struct cyclades_card *cinfo = info->card;
2402 struct FIRM_ID __iomem *firm_id = cinfo->base_addr + ID_ADDRESS;
2403
2404 if (!ISZLOADED(*cinfo)) {
2405 if (((ZE_V1 == readl(&((struct RUNTIME_9060 __iomem *)
2406 (cinfo->ctl_addr))->mail_box_0)) &&
2407 Z_FPGA_CHECK(*cinfo)) &&
2408 (ZFIRM_HLT == readl(
2409 &firm_id->signature))) {
2410 printk(KERN_ERR "cyc:Cyclades-Z Error: you "
2411 "need an external power supply for "
2412 "this number of ports.\nFirmware "
2413 "halted.\n");
2414 } else {
2415 printk(KERN_ERR "cyc:Cyclades-Z firmware not "
2416 "yet loaded\n");
2417 }
2418 return -ENODEV;
2419 }
2420#ifdef CONFIG_CYZ_INTR
2421 else {
2422
2423
2424
2425 if (!cinfo->intr_enabled) {
2426 struct ZFW_CTRL __iomem *zfw_ctrl;
2427 struct BOARD_CTRL __iomem *board_ctrl;
2428
2429 zfw_ctrl = cinfo->base_addr +
2430 (readl(&firm_id->zfwctrl_addr) &
2431 0xfffff);
2432
2433 board_ctrl = &zfw_ctrl->board_ctrl;
2434
2435
2436 cy_writew(cinfo->ctl_addr + 0x68,
2437 readw(cinfo->ctl_addr + 0x68) | 0x0900);
2438
2439 retval = cyz_issue_cmd(cinfo, 0,
2440 C_CM_IRQ_ENBL, 0L);
2441 if (retval != 0) {
2442 printk(KERN_ERR "cyc:IRQ enable retval "
2443 "was %x\n", retval);
2444 }
2445 cinfo->nports =
2446 (int)readl(&board_ctrl->n_channel);
2447 cinfo->intr_enabled = 1;
2448 }
2449 }
2450#endif
2451
2452 if (info->line > (cinfo->first_line + cinfo->nports - 1))
2453 return -ENODEV;
2454 }
2455#ifdef CY_DEBUG_OTHER
2456 printk(KERN_DEBUG "cyc:cy_open ttyC%d\n", info->line);
2457#endif
2458 tty->driver_data = info;
2459 info->port.tty = tty;
2460 if (serial_paranoia_check(info, tty->name, "cy_open"))
2461 return -ENODEV;
2462
2463#ifdef CY_DEBUG_OPEN
2464 printk(KERN_DEBUG "cyc:cy_open ttyC%d, count = %d\n", info->line,
2465 info->port.count);
2466#endif
2467 info->port.count++;
2468#ifdef CY_DEBUG_COUNT
2469 printk(KERN_DEBUG "cyc:cy_open (%d): incrementing count to %d\n",
2470 current->pid, info->port.count);
2471#endif
2472
2473
2474
2475
2476 if (tty_hung_up_p(filp) || (info->port.flags & ASYNC_CLOSING)) {
2477 wait_event_interruptible(info->port.close_wait,
2478 !(info->port.flags & ASYNC_CLOSING));
2479 return (info->port.flags & ASYNC_HUP_NOTIFY) ? -EAGAIN: -ERESTARTSYS;
2480 }
2481
2482
2483
2484
2485 retval = startup(info);
2486 if (retval)
2487 return retval;
2488
2489 retval = block_til_ready(tty, filp, info);
2490 if (retval) {
2491#ifdef CY_DEBUG_OPEN
2492 printk(KERN_DEBUG "cyc:cy_open returning after block_til_ready "
2493 "with %d\n", retval);
2494#endif
2495 return retval;
2496 }
2497
2498 info->throttle = 0;
2499
2500#ifdef CY_DEBUG_OPEN
2501 printk(KERN_DEBUG "cyc:cy_open done\n");
2502#endif
2503 return 0;
2504}
2505
2506
2507
2508
2509static void cy_wait_until_sent(struct tty_struct *tty, int timeout)
2510{
2511 struct cyclades_card *card;
2512 struct cyclades_port *info = tty->driver_data;
2513 void __iomem *base_addr;
2514 int chip, channel, index;
2515 unsigned long orig_jiffies;
2516 int char_time;
2517
2518 if (serial_paranoia_check(info, tty->name, "cy_wait_until_sent"))
2519 return;
2520
2521 if (info->xmit_fifo_size == 0)
2522 return;
2523
2524 orig_jiffies = jiffies;
2525 lock_kernel();
2526
2527
2528
2529
2530
2531
2532
2533
2534 char_time = (info->timeout - HZ / 50) / info->xmit_fifo_size;
2535 char_time = char_time / 5;
2536 if (char_time <= 0)
2537 char_time = 1;
2538 if (timeout < 0)
2539 timeout = 0;
2540 if (timeout)
2541 char_time = min(char_time, timeout);
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551 if (!timeout || timeout > 2 * info->timeout)
2552 timeout = 2 * info->timeout;
2553#ifdef CY_DEBUG_WAIT_UNTIL_SENT
2554 printk(KERN_DEBUG "In cy_wait_until_sent(%d) check=%d, jiff=%lu...",
2555 timeout, char_time, jiffies);
2556#endif
2557 card = info->card;
2558 channel = (info->line) - (card->first_line);
2559 if (!IS_CYC_Z(*card)) {
2560 chip = channel >> 2;
2561 channel &= 0x03;
2562 index = card->bus_index;
2563 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
2564 while (readb(base_addr + (CySRER << index)) & CyTxRdy) {
2565#ifdef CY_DEBUG_WAIT_UNTIL_SENT
2566 printk(KERN_DEBUG "Not clean (jiff=%lu)...", jiffies);
2567#endif
2568 if (msleep_interruptible(jiffies_to_msecs(char_time)))
2569 break;
2570 if (timeout && time_after(jiffies, orig_jiffies +
2571 timeout))
2572 break;
2573 }
2574 }
2575
2576 msleep_interruptible(jiffies_to_msecs(char_time * 5));
2577 unlock_kernel();
2578#ifdef CY_DEBUG_WAIT_UNTIL_SENT
2579 printk(KERN_DEBUG "Clean (jiff=%lu)...done\n", jiffies);
2580#endif
2581}
2582
2583static void cy_flush_buffer(struct tty_struct *tty)
2584{
2585 struct cyclades_port *info = tty->driver_data;
2586 struct cyclades_card *card;
2587 int channel, retval;
2588 unsigned long flags;
2589
2590#ifdef CY_DEBUG_IO
2591 printk(KERN_DEBUG "cyc:cy_flush_buffer ttyC%d\n", info->line);
2592#endif
2593
2594 if (serial_paranoia_check(info, tty->name, "cy_flush_buffer"))
2595 return;
2596
2597 card = info->card;
2598 channel = info->line - card->first_line;
2599
2600 spin_lock_irqsave(&card->card_lock, flags);
2601 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
2602 spin_unlock_irqrestore(&card->card_lock, flags);
2603
2604 if (IS_CYC_Z(*card)) {
2605
2606 spin_lock_irqsave(&card->card_lock, flags);
2607 retval = cyz_issue_cmd(card, channel, C_CM_FLUSH_TX, 0L);
2608 if (retval != 0) {
2609 printk(KERN_ERR "cyc: flush_buffer retval on ttyC%d "
2610 "was %x\n", info->line, retval);
2611 }
2612 spin_unlock_irqrestore(&card->card_lock, flags);
2613 }
2614 tty_wakeup(tty);
2615}
2616
2617
2618
2619
2620
2621static void cy_close(struct tty_struct *tty, struct file *filp)
2622{
2623 struct cyclades_port *info = tty->driver_data;
2624 struct cyclades_card *card;
2625 unsigned long flags;
2626
2627#ifdef CY_DEBUG_OTHER
2628 printk(KERN_DEBUG "cyc:cy_close ttyC%d\n", info->line);
2629#endif
2630
2631 if (!info || serial_paranoia_check(info, tty->name, "cy_close"))
2632 return;
2633
2634 card = info->card;
2635
2636 spin_lock_irqsave(&card->card_lock, flags);
2637
2638 if (tty_hung_up_p(filp)) {
2639 spin_unlock_irqrestore(&card->card_lock, flags);
2640 return;
2641 }
2642#ifdef CY_DEBUG_OPEN
2643 printk(KERN_DEBUG "cyc:cy_close ttyC%d, count = %d\n", info->line,
2644 info->port.count);
2645#endif
2646 if ((tty->count == 1) && (info->port.count != 1)) {
2647
2648
2649
2650
2651
2652
2653
2654 printk(KERN_ERR "cyc:cy_close: bad serial port count; "
2655 "tty->count is 1, info->port.count is %d\n", info->port.count);
2656 info->port.count = 1;
2657 }
2658#ifdef CY_DEBUG_COUNT
2659 printk(KERN_DEBUG "cyc:cy_close at (%d): decrementing count to %d\n",
2660 current->pid, info->port.count - 1);
2661#endif
2662 if (--info->port.count < 0) {
2663#ifdef CY_DEBUG_COUNT
2664 printk(KERN_DEBUG "cyc:cyc_close setting count to 0\n");
2665#endif
2666 info->port.count = 0;
2667 }
2668 if (info->port.count) {
2669 spin_unlock_irqrestore(&card->card_lock, flags);
2670 return;
2671 }
2672 info->port.flags |= ASYNC_CLOSING;
2673
2674
2675
2676
2677
2678 tty->closing = 1;
2679 spin_unlock_irqrestore(&card->card_lock, flags);
2680 if (info->port.closing_wait != CY_CLOSING_WAIT_NONE)
2681 tty_wait_until_sent(tty, info->port.closing_wait);
2682
2683 spin_lock_irqsave(&card->card_lock, flags);
2684
2685 if (!IS_CYC_Z(*card)) {
2686 int channel = info->line - card->first_line;
2687 int index = card->bus_index;
2688 void __iomem *base_addr = card->base_addr +
2689 (cy_chip_offset[channel >> 2] << index);
2690
2691 channel &= 0x03;
2692 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
2693 cy_writeb(base_addr + (CySRER << index),
2694 readb(base_addr + (CySRER << index)) & ~CyRxData);
2695 if (info->port.flags & ASYNC_INITIALIZED) {
2696
2697
2698 spin_unlock_irqrestore(&card->card_lock, flags);
2699 cy_wait_until_sent(tty, info->timeout);
2700 spin_lock_irqsave(&card->card_lock, flags);
2701 }
2702 } else {
2703#ifdef Z_WAKE
2704
2705
2706 void __iomem *base_addr = card->base_addr;
2707 struct FIRM_ID __iomem *firm_id = base_addr + ID_ADDRESS;
2708 struct ZFW_CTRL __iomem *zfw_ctrl =
2709 base_addr + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
2710 struct CH_CTRL __iomem *ch_ctrl = zfw_ctrl->ch_ctrl;
2711 int channel = info->line - card->first_line;
2712 int retval;
2713
2714 if (readl(&ch_ctrl[channel].flow_status) != C_FS_TXIDLE) {
2715 retval = cyz_issue_cmd(card, channel, C_CM_IOCTLW, 0L);
2716 if (retval != 0) {
2717 printk(KERN_DEBUG "cyc:cy_close retval on "
2718 "ttyC%d was %x\n", info->line, retval);
2719 }
2720 spin_unlock_irqrestore(&card->card_lock, flags);
2721 wait_for_completion_interruptible(&info->shutdown_wait);
2722 spin_lock_irqsave(&card->card_lock, flags);
2723 }
2724#endif
2725 }
2726
2727 spin_unlock_irqrestore(&card->card_lock, flags);
2728 shutdown(info);
2729 cy_flush_buffer(tty);
2730 tty_ldisc_flush(tty);
2731 spin_lock_irqsave(&card->card_lock, flags);
2732
2733 tty->closing = 0;
2734 info->port.tty = NULL;
2735 if (info->port.blocked_open) {
2736 spin_unlock_irqrestore(&card->card_lock, flags);
2737 if (info->port.close_delay) {
2738 msleep_interruptible(jiffies_to_msecs
2739 (info->port.close_delay));
2740 }
2741 wake_up_interruptible(&info->port.open_wait);
2742 spin_lock_irqsave(&card->card_lock, flags);
2743 }
2744 info->port.flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
2745 wake_up_interruptible(&info->port.close_wait);
2746
2747#ifdef CY_DEBUG_OTHER
2748 printk(KERN_DEBUG "cyc:cy_close done\n");
2749#endif
2750
2751 spin_unlock_irqrestore(&card->card_lock, flags);
2752}
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767static int cy_write(struct tty_struct *tty, const unsigned char *buf, int count)
2768{
2769 struct cyclades_port *info = tty->driver_data;
2770 unsigned long flags;
2771 int c, ret = 0;
2772
2773#ifdef CY_DEBUG_IO
2774 printk(KERN_DEBUG "cyc:cy_write ttyC%d\n", info->line);
2775#endif
2776
2777 if (serial_paranoia_check(info, tty->name, "cy_write"))
2778 return 0;
2779
2780 if (!info->port.xmit_buf)
2781 return 0;
2782
2783 spin_lock_irqsave(&info->card->card_lock, flags);
2784 while (1) {
2785 c = min(count, (int)(SERIAL_XMIT_SIZE - info->xmit_cnt - 1));
2786 c = min(c, (int)(SERIAL_XMIT_SIZE - info->xmit_head));
2787
2788 if (c <= 0)
2789 break;
2790
2791 memcpy(info->port.xmit_buf + info->xmit_head, buf, c);
2792 info->xmit_head = (info->xmit_head + c) &
2793 (SERIAL_XMIT_SIZE - 1);
2794 info->xmit_cnt += c;
2795 buf += c;
2796 count -= c;
2797 ret += c;
2798 }
2799 spin_unlock_irqrestore(&info->card->card_lock, flags);
2800
2801 info->idle_stats.xmit_bytes += ret;
2802 info->idle_stats.xmit_idle = jiffies;
2803
2804 if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped)
2805 start_xmit(info);
2806
2807 return ret;
2808}
2809
2810
2811
2812
2813
2814
2815
2816
2817static int cy_put_char(struct tty_struct *tty, unsigned char ch)
2818{
2819 struct cyclades_port *info = tty->driver_data;
2820 unsigned long flags;
2821
2822#ifdef CY_DEBUG_IO
2823 printk(KERN_DEBUG "cyc:cy_put_char ttyC%d\n", info->line);
2824#endif
2825
2826 if (serial_paranoia_check(info, tty->name, "cy_put_char"))
2827 return 0;
2828
2829 if (!info->port.xmit_buf)
2830 return 0;
2831
2832 spin_lock_irqsave(&info->card->card_lock, flags);
2833 if (info->xmit_cnt >= (int)(SERIAL_XMIT_SIZE - 1)) {
2834 spin_unlock_irqrestore(&info->card->card_lock, flags);
2835 return 0;
2836 }
2837
2838 info->port.xmit_buf[info->xmit_head++] = ch;
2839 info->xmit_head &= SERIAL_XMIT_SIZE - 1;
2840 info->xmit_cnt++;
2841 info->idle_stats.xmit_bytes++;
2842 info->idle_stats.xmit_idle = jiffies;
2843 spin_unlock_irqrestore(&info->card->card_lock, flags);
2844 return 1;
2845}
2846
2847
2848
2849
2850
2851static void cy_flush_chars(struct tty_struct *tty)
2852{
2853 struct cyclades_port *info = tty->driver_data;
2854
2855#ifdef CY_DEBUG_IO
2856 printk(KERN_DEBUG "cyc:cy_flush_chars ttyC%d\n", info->line);
2857#endif
2858
2859 if (serial_paranoia_check(info, tty->name, "cy_flush_chars"))
2860 return;
2861
2862 if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
2863 !info->port.xmit_buf)
2864 return;
2865
2866 start_xmit(info);
2867}
2868
2869
2870
2871
2872
2873
2874
2875static int cy_write_room(struct tty_struct *tty)
2876{
2877 struct cyclades_port *info = tty->driver_data;
2878 int ret;
2879
2880#ifdef CY_DEBUG_IO
2881 printk(KERN_DEBUG "cyc:cy_write_room ttyC%d\n", info->line);
2882#endif
2883
2884 if (serial_paranoia_check(info, tty->name, "cy_write_room"))
2885 return 0;
2886 ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
2887 if (ret < 0)
2888 ret = 0;
2889 return ret;
2890}
2891
2892static int cy_chars_in_buffer(struct tty_struct *tty)
2893{
2894 struct cyclades_card *card;
2895 struct cyclades_port *info = tty->driver_data;
2896 int channel;
2897
2898 if (serial_paranoia_check(info, tty->name, "cy_chars_in_buffer"))
2899 return 0;
2900
2901 card = info->card;
2902 channel = (info->line) - (card->first_line);
2903
2904#ifdef Z_EXT_CHARS_IN_BUFFER
2905 if (!IS_CYC_Z(cy_card[card])) {
2906#endif
2907#ifdef CY_DEBUG_IO
2908 printk(KERN_DEBUG "cyc:cy_chars_in_buffer ttyC%d %d\n",
2909 info->line, info->xmit_cnt);
2910#endif
2911 return info->xmit_cnt;
2912#ifdef Z_EXT_CHARS_IN_BUFFER
2913 } else {
2914 static struct FIRM_ID *firm_id;
2915 static struct ZFW_CTRL *zfw_ctrl;
2916 static struct CH_CTRL *ch_ctrl;
2917 static struct BUF_CTRL *buf_ctrl;
2918 int char_count;
2919 __u32 tx_put, tx_get, tx_bufsize;
2920
2921 lock_kernel();
2922 firm_id = card->base_addr + ID_ADDRESS;
2923 zfw_ctrl = card->base_addr +
2924 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
2925 ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]);
2926 buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]);
2927
2928 tx_get = readl(&buf_ctrl->tx_get);
2929 tx_put = readl(&buf_ctrl->tx_put);
2930 tx_bufsize = readl(&buf_ctrl->tx_bufsize);
2931 if (tx_put >= tx_get)
2932 char_count = tx_put - tx_get;
2933 else
2934 char_count = tx_put - tx_get + tx_bufsize;
2935#ifdef CY_DEBUG_IO
2936 printk(KERN_DEBUG "cyc:cy_chars_in_buffer ttyC%d %d\n",
2937 info->line, info->xmit_cnt + char_count);
2938#endif
2939 unlock_kernel();
2940 return info->xmit_cnt + char_count;
2941 }
2942#endif
2943}
2944
2945
2946
2947
2948
2949
2950
2951static void cyy_baud_calc(struct cyclades_port *info, __u32 baud)
2952{
2953 int co, co_val, bpr;
2954 __u32 cy_clock = ((info->chip_rev >= CD1400_REV_J) ? 60000000 :
2955 25000000);
2956
2957 if (baud == 0) {
2958 info->tbpr = info->tco = info->rbpr = info->rco = 0;
2959 return;
2960 }
2961
2962
2963 for (co = 4, co_val = 2048; co; co--, co_val >>= 2) {
2964 if (cy_clock / co_val / baud > 63)
2965 break;
2966 }
2967
2968 bpr = (cy_clock / co_val * 2 / baud + 1) / 2;
2969 if (bpr > 255)
2970 bpr = 255;
2971
2972 info->tbpr = info->rbpr = bpr;
2973 info->tco = info->rco = co;
2974}
2975
2976
2977
2978
2979
2980static void set_line_char(struct cyclades_port *info)
2981{
2982 struct cyclades_card *card;
2983 unsigned long flags;
2984 void __iomem *base_addr;
2985 int chip, channel, index;
2986 unsigned cflag, iflag;
2987 unsigned short chip_number;
2988 int baud, baud_rate = 0;
2989 int i;
2990
2991 if (!info->port.tty || !info->port.tty->termios)
2992 return;
2993
2994 if (info->line == -1)
2995 return;
2996
2997 cflag = info->port.tty->termios->c_cflag;
2998 iflag = info->port.tty->termios->c_iflag;
2999
3000
3001
3002
3003 if (info->port.tty) {
3004 if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
3005 info->port.tty->alt_speed = 57600;
3006 if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
3007 info->port.tty->alt_speed = 115200;
3008 if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
3009 info->port.tty->alt_speed = 230400;
3010 if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
3011 info->port.tty->alt_speed = 460800;
3012 }
3013
3014 card = info->card;
3015 channel = info->line - card->first_line;
3016 chip_number = channel / 4;
3017
3018 if (!IS_CYC_Z(*card)) {
3019
3020 index = card->bus_index;
3021
3022
3023 baud = tty_get_baud_rate(info->port.tty);
3024 if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
3025 ASYNC_SPD_CUST) {
3026 if (info->custom_divisor)
3027 baud_rate = info->baud / info->custom_divisor;
3028 else
3029 baud_rate = info->baud;
3030 } else if (baud > CD1400_MAX_SPEED) {
3031 baud = CD1400_MAX_SPEED;
3032 }
3033
3034 for (i = 0; i < 20; i++) {
3035 if (baud == baud_table[i])
3036 break;
3037 }
3038 if (i == 20)
3039 i = 19;
3040
3041 if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
3042 ASYNC_SPD_CUST) {
3043 cyy_baud_calc(info, baud_rate);
3044 } else {
3045 if (info->chip_rev >= CD1400_REV_J) {
3046
3047 info->tbpr = baud_bpr_60[i];
3048 info->tco = baud_co_60[i];
3049 info->rbpr = baud_bpr_60[i];
3050 info->rco = baud_co_60[i];
3051 } else {
3052 info->tbpr = baud_bpr_25[i];
3053 info->tco = baud_co_25[i];
3054 info->rbpr = baud_bpr_25[i];
3055 info->rco = baud_co_25[i];
3056 }
3057 }
3058 if (baud_table[i] == 134) {
3059
3060 info->timeout = (info->xmit_fifo_size * HZ * 30 / 269) +
3061 2;
3062 } else if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
3063 ASYNC_SPD_CUST) {
3064 info->timeout = (info->xmit_fifo_size * HZ * 15 /
3065 baud_rate) + 2;
3066 } else if (baud_table[i]) {
3067 info->timeout = (info->xmit_fifo_size * HZ * 15 /
3068 baud_table[i]) + 2;
3069
3070 } else {
3071 info->timeout = 0;
3072 }
3073
3074
3075
3076
3077
3078 info->cor5 = 0;
3079 info->cor4 = 0;
3080
3081 info->cor3 = (info->default_threshold ?
3082 info->default_threshold : baud_cor3[i]);
3083 info->cor2 = CyETC;
3084 switch (cflag & CSIZE) {
3085 case CS5:
3086 info->cor1 = Cy_5_BITS;
3087 break;
3088 case CS6:
3089 info->cor1 = Cy_6_BITS;
3090 break;
3091 case CS7:
3092 info->cor1 = Cy_7_BITS;
3093 break;
3094 case CS8:
3095 info->cor1 = Cy_8_BITS;
3096 break;
3097 }
3098 if (cflag & CSTOPB)
3099 info->cor1 |= Cy_2_STOP;
3100
3101 if (cflag & PARENB) {
3102 if (cflag & PARODD)
3103 info->cor1 |= CyPARITY_O;
3104 else
3105 info->cor1 |= CyPARITY_E;
3106 } else
3107 info->cor1 |= CyPARITY_NONE;
3108
3109
3110 if (cflag & CRTSCTS) {
3111 info->port.flags |= ASYNC_CTS_FLOW;
3112 info->cor2 |= CyCtsAE;
3113 } else {
3114 info->port.flags &= ~ASYNC_CTS_FLOW;
3115 info->cor2 &= ~CyCtsAE;
3116 }
3117 if (cflag & CLOCAL)
3118 info->port.flags &= ~ASYNC_CHECK_CD;
3119 else
3120 info->port.flags |= ASYNC_CHECK_CD;
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132 chip = channel >> 2;
3133 channel &= 0x03;
3134 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3135
3136 spin_lock_irqsave(&card->card_lock, flags);
3137 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
3138
3139
3140
3141 cy_writeb(base_addr + (CyTCOR << index), info->tco);
3142 cy_writeb(base_addr + (CyTBPR << index), info->tbpr);
3143 cy_writeb(base_addr + (CyRCOR << index), info->rco);
3144 cy_writeb(base_addr + (CyRBPR << index), info->rbpr);
3145
3146
3147
3148 cy_writeb(base_addr + (CySCHR1 << index),
3149 START_CHAR(info->port.tty));
3150 cy_writeb(base_addr + (CySCHR2 << index), STOP_CHAR(info->port.tty));
3151 cy_writeb(base_addr + (CyCOR1 << index), info->cor1);
3152 cy_writeb(base_addr + (CyCOR2 << index), info->cor2);
3153 cy_writeb(base_addr + (CyCOR3 << index), info->cor3);
3154 cy_writeb(base_addr + (CyCOR4 << index), info->cor4);
3155 cy_writeb(base_addr + (CyCOR5 << index), info->cor5);
3156
3157 cyy_issue_cmd(base_addr, CyCOR_CHANGE | CyCOR1ch | CyCOR2ch |
3158 CyCOR3ch, index);
3159
3160
3161 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
3162 cy_writeb(base_addr + (CyRTPR << index),
3163 (info->default_timeout ? info->default_timeout : 0x02));
3164
3165
3166 if (C_CLOCAL(info->port.tty)) {
3167
3168 cy_writeb(base_addr + (CySRER << index),
3169 readb(base_addr + (CySRER << index)) | CyMdmCh);
3170
3171 if ((cflag & CRTSCTS) && info->rflow) {
3172 cy_writeb(base_addr + (CyMCOR1 << index),
3173 (CyCTS | rflow_thr[i]));
3174 } else {
3175 cy_writeb(base_addr + (CyMCOR1 << index),
3176 CyCTS);
3177 }
3178
3179 cy_writeb(base_addr + (CyMCOR2 << index), CyCTS);
3180 } else {
3181
3182 cy_writeb(base_addr + (CySRER << index),
3183 readb(base_addr +
3184 (CySRER << index)) | CyMdmCh);
3185
3186 if ((cflag & CRTSCTS) && info->rflow) {
3187 cy_writeb(base_addr + (CyMCOR1 << index),
3188 (CyDSR | CyCTS | CyRI | CyDCD |
3189 rflow_thr[i]));
3190 } else {
3191 cy_writeb(base_addr + (CyMCOR1 << index),
3192 CyDSR | CyCTS | CyRI | CyDCD);
3193 }
3194
3195 cy_writeb(base_addr + (CyMCOR2 << index),
3196 CyDSR | CyCTS | CyRI | CyDCD);
3197 }
3198
3199 if (i == 0) {
3200 if (info->rtsdtr_inv) {
3201 cy_writeb(base_addr + (CyMSVR1 << index),
3202 ~CyRTS);
3203 } else {
3204 cy_writeb(base_addr + (CyMSVR2 << index),
3205 ~CyDTR);
3206 }
3207#ifdef CY_DEBUG_DTR
3208 printk(KERN_DEBUG "cyc:set_line_char dropping DTR\n");
3209 printk(KERN_DEBUG " status: 0x%x, 0x%x\n",
3210 readb(base_addr + (CyMSVR1 << index)),
3211 readb(base_addr + (CyMSVR2 << index)));
3212#endif
3213 } else {
3214 if (info->rtsdtr_inv) {
3215 cy_writeb(base_addr + (CyMSVR1 << index),
3216 CyRTS);
3217 } else {
3218 cy_writeb(base_addr + (CyMSVR2 << index),
3219 CyDTR);
3220 }
3221#ifdef CY_DEBUG_DTR
3222 printk(KERN_DEBUG "cyc:set_line_char raising DTR\n");
3223 printk(KERN_DEBUG " status: 0x%x, 0x%x\n",
3224 readb(base_addr + (CyMSVR1 << index)),
3225 readb(base_addr + (CyMSVR2 << index)));
3226#endif
3227 }
3228
3229 if (info->port.tty)
3230 clear_bit(TTY_IO_ERROR, &info->port.tty->flags);
3231 spin_unlock_irqrestore(&card->card_lock, flags);
3232
3233 } else {
3234 struct FIRM_ID __iomem *firm_id;
3235 struct ZFW_CTRL __iomem *zfw_ctrl;
3236 struct BOARD_CTRL __iomem *board_ctrl;
3237 struct CH_CTRL __iomem *ch_ctrl;
3238 struct BUF_CTRL __iomem *buf_ctrl;
3239 __u32 sw_flow;
3240 int retval;
3241
3242 firm_id = card->base_addr + ID_ADDRESS;
3243 if (!ISZLOADED(*card))
3244 return;
3245
3246 zfw_ctrl = card->base_addr +
3247 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
3248 board_ctrl = &zfw_ctrl->board_ctrl;
3249 ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]);
3250 buf_ctrl = &zfw_ctrl->buf_ctrl[channel];
3251
3252
3253 baud = tty_get_baud_rate(info->port.tty);
3254 if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
3255 ASYNC_SPD_CUST) {
3256 if (info->custom_divisor)
3257 baud_rate = info->baud / info->custom_divisor;
3258 else
3259 baud_rate = info->baud;
3260 } else if (baud > CYZ_MAX_SPEED) {
3261 baud = CYZ_MAX_SPEED;
3262 }
3263 cy_writel(&ch_ctrl->comm_baud, baud);
3264
3265 if (baud == 134) {
3266
3267 info->timeout = (info->xmit_fifo_size * HZ * 30 / 269) +
3268 2;
3269 } else if (baud == 38400 && (info->port.flags & ASYNC_SPD_MASK) ==
3270 ASYNC_SPD_CUST) {
3271 info->timeout = (info->xmit_fifo_size * HZ * 15 /
3272 baud_rate) + 2;
3273 } else if (baud) {
3274 info->timeout = (info->xmit_fifo_size * HZ * 15 /
3275 baud) + 2;
3276
3277 } else {
3278 info->timeout = 0;
3279 }
3280
3281
3282 switch (cflag & CSIZE) {
3283 case CS5:
3284 cy_writel(&ch_ctrl->comm_data_l, C_DL_CS5);
3285 break;
3286 case CS6:
3287 cy_writel(&ch_ctrl->comm_data_l, C_DL_CS6);
3288 break;
3289 case CS7:
3290 cy_writel(&ch_ctrl->comm_data_l, C_DL_CS7);
3291 break;
3292 case CS8:
3293 cy_writel(&ch_ctrl->comm_data_l, C_DL_CS8);
3294 break;
3295 }
3296 if (cflag & CSTOPB) {
3297 cy_writel(&ch_ctrl->comm_data_l,
3298 readl(&ch_ctrl->comm_data_l) | C_DL_2STOP);
3299 } else {
3300 cy_writel(&ch_ctrl->comm_data_l,
3301 readl(&ch_ctrl->comm_data_l) | C_DL_1STOP);
3302 }
3303 if (cflag & PARENB) {
3304 if (cflag & PARODD)
3305 cy_writel(&ch_ctrl->comm_parity, C_PR_ODD);
3306 else
3307 cy_writel(&ch_ctrl->comm_parity, C_PR_EVEN);
3308 } else
3309 cy_writel(&ch_ctrl->comm_parity, C_PR_NONE);
3310
3311
3312 if (cflag & CRTSCTS) {
3313 cy_writel(&ch_ctrl->hw_flow,
3314 readl(&ch_ctrl->hw_flow) | C_RS_CTS | C_RS_RTS);
3315 } else {
3316 cy_writel(&ch_ctrl->hw_flow, readl(&ch_ctrl->hw_flow) &
3317 ~(C_RS_CTS | C_RS_RTS));
3318 }
3319
3320
3321 info->port.flags &= ~ASYNC_CTS_FLOW;
3322
3323
3324 sw_flow = 0;
3325 if (iflag & IXON) {
3326 sw_flow |= C_FL_OXX;
3327 if (iflag & IXANY)
3328 sw_flow |= C_FL_OIXANY;
3329 }
3330 cy_writel(&ch_ctrl->sw_flow, sw_flow);
3331
3332 retval = cyz_issue_cmd(card, channel, C_CM_IOCTL, 0L);
3333 if (retval != 0) {
3334 printk(KERN_ERR "cyc:set_line_char retval on ttyC%d "
3335 "was %x\n", info->line, retval);
3336 }
3337
3338
3339 if (cflag & CLOCAL)
3340 info->port.flags &= ~ASYNC_CHECK_CD;
3341 else
3342 info->port.flags |= ASYNC_CHECK_CD;
3343
3344 if (baud == 0) {
3345 cy_writel(&ch_ctrl->rs_control,
3346 readl(&ch_ctrl->rs_control) & ~C_RS_DTR);
3347#ifdef CY_DEBUG_DTR
3348 printk(KERN_DEBUG "cyc:set_line_char dropping Z DTR\n");
3349#endif
3350 } else {
3351 cy_writel(&ch_ctrl->rs_control,
3352 readl(&ch_ctrl->rs_control) | C_RS_DTR);
3353#ifdef CY_DEBUG_DTR
3354 printk(KERN_DEBUG "cyc:set_line_char raising Z DTR\n");
3355#endif
3356 }
3357
3358 retval = cyz_issue_cmd(card, channel, C_CM_IOCTLM, 0L);
3359 if (retval != 0) {
3360 printk(KERN_ERR "cyc:set_line_char(2) retval on ttyC%d "
3361 "was %x\n", info->line, retval);
3362 }
3363
3364 if (info->port.tty)
3365 clear_bit(TTY_IO_ERROR, &info->port.tty->flags);
3366 }
3367}
3368
3369static int
3370get_serial_info(struct cyclades_port *info,
3371 struct serial_struct __user *retinfo)
3372{
3373 struct serial_struct tmp;
3374 struct cyclades_card *cinfo = info->card;
3375
3376 if (!retinfo)
3377 return -EFAULT;
3378 memset(&tmp, 0, sizeof(tmp));
3379 tmp.type = info->type;
3380 tmp.line = info->line;
3381 tmp.port = (info->card - cy_card) * 0x100 + info->line -
3382 cinfo->first_line;
3383 tmp.irq = cinfo->irq;
3384 tmp.flags = info->port.flags;
3385 tmp.close_delay = info->port.close_delay;
3386 tmp.closing_wait = info->port.closing_wait;
3387 tmp.baud_base = info->baud;
3388 tmp.custom_divisor = info->custom_divisor;
3389 tmp.hub6 = 0;
3390 return copy_to_user(retinfo, &tmp, sizeof(*retinfo)) ? -EFAULT : 0;
3391}
3392
3393static int
3394set_serial_info(struct cyclades_port *info,
3395 struct serial_struct __user *new_info)
3396{
3397 struct serial_struct new_serial;
3398 struct cyclades_port old_info;
3399
3400 if (copy_from_user(&new_serial, new_info, sizeof(new_serial)))
3401 return -EFAULT;
3402 old_info = *info;
3403
3404 if (!capable(CAP_SYS_ADMIN)) {
3405 if (new_serial.close_delay != info->port.close_delay ||
3406 new_serial.baud_base != info->baud ||
3407 (new_serial.flags & ASYNC_FLAGS &
3408 ~ASYNC_USR_MASK) !=
3409 (info->port.flags & ASYNC_FLAGS & ~ASYNC_USR_MASK))
3410 return -EPERM;
3411 info->port.flags = (info->port.flags & ~ASYNC_USR_MASK) |
3412 (new_serial.flags & ASYNC_USR_MASK);
3413 info->baud = new_serial.baud_base;
3414 info->custom_divisor = new_serial.custom_divisor;
3415 goto check_and_exit;
3416 }
3417
3418
3419
3420
3421
3422
3423 info->baud = new_serial.baud_base;
3424 info->custom_divisor = new_serial.custom_divisor;
3425 info->port.flags = (info->port.flags & ~ASYNC_FLAGS) |
3426 (new_serial.flags & ASYNC_FLAGS);
3427 info->port.close_delay = new_serial.close_delay * HZ / 100;
3428 info->port.closing_wait = new_serial.closing_wait * HZ / 100;
3429
3430check_and_exit:
3431 if (info->port.flags & ASYNC_INITIALIZED) {
3432 set_line_char(info);
3433 return 0;
3434 } else {
3435 return startup(info);
3436 }
3437}
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449static int get_lsr_info(struct cyclades_port *info, unsigned int __user *value)
3450{
3451 struct cyclades_card *card;
3452 int chip, channel, index;
3453 unsigned char status;
3454 unsigned int result;
3455 unsigned long flags;
3456 void __iomem *base_addr;
3457
3458 card = info->card;
3459 channel = (info->line) - (card->first_line);
3460 if (!IS_CYC_Z(*card)) {
3461 chip = channel >> 2;
3462 channel &= 0x03;
3463 index = card->bus_index;
3464 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3465
3466 spin_lock_irqsave(&card->card_lock, flags);
3467 status = readb(base_addr + (CySRER << index)) &
3468 (CyTxRdy | CyTxMpty);
3469 spin_unlock_irqrestore(&card->card_lock, flags);
3470 result = (status ? 0 : TIOCSER_TEMT);
3471 } else {
3472
3473 return -EINVAL;
3474 }
3475 return put_user(result, (unsigned long __user *)value);
3476}
3477
3478static int cy_tiocmget(struct tty_struct *tty, struct file *file)
3479{
3480 struct cyclades_port *info = tty->driver_data;
3481 struct cyclades_card *card;
3482 int chip, channel, index;
3483 void __iomem *base_addr;
3484 unsigned long flags;
3485 unsigned char status;
3486 unsigned long lstatus;
3487 unsigned int result;
3488 struct FIRM_ID __iomem *firm_id;
3489 struct ZFW_CTRL __iomem *zfw_ctrl;
3490 struct BOARD_CTRL __iomem *board_ctrl;
3491 struct CH_CTRL __iomem *ch_ctrl;
3492
3493 if (serial_paranoia_check(info, tty->name, __func__))
3494 return -ENODEV;
3495
3496 lock_kernel();
3497
3498 card = info->card;
3499 channel = info->line - card->first_line;
3500 if (!IS_CYC_Z(*card)) {
3501 chip = channel >> 2;
3502 channel &= 0x03;
3503 index = card->bus_index;
3504 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3505
3506 spin_lock_irqsave(&card->card_lock, flags);
3507 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
3508 status = readb(base_addr + (CyMSVR1 << index));
3509 status |= readb(base_addr + (CyMSVR2 << index));
3510 spin_unlock_irqrestore(&card->card_lock, flags);
3511
3512 if (info->rtsdtr_inv) {
3513 result = ((status & CyRTS) ? TIOCM_DTR : 0) |
3514 ((status & CyDTR) ? TIOCM_RTS : 0);
3515 } else {
3516 result = ((status & CyRTS) ? TIOCM_RTS : 0) |
3517 ((status & CyDTR) ? TIOCM_DTR : 0);
3518 }
3519 result |= ((status & CyDCD) ? TIOCM_CAR : 0) |
3520 ((status & CyRI) ? TIOCM_RNG : 0) |
3521 ((status & CyDSR) ? TIOCM_DSR : 0) |
3522 ((status & CyCTS) ? TIOCM_CTS : 0);
3523 } else {
3524 base_addr = card->base_addr;
3525 firm_id = card->base_addr + ID_ADDRESS;
3526 if (ISZLOADED(*card)) {
3527 zfw_ctrl = card->base_addr +
3528 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
3529 board_ctrl = &zfw_ctrl->board_ctrl;
3530 ch_ctrl = zfw_ctrl->ch_ctrl;
3531 lstatus = readl(&ch_ctrl[channel].rs_status);
3532 result = ((lstatus & C_RS_RTS) ? TIOCM_RTS : 0) |
3533 ((lstatus & C_RS_DTR) ? TIOCM_DTR : 0) |
3534 ((lstatus & C_RS_DCD) ? TIOCM_CAR : 0) |
3535 ((lstatus & C_RS_RI) ? TIOCM_RNG : 0) |
3536 ((lstatus & C_RS_DSR) ? TIOCM_DSR : 0) |
3537 ((lstatus & C_RS_CTS) ? TIOCM_CTS : 0);
3538 } else {
3539 result = 0;
3540 unlock_kernel();
3541 return -ENODEV;
3542 }
3543
3544 }
3545 unlock_kernel();
3546 return result;
3547}
3548
3549static int
3550cy_tiocmset(struct tty_struct *tty, struct file *file,
3551 unsigned int set, unsigned int clear)
3552{
3553 struct cyclades_port *info = tty->driver_data;
3554 struct cyclades_card *card;
3555 int chip, channel, index;
3556 void __iomem *base_addr;
3557 unsigned long flags;
3558 struct FIRM_ID __iomem *firm_id;
3559 struct ZFW_CTRL __iomem *zfw_ctrl;
3560 struct BOARD_CTRL __iomem *board_ctrl;
3561 struct CH_CTRL __iomem *ch_ctrl;
3562 int retval;
3563
3564 if (serial_paranoia_check(info, tty->name, __func__))
3565 return -ENODEV;
3566
3567 card = info->card;
3568 channel = (info->line) - (card->first_line);
3569 if (!IS_CYC_Z(*card)) {
3570 chip = channel >> 2;
3571 channel &= 0x03;
3572 index = card->bus_index;
3573 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3574
3575 if (set & TIOCM_RTS) {
3576 spin_lock_irqsave(&card->card_lock, flags);
3577 cy_writeb(base_addr + (CyCAR << index),
3578 (u_char) channel);
3579 if (info->rtsdtr_inv) {
3580 cy_writeb(base_addr + (CyMSVR2 << index),
3581 CyDTR);
3582 } else {
3583 cy_writeb(base_addr + (CyMSVR1 << index),
3584 CyRTS);
3585 }
3586 spin_unlock_irqrestore(&card->card_lock, flags);
3587 }
3588 if (clear & TIOCM_RTS) {
3589 spin_lock_irqsave(&card->card_lock, flags);
3590 cy_writeb(base_addr + (CyCAR << index),
3591 (u_char) channel);
3592 if (info->rtsdtr_inv) {
3593 cy_writeb(base_addr + (CyMSVR2 << index),
3594 ~CyDTR);
3595 } else {
3596 cy_writeb(base_addr + (CyMSVR1 << index),
3597 ~CyRTS);
3598 }
3599 spin_unlock_irqrestore(&card->card_lock, flags);
3600 }
3601 if (set & TIOCM_DTR) {
3602 spin_lock_irqsave(&card->card_lock, flags);
3603 cy_writeb(base_addr + (CyCAR << index),
3604 (u_char) channel);
3605 if (info->rtsdtr_inv) {
3606 cy_writeb(base_addr + (CyMSVR1 << index),
3607 CyRTS);
3608 } else {
3609 cy_writeb(base_addr + (CyMSVR2 << index),
3610 CyDTR);
3611 }
3612#ifdef CY_DEBUG_DTR
3613 printk(KERN_DEBUG "cyc:set_modem_info raising DTR\n");
3614 printk(KERN_DEBUG " status: 0x%x, 0x%x\n",
3615 readb(base_addr + (CyMSVR1 << index)),
3616 readb(base_addr + (CyMSVR2 << index)));
3617#endif
3618 spin_unlock_irqrestore(&card->card_lock, flags);
3619 }
3620 if (clear & TIOCM_DTR) {
3621 spin_lock_irqsave(&card->card_lock, flags);
3622 cy_writeb(base_addr + (CyCAR << index),
3623 (u_char) channel);
3624 if (info->rtsdtr_inv) {
3625 cy_writeb(base_addr + (CyMSVR1 << index),
3626 ~CyRTS);
3627 } else {
3628 cy_writeb(base_addr + (CyMSVR2 << index),
3629 ~CyDTR);
3630 }
3631
3632#ifdef CY_DEBUG_DTR
3633 printk(KERN_DEBUG "cyc:set_modem_info dropping DTR\n");
3634 printk(KERN_DEBUG " status: 0x%x, 0x%x\n",
3635 readb(base_addr + (CyMSVR1 << index)),
3636 readb(base_addr + (CyMSVR2 << index)));
3637#endif
3638 spin_unlock_irqrestore(&card->card_lock, flags);
3639 }
3640 } else {
3641 base_addr = card->base_addr;
3642
3643 firm_id = card->base_addr + ID_ADDRESS;
3644 if (ISZLOADED(*card)) {
3645 zfw_ctrl = card->base_addr +
3646 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
3647 board_ctrl = &zfw_ctrl->board_ctrl;
3648 ch_ctrl = zfw_ctrl->ch_ctrl;
3649
3650 if (set & TIOCM_RTS) {
3651 spin_lock_irqsave(&card->card_lock, flags);
3652 cy_writel(&ch_ctrl[channel].rs_control,
3653 readl(&ch_ctrl[channel].rs_control) |
3654 C_RS_RTS);
3655 spin_unlock_irqrestore(&card->card_lock, flags);
3656 }
3657 if (clear & TIOCM_RTS) {
3658 spin_lock_irqsave(&card->card_lock, flags);
3659 cy_writel(&ch_ctrl[channel].rs_control,
3660 readl(&ch_ctrl[channel].rs_control) &
3661 ~C_RS_RTS);
3662 spin_unlock_irqrestore(&card->card_lock, flags);
3663 }
3664 if (set & TIOCM_DTR) {
3665 spin_lock_irqsave(&card->card_lock, flags);
3666 cy_writel(&ch_ctrl[channel].rs_control,
3667 readl(&ch_ctrl[channel].rs_control) |
3668 C_RS_DTR);
3669#ifdef CY_DEBUG_DTR
3670 printk(KERN_DEBUG "cyc:set_modem_info raising "
3671 "Z DTR\n");
3672#endif
3673 spin_unlock_irqrestore(&card->card_lock, flags);
3674 }
3675 if (clear & TIOCM_DTR) {
3676 spin_lock_irqsave(&card->card_lock, flags);
3677 cy_writel(&ch_ctrl[channel].rs_control,
3678 readl(&ch_ctrl[channel].rs_control) &
3679 ~C_RS_DTR);
3680#ifdef CY_DEBUG_DTR
3681 printk(KERN_DEBUG "cyc:set_modem_info clearing "
3682 "Z DTR\n");
3683#endif
3684 spin_unlock_irqrestore(&card->card_lock, flags);
3685 }
3686 } else {
3687 return -ENODEV;
3688 }
3689 spin_lock_irqsave(&card->card_lock, flags);
3690 retval = cyz_issue_cmd(card, channel, C_CM_IOCTLM, 0L);
3691 if (retval != 0) {
3692 printk(KERN_ERR "cyc:set_modem_info retval on ttyC%d "
3693 "was %x\n", info->line, retval);
3694 }
3695 spin_unlock_irqrestore(&card->card_lock, flags);
3696 }
3697 return 0;
3698}
3699
3700
3701
3702
3703static int cy_break(struct tty_struct *tty, int break_state)
3704{
3705 struct cyclades_port *info = tty->driver_data;
3706 struct cyclades_card *card;
3707 unsigned long flags;
3708 int retval = 0;
3709
3710 if (serial_paranoia_check(info, tty->name, "cy_break"))
3711 return -EINVAL;
3712
3713 card = info->card;
3714
3715 spin_lock_irqsave(&card->card_lock, flags);
3716 if (!IS_CYC_Z(*card)) {
3717
3718
3719
3720 if (break_state == -1) {
3721 if (!info->breakon) {
3722 info->breakon = 1;
3723 if (!info->xmit_cnt) {
3724 spin_unlock_irqrestore(&card->card_lock, flags);
3725 start_xmit(info);
3726 spin_lock_irqsave(&card->card_lock, flags);
3727 }
3728 }
3729 } else {
3730 if (!info->breakoff) {
3731 info->breakoff = 1;
3732 if (!info->xmit_cnt) {
3733 spin_unlock_irqrestore(&card->card_lock, flags);
3734 start_xmit(info);
3735 spin_lock_irqsave(&card->card_lock, flags);
3736 }
3737 }
3738 }
3739 } else {
3740 if (break_state == -1) {
3741 retval = cyz_issue_cmd(card,
3742 info->line - card->first_line,
3743 C_CM_SET_BREAK, 0L);
3744 if (retval != 0) {
3745 printk(KERN_ERR "cyc:cy_break (set) retval on "
3746 "ttyC%d was %x\n", info->line, retval);
3747 }
3748 } else {
3749 retval = cyz_issue_cmd(card,
3750 info->line - card->first_line,
3751 C_CM_CLR_BREAK, 0L);
3752 if (retval != 0) {
3753 printk(KERN_DEBUG "cyc:cy_break (clr) retval "
3754 "on ttyC%d was %x\n", info->line,
3755 retval);
3756 }
3757 }
3758 }
3759 spin_unlock_irqrestore(&card->card_lock, flags);
3760 return retval;
3761}
3762
3763static int get_mon_info(struct cyclades_port *info,
3764 struct cyclades_monitor __user *mon)
3765{
3766
3767 if (copy_to_user(mon, &info->mon, sizeof(struct cyclades_monitor)))
3768 return -EFAULT;
3769 info->mon.int_count = 0;
3770 info->mon.char_count = 0;
3771 info->mon.char_max = 0;
3772 info->mon.char_last = 0;
3773 return 0;
3774}
3775
3776static int set_threshold(struct cyclades_port *info, unsigned long value)
3777{
3778 struct cyclades_card *card;
3779 void __iomem *base_addr;
3780 int channel, chip, index;
3781 unsigned long flags;
3782
3783 card = info->card;
3784 channel = info->line - card->first_line;
3785 if (!IS_CYC_Z(*card)) {
3786 chip = channel >> 2;
3787 channel &= 0x03;
3788 index = card->bus_index;
3789 base_addr =
3790 card->base_addr + (cy_chip_offset[chip] << index);
3791
3792 info->cor3 &= ~CyREC_FIFO;
3793 info->cor3 |= value & CyREC_FIFO;
3794
3795 spin_lock_irqsave(&card->card_lock, flags);
3796 cy_writeb(base_addr + (CyCOR3 << index), info->cor3);
3797 cyy_issue_cmd(base_addr, CyCOR_CHANGE | CyCOR3ch, index);
3798 spin_unlock_irqrestore(&card->card_lock, flags);
3799 }
3800 return 0;
3801}
3802
3803static int get_threshold(struct cyclades_port *info,
3804 unsigned long __user *value)
3805{
3806 struct cyclades_card *card;
3807 void __iomem *base_addr;
3808 int channel, chip, index;
3809 unsigned long tmp;
3810
3811 card = info->card;
3812 channel = info->line - card->first_line;
3813 if (!IS_CYC_Z(*card)) {
3814 chip = channel >> 2;
3815 channel &= 0x03;
3816 index = card->bus_index;
3817 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3818
3819 tmp = readb(base_addr + (CyCOR3 << index)) & CyREC_FIFO;
3820 return put_user(tmp, value);
3821 }
3822 return 0;
3823}
3824
3825static int set_default_threshold(struct cyclades_port *info,
3826 unsigned long value)
3827{
3828 info->default_threshold = value & 0x0f;
3829 return 0;
3830}
3831
3832static int get_default_threshold(struct cyclades_port *info,
3833 unsigned long __user *value)
3834{
3835 return put_user(info->default_threshold, value);
3836}
3837
3838static int set_timeout(struct cyclades_port *info, unsigned long value)
3839{
3840 struct cyclades_card *card;
3841 void __iomem *base_addr;
3842 int channel, chip, index;
3843 unsigned long flags;
3844
3845 card = info->card;
3846 channel = info->line - card->first_line;
3847 if (!IS_CYC_Z(*card)) {
3848 chip = channel >> 2;
3849 channel &= 0x03;
3850 index = card->bus_index;
3851 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3852
3853 spin_lock_irqsave(&card->card_lock, flags);
3854 cy_writeb(base_addr + (CyRTPR << index), value & 0xff);
3855 spin_unlock_irqrestore(&card->card_lock, flags);
3856 }
3857 return 0;
3858}
3859
3860static int get_timeout(struct cyclades_port *info,
3861 unsigned long __user *value)
3862{
3863 struct cyclades_card *card;
3864 void __iomem *base_addr;
3865 int channel, chip, index;
3866 unsigned long tmp;
3867
3868 card = info->card;
3869 channel = info->line - card->first_line;
3870 if (!IS_CYC_Z(*card)) {
3871 chip = channel >> 2;
3872 channel &= 0x03;
3873 index = card->bus_index;
3874 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3875
3876 tmp = readb(base_addr + (CyRTPR << index));
3877 return put_user(tmp, value);
3878 }
3879 return 0;
3880}
3881
3882static int set_default_timeout(struct cyclades_port *info, unsigned long value)
3883{
3884 info->default_timeout = value & 0xff;
3885 return 0;
3886}
3887
3888static int get_default_timeout(struct cyclades_port *info,
3889 unsigned long __user *value)
3890{
3891 return put_user(info->default_timeout, value);
3892}
3893
3894
3895
3896
3897
3898
3899static int
3900cy_ioctl(struct tty_struct *tty, struct file *file,
3901 unsigned int cmd, unsigned long arg)
3902{
3903 struct cyclades_port *info = tty->driver_data;
3904 struct cyclades_icount cprev, cnow;
3905 struct serial_icounter_struct __user *p_cuser;
3906 int ret_val = 0;
3907 unsigned long flags;
3908 void __user *argp = (void __user *)arg;
3909
3910 if (serial_paranoia_check(info, tty->name, "cy_ioctl"))
3911 return -ENODEV;
3912
3913#ifdef CY_DEBUG_OTHER
3914 printk(KERN_DEBUG "cyc:cy_ioctl ttyC%d, cmd = %x arg = %lx\n",
3915 info->line, cmd, arg);
3916#endif
3917 lock_kernel();
3918
3919 switch (cmd) {
3920 case CYGETMON:
3921 ret_val = get_mon_info(info, argp);
3922 break;
3923 case CYGETTHRESH:
3924 ret_val = get_threshold(info, argp);
3925 break;
3926 case CYSETTHRESH:
3927 ret_val = set_threshold(info, arg);
3928 break;
3929 case CYGETDEFTHRESH:
3930 ret_val = get_default_threshold(info, argp);
3931 break;
3932 case CYSETDEFTHRESH:
3933 ret_val = set_default_threshold(info, arg);
3934 break;
3935 case CYGETTIMEOUT:
3936 ret_val = get_timeout(info, argp);
3937 break;
3938 case CYSETTIMEOUT:
3939 ret_val = set_timeout(info, arg);
3940 break;
3941 case CYGETDEFTIMEOUT:
3942 ret_val = get_default_timeout(info, argp);
3943 break;
3944 case CYSETDEFTIMEOUT:
3945 ret_val = set_default_timeout(info, arg);
3946 break;
3947 case CYSETRFLOW:
3948 info->rflow = (int)arg;
3949 ret_val = 0;
3950 break;
3951 case CYGETRFLOW:
3952 ret_val = info->rflow;
3953 break;
3954 case CYSETRTSDTR_INV:
3955 info->rtsdtr_inv = (int)arg;
3956 ret_val = 0;
3957 break;
3958 case CYGETRTSDTR_INV:
3959 ret_val = info->rtsdtr_inv;
3960 break;
3961 case CYGETCD1400VER:
3962 ret_val = info->chip_rev;
3963 break;
3964#ifndef CONFIG_CYZ_INTR
3965 case CYZSETPOLLCYCLE:
3966 cyz_polling_cycle = (arg * HZ) / 1000;
3967 ret_val = 0;
3968 break;
3969 case CYZGETPOLLCYCLE:
3970 ret_val = (cyz_polling_cycle * 1000) / HZ;
3971 break;
3972#endif
3973 case CYSETWAIT:
3974 info->port.closing_wait = (unsigned short)arg * HZ / 100;
3975 ret_val = 0;
3976 break;
3977 case CYGETWAIT:
3978 ret_val = info->port.closing_wait / (HZ / 100);
3979 break;
3980 case TIOCGSERIAL:
3981 ret_val = get_serial_info(info, argp);
3982 break;
3983 case TIOCSSERIAL:
3984 ret_val = set_serial_info(info, argp);
3985 break;
3986 case TIOCSERGETLSR:
3987 ret_val = get_lsr_info(info, argp);
3988 break;
3989
3990
3991
3992
3993
3994
3995 case TIOCMIWAIT:
3996 spin_lock_irqsave(&info->card->card_lock, flags);
3997
3998 cnow = info->icount;
3999 spin_unlock_irqrestore(&info->card->card_lock, flags);
4000 ret_val = wait_event_interruptible(info->delta_msr_wait, ({
4001 cprev = cnow;
4002 spin_lock_irqsave(&info->card->card_lock, flags);
4003 cnow = info->icount;
4004 spin_unlock_irqrestore(&info->card->card_lock, flags);
4005
4006 ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
4007 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
4008 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
4009 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts));
4010 }));
4011 break;
4012
4013
4014
4015
4016
4017
4018
4019 case TIOCGICOUNT:
4020 spin_lock_irqsave(&info->card->card_lock, flags);
4021 cnow = info->icount;
4022 spin_unlock_irqrestore(&info->card->card_lock, flags);
4023 p_cuser = argp;
4024 ret_val = put_user(cnow.cts, &p_cuser->cts);
4025 if (ret_val)
4026 break;
4027 ret_val = put_user(cnow.dsr, &p_cuser->dsr);
4028 if (ret_val)
4029 break;
4030 ret_val = put_user(cnow.rng, &p_cuser->rng);
4031 if (ret_val)
4032 break;
4033 ret_val = put_user(cnow.dcd, &p_cuser->dcd);
4034 if (ret_val)
4035 break;
4036 ret_val = put_user(cnow.rx, &p_cuser->rx);
4037 if (ret_val)
4038 break;
4039 ret_val = put_user(cnow.tx, &p_cuser->tx);
4040 if (ret_val)
4041 break;
4042 ret_val = put_user(cnow.frame, &p_cuser->frame);
4043 if (ret_val)
4044 break;
4045 ret_val = put_user(cnow.overrun, &p_cuser->overrun);
4046 if (ret_val)
4047 break;
4048 ret_val = put_user(cnow.parity, &p_cuser->parity);
4049 if (ret_val)
4050 break;
4051 ret_val = put_user(cnow.brk, &p_cuser->brk);
4052 if (ret_val)
4053 break;
4054 ret_val = put_user(cnow.buf_overrun, &p_cuser->buf_overrun);
4055 if (ret_val)
4056 break;
4057 ret_val = 0;
4058 break;
4059 default:
4060 ret_val = -ENOIOCTLCMD;
4061 }
4062 unlock_kernel();
4063
4064#ifdef CY_DEBUG_OTHER
4065 printk(KERN_DEBUG "cyc:cy_ioctl done\n");
4066#endif
4067 return ret_val;
4068}
4069
4070
4071
4072
4073
4074
4075
4076static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
4077{
4078 struct cyclades_port *info = tty->driver_data;
4079
4080#ifdef CY_DEBUG_OTHER
4081 printk(KERN_DEBUG "cyc:cy_set_termios ttyC%d\n", info->line);
4082#endif
4083
4084 set_line_char(info);
4085
4086 if ((old_termios->c_cflag & CRTSCTS) &&
4087 !(tty->termios->c_cflag & CRTSCTS)) {
4088 tty->hw_stopped = 0;
4089 cy_start(tty);
4090 }
4091#if 0
4092
4093
4094
4095
4096
4097
4098 if (!(old_termios->c_cflag & CLOCAL) &&
4099 (tty->termios->c_cflag & CLOCAL))
4100 wake_up_interruptible(&info->port.open_wait);
4101#endif
4102}
4103
4104
4105
4106
4107static void cy_send_xchar(struct tty_struct *tty, char ch)
4108{
4109 struct cyclades_port *info = tty->driver_data;
4110 struct cyclades_card *card;
4111 int channel;
4112
4113 if (serial_paranoia_check(info, tty->name, "cy_send_xchar"))
4114 return;
4115
4116 info->x_char = ch;
4117
4118 if (ch)
4119 cy_start(tty);
4120
4121 card = info->card;
4122 channel = info->line - card->first_line;
4123
4124 if (IS_CYC_Z(*card)) {
4125 if (ch == STOP_CHAR(tty))
4126 cyz_issue_cmd(card, channel, C_CM_SENDXOFF, 0L);
4127 else if (ch == START_CHAR(tty))
4128 cyz_issue_cmd(card, channel, C_CM_SENDXON, 0L);
4129 }
4130}
4131
4132
4133
4134
4135
4136static void cy_throttle(struct tty_struct *tty)
4137{
4138 struct cyclades_port *info = tty->driver_data;
4139 struct cyclades_card *card;
4140 unsigned long flags;
4141 void __iomem *base_addr;
4142 int chip, channel, index;
4143
4144#ifdef CY_DEBUG_THROTTLE
4145 char buf[64];
4146
4147 printk(KERN_DEBUG "cyc:throttle %s: %ld...ttyC%d\n", tty_name(tty, buf),
4148 tty->ldisc.chars_in_buffer(tty), info->line);
4149#endif
4150
4151 if (serial_paranoia_check(info, tty->name, "cy_throttle"))
4152 return;
4153
4154 card = info->card;
4155
4156 if (I_IXOFF(tty)) {
4157 if (!IS_CYC_Z(*card))
4158 cy_send_xchar(tty, STOP_CHAR(tty));
4159 else
4160 info->throttle = 1;
4161 }
4162
4163 if (tty->termios->c_cflag & CRTSCTS) {
4164 channel = info->line - card->first_line;
4165 if (!IS_CYC_Z(*card)) {
4166 chip = channel >> 2;
4167 channel &= 0x03;
4168 index = card->bus_index;
4169 base_addr = card->base_addr +
4170 (cy_chip_offset[chip] << index);
4171
4172 spin_lock_irqsave(&card->card_lock, flags);
4173 cy_writeb(base_addr + (CyCAR << index),
4174 (u_char) channel);
4175 if (info->rtsdtr_inv) {
4176 cy_writeb(base_addr + (CyMSVR2 << index),
4177 ~CyDTR);
4178 } else {
4179 cy_writeb(base_addr + (CyMSVR1 << index),
4180 ~CyRTS);
4181 }
4182 spin_unlock_irqrestore(&card->card_lock, flags);
4183 } else {
4184 info->throttle = 1;
4185 }
4186 }
4187}
4188
4189
4190
4191
4192
4193
4194static void cy_unthrottle(struct tty_struct *tty)
4195{
4196 struct cyclades_port *info = tty->driver_data;
4197 struct cyclades_card *card;
4198 unsigned long flags;
4199 void __iomem *base_addr;
4200 int chip, channel, index;
4201
4202#ifdef CY_DEBUG_THROTTLE
4203 char buf[64];
4204
4205 printk(KERN_DEBUG "cyc:unthrottle %s: %ld...ttyC%d\n",
4206 tty_name(tty, buf), tty_chars_in_buffer(tty), info->line);
4207#endif
4208
4209 if (serial_paranoia_check(info, tty->name, "cy_unthrottle"))
4210 return;
4211
4212 if (I_IXOFF(tty)) {
4213 if (info->x_char)
4214 info->x_char = 0;
4215 else
4216 cy_send_xchar(tty, START_CHAR(tty));
4217 }
4218
4219 if (tty->termios->c_cflag & CRTSCTS) {
4220 card = info->card;
4221 channel = info->line - card->first_line;
4222 if (!IS_CYC_Z(*card)) {
4223 chip = channel >> 2;
4224 channel &= 0x03;
4225 index = card->bus_index;
4226 base_addr = card->base_addr +
4227 (cy_chip_offset[chip] << index);
4228
4229 spin_lock_irqsave(&card->card_lock, flags);
4230 cy_writeb(base_addr + (CyCAR << index),
4231 (u_char) channel);
4232 if (info->rtsdtr_inv) {
4233 cy_writeb(base_addr + (CyMSVR2 << index),
4234 CyDTR);
4235 } else {
4236 cy_writeb(base_addr + (CyMSVR1 << index),
4237 CyRTS);
4238 }
4239 spin_unlock_irqrestore(&card->card_lock, flags);
4240 } else {
4241 info->throttle = 0;
4242 }
4243 }
4244}
4245
4246
4247
4248
4249static void cy_stop(struct tty_struct *tty)
4250{
4251 struct cyclades_card *cinfo;
4252 struct cyclades_port *info = tty->driver_data;
4253 void __iomem *base_addr;
4254 int chip, channel, index;
4255 unsigned long flags;
4256
4257#ifdef CY_DEBUG_OTHER
4258 printk(KERN_DEBUG "cyc:cy_stop ttyC%d\n", info->line);
4259#endif
4260
4261 if (serial_paranoia_check(info, tty->name, "cy_stop"))
4262 return;
4263
4264 cinfo = info->card;
4265 channel = info->line - cinfo->first_line;
4266 if (!IS_CYC_Z(*cinfo)) {
4267 index = cinfo->bus_index;
4268 chip = channel >> 2;
4269 channel &= 0x03;
4270 base_addr = cinfo->base_addr + (cy_chip_offset[chip] << index);
4271
4272 spin_lock_irqsave(&cinfo->card_lock, flags);
4273 cy_writeb(base_addr + (CyCAR << index),
4274 (u_char)(channel & 0x0003));
4275 cy_writeb(base_addr + (CySRER << index),
4276 readb(base_addr + (CySRER << index)) & ~CyTxRdy);
4277 spin_unlock_irqrestore(&cinfo->card_lock, flags);
4278 }
4279}
4280
4281static void cy_start(struct tty_struct *tty)
4282{
4283 struct cyclades_card *cinfo;
4284 struct cyclades_port *info = tty->driver_data;
4285 void __iomem *base_addr;
4286 int chip, channel, index;
4287 unsigned long flags;
4288
4289#ifdef CY_DEBUG_OTHER
4290 printk(KERN_DEBUG "cyc:cy_start ttyC%d\n", info->line);
4291#endif
4292
4293 if (serial_paranoia_check(info, tty->name, "cy_start"))
4294 return;
4295
4296 cinfo = info->card;
4297 channel = info->line - cinfo->first_line;
4298 index = cinfo->bus_index;
4299 if (!IS_CYC_Z(*cinfo)) {
4300 chip = channel >> 2;
4301 channel &= 0x03;
4302 base_addr = cinfo->base_addr + (cy_chip_offset[chip] << index);
4303
4304 spin_lock_irqsave(&cinfo->card_lock, flags);
4305 cy_writeb(base_addr + (CyCAR << index),
4306 (u_char) (channel & 0x0003));
4307 cy_writeb(base_addr + (CySRER << index),
4308 readb(base_addr + (CySRER << index)) | CyTxRdy);
4309 spin_unlock_irqrestore(&cinfo->card_lock, flags);
4310 }
4311}
4312
4313
4314
4315
4316static void cy_hangup(struct tty_struct *tty)
4317{
4318 struct cyclades_port *info = tty->driver_data;
4319
4320#ifdef CY_DEBUG_OTHER
4321 printk(KERN_DEBUG "cyc:cy_hangup ttyC%d\n", info->line);
4322#endif
4323
4324 if (serial_paranoia_check(info, tty->name, "cy_hangup"))
4325 return;
4326
4327 cy_flush_buffer(tty);
4328 shutdown(info);
4329 info->port.count = 0;
4330#ifdef CY_DEBUG_COUNT
4331 printk(KERN_DEBUG "cyc:cy_hangup (%d): setting count to 0\n",
4332 current->pid);
4333#endif
4334 info->port.tty = NULL;
4335 info->port.flags &= ~ASYNC_NORMAL_ACTIVE;
4336 wake_up_interruptible(&info->port.open_wait);
4337}
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347static int __devinit cy_init_card(struct cyclades_card *cinfo)
4348{
4349 struct cyclades_port *info;
4350 u32 uninitialized_var(mailbox);
4351 unsigned int nports, port;
4352 unsigned short chip_number;
4353 int uninitialized_var(index);
4354
4355 spin_lock_init(&cinfo->card_lock);
4356
4357 if (IS_CYC_Z(*cinfo)) {
4358 mailbox = readl(&((struct RUNTIME_9060 __iomem *)
4359 cinfo->ctl_addr)->mail_box_0);
4360 nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8;
4361 cinfo->intr_enabled = 0;
4362 cinfo->nports = 0;
4363
4364 } else {
4365 index = cinfo->bus_index;
4366 nports = cinfo->nports = CyPORTS_PER_CHIP * cinfo->num_chips;
4367 }
4368
4369 cinfo->ports = kzalloc(sizeof(*cinfo->ports) * nports, GFP_KERNEL);
4370 if (cinfo->ports == NULL) {
4371 printk(KERN_ERR "Cyclades: cannot allocate ports\n");
4372 cinfo->nports = 0;
4373 return -ENOMEM;
4374 }
4375
4376 for (port = cinfo->first_line; port < cinfo->first_line + nports;
4377 port++) {
4378 info = &cinfo->ports[port - cinfo->first_line];
4379 tty_port_init(&info->port);
4380 info->magic = CYCLADES_MAGIC;
4381 info->card = cinfo;
4382 info->line = port;
4383
4384 info->port.closing_wait = CLOSING_WAIT_DELAY;
4385 info->port.close_delay = 5 * HZ / 10;
4386 info->port.flags = STD_COM_FLAGS;
4387 init_completion(&info->shutdown_wait);
4388 init_waitqueue_head(&info->delta_msr_wait);
4389
4390 if (IS_CYC_Z(*cinfo)) {
4391 info->type = PORT_STARTECH;
4392 if (mailbox == ZO_V1)
4393 info->xmit_fifo_size = CYZ_FIFO_SIZE;
4394 else
4395 info->xmit_fifo_size = 4 * CYZ_FIFO_SIZE;
4396#ifdef CONFIG_CYZ_INTR
4397 setup_timer(&cyz_rx_full_timer[port],
4398 cyz_rx_restart, (unsigned long)info);
4399#endif
4400 } else {
4401 info->type = PORT_CIRRUS;
4402 info->xmit_fifo_size = CyMAX_CHAR_FIFO;
4403 info->cor1 = CyPARITY_NONE | Cy_1_STOP | Cy_8_BITS;
4404 info->cor2 = CyETC;
4405 info->cor3 = 0x08;
4406
4407 chip_number = (port - cinfo->first_line) / 4;
4408 info->chip_rev = readb(cinfo->base_addr +
4409 (cy_chip_offset[chip_number] << index) +
4410 (CyGFRCR << index));
4411
4412 if (info->chip_rev >= CD1400_REV_J) {
4413
4414 info->tbpr = baud_bpr_60[13];
4415 info->tco = baud_co_60[13];
4416 info->rbpr = baud_bpr_60[13];
4417 info->rco = baud_co_60[13];
4418 info->rtsdtr_inv = 1;
4419 } else {
4420 info->tbpr = baud_bpr_25[13];
4421 info->tco = baud_co_25[13];
4422 info->rbpr = baud_bpr_25[13];
4423 info->rco = baud_co_25[13];
4424 info->rtsdtr_inv = 0;
4425 }
4426 info->read_status_mask = CyTIMEOUT | CySPECHAR |
4427 CyBREAK | CyPARITY | CyFRAME | CyOVERRUN;
4428 }
4429
4430 }
4431
4432#ifndef CONFIG_CYZ_INTR
4433 if (IS_CYC_Z(*cinfo) && !timer_pending(&cyz_timerlist)) {
4434 mod_timer(&cyz_timerlist, jiffies + 1);
4435#ifdef CY_PCI_DEBUG
4436 printk(KERN_DEBUG "Cyclades-Z polling initialized\n");
4437#endif
4438 }
4439#endif
4440 return 0;
4441}
4442
4443
4444
4445static unsigned short __devinit cyy_init_card(void __iomem *true_base_addr,
4446 int index)
4447{
4448 unsigned int chip_number;
4449 void __iomem *base_addr;
4450
4451 cy_writeb(true_base_addr + (Cy_HwReset << index), 0);
4452
4453 cy_writeb(true_base_addr + (Cy_ClrIntr << index), 0);
4454
4455 udelay(500L);
4456
4457 for (chip_number = 0; chip_number < CyMAX_CHIPS_PER_CARD;
4458 chip_number++) {
4459 base_addr =
4460 true_base_addr + (cy_chip_offset[chip_number] << index);
4461 mdelay(1);
4462 if (readb(base_addr + (CyCCR << index)) != 0x00) {
4463
4464
4465
4466
4467 return chip_number;
4468 }
4469
4470 cy_writeb(base_addr + (CyGFRCR << index), 0);
4471 udelay(10L);
4472
4473
4474
4475
4476
4477
4478
4479 if (chip_number == 4 && readb(true_base_addr +
4480 (cy_chip_offset[0] << index) +
4481 (CyGFRCR << index)) == 0) {
4482 return chip_number;
4483 }
4484
4485 cy_writeb(base_addr + (CyCCR << index), CyCHIP_RESET);
4486 mdelay(1);
4487
4488 if (readb(base_addr + (CyGFRCR << index)) == 0x00) {
4489
4490
4491
4492
4493
4494 return chip_number;
4495 }
4496 if ((0xf0 & (readb(base_addr + (CyGFRCR << index)))) !=
4497 0x40) {
4498
4499
4500
4501
4502
4503
4504 return chip_number;
4505 }
4506 cy_writeb(base_addr + (CyGCR << index), CyCH0_SERIAL);
4507 if (readb(base_addr + (CyGFRCR << index)) >= CD1400_REV_J) {
4508
4509
4510
4511 cy_writeb(base_addr + (CyPPR << index), CyCLOCK_60_2MS);
4512 } else {
4513
4514 cy_writeb(base_addr + (CyPPR << index), CyCLOCK_25_5MS);
4515 }
4516
4517
4518
4519
4520
4521
4522 }
4523 return chip_number;
4524}
4525
4526
4527
4528
4529
4530
4531
4532static int __init cy_detect_isa(void)
4533{
4534#ifdef CONFIG_ISA
4535 unsigned short cy_isa_irq, nboard;
4536 void __iomem *cy_isa_address;
4537 unsigned short i, j, cy_isa_nchan;
4538#ifdef MODULE
4539 int isparam = 0;
4540#endif
4541
4542 nboard = 0;
4543
4544#ifdef MODULE
4545
4546 for (i = 0; i < NR_CARDS; i++) {
4547 if (maddr[i] || i) {
4548 isparam = 1;
4549 cy_isa_addresses[i] = maddr[i];
4550 }
4551 if (!maddr[i])
4552 break;
4553 }
4554#endif
4555
4556
4557 for (i = 0; i < NR_ISA_ADDRS; i++) {
4558 unsigned int isa_address = cy_isa_addresses[i];
4559 if (isa_address == 0x0000)
4560 return nboard;
4561
4562
4563 cy_isa_address = ioremap_nocache(isa_address, CyISA_Ywin);
4564 if (cy_isa_address == NULL) {
4565 printk(KERN_ERR "Cyclom-Y/ISA: can't remap base "
4566 "address\n");
4567 continue;
4568 }
4569 cy_isa_nchan = CyPORTS_PER_CHIP *
4570 cyy_init_card(cy_isa_address, 0);
4571 if (cy_isa_nchan == 0) {
4572 iounmap(cy_isa_address);
4573 continue;
4574 }
4575#ifdef MODULE
4576 if (isparam && irq[i])
4577 cy_isa_irq = irq[i];
4578 else
4579#endif
4580
4581 cy_isa_irq = detect_isa_irq(cy_isa_address);
4582 if (cy_isa_irq == 0) {
4583 printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but the "
4584 "IRQ could not be detected.\n",
4585 (unsigned long)cy_isa_address);
4586 iounmap(cy_isa_address);
4587 continue;
4588 }
4589
4590 if ((cy_next_channel + cy_isa_nchan) > NR_PORTS) {
4591 printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but no "
4592 "more channels are available. Change NR_PORTS "
4593 "in cyclades.c and recompile kernel.\n",
4594 (unsigned long)cy_isa_address);
4595 iounmap(cy_isa_address);
4596 return nboard;
4597 }
4598
4599 for (j = 0; j < NR_CARDS; j++) {
4600 if (cy_card[j].base_addr == NULL)
4601 break;
4602 }
4603 if (j == NR_CARDS) {
4604 printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but no "
4605 "more cards can be used. Change NR_CARDS in "
4606 "cyclades.c and recompile kernel.\n",
4607 (unsigned long)cy_isa_address);
4608 iounmap(cy_isa_address);
4609 return nboard;
4610 }
4611
4612
4613 if (request_irq(cy_isa_irq, cyy_interrupt,
4614 IRQF_DISABLED, "Cyclom-Y", &cy_card[j])) {
4615 printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but "
4616 "could not allocate IRQ#%d.\n",
4617 (unsigned long)cy_isa_address, cy_isa_irq);
4618 iounmap(cy_isa_address);
4619 return nboard;
4620 }
4621
4622
4623 cy_card[j].base_addr = cy_isa_address;
4624 cy_card[j].ctl_addr = NULL;
4625 cy_card[j].irq = (int)cy_isa_irq;
4626 cy_card[j].bus_index = 0;
4627 cy_card[j].first_line = cy_next_channel;
4628 cy_card[j].num_chips = cy_isa_nchan / 4;
4629 if (cy_init_card(&cy_card[j])) {
4630 cy_card[j].base_addr = NULL;
4631 free_irq(cy_isa_irq, &cy_card[j]);
4632 iounmap(cy_isa_address);
4633 continue;
4634 }
4635 nboard++;
4636
4637 printk(KERN_INFO "Cyclom-Y/ISA #%d: 0x%lx-0x%lx, IRQ%d found: "
4638 "%d channels starting from port %d\n",
4639 j + 1, (unsigned long)cy_isa_address,
4640 (unsigned long)(cy_isa_address + (CyISA_Ywin - 1)),
4641 cy_isa_irq, cy_isa_nchan, cy_next_channel);
4642
4643 for (j = cy_next_channel;
4644 j < cy_next_channel + cy_isa_nchan; j++)
4645 tty_register_device(cy_serial_driver, j, NULL);
4646 cy_next_channel += cy_isa_nchan;
4647 }
4648 return nboard;
4649#else
4650 return 0;
4651#endif
4652}
4653
4654#ifdef CONFIG_PCI
4655static inline int __devinit cyc_isfwstr(const char *str, unsigned int size)
4656{
4657 unsigned int a;
4658
4659 for (a = 0; a < size && *str; a++, str++)
4660 if (*str & 0x80)
4661 return -EINVAL;
4662
4663 for (; a < size; a++, str++)
4664 if (*str)
4665 return -EINVAL;
4666
4667 return 0;
4668}
4669
4670static inline void __devinit cyz_fpga_copy(void __iomem *fpga, const u8 *data,
4671 unsigned int size)
4672{
4673 for (; size > 0; size--) {
4674 cy_writel(fpga, *data++);
4675 udelay(10);
4676 }
4677}
4678
4679static void __devinit plx_init(struct pci_dev *pdev, int irq,
4680 struct RUNTIME_9060 __iomem *addr)
4681{
4682
4683 cy_writel(&addr->init_ctrl, readl(&addr->init_ctrl) | 0x40000000);
4684 udelay(100L);
4685 cy_writel(&addr->init_ctrl, readl(&addr->init_ctrl) & ~0x40000000);
4686
4687
4688 cy_writel(&addr->init_ctrl, readl(&addr->init_ctrl) | 0x20000000);
4689 udelay(100L);
4690 cy_writel(&addr->init_ctrl, readl(&addr->init_ctrl) & ~0x20000000);
4691
4692
4693
4694
4695
4696 pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, irq);
4697}
4698
4699static int __devinit __cyz_load_fw(const struct firmware *fw,
4700 const char *name, const u32 mailbox, void __iomem *base,
4701 void __iomem *fpga)
4702{
4703 const void *ptr = fw->data;
4704 const struct zfile_header *h = ptr;
4705 const struct zfile_config *c, *cs;
4706 const struct zfile_block *b, *bs;
4707 unsigned int a, tmp, len = fw->size;
4708#define BAD_FW KERN_ERR "Bad firmware: "
4709 if (len < sizeof(*h)) {
4710 printk(BAD_FW "too short: %u<%zu\n", len, sizeof(*h));
4711 return -EINVAL;
4712 }
4713
4714 cs = ptr + h->config_offset;
4715 bs = ptr + h->block_offset;
4716
4717 if ((void *)(cs + h->n_config) > ptr + len ||
4718 (void *)(bs + h->n_blocks) > ptr + len) {
4719 printk(BAD_FW "too short");
4720 return -EINVAL;
4721 }
4722
4723 if (cyc_isfwstr(h->name, sizeof(h->name)) ||
4724 cyc_isfwstr(h->date, sizeof(h->date))) {
4725 printk(BAD_FW "bad formatted header string\n");
4726 return -EINVAL;
4727 }
4728
4729 if (strncmp(name, h->name, sizeof(h->name))) {
4730 printk(BAD_FW "bad name '%s' (expected '%s')\n", h->name, name);
4731 return -EINVAL;
4732 }
4733
4734 tmp = 0;
4735 for (c = cs; c < cs + h->n_config; c++) {
4736 for (a = 0; a < c->n_blocks; a++)
4737 if (c->block_list[a] > h->n_blocks) {
4738 printk(BAD_FW "bad block ref number in cfgs\n");
4739 return -EINVAL;
4740 }
4741 if (c->mailbox == mailbox && c->function == 0)
4742 tmp++;
4743 }
4744 if (!tmp) {
4745 printk(BAD_FW "nothing appropriate\n");
4746 return -EINVAL;
4747 }
4748
4749 for (b = bs; b < bs + h->n_blocks; b++)
4750 if (b->file_offset + b->size > len) {
4751 printk(BAD_FW "bad block data offset\n");
4752 return -EINVAL;
4753 }
4754
4755
4756 for (c = cs; c < cs + h->n_config; c++)
4757 if (c->mailbox == mailbox && c->function == 0)
4758 break;
4759
4760 for (a = 0; a < c->n_blocks; a++) {
4761 b = &bs[c->block_list[a]];
4762 if (b->type == ZBLOCK_FPGA) {
4763 if (fpga != NULL)
4764 cyz_fpga_copy(fpga, ptr + b->file_offset,
4765 b->size);
4766 } else {
4767 if (base != NULL)
4768 memcpy_toio(base + b->ram_offset,
4769 ptr + b->file_offset, b->size);
4770 }
4771 }
4772#undef BAD_FW
4773 return 0;
4774}
4775
4776static int __devinit cyz_load_fw(struct pci_dev *pdev, void __iomem *base_addr,
4777 struct RUNTIME_9060 __iomem *ctl_addr, int irq)
4778{
4779 const struct firmware *fw;
4780 struct FIRM_ID __iomem *fid = base_addr + ID_ADDRESS;
4781 struct CUSTOM_REG __iomem *cust = base_addr;
4782 struct ZFW_CTRL __iomem *pt_zfwctrl;
4783 void __iomem *tmp;
4784 u32 mailbox, status;
4785 unsigned int i;
4786 int retval;
4787
4788 retval = request_firmware(&fw, "cyzfirm.bin", &pdev->dev);
4789 if (retval) {
4790 dev_err(&pdev->dev, "can't get firmware\n");
4791 goto err;
4792 }
4793
4794
4795
4796 if (Z_FPGA_LOADED(ctl_addr) && readl(&fid->signature) == ZFIRM_ID) {
4797 u32 cntval = readl(base_addr + 0x190);
4798
4799 udelay(100);
4800 if (cntval != readl(base_addr + 0x190)) {
4801
4802 dev_dbg(&pdev->dev, "Cyclades-Z FW already loaded. "
4803 "Skipping board.\n");
4804 retval = 0;
4805 goto err_rel;
4806 }
4807 }
4808
4809
4810 cy_writel(&ctl_addr->intr_ctrl_stat, readl(&ctl_addr->intr_ctrl_stat) &
4811 ~0x00030800UL);
4812
4813 mailbox = readl(&ctl_addr->mail_box_0);
4814
4815 if (mailbox == 0 || Z_FPGA_LOADED(ctl_addr)) {
4816
4817 cy_writel(&ctl_addr->loc_addr_base, WIN_CREG);
4818 cy_writel(&cust->cpu_stop, 0);
4819 cy_writel(&ctl_addr->loc_addr_base, WIN_RAM);
4820 udelay(100);
4821 }
4822
4823 plx_init(pdev, irq, ctl_addr);
4824
4825 if (mailbox != 0) {
4826
4827 retval = __cyz_load_fw(fw, "Cyclom-Z", mailbox, NULL,
4828 base_addr);
4829 if (retval)
4830 goto err_rel;
4831 if (!Z_FPGA_LOADED(ctl_addr)) {
4832 dev_err(&pdev->dev, "fw upload successful, but fw is "
4833 "not loaded\n");
4834 goto err_rel;
4835 }
4836 }
4837
4838
4839 cy_writel(&ctl_addr->loc_addr_base, WIN_CREG);
4840 cy_writel(&cust->cpu_stop, 0);
4841 cy_writel(&ctl_addr->loc_addr_base, WIN_RAM);
4842 udelay(100);
4843
4844
4845 for (tmp = base_addr; tmp < base_addr + RAM_SIZE; tmp++)
4846 cy_writeb(tmp, 255);
4847 if (mailbox != 0) {
4848
4849 cy_writel(&ctl_addr->loc_addr_base, WIN_RAM + RAM_SIZE);
4850 for (tmp = base_addr; tmp < base_addr + RAM_SIZE; tmp++)
4851 cy_writeb(tmp, 255);
4852
4853 cy_writel(&ctl_addr->loc_addr_base, WIN_RAM);
4854 }
4855
4856 retval = __cyz_load_fw(fw, "Cyclom-Z", mailbox, base_addr, NULL);
4857 release_firmware(fw);
4858 if (retval)
4859 goto err;
4860
4861
4862 cy_writel(&ctl_addr->loc_addr_base, WIN_CREG);
4863 cy_writel(&cust->cpu_start, 0);
4864 cy_writel(&ctl_addr->loc_addr_base, WIN_RAM);
4865 i = 0;
4866 while ((status = readl(&fid->signature)) != ZFIRM_ID && i++ < 40)
4867 msleep(100);
4868 if (status != ZFIRM_ID) {
4869 if (status == ZFIRM_HLT) {
4870 dev_err(&pdev->dev, "you need an external power supply "
4871 "for this number of ports. Firmware halted and "
4872 "board reset.\n");
4873 retval = -EIO;
4874 goto err;
4875 }
4876 dev_warn(&pdev->dev, "fid->signature = 0x%x... Waiting "
4877 "some more time\n", status);
4878 while ((status = readl(&fid->signature)) != ZFIRM_ID &&
4879 i++ < 200)
4880 msleep(100);
4881 if (status != ZFIRM_ID) {
4882 dev_err(&pdev->dev, "Board not started in 20 seconds! "
4883 "Giving up. (fid->signature = 0x%x)\n",
4884 status);
4885 dev_info(&pdev->dev, "*** Warning ***: if you are "
4886 "upgrading the FW, please power cycle the "
4887 "system before loading the new FW to the "
4888 "Cyclades-Z.\n");
4889
4890 if (Z_FPGA_LOADED(ctl_addr))
4891 plx_init(pdev, irq, ctl_addr);
4892
4893 retval = -EIO;
4894 goto err;
4895 }
4896 dev_dbg(&pdev->dev, "Firmware started after %d seconds.\n",
4897 i / 10);
4898 }
4899 pt_zfwctrl = base_addr + readl(&fid->zfwctrl_addr);
4900
4901 dev_dbg(&pdev->dev, "fid=> %p, zfwctrl_addr=> %x, npt_zfwctrl=> %p\n",
4902 base_addr + ID_ADDRESS, readl(&fid->zfwctrl_addr),
4903 base_addr + readl(&fid->zfwctrl_addr));
4904
4905 dev_info(&pdev->dev, "Cyclades-Z FW loaded: version = %x, ports = %u\n",
4906 readl(&pt_zfwctrl->board_ctrl.fw_version),
4907 readl(&pt_zfwctrl->board_ctrl.n_channel));
4908
4909 if (readl(&pt_zfwctrl->board_ctrl.n_channel) == 0) {
4910 dev_warn(&pdev->dev, "no Cyclades-Z ports were found. Please "
4911 "check the connection between the Z host card and the "
4912 "serial expanders.\n");
4913
4914 if (Z_FPGA_LOADED(ctl_addr))
4915 plx_init(pdev, irq, ctl_addr);
4916
4917 dev_info(&pdev->dev, "Null number of ports detected. Board "
4918 "reset.\n");
4919 retval = 0;
4920 goto err;
4921 }
4922
4923 cy_writel(&pt_zfwctrl->board_ctrl.op_system, C_OS_LINUX);
4924 cy_writel(&pt_zfwctrl->board_ctrl.dr_version, DRIVER_VERSION);
4925
4926
4927
4928
4929
4930 cy_writel(&ctl_addr->intr_ctrl_stat, readl(&ctl_addr->intr_ctrl_stat) |
4931 (1 << 17));
4932 cy_writel(&ctl_addr->intr_ctrl_stat, readl(&ctl_addr->intr_ctrl_stat) |
4933 0x00030800UL);
4934
4935 plx_init(pdev, irq, ctl_addr);
4936
4937 return 0;
4938err_rel:
4939 release_firmware(fw);
4940err:
4941 return retval;
4942}
4943
4944static int __devinit cy_pci_probe(struct pci_dev *pdev,
4945 const struct pci_device_id *ent)
4946{
4947 void __iomem *addr0 = NULL, *addr2 = NULL;
4948 char *card_name = NULL;
4949 u32 mailbox;
4950 unsigned int device_id, nchan = 0, card_no, i;
4951 unsigned char plx_ver;
4952 int retval, irq;
4953
4954 retval = pci_enable_device(pdev);
4955 if (retval) {
4956 dev_err(&pdev->dev, "cannot enable device\n");
4957 goto err;
4958 }
4959
4960
4961 irq = pdev->irq;
4962 device_id = pdev->device & ~PCI_DEVICE_ID_MASK;
4963
4964#if defined(__alpha__)
4965 if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo) {
4966 dev_err(&pdev->dev, "Cyclom-Y/PCI not supported for low "
4967 "addresses on Alpha systems.\n");
4968 retval = -EIO;
4969 goto err_dis;
4970 }
4971#endif
4972 if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Lo) {
4973 dev_err(&pdev->dev, "Cyclades-Z/PCI not supported for low "
4974 "addresses\n");
4975 retval = -EIO;
4976 goto err_dis;
4977 }
4978
4979 if (pci_resource_flags(pdev, 2) & IORESOURCE_IO) {
4980 dev_warn(&pdev->dev, "PCI I/O bit incorrectly set. Ignoring "
4981 "it...\n");
4982 pdev->resource[2].flags &= ~IORESOURCE_IO;
4983 }
4984
4985 retval = pci_request_regions(pdev, "cyclades");
4986 if (retval) {
4987 dev_err(&pdev->dev, "failed to reserve resources\n");
4988 goto err_dis;
4989 }
4990
4991 retval = -EIO;
4992 if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
4993 device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
4994 card_name = "Cyclom-Y";
4995
4996 addr0 = ioremap_nocache(pci_resource_start(pdev, 0),
4997 CyPCI_Yctl);
4998 if (addr0 == NULL) {
4999 dev_err(&pdev->dev, "can't remap ctl region\n");
5000 goto err_reg;
5001 }
5002 addr2 = ioremap_nocache(pci_resource_start(pdev, 2),
5003 CyPCI_Ywin);
5004 if (addr2 == NULL) {
5005 dev_err(&pdev->dev, "can't remap base region\n");
5006 goto err_unmap;
5007 }
5008
5009 nchan = CyPORTS_PER_CHIP * cyy_init_card(addr2, 1);
5010 if (nchan == 0) {
5011 dev_err(&pdev->dev, "Cyclom-Y PCI host card with no "
5012 "Serial-Modules\n");
5013 return -EIO;
5014 }
5015 } else if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Hi) {
5016 struct RUNTIME_9060 __iomem *ctl_addr;
5017
5018 ctl_addr = addr0 = ioremap_nocache(pci_resource_start(pdev, 0),
5019 CyPCI_Zctl);
5020 if (addr0 == NULL) {
5021 dev_err(&pdev->dev, "can't remap ctl region\n");
5022 goto err_reg;
5023 }
5024
5025
5026 cy_writew(addr0 + 0x68, readw(addr0 + 0x68) & ~0x0900);
5027
5028 plx_init(pdev, irq, addr0);
5029
5030 mailbox = (u32)readl(&ctl_addr->mail_box_0);
5031
5032 addr2 = ioremap_nocache(pci_resource_start(pdev, 2),
5033 mailbox == ZE_V1 ? CyPCI_Ze_win : CyPCI_Zwin);
5034 if (addr2 == NULL) {
5035 dev_err(&pdev->dev, "can't remap base region\n");
5036 goto err_unmap;
5037 }
5038
5039 if (mailbox == ZE_V1) {
5040 card_name = "Cyclades-Ze";
5041
5042 readl(&ctl_addr->mail_box_0);
5043 nchan = ZE_V1_NPORTS;
5044 } else {
5045 card_name = "Cyclades-8Zo";
5046
5047#ifdef CY_PCI_DEBUG
5048 if (mailbox == ZO_V1) {
5049 cy_writel(&ctl_addr->loc_addr_base, WIN_CREG);
5050 dev_info(&pdev->dev, "Cyclades-8Zo/PCI: FPGA "
5051 "id %lx, ver %lx\n", (ulong)(0xff &
5052 readl(&((struct CUSTOM_REG *)addr2)->
5053 fpga_id)), (ulong)(0xff &
5054 readl(&((struct CUSTOM_REG *)addr2)->
5055 fpga_version)));
5056 cy_writel(&c