1
2
3
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#define HFC_MULTI_VERSION "2.03"
166
167#include <linux/interrupt.h>
168#include <linux/module.h>
169#include <linux/slab.h>
170#include <linux/pci.h>
171#include <linux/delay.h>
172#include <linux/mISDNhw.h>
173#include <linux/mISDNdsp.h>
174
175
176
177
178
179
180#include "hfc_multi.h"
181#ifdef ECHOPREP
182#include "gaintab.h"
183#endif
184
185#define MAX_CARDS 8
186#define MAX_PORTS (8 * MAX_CARDS)
187#define MAX_FRAGS (32 * MAX_CARDS)
188
189static LIST_HEAD(HFClist);
190static spinlock_t HFClock;
191
192static void ph_state_change(struct dchannel *);
193
194static struct hfc_multi *syncmaster;
195static int plxsd_master;
196static spinlock_t plx_lock;
197
198#define TYP_E1 1
199#define TYP_4S 4
200#define TYP_8S 8
201
202static int poll_timer = 6;
203
204static int nt_t1_count[] = { 3840, 1920, 960, 480, 240, 120, 60, 30 };
205#define CLKDEL_TE 0x0f
206#define CLKDEL_NT 0x6c
207
208
209#define DIP_4S 0x1
210#define DIP_8S 0x2
211#define DIP_E1 0x3
212
213
214
215
216
217static uint type[MAX_CARDS];
218static int pcm[MAX_CARDS];
219static uint dmask[MAX_CARDS];
220static uint bmask[MAX_FRAGS];
221static uint iomode[MAX_CARDS];
222static uint port[MAX_PORTS];
223static uint debug;
224static uint poll;
225static int clock;
226static uint timer;
227static uint clockdelay_te = CLKDEL_TE;
228static uint clockdelay_nt = CLKDEL_NT;
229#define HWID_NONE 0
230#define HWID_MINIP4 1
231#define HWID_MINIP8 2
232#define HWID_MINIP16 3
233static uint hwid = HWID_NONE;
234
235static int HFC_cnt, E1_cnt, bmask_cnt, Port_cnt, PCM_cnt = 99;
236
237MODULE_AUTHOR("Andreas Eversberg");
238MODULE_LICENSE("GPL");
239MODULE_VERSION(HFC_MULTI_VERSION);
240module_param(debug, uint, S_IRUGO | S_IWUSR);
241module_param(poll, uint, S_IRUGO | S_IWUSR);
242module_param(clock, int, S_IRUGO | S_IWUSR);
243module_param(timer, uint, S_IRUGO | S_IWUSR);
244module_param(clockdelay_te, uint, S_IRUGO | S_IWUSR);
245module_param(clockdelay_nt, uint, S_IRUGO | S_IWUSR);
246module_param_array(type, uint, NULL, S_IRUGO | S_IWUSR);
247module_param_array(pcm, int, NULL, S_IRUGO | S_IWUSR);
248module_param_array(dmask, uint, NULL, S_IRUGO | S_IWUSR);
249module_param_array(bmask, uint, NULL, S_IRUGO | S_IWUSR);
250module_param_array(iomode, uint, NULL, S_IRUGO | S_IWUSR);
251module_param_array(port, uint, NULL, S_IRUGO | S_IWUSR);
252module_param(hwid, uint, S_IRUGO | S_IWUSR);
253
254#ifdef HFC_REGISTER_DEBUG
255#define HFC_outb(hc, reg, val) \
256 (hc->HFC_outb(hc, reg, val, __func__, __LINE__))
257#define HFC_outb_nodebug(hc, reg, val) \
258 (hc->HFC_outb_nodebug(hc, reg, val, __func__, __LINE__))
259#define HFC_inb(hc, reg) \
260 (hc->HFC_inb(hc, reg, __func__, __LINE__))
261#define HFC_inb_nodebug(hc, reg) \
262 (hc->HFC_inb_nodebug(hc, reg, __func__, __LINE__))
263#define HFC_inw(hc, reg) \
264 (hc->HFC_inw(hc, reg, __func__, __LINE__))
265#define HFC_inw_nodebug(hc, reg) \
266 (hc->HFC_inw_nodebug(hc, reg, __func__, __LINE__))
267#define HFC_wait(hc) \
268 (hc->HFC_wait(hc, __func__, __LINE__))
269#define HFC_wait_nodebug(hc) \
270 (hc->HFC_wait_nodebug(hc, __func__, __LINE__))
271#else
272#define HFC_outb(hc, reg, val) (hc->HFC_outb(hc, reg, val))
273#define HFC_outb_nodebug(hc, reg, val) (hc->HFC_outb_nodebug(hc, reg, val))
274#define HFC_inb(hc, reg) (hc->HFC_inb(hc, reg))
275#define HFC_inb_nodebug(hc, reg) (hc->HFC_inb_nodebug(hc, reg))
276#define HFC_inw(hc, reg) (hc->HFC_inw(hc, reg))
277#define HFC_inw_nodebug(hc, reg) (hc->HFC_inw_nodebug(hc, reg))
278#define HFC_wait(hc) (hc->HFC_wait(hc))
279#define HFC_wait_nodebug(hc) (hc->HFC_wait_nodebug(hc))
280#endif
281
282#ifdef CONFIG_MISDN_HFCMULTI_8xx
283#include "hfc_multi_8xx.h"
284#endif
285
286
287static void
288#ifdef HFC_REGISTER_DEBUG
289HFC_outb_pcimem(struct hfc_multi *hc, u_char reg, u_char val,
290 const char *function, int line)
291#else
292 HFC_outb_pcimem(struct hfc_multi *hc, u_char reg, u_char val)
293#endif
294{
295 writeb(val, hc->pci_membase + reg);
296}
297static u_char
298#ifdef HFC_REGISTER_DEBUG
299HFC_inb_pcimem(struct hfc_multi *hc, u_char reg, const char *function, int line)
300#else
301 HFC_inb_pcimem(struct hfc_multi *hc, u_char reg)
302#endif
303{
304 return readb(hc->pci_membase + reg);
305}
306static u_short
307#ifdef HFC_REGISTER_DEBUG
308HFC_inw_pcimem(struct hfc_multi *hc, u_char reg, const char *function, int line)
309#else
310 HFC_inw_pcimem(struct hfc_multi *hc, u_char reg)
311#endif
312{
313 return readw(hc->pci_membase + reg);
314}
315static void
316#ifdef HFC_REGISTER_DEBUG
317HFC_wait_pcimem(struct hfc_multi *hc, const char *function, int line)
318#else
319 HFC_wait_pcimem(struct hfc_multi *hc)
320#endif
321{
322 while (readb(hc->pci_membase + R_STATUS) & V_BUSY)
323 cpu_relax();
324}
325
326
327static void
328#ifdef HFC_REGISTER_DEBUG
329HFC_outb_regio(struct hfc_multi *hc, u_char reg, u_char val,
330 const char *function, int line)
331#else
332 HFC_outb_regio(struct hfc_multi *hc, u_char reg, u_char val)
333#endif
334{
335 outb(reg, hc->pci_iobase + 4);
336 outb(val, hc->pci_iobase);
337}
338static u_char
339#ifdef HFC_REGISTER_DEBUG
340HFC_inb_regio(struct hfc_multi *hc, u_char reg, const char *function, int line)
341#else
342 HFC_inb_regio(struct hfc_multi *hc, u_char reg)
343#endif
344{
345 outb(reg, hc->pci_iobase + 4);
346 return inb(hc->pci_iobase);
347}
348static u_short
349#ifdef HFC_REGISTER_DEBUG
350HFC_inw_regio(struct hfc_multi *hc, u_char reg, const char *function, int line)
351#else
352 HFC_inw_regio(struct hfc_multi *hc, u_char reg)
353#endif
354{
355 outb(reg, hc->pci_iobase + 4);
356 return inw(hc->pci_iobase);
357}
358static void
359#ifdef HFC_REGISTER_DEBUG
360HFC_wait_regio(struct hfc_multi *hc, const char *function, int line)
361#else
362 HFC_wait_regio(struct hfc_multi *hc)
363#endif
364{
365 outb(R_STATUS, hc->pci_iobase + 4);
366 while (inb(hc->pci_iobase) & V_BUSY)
367 cpu_relax();
368}
369
370#ifdef HFC_REGISTER_DEBUG
371static void
372HFC_outb_debug(struct hfc_multi *hc, u_char reg, u_char val,
373 const char *function, int line)
374{
375 char regname[256] = "", bits[9] = "xxxxxxxx";
376 int i;
377
378 i = -1;
379 while (hfc_register_names[++i].name) {
380 if (hfc_register_names[i].reg == reg)
381 strcat(regname, hfc_register_names[i].name);
382 }
383 if (regname[0] == '\0')
384 strcpy(regname, "register");
385
386 bits[7] = '0' + (!!(val & 1));
387 bits[6] = '0' + (!!(val & 2));
388 bits[5] = '0' + (!!(val & 4));
389 bits[4] = '0' + (!!(val & 8));
390 bits[3] = '0' + (!!(val & 16));
391 bits[2] = '0' + (!!(val & 32));
392 bits[1] = '0' + (!!(val & 64));
393 bits[0] = '0' + (!!(val & 128));
394 printk(KERN_DEBUG
395 "HFC_outb(chip %d, %02x=%s, 0x%02x=%s); in %s() line %d\n",
396 hc->id, reg, regname, val, bits, function, line);
397 HFC_outb_nodebug(hc, reg, val);
398}
399static u_char
400HFC_inb_debug(struct hfc_multi *hc, u_char reg, const char *function, int line)
401{
402 char regname[256] = "", bits[9] = "xxxxxxxx";
403 u_char val = HFC_inb_nodebug(hc, reg);
404 int i;
405
406 i = 0;
407 while (hfc_register_names[i++].name)
408 ;
409 while (hfc_register_names[++i].name) {
410 if (hfc_register_names[i].reg == reg)
411 strcat(regname, hfc_register_names[i].name);
412 }
413 if (regname[0] == '\0')
414 strcpy(regname, "register");
415
416 bits[7] = '0' + (!!(val & 1));
417 bits[6] = '0' + (!!(val & 2));
418 bits[5] = '0' + (!!(val & 4));
419 bits[4] = '0' + (!!(val & 8));
420 bits[3] = '0' + (!!(val & 16));
421 bits[2] = '0' + (!!(val & 32));
422 bits[1] = '0' + (!!(val & 64));
423 bits[0] = '0' + (!!(val & 128));
424 printk(KERN_DEBUG
425 "HFC_inb(chip %d, %02x=%s) = 0x%02x=%s; in %s() line %d\n",
426 hc->id, reg, regname, val, bits, function, line);
427 return val;
428}
429static u_short
430HFC_inw_debug(struct hfc_multi *hc, u_char reg, const char *function, int line)
431{
432 char regname[256] = "";
433 u_short val = HFC_inw_nodebug(hc, reg);
434 int i;
435
436 i = 0;
437 while (hfc_register_names[i++].name)
438 ;
439 while (hfc_register_names[++i].name) {
440 if (hfc_register_names[i].reg == reg)
441 strcat(regname, hfc_register_names[i].name);
442 }
443 if (regname[0] == '\0')
444 strcpy(regname, "register");
445
446 printk(KERN_DEBUG
447 "HFC_inw(chip %d, %02x=%s) = 0x%04x; in %s() line %d\n",
448 hc->id, reg, regname, val, function, line);
449 return val;
450}
451static void
452HFC_wait_debug(struct hfc_multi *hc, const char *function, int line)
453{
454 printk(KERN_DEBUG "HFC_wait(chip %d); in %s() line %d\n",
455 hc->id, function, line);
456 HFC_wait_nodebug(hc);
457}
458#endif
459
460
461static void
462write_fifo_regio(struct hfc_multi *hc, u_char *data, int len)
463{
464 outb(A_FIFO_DATA0, (hc->pci_iobase) + 4);
465 while (len >> 2) {
466 outl(cpu_to_le32(*(u32 *)data), hc->pci_iobase);
467 data += 4;
468 len -= 4;
469 }
470 while (len >> 1) {
471 outw(cpu_to_le16(*(u16 *)data), hc->pci_iobase);
472 data += 2;
473 len -= 2;
474 }
475 while (len) {
476 outb(*data, hc->pci_iobase);
477 data++;
478 len--;
479 }
480}
481
482static void
483write_fifo_pcimem(struct hfc_multi *hc, u_char *data, int len)
484{
485 while (len >> 2) {
486 writel(cpu_to_le32(*(u32 *)data),
487 hc->pci_membase + A_FIFO_DATA0);
488 data += 4;
489 len -= 4;
490 }
491 while (len >> 1) {
492 writew(cpu_to_le16(*(u16 *)data),
493 hc->pci_membase + A_FIFO_DATA0);
494 data += 2;
495 len -= 2;
496 }
497 while (len) {
498 writeb(*data, hc->pci_membase + A_FIFO_DATA0);
499 data++;
500 len--;
501 }
502}
503
504
505static void
506read_fifo_regio(struct hfc_multi *hc, u_char *data, int len)
507{
508 outb(A_FIFO_DATA0, (hc->pci_iobase) + 4);
509 while (len >> 2) {
510 *(u32 *)data = le32_to_cpu(inl(hc->pci_iobase));
511 data += 4;
512 len -= 4;
513 }
514 while (len >> 1) {
515 *(u16 *)data = le16_to_cpu(inw(hc->pci_iobase));
516 data += 2;
517 len -= 2;
518 }
519 while (len) {
520 *data = inb(hc->pci_iobase);
521 data++;
522 len--;
523 }
524}
525
526
527static void
528read_fifo_pcimem(struct hfc_multi *hc, u_char *data, int len)
529{
530 while (len >> 2) {
531 *(u32 *)data =
532 le32_to_cpu(readl(hc->pci_membase + A_FIFO_DATA0));
533 data += 4;
534 len -= 4;
535 }
536 while (len >> 1) {
537 *(u16 *)data =
538 le16_to_cpu(readw(hc->pci_membase + A_FIFO_DATA0));
539 data += 2;
540 len -= 2;
541 }
542 while (len) {
543 *data = readb(hc->pci_membase + A_FIFO_DATA0);
544 data++;
545 len--;
546 }
547}
548
549static void
550enable_hwirq(struct hfc_multi *hc)
551{
552 hc->hw.r_irq_ctrl |= V_GLOB_IRQ_EN;
553 HFC_outb(hc, R_IRQ_CTRL, hc->hw.r_irq_ctrl);
554}
555
556static void
557disable_hwirq(struct hfc_multi *hc)
558{
559 hc->hw.r_irq_ctrl &= ~((u_char)V_GLOB_IRQ_EN);
560 HFC_outb(hc, R_IRQ_CTRL, hc->hw.r_irq_ctrl);
561}
562
563#define NUM_EC 2
564#define MAX_TDM_CHAN 32
565
566
567static inline void
568enablepcibridge(struct hfc_multi *c)
569{
570 HFC_outb(c, R_BRG_PCM_CFG, (0x0 << 6) | 0x3);
571}
572
573static inline void
574disablepcibridge(struct hfc_multi *c)
575{
576 HFC_outb(c, R_BRG_PCM_CFG, (0x0 << 6) | 0x2);
577}
578
579static inline unsigned char
580readpcibridge(struct hfc_multi *hc, unsigned char address)
581{
582 unsigned short cipv;
583 unsigned char data;
584
585 if (!hc->pci_iobase)
586 return 0;
587
588
589 HFC_outb(hc, R_CTRL, 0x4);
590
591 if (address == 0)
592 cipv = 0x4000;
593 else
594 cipv = 0x5800;
595
596
597
598 outw(cipv, hc->pci_iobase + 4);
599 data = inb(hc->pci_iobase);
600
601
602 HFC_outb(hc, R_CTRL, 0x0);
603
604 return data;
605}
606
607static inline void
608writepcibridge(struct hfc_multi *hc, unsigned char address, unsigned char data)
609{
610 unsigned short cipv;
611 unsigned int datav;
612
613 if (!hc->pci_iobase)
614 return;
615
616 if (address == 0)
617 cipv = 0x4000;
618 else
619 cipv = 0x5800;
620
621
622 outw(cipv, hc->pci_iobase + 4);
623
624 datav = data | ((__u32) data << 8) | ((__u32) data << 16) |
625 ((__u32) data << 24);
626
627
628
629
630
631
632
633
634 outl(datav, hc->pci_iobase);
635}
636
637static inline void
638cpld_set_reg(struct hfc_multi *hc, unsigned char reg)
639{
640
641 HFC_outb(hc, R_GPIO_OUT1, reg);
642}
643
644static inline void
645cpld_write_reg(struct hfc_multi *hc, unsigned char reg, unsigned char val)
646{
647 cpld_set_reg(hc, reg);
648
649 enablepcibridge(hc);
650 writepcibridge(hc, 1, val);
651 disablepcibridge(hc);
652
653 return;
654}
655
656static inline unsigned char
657cpld_read_reg(struct hfc_multi *hc, unsigned char reg)
658{
659 unsigned char bytein;
660
661 cpld_set_reg(hc, reg);
662
663
664 HFC_outb(hc, R_GPIO_OUT1, reg);
665
666 enablepcibridge(hc);
667 bytein = readpcibridge(hc, 1);
668 disablepcibridge(hc);
669
670 return bytein;
671}
672
673static inline void
674vpm_write_address(struct hfc_multi *hc, unsigned short addr)
675{
676 cpld_write_reg(hc, 0, 0xff & addr);
677 cpld_write_reg(hc, 1, 0x01 & (addr >> 8));
678}
679
680static inline unsigned short
681vpm_read_address(struct hfc_multi *c)
682{
683 unsigned short addr;
684 unsigned short highbit;
685
686 addr = cpld_read_reg(c, 0);
687 highbit = cpld_read_reg(c, 1);
688
689 addr = addr | (highbit << 8);
690
691 return addr & 0x1ff;
692}
693
694static inline unsigned char
695vpm_in(struct hfc_multi *c, int which, unsigned short addr)
696{
697 unsigned char res;
698
699 vpm_write_address(c, addr);
700
701 if (!which)
702 cpld_set_reg(c, 2);
703 else
704 cpld_set_reg(c, 3);
705
706 enablepcibridge(c);
707 res = readpcibridge(c, 1);
708 disablepcibridge(c);
709
710 cpld_set_reg(c, 0);
711
712 return res;
713}
714
715static inline void
716vpm_out(struct hfc_multi *c, int which, unsigned short addr,
717 unsigned char data)
718{
719 vpm_write_address(c, addr);
720
721 enablepcibridge(c);
722
723 if (!which)
724 cpld_set_reg(c, 2);
725 else
726 cpld_set_reg(c, 3);
727
728 writepcibridge(c, 1, data);
729
730 cpld_set_reg(c, 0);
731
732 disablepcibridge(c);
733
734 {
735 unsigned char regin;
736 regin = vpm_in(c, which, addr);
737 if (regin != data)
738 printk(KERN_DEBUG "Wrote 0x%x to register 0x%x but got back "
739 "0x%x\n", data, addr, regin);
740 }
741
742}
743
744
745static void
746vpm_init(struct hfc_multi *wc)
747{
748 unsigned char reg;
749 unsigned int mask;
750 unsigned int i, x, y;
751 unsigned int ver;
752
753 for (x = 0; x < NUM_EC; x++) {
754
755 if (!x) {
756 ver = vpm_in(wc, x, 0x1a0);
757 printk(KERN_DEBUG "VPM: Chip %d: ver %02x\n", x, ver);
758 }
759
760 for (y = 0; y < 4; y++) {
761 vpm_out(wc, x, 0x1a8 + y, 0x00);
762 vpm_out(wc, x, 0x1ac + y, 0x00);
763 vpm_out(wc, x, 0x1b0 + y, 0x00);
764 }
765
766
767 reg = vpm_in(wc, x, 0x1a3);
768 vpm_out(wc, x, 0x1a3, reg & ~2);
769
770
771 vpm_out(wc, x, 0x022, 1);
772 vpm_out(wc, x, 0x023, 0xff);
773
774
775 vpm_out(wc, x, 0x02f, 0x00);
776 mask = 0x02020202 << (x * 4);
777
778
779 for (i = 0; i < 4; i++)
780 vpm_out(wc, x, 0x33 - i, (mask >> (i << 3)) & 0xff);
781
782
783 printk(KERN_DEBUG "VPM: A-law mode\n");
784 reg = 0x00 | 0x10 | 0x01;
785 vpm_out(wc, x, 0x20, reg);
786 printk(KERN_DEBUG "VPM reg 0x20 is %x\n", reg);
787
788
789 vpm_out(wc, x, 0x24, 0x02);
790 reg = vpm_in(wc, x, 0x24);
791 printk(KERN_DEBUG "NLP Thresh is set to %d (0x%x)\n", reg, reg);
792
793
794 for (i = 0; i < MAX_TDM_CHAN; i++) {
795 if (mask & (0x00000001 << i))
796 vpm_out(wc, x, i, 0x00);
797 }
798
799
800
801
802
803
804
805
806
807 udelay(2000);
808 udelay(2000);
809 udelay(2000);
810 udelay(2000);
811 udelay(2000);
812
813
814 for (i = 0; i < MAX_TDM_CHAN; i++) {
815 if (mask & (0x00000001 << i))
816 vpm_out(wc, x, i, 0x01);
817 }
818
819
820 for (i = 0; i < MAX_TDM_CHAN; i++) {
821 if (mask & (0x00000001 << i))
822 vpm_out(wc, x, 0x78 + i, 0x01);
823 }
824
825 }
826}
827
828#ifdef UNUSED
829static void
830vpm_check(struct hfc_multi *hctmp)
831{
832 unsigned char gpi2;
833
834 gpi2 = HFC_inb(hctmp, R_GPI_IN2);
835
836 if ((gpi2 & 0x3) != 0x3)
837 printk(KERN_DEBUG "Got interrupt 0x%x from VPM!\n", gpi2);
838}
839#endif
840
841
842
843
844
845
846
847
848
849
850
851
852
853static void
854vpm_echocan_on(struct hfc_multi *hc, int ch, int taps)
855{
856 unsigned int timeslot;
857 unsigned int unit;
858 struct bchannel *bch = hc->chan[ch].bch;
859#ifdef TXADJ
860 int txadj = -4;
861 struct sk_buff *skb;
862#endif
863 if (hc->chan[ch].protocol != ISDN_P_B_RAW)
864 return;
865
866 if (!bch)
867 return;
868
869#ifdef TXADJ
870 skb = _alloc_mISDN_skb(PH_CONTROL_IND, HFC_VOL_CHANGE_TX,
871 sizeof(int), &txadj, GFP_ATOMIC);
872 if (skb)
873 recv_Bchannel_skb(bch, skb);
874#endif
875
876 timeslot = ((ch / 4) * 8) + ((ch % 4) * 4) + 1;
877 unit = ch % 4;
878
879 printk(KERN_NOTICE "vpm_echocan_on called taps [%d] on timeslot %d\n",
880 taps, timeslot);
881
882 vpm_out(hc, unit, timeslot, 0x7e);
883}
884
885static void
886vpm_echocan_off(struct hfc_multi *hc, int ch)
887{
888 unsigned int timeslot;
889 unsigned int unit;
890 struct bchannel *bch = hc->chan[ch].bch;
891#ifdef TXADJ
892 int txadj = 0;
893 struct sk_buff *skb;
894#endif
895
896 if (hc->chan[ch].protocol != ISDN_P_B_RAW)
897 return;
898
899 if (!bch)
900 return;
901
902#ifdef TXADJ
903 skb = _alloc_mISDN_skb(PH_CONTROL_IND, HFC_VOL_CHANGE_TX,
904 sizeof(int), &txadj, GFP_ATOMIC);
905 if (skb)
906 recv_Bchannel_skb(bch, skb);
907#endif
908
909 timeslot = ((ch / 4) * 8) + ((ch % 4) * 4) + 1;
910 unit = ch % 4;
911
912 printk(KERN_NOTICE "vpm_echocan_off called on timeslot %d\n",
913 timeslot);
914
915 vpm_out(hc, unit, timeslot, 0x01);
916}
917
918
919
920
921
922
923
924
925static inline void
926hfcmulti_resync(struct hfc_multi *locked, struct hfc_multi *newmaster, int rm)
927{
928 struct hfc_multi *hc, *next, *pcmmaster = NULL;
929 void __iomem *plx_acc_32;
930 u_int pv;
931 u_long flags;
932
933 spin_lock_irqsave(&HFClock, flags);
934 spin_lock(&plx_lock);
935
936 if (debug & DEBUG_HFCMULTI_PLXSD)
937 printk(KERN_DEBUG "%s: RESYNC(syncmaster=0x%p)\n",
938 __func__, syncmaster);
939
940
941 if (newmaster) {
942 if (debug & DEBUG_HFCMULTI_PLXSD)
943 printk(KERN_DEBUG "using provided controller\n");
944 } else {
945 list_for_each_entry_safe(hc, next, &HFClist, list) {
946 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
947 if (hc->syncronized) {
948 newmaster = hc;
949 break;
950 }
951 }
952 }
953 }
954
955
956 list_for_each_entry_safe(hc, next, &HFClist, list) {
957 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
958 plx_acc_32 = hc->plx_membase + PLX_GPIOC;
959 pv = readl(plx_acc_32);
960 pv &= ~PLX_SYNC_O_EN;
961 writel(pv, plx_acc_32);
962 if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip)) {
963 pcmmaster = hc;
964 if (hc->ctype == HFC_TYPE_E1) {
965 if (debug & DEBUG_HFCMULTI_PLXSD)
966 printk(KERN_DEBUG
967 "Schedule SYNC_I\n");
968 hc->e1_resync |= 1;
969 }
970 }
971 }
972 }
973
974 if (newmaster) {
975 hc = newmaster;
976 if (debug & DEBUG_HFCMULTI_PLXSD)
977 printk(KERN_DEBUG "id=%d (0x%p) = syncronized with "
978 "interface.\n", hc->id, hc);
979
980 plx_acc_32 = hc->plx_membase + PLX_GPIOC;
981 pv = readl(plx_acc_32);
982 pv |= PLX_SYNC_O_EN;
983 writel(pv, plx_acc_32);
984
985 if (hc->ctype == HFC_TYPE_E1
986 && !test_bit(HFC_CHIP_RX_SYNC, &hc->chip)) {
987 if (debug & DEBUG_HFCMULTI_PLXSD)
988 printk(KERN_DEBUG "Schedule jatt PLL\n");
989 hc->e1_resync |= 2;
990 }
991 } else {
992 if (pcmmaster) {
993 hc = pcmmaster;
994 if (debug & DEBUG_HFCMULTI_PLXSD)
995 printk(KERN_DEBUG
996 "id=%d (0x%p) = PCM master syncronized "
997 "with QUARTZ\n", hc->id, hc);
998 if (hc->ctype == HFC_TYPE_E1) {
999
1000
1001 if (debug & DEBUG_HFCMULTI_PLXSD)
1002 printk(KERN_DEBUG
1003 "Schedule QUARTZ for HFC-E1\n");
1004 hc->e1_resync |= 4;
1005 } else {
1006 if (debug & DEBUG_HFCMULTI_PLXSD)
1007 printk(KERN_DEBUG
1008 "QUARTZ is automatically "
1009 "enabled by HFC-%dS\n", hc->ctype);
1010 }
1011 plx_acc_32 = hc->plx_membase + PLX_GPIOC;
1012 pv = readl(plx_acc_32);
1013 pv |= PLX_SYNC_O_EN;
1014 writel(pv, plx_acc_32);
1015 } else
1016 if (!rm)
1017 printk(KERN_ERR "%s no pcm master, this MUST "
1018 "not happen!\n", __func__);
1019 }
1020 syncmaster = newmaster;
1021
1022 spin_unlock(&plx_lock);
1023 spin_unlock_irqrestore(&HFClock, flags);
1024}
1025
1026
1027static inline void
1028plxsd_checksync(struct hfc_multi *hc, int rm)
1029{
1030 if (hc->syncronized) {
1031 if (syncmaster == NULL) {
1032 if (debug & DEBUG_HFCMULTI_PLXSD)
1033 printk(KERN_DEBUG "%s: GOT sync on card %d"
1034 " (id=%d)\n", __func__, hc->id + 1,
1035 hc->id);
1036 hfcmulti_resync(hc, hc, rm);
1037 }
1038 } else {
1039 if (syncmaster == hc) {
1040 if (debug & DEBUG_HFCMULTI_PLXSD)
1041 printk(KERN_DEBUG "%s: LOST sync on card %d"
1042 " (id=%d)\n", __func__, hc->id + 1,
1043 hc->id);
1044 hfcmulti_resync(hc, NULL, rm);
1045 }
1046 }
1047}
1048
1049
1050
1051
1052
1053static void
1054release_io_hfcmulti(struct hfc_multi *hc)
1055{
1056 void __iomem *plx_acc_32;
1057 u_int pv;
1058 u_long plx_flags;
1059
1060 if (debug & DEBUG_HFCMULTI_INIT)
1061 printk(KERN_DEBUG "%s: entered\n", __func__);
1062
1063
1064 hc->hw.r_cirm |= V_SRES;
1065 HFC_outb(hc, R_CIRM, hc->hw.r_cirm);
1066 udelay(1000);
1067 hc->hw.r_cirm &= ~V_SRES;
1068 HFC_outb(hc, R_CIRM, hc->hw.r_cirm);
1069 udelay(1000);
1070
1071
1072 if (test_bit(HFC_CHIP_PLXSD, &hc->chip) && hc->plx_membase) {
1073 if (debug & DEBUG_HFCMULTI_PLXSD)
1074 printk(KERN_DEBUG "%s: release PLXSD card %d\n",
1075 __func__, hc->id + 1);
1076 spin_lock_irqsave(&plx_lock, plx_flags);
1077 plx_acc_32 = hc->plx_membase + PLX_GPIOC;
1078 writel(PLX_GPIOC_INIT, plx_acc_32);
1079 pv = readl(plx_acc_32);
1080
1081 pv &= ~PLX_TERM_ON;
1082
1083 pv |= PLX_SLAVE_EN_N;
1084 pv &= ~PLX_MASTER_EN;
1085 pv &= ~PLX_SYNC_O_EN;
1086
1087 pv &= ~PLX_DSP_RES_N;
1088 writel(pv, plx_acc_32);
1089 if (debug & DEBUG_HFCMULTI_INIT)
1090 printk(KERN_DEBUG "%s: PCM off: PLX_GPIO=%x\n",
1091 __func__, pv);
1092 spin_unlock_irqrestore(&plx_lock, plx_flags);
1093 }
1094
1095
1096 test_and_clear_bit(HFC_CHIP_PLXSD, &hc->chip);
1097 if (hc->pci_dev)
1098 pci_write_config_word(hc->pci_dev, PCI_COMMAND, 0);
1099 if (hc->pci_membase)
1100 iounmap(hc->pci_membase);
1101 if (hc->plx_membase)
1102 iounmap(hc->plx_membase);
1103 if (hc->pci_iobase)
1104 release_region(hc->pci_iobase, 8);
1105 if (hc->xhfc_membase)
1106 iounmap((void *)hc->xhfc_membase);
1107
1108 if (hc->pci_dev) {
1109 pci_disable_device(hc->pci_dev);
1110 pci_set_drvdata(hc->pci_dev, NULL);
1111 }
1112 if (debug & DEBUG_HFCMULTI_INIT)
1113 printk(KERN_DEBUG "%s: done\n", __func__);
1114}
1115
1116
1117
1118
1119
1120
1121static int
1122init_chip(struct hfc_multi *hc)
1123{
1124 u_long flags, val, val2 = 0, rev;
1125 int i, err = 0;
1126 u_char r_conf_en, rval;
1127 void __iomem *plx_acc_32;
1128 u_int pv;
1129 u_long plx_flags, hfc_flags;
1130 int plx_count;
1131 struct hfc_multi *pos, *next, *plx_last_hc;
1132
1133 spin_lock_irqsave(&hc->lock, flags);
1134
1135 memset(&hc->hw, 0, sizeof(struct hfcm_hw));
1136
1137
1138 if (debug & DEBUG_HFCMULTI_INIT)
1139 printk(KERN_DEBUG "%s: entered\n", __func__);
1140 val = HFC_inb(hc, R_CHIP_ID);
1141 if ((val >> 4) != 0x8 && (val >> 4) != 0xc && (val >> 4) != 0xe &&
1142 (val >> 1) != 0x31) {
1143 printk(KERN_INFO "HFC_multi: unknown CHIP_ID:%x\n", (u_int)val);
1144 err = -EIO;
1145 goto out;
1146 }
1147 rev = HFC_inb(hc, R_CHIP_RV);
1148 printk(KERN_INFO
1149 "HFC_multi: detected HFC with chip ID=0x%lx revision=%ld%s\n",
1150 val, rev, (rev == 0 && (hc->ctype != HFC_TYPE_XHFC)) ?
1151 " (old FIFO handling)" : "");
1152 if (hc->ctype != HFC_TYPE_XHFC && rev == 0) {
1153 test_and_set_bit(HFC_CHIP_REVISION0, &hc->chip);
1154 printk(KERN_WARNING
1155 "HFC_multi: NOTE: Your chip is revision 0, "
1156 "ask Cologne Chip for update. Newer chips "
1157 "have a better FIFO handling. Old chips "
1158 "still work but may have slightly lower "
1159 "HDLC transmit performance.\n");
1160 }
1161 if (rev > 1) {
1162 printk(KERN_WARNING "HFC_multi: WARNING: This driver doesn't "
1163 "consider chip revision = %ld. The chip / "
1164 "bridge may not work.\n", rev);
1165 }
1166
1167
1168 hc->Flen = 0x10;
1169 hc->Zmin = 0x80;
1170 hc->Zlen = 384;
1171 hc->DTMFbase = 0x1000;
1172 if (test_bit(HFC_CHIP_EXRAM_128, &hc->chip)) {
1173 if (debug & DEBUG_HFCMULTI_INIT)
1174 printk(KERN_DEBUG "%s: changing to 128K external RAM\n",
1175 __func__);
1176 hc->hw.r_ctrl |= V_EXT_RAM;
1177 hc->hw.r_ram_sz = 1;
1178 hc->Flen = 0x20;
1179 hc->Zmin = 0xc0;
1180 hc->Zlen = 1856;
1181 hc->DTMFbase = 0x2000;
1182 }
1183 if (test_bit(HFC_CHIP_EXRAM_512, &hc->chip)) {
1184 if (debug & DEBUG_HFCMULTI_INIT)
1185 printk(KERN_DEBUG "%s: changing to 512K external RAM\n",
1186 __func__);
1187 hc->hw.r_ctrl |= V_EXT_RAM;
1188 hc->hw.r_ram_sz = 2;
1189 hc->Flen = 0x20;
1190 hc->Zmin = 0xc0;
1191 hc->Zlen = 8000;
1192 hc->DTMFbase = 0x2000;
1193 }
1194 if (hc->ctype == HFC_TYPE_XHFC) {
1195 hc->Flen = 0x8;
1196 hc->Zmin = 0x0;
1197 hc->Zlen = 64;
1198 hc->DTMFbase = 0x0;
1199 }
1200 hc->max_trans = poll << 1;
1201 if (hc->max_trans > hc->Zlen)
1202 hc->max_trans = hc->Zlen;
1203
1204
1205 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
1206 if (debug & DEBUG_HFCMULTI_PLXSD)
1207 printk(KERN_DEBUG "%s: initializing PLXSD card %d\n",
1208 __func__, hc->id + 1);
1209 spin_lock_irqsave(&plx_lock, plx_flags);
1210 plx_acc_32 = hc->plx_membase + PLX_GPIOC;
1211 writel(PLX_GPIOC_INIT, plx_acc_32);
1212 pv = readl(plx_acc_32);
1213
1214 pv |= PLX_TERM_ON;
1215
1216 pv |= PLX_SLAVE_EN_N;
1217 pv &= ~PLX_MASTER_EN;
1218 pv &= ~PLX_SYNC_O_EN;
1219
1220 pv &= ~PLX_DSP_RES_N;
1221 writel(pv, plx_acc_32);
1222 spin_unlock_irqrestore(&plx_lock, plx_flags);
1223 if (debug & DEBUG_HFCMULTI_INIT)
1224 printk(KERN_DEBUG "%s: slave/term: PLX_GPIO=%x\n",
1225 __func__, pv);
1226
1227
1228
1229
1230 spin_lock_irqsave(&HFClock, hfc_flags);
1231 plx_count = 0;
1232 plx_last_hc = NULL;
1233 list_for_each_entry_safe(pos, next, &HFClist, list) {
1234 if (test_bit(HFC_CHIP_PLXSD, &pos->chip)) {
1235 plx_count++;
1236 if (pos != hc)
1237 plx_last_hc = pos;
1238 }
1239 }
1240 if (plx_count >= 3) {
1241 if (debug & DEBUG_HFCMULTI_PLXSD)
1242 printk(KERN_DEBUG "%s: card %d is between, so "
1243 "we disable termination\n",
1244 __func__, plx_last_hc->id + 1);
1245 spin_lock_irqsave(&plx_lock, plx_flags);
1246 plx_acc_32 = plx_last_hc->plx_membase + PLX_GPIOC;
1247 pv = readl(plx_acc_32);
1248 pv &= ~PLX_TERM_ON;
1249 writel(pv, plx_acc_32);
1250 spin_unlock_irqrestore(&plx_lock, plx_flags);
1251 if (debug & DEBUG_HFCMULTI_INIT)
1252 printk(KERN_DEBUG
1253 "%s: term off: PLX_GPIO=%x\n",
1254 __func__, pv);
1255 }
1256 spin_unlock_irqrestore(&HFClock, hfc_flags);
1257 hc->hw.r_pcm_md0 = V_F0_LEN;
1258 }
1259
1260 if (test_bit(HFC_CHIP_EMBSD, &hc->chip))
1261 hc->hw.r_pcm_md0 = V_F0_LEN;
1262
1263
1264 if (!test_bit(HFC_CHIP_REVISION0, &hc->chip))
1265 hc->hw.r_ram_sz |= V_FZ_MD;
1266
1267
1268 if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip)) {
1269 if (debug & DEBUG_HFCMULTI_INIT)
1270 printk(KERN_DEBUG "%s: setting PCM into slave mode\n",
1271 __func__);
1272 } else
1273 if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip) && !plxsd_master) {
1274 if (debug & DEBUG_HFCMULTI_INIT)
1275 printk(KERN_DEBUG "%s: setting PCM into master mode\n",
1276 __func__);
1277 hc->hw.r_pcm_md0 |= V_PCM_MD;
1278 } else {
1279 if (debug & DEBUG_HFCMULTI_INIT)
1280 printk(KERN_DEBUG "%s: performing PCM auto detect\n",
1281 __func__);
1282 }
1283
1284
1285 HFC_outb(hc, R_CTRL, hc->hw.r_ctrl);
1286 if (hc->ctype == HFC_TYPE_XHFC)
1287 HFC_outb(hc, 0x0C ,
1288 0x11 );
1289 else
1290 HFC_outb(hc, R_RAM_SZ, hc->hw.r_ram_sz);
1291 HFC_outb(hc, R_FIFO_MD, 0);
1292 if (hc->ctype == HFC_TYPE_XHFC)
1293 hc->hw.r_cirm = V_SRES | V_HFCRES | V_PCMRES | V_STRES;
1294 else
1295 hc->hw.r_cirm = V_SRES | V_HFCRES | V_PCMRES | V_STRES
1296 | V_RLD_EPR;
1297 HFC_outb(hc, R_CIRM, hc->hw.r_cirm);
1298 udelay(100);
1299 hc->hw.r_cirm = 0;
1300 HFC_outb(hc, R_CIRM, hc->hw.r_cirm);
1301 udelay(100);
1302 if (hc->ctype != HFC_TYPE_XHFC)
1303 HFC_outb(hc, R_RAM_SZ, hc->hw.r_ram_sz);
1304
1305
1306 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
1307 spin_lock_irqsave(&plx_lock, plx_flags);
1308 plx_acc_32 = hc->plx_membase + PLX_GPIOC;
1309 pv = readl(plx_acc_32);
1310
1311 if (hc->hw.r_pcm_md0 & V_PCM_MD) {
1312 pv |= PLX_MASTER_EN | PLX_SLAVE_EN_N;
1313 pv |= PLX_SYNC_O_EN;
1314 if (debug & DEBUG_HFCMULTI_INIT)
1315 printk(KERN_DEBUG "%s: master: PLX_GPIO=%x\n",
1316 __func__, pv);
1317 } else {
1318 pv &= ~(PLX_MASTER_EN | PLX_SLAVE_EN_N);
1319 pv &= ~PLX_SYNC_O_EN;
1320 if (debug & DEBUG_HFCMULTI_INIT)
1321 printk(KERN_DEBUG "%s: slave: PLX_GPIO=%x\n",
1322 __func__, pv);
1323 }
1324 writel(pv, plx_acc_32);
1325 spin_unlock_irqrestore(&plx_lock, plx_flags);
1326 }
1327
1328
1329 HFC_outb(hc, R_PCM_MD0, hc->hw.r_pcm_md0 | 0x90);
1330 if (hc->slots == 32)
1331 HFC_outb(hc, R_PCM_MD1, 0x00);
1332 if (hc->slots == 64)
1333 HFC_outb(hc, R_PCM_MD1, 0x10);
1334 if (hc->slots == 128)
1335 HFC_outb(hc, R_PCM_MD1, 0x20);
1336 HFC_outb(hc, R_PCM_MD0, hc->hw.r_pcm_md0 | 0xa0);
1337 if (test_bit(HFC_CHIP_PLXSD, &hc->chip))
1338 HFC_outb(hc, R_PCM_MD2, V_SYNC_SRC);
1339 else if (test_bit(HFC_CHIP_EMBSD, &hc->chip))
1340 HFC_outb(hc, R_PCM_MD2, 0x10);
1341 else
1342 HFC_outb(hc, R_PCM_MD2, 0x00);
1343 HFC_outb(hc, R_PCM_MD0, hc->hw.r_pcm_md0 | 0x00);
1344 for (i = 0; i < 256; i++) {
1345 HFC_outb_nodebug(hc, R_SLOT, i);
1346 HFC_outb_nodebug(hc, A_SL_CFG, 0);
1347 if (hc->ctype != HFC_TYPE_XHFC)
1348 HFC_outb_nodebug(hc, A_CONF, 0);
1349 hc->slot_owner[i] = -1;
1350 }
1351
1352
1353 if (test_bit(HFC_CHIP_CLOCK2, &hc->chip)) {
1354 if (debug & DEBUG_HFCMULTI_INIT)
1355 printk(KERN_DEBUG
1356 "%s: setting double clock\n", __func__);
1357 HFC_outb(hc, R_BRG_PCM_CFG, V_PCM_CLK);
1358 }
1359
1360 if (test_bit(HFC_CHIP_EMBSD, &hc->chip))
1361 HFC_outb(hc, 0x02 , 0x40 );
1362
1363
1364 if (test_bit(HFC_CHIP_B410P, &hc->chip)) {
1365 printk(KERN_NOTICE "Setting GPIOs\n");
1366 HFC_outb(hc, R_GPIO_SEL, 0x30);
1367 HFC_outb(hc, R_GPIO_EN1, 0x3);
1368 udelay(1000);
1369 printk(KERN_NOTICE "calling vpm_init\n");
1370 vpm_init(hc);
1371 }
1372
1373
1374 val = HFC_inb(hc, R_F0_CNTL);
1375 val += HFC_inb(hc, R_F0_CNTH) << 8;
1376 if (debug & DEBUG_HFCMULTI_INIT)
1377 printk(KERN_DEBUG
1378 "HFC_multi F0_CNT %ld after reset\n", val);
1379 spin_unlock_irqrestore(&hc->lock, flags);
1380 set_current_state(TASK_UNINTERRUPTIBLE);
1381 schedule_timeout((HZ / 100) ? : 1);
1382 spin_lock_irqsave(&hc->lock, flags);
1383 val2 = HFC_inb(hc, R_F0_CNTL);
1384 val2 += HFC_inb(hc, R_F0_CNTH) << 8;
1385 if (debug & DEBUG_HFCMULTI_INIT)
1386 printk(KERN_DEBUG
1387 "HFC_multi F0_CNT %ld after 10 ms (1st try)\n",
1388 val2);
1389 if (val2 >= val + 8) {
1390
1391 if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip))
1392 printk(KERN_INFO "controller is PCM bus MASTER\n");
1393 else
1394 if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip))
1395 printk(KERN_INFO "controller is PCM bus SLAVE\n");
1396 else {
1397 test_and_set_bit(HFC_CHIP_PCM_SLAVE, &hc->chip);
1398 printk(KERN_INFO "controller is PCM bus SLAVE "
1399 "(auto detected)\n");
1400 }
1401 } else {
1402
1403 if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip)) {
1404 controller_fail:
1405 printk(KERN_ERR "HFC_multi ERROR, getting no 125us "
1406 "pulse. Seems that controller fails.\n");
1407 err = -EIO;
1408 goto out;
1409 }
1410 if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip)) {
1411 printk(KERN_INFO "controller is PCM bus SLAVE "
1412 "(ignoring missing PCM clock)\n");
1413 } else {
1414
1415 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)
1416 && plxsd_master) {
1417 printk(KERN_ERR "HFC_multi ERROR, no clock "
1418 "on another Speech Design card found. "
1419 "Please be sure to connect PCM cable.\n");
1420 err = -EIO;
1421 goto out;
1422 }
1423
1424 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
1425 spin_lock_irqsave(&plx_lock, plx_flags);
1426 plx_acc_32 = hc->plx_membase + PLX_GPIOC;
1427 pv = readl(plx_acc_32);
1428 pv |= PLX_MASTER_EN | PLX_SLAVE_EN_N;
1429 pv |= PLX_SYNC_O_EN;
1430 writel(pv, plx_acc_32);
1431 spin_unlock_irqrestore(&plx_lock, plx_flags);
1432 if (debug & DEBUG_HFCMULTI_INIT)
1433 printk(KERN_DEBUG "%s: master: "
1434 "PLX_GPIO=%x\n", __func__, pv);
1435 }
1436 hc->hw.r_pcm_md0 |= V_PCM_MD;
1437 HFC_outb(hc, R_PCM_MD0, hc->hw.r_pcm_md0 | 0x00);
1438 spin_unlock_irqrestore(&hc->lock, flags);
1439 set_current_state(TASK_UNINTERRUPTIBLE);
1440 schedule_timeout((HZ / 100) ?: 1);
1441 spin_lock_irqsave(&hc->lock, flags);
1442 val2 = HFC_inb(hc, R_F0_CNTL);
1443 val2 += HFC_inb(hc, R_F0_CNTH) << 8;
1444 if (debug & DEBUG_HFCMULTI_INIT)
1445 printk(KERN_DEBUG "HFC_multi F0_CNT %ld after "
1446 "10 ms (2nd try)\n", val2);
1447 if (val2 >= val + 8) {
1448 test_and_set_bit(HFC_CHIP_PCM_MASTER,
1449 &hc->chip);
1450 printk(KERN_INFO "controller is PCM bus MASTER "
1451 "(auto detected)\n");
1452 } else
1453 goto controller_fail;
1454 }
1455 }
1456
1457
1458 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
1459 if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip))
1460 plxsd_master = 1;
1461 spin_lock_irqsave(&plx_lock, plx_flags);
1462 plx_acc_32 = hc->plx_membase + PLX_GPIOC;
1463 pv = readl(plx_acc_32);
1464 pv |= PLX_DSP_RES_N;
1465 writel(pv, plx_acc_32);
1466 spin_unlock_irqrestore(&plx_lock, plx_flags);
1467 if (debug & DEBUG_HFCMULTI_INIT)
1468 printk(KERN_DEBUG "%s: reset off: PLX_GPIO=%x\n",
1469 __func__, pv);
1470 }
1471
1472
1473 if (hc->pcm)
1474 printk(KERN_INFO "controller has given PCM BUS ID %d\n",
1475 hc->pcm);
1476 else {
1477 if (test_bit(HFC_CHIP_PCM_MASTER, &hc->chip)
1478 || test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
1479 PCM_cnt++;
1480 }
1481 hc->pcm = PCM_cnt;
1482 printk(KERN_INFO "controller has PCM BUS ID %d "
1483 "(auto selected)\n", hc->pcm);
1484 }
1485
1486
1487 HFC_outb(hc, R_TI_WD, poll_timer);
1488 hc->hw.r_irqmsk_misc |= V_TI_IRQMSK;
1489
1490
1491 if (hc->ctype == HFC_TYPE_E1)
1492 hc->hw.r_irqmsk_misc |= V_STA_IRQMSK;
1493
1494
1495 if (test_bit(HFC_CHIP_DTMF, &hc->chip)) {
1496 if (debug & DEBUG_HFCMULTI_INIT)
1497 printk(KERN_DEBUG "%s: enabling DTMF detection "
1498 "for all B-channel\n", __func__);
1499 hc->hw.r_dtmf = V_DTMF_EN | V_DTMF_STOP;
1500 if (test_bit(HFC_CHIP_ULAW, &hc->chip))
1501 hc->hw.r_dtmf |= V_ULAW_SEL;
1502 HFC_outb(hc, R_DTMF_N, 102 - 1);
1503 hc->hw.r_irqmsk_misc |= V_DTMF_IRQMSK;
1504 }
1505
1506
1507 if (test_bit(HFC_CHIP_ULAW, &hc->chip))
1508 r_conf_en = V_CONF_EN | V_ULAW;
1509 else
1510 r_conf_en = V_CONF_EN;
1511 if (hc->ctype != HFC_TYPE_XHFC)
1512 HFC_outb(hc, R_CONF_EN, r_conf_en);
1513
1514
1515 switch (hc->leds) {
1516 case 1:
1517 if (test_bit(HFC_CHIP_WATCHDOG, &hc->chip))
1518 HFC_outb(hc, R_GPIO_SEL, 0x32);
1519 else
1520 HFC_outb(hc, R_GPIO_SEL, 0x30);
1521
1522 HFC_outb(hc, R_GPIO_EN1, 0x0f);
1523 HFC_outb(hc, R_GPIO_OUT1, 0x00);
1524
1525 HFC_outb(hc, R_GPIO_EN0, V_GPIO_EN2 | V_GPIO_EN3);
1526 break;
1527
1528 case 2:
1529 case 3:
1530 HFC_outb(hc, R_GPIO_SEL, 0xf0);
1531 HFC_outb(hc, R_GPIO_EN1, 0xff);
1532 HFC_outb(hc, R_GPIO_OUT1, 0x00);
1533 break;
1534 }
1535
1536 if (test_bit(HFC_CHIP_EMBSD, &hc->chip)) {
1537 hc->hw.r_st_sync = 0x10;
1538 HFC_outb(hc, R_ST_SYNC, hc->hw.r_st_sync);
1539 }
1540
1541
1542 if (hc->masterclk >= 0) {
1543 if (debug & DEBUG_HFCMULTI_INIT)
1544 printk(KERN_DEBUG "%s: setting ST master clock "
1545 "to port %d (0..%d)\n",
1546 __func__, hc->masterclk, hc->ports - 1);
1547 hc->hw.r_st_sync |= (hc->masterclk | V_AUTO_SYNC);
1548 HFC_outb(hc, R_ST_SYNC, hc->hw.r_st_sync);
1549 }
1550
1551
1552
1553
1554 HFC_outb(hc, R_IRQMSK_MISC, hc->hw.r_irqmsk_misc);
1555 if (debug & DEBUG_HFCMULTI_INIT)
1556 printk(KERN_DEBUG "r_irqmsk_misc.2: 0x%x\n",
1557 hc->hw.r_irqmsk_misc);
1558
1559
1560 HFC_outb(hc, R_RAM_ADDR0, 0);
1561 HFC_outb(hc, R_RAM_ADDR1, 0);
1562 HFC_outb(hc, R_RAM_ADDR2, 0);
1563 for (i = 0; i < 256; i++) {
1564 HFC_outb_nodebug(hc, R_RAM_ADDR0, i);
1565 HFC_outb_nodebug(hc, R_RAM_DATA, ((i * 3) & 0xff));
1566 }
1567 for (i = 0; i < 256; i++) {
1568 HFC_outb_nodebug(hc, R_RAM_ADDR0, i);
1569 HFC_inb_nodebug(hc, R_RAM_DATA);
1570 rval = HFC_inb_nodebug(hc, R_INT_DATA);
1571 if (rval != ((i * 3) & 0xff)) {
1572 printk(KERN_DEBUG
1573 "addr:%x val:%x should:%x\n", i, rval,
1574 (i * 3) & 0xff);
1575 err++;
1576 }
1577 }
1578 if (err) {
1579 printk(KERN_DEBUG "aborting - %d RAM access errors\n", err);
1580 err = -EIO;
1581 goto out;
1582 }
1583
1584 if (debug & DEBUG_HFCMULTI_INIT)
1585 printk(KERN_DEBUG "%s: done\n", __func__);
1586out:
1587 spin_unlock_irqrestore(&hc->lock, flags);
1588 return err;
1589}
1590
1591
1592
1593
1594
1595static void
1596hfcmulti_watchdog(struct hfc_multi *hc)
1597{
1598 hc->wdcount++;
1599
1600 if (hc->wdcount > 10) {
1601 hc->wdcount = 0;
1602 hc->wdbyte = hc->wdbyte == V_GPIO_OUT2 ?
1603 V_GPIO_OUT3 : V_GPIO_OUT2;
1604
1605
1606 HFC_outb(hc, R_GPIO_EN0, V_GPIO_EN2 | V_GPIO_EN3);
1607 HFC_outb(hc, R_GPIO_OUT0, hc->wdbyte);
1608 }
1609}
1610
1611
1612
1613
1614
1615
1616static void
1617hfcmulti_leds(struct hfc_multi *hc)
1618{
1619 unsigned long lled;
1620 unsigned long leddw;
1621 int i, state, active, leds;
1622 struct dchannel *dch;
1623 int led[4];
1624
1625 switch (hc->leds) {
1626 case 1:
1627
1628
1629
1630
1631
1632
1633 led[0] = 0;
1634 led[1] = 0;
1635 led[2] = 0;
1636 led[3] = 0;
1637 dch = hc->chan[hc->dnum[0]].dch;
1638 if (dch) {
1639 if (hc->chan[hc->dnum[0]].los)
1640 led[1] = 1;
1641 if (hc->e1_state != 1) {
1642 led[0] = 1;
1643 hc->flash[2] = 0;
1644 hc->flash[3] = 0;
1645 } else {
1646 led[2] = 1;
1647 led[3] = 1;
1648 if (!hc->flash[2] && hc->activity_tx)
1649 hc->flash[2] = poll;
1650 if (!hc->flash[3] && hc->activity_rx)
1651 hc->flash[3] = poll;
1652 if (hc->flash[2] && hc->flash[2] < 1024)
1653 led[2] = 0;
1654 if (hc->flash[3] && hc->flash[3] < 1024)
1655 led[3] = 0;
1656 if (hc->flash[2] >= 2048)
1657 hc->flash[2] = 0;
1658 if (hc->flash[3] >= 2048)
1659 hc->flash[3] = 0;
1660 if (hc->flash[2])
1661 hc->flash[2] += poll;
1662 if (hc->flash[3])
1663 hc->flash[3] += poll;
1664 }
1665 }
1666 leds = (led[0] | (led[1]<<2) | (led[2]<<1) | (led[3]<<3))^0xF;
1667
1668 if (leds != (int)hc->ledstate) {
1669 HFC_outb_nodebug(hc, R_GPIO_OUT1, leds);
1670 hc->ledstate = leds;
1671 }
1672 break;
1673
1674 case 2:
1675
1676
1677
1678
1679 for (i = 0; i < 4; i++) {
1680 state = 0;
1681 active = -1;
1682 dch = hc->chan[(i << 2) | 2].dch;
1683 if (dch) {
1684 state = dch->state;
1685 if (dch->dev.D.protocol == ISDN_P_NT_S0)
1686 active = 3;
1687 else
1688 active = 7;
1689 }
1690 if (state) {
1691 if (state == active) {
1692 led[i] = 1;
1693 hc->activity_tx |= hc->activity_rx;
1694 if (!hc->flash[i] &&
1695 (hc->activity_tx & (1 << i)))
1696 hc->flash[i] = poll;
1697 if (hc->flash[i] && hc->flash[i] < 1024)
1698 led[i] = 0;
1699 if (hc->flash[i] >= 2048)
1700 hc->flash[i] = 0;
1701 if (hc->flash[i])
1702 hc->flash[i] += poll;
1703 } else {
1704 led[i] = 2;
1705 hc->flash[i] = 0;
1706 }
1707 } else
1708 led[i] = 0;
1709 }
1710 if (test_bit(HFC_CHIP_B410P, &hc->chip)) {
1711 leds = 0;
1712 for (i = 0; i < 4; i++) {
1713 if (led[i] == 1) {
1714
1715 leds |= (0x2 << (i * 2));
1716 } else if (led[i] == 2) {
1717
1718 leds |= (0x1 << (i * 2));
1719 }
1720 }
1721 if (leds != (int)hc->ledstate) {
1722 vpm_out(hc, 0, 0x1a8 + 3, leds);
1723 hc->ledstate = leds;
1724 }
1725 } else {
1726 leds = ((led[3] > 0) << 0) | ((led[1] > 0) << 1) |
1727 ((led[0] > 0) << 2) | ((led[2] > 0) << 3) |
1728 ((led[3] & 1) << 4) | ((led[1] & 1) << 5) |
1729 ((led[0] & 1) << 6) | ((led[2] & 1) << 7);
1730 if (leds != (int)hc->ledstate) {
1731 HFC_outb_nodebug(hc, R_GPIO_EN1, leds & 0x0F);
1732 HFC_outb_nodebug(hc, R_GPIO_OUT1, leds >> 4);
1733 hc->ledstate = leds;
1734 }
1735 }
1736 break;
1737
1738 case 3:
1739
1740
1741
1742
1743 for (i = 0; i < 2; i++) {
1744 state = 0;
1745 active = -1;
1746 dch = hc->chan[(i << 2) | 2].dch;
1747 if (dch) {
1748 state = dch->state;
1749 if (dch->dev.D.protocol == ISDN_P_NT_S0)
1750 active = 3;
1751 else
1752 active = 7;
1753 }
1754 if (state) {
1755 if (state == active) {
1756 led[i] = 1;
1757 hc->activity_tx |= hc->activity_rx;
1758 if (!hc->flash[i] &&
1759 (hc->activity_tx & (1 << i)))
1760 hc->flash[i] = poll;
1761 if (hc->flash[i] < 1024)
1762 led[i] = 0;
1763 if (hc->flash[i] >= 2048)
1764 hc->flash[i] = 0;
1765 if (hc->flash[i])
1766 hc->flash[i] += poll;
1767 } else {
1768 led[i] = 2;
1769 hc->flash[i] = 0;
1770 }
1771 } else
1772 led[i] = 0;
1773 }
1774 leds = (led[0] > 0) | ((led[1] > 0) << 1) | ((led[0]&1) << 2)
1775 | ((led[1]&1) << 3);
1776 if (leds != (int)hc->ledstate) {
1777 HFC_outb_nodebug(hc, R_GPIO_EN1,
1778 ((led[0] > 0) << 2) | ((led[1] > 0) << 3));
1779 HFC_outb_nodebug(hc, R_GPIO_OUT1,
1780 ((led[0] & 1) << 2) | ((led[1] & 1) << 3));
1781 hc->ledstate = leds;
1782 }
1783 break;
1784 case 8:
1785
1786
1787
1788
1789 lled = 0xff;
1790 for (i = 0; i < 8; i++) {
1791 state = 0;
1792 active = -1;
1793 dch = hc->chan[(i << 2) | 2].dch;
1794 if (dch) {
1795 state = dch->state;
1796 if (dch->dev.D.protocol == ISDN_P_NT_S0)
1797 active = 3;
1798 else
1799 active = 7;
1800 }
1801 if (state) {
1802 if (state == active) {
1803 lled &= ~(1 << i);
1804 hc->activity_tx |= hc->activity_rx;
1805 if (!hc->flash[i] &&
1806 (hc->activity_tx & (1 << i)))
1807 hc->flash[i] = poll;
1808 if (hc->flash[i] < 1024)
1809 lled |= 1 << i;
1810 if (hc->flash[i] >= 2048)
1811 hc->flash[i] = 0;
1812 if (hc->flash[i])
1813 hc->flash[i] += poll;
1814 } else
1815 hc->flash[i] = 0;
1816 }
1817 }
1818 leddw = lled << 24 | lled << 16 | lled << 8 | lled;
1819 if (leddw != hc->ledstate) {
1820
1821
1822
1823 HFC_outb_nodebug(hc, R_BRG_PCM_CFG, 1 | V_PCM_CLK);
1824 outw(0x4000, hc->pci_iobase + 4);
1825 outl(leddw, hc->pci_iobase);
1826 HFC_outb_nodebug(hc, R_BRG_PCM_CFG, V_PCM_CLK);
1827 hc->ledstate = leddw;
1828 }
1829 break;
1830 }
1831 hc->activity_tx = 0;
1832 hc->activity_rx = 0;
1833}
1834
1835
1836
1837
1838static void
1839hfcmulti_dtmf(struct hfc_multi *hc)
1840{
1841 s32 *coeff;
1842 u_int mantissa;
1843 int co, ch;
1844 struct bchannel *bch = NULL;
1845 u8 exponent;
1846 int dtmf = 0;
1847 int addr;
1848 u16 w_float;
1849 struct sk_buff *skb;
1850 struct mISDNhead *hh;
1851
1852 if (debug & DEBUG_HFCMULTI_DTMF)
1853 printk(KERN_DEBUG "%s: dtmf detection irq\n", __func__);
1854 for (ch = 0; ch <= 31; ch++) {
1855
1856 bch = hc->chan[ch].bch;
1857 if (!bch)
1858 continue;
1859 if (!hc->created[hc->chan[ch].port])
1860 continue;
1861 if (!test_bit(FLG_TRANSPARENT, &bch->Flags))
1862 continue;
1863 if (debug & DEBUG_HFCMULTI_DTMF)
1864 printk(KERN_DEBUG "%s: dtmf channel %d:",
1865 __func__, ch);
1866 coeff = &(hc->chan[ch].coeff[hc->chan[ch].coeff_count * 16]);
1867 dtmf = 1;
1868 for (co = 0; co < 8; co++) {
1869
1870 addr = hc->DTMFbase + ((co << 7) | (ch << 2));
1871 HFC_outb_nodebug(hc, R_RAM_ADDR0, addr);
1872 HFC_outb_nodebug(hc, R_RAM_ADDR1, addr >> 8);
1873 HFC_outb_nodebug(hc, R_RAM_ADDR2, (addr >> 16)
1874 | V_ADDR_INC);
1875 w_float = HFC_inb_nodebug(hc, R_RAM_DATA);
1876 w_float |= (HFC_inb_nodebug(hc, R_RAM_DATA) << 8);
1877 if (debug & DEBUG_HFCMULTI_DTMF)
1878 printk(" %04x", w_float);
1879
1880
1881 mantissa = w_float & 0x0fff;
1882 if (w_float & 0x8000)
1883 mantissa |= 0xfffff000;
1884 exponent = (w_float >> 12) & 0x7;
1885 if (exponent) {
1886 mantissa ^= 0x1000;
1887 mantissa <<= (exponent - 1);
1888 }
1889
1890
1891 coeff[co << 1] = mantissa;
1892
1893
1894 w_float = HFC_inb_nodebug(hc, R_RAM_DATA);
1895 w_float |= (HFC_inb_nodebug(hc, R_RAM_DATA) << 8);
1896 if (debug & DEBUG_HFCMULTI_DTMF)
1897 printk(" %04x", w_float);
1898
1899
1900 mantissa = w_float & 0x0fff;
1901 if (w_float & 0x8000)
1902 mantissa |= 0xfffff000;
1903 exponent = (w_float >> 12) & 0x7;
1904 if (exponent) {
1905 mantissa ^= 0x1000;
1906 mantissa <<= (exponent - 1);
1907 }
1908
1909
1910 coeff[(co << 1) | 1] = mantissa;
1911 }
1912 if (debug & DEBUG_HFCMULTI_DTMF)
1913 printk(" DTMF ready %08x %08x %08x %08x "
1914 "%08x %08x %08x %08x\n",
1915 coeff[0], coeff[1], coeff[2], coeff[3],
1916 coeff[4], coeff[5], coeff[6], coeff[7]);
1917 hc->chan[ch].coeff_count++;
1918 if (hc->chan[ch].coeff_count == 8) {
1919 hc->chan[ch].coeff_count = 0;
1920 skb = mI_alloc_skb(512, GFP_ATOMIC);
1921 if (!skb) {
1922 printk(KERN_DEBUG "%s: No memory for skb\n",
1923 __func__);
1924 continue;
1925 }
1926 hh = mISDN_HEAD_P(skb);
1927 hh->prim = PH_CONTROL_IND;
1928 hh->id = DTMF_HFC_COEF;
1929 skb_put_data(skb, hc->chan[ch].coeff, 512);
1930 recv_Bchannel_skb(bch, skb);
1931 }
1932 }
1933
1934
1935 hc->dtmf = dtmf;
1936 if (dtmf)
1937 HFC_outb_nodebug(hc, R_DTMF, hc->hw.r_dtmf | V_RST_DTMF);
1938}
1939
1940
1941
1942
1943
1944
1945static void
1946hfcmulti_tx(struct hfc_multi *hc, int ch)
1947{
1948 int i, ii, temp, len = 0;
1949 int Zspace, z1, z2;
1950 int Fspace, f1, f2;
1951 u_char *d;
1952 int *txpending, slot_tx;
1953 struct bchannel *bch;
1954 struct dchannel *dch;
1955 struct sk_buff **sp = NULL;
1956 int *idxp;
1957
1958 bch = hc->chan[ch].bch;
1959 dch = hc->chan[ch].dch;
1960 if ((!dch) && (!bch))
1961 return;
1962
1963 txpending = &hc->chan[ch].txpending;
1964 slot_tx = hc->chan[ch].slot_tx;
1965 if (dch) {
1966 if (!test_bit(FLG_ACTIVE, &dch->Flags))
1967 return;
1968 sp = &dch->tx_skb;
1969 idxp = &dch->tx_idx;
1970 } else {
1971 if (!test_bit(FLG_ACTIVE, &bch->Flags))
1972 return;
1973 sp = &bch->tx_skb;
1974 idxp = &bch->tx_idx;
1975 }
1976 if (*sp)
1977 len = (*sp)->len;
1978
1979 if ((!len) && *txpending != 1)
1980 return;
1981
1982 if (test_bit(HFC_CHIP_B410P, &hc->chip) &&
1983 (hc->chan[ch].protocol == ISDN_P_B_RAW) &&
1984 (hc->chan[ch].slot_rx < 0) &&
1985 (hc->chan[ch].slot_tx < 0))
1986 HFC_outb_nodebug(hc, R_FIFO, 0x20 | (ch << 1));
1987 else
1988 HFC_outb_nodebug(hc, R_FIFO, ch << 1);
1989 HFC_wait_nodebug(hc);
1990
1991 if (*txpending == 2) {
1992
1993 HFC_outb_nodebug(hc, R_INC_RES_FIFO, V_RES_F);
1994 HFC_wait_nodebug(hc);
1995 HFC_outb(hc, A_SUBCH_CFG, 0);
1996 *txpending = 1;
1997 }
1998next_frame:
1999 if (dch || test_bit(FLG_HDLC, &bch->Flags)) {
2000 f1 = HFC_inb_nodebug(hc, A_F1);
2001 f2 = HFC_inb_nodebug(hc, A_F2);
2002 while (f2 != (temp = HFC_inb_nodebug(hc, A_F2))) {
2003 if (debug & DEBUG_HFCMULTI_FIFO)
2004 printk(KERN_DEBUG
2005 "%s(card %d): reread f2 because %d!=%d\n",
2006 __func__, hc->id + 1, temp, f2);
2007 f2 = temp;
2008 }
2009 Fspace = f2 - f1 - 1;
2010 if (Fspace < 0)
2011 Fspace += hc->Flen;
2012
2013
2014
2015
2016
2017
2018 if (test_bit(HFC_CHIP_REVISION0, &hc->chip)) {
2019 if (f1 != f2)
2020 Fspace = 0;
2021 else
2022 Fspace = 1;
2023 }
2024
2025 if (hc->ctype != HFC_TYPE_E1 && dch) {
2026 if (f1 != f2)
2027 Fspace = 0;
2028 }
2029
2030 if (Fspace == 0)
2031 return;
2032 }
2033 z1 = HFC_inw_nodebug(hc, A_Z1) - hc->Zmin;
2034 z2 = HFC_inw_nodebug(hc, A_Z2) - hc->Zmin;
2035 while (z2 != (temp = (HFC_inw_nodebug(hc, A_Z2) - hc->Zmin))) {
2036 if (debug & DEBUG_HFCMULTI_FIFO)
2037 printk(KERN_DEBUG "%s(card %d): reread z2 because "
2038 "%d!=%d\n", __func__, hc->id + 1, temp, z2);
2039 z2 = temp;
2040 }
2041 hc->chan[ch].Zfill = z1 - z2;
2042 if (hc->chan[ch].Zfill < 0)
2043 hc->chan[ch].Zfill += hc->Zlen;
2044 Zspace = z2 - z1;
2045 if (Zspace <= 0)
2046 Zspace += hc->Zlen;
2047 Zspace -= 4;
2048
2049 if (bch && test_bit(FLG_TRANSPARENT, &bch->Flags))
2050 Zspace = Zspace - hc->Zlen + hc->max_trans;
2051 if (Zspace <= 0)
2052 return;
2053
2054
2055 if (!len) {
2056 if (z1 == z2) {
2057
2058 if (bch && (!test_bit(FLG_HDLC, &bch->Flags)) &&
2059 *txpending && slot_tx >= 0) {
2060 if (debug & DEBUG_HFCMULTI_MODE)
2061 printk(KERN_DEBUG
2062 "%s: reconnecting PCM due to no "
2063 "more FIFO data: channel %d "
2064 "slot_tx %d\n",
2065 __func__, ch, slot_tx);
2066
2067 if (hc->ctype == HFC_TYPE_XHFC)
2068 HFC_outb(hc, A_CON_HDLC, 0xc0
2069 | 0x07 << 2 | V_HDLC_TRP | V_IFF);
2070
2071 else
2072 HFC_outb(hc, A_CON_HDLC, 0xc0 | 0x00 |
2073 V_HDLC_TRP | V_IFF);
2074 HFC_outb_nodebug(hc, R_FIFO, ch << 1 | 1);
2075 HFC_wait_nodebug(hc);
2076 if (hc->ctype == HFC_TYPE_XHFC)
2077 HFC_outb(hc, A_CON_HDLC, 0xc0
2078 | 0x07 << 2 | V_HDLC_TRP | V_IFF);
2079
2080 else
2081 HFC_outb(hc, A_CON_HDLC, 0xc0 | 0x00 |
2082 V_HDLC_TRP | V_IFF);
2083 HFC_outb_nodebug(hc, R_FIFO, ch << 1);
2084 HFC_wait_nodebug(hc);
2085 }
2086 *txpending = 0;
2087 }
2088 return;
2089 }
2090
2091
2092 if (bch && test_bit(FLG_FILLEMPTY, &bch->Flags)
2093 && !test_bit(FLG_HDLC, &bch->Flags) && z2 == z1) {
2094 if (debug & DEBUG_HFCMULTI_FILL)
2095 printk(KERN_DEBUG "%s: buffer empty, so we have "
2096 "underrun\n", __func__);
2097
2098 hc->write_fifo(hc, hc->silence_data, poll >> 1);
2099 Zspace -= (poll >> 1);
2100 }
2101
2102
2103 if (bch && (!test_bit(FLG_HDLC, &bch->Flags)) && (!*txpending)
2104 && slot_tx >= 0) {
2105 if (debug & DEBUG_HFCMULTI_MODE)
2106 printk(KERN_DEBUG "%s: disconnecting PCM due to "
2107 "FIFO data: channel %d slot_tx %d\n",
2108 __func__, ch, slot_tx);
2109
2110 if (hc->ctype == HFC_TYPE_XHFC)
2111 HFC_outb(hc, A_CON_HDLC, 0x80
2112 | 0x07 << 2 | V_HDLC_TRP | V_IFF);
2113
2114 else
2115 HFC_outb(hc, A_CON_HDLC, 0x80 | 0x00 |
2116 V_HDLC_TRP | V_IFF);
2117 HFC_outb_nodebug(hc, R_FIFO, ch << 1 | 1);
2118 HFC_wait_nodebug(hc);
2119 if (hc->ctype == HFC_TYPE_XHFC)
2120 HFC_outb(hc, A_CON_HDLC, 0x80
2121 | 0x07 << 2 | V_HDLC_TRP | V_IFF);
2122
2123 else
2124 HFC_outb(hc, A_CON_HDLC, 0x80 | 0x00 |
2125 V_HDLC_TRP | V_IFF);
2126 HFC_outb_nodebug(hc, R_FIFO, ch << 1);
2127 HFC_wait_nodebug(hc);
2128 }
2129 *txpending = 1;
2130
2131
2132 if (dch)
2133 hc->activity_tx |= 1 << hc->chan[ch].port;
2134
2135
2136 ii = len;
2137 if (dch || test_bit(FLG_HDLC, &bch->Flags))
2138 temp = 1;
2139 else
2140 temp = 0;
2141 i = *idxp;
2142 d = (*sp)->data + i;
2143 if (ii - i > Zspace)
2144 ii = Zspace + i;
2145 if (debug & DEBUG_HFCMULTI_FIFO)
2146 printk(KERN_DEBUG "%s(card %d): fifo(%d) has %d bytes space "
2147 "left (z1=%04x, z2=%04x) sending %d of %d bytes %s\n",
2148 __func__, hc->id + 1, ch, Zspace, z1, z2, ii-i, len-i,
2149 temp ? "HDLC" : "TRANS");
2150
2151
2152 hc->write_fifo(hc, d, ii - i);
2153 hc->chan[ch].Zfill += ii - i;
2154 *idxp = ii;
2155
2156
2157 if (ii != len) {
2158
2159 return;
2160 }
2161
2162
2163 if (dch || test_bit(FLG_HDLC, &bch->Flags)) {
2164
2165 HFC_outb_nodebug(hc, R_INC_RES_FIFO, V_INC_F);
2166 HFC_wait_nodebug(hc);
2167 }
2168
2169 dev_kfree_skb(*sp);
2170
2171 if (bch && get_next_bframe(bch)) {
2172 len = (*sp)->len;
2173 goto next_frame;
2174 }
2175 if (dch && get_next_dframe(dch)) {
2176 len = (*sp)->len;
2177 goto next_frame;
2178 }
2179
2180
2181
2182
2183
2184
2185 if (bch && test_bit(FLG_TRANSPARENT, &bch->Flags))
2186 HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence);
2187}
2188
2189
2190
2191static void
2192hfcmulti_rx(struct hfc_multi *hc, int ch)
2193{
2194 int temp;
2195 int Zsize, z1, z2 = 0;
2196 int f1 = 0, f2 = 0;
2197 int again = 0;
2198 struct bchannel *bch;
2199 struct dchannel *dch = NULL;
2200 struct sk_buff *skb, **sp = NULL;
2201 int maxlen;
2202
2203 bch = hc->chan[ch].bch;
2204 if (bch) {
2205 if (!test_bit(FLG_ACTIVE, &bch->Flags))
2206 return;
2207 } else if (hc->chan[ch].dch) {
2208 dch = hc->chan[ch].dch;
2209 if (!test_bit(FLG_ACTIVE, &dch->Flags))
2210 return;
2211 } else {
2212 return;
2213 }
2214next_frame:
2215
2216
2217 if (test_bit(HFC_CHIP_B410P, &hc->chip) &&
2218 (hc->chan[ch].protocol == ISDN_P_B_RAW) &&
2219 (hc->chan[ch].slot_rx < 0) &&
2220 (hc->chan[ch].slot_tx < 0))
2221 HFC_outb_nodebug(hc, R_FIFO, 0x20 | (ch << 1) | 1);
2222 else
2223 HFC_outb_nodebug(hc, R_FIFO, (ch << 1) | 1);
2224 HFC_wait_nodebug(hc);
2225
2226
2227 if (hc->chan[ch].rx_off) {
2228 if (bch)
2229 bch->dropcnt += poll;
2230 return;
2231 }
2232
2233 if (dch || test_bit(FLG_HDLC, &bch->Flags)) {
2234 f1 = HFC_inb_nodebug(hc, A_F1);
2235 while (f1 != (temp = HFC_inb_nodebug(hc, A_F1))) {
2236 if (debug & DEBUG_HFCMULTI_FIFO)
2237 printk(KERN_DEBUG
2238 "%s(card %d): reread f1 because %d!=%d\n",
2239 __func__, hc->id + 1, temp, f1);
2240 f1 = temp;
2241 }
2242 f2 = HFC_inb_nodebug(hc, A_F2);
2243 }
2244 z1 = HFC_inw_nodebug(hc, A_Z1) - hc->Zmin;
2245 while (z1 != (temp = (HFC_inw_nodebug(hc, A_Z1) - hc->Zmin))) {
2246 if (debug & DEBUG_HFCMULTI_FIFO)
2247 printk(KERN_DEBUG "%s(card %d): reread z2 because "
2248 "%d!=%d\n", __func__, hc->id + 1, temp, z2);
2249 z1 = temp;
2250 }
2251 z2 = HFC_inw_nodebug(hc, A_Z2) - hc->Zmin;
2252 Zsize = z1 - z2;
2253 if ((dch || test_bit(FLG_HDLC, &bch->Flags)) && f1 != f2)
2254
2255 Zsize++;
2256 if (Zsize < 0)
2257 Zsize += hc->Zlen;
2258
2259 if (Zsize <= 0)
2260 return;
2261
2262 if (bch) {
2263 maxlen = bchannel_get_rxbuf(bch, Zsize);
2264 if (maxlen < 0) {
2265 pr_warning("card%d.B%d: No bufferspace for %d bytes\n",
2266 hc->id + 1, bch->nr, Zsize);
2267 return;
2268 }
2269 sp = &bch->rx_skb;
2270 maxlen = bch->maxlen;
2271 } else {
2272 sp = &dch->rx_skb;
2273 maxlen = dch->maxlen + 3;
2274 if (*sp == NULL) {
2275 *sp = mI_alloc_skb(maxlen, GFP_ATOMIC);
2276 if (*sp == NULL) {
2277 pr_warning("card%d: No mem for dch rx_skb\n",
2278 hc->id + 1);
2279 return;
2280 }
2281 }
2282 }
2283
2284 if (dch)
2285 hc->activity_rx |= 1 << hc->chan[ch].port;
2286
2287
2288 if (dch || test_bit(FLG_HDLC, &bch->Flags)) {
2289 if (debug & DEBUG_HFCMULTI_FIFO)
2290 printk(KERN_DEBUG "%s(card %d): fifo(%d) reading %d "
2291 "bytes (z1=%04x, z2=%04x) HDLC %s (f1=%d, f2=%d) "
2292 "got=%d (again %d)\n", __func__, hc->id + 1, ch,
2293 Zsize, z1, z2, (f1 == f2) ? "fragment" : "COMPLETE",
2294 f1, f2, Zsize + (*sp)->len, again);
2295
2296 if ((Zsize + (*sp)->len) > maxlen) {
2297 if (debug & DEBUG_HFCMULTI_FIFO)
2298 printk(KERN_DEBUG
2299 "%s(card %d): hdlc-frame too large.\n",
2300 __func__, hc->id + 1);
2301 skb_trim(*sp, 0);
2302 HFC_outb_nodebug(hc, R_INC_RES_FIFO, V_RES_F);
2303 HFC_wait_nodebug(hc);
2304 return;
2305 }
2306
2307 hc->read_fifo(hc, skb_put(*sp, Zsize), Zsize);
2308
2309 if (f1 != f2) {
2310
2311 HFC_outb_nodebug(hc, R_INC_RES_FIFO, V_INC_F);
2312 HFC_wait_nodebug(hc);
2313
2314 if ((*sp)->len < 4) {
2315 if (debug & DEBUG_HFCMULTI_FIFO)
2316 printk(KERN_DEBUG
2317 "%s(card %d): Frame below minimum "
2318 "size\n", __func__, hc->id + 1);
2319 skb_trim(*sp, 0);
2320 goto next_frame;
2321 }
2322
2323 if ((*sp)->data[(*sp)->len - 1]) {
2324 if (debug & DEBUG_HFCMULTI_CRC)
2325 printk(KERN_DEBUG
2326 "%s: CRC-error\n", __func__);
2327 skb_trim(*sp, 0);
2328 goto next_frame;
2329 }
2330 skb_trim(*sp, (*sp)->len - 3);
2331 if ((*sp)->len < MISDN_COPY_SIZE) {
2332 skb = *sp;
2333 *sp = mI_alloc_skb(skb->len, GFP_ATOMIC);
2334 if (*sp) {
2335 skb_put_data(*sp, skb->data, skb->len);
2336 skb_trim(skb, 0);
2337 } else {
2338 printk(KERN_DEBUG "%s: No mem\n",
2339 __func__);
2340 *sp = skb;
2341 skb = NULL;
2342 }
2343 } else {
2344 skb = NULL;
2345 }
2346 if (debug & DEBUG_HFCMULTI_FIFO) {
2347 printk(KERN_DEBUG "%s(card %d):",
2348 __func__, hc->id + 1);
2349 temp = 0;
2350 while (temp < (*sp)->len)
2351 printk(" %02x", (*sp)->data[temp++]);
2352 printk("\n");
2353 }
2354 if (dch)
2355 recv_Dchannel(dch);
2356 else
2357 recv_Bchannel(bch, MISDN_ID_ANY, false);
2358 *sp = skb;
2359 again++;
2360 goto next_frame;
2361 }
2362
2363 } else {
2364
2365 hc->read_fifo(hc, skb_put(*sp, Zsize), Zsize);
2366 if (debug & DEBUG_HFCMULTI_FIFO)
2367 printk(KERN_DEBUG
2368 "%s(card %d): fifo(%d) reading %d bytes "
2369 "(z1=%04x, z2=%04x) TRANS\n",
2370 __func__, hc->id + 1, ch, Zsize, z1, z2);
2371
2372 recv_Bchannel(bch, hc->chan[ch].Zfill, false);
2373 }
2374}
2375
2376
2377
2378
2379
2380static void
2381signal_state_up(struct dchannel *dch, int info, char *msg)
2382{
2383 struct sk_buff *skb;
2384 int id, data = info;
2385
2386 if (debug & DEBUG_HFCMULTI_STATE)
2387 printk(KERN_DEBUG "%s: %s\n", __func__, msg);
2388
2389 id = TEI_SAPI | (GROUP_TEI << 8);
2390
2391 skb = _alloc_mISDN_skb(MPH_INFORMATION_IND, id, sizeof(data), &data,
2392 GFP_ATOMIC);
2393 if (!skb)
2394 return;
2395 recv_Dchannel_skb(dch, skb);
2396}
2397
2398static inline void
2399handle_timer_irq(struct hfc_multi *hc)
2400{
2401 int ch, temp;
2402 struct dchannel *dch;
2403 u_long flags;
2404
2405
2406 if (hc->e1_resync) {
2407
2408 spin_lock_irqsave(&HFClock, flags);
2409 if (hc->e1_resync & 1) {
2410 if (debug & DEBUG_HFCMULTI_PLXSD)
2411 printk(KERN_DEBUG "Enable SYNC_I\n");
2412 HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC);
2413
2414 if (test_bit(HFC_CHIP_RX_SYNC, &hc->chip))
2415 HFC_outb(hc, R_SYNC_OUT, V_SYNC_E1_RX);
2416 }
2417 if (hc->e1_resync & 2) {
2418 if (debug & DEBUG_HFCMULTI_PLXSD)
2419 printk(KERN_DEBUG "Enable jatt PLL\n");
2420 HFC_outb(hc, R_SYNC_CTRL, V_SYNC_OFFS);
2421 }
2422 if (hc->e1_resync & 4) {
2423 if (debug & DEBUG_HFCMULTI_PLXSD)
2424 printk(KERN_DEBUG
2425 "Enable QUARTZ for HFC-E1\n");
2426
2427 HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC
2428 | V_JATT_OFF);
2429
2430 HFC_outb(hc, R_SYNC_OUT, 0);
2431 }
2432 hc->e1_resync = 0;
2433 spin_unlock_irqrestore(&HFClock, flags);
2434 }
2435
2436 if (hc->ctype != HFC_TYPE_E1 || hc->e1_state == 1)
2437 for (ch = 0; ch <= 31; ch++) {
2438 if (hc->created[hc->chan[ch].port]) {
2439 hfcmulti_tx(hc, ch);
2440
2441 hfcmulti_rx(hc, ch);
2442 if (hc->chan[ch].dch &&
2443 hc->chan[ch].nt_timer > -1) {
2444 dch = hc->chan[ch].dch;
2445 if (!(--hc->chan[ch].nt_timer)) {
2446 schedule_event(dch,
2447 FLG_PHCHANGE);
2448 if (debug &
2449 DEBUG_HFCMULTI_STATE)
2450 printk(KERN_DEBUG
2451 "%s: nt_timer at "
2452 "state %x\n",
2453 __func__,
2454 dch->state);
2455 }
2456 }
2457 }
2458 }
2459 if (hc->ctype == HFC_TYPE_E1 && hc->created[0]) {
2460 dch = hc->chan[hc->dnum[0]].dch;
2461
2462 temp = HFC_inb_nodebug(hc, R_SYNC_STA) & V_SIG_LOS;
2463 hc->chan[hc->dnum[0]].los = temp;
2464 if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dnum[0]].cfg)) {
2465 if (!temp && hc->chan[hc->dnum[0]].los)
2466 signal_state_up(dch, L1_SIGNAL_LOS_ON,
2467 "LOS detected");
2468 if (temp && !hc->chan[hc->dnum[0]].los)
2469 signal_state_up(dch, L1_SIGNAL_LOS_OFF,
2470 "LOS gone");
2471 }
2472 if (test_bit(HFC_CFG_REPORT_AIS, &hc->chan[hc->dnum[0]].cfg)) {
2473
2474 temp = HFC_inb_nodebug(hc, R_SYNC_STA) & V_AIS;
2475 if (!temp && hc->chan[hc->dnum[0]].ais)
2476 signal_state_up(dch, L1_SIGNAL_AIS_ON,
2477 "AIS detected");
2478 if (temp && !hc->chan[hc->dnum[0]].ais)
2479 signal_state_up(dch, L1_SIGNAL_AIS_OFF,
2480 "AIS gone");
2481 hc->chan[hc->dnum[0]].ais = temp;
2482 }
2483 if (test_bit(HFC_CFG_REPORT_SLIP, &hc->chan[hc->dnum[0]].cfg)) {
2484
2485 temp = HFC_inb_nodebug(hc, R_SLIP) & V_FOSLIP_RX;
2486 if (!temp && hc->chan[hc->dnum[0]].slip_rx)
2487 signal_state_up(dch, L1_SIGNAL_SLIP_RX,
2488 " bit SLIP detected RX");
2489 hc->chan[hc->dnum[0]].slip_rx = temp;
2490 temp = HFC_inb_nodebug(hc, R_SLIP) & V_FOSLIP_TX;
2491 if (!temp && hc->chan[hc->dnum[0]].slip_tx)
2492 signal_state_up(dch, L1_SIGNAL_SLIP_TX,
2493 " bit SLIP detected TX");
2494 hc->chan[hc->dnum[0]].slip_tx = temp;
2495 }
2496 if (test_bit(HFC_CFG_REPORT_RDI, &hc->chan[hc->dnum[0]].cfg)) {
2497
2498 temp = HFC_inb_nodebug(hc, R_RX_SL0_0) & V_A;
2499 if (!temp && hc->chan[hc->dnum[0]].rdi)
2500 signal_state_up(dch, L1_SIGNAL_RDI_ON,
2501 "RDI detected");
2502 if (temp && !hc->chan[hc->dnum[0]].rdi)
2503 signal_state_up(dch, L1_SIGNAL_RDI_OFF,
2504 "RDI gone");
2505 hc->chan[hc->dnum[0]].rdi = temp;
2506 }
2507 temp = HFC_inb_nodebug(hc, R_JATT_DIR);
2508 switch (hc->chan[hc->dnum[0]].sync) {
2509 case 0:
2510 if ((temp & 0x60) == 0x60) {
2511 if (debug & DEBUG_HFCMULTI_SYNC)
2512 printk(KERN_DEBUG
2513 "%s: (id=%d) E1 now "
2514 "in clock sync\n",
2515 __func__, hc->id);
2516 HFC_outb(hc, R_RX_OFF,
2517 hc->chan[hc->dnum[0]].jitter | V_RX_INIT);
2518 HFC_outb(hc, R_TX_OFF,
2519 hc->chan[hc->dnum[0]].jitter | V_RX_INIT);
2520 hc->chan[hc->dnum[0]].sync = 1;
2521 goto check_framesync;
2522 }
2523 break;
2524 case 1:
2525 if ((temp & 0x60) != 0x60) {
2526 if (debug & DEBUG_HFCMULTI_SYNC)
2527 printk(KERN_DEBUG
2528 "%s: (id=%d) E1 "
2529 "lost clock sync\n",
2530 __func__, hc->id);
2531 hc->chan[hc->dnum[0]].sync = 0;
2532 break;
2533 }
2534 check_framesync:
2535 temp = HFC_inb_nodebug(hc, R_SYNC_STA);
2536 if (temp == 0x27) {
2537 if (debug & DEBUG_HFCMULTI_SYNC)
2538 printk(KERN_DEBUG
2539 "%s: (id=%d) E1 "
2540 "now in frame sync\n",
2541 __func__, hc->id);
2542 hc->chan[hc->dnum[0]].sync = 2;
2543 }
2544 break;
2545 case 2:
2546 if ((temp & 0x60) != 0x60) {
2547 if (debug & DEBUG_HFCMULTI_SYNC)
2548 printk(KERN_DEBUG
2549 "%s: (id=%d) E1 lost "
2550 "clock & frame sync\n",
2551 __func__, hc->id);
2552 hc->chan[hc->dnum[0]].sync = 0;
2553 break;
2554 }
2555 temp = HFC_inb_nodebug(hc, R_SYNC_STA);
2556 if (temp != 0x27) {
2557 if (debug & DEBUG_HFCMULTI_SYNC)
2558 printk(KERN_DEBUG
2559 "%s: (id=%d) E1 "
2560 "lost frame sync\n",
2561 __func__, hc->id);
2562 hc->chan[hc->dnum[0]].sync = 1;
2563 }
2564 break;
2565 }
2566 }
2567
2568 if (test_bit(HFC_CHIP_WATCHDOG, &hc->chip))
2569 hfcmulti_watchdog(hc);
2570
2571 if (hc->leds)
2572 hfcmulti_leds(hc);
2573}
2574
2575static void
2576ph_state_irq(struct hfc_multi *hc, u_char r_irq_statech)
2577{
2578 struct dchannel *dch;
2579 int ch;
2580 int active;
2581 u_char st_status, temp;
2582
2583
2584 for (ch = 0; ch <= 31; ch++) {
2585 if (hc->chan[ch].dch) {
2586 dch = hc->chan[ch].dch;
2587 if (r_irq_statech & 1) {
2588 HFC_outb_nodebug(hc, R_ST_SEL,
2589 hc->chan[ch].port);
2590
2591 udelay(1);
2592
2593 st_status = HFC_inb_nodebug(hc, A_ST_RD_STATE);
2594 while (st_status != (temp =
2595 HFC_inb_nodebug(hc, A_ST_RD_STATE))) {
2596 if (debug & DEBUG_HFCMULTI_STATE)
2597 printk(KERN_DEBUG "%s: reread "
2598 "STATE because %d!=%d\n",
2599 __func__, temp,
2600 st_status);
2601 st_status = temp;
2602 }
2603
2604
2605 if (test_bit(HFC_CHIP_PLXSD, &hc->chip) &&
2606 dch->dev.D.protocol == ISDN_P_TE_S0) {
2607 if (st_status & V_FR_SYNC_ST)
2608 hc->syncronized |=
2609 (1 << hc->chan[ch].port);
2610 else
2611 hc->syncronized &=
2612 ~(1 << hc->chan[ch].port);
2613 }
2614 dch->state = st_status & 0x0f;
2615 if (dch->dev.D.protocol == ISDN_P_NT_S0)
2616 active = 3;
2617 else
2618 active = 7;
2619 if (dch->state == active) {
2620 HFC_outb_nodebug(hc, R_FIFO,
2621 (ch << 1) | 1);
2622 HFC_wait_nodebug(hc);
2623 HFC_outb_nodebug(hc,
2624 R_INC_RES_FIFO, V_RES_F);
2625 HFC_wait_nodebug(hc);
2626 dch->tx_idx = 0;
2627 }
2628 schedule_event(dch, FLG_PHCHANGE);
2629 if (debug & DEBUG_HFCMULTI_STATE)
2630 printk(KERN_DEBUG
2631 "%s: S/T newstate %x port %d\n",
2632 __func__, dch->state,
2633 hc->chan[ch].port);
2634 }
2635 r_irq_statech >>= 1;
2636 }
2637 }
2638 if (test_bit(HFC_CHIP_PLXSD, &hc->chip))
2639 plxsd_checksync(hc, 0);
2640}
2641
2642static void
2643fifo_irq(struct hfc_multi *hc, int block)
2644{
2645 int ch, j;
2646 struct dchannel *dch;
2647 struct bchannel *bch;
2648 u_char r_irq_fifo_bl;
2649
2650 r_irq_fifo_bl = HFC_inb_nodebug(hc, R_IRQ_FIFO_BL0 + block);
2651 j = 0;
2652 while (j < 8) {
2653 ch = (block << 2) + (j >> 1);
2654 dch = hc->chan[ch].dch;
2655 bch = hc->chan[ch].bch;
2656 if (((!dch) && (!bch)) || (!hc->created[hc->chan[ch].port])) {
2657 j += 2;
2658 continue;
2659 }
2660 if (dch && (r_irq_fifo_bl & (1 << j)) &&
2661 test_bit(FLG_ACTIVE, &dch->Flags)) {
2662 hfcmulti_tx(hc, ch);
2663
2664 HFC_outb_nodebug(hc, R_FIFO, 0);
2665 HFC_wait_nodebug(hc);
2666 }
2667 if (bch && (r_irq_fifo_bl & (1 << j)) &&
2668 test_bit(FLG_ACTIVE, &bch->Flags)) {
2669 hfcmulti_tx(hc, ch);
2670
2671 HFC_outb_nodebug(hc, R_FIFO, 0);
2672 HFC_wait_nodebug(hc);
2673 }
2674 j++;
2675 if (dch && (r_irq_fifo_bl & (1 << j)) &&
2676 test_bit(FLG_ACTIVE, &dch->Flags)) {
2677 hfcmulti_rx(hc, ch);
2678 }
2679 if (bch && (r_irq_fifo_bl & (1 << j)) &&
2680 test_bit(FLG_ACTIVE, &bch->Flags)) {
2681 hfcmulti_rx(hc, ch);
2682 }
2683 j++;
2684 }
2685}
2686
2687#ifdef IRQ_DEBUG
2688int irqsem;
2689#endif
2690static irqreturn_t
2691hfcmulti_interrupt(int intno, void *dev_id)
2692{
2693#ifdef IRQCOUNT_DEBUG
2694 static int iq1 = 0, iq2 = 0, iq3 = 0, iq4 = 0,
2695 iq5 = 0, iq6 = 0, iqcnt = 0;
2696#endif
2697 struct hfc_multi *hc = dev_id;
2698 struct dchannel *dch;
2699 u_char r_irq_statech, status, r_irq_misc, r_irq_oview;
2700 int i;
2701 void __iomem *plx_acc;
2702 u_short wval;
2703 u_char e1_syncsta, temp, temp2;
2704 u_long flags;
2705
2706 if (!hc) {
2707 printk(KERN_ERR "HFC-multi: Spurious interrupt!\n");
2708 return IRQ_NONE;
2709 }
2710
2711 spin_lock(&hc->lock);
2712
2713#ifdef IRQ_DEBUG
2714 if (irqsem)
2715 printk(KERN_ERR "irq for card %d during irq from "
2716 "card %d, this is no bug.\n", hc->id + 1, irqsem);
2717 irqsem = hc->id + 1;
2718#endif
2719#ifdef CONFIG_MISDN_HFCMULTI_8xx
2720 if (hc->immap->im_cpm.cp_pbdat & hc->pb_irqmsk)
2721 goto irq_notforus;
2722#endif
2723 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
2724 spin_lock_irqsave(&plx_lock, flags);
2725 plx_acc = hc->plx_membase + PLX_INTCSR;
2726 wval = readw(plx_acc);
2727 spin_unlock_irqrestore(&plx_lock, flags);
2728 if (!(wval & PLX_INTCSR_LINTI1_STATUS))
2729 goto irq_notforus;
2730 }
2731
2732 status = HFC_inb_nodebug(hc, R_STATUS);
2733 r_irq_statech = HFC_inb_nodebug(hc, R_IRQ_STATECH);
2734#ifdef IRQCOUNT_DEBUG
2735 if (r_irq_statech)
2736 iq1++;
2737 if (status & V_DTMF_STA)
2738 iq2++;
2739 if (status & V_LOST_STA)
2740 iq3++;
2741 if (status & V_EXT_IRQSTA)
2742 iq4++;
2743 if (status & V_MISC_IRQSTA)
2744 iq5++;
2745 if (status & V_FR_IRQSTA)
2746 iq6++;
2747 if (iqcnt++ > 5000) {
2748 printk(KERN_ERR "iq1:%x iq2:%x iq3:%x iq4:%x iq5:%x iq6:%x\n",
2749 iq1, iq2, iq3, iq4, iq5, iq6);
2750 iqcnt = 0;
2751 }
2752#endif
2753
2754 if (!r_irq_statech &&
2755 !(status & (V_DTMF_STA | V_LOST_STA | V_EXT_IRQSTA |
2756 V_MISC_IRQSTA | V_FR_IRQSTA))) {
2757
2758 goto irq_notforus;
2759 }
2760 hc->irqcnt++;
2761 if (r_irq_statech) {
2762 if (hc->ctype != HFC_TYPE_E1)
2763 ph_state_irq(hc, r_irq_statech);
2764 }
2765 if (status & V_EXT_IRQSTA)
2766 ;
2767 if (status & V_LOST_STA) {
2768
2769 HFC_outb(hc, R_INC_RES_FIFO, V_RES_LOST);
2770 }
2771 if (status & V_MISC_IRQSTA) {
2772
2773 r_irq_misc = HFC_inb_nodebug(hc, R_IRQ_MISC);
2774 r_irq_misc &= hc->hw.r_irqmsk_misc;
2775 if (r_irq_misc & V_STA_IRQ) {
2776 if (hc->ctype == HFC_TYPE_E1) {
2777
2778 dch = hc->chan[hc->dnum[0]].dch;
2779 e1_syncsta = HFC_inb_nodebug(hc, R_SYNC_STA);
2780 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)
2781 && hc->e1_getclock) {
2782 if (e1_syncsta & V_FR_SYNC_E1)
2783 hc->syncronized = 1;
2784 else
2785 hc->syncronized = 0;
2786 }
2787
2788 temp = HFC_inb_nodebug(hc, R_E1_RD_STA);
2789 while (temp != (temp2 =
2790 HFC_inb_nodebug(hc, R_E1_RD_STA))) {
2791 if (debug & DEBUG_HFCMULTI_STATE)
2792 printk(KERN_DEBUG "%s: reread "
2793 "STATE because %d!=%d\n",
2794 __func__, temp, temp2);
2795 temp = temp2;
2796 }
2797
2798 if (debug & DEBUG_HFCMULTI_STATE)
2799 printk(KERN_DEBUG
2800 "%s: E1 (id=%d) newstate %x\n",
2801 __func__, hc->id, temp & 0x7);
2802 for (i = 0; i < hc->ports; i++) {
2803 dch = hc->chan[hc->dnum[i]].dch;
2804 dch->state = temp & 0x7;
2805 schedule_event(dch, FLG_PHCHANGE);
2806 }
2807
2808 if (test_bit(HFC_CHIP_PLXSD, &hc->chip))
2809 plxsd_checksync(hc, 0);
2810 }
2811 }
2812 if (r_irq_misc & V_TI_IRQ) {
2813 if (hc->iclock_on)
2814 mISDN_clock_update(hc->iclock, poll, NULL);
2815 handle_timer_irq(hc);
2816 }
2817
2818 if (r_irq_misc & V_DTMF_IRQ)
2819 hfcmulti_dtmf(hc);
2820
2821 if (r_irq_misc & V_IRQ_PROC) {
2822 static int irq_proc_cnt;
2823 if (!irq_proc_cnt++)
2824 printk(KERN_DEBUG "%s: got V_IRQ_PROC -"
2825 " this should not happen\n", __func__);
2826 }
2827
2828 }
2829 if (status & V_FR_IRQSTA) {
2830
2831 r_irq_oview = HFC_inb_nodebug(hc, R_IRQ_OVIEW);
2832 for (i = 0; i < 8; i++) {
2833 if (r_irq_oview & (1 << i))
2834 fifo_irq(hc, i);
2835 }
2836 }
2837
2838#ifdef IRQ_DEBUG
2839 irqsem = 0;
2840#endif
2841 spin_unlock(&hc->lock);
2842 return IRQ_HANDLED;
2843
2844irq_notforus:
2845#ifdef IRQ_DEBUG
2846 irqsem = 0;
2847#endif
2848 spin_unlock(&hc->lock);
2849 return IRQ_NONE;
2850}
2851
2852
2853
2854
2855
2856
2857static void
2858hfcmulti_dbusy_timer(struct timer_list *t)
2859{
2860}
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872static int
2873mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
2874 int bank_tx, int slot_rx, int bank_rx)
2875{
2876 int flow_tx = 0, flow_rx = 0, routing = 0;
2877 int oslot_tx, oslot_rx;
2878 int conf;
2879
2880 if (ch < 0 || ch > 31)
2881 return -EINVAL;
2882 oslot_tx = hc->chan[ch].slot_tx;
2883 oslot_rx = hc->chan[ch].slot_rx;
2884 conf = hc->chan[ch].conf;
2885
2886 if (debug & DEBUG_HFCMULTI_MODE)
2887 printk(KERN_DEBUG
2888 "%s: card %d channel %d protocol %x slot old=%d new=%d "
2889 "bank new=%d (TX) slot old=%d new=%d bank new=%d (RX)\n",
2890 __func__, hc->id, ch, protocol, oslot_tx, slot_tx,
2891 bank_tx, oslot_rx, slot_rx, bank_rx);
2892
2893 if (oslot_tx >= 0 && slot_tx != oslot_tx) {
2894
2895 if (debug & DEBUG_HFCMULTI_MODE)
2896 printk(KERN_DEBUG "%s: remove from slot %d (TX)\n",
2897 __func__, oslot_tx);
2898 if (hc->slot_owner[oslot_tx << 1] == ch) {
2899 HFC_outb(hc, R_SLOT, oslot_tx << 1);
2900 HFC_outb(hc, A_SL_CFG, 0);
2901 if (hc->ctype != HFC_TYPE_XHFC)
2902 HFC_outb(hc, A_CONF, 0);
2903 hc->slot_owner[oslot_tx << 1] = -1;
2904 } else {
2905 if (debug & DEBUG_HFCMULTI_MODE)
2906 printk(KERN_DEBUG
2907 "%s: we are not owner of this tx slot "
2908 "anymore, channel %d is.\n",
2909 __func__, hc->slot_owner[oslot_tx << 1]);
2910 }
2911 }
2912
2913 if (oslot_rx >= 0 && slot_rx != oslot_rx) {
2914
2915 if (debug & DEBUG_HFCMULTI_MODE)
2916 printk(KERN_DEBUG
2917 "%s: remove from slot %d (RX)\n",
2918 __func__, oslot_rx);
2919 if (hc->slot_owner[(oslot_rx << 1) | 1] == ch) {
2920 HFC_outb(hc, R_SLOT, (oslot_rx << 1) | V_SL_DIR);
2921 HFC_outb(hc, A_SL_CFG, 0);
2922 hc->slot_owner[(oslot_rx << 1) | 1] = -1;
2923 } else {
2924 if (debug & DEBUG_HFCMULTI_MODE)
2925 printk(KERN_DEBUG
2926 "%s: we are not owner of this rx slot "
2927 "anymore, channel %d is.\n",
2928 __func__,
2929 hc->slot_owner[(oslot_rx << 1) | 1]);
2930 }
2931 }
2932
2933 if (slot_tx < 0) {
2934 flow_tx = 0x80;
2935
2936 hc->chan[ch].slot_tx = -1;
2937 hc->chan[ch].bank_tx = 0;
2938 } else {
2939
2940 if (hc->chan[ch].txpending)
2941 flow_tx = 0x80;
2942 else
2943 flow_tx = 0xc0;
2944
2945 routing = bank_tx ? 0xc0 : 0x80;
2946 if (conf >= 0 || bank_tx > 1)
2947 routing = 0x40;
2948 if (debug & DEBUG_HFCMULTI_MODE)
2949 printk(KERN_DEBUG "%s: put channel %d to slot %d bank"
2950 " %d flow %02x routing %02x conf %d (TX)\n",
2951 __func__, ch, slot_tx, bank_tx,
2952 flow_tx, routing, conf);
2953 HFC_outb(hc, R_SLOT, slot_tx << 1);
2954 HFC_outb(hc, A_SL_CFG, (ch << 1) | routing);
2955 if (hc->ctype != HFC_TYPE_XHFC)
2956 HFC_outb(hc, A_CONF,
2957 (conf < 0) ? 0 : (conf | V_CONF_SL));
2958 hc->slot_owner[slot_tx << 1] = ch;
2959 hc->chan[ch].slot_tx = slot_tx;
2960 hc->chan[ch].bank_tx = bank_tx;
2961 }
2962 if (slot_rx < 0) {
2963
2964 flow_rx = 0x80;
2965 hc->chan[ch].slot_rx = -1;
2966 hc->chan[ch].bank_rx = 0;
2967 } else {
2968
2969 if (hc->chan[ch].txpending)
2970 flow_rx = 0x80;
2971 else
2972 flow_rx = 0xc0;
2973
2974 routing = bank_rx ? 0x80 : 0xc0;
2975 if (conf >= 0 || bank_rx > 1)
2976 routing = 0x40;
2977 if (debug & DEBUG_HFCMULTI_MODE)
2978 printk(KERN_DEBUG "%s: put channel %d to slot %d bank"
2979 " %d flow %02x routing %02x conf %d (RX)\n",
2980 __func__, ch, slot_rx, bank_rx,
2981 flow_rx, routing, conf);
2982 HFC_outb(hc, R_SLOT, (slot_rx << 1) | V_SL_DIR);
2983 HFC_outb(hc, A_SL_CFG, (ch << 1) | V_CH_DIR | routing);
2984 hc->slot_owner[(slot_rx << 1) | 1] = ch;
2985 hc->chan[ch].slot_rx = slot_rx;
2986 hc->chan[ch].bank_rx = bank_rx;
2987 }
2988
2989 switch (protocol) {
2990 case (ISDN_P_NONE):
2991
2992 HFC_outb(hc, R_FIFO, ch << 1);
2993 HFC_wait(hc);
2994 HFC_outb(hc, A_CON_HDLC, flow_tx | 0x00 | V_IFF);
2995 HFC_outb(hc, A_SUBCH_CFG, 0);
2996 HFC_outb(hc, A_IRQ_MSK, 0);
2997 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
2998 HFC_wait(hc);
2999
3000 HFC_outb(hc, R_FIFO, (ch << 1) | 1);
3001 HFC_wait(hc);
3002 HFC_outb(hc, A_CON_HDLC, flow_rx | 0x00);
3003 HFC_outb(hc, A_SUBCH_CFG, 0);
3004 HFC_outb(hc, A_IRQ_MSK, 0);
3005 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3006 HFC_wait(hc);
3007 if (hc->chan[ch].bch && hc->ctype != HFC_TYPE_E1) {
3008 hc->hw.a_st_ctrl0[hc->chan[ch].port] &=
3009 ((ch & 0x3) == 0) ? ~V_B1_EN : ~V_B2_EN;
3010 HFC_outb(hc, R_ST_SEL, hc->chan[ch].port);
3011
3012 udelay(1);
3013 HFC_outb(hc, A_ST_CTRL0,
3014 hc->hw.a_st_ctrl0[hc->chan[ch].port]);
3015 }
3016 if (hc->chan[ch].bch) {
3017 test_and_clear_bit(FLG_HDLC, &hc->chan[ch].bch->Flags);
3018 test_and_clear_bit(FLG_TRANSPARENT,
3019 &hc->chan[ch].bch->Flags);
3020 }
3021 break;
3022 case (ISDN_P_B_RAW):
3023
3024 if (test_bit(HFC_CHIP_B410P, &hc->chip) &&
3025 (hc->chan[ch].slot_rx < 0) &&
3026 (hc->chan[ch].slot_tx < 0)) {
3027
3028 printk(KERN_DEBUG
3029 "Setting B-channel %d to echo cancelable "
3030 "state on PCM slot %d\n", ch,
3031 ((ch / 4) * 8) + ((ch % 4) * 4) + 1);
3032 printk(KERN_DEBUG
3033 "Enabling pass through for channel\n");
3034 vpm_out(hc, ch, ((ch / 4) * 8) +
3035 ((ch % 4) * 4) + 1, 0x01);
3036
3037
3038 HFC_outb(hc, R_FIFO, (ch << 1));
3039 HFC_wait(hc);
3040 HFC_outb(hc, A_CON_HDLC, 0xc0 | V_HDLC_TRP | V_IFF);
3041 HFC_outb(hc, R_SLOT, (((ch / 4) * 8) +
3042 ((ch % 4) * 4) + 1) << 1);
3043 HFC_outb(hc, A_SL_CFG, 0x80 | (ch << 1));
3044
3045
3046 HFC_outb(hc, R_FIFO, 0x20 | (ch << 1) | 1);
3047 HFC_wait(hc);
3048 HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF);
3049 HFC_outb(hc, A_SUBCH_CFG, 0);
3050 HFC_outb(hc, A_IRQ_MSK, 0);
3051 if (hc->chan[ch].protocol != protocol) {
3052 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3053 HFC_wait(hc);
3054 }
3055 HFC_outb(hc, R_SLOT, ((((ch / 4) * 8) +
3056 ((ch % 4) * 4) + 1) << 1) | 1);
3057 HFC_outb(hc, A_SL_CFG, 0x80 | 0x20 | (ch << 1) | 1);
3058
3059
3060
3061 HFC_outb(hc, R_FIFO, (ch << 1) | 1);
3062 HFC_wait(hc);
3063 HFC_outb(hc, A_CON_HDLC, 0xc0 | V_HDLC_TRP | V_IFF);
3064 HFC_outb(hc, R_SLOT, ((((ch / 4) * 8) +
3065 ((ch % 4) * 4)) << 1) | 1);
3066 HFC_outb(hc, A_SL_CFG, 0x80 | 0x40 | (ch << 1) | 1);
3067
3068
3069 HFC_outb(hc, R_FIFO, 0x20 | (ch << 1));
3070 HFC_wait(hc);
3071 HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF);
3072 HFC_outb(hc, A_SUBCH_CFG, 0);
3073 HFC_outb(hc, A_IRQ_MSK, 0);
3074 if (hc->chan[ch].protocol != protocol) {
3075 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3076 HFC_wait(hc);
3077 }
3078
3079 HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence);
3080 HFC_outb(hc, R_SLOT, (((ch / 4) * 8) +
3081 ((ch % 4) * 4)) << 1);
3082 HFC_outb(hc, A_SL_CFG, 0x80 | 0x20 | (ch << 1));
3083 } else {
3084
3085 HFC_outb(hc, R_FIFO, ch << 1);
3086 HFC_wait(hc);
3087 if (hc->ctype == HFC_TYPE_XHFC)
3088 HFC_outb(hc, A_CON_HDLC, flow_tx | 0x07 << 2 |
3089 V_HDLC_TRP | V_IFF);
3090
3091 else
3092 HFC_outb(hc, A_CON_HDLC, flow_tx | 0x00 |
3093 V_HDLC_TRP | V_IFF);
3094 HFC_outb(hc, A_SUBCH_CFG, 0);
3095 HFC_outb(hc, A_IRQ_MSK, 0);
3096 if (hc->chan[ch].protocol != protocol) {
3097 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3098 HFC_wait(hc);
3099 }
3100
3101 HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence);
3102
3103 HFC_outb(hc, R_FIFO, (ch << 1) | 1);
3104 HFC_wait(hc);
3105 if (hc->ctype == HFC_TYPE_XHFC)
3106 HFC_outb(hc, A_CON_HDLC, flow_rx | 0x07 << 2 |
3107 V_HDLC_TRP);
3108
3109 else
3110 HFC_outb(hc, A_CON_HDLC, flow_rx | 0x00 |
3111 V_HDLC_TRP);
3112 HFC_outb(hc, A_SUBCH_CFG, 0);
3113 HFC_outb(hc, A_IRQ_MSK, 0);
3114 if (hc->chan[ch].protocol != protocol) {
3115 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3116 HFC_wait(hc);
3117 }
3118 }
3119 if (hc->ctype != HFC_TYPE_E1) {
3120 hc->hw.a_st_ctrl0[hc->chan[ch].port] |=
3121 ((ch & 0x3) == 0) ? V_B1_EN : V_B2_EN;
3122 HFC_outb(hc, R_ST_SEL, hc->chan[ch].port);
3123
3124 udelay(1);
3125 HFC_outb(hc, A_ST_CTRL0,
3126 hc->hw.a_st_ctrl0[hc->chan[ch].port]);
3127 }
3128 if (hc->chan[ch].bch)
3129 test_and_set_bit(FLG_TRANSPARENT,
3130 &hc->chan[ch].bch->Flags);
3131 break;
3132 case (ISDN_P_B_HDLC):
3133 case (ISDN_P_TE_S0):
3134 case (ISDN_P_NT_S0):
3135 case (ISDN_P_TE_E1):
3136 case (ISDN_P_NT_E1):
3137
3138 HFC_outb(hc, R_FIFO, ch << 1);
3139 HFC_wait(hc);
3140 if (hc->ctype == HFC_TYPE_E1 || hc->chan[ch].bch) {
3141
3142 HFC_outb(hc, A_CON_HDLC, flow_tx | 0x04);
3143 HFC_outb(hc, A_SUBCH_CFG, 0);
3144 } else {
3145
3146 HFC_outb(hc, A_CON_HDLC, flow_tx | 0x04 | V_IFF);
3147 HFC_outb(hc, A_SUBCH_CFG, 2);
3148 }
3149 HFC_outb(hc, A_IRQ_MSK, V_IRQ);
3150 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3151 HFC_wait(hc);
3152
3153 HFC_outb(hc, R_FIFO, (ch << 1) | 1);
3154 HFC_wait(hc);
3155 HFC_outb(hc, A_CON_HDLC, flow_rx | 0x04);
3156 if (hc->ctype == HFC_TYPE_E1 || hc->chan[ch].bch)
3157 HFC_outb(hc, A_SUBCH_CFG, 0);
3158 else
3159 HFC_outb(hc, A_SUBCH_CFG, 2);
3160 HFC_outb(hc, A_IRQ_MSK, V_IRQ);
3161 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3162 HFC_wait(hc);
3163 if (hc->chan[ch].bch) {
3164 test_and_set_bit(FLG_HDLC, &hc->chan[ch].bch->Flags);
3165 if (hc->ctype != HFC_TYPE_E1) {
3166 hc->hw.a_st_ctrl0[hc->chan[ch].port] |=
3167 ((ch & 0x3) == 0) ? V_B1_EN : V_B2_EN;
3168 HFC_outb(hc, R_ST_SEL, hc->chan[ch].port);
3169
3170 udelay(1);
3171 HFC_outb(hc, A_ST_CTRL0,
3172 hc->hw.a_st_ctrl0[hc->chan[ch].port]);
3173 }
3174 }
3175 break;
3176 default:
3177 printk(KERN_DEBUG "%s: protocol not known %x\n",
3178 __func__, protocol);
3179 hc->chan[ch].protocol = ISDN_P_NONE;
3180 return -ENOPROTOOPT;
3181 }
3182 hc->chan[ch].protocol = protocol;
3183 return 0;
3184}
3185
3186
3187
3188
3189
3190
3191static void
3192hfcmulti_pcm(struct hfc_multi *hc, int ch, int slot_tx, int bank_tx,
3193 int slot_rx, int bank_rx)
3194{
3195 if (slot_tx < 0 || slot_rx < 0 || bank_tx < 0 || bank_rx < 0) {
3196
3197 mode_hfcmulti(hc, ch, hc->chan[ch].protocol, -1, 0, -1, 0);
3198 return;
3199 }
3200
3201
3202 mode_hfcmulti(hc, ch, hc->chan[ch].protocol, slot_tx, bank_tx,
3203 slot_rx, bank_rx);
3204}
3205
3206
3207
3208
3209
3210static void
3211hfcmulti_conf(struct hfc_multi *hc, int ch, int num)
3212{
3213 if (num >= 0 && num <= 7)
3214 hc->chan[ch].conf = num;
3215 else
3216 hc->chan[ch].conf = -1;
3217 mode_hfcmulti(hc, ch, hc->chan[ch].protocol, hc->chan[ch].slot_tx,
3218 hc->chan[ch].bank_tx, hc->chan[ch].slot_rx,
3219 hc->chan[ch].bank_rx);
3220}
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232static int
3233hfcm_l1callback(struct dchannel *dch, u_int cmd)
3234{
3235 struct hfc_multi *hc = dch->hw;
3236 u_long flags;
3237
3238 switch (cmd) {
3239 case INFO3_P8:
3240 case INFO3_P10:
3241 break;
3242 case HW_RESET_REQ:
3243
3244 spin_lock_irqsave(&hc->lock, flags);
3245 if (hc->ctype == HFC_TYPE_E1) {
3246 if (debug & DEBUG_HFCMULTI_MSG)
3247 printk(KERN_DEBUG
3248 "%s: HW_RESET_REQ no BRI\n",
3249 __func__);
3250 } else {
3251 HFC_outb(hc, R_ST_SEL, hc->chan[dch->slot].port);
3252
3253 udelay(1);
3254 HFC_outb(hc, A_ST_WR_STATE, V_ST_LD_STA | 3);
3255 udelay(6);
3256 HFC_outb(hc, A_ST_WR_STATE, 3);
3257 HFC_outb(hc, A_ST_WR_STATE, 3 | (V_ST_ACT * 3));
3258
3259 }
3260 spin_unlock_irqrestore(&hc->lock, flags);
3261 l1_event(dch->l1, HW_POWERUP_IND);
3262 break;
3263 case HW_DEACT_REQ:
3264
3265 spin_lock_irqsave(&hc->lock, flags);
3266 if (hc->ctype == HFC_TYPE_E1) {
3267 if (debug & DEBUG_HFCMULTI_MSG)
3268 printk(KERN_DEBUG
3269 "%s: HW_DEACT_REQ no BRI\n",
3270 __func__);
3271 } else {
3272 HFC_outb(hc, R_ST_SEL, hc->chan[dch->slot].port);
3273
3274 udelay(1);
3275 HFC_outb(hc, A_ST_WR_STATE, V_ST_ACT * 2);
3276
3277 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
3278 hc->syncronized &=
3279 ~(1 << hc->chan[dch->slot].port);
3280 plxsd_checksync(hc, 0);
3281 }
3282 }
3283 skb_queue_purge(&dch->squeue);
3284 if (dch->tx_skb) {
3285 dev_kfree_skb(dch->tx_skb);
3286 dch->tx_skb = NULL;
3287 }
3288 dch->tx_idx = 0;
3289 if (dch->rx_skb) {
3290 dev_kfree_skb(dch->rx_skb);
3291 dch->rx_skb = NULL;
3292 }
3293 test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
3294 if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
3295 del_timer(&dch->timer);
3296 spin_unlock_irqrestore(&hc->lock, flags);
3297 break;
3298 case HW_POWERUP_REQ:
3299 spin_lock_irqsave(&hc->lock, flags);
3300 if (hc->ctype == HFC_TYPE_E1) {
3301 if (debug & DEBUG_HFCMULTI_MSG)
3302 printk(KERN_DEBUG
3303 "%s: HW_POWERUP_REQ no BRI\n",
3304 __func__);
3305 } else {
3306 HFC_outb(hc, R_ST_SEL, hc->chan[dch->slot].port);
3307
3308 udelay(1);
3309 HFC_outb(hc, A_ST_WR_STATE, 3 | 0x10);
3310 udelay(6);
3311 HFC_outb(hc, A_ST_WR_STATE, 3);
3312 }
3313 spin_unlock_irqrestore(&hc->lock, flags);
3314 break;
3315 case PH_ACTIVATE_IND:
3316 test_and_set_bit(FLG_ACTIVE, &dch->Flags);
3317 _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
3318 GFP_ATOMIC);
3319 break;
3320 case PH_DEACTIVATE_IND:
3321 test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
3322 _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
3323 GFP_ATOMIC);
3324 break;
3325 default:
3326 if (dch->debug & DEBUG_HW)
3327 printk(KERN_DEBUG "%s: unknown command %x\n",
3328 __func__, cmd);
3329 return -1;
3330 }
3331 return 0;
3332}
3333
3334
3335
3336
3337
3338static int
3339handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
3340{
3341 struct mISDNdevice *dev = container_of(ch, struct mISDNdevice, D);
3342 struct dchannel *dch = container_of(dev, struct dchannel, dev);
3343 struct hfc_multi *hc = dch->hw;
3344 struct mISDNhead *hh = mISDN_HEAD_P(skb);
3345 int ret = -EINVAL;
3346 unsigned int id;
3347 u_long flags;
3348
3349 switch (hh->prim) {
3350 case PH_DATA_REQ:
3351 if (skb->len < 1)
3352 break;
3353 spin_lock_irqsave(&hc->lock, flags);
3354 ret = dchannel_senddata(dch, skb);
3355 if (ret > 0) {
3356 id = hh->id;
3357 hfcmulti_tx(hc, dch->slot);
3358 ret = 0;
3359
3360 HFC_outb(hc, R_FIFO, 0);
3361 HFC_wait(hc);
3362 spin_unlock_irqrestore(&hc->lock, flags);
3363 queue_ch_frame(ch, PH_DATA_CNF, id, NULL);
3364 } else
3365 spin_unlock_irqrestore(&hc->lock, flags);
3366 return ret;
3367 case PH_ACTIVATE_REQ:
3368 if (dch->dev.D.protocol != ISDN_P_TE_S0) {
3369 spin_lock_irqsave(&hc->lock, flags);
3370 ret = 0;
3371 if (debug & DEBUG_HFCMULTI_MSG)
3372 printk(KERN_DEBUG
3373 "%s: PH_ACTIVATE port %d (0..%d)\n",
3374 __func__, hc->chan[dch->slot].port,
3375 hc->ports - 1);
3376
3377 if (hc->ctype == HFC_TYPE_E1) {
3378 ph_state_change(dch);
3379 if (debug & DEBUG_HFCMULTI_STATE)
3380 printk(KERN_DEBUG
3381 "%s: E1 report state %x \n",
3382 __func__, dch->state);
3383 } else {
3384 HFC_outb(hc, R_ST_SEL,
3385 hc->chan[dch->slot].port);
3386
3387 udelay(1);
3388 HFC_outb(hc, A_ST_WR_STATE, V_ST_LD_STA | 1);
3389
3390 udelay(6);
3391 HFC_outb(hc, A_ST_WR_STATE, 1);
3392 HFC_outb(hc, A_ST_WR_STATE, 1 |
3393 (V_ST_ACT * 3));
3394 dch->state = 1;
3395 }
3396 spin_unlock_irqrestore(&hc->lock, flags);
3397 } else
3398 ret = l1_event(dch->l1, hh->prim);
3399 break;
3400 case PH_DEACTIVATE_REQ:
3401 test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
3402 if (dch->dev.D.protocol != ISDN_P_TE_S0) {
3403 spin_lock_irqsave(&hc->lock, flags);
3404 if (debug & DEBUG_HFCMULTI_MSG)
3405 printk(KERN_DEBUG
3406 "%s: PH_DEACTIVATE port %d (0..%d)\n",
3407 __func__, hc->chan[dch->slot].port,
3408 hc->ports - 1);
3409
3410 if (hc->ctype == HFC_TYPE_E1) {
3411 if (debug & DEBUG_HFCMULTI_MSG)
3412 printk(KERN_DEBUG
3413 "%s: PH_DEACTIVATE no BRI\n",
3414 __func__);
3415 } else {
3416 HFC_outb(hc, R_ST_SEL,
3417 hc->chan[dch->slot].port);
3418
3419 udelay(1);
3420 HFC_outb(hc, A_ST_WR_STATE, V_ST_ACT * 2);
3421
3422 dch->state = 1;
3423 }
3424 skb_queue_purge(&dch->squeue);
3425 if (dch->tx_skb) {
3426 dev_kfree_skb(dch->tx_skb);
3427 dch->tx_skb = NULL;
3428 }
3429 dch->tx_idx = 0;
3430 if (dch->rx_skb) {
3431 dev_kfree_skb(dch->rx_skb);
3432 dch->rx_skb = NULL;
3433 }
3434 test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
3435 if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
3436 del_timer(&dch->timer);
3437#ifdef FIXME
3438 if (test_and_clear_bit(FLG_L1_BUSY, &dch->Flags))
3439 dchannel_sched_event(&hc->dch, D_CLEARBUSY);
3440#endif
3441 ret = 0;
3442 spin_unlock_irqrestore(&hc->lock, flags);
3443 } else
3444 ret = l1_event(dch->l1, hh->prim);
3445 break;
3446 }
3447 if (!ret)
3448 dev_kfree_skb(skb);
3449 return ret;
3450}
3451
3452static void
3453deactivate_bchannel(struct bchannel *bch)
3454{
3455 struct hfc_multi *hc = bch->hw;
3456 u_long flags;
3457
3458 spin_lock_irqsave(&hc->lock, flags);
3459 mISDN_clear_bchannel(bch);
3460 hc->chan[bch->slot].coeff_count = 0;
3461 hc->chan[bch->slot].rx_off = 0;
3462 hc->chan[bch->slot].conf = -1;
3463 mode_hfcmulti(hc, bch->slot, ISDN_P_NONE, -1, 0, -1, 0);
3464 spin_unlock_irqrestore(&hc->lock, flags);
3465}
3466
3467static int
3468handle_bmsg(struct mISDNchannel *ch, struct sk_buff *skb)
3469{
3470 struct bchannel *bch = container_of(ch, struct bchannel, ch);
3471 struct hfc_multi *hc = bch->hw;
3472 int ret = -EINVAL;
3473 struct mISDNhead *hh = mISDN_HEAD_P(skb);
3474 unsigned long flags;
3475
3476 switch (hh->prim) {
3477 case PH_DATA_REQ:
3478 if (!skb->len)
3479 break;
3480 spin_lock_irqsave(&hc->lock, flags);
3481 ret = bchannel_senddata(bch, skb);
3482 if (ret > 0) {
3483 hfcmulti_tx(hc, bch->slot);
3484 ret = 0;
3485
3486 HFC_outb_nodebug(hc, R_FIFO, 0);
3487 HFC_wait_nodebug(hc);
3488 }
3489 spin_unlock_irqrestore(&hc->lock, flags);
3490 return ret;
3491 case PH_ACTIVATE_REQ:
3492 if (debug & DEBUG_HFCMULTI_MSG)
3493 printk(KERN_DEBUG "%s: PH_ACTIVATE ch %d (0..32)\n",
3494 __func__, bch->slot);
3495 spin_lock_irqsave(&hc->lock, flags);
3496
3497 if (!test_and_set_bit(FLG_ACTIVE, &bch->Flags)) {
3498 hc->chan[bch->slot].txpending = 0;
3499 ret = mode_hfcmulti(hc, bch->slot,
3500 ch->protocol,
3501 hc->chan[bch->slot].slot_tx,
3502 hc->chan[bch->slot].bank_tx,
3503 hc->chan[bch->slot].slot_rx,
3504 hc->chan[bch->slot].bank_rx);
3505 if (!ret) {
3506 if (ch->protocol == ISDN_P_B_RAW && !hc->dtmf
3507 && test_bit(HFC_CHIP_DTMF, &hc->chip)) {
3508
3509 hc->dtmf = 1;
3510 if (debug & DEBUG_HFCMULTI_DTMF)
3511 printk(KERN_DEBUG
3512 "%s: start dtmf decoder\n",
3513 __func__);
3514 HFC_outb(hc, R_DTMF, hc->hw.r_dtmf |
3515 V_RST_DTMF);
3516 }
3517 }
3518 } else
3519 ret = 0;
3520 spin_unlock_irqrestore(&hc->lock, flags);
3521 if (!ret)
3522 _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0, NULL,
3523 GFP_KERNEL);
3524 break;
3525 case PH_CONTROL_REQ:
3526 spin_lock_irqsave(&hc->lock, flags);
3527 switch (hh->id) {
3528 case HFC_SPL_LOOP_ON:
3529 if (debug & DEBUG_HFCMULTI_MSG)
3530 printk(KERN_DEBUG
3531 "%s: HFC_SPL_LOOP_ON (len = %d)\n",
3532 __func__, skb->len);
3533 ret = 0;
3534 break;
3535 case HFC_SPL_LOOP_OFF:
3536 if (debug & DEBUG_HFCMULTI_MSG)
3537 printk(KERN_DEBUG "%s: HFC_SPL_LOOP_OFF\n",
3538 __func__);
3539 ret = 0;
3540 break;
3541 default:
3542 printk(KERN_ERR
3543 "%s: unknown PH_CONTROL_REQ info %x\n",
3544 __func__, hh->id);
3545 ret = -EINVAL;
3546 }
3547 spin_unlock_irqrestore(&hc->lock, flags);
3548 break;
3549 case PH_DEACTIVATE_REQ:
3550 deactivate_bchannel(bch);
3551 _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0, NULL,
3552 GFP_KERNEL);
3553 ret = 0;
3554 break;
3555 }
3556 if (!ret)
3557 dev_kfree_skb(skb);
3558 return ret;
3559}
3560
3561
3562
3563
3564static int
3565channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
3566{
3567 int ret = 0;
3568 struct dsp_features *features =
3569 (struct dsp_features *)(*((u_long *)&cq->p1));
3570 struct hfc_multi *hc = bch->hw;
3571 int slot_tx;
3572 int bank_tx;
3573 int slot_rx;
3574 int bank_rx;
3575 int num;
3576
3577 switch (cq->op) {
3578 case MISDN_CTRL_GETOP:
3579 ret = mISDN_ctrl_bchannel(bch, cq);
3580 cq->op |= MISDN_CTRL_HFC_OP | MISDN_CTRL_HW_FEATURES_OP;
3581 break;
3582 case MISDN_CTRL_RX_OFF:
3583 ret = mISDN_ctrl_bchannel(bch, cq);
3584 hc->chan[bch->slot].rx_off = !!cq->p1;
3585 if (!hc->chan[bch->slot].rx_off) {
3586
3587 HFC_outb_nodebug(hc, R_FIFO, (bch->slot << 1) | 1);
3588 HFC_wait_nodebug(hc);
3589 HFC_outb_nodebug(hc, R_INC_RES_FIFO, V_RES_F);
3590 HFC_wait_nodebug(hc);
3591 }
3592 if (debug & DEBUG_HFCMULTI_MSG)
3593 printk(KERN_DEBUG "%s: RX_OFF request (nr=%d off=%d)\n",
3594 __func__, bch->nr, hc->chan[bch->slot].rx_off);
3595 break;
3596 case MISDN_CTRL_FILL_EMPTY:
3597 ret = mISDN_ctrl_bchannel(bch, cq);
3598 hc->silence = bch->fill[0];
3599 memset(hc->silence_data, hc->silence, sizeof(hc->silence_data));
3600 break;
3601 case MISDN_CTRL_HW_FEATURES:
3602 if (debug & DEBUG_HFCMULTI_MSG)
3603 printk(KERN_DEBUG "%s: HW_FEATURE request\n",
3604 __func__);
3605
3606 features->hfc_id = hc->id;
3607 if (test_bit(HFC_CHIP_DTMF, &hc->chip))
3608 features->hfc_dtmf = 1;
3609 if (test_bit(HFC_CHIP_CONF, &hc->chip))
3610 features->hfc_conf = 1;
3611 features->hfc_loops = 0;
3612 if (test_bit(HFC_CHIP_B410P, &hc->chip)) {
3613 features->hfc_echocanhw = 1;
3614 } else {
3615 features->pcm_id = hc->pcm;
3616 features->pcm_slots = hc->slots;
3617 features->pcm_banks = 2;
3618 }
3619 break;
3620 case MISDN_CTRL_HFC_PCM_CONN:
3621 slot_tx = cq->p1 & 0xff;
3622 bank_tx = cq->p1 >> 8;
3623 slot_rx = cq->p2 & 0xff;
3624 bank_rx = cq->p2 >> 8;
3625 if (debug & DEBUG_HFCMULTI_MSG)
3626 printk(KERN_DEBUG
3627 "%s: HFC_PCM_CONN slot %d bank %d (TX) "
3628 "slot %d bank %d (RX)\n",
3629 __func__, slot_tx, bank_tx,
3630 slot_rx, bank_rx);
3631 if (slot_tx < hc->slots && bank_tx <= 2 &&
3632 slot_rx < hc->slots && bank_rx <= 2)
3633 hfcmulti_pcm(hc, bch->slot,
3634 slot_tx, bank_tx, slot_rx, bank_rx);
3635 else {
3636 printk(KERN_WARNING
3637 "%s: HFC_PCM_CONN slot %d bank %d (TX) "
3638 "slot %d bank %d (RX) out of range\n",
3639 __func__, slot_tx, bank_tx,
3640 slot_rx, bank_rx);
3641 ret = -EINVAL;
3642 }
3643 break;
3644 case MISDN_CTRL_HFC_PCM_DISC:
3645 if (debug & DEBUG_HFCMULTI_MSG)
3646 printk(KERN_DEBUG "%s: HFC_PCM_DISC\n",
3647 __func__);
3648 hfcmulti_pcm(hc, bch->slot, -1, 0, -1, 0);
3649 break;
3650 case MISDN_CTRL_HFC_CONF_JOIN:
3651 num = cq->p1 & 0xff;
3652 if (debug & DEBUG_HFCMULTI_MSG)
3653 printk(KERN_DEBUG "%s: HFC_CONF_JOIN conf %d\n",
3654 __func__, num);
3655 if (num <= 7)
3656 hfcmulti_conf(hc, bch->slot, num);
3657 else {
3658 printk(KERN_WARNING
3659 "%s: HW_CONF_JOIN conf %d out of range\n",
3660 __func__, num);
3661 ret = -EINVAL;
3662 }
3663 break;
3664 case MISDN_CTRL_HFC_CONF_SPLIT:
3665 if (debug & DEBUG_HFCMULTI_MSG)
3666 printk(KERN_DEBUG "%s: HFC_CONF_SPLIT\n", __func__);
3667 hfcmulti_conf(hc, bch->slot, -1);
3668 break;
3669 case MISDN_CTRL_HFC_ECHOCAN_ON:
3670 if (debug & DEBUG_HFCMULTI_MSG)
3671 printk(KERN_DEBUG "%s: HFC_ECHOCAN_ON\n", __func__);
3672 if (test_bit(HFC_CHIP_B410P, &hc->chip))
3673 vpm_echocan_on(hc, bch->slot, cq->p1);
3674 else
3675 ret = -EINVAL;
3676 break;
3677
3678 case MISDN_CTRL_HFC_ECHOCAN_OFF:
3679 if (debug & DEBUG_HFCMULTI_MSG)
3680 printk(KERN_DEBUG "%s: HFC_ECHOCAN_OFF\n",
3681 __func__);
3682 if (test_bit(HFC_CHIP_B410P, &hc->chip))
3683 vpm_echocan_off(hc, bch->slot);
3684 else
3685 ret = -EINVAL;
3686 break;
3687 default:
3688 ret = mISDN_ctrl_bchannel(bch, cq);
3689 break;
3690 }
3691 return ret;
3692}
3693
3694static int
3695hfcm_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
3696{
3697 struct bchannel *bch = container_of(ch, struct bchannel, ch);
3698 struct hfc_multi *hc = bch->hw;
3699 int err = -EINVAL;
3700 u_long flags;
3701
3702 if (bch->debug & DEBUG_HW)
3703 printk(KERN_DEBUG "%s: cmd:%x %p\n",
3704 __func__, cmd, arg);
3705 switch (cmd) {
3706 case CLOSE_CHANNEL:
3707 test_and_clear_bit(FLG_OPEN, &bch->Flags);
3708 deactivate_bchannel(bch);
3709 ch->protocol = ISDN_P_NONE;
3710 ch->peer = NULL;
3711 module_put(THIS_MODULE);
3712 err = 0;
3713 break;
3714 case CONTROL_CHANNEL:
3715 spin_lock_irqsave(&hc->lock, flags);
3716 err = channel_bctrl(bch, arg);
3717 spin_unlock_irqrestore(&hc->lock, flags);
3718 break;
3719 default:
3720 printk(KERN_WARNING "%s: unknown prim(%x)\n",
3721 __func__, cmd);
3722 }
3723 return err;
3724}
3725
3726
3727
3728
3729
3730
3731static void
3732ph_state_change(struct dchannel *dch)
3733{
3734 struct hfc_multi *hc;
3735 int ch, i;
3736
3737 if (!dch) {
3738 printk(KERN_WARNING "%s: ERROR given dch is NULL\n", __func__);
3739 return;
3740 }
3741 hc = dch->hw;
3742 ch = dch->slot;
3743
3744 if (hc->ctype == HFC_TYPE_E1) {
3745 if (dch->dev.D.protocol == ISDN_P_TE_E1) {
3746 if (debug & DEBUG_HFCMULTI_STATE)
3747 printk(KERN_DEBUG
3748 "%s: E1 TE (id=%d) newstate %x\n",
3749 __func__, hc->id, dch->state);
3750 } else {
3751 if (debug & DEBUG_HFCMULTI_STATE)
3752 printk(KERN_DEBUG
3753 "%s: E1 NT (id=%d) newstate %x\n",
3754 __func__, hc->id, dch->state);
3755 }
3756 switch (dch->state) {
3757 case (1):
3758 if (hc->e1_state != 1) {
3759 for (i = 1; i <= 31; i++) {
3760
3761 HFC_outb_nodebug(hc, R_FIFO,
3762 (i << 1) | 1);
3763 HFC_wait_nodebug(hc);
3764 HFC_outb_nodebug(hc, R_INC_RES_FIFO,
3765 V_RES_F);
3766 HFC_wait_nodebug(hc);
3767 }
3768 }
3769 test_and_set_bit(FLG_ACTIVE, &dch->Flags);
3770 _queue_data(&dch->dev.D, PH_ACTIVATE_IND,
3771 MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
3772 break;
3773
3774 default:
3775 if (hc->e1_state != 1)
3776 return;
3777 test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
3778 _queue_data(&dch->dev.D, PH_DEACTIVATE_IND,
3779 MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
3780 }
3781 hc->e1_state = dch->state;
3782 } else {
3783 if (dch->dev.D.protocol == ISDN_P_TE_S0) {
3784 if (debug & DEBUG_HFCMULTI_STATE)
3785 printk(KERN_DEBUG
3786 "%s: S/T TE newstate %x\n",
3787 __func__, dch->state);
3788 switch (dch->state) {
3789 case (0):
3790 l1_event(dch->l1, HW_RESET_IND);
3791 break;
3792 case (3):
3793 l1_event(dch->l1, HW_DEACT_IND);
3794 break;
3795 case (5):
3796 case (8):
3797 l1_event(dch->l1, ANYSIGNAL);
3798 break;
3799 case (6):
3800 l1_event(dch->l1, INFO2);
3801 break;
3802 case (7):
3803 l1_event(dch->l1, INFO4_P8);
3804 break;
3805 }
3806 } else {
3807 if (debug & DEBUG_HFCMULTI_STATE)
3808 printk(KERN_DEBUG "%s: S/T NT newstate %x\n",
3809 __func__, dch->state);
3810 switch (dch->state) {
3811 case (2):
3812 if (hc->chan[ch].nt_timer == 0) {
3813 hc->chan[ch].nt_timer = -1;
3814 HFC_outb(hc, R_ST_SEL,
3815 hc->chan[ch].port);
3816
3817 udelay(1);
3818 HFC_outb(hc, A_ST_WR_STATE, 4 |
3819 V_ST_LD_STA);
3820 udelay(6);
3821 HFC_outb(hc, A_ST_WR_STATE, 4);
3822 dch->state = 4;
3823 } else {
3824
3825 hc->chan[ch].nt_timer =
3826 nt_t1_count[poll_timer] + 1;
3827 HFC_outb(hc, R_ST_SEL,
3828 hc->chan[ch].port);
3829
3830 udelay(1);
3831
3832 HFC_outb(hc, A_ST_WR_STATE, 2 |
3833 V_SET_G2_G3);
3834 }
3835 break;
3836 case (1):
3837 hc->chan[ch].nt_timer = -1;
3838 test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
3839 _queue_data(&dch->dev.D, PH_DEACTIVATE_IND,
3840 MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
3841 break;
3842 case (4):
3843 hc->chan[ch].nt_timer = -1;
3844 break;
3845 case (3):
3846 hc->chan[ch].nt_timer = -1;
3847 test_and_set_bit(FLG_ACTIVE, &dch->Flags);
3848 _queue_data(&dch->dev.D, PH_ACTIVATE_IND,
3849 MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
3850 break;
3851 }
3852 }
3853 }
3854}
3855
3856
3857
3858
3859
3860static void
3861hfcmulti_initmode(struct dchannel *dch)
3862{
3863 struct hfc_multi *hc = dch->hw;
3864 u_char a_st_wr_state, r_e1_wr_sta;
3865 int i, pt;
3866
3867 if (debug & DEBUG_HFCMULTI_INIT)
3868 printk(KERN_DEBUG "%s: entered\n", __func__);
3869
3870 i = dch->slot;
3871 pt = hc->chan[i].port;
3872 if (hc->ctype == HFC_TYPE_E1) {
3873
3874 hc->chan[hc->dnum[pt]].slot_tx = -1;
3875 hc->chan[hc->dnum[pt]].slot_rx = -1;
3876 hc->chan[hc->dnum[pt]].conf = -1;
3877 if (hc->dnum[pt]) {
3878 mode_hfcmulti(hc, dch->slot, dch->dev.D.protocol,
3879 -1, 0, -1, 0);
3880 timer_setup(&dch->timer, hfcmulti_dbusy_timer, 0);
3881 }
3882 for (i = 1; i <= 31; i++) {
3883 if (!((1 << i) & hc->bmask[pt]))
3884 continue;
3885 hc->chan[i].slot_tx = -1;
3886 hc->chan[i].slot_rx = -1;
3887 hc->chan[i].conf = -1;
3888 mode_hfcmulti(hc, i, ISDN_P_NONE, -1, 0, -1, 0);
3889 }
3890 }
3891 if (hc->ctype == HFC_TYPE_E1 && pt == 0) {
3892
3893 dch = hc->chan[hc->dnum[0]].dch;
3894 if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dnum[0]].cfg)) {
3895 HFC_outb(hc, R_LOS0, 255);
3896 HFC_outb(hc, R_LOS1, 255);
3897 }
3898 if (test_bit(HFC_CFG_OPTICAL, &hc->chan[hc->dnum[0]].cfg)) {
3899 HFC_outb(hc, R_RX0, 0);
3900 hc->hw.r_tx0 = 0 | V_OUT_EN;
3901 } else {
3902 HFC_outb(hc, R_RX0, 1);
3903 hc->hw.r_tx0 = 1 | V_OUT_EN;
3904 }
3905 hc->hw.r_tx1 = V_ATX | V_NTRI;
3906 HFC_outb(hc, R_TX0, hc->hw.r_tx0);
3907 HFC_outb(hc, R_TX1, hc->hw.r_tx1);
3908 HFC_outb(hc, R_TX_FR0, 0x00);
3909 HFC_outb(hc, R_TX_FR1, 0xf8);
3910
3911 if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dnum[0]].cfg))
3912 HFC_outb(hc, R_TX_FR2, V_TX_MF | V_TX_E | V_NEG_E);
3913
3914 HFC_outb(hc, R_RX_FR0, V_AUTO_RESYNC | V_AUTO_RECO | 0);
3915
3916 if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dnum[0]].cfg))
3917 HFC_outb(hc, R_RX_FR1, V_RX_MF | V_RX_MF_SYNC);
3918
3919 if (dch->dev.D.protocol == ISDN_P_NT_E1) {
3920 if (debug & DEBUG_HFCMULTI_INIT)
3921 printk(KERN_DEBUG "%s: E1 port is NT-mode\n",
3922 __func__);
3923 r_e1_wr_sta = 0;
3924 hc->e1_getclock = 0;
3925 } else {
3926 if (debug & DEBUG_HFCMULTI_INIT)
3927 printk(KERN_DEBUG "%s: E1 port is TE-mode\n",
3928 __func__);
3929 r_e1_wr_sta = 0;
3930 hc->e1_getclock = 1;
3931 }
3932 if (test_bit(HFC_CHIP_RX_SYNC, &hc->chip))
3933 HFC_outb(hc, R_SYNC_OUT, V_SYNC_E1_RX);
3934 else
3935 HFC_outb(hc, R_SYNC_OUT, 0);
3936 if (test_bit(HFC_CHIP_E1CLOCK_GET, &hc->chip))
3937 hc->e1_getclock = 1;
3938 if (test_bit(HFC_CHIP_E1CLOCK_PUT, &hc->chip))
3939 hc->e1_getclock = 0;
3940 if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip)) {
3941
3942 if (debug & DEBUG_HFCMULTI_INIT)
3943 printk(KERN_DEBUG
3944 "%s: E1 port is clock master "
3945 "(clock from PCM)\n", __func__);
3946 HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC | V_PCM_SYNC);
3947 } else {
3948 if (hc->e1_getclock) {
3949
3950 if (debug & DEBUG_HFCMULTI_INIT)
3951 printk(KERN_DEBUG
3952 "%s: E1 port is clock slave "
3953 "(clock to PCM)\n", __func__);
3954 HFC_outb(hc, R_SYNC_CTRL, V_SYNC_OFFS);
3955 } else {
3956
3957 if (debug & DEBUG_HFCMULTI_INIT)
3958 printk(KERN_DEBUG "%s: E1 port is "
3959 "clock master "
3960 "(clock from QUARTZ)\n",
3961 __func__);
3962 HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC |
3963 V_PCM_SYNC | V_JATT_OFF);
3964 HFC_outb(hc, R_SYNC_OUT, 0);
3965 }
3966 }
3967 HFC_outb(hc, R_JATT_ATT, 0x9c);
3968 HFC_outb(hc, R_PWM_MD, V_PWM0_MD);
3969 HFC_outb(hc, R_PWM0, 0x50);
3970 HFC_outb(hc, R_PWM1, 0xff);
3971
3972 HFC_outb(hc, R_E1_WR_STA, r_e1_wr_sta | V_E1_LD_STA);
3973 udelay(6);
3974 HFC_outb(hc, R_E1_WR_STA, r_e1_wr_sta);
3975 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
3976 hc->syncronized = 0;
3977 plxsd_checksync(hc, 0);
3978 }
3979 }
3980 if (hc->ctype != HFC_TYPE_E1) {
3981
3982 hc->chan[i].slot_tx = -1;
3983 hc->chan[i].slot_rx = -1;
3984 hc->chan[i].conf = -1;
3985 mode_hfcmulti(hc, i, dch->dev.D.protocol, -1, 0, -1, 0);
3986 timer_setup(&dch->timer, hfcmulti_dbusy_timer, 0);
3987 hc->chan[i - 2].slot_tx = -1;
3988 hc->chan[i - 2].slot_rx = -1;
3989 hc->chan[i - 2].conf = -1;
3990 mode_hfcmulti(hc, i - 2, ISDN_P_NONE, -1, 0, -1, 0);
3991 hc->chan[i - 1].slot_tx = -1;
3992 hc->chan[i - 1].slot_rx = -1;
3993 hc->chan[i - 1].conf = -1;
3994 mode_hfcmulti(hc, i - 1, ISDN_P_NONE, -1, 0, -1, 0);
3995
3996 HFC_outb(hc, R_ST_SEL, pt);
3997
3998 udelay(1);
3999 if (dch->dev.D.protocol == ISDN_P_NT_S0) {
4000 if (debug & DEBUG_HFCMULTI_INIT)
4001 printk(KERN_DEBUG
4002 "%s: ST port %d is NT-mode\n",
4003 __func__, pt);
4004
4005 HFC_outb(hc, A_ST_CLK_DLY, clockdelay_nt);
4006 a_st_wr_state = 1;
4007 hc->hw.a_st_ctrl0[pt] = V_ST_MD;
4008 } else {
4009 if (debug & DEBUG_HFCMULTI_INIT)
4010 printk(KERN_DEBUG
4011 "%s: ST port %d is TE-mode\n",
4012 __func__, pt);
4013
4014 HFC_outb(hc, A_ST_CLK_DLY, clockdelay_te);
4015 a_st_wr_state = 2;
4016 hc->hw.a_st_ctrl0[pt] = 0;
4017 }
4018 if (!test_bit(HFC_CFG_NONCAP_TX, &hc->chan[i].cfg))
4019 hc->hw.a_st_ctrl0[pt] |= V_TX_LI;
4020 if (hc->ctype == HFC_TYPE_XHFC) {
4021 hc->hw.a_st_ctrl0[pt] |= 0x40 ;
4022 HFC_outb(hc, 0x35 ,
4023 0x7c << 1 );
4024 }
4025
4026 HFC_outb(hc, A_ST_CTRL0, hc->hw.a_st_ctrl0[pt]);
4027
4028 if ((dch->dev.D.protocol == ISDN_P_NT_S0) ||
4029 test_bit(HFC_CFG_DIS_ECHANNEL, &hc->chan[i].cfg))
4030 HFC_outb(hc, A_ST_CTRL1, V_E_IGNO);
4031 else
4032 HFC_outb(hc, A_ST_CTRL1, 0);
4033
4034 HFC_outb(hc, A_ST_CTRL2, V_B1_RX_EN | V_B2_RX_EN);
4035
4036 HFC_outb(hc, A_ST_WR_STATE, a_st_wr_state | V_ST_LD_STA);
4037 udelay(6);
4038 HFC_outb(hc, A_ST_WR_STATE, a_st_wr_state);
4039 hc->hw.r_sci_msk |= 1 << pt;
4040
4041 HFC_outb(hc, R_SCI_MSK, hc->hw.r_sci_msk);
4042
4043 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4044 hc->syncronized &=
4045 ~(1 << hc->chan[dch->slot].port);
4046 plxsd_checksync(hc, 0);
4047 }
4048 }
4049 if (debug & DEBUG_HFCMULTI_INIT)
4050 printk("%s: done\n", __func__);
4051}
4052
4053
4054static int
4055open_dchannel(struct hfc_multi *hc, struct dchannel *dch,
4056 struct channel_req *rq)
4057{
4058 int err = 0;
4059 u_long flags;
4060
4061 if (debug & DEBUG_HW_OPEN)
4062 printk(KERN_DEBUG "%s: dev(%d) open from %p\n", __func__,
4063 dch->dev.id, __builtin_return_address(0));
4064 if (rq->protocol == ISDN_P_NONE)
4065 return -EINVAL;
4066 if ((dch->dev.D.protocol != ISDN_P_NONE) &&
4067 (dch->dev.D.protocol != rq->protocol)) {
4068 if (debug & DEBUG_HFCMULTI_MODE)
4069 printk(KERN_DEBUG "%s: change protocol %x to %x\n",
4070 __func__, dch->dev.D.protocol, rq->protocol);
4071 }
4072 if ((dch->dev.D.protocol == ISDN_P_TE_S0) &&
4073 (rq->protocol != ISDN_P_TE_S0))
4074 l1_event(dch->l1, CLOSE_CHANNEL);
4075 if (dch->dev.D.protocol != rq->protocol) {
4076 if (rq->protocol == ISDN_P_TE_S0) {
4077 err = create_l1(dch, hfcm_l1callback);
4078 if (err)
4079 return err;
4080 }
4081 dch->dev.D.protocol = rq->protocol;
4082 spin_lock_irqsave(&hc->lock, flags);
4083 hfcmulti_initmode(dch);
4084 spin_unlock_irqrestore(&hc->lock, flags);
4085 }
4086 if (test_bit(FLG_ACTIVE, &dch->Flags))
4087 _queue_data(&dch->dev.D, PH_ACTIVATE_IND, MISDN_ID_ANY,
4088 0, NULL, GFP_KERNEL);
4089 rq->ch = &dch->dev.D;
4090 if (!try_module_get(THIS_MODULE))
4091 printk(KERN_WARNING "%s:cannot get module\n", __func__);
4092 return 0;
4093}
4094
4095static int
4096open_bchannel(struct hfc_multi *hc, struct dchannel *dch,
4097 struct channel_req *rq)
4098{
4099 struct bchannel *bch;
4100 int ch;
4101
4102 if (!test_channelmap(rq->adr.channel, dch->dev.channelmap))
4103 return -EINVAL;
4104 if (rq->protocol == ISDN_P_NONE)
4105 return -EINVAL;
4106 if (hc->ctype == HFC_TYPE_E1)
4107 ch = rq->adr.channel;
4108 else
4109 ch = (rq->adr.channel - 1) + (dch->slot - 2);
4110 bch = hc->chan[ch].bch;
4111 if (!bch) {
4112 printk(KERN_ERR "%s:internal error ch %d has no bch\n",
4113 __func__, ch);
4114 return -EINVAL;
4115 }
4116 if (test_and_set_bit(FLG_OPEN, &bch->Flags))
4117 return -EBUSY;
4118 bch->ch.protocol = rq->protocol;
4119 hc->chan[ch].rx_off = 0;
4120 rq->ch = &bch->ch;
4121 if (!try_module_get(THIS_MODULE))
4122 printk(KERN_WARNING "%s:cannot get module\n", __func__);
4123 return 0;
4124}
4125
4126
4127
4128
4129static int
4130channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq)
4131{
4132 struct hfc_multi *hc = dch->hw;
4133 int ret = 0;
4134 int wd_mode, wd_cnt;
4135
4136 switch (cq->op) {
4137 case MISDN_CTRL_GETOP:
4138 cq->op = MISDN_CTRL_HFC_OP | MISDN_CTRL_L1_TIMER3;
4139 break;
4140 case MISDN_CTRL_HFC_WD_INIT:
4141 wd_cnt = cq->p1 & 0xf;
4142 wd_mode = !!(cq->p1 >> 4);
4143 if (debug & DEBUG_HFCMULTI_MSG)
4144 printk(KERN_DEBUG "%s: MISDN_CTRL_HFC_WD_INIT mode %s"
4145 ", counter 0x%x\n", __func__,
4146 wd_mode ? "AUTO" : "MANUAL", wd_cnt);
4147
4148 HFC_outb(hc, R_TI_WD, poll_timer | (wd_cnt << 4));
4149 hc->hw.r_bert_wd_md = (wd_mode ? V_AUTO_WD_RES : 0);
4150 if (hc->ctype == HFC_TYPE_XHFC)
4151 hc->hw.r_bert_wd_md |= 0x40 ;
4152
4153 HFC_outb(hc, R_BERT_WD_MD, hc->hw.r_bert_wd_md | V_WD_RES);
4154 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4155
4156 HFC_outb(hc, R_GPIO_SEL, V_GPIO_SEL7);
4157 HFC_outb(hc, R_GPIO_EN1, V_GPIO_EN15);
4158 HFC_outb(hc, R_GPIO_OUT1, 0);
4159 HFC_outb(hc, R_GPIO_OUT1, V_GPIO_OUT15);
4160 }
4161 break;
4162 case MISDN_CTRL_HFC_WD_RESET:
4163 if (debug & DEBUG_HFCMULTI_MSG)
4164 printk(KERN_DEBUG "%s: MISDN_CTRL_HFC_WD_RESET\n",
4165 __func__);
4166 HFC_outb(hc, R_BERT_WD_MD, hc->hw.r_bert_wd_md | V_WD_RES);
4167 break;
4168 case MISDN_CTRL_L1_TIMER3:
4169 ret = l1_event(dch->l1, HW_TIMER3_VALUE | (cq->p1 & 0xff));
4170 break;
4171 default:
4172 printk(KERN_WARNING "%s: unknown Op %x\n",
4173 __func__, cq->op);
4174 ret = -EINVAL;
4175 break;
4176 }
4177 return ret;
4178}
4179
4180static int
4181hfcm_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
4182{
4183 struct mISDNdevice *dev = container_of(ch, struct mISDNdevice, D);
4184 struct dchannel *dch = container_of(dev, struct dchannel, dev);
4185 struct hfc_multi *hc = dch->hw;
4186 struct channel_req *rq;
4187 int err = 0;
4188 u_long flags;
4189
4190 if (dch->debug & DEBUG_HW)
4191 printk(KERN_DEBUG "%s: cmd:%x %p\n",
4192 __func__, cmd, arg);
4193 switch (cmd) {
4194 case OPEN_CHANNEL:
4195 rq = arg;
4196 switch (rq->protocol) {
4197 case ISDN_P_TE_S0:
4198 case ISDN_P_NT_S0:
4199 if (hc->ctype == HFC_TYPE_E1) {
4200 err = -EINVAL;
4201 break;
4202 }
4203 err = open_dchannel(hc, dch, rq);
4204 break;
4205 case ISDN_P_TE_E1:
4206 case ISDN_P_NT_E1:
4207 if (hc->ctype != HFC_TYPE_E1) {
4208 err = -EINVAL;
4209 break;
4210 }
4211 err = open_dchannel(hc, dch, rq);
4212 break;
4213 default:
4214 spin_lock_irqsave(&hc->lock, flags);
4215 err = open_bchannel(hc, dch, rq);
4216 spin_unlock_irqrestore(&hc->lock, flags);
4217 }
4218 break;
4219 case CLOSE_CHANNEL:
4220 if (debug & DEBUG_HW_OPEN)
4221 printk(KERN_DEBUG "%s: dev(%d) close from %p\n",
4222 __func__, dch->dev.id,
4223 __builtin_return_address(0));
4224 module_put(THIS_MODULE);
4225 break;
4226 case CONTROL_CHANNEL:
4227 spin_lock_irqsave(&hc->lock, flags);
4228 err = channel_dctrl(dch, arg);
4229 spin_unlock_irqrestore(&hc->lock, flags);
4230 break;
4231 default:
4232 if (dch->debug & DEBUG_HW)
4233 printk(KERN_DEBUG "%s: unknown command %x\n",
4234 __func__, cmd);
4235 err = -EINVAL;
4236 }
4237 return err;
4238}
4239
4240static int
4241clockctl(void *priv, int enable)
4242{
4243 struct hfc_multi *hc = priv;
4244
4245 hc->iclock_on = enable;
4246 return 0;
4247}
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257static int
4258init_card(struct hfc_multi *hc)
4259{
4260 int err = -EIO;
4261 u_long flags;
4262 void __iomem *plx_acc;
4263 u_long plx_flags;
4264
4265 if (debug & DEBUG_HFCMULTI_INIT)
4266 printk(KERN_DEBUG "%s: entered\n", __func__);
4267
4268 spin_lock_irqsave(&hc->lock, flags);
4269
4270 hc->hw.r_irq_ctrl = V_FIFO_IRQ;
4271 disable_hwirq(hc);
4272 spin_unlock_irqrestore(&hc->lock, flags);
4273
4274 if (request_irq(hc->irq, hfcmulti_interrupt, IRQF_SHARED,
4275 "HFC-multi", hc)) {
4276 printk(KERN_WARNING "mISDN: Could not get interrupt %d.\n",
4277 hc->irq);
4278 hc->irq = 0;
4279 return -EIO;
4280 }
4281
4282 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4283 spin_lock_irqsave(&plx_lock, plx_flags);
4284 plx_acc = hc->plx_membase + PLX_INTCSR;
4285 writew((PLX_INTCSR_PCIINT_ENABLE | PLX_INTCSR_LINTI1_ENABLE),
4286 plx_acc);
4287 spin_unlock_irqrestore(&plx_lock, plx_flags);
4288 }
4289
4290 if (debug & DEBUG_HFCMULTI_INIT)
4291 printk(KERN_DEBUG "%s: IRQ %d count %d\n",
4292 __func__, hc->irq, hc->irqcnt);
4293 err = init_chip(hc);
4294 if (err)
4295 goto error;
4296
4297
4298
4299
4300
4301 spin_lock_irqsave(&hc->lock, flags);
4302 enable_hwirq(hc);
4303 spin_unlock_irqrestore(&hc->lock, flags);
4304
4305 set_current_state(TASK_UNINTERRUPTIBLE);
4306 schedule_timeout((100 * HZ) / 1000);
4307
4308 spin_lock_irqsave(&hc->lock, flags);
4309 disable_hwirq(hc);
4310 spin_unlock_irqrestore(&hc->lock, flags);
4311 if (debug & DEBUG_HFCMULTI_INIT)
4312 printk(KERN_DEBUG "%s: IRQ %d count %d\n",
4313 __func__, hc->irq, hc->irqcnt);
4314 if (hc->irqcnt) {
4315 if (debug & DEBUG_HFCMULTI_INIT)
4316 printk(KERN_DEBUG "%s: done\n", __func__);
4317
4318 return 0;
4319 }
4320 if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip)) {
4321 printk(KERN_INFO "ignoring missing interrupts\n");
4322 return 0;
4323 }
4324
4325 printk(KERN_ERR "HFC PCI: IRQ(%d) getting no interrupts during init.\n",
4326 hc->irq);
4327
4328 err = -EIO;
4329
4330error:
4331 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4332 spin_lock_irqsave(&plx_lock, plx_flags);
4333 plx_acc = hc->plx_membase + PLX_INTCSR;
4334 writew(0x00, plx_acc);
4335 spin_unlock_irqrestore(&plx_lock, plx_flags);
4336 }
4337
4338 if (debug & DEBUG_HFCMULTI_INIT)
4339 printk(KERN_DEBUG "%s: free irq %d\n", __func__, hc->irq);
4340 if (hc->irq) {
4341 free_irq(hc->irq, hc);
4342 hc->irq = 0;
4343 }
4344
4345 if (debug & DEBUG_HFCMULTI_INIT)
4346 printk(KERN_DEBUG "%s: done (err=%d)\n", __func__, err);
4347 return err;
4348}
4349
4350
4351
4352
4353
4354static int
4355setup_pci(struct hfc_multi *hc, struct pci_dev *pdev,
4356 const struct pci_device_id *ent)
4357{
4358 struct hm_map *m = (struct hm_map *)ent->driver_data;
4359
4360 printk(KERN_INFO
4361 "HFC-multi: card manufacturer: '%s' card name: '%s' clock: %s\n",
4362 m->vendor_name, m->card_name, m->clock2 ? "double" : "normal");
4363
4364 hc->pci_dev = pdev;
4365 if (m->clock2)
4366 test_and_set_bit(HFC_CHIP_CLOCK2, &hc->chip);
4367
4368 if (ent->device == 0xB410) {
4369 test_and_set_bit(HFC_CHIP_B410P, &hc->chip);
4370 test_and_set_bit(HFC_CHIP_PCM_MASTER, &hc->chip);
4371 test_and_clear_bit(HFC_CHIP_PCM_SLAVE, &hc->chip);
4372 hc->slots = 32;
4373 }
4374
4375 if (hc->pci_dev->irq <= 0) {
4376 printk(KERN_WARNING "HFC-multi: No IRQ for PCI card found.\n");
4377 return -EIO;
4378 }
4379 if (pci_enable_device(hc->pci_dev)) {
4380 printk(KERN_WARNING "HFC-multi: Error enabling PCI card.\n");
4381 return -EIO;
4382 }
4383 hc->leds = m->leds;
4384 hc->ledstate = 0xAFFEAFFE;
4385 hc->opticalsupport = m->opticalsupport;
4386
4387 hc->pci_iobase = 0;
4388 hc->pci_membase = NULL;
4389 hc->plx_membase = NULL;
4390
4391
4392 if (m->io_mode)
4393 hc->io_mode = m->io_mode;
4394 switch (hc->io_mode) {
4395 case HFC_IO_MODE_PLXSD:
4396 test_and_set_bit(HFC_CHIP_PLXSD, &hc->chip);
4397 hc->slots = 128;
4398 hc->HFC_outb = HFC_outb_pcimem;
4399 hc->HFC_inb = HFC_inb_pcimem;
4400 hc->HFC_inw = HFC_inw_pcimem;
4401 hc->HFC_wait = HFC_wait_pcimem;
4402 hc->read_fifo = read_fifo_pcimem;
4403 hc->write_fifo = write_fifo_pcimem;
4404 hc->plx_origmembase = hc->pci_dev->resource[0].start;
4405
4406
4407 if (!hc->plx_origmembase) {
4408 printk(KERN_WARNING
4409 "HFC-multi: No IO-Memory for PCI PLX bridge found\n");
4410 pci_disable_device(hc->pci_dev);
4411 return -EIO;
4412 }
4413
4414 hc->plx_membase = ioremap(hc->plx_origmembase, 0x80);
4415 if (!hc->plx_membase) {
4416 printk(KERN_WARNING
4417 "HFC-multi: failed to remap plx address space. "
4418 "(internal error)\n");
4419 pci_disable_device(hc->pci_dev);
4420 return -EIO;
4421 }
4422 printk(KERN_INFO
4423 "HFC-multi: plx_membase:%#lx plx_origmembase:%#lx\n",
4424 (u_long)hc->plx_membase, hc->plx_origmembase);
4425
4426 hc->pci_origmembase = hc->pci_dev->resource[2].start;
4427
4428 if (!hc->pci_origmembase) {
4429 printk(KERN_WARNING
4430 "HFC-multi: No IO-Memory for PCI card found\n");
4431 pci_disable_device(hc->pci_dev);
4432 return -EIO;
4433 }
4434
4435 hc->pci_membase = ioremap(hc->pci_origmembase, 0x400);
4436 if (!hc->pci_membase) {
4437 printk(KERN_WARNING "HFC-multi: failed to remap io "
4438 "address space. (internal error)\n");
4439 pci_disable_device(hc->pci_dev);
4440 return -EIO;
4441 }
4442
4443 printk(KERN_INFO
4444 "card %d: defined at MEMBASE %#lx (%#lx) IRQ %d HZ %d "
4445 "leds-type %d\n",
4446 hc->id, (u_long)hc->pci_membase, hc->pci_origmembase,
4447 hc->pci_dev->irq, HZ, hc->leds);
4448 pci_write_config_word(hc->pci_dev, PCI_COMMAND, PCI_ENA_MEMIO);
4449 break;
4450 case HFC_IO_MODE_PCIMEM:
4451 hc->HFC_outb = HFC_outb_pcimem;
4452 hc->HFC_inb = HFC_inb_pcimem;
4453 hc->HFC_inw = HFC_inw_pcimem;
4454 hc->HFC_wait = HFC_wait_pcimem;
4455 hc->read_fifo = read_fifo_pcimem;
4456 hc->write_fifo = write_fifo_pcimem;
4457 hc->pci_origmembase = hc->pci_dev->resource[1].start;
4458 if (!hc->pci_origmembase) {
4459 printk(KERN_WARNING
4460 "HFC-multi: No IO-Memory for PCI card found\n");
4461 pci_disable_device(hc->pci_dev);
4462 return -EIO;
4463 }
4464
4465 hc->pci_membase = ioremap(hc->pci_origmembase, 256);
4466 if (!hc->pci_membase) {
4467 printk(KERN_WARNING
4468 "HFC-multi: failed to remap io address space. "
4469 "(internal error)\n");
4470 pci_disable_device(hc->pci_dev);
4471 return -EIO;
4472 }
4473 printk(KERN_INFO "card %d: defined at MEMBASE %#lx (%#lx) IRQ "
4474 "%d HZ %d leds-type %d\n", hc->id, (u_long)hc->pci_membase,
4475 hc->pci_origmembase, hc->pci_dev->irq, HZ, hc->leds);
4476 pci_write_config_word(hc->pci_dev, PCI_COMMAND, PCI_ENA_MEMIO);
4477 break;
4478 case HFC_IO_MODE_REGIO:
4479 hc->HFC_outb = HFC_outb_regio;
4480 hc->HFC_inb = HFC_inb_regio;
4481 hc->HFC_inw = HFC_inw_regio;
4482 hc->HFC_wait = HFC_wait_regio;
4483 hc->read_fifo = read_fifo_regio;
4484 hc->write_fifo = write_fifo_regio;
4485 hc->pci_iobase = (u_int) hc->pci_dev->resource[0].start;
4486 if (!hc->pci_iobase) {
4487 printk(KERN_WARNING
4488 "HFC-multi: No IO for PCI card found\n");
4489 pci_disable_device(hc->pci_dev);
4490 return -EIO;
4491 }
4492
4493 if (!request_region(hc->pci_iobase, 8, "hfcmulti")) {
4494 printk(KERN_WARNING "HFC-multi: failed to request "
4495 "address space at 0x%08lx (internal error)\n",
4496 hc->pci_iobase);
4497 pci_disable_device(hc->pci_dev);
4498 return -EIO;
4499 }
4500
4501 printk(KERN_INFO
4502 "%s %s: defined at IOBASE %#x IRQ %d HZ %d leds-type %d\n",
4503 m->vendor_name, m->card_name, (u_int) hc->pci_iobase,
4504 hc->pci_dev->irq, HZ, hc->leds);
4505 pci_write_config_word(hc->pci_dev, PCI_COMMAND, PCI_ENA_REGIO);
4506 break;
4507 default:
4508 printk(KERN_WARNING "HFC-multi: Invalid IO mode.\n");
4509 pci_disable_device(hc->pci_dev);
4510 return -EIO;
4511 }
4512
4513 pci_set_drvdata(hc->pci_dev, hc);
4514
4515
4516
4517 return 0;
4518}
4519
4520
4521
4522
4523
4524
4525static void
4526release_port(struct hfc_multi *hc, struct dchannel *dch)
4527{
4528 int pt, ci, i = 0;
4529 u_long flags;
4530 struct bchannel *pb;
4531
4532 ci = dch->slot;
4533 pt = hc->chan[ci].port;
4534
4535 if (debug & DEBUG_HFCMULTI_INIT)
4536 printk(KERN_DEBUG "%s: entered for port %d\n",
4537 __func__, pt + 1);
4538
4539 if (pt >= hc->ports) {
4540 printk(KERN_WARNING "%s: ERROR port out of range (%d).\n",
4541 __func__, pt + 1);
4542 return;
4543 }
4544
4545 if (debug & DEBUG_HFCMULTI_INIT)
4546 printk(KERN_DEBUG "%s: releasing port=%d\n",
4547 __func__, pt + 1);
4548
4549 if (dch->dev.D.protocol == ISDN_P_TE_S0)
4550 l1_event(dch->l1, CLOSE_CHANNEL);
4551
4552 hc->chan[ci].dch = NULL;
4553
4554 if (hc->created[pt]) {
4555 hc->created[pt] = 0;
4556 mISDN_unregister_device(&dch->dev);
4557 }
4558
4559 spin_lock_irqsave(&hc->lock, flags);
4560
4561 if (dch->timer.function) {
4562 del_timer(&dch->timer);
4563 dch->timer.function = NULL;
4564 }
4565
4566 if (hc->ctype == HFC_TYPE_E1) {
4567
4568 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4569 hc->syncronized = 0;
4570 plxsd_checksync(hc, 1);
4571 }
4572
4573 for (i = 0; i <= 31; i++) {
4574 if (!((1 << i) & hc->bmask[pt]))
4575 continue;
4576 if (hc->chan[i].bch) {
4577 if (debug & DEBUG_HFCMULTI_INIT)
4578 printk(KERN_DEBUG
4579 "%s: free port %d channel %d\n",
4580 __func__, hc->chan[i].port + 1, i);
4581 pb = hc->chan[i].bch;
4582 hc->chan[i].bch = NULL;
4583 spin_unlock_irqrestore(&hc->lock, flags);
4584 mISDN_freebchannel(pb);
4585 kfree(pb);
4586 kfree(hc->chan[i].coeff);
4587 spin_lock_irqsave(&hc->lock, flags);
4588 }
4589 }
4590 } else {
4591
4592 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4593 hc->syncronized &=
4594 ~(1 << hc->chan[ci].port);
4595 plxsd_checksync(hc, 1);
4596 }
4597
4598 if (hc->chan[ci - 2].bch) {
4599 if (debug & DEBUG_HFCMULTI_INIT)
4600 printk(KERN_DEBUG
4601 "%s: free port %d channel %d\n",
4602 __func__, hc->chan[ci - 2].port + 1,
4603 ci - 2);
4604 pb = hc->chan[ci - 2].bch;
4605 hc->chan[ci - 2].bch = NULL;
4606 spin_unlock_irqrestore(&hc->lock, flags);
4607 mISDN_freebchannel(pb);
4608 kfree(pb);
4609 kfree(hc->chan[ci - 2].coeff);
4610 spin_lock_irqsave(&hc->lock, flags);
4611 }
4612 if (hc->chan[ci - 1].bch) {
4613 if (debug & DEBUG_HFCMULTI_INIT)
4614 printk(KERN_DEBUG
4615 "%s: free port %d channel %d\n",
4616 __func__, hc->chan[ci - 1].port + 1,
4617 ci - 1);
4618 pb = hc->chan[ci - 1].bch;
4619 hc->chan[ci - 1].bch = NULL;
4620 spin_unlock_irqrestore(&hc->lock, flags);
4621 mISDN_freebchannel(pb);
4622 kfree(pb);
4623 kfree(hc->chan[ci - 1].coeff);
4624 spin_lock_irqsave(&hc->lock, flags);
4625 }
4626 }
4627
4628 spin_unlock_irqrestore(&hc->lock, flags);
4629
4630 if (debug & DEBUG_HFCMULTI_INIT)
4631 printk(KERN_DEBUG "%s: free port %d channel D(%d)\n", __func__,
4632 pt+1, ci);
4633 mISDN_freedchannel(dch);
4634 kfree(dch);
4635
4636 if (debug & DEBUG_HFCMULTI_INIT)
4637 printk(KERN_DEBUG "%s: done!\n", __func__);
4638}
4639
4640static void
4641release_card(struct hfc_multi *hc)
4642{
4643 u_long flags;
4644 int ch;
4645
4646 if (debug & DEBUG_HFCMULTI_INIT)
4647 printk(KERN_DEBUG "%s: release card (%d) entered\n",
4648 __func__, hc->id);
4649
4650
4651 if (hc->iclock)
4652 mISDN_unregister_clock(hc->iclock);
4653
4654
4655 spin_lock_irqsave(&hc->lock, flags);
4656 disable_hwirq(hc);
4657 spin_unlock_irqrestore(&hc->lock, flags);
4658 udelay(1000);
4659 if (hc->irq) {
4660 if (debug & DEBUG_HFCMULTI_INIT)
4661 printk(KERN_DEBUG "%s: free irq %d (hc=%p)\n",
4662 __func__, hc->irq, hc);
4663 free_irq(hc->irq, hc);
4664 hc->irq = 0;
4665
4666 }
4667
4668
4669 if (debug & DEBUG_HFCMULTI_INIT)
4670 printk(KERN_DEBUG "%s: disable all channels (d and b)\n",
4671 __func__);
4672 for (ch = 0; ch <= 31; ch++) {
4673 if (hc->chan[ch].dch)
4674 release_port(hc, hc->chan[ch].dch);
4675 }
4676
4677
4678 if (hc->leds)
4679 hfcmulti_leds(hc);
4680
4681
4682 release_io_hfcmulti(hc);
4683
4684 if (debug & DEBUG_HFCMULTI_INIT)
4685 printk(KERN_DEBUG "%s: remove instance from list\n",
4686 __func__);
4687 list_del(&hc->list);
4688
4689 if (debug & DEBUG_HFCMULTI_INIT)
4690 printk(KERN_DEBUG "%s: delete instance\n", __func__);
4691 if (hc == syncmaster)
4692 syncmaster = NULL;
4693 kfree(hc);
4694 if (debug & DEBUG_HFCMULTI_INIT)
4695 printk(KERN_DEBUG "%s: card successfully removed\n",
4696 __func__);
4697}
4698
4699static void
4700init_e1_port_hw(struct hfc_multi *hc, struct hm_map *m)
4701{
4702
4703 if (port[Port_cnt] & 0x001) {
4704 if (!m->opticalsupport) {
4705 printk(KERN_INFO
4706 "This board has no optical "
4707 "support\n");
4708 } else {
4709 if (debug & DEBUG_HFCMULTI_INIT)
4710 printk(KERN_DEBUG
4711 "%s: PORT set optical "
4712 "interfacs: card(%d) "
4713 "port(%d)\n",
4714 __func__,
4715 HFC_cnt + 1, 1);
4716 test_and_set_bit(HFC_CFG_OPTICAL,
4717 &hc->chan[hc->dnum[0]].cfg);
4718 }
4719 }
4720
4721 if (port[Port_cnt] & 0x004) {
4722 if (debug & DEBUG_HFCMULTI_INIT)
4723 printk(KERN_DEBUG "%s: PORT set "
4724 "LOS report: card(%d) port(%d)\n",
4725 __func__, HFC_cnt + 1, 1);
4726 test_and_set_bit(HFC_CFG_REPORT_LOS,
4727 &hc->chan[hc->dnum[0]].cfg);
4728 }
4729
4730 if (port[Port_cnt] & 0x008) {
4731 if (debug & DEBUG_HFCMULTI_INIT)
4732 printk(KERN_DEBUG "%s: PORT set "
4733 "AIS report: card(%d) port(%d)\n",
4734 __func__, HFC_cnt + 1, 1);
4735 test_and_set_bit(HFC_CFG_REPORT_AIS,
4736 &hc->chan[hc->dnum[0]].cfg);
4737 }
4738
4739 if (port[Port_cnt] & 0x010) {
4740 if (debug & DEBUG_HFCMULTI_INIT)
4741 printk(KERN_DEBUG
4742 "%s: PORT set SLIP report: "
4743 "card(%d) port(%d)\n",
4744 __func__, HFC_cnt + 1, 1);
4745 test_and_set_bit(HFC_CFG_REPORT_SLIP,
4746 &hc->chan[hc->dnum[0]].cfg);
4747 }
4748
4749 if (port[Port_cnt] & 0x020) {
4750 if (debug & DEBUG_HFCMULTI_INIT)
4751 printk(KERN_DEBUG
4752 "%s: PORT set RDI report: "
4753 "card(%d) port(%d)\n",
4754 __func__, HFC_cnt + 1, 1);
4755 test_and_set_bit(HFC_CFG_REPORT_RDI,
4756 &hc->chan[hc->dnum[0]].cfg);
4757 }
4758
4759 if (!(port[Port_cnt] & 0x100)) {
4760 if (debug & DEBUG_HFCMULTI_INIT)
4761 printk(KERN_DEBUG "%s: PORT turn on CRC4 report:"
4762 " card(%d) port(%d)\n",
4763 __func__, HFC_cnt + 1, 1);
4764 test_and_set_bit(HFC_CFG_CRC4,
4765 &hc->chan[hc->dnum[0]].cfg);
4766 } else {
4767 if (debug & DEBUG_HFCMULTI_INIT)
4768 printk(KERN_DEBUG "%s: PORT turn off CRC4"
4769 " report: card(%d) port(%d)\n",
4770 __func__, HFC_cnt + 1, 1);
4771 }
4772
4773 if (port[Port_cnt] & 0x0200) {
4774 if (debug & DEBUG_HFCMULTI_INIT)
4775 printk(KERN_DEBUG "%s: PORT force getting clock from "
4776 "E1: card(%d) port(%d)\n",
4777 __func__, HFC_cnt + 1, 1);
4778 test_and_set_bit(HFC_CHIP_E1CLOCK_GET, &hc->chip);
4779 } else
4780 if (port[Port_cnt] & 0x0400) {
4781 if (debug & DEBUG_HFCMULTI_INIT)
4782 printk(KERN_DEBUG "%s: PORT force putting clock to "
4783 "E1: card(%d) port(%d)\n",
4784 __func__, HFC_cnt + 1, 1);
4785 test_and_set_bit(HFC_CHIP_E1CLOCK_PUT, &hc->chip);
4786 }
4787
4788 if (port[Port_cnt] & 0x0800) {
4789 if (debug & DEBUG_HFCMULTI_INIT)
4790 printk(KERN_DEBUG "%s: PORT disable JATT PLL on "
4791 "E1: card(%d) port(%d)\n",
4792 __func__, HFC_cnt + 1, 1);
4793 test_and_set_bit(HFC_CHIP_RX_SYNC, &hc->chip);
4794 }
4795
4796 if (port[Port_cnt] & 0x3000) {
4797 hc->chan[hc->dnum[0]].jitter = (port[Port_cnt]>>12) & 0x3;
4798 if (debug & DEBUG_HFCMULTI_INIT)
4799 printk(KERN_DEBUG
4800 "%s: PORT set elastic "
4801 "buffer to %d: card(%d) port(%d)\n",
4802 __func__, hc->chan[hc->dnum[0]].jitter,
4803 HFC_cnt + 1, 1);
4804 } else
4805 hc->chan[hc->dnum[0]].jitter = 2;
4806}
4807
4808static int
4809init_e1_port(struct hfc_multi *hc, struct hm_map *m, int pt)
4810{
4811 struct dchannel *dch;
4812 struct bchannel *bch;
4813 int ch, ret = 0;
4814 char name[MISDN_MAX_IDLEN];
4815 int bcount = 0;
4816
4817 dch = kzalloc(sizeof(struct dchannel), GFP_KERNEL);
4818 if (!dch)
4819 return -ENOMEM;
4820 dch->debug = debug;
4821 mISDN_initdchannel(dch, MAX_DFRAME_LEN_L1, ph_state_change);
4822 dch->hw = hc;
4823 dch->dev.Dprotocols = (1 << ISDN_P_TE_E1) | (1 << ISDN_P_NT_E1);
4824 dch->dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
4825 (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
4826 dch->dev.D.send = handle_dmsg;
4827 dch->dev.D.ctrl = hfcm_dctrl;
4828 dch->slot = hc->dnum[pt];
4829 hc->chan[hc->dnum[pt]].dch = dch;
4830 hc->chan[hc->dnum[pt]].port = pt;
4831 hc->chan[hc->dnum[pt]].nt_timer = -1;
4832 for (ch = 1; ch <= 31; ch++) {
4833 if (!((1 << ch) & hc->bmask[pt]))
4834 continue;
4835 bch = kzalloc(sizeof(struct bchannel), GFP_KERNEL);
4836 if (!bch) {
4837 printk(KERN_ERR "%s: no memory for bchannel\n",
4838 __func__);
4839 ret = -ENOMEM;
4840 goto free_chan;
4841 }
4842 hc->chan[ch].coeff = kzalloc(512, GFP_KERNEL);
4843 if (!hc->chan[ch].coeff) {
4844 printk(KERN_ERR "%s: no memory for coeffs\n",
4845 __func__);
4846 ret = -ENOMEM;
4847 kfree(bch);
4848 goto free_chan;
4849 }
4850 bch->nr = ch;
4851 bch->slot = ch;
4852 bch->debug = debug;
4853 mISDN_initbchannel(bch, MAX_DATA_MEM, poll >> 1);
4854 bch->hw = hc;
4855 bch->ch.send = handle_bmsg;
4856 bch->ch.ctrl = hfcm_bctrl;
4857 bch->ch.nr = ch;
4858 list_add(&bch->ch.list, &dch->dev.bchannels);
4859 hc->chan[ch].bch = bch;
4860 hc->chan[ch].port = pt;
4861 set_channelmap(bch->nr, dch->dev.channelmap);
4862 bcount++;
4863 }
4864 dch->dev.nrbchan = bcount;
4865 if (pt == 0)
4866 init_e1_port_hw(hc, m);
4867 if (hc->ports > 1)
4868 snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d-%d",
4869 HFC_cnt + 1, pt+1);
4870 else
4871 snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d", HFC_cnt + 1);
4872 ret = mISDN_register_device(&dch->dev, &hc->pci_dev->dev, name);
4873 if (ret)
4874 goto free_chan;
4875 hc->created[pt] = 1;
4876 return ret;
4877free_chan:
4878 release_port(hc, dch);
4879 return ret;
4880}
4881
4882static int
4883init_multi_port(struct hfc_multi *hc, int pt)
4884{
4885 struct dchannel *dch;
4886 struct bchannel *bch;
4887 int ch, i, ret = 0;
4888 char name[MISDN_MAX_IDLEN];
4889
4890 dch = kzalloc(sizeof(struct dchannel), GFP_KERNEL);
4891 if (!dch)
4892 return -ENOMEM;
4893 dch->debug = debug;
4894 mISDN_initdchannel(dch, MAX_DFRAME_LEN_L1, ph_state_change);
4895 dch->hw = hc;
4896 dch->dev.Dprotocols = (1 << ISDN_P_TE_S0) | (1 << ISDN_P_NT_S0);
4897 dch->dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
4898 (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
4899 dch->dev.D.send = handle_dmsg;
4900 dch->dev.D.ctrl = hfcm_dctrl;
4901 dch->dev.nrbchan = 2;
4902 i = pt << 2;
4903 dch->slot = i + 2;
4904 hc->chan[i + 2].dch = dch;
4905 hc->chan[i + 2].port = pt;
4906 hc->chan[i + 2].nt_timer = -1;
4907 for (ch = 0; ch < dch->dev.nrbchan; ch++) {
4908 bch = kzalloc(sizeof(struct bchannel), GFP_KERNEL);
4909 if (!bch) {
4910 printk(KERN_ERR "%s: no memory for bchannel\n",
4911 __func__);
4912 ret = -ENOMEM;
4913 goto free_chan;
4914 }
4915 hc->chan[i + ch].coeff = kzalloc(512, GFP_KERNEL);
4916 if (!hc->chan[i + ch].coeff) {
4917 printk(KERN_ERR "%s: no memory for coeffs\n",
4918 __func__);
4919 ret = -ENOMEM;
4920 kfree(bch);
4921 goto free_chan;
4922 }
4923 bch->nr = ch + 1;
4924 bch->slot = i + ch;
4925 bch->debug = debug;
4926 mISDN_initbchannel(bch, MAX_DATA_MEM, poll >> 1);
4927 bch->hw = hc;
4928 bch->ch.send = handle_bmsg;
4929 bch->ch.ctrl = hfcm_bctrl;
4930 bch->ch.nr = ch + 1;
4931 list_add(&bch->ch.list, &dch->dev.bchannels);
4932 hc->chan[i + ch].bch = bch;
4933 hc->chan[i + ch].port = pt;
4934 set_channelmap(bch->nr, dch->dev.channelmap);
4935 }
4936
4937 if (port[Port_cnt] & 0x001) {
4938 if (debug & DEBUG_HFCMULTI_INIT)
4939 printk(KERN_DEBUG
4940 "%s: PROTOCOL set master clock: "
4941 "card(%d) port(%d)\n",
4942 __func__, HFC_cnt + 1, pt + 1);
4943 if (dch->dev.D.protocol != ISDN_P_TE_S0) {
4944 printk(KERN_ERR "Error: Master clock "
4945 "for port(%d) of card(%d) is only"
4946 " possible with TE-mode\n",
4947 pt + 1, HFC_cnt + 1);
4948 ret = -EINVAL;
4949 goto free_chan;
4950 }
4951 if (hc->masterclk >= 0) {
4952 printk(KERN_ERR "Error: Master clock "
4953 "for port(%d) of card(%d) already "
4954 "defined for port(%d)\n",
4955 pt + 1, HFC_cnt + 1, hc->masterclk + 1);
4956 ret = -EINVAL;
4957 goto free_chan;
4958 }
4959 hc->masterclk = pt;
4960 }
4961
4962 if (port[Port_cnt] & 0x002) {
4963 if (debug & DEBUG_HFCMULTI_INIT)
4964 printk(KERN_DEBUG
4965 "%s: PROTOCOL set non capacitive "
4966 "transmitter: card(%d) port(%d)\n",
4967 __func__, HFC_cnt + 1, pt + 1);
4968 test_and_set_bit(HFC_CFG_NONCAP_TX,
4969 &hc->chan[i + 2].cfg);
4970 }
4971
4972 if (port[Port_cnt] & 0x004) {
4973 if (debug & DEBUG_HFCMULTI_INIT)
4974 printk(KERN_DEBUG
4975 "%s: PROTOCOL disable E-channel: "
4976 "card(%d) port(%d)\n",
4977 __func__, HFC_cnt + 1, pt + 1);
4978 test_and_set_bit(HFC_CFG_DIS_ECHANNEL,
4979 &hc->chan[i + 2].cfg);
4980 }
4981 if (hc->ctype == HFC_TYPE_XHFC) {
4982 snprintf(name, MISDN_MAX_IDLEN - 1, "xhfc.%d-%d",
4983 HFC_cnt + 1, pt + 1);
4984 ret = mISDN_register_device(&dch->dev, NULL, name);
4985 } else {
4986 snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-%ds.%d-%d",
4987 hc->ctype, HFC_cnt + 1, pt + 1);
4988 ret = mISDN_register_device(&dch->dev, &hc->pci_dev->dev, name);
4989 }
4990 if (ret)
4991 goto free_chan;
4992 hc->created[pt] = 1;
4993 return ret;
4994free_chan:
4995 release_port(hc, dch);
4996 return ret;
4997}
4998
4999static int
5000hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
5001 const struct pci_device_id *ent)
5002{
5003 int ret_err = 0;
5004 int pt;
5005 struct hfc_multi *hc;
5006 u_long flags;
5007 u_char dips = 0, pmj = 0;
5008 int i, ch;
5009 u_int maskcheck;
5010
5011 if (HFC_cnt >= MAX_CARDS) {
5012 printk(KERN_ERR "too many cards (max=%d).\n",
5013 MAX_CARDS);
5014 return -EINVAL;
5015 }
5016 if ((type[HFC_cnt] & 0xff) && (type[HFC_cnt] & 0xff) != m->type) {
5017 printk(KERN_WARNING "HFC-MULTI: Card '%s:%s' type %d found but "
5018 "type[%d] %d was supplied as module parameter\n",
5019 m->vendor_name, m->card_name, m->type, HFC_cnt,
5020 type[HFC_cnt] & 0xff);
5021 printk(KERN_WARNING "HFC-MULTI: Load module without parameters "
5022 "first, to see cards and their types.");
5023 return -EINVAL;
5024 }
5025 if (debug & DEBUG_HFCMULTI_INIT)
5026 printk(KERN_DEBUG "%s: Registering %s:%s chip type %d (0x%x)\n",
5027 __func__, m->vendor_name, m->card_name, m->type,
5028 type[HFC_cnt]);
5029
5030
5031 hc = kzalloc(sizeof(struct hfc_multi), GFP_KERNEL);
5032 if (!hc) {
5033 printk(KERN_ERR "No kmem for HFC-Multi card\n");
5034 return -ENOMEM;
5035 }
5036 spin_lock_init(&hc->lock);
5037 hc->mtyp = m;
5038 hc->ctype = m->type;
5039 hc->ports = m->ports;
5040 hc->id = HFC_cnt;
5041 hc->pcm = pcm[HFC_cnt];
5042 hc->io_mode = iomode[HFC_cnt];
5043 if (hc->ctype == HFC_TYPE_E1 && dmask[E1_cnt]) {
5044
5045 pt = 0;
5046 maskcheck = 0;
5047 for (ch = 0; ch <= 31; ch++) {
5048 if (!((1 << ch) & dmask[E1_cnt]))
5049 continue;
5050 hc->dnum[pt] = ch;
5051 hc->bmask[pt] = bmask[bmask_cnt++];
5052 if ((maskcheck & hc->bmask[pt])
5053 || (dmask[E1_cnt] & hc->bmask[pt])) {
5054 printk(KERN_INFO
5055 "HFC-E1 #%d has overlapping B-channels on fragment #%d\n",
5056 E1_cnt + 1, pt);
5057 kfree(hc);
5058 return -EINVAL;
5059 }
5060 maskcheck |= hc->bmask[pt];
5061 printk(KERN_INFO
5062 "HFC-E1 #%d uses D-channel on slot %d and a B-channel map of 0x%08x\n",
5063 E1_cnt + 1, ch, hc->bmask[pt]);
5064 pt++;
5065 }
5066 hc->ports = pt;
5067 }
5068 if (hc->ctype == HFC_TYPE_E1 && !dmask[E1_cnt]) {
5069
5070 hc->dnum[0] = 16;
5071 hc->bmask[0] = 0xfffefffe;
5072 hc->ports = 1;
5073 }
5074
5075
5076 hc->masterclk = -1;
5077 if (type[HFC_cnt] & 0x100) {
5078 test_and_set_bit(HFC_CHIP_ULAW, &hc->chip);
5079 hc->silence = 0xff;
5080 } else
5081 hc->silence = 0x2a;
5082 if ((poll >> 1) > sizeof(hc->silence_data)) {
5083 printk(KERN_ERR "HFCMULTI error: silence_data too small, "
5084 "please fix\n");
5085 kfree(hc);
5086 return -EINVAL;
5087 }
5088 for (i = 0; i < (poll >> 1); i++)
5089 hc->silence_data[i] = hc->silence;
5090
5091 if (hc->ctype != HFC_TYPE_XHFC) {
5092 if (!(type[HFC_cnt] & 0x200))
5093 test_and_set_bit(HFC_CHIP_DTMF, &hc->chip);
5094 test_and_set_bit(HFC_CHIP_CONF, &hc->chip);
5095 }
5096
5097 if (type[HFC_cnt] & 0x800)
5098 test_and_set_bit(HFC_CHIP_PCM_SLAVE, &hc->chip);
5099 if (type[HFC_cnt] & 0x1000) {
5100 test_and_set_bit(HFC_CHIP_PCM_MASTER, &hc->chip);
5101 test_and_clear_bit(HFC_CHIP_PCM_SLAVE, &hc->chip);
5102 }
5103 if (type[HFC_cnt] & 0x4000)
5104 test_and_set_bit(HFC_CHIP_EXRAM_128, &hc->chip);
5105 if (type[HFC_cnt] & 0x8000)
5106 test_and_set_bit(HFC_CHIP_EXRAM_512, &hc->chip);
5107 hc->slots = 32;
5108 if (type[HFC_cnt] & 0x10000)
5109 hc->slots = 64;
5110 if (type[HFC_cnt] & 0x20000)
5111 hc->slots = 128;
5112 if (type[HFC_cnt] & 0x80000) {
5113 test_and_set_bit(HFC_CHIP_WATCHDOG, &hc->chip);
5114 hc->wdcount = 0;
5115 hc->wdbyte = V_GPIO_OUT2;
5116 printk(KERN_NOTICE "Watchdog enabled\n");
5117 }
5118
5119 if (pdev && ent)
5120
5121 ret_err = setup_pci(hc, pdev, ent);
5122 else
5123#ifdef CONFIG_MISDN_HFCMULTI_8xx
5124 ret_err = setup_embedded(hc, m);
5125#else
5126 {
5127 printk(KERN_WARNING "Embedded IO Mode not selected\n");
5128 ret_err = -EIO;
5129 }
5130#endif
5131 if (ret_err) {
5132 if (hc == syncmaster)
5133 syncmaster = NULL;
5134 kfree(hc);
5135 return ret_err;
5136 }
5137
5138 hc->HFC_outb_nodebug = hc->HFC_outb;
5139 hc->HFC_inb_nodebug = hc->HFC_inb;
5140 hc->HFC_inw_nodebug = hc->HFC_inw;
5141 hc->HFC_wait_nodebug = hc->HFC_wait;
5142#ifdef HFC_REGISTER_DEBUG
5143 hc->HFC_outb = HFC_outb_debug;
5144 hc->HFC_inb = HFC_inb_debug;
5145 hc->HFC_inw = HFC_inw_debug;
5146 hc->HFC_wait = HFC_wait_debug;
5147#endif
5148
5149 for (pt = 0; pt < hc->ports; pt++) {
5150 if (Port_cnt >= MAX_PORTS) {
5151 printk(KERN_ERR "too many ports (max=%d).\n",
5152 MAX_PORTS);
5153 ret_err = -EINVAL;
5154 goto free_card;
5155 }
5156 if (hc->ctype == HFC_TYPE_E1)
5157 ret_err = init_e1_port(hc, m, pt);
5158 else
5159 ret_err = init_multi_port(hc, pt);
5160 if (debug & DEBUG_HFCMULTI_INIT)
5161 printk(KERN_DEBUG
5162 "%s: Registering D-channel, card(%d) port(%d) "
5163 "result %d\n",
5164 __func__, HFC_cnt + 1, pt + 1, ret_err);
5165
5166 if (ret_err) {
5167 while (pt) {
5168 pt--;
5169 if (hc->ctype == HFC_TYPE_E1)
5170 release_port(hc,
5171 hc->chan[hc->dnum[pt]].dch);
5172 else
5173 release_port(hc,
5174 hc->chan[(pt << 2) + 2].dch);
5175 }
5176 goto free_card;
5177 }
5178 if (hc->ctype != HFC_TYPE_E1)
5179 Port_cnt++;
5180 }
5181 if (hc->ctype == HFC_TYPE_E1) {
5182 Port_cnt++;
5183 E1_cnt++;
5184 }
5185
5186
5187 switch (m->dip_type) {
5188 case DIP_4S:
5189
5190
5191
5192
5193
5194 dips = ((~HFC_inb(hc, R_GPIO_IN1) & 0xE0) >> 5) |
5195 ((~HFC_inb(hc, R_GPI_IN2) & 0x80) >> 3) |
5196 (~HFC_inb(hc, R_GPI_IN2) & 0x08);
5197
5198
5199 pmj = ((HFC_inb(hc, R_GPI_IN3) >> 4) & 0xf);
5200
5201 if (test_bit(HFC_CHIP_B410P, &hc->chip))
5202 pmj = ~pmj & 0xf;
5203
5204 printk(KERN_INFO "%s: %s DIPs(0x%x) jumpers(0x%x)\n",
5205 m->vendor_name, m->card_name, dips, pmj);
5206 break;
5207 case DIP_8S:
5208
5209
5210
5211
5212 HFC_outb(hc, R_BRG_PCM_CFG, 1 | V_PCM_CLK);
5213
5214 outw(0x4000, hc->pci_iobase + 4);
5215
5216
5217
5218
5219 dips = inb(hc->pci_iobase);
5220 dips = inb(hc->pci_iobase);
5221 dips = inb(hc->pci_iobase);
5222 dips = ~inb(hc->pci_iobase) & 0x3F;
5223 outw(0x0, hc->pci_iobase + 4);
5224
5225 HFC_outb(hc, R_BRG_PCM_CFG, V_PCM_CLK);
5226 printk(KERN_INFO "%s: %s DIPs(0x%x)\n",
5227 m->vendor_name, m->card_name, dips);
5228 break;
5229 case DIP_E1:
5230
5231
5232
5233
5234 dips = (~HFC_inb(hc, R_GPI_IN0) & 0xF0) >> 4;
5235 printk(KERN_INFO "%s: %s DIPs(0x%x)\n",
5236 m->vendor_name, m->card_name, dips);
5237 break;
5238 }
5239
5240
5241 spin_lock_irqsave(&HFClock, flags);
5242 list_add_tail(&hc->list, &HFClist);
5243 spin_unlock_irqrestore(&HFClock, flags);
5244
5245
5246 if (clock == HFC_cnt + 1)
5247 hc->iclock = mISDN_register_clock("HFCMulti", 0, clockctl, hc);
5248
5249
5250 hc->irq = (m->irq) ? : hc->pci_dev->irq;
5251 ret_err = init_card(hc);
5252 if (ret_err) {
5253 printk(KERN_ERR "init card returns %d\n", ret_err);
5254 release_card(hc);
5255 return ret_err;
5256 }
5257
5258
5259 spin_lock_irqsave(&hc->lock, flags);
5260 enable_hwirq(hc);
5261 spin_unlock_irqrestore(&hc->lock, flags);
5262 return 0;
5263
5264free_card:
5265 release_io_hfcmulti(hc);
5266 if (hc == syncmaster)
5267 syncmaster = NULL;
5268 kfree(hc);
5269 return ret_err;
5270}
5271
5272static void hfc_remove_pci(struct pci_dev *pdev)
5273{
5274 struct hfc_multi *card = pci_get_drvdata(pdev);
5275 u_long flags;
5276
5277 if (debug)
5278 printk(KERN_INFO "removing hfc_multi card vendor:%x "
5279 "device:%x subvendor:%x subdevice:%x\n",
5280 pdev->vendor, pdev->device,
5281 pdev->subsystem_vendor, pdev->subsystem_device);
5282
5283 if (card) {
5284 spin_lock_irqsave(&HFClock, flags);
5285 release_card(card);
5286 spin_unlock_irqrestore(&HFClock, flags);
5287 } else {
5288 if (debug)
5289 printk(KERN_DEBUG "%s: drvdata already removed\n",
5290 __func__);
5291 }
5292}
5293
5294#define VENDOR_CCD "Cologne Chip AG"
5295#define VENDOR_BN "beroNet GmbH"
5296#define VENDOR_DIG "Digium Inc."
5297#define VENDOR_JH "Junghanns.NET GmbH"
5298#define VENDOR_PRIM "PrimuX"
5299
5300static const struct hm_map hfcm_map[] = {
5301 {VENDOR_BN, "HFC-1S Card (mini PCI)", 4, 1, 1, 3, 0, DIP_4S, 0, 0},
5302 {VENDOR_BN, "HFC-2S Card", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
5303 {VENDOR_BN, "HFC-2S Card (mini PCI)", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
5304 {VENDOR_BN, "HFC-4S Card", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
5305 {VENDOR_BN, "HFC-4S Card (mini PCI)", 4, 4, 1, 2, 0, 0, 0, 0},
5306 {VENDOR_CCD, "HFC-4S Eval (old)", 4, 4, 0, 0, 0, 0, 0, 0},
5307 {VENDOR_CCD, "HFC-4S IOB4ST", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
5308 {VENDOR_CCD, "HFC-4S", 4, 4, 1, 2, 0, 0, 0, 0},
5309 {VENDOR_DIG, "HFC-4S Card", 4, 4, 0, 2, 0, 0, HFC_IO_MODE_REGIO, 0},
5310 {VENDOR_CCD, "HFC-4S Swyx 4xS0 SX2 QuadBri", 4, 4, 1, 2, 0, 0, 0, 0},
5311 {VENDOR_JH, "HFC-4S (junghanns 2.0)", 4, 4, 1, 2, 0, 0, 0, 0},
5312 {VENDOR_PRIM, "HFC-2S Primux Card", 4, 2, 0, 0, 0, 0, 0, 0},
5313
5314 {VENDOR_BN, "HFC-8S Card", 8, 8, 1, 0, 0, 0, 0, 0},
5315 {VENDOR_BN, "HFC-8S Card (+)", 8, 8, 1, 8, 0, DIP_8S,
5316 HFC_IO_MODE_REGIO, 0},
5317 {VENDOR_CCD, "HFC-8S Eval (old)", 8, 8, 0, 0, 0, 0, 0, 0},
5318 {VENDOR_CCD, "HFC-8S IOB4ST Recording", 8, 8, 1, 0, 0, 0, 0, 0},
5319
5320 {VENDOR_CCD, "HFC-8S IOB8ST", 8, 8, 1, 0, 0, 0, 0, 0},
5321 {VENDOR_CCD, "HFC-8S", 8, 8, 1, 0, 0, 0, 0, 0},
5322 {VENDOR_CCD, "HFC-8S", 8, 8, 1, 0, 0, 0, 0, 0},
5323
5324 {VENDOR_BN, "HFC-E1 Card", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
5325 {VENDOR_BN, "HFC-E1 Card (mini PCI)", 1, 1, 0, 1, 0, 0, 0, 0},
5326 {VENDOR_BN, "HFC-E1+ Card (Dual)", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
5327 {VENDOR_BN, "HFC-E1 Card (Dual)", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
5328
5329 {VENDOR_CCD, "HFC-E1 Eval (old)", 1, 1, 0, 0, 0, 0, 0, 0},
5330 {VENDOR_CCD, "HFC-E1 IOB1E1", 1, 1, 0, 1, 0, 0, 0, 0},
5331 {VENDOR_CCD, "HFC-E1", 1, 1, 0, 1, 0, 0, 0, 0},
5332
5333 {VENDOR_CCD, "HFC-4S Speech Design", 4, 4, 0, 0, 0, 0,
5334 HFC_IO_MODE_PLXSD, 0},
5335 {VENDOR_CCD, "HFC-E1 Speech Design", 1, 1, 0, 0, 0, 0,
5336 HFC_IO_MODE_PLXSD, 0},
5337 {VENDOR_CCD, "HFC-4S OpenVox", 4, 4, 1, 0, 0, 0, 0, 0},
5338 {VENDOR_CCD, "HFC-2S OpenVox", 4, 2, 1, 0, 0, 0, 0, 0},
5339 {VENDOR_CCD, "HFC-8S OpenVox", 8, 8, 1, 0, 0, 0, 0, 0},
5340 {VENDOR_CCD, "XHFC-4S Speech Design", 5, 4, 0, 0, 0, 0,
5341 HFC_IO_MODE_EMBSD, XHFC_IRQ},
5342 {VENDOR_JH, "HFC-8S (junghanns)", 8, 8, 1, 0, 0, 0, 0, 0},
5343 {VENDOR_BN, "HFC-2S Beronet Card PCIe", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
5344 {VENDOR_BN, "HFC-4S Beronet Card PCIe", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
5345};
5346
5347#undef H
5348#define H(x) ((unsigned long)&hfcm_map[x])
5349static const struct pci_device_id hfmultipci_ids[] = {
5350
5351
5352 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5353 PCI_SUBDEVICE_ID_CCD_BN1SM, 0, 0, H(0)},
5354 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5355 PCI_SUBDEVICE_ID_CCD_BN2S, 0, 0, H(1)},
5356 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5357 PCI_SUBDEVICE_ID_CCD_BN2SM, 0, 0, H(2)},
5358 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5359 PCI_SUBDEVICE_ID_CCD_BN4S, 0, 0, H(3)},
5360 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5361 PCI_SUBDEVICE_ID_CCD_BN4SM, 0, 0, H(4)},
5362 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5363 PCI_DEVICE_ID_CCD_HFC4S, 0, 0, H(5)},
5364 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5365 PCI_SUBDEVICE_ID_CCD_IOB4ST, 0, 0, H(6)},
5366 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5367 PCI_SUBDEVICE_ID_CCD_HFC4S, 0, 0, H(7)},
5368 { PCI_VENDOR_ID_DIGIUM, PCI_DEVICE_ID_DIGIUM_HFC4S,
5369 PCI_VENDOR_ID_DIGIUM, PCI_DEVICE_ID_DIGIUM_HFC4S, 0, 0, H(8)},
5370 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5371 PCI_SUBDEVICE_ID_CCD_SWYX4S, 0, 0, H(9)},
5372 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5373 PCI_SUBDEVICE_ID_CCD_JH4S20, 0, 0, H(10)},
5374 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5375 PCI_SUBDEVICE_ID_CCD_PMX2S, 0, 0, H(11)},
5376 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5377 PCI_SUBDEVICE_ID_CCD_OV4S, 0, 0, H(28)},
5378 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5379 PCI_SUBDEVICE_ID_CCD_OV2S, 0, 0, H(29)},
5380 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5381 0xb761, 0, 0, H(33)},
5382 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5383 0xb762, 0, 0, H(34)},
5384
5385
5386 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5387 PCI_SUBDEVICE_ID_CCD_BN8S, 0, 0, H(12)},
5388 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5389 PCI_SUBDEVICE_ID_CCD_BN8SP, 0, 0, H(13)},
5390 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5391 PCI_DEVICE_ID_CCD_HFC8S, 0, 0, H(14)},
5392 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5393 PCI_SUBDEVICE_ID_CCD_IOB8STR, 0, 0, H(15)},
5394 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5395 PCI_SUBDEVICE_ID_CCD_IOB8ST, 0, 0, H(16)},
5396 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5397 PCI_SUBDEVICE_ID_CCD_IOB8ST_1, 0, 0, H(17)},
5398 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5399 PCI_SUBDEVICE_ID_CCD_HFC8S, 0, 0, H(18)},
5400 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5401 PCI_SUBDEVICE_ID_CCD_OV8S, 0, 0, H(30)},
5402 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5403 PCI_SUBDEVICE_ID_CCD_JH8S, 0, 0, H(32)},
5404
5405
5406
5407 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5408 PCI_SUBDEVICE_ID_CCD_BNE1, 0, 0, H(19)},
5409 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5410 PCI_SUBDEVICE_ID_CCD_BNE1M, 0, 0, H(20)},
5411 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5412 PCI_SUBDEVICE_ID_CCD_BNE1DP, 0, 0, H(21)},
5413 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5414 PCI_SUBDEVICE_ID_CCD_BNE1D, 0, 0, H(22)},
5415
5416 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5417 PCI_DEVICE_ID_CCD_HFCE1, 0, 0, H(23)},
5418 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5419 PCI_SUBDEVICE_ID_CCD_IOB1E1, 0, 0, H(24)},
5420 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5421 PCI_SUBDEVICE_ID_CCD_HFCE1, 0, 0, H(25)},
5422
5423 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, PCI_VENDOR_ID_CCD,
5424 PCI_SUBDEVICE_ID_CCD_SPD4S, 0, 0, H(26)},
5425 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, PCI_VENDOR_ID_CCD,
5426 PCI_SUBDEVICE_ID_CCD_SPDE1, 0, 0, H(27)},
5427
5428 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5429 PCI_SUBDEVICE_ID_CCD_JHSE1, 0, 0, H(25)},
5430
5431 { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_HFC4S), 0 },
5432 { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_HFC8S), 0 },
5433 { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_HFCE1), 0 },
5434 {0, }
5435};
5436#undef H
5437
5438MODULE_DEVICE_TABLE(pci, hfmultipci_ids);
5439
5440static int
5441hfcmulti_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
5442{
5443 struct hm_map *m = (struct hm_map *)ent->driver_data;
5444 int ret;
5445
5446 if (m == NULL && ent->vendor == PCI_VENDOR_ID_CCD && (
5447 ent->device == PCI_DEVICE_ID_CCD_HFC4S ||
5448 ent->device == PCI_DEVICE_ID_CCD_HFC8S ||
5449 ent->device == PCI_DEVICE_ID_CCD_HFCE1)) {
5450 printk(KERN_ERR
5451 "Unknown HFC multiport controller (vendor:%04x device:%04x "
5452 "subvendor:%04x subdevice:%04x)\n", pdev->vendor,
5453 pdev->device, pdev->subsystem_vendor,
5454 pdev->subsystem_device);
5455 printk(KERN_ERR
5456 "Please contact the driver maintainer for support.\n");
5457 return -ENODEV;
5458 }
5459 ret = hfcmulti_init(m, pdev, ent);
5460 if (ret)
5461 return ret;
5462 HFC_cnt++;
5463 printk(KERN_INFO "%d devices registered\n", HFC_cnt);
5464 return 0;
5465}
5466
5467static struct pci_driver hfcmultipci_driver = {
5468 .name = "hfc_multi",
5469 .probe = hfcmulti_probe,
5470 .remove = hfc_remove_pci,
5471 .id_table = hfmultipci_ids,
5472};
5473
5474static void __exit
5475HFCmulti_cleanup(void)
5476{
5477 struct hfc_multi *card, *next;
5478
5479
5480 list_for_each_entry_safe(card, next, &HFClist, list)
5481 release_card(card);
5482 pci_unregister_driver(&hfcmultipci_driver);
5483}
5484
5485static int __init
5486HFCmulti_init(void)
5487{
5488 int err;
5489 int i, xhfc = 0;
5490 struct hm_map m;
5491
5492 printk(KERN_INFO "mISDN: HFC-multi driver %s\n", HFC_MULTI_VERSION);
5493
5494#ifdef IRQ_DEBUG
5495 printk(KERN_DEBUG "%s: IRQ_DEBUG IS ENABLED!\n", __func__);
5496#endif
5497
5498 spin_lock_init(&HFClock);
5499 spin_lock_init(&plx_lock);
5500
5501 if (debug & DEBUG_HFCMULTI_INIT)
5502 printk(KERN_DEBUG "%s: init entered\n", __func__);
5503
5504 switch (poll) {
5505 case 0:
5506 poll_timer = 6;
5507 poll = 128;
5508 break;
5509 case 8:
5510 poll_timer = 2;
5511 break;
5512 case 16:
5513 poll_timer = 3;
5514 break;
5515 case 32:
5516 poll_timer = 4;
5517 break;
5518 case 64:
5519 poll_timer = 5;
5520 break;
5521 case 128:
5522 poll_timer = 6;
5523 break;
5524 case 256:
5525 poll_timer = 7;
5526 break;
5527 default:
5528 printk(KERN_ERR
5529 "%s: Wrong poll value (%d).\n", __func__, poll);
5530 err = -EINVAL;
5531 return err;
5532
5533 }
5534
5535 if (!clock)
5536 clock = 1;
5537
5538
5539
5540 switch (hwid) {
5541 case HWID_MINIP4:
5542 xhfc = 1;
5543 m = hfcm_map[31];
5544 break;
5545 case HWID_MINIP8:
5546 xhfc = 2;
5547 m = hfcm_map[31];
5548 break;
5549 case HWID_MINIP16:
5550 xhfc = 4;
5551 m = hfcm_map[31];
5552 break;
5553 default:
5554 xhfc = 0;
5555 }
5556
5557 for (i = 0; i < xhfc; ++i) {
5558 err = hfcmulti_init(&m, NULL, NULL);
5559 if (err) {
5560 printk(KERN_ERR "error registering embedded driver: "
5561 "%x\n", err);
5562 return err;
5563 }
5564 HFC_cnt++;
5565 printk(KERN_INFO "%d devices registered\n", HFC_cnt);
5566 }
5567
5568
5569 err = pci_register_driver(&hfcmultipci_driver);
5570 if (err < 0) {
5571 printk(KERN_ERR "error registering pci driver: %x\n", err);
5572 return err;
5573 }
5574
5575 return 0;
5576}
5577
5578
5579module_init(HFCmulti_init);
5580module_exit(HFCmulti_cleanup);
5581