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
567inline void
568enablepcibridge(struct hfc_multi *c)
569{
570 HFC_outb(c, R_BRG_PCM_CFG, (0x0 << 6) | 0x3);
571}
572
573inline void
574disablepcibridge(struct hfc_multi *c)
575{
576 HFC_outb(c, R_BRG_PCM_CFG, (0x0 << 6) | 0x2);
577}
578
579inline 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
607inline 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
637inline void
638cpld_set_reg(struct hfc_multi *hc, unsigned char reg)
639{
640
641 HFC_outb(hc, R_GPIO_OUT1, reg);
642}
643
644inline 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
656inline 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
673inline 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
680inline 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
694inline 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
715inline 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
1027inline 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 memcpy(skb_put(skb, 512), 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 memcpy(skb_put(*sp, skb->len),
2336 skb->data, skb->len);
2337 skb_trim(skb, 0);
2338 } else {
2339 printk(KERN_DEBUG "%s: No mem\n",
2340 __func__);
2341 *sp = skb;
2342 skb = NULL;
2343 }
2344 } else {
2345 skb = NULL;
2346 }
2347 if (debug & DEBUG_HFCMULTI_FIFO) {
2348 printk(KERN_DEBUG "%s(card %d):",
2349 __func__, hc->id + 1);
2350 temp = 0;
2351 while (temp < (*sp)->len)
2352 printk(" %02x", (*sp)->data[temp++]);
2353 printk("\n");
2354 }
2355 if (dch)
2356 recv_Dchannel(dch);
2357 else
2358 recv_Bchannel(bch, MISDN_ID_ANY, false);
2359 *sp = skb;
2360 again++;
2361 goto next_frame;
2362 }
2363
2364 } else {
2365
2366 hc->read_fifo(hc, skb_put(*sp, Zsize), Zsize);
2367 if (debug & DEBUG_HFCMULTI_FIFO)
2368 printk(KERN_DEBUG
2369 "%s(card %d): fifo(%d) reading %d bytes "
2370 "(z1=%04x, z2=%04x) TRANS\n",
2371 __func__, hc->id + 1, ch, Zsize, z1, z2);
2372
2373 recv_Bchannel(bch, hc->chan[ch].Zfill, false);
2374 }
2375}
2376
2377
2378
2379
2380
2381static void
2382signal_state_up(struct dchannel *dch, int info, char *msg)
2383{
2384 struct sk_buff *skb;
2385 int id, data = info;
2386
2387 if (debug & DEBUG_HFCMULTI_STATE)
2388 printk(KERN_DEBUG "%s: %s\n", __func__, msg);
2389
2390 id = TEI_SAPI | (GROUP_TEI << 8);
2391
2392 skb = _alloc_mISDN_skb(MPH_INFORMATION_IND, id, sizeof(data), &data,
2393 GFP_ATOMIC);
2394 if (!skb)
2395 return;
2396 recv_Dchannel_skb(dch, skb);
2397}
2398
2399static inline void
2400handle_timer_irq(struct hfc_multi *hc)
2401{
2402 int ch, temp;
2403 struct dchannel *dch;
2404 u_long flags;
2405
2406
2407 if (hc->e1_resync) {
2408
2409 spin_lock_irqsave(&HFClock, flags);
2410 if (hc->e1_resync & 1) {
2411 if (debug & DEBUG_HFCMULTI_PLXSD)
2412 printk(KERN_DEBUG "Enable SYNC_I\n");
2413 HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC);
2414
2415 if (test_bit(HFC_CHIP_RX_SYNC, &hc->chip))
2416 HFC_outb(hc, R_SYNC_OUT, V_SYNC_E1_RX);
2417 }
2418 if (hc->e1_resync & 2) {
2419 if (debug & DEBUG_HFCMULTI_PLXSD)
2420 printk(KERN_DEBUG "Enable jatt PLL\n");
2421 HFC_outb(hc, R_SYNC_CTRL, V_SYNC_OFFS);
2422 }
2423 if (hc->e1_resync & 4) {
2424 if (debug & DEBUG_HFCMULTI_PLXSD)
2425 printk(KERN_DEBUG
2426 "Enable QUARTZ for HFC-E1\n");
2427
2428 HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC
2429 | V_JATT_OFF);
2430
2431 HFC_outb(hc, R_SYNC_OUT, 0);
2432 }
2433 hc->e1_resync = 0;
2434 spin_unlock_irqrestore(&HFClock, flags);
2435 }
2436
2437 if (hc->ctype != HFC_TYPE_E1 || hc->e1_state == 1)
2438 for (ch = 0; ch <= 31; ch++) {
2439 if (hc->created[hc->chan[ch].port]) {
2440 hfcmulti_tx(hc, ch);
2441
2442 hfcmulti_rx(hc, ch);
2443 if (hc->chan[ch].dch &&
2444 hc->chan[ch].nt_timer > -1) {
2445 dch = hc->chan[ch].dch;
2446 if (!(--hc->chan[ch].nt_timer)) {
2447 schedule_event(dch,
2448 FLG_PHCHANGE);
2449 if (debug &
2450 DEBUG_HFCMULTI_STATE)
2451 printk(KERN_DEBUG
2452 "%s: nt_timer at "
2453 "state %x\n",
2454 __func__,
2455 dch->state);
2456 }
2457 }
2458 }
2459 }
2460 if (hc->ctype == HFC_TYPE_E1 && hc->created[0]) {
2461 dch = hc->chan[hc->dnum[0]].dch;
2462
2463 temp = HFC_inb_nodebug(hc, R_SYNC_STA) & V_SIG_LOS;
2464 hc->chan[hc->dnum[0]].los = temp;
2465 if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dnum[0]].cfg)) {
2466 if (!temp && hc->chan[hc->dnum[0]].los)
2467 signal_state_up(dch, L1_SIGNAL_LOS_ON,
2468 "LOS detected");
2469 if (temp && !hc->chan[hc->dnum[0]].los)
2470 signal_state_up(dch, L1_SIGNAL_LOS_OFF,
2471 "LOS gone");
2472 }
2473 if (test_bit(HFC_CFG_REPORT_AIS, &hc->chan[hc->dnum[0]].cfg)) {
2474
2475 temp = HFC_inb_nodebug(hc, R_SYNC_STA) & V_AIS;
2476 if (!temp && hc->chan[hc->dnum[0]].ais)
2477 signal_state_up(dch, L1_SIGNAL_AIS_ON,
2478 "AIS detected");
2479 if (temp && !hc->chan[hc->dnum[0]].ais)
2480 signal_state_up(dch, L1_SIGNAL_AIS_OFF,
2481 "AIS gone");
2482 hc->chan[hc->dnum[0]].ais = temp;
2483 }
2484 if (test_bit(HFC_CFG_REPORT_SLIP, &hc->chan[hc->dnum[0]].cfg)) {
2485
2486 temp = HFC_inb_nodebug(hc, R_SLIP) & V_FOSLIP_RX;
2487 if (!temp && hc->chan[hc->dnum[0]].slip_rx)
2488 signal_state_up(dch, L1_SIGNAL_SLIP_RX,
2489 " bit SLIP detected RX");
2490 hc->chan[hc->dnum[0]].slip_rx = temp;
2491 temp = HFC_inb_nodebug(hc, R_SLIP) & V_FOSLIP_TX;
2492 if (!temp && hc->chan[hc->dnum[0]].slip_tx)
2493 signal_state_up(dch, L1_SIGNAL_SLIP_TX,
2494 " bit SLIP detected TX");
2495 hc->chan[hc->dnum[0]].slip_tx = temp;
2496 }
2497 if (test_bit(HFC_CFG_REPORT_RDI, &hc->chan[hc->dnum[0]].cfg)) {
2498
2499 temp = HFC_inb_nodebug(hc, R_RX_SL0_0) & V_A;
2500 if (!temp && hc->chan[hc->dnum[0]].rdi)
2501 signal_state_up(dch, L1_SIGNAL_RDI_ON,
2502 "RDI detected");
2503 if (temp && !hc->chan[hc->dnum[0]].rdi)
2504 signal_state_up(dch, L1_SIGNAL_RDI_OFF,
2505 "RDI gone");
2506 hc->chan[hc->dnum[0]].rdi = temp;
2507 }
2508 temp = HFC_inb_nodebug(hc, R_JATT_DIR);
2509 switch (hc->chan[hc->dnum[0]].sync) {
2510 case 0:
2511 if ((temp & 0x60) == 0x60) {
2512 if (debug & DEBUG_HFCMULTI_SYNC)
2513 printk(KERN_DEBUG
2514 "%s: (id=%d) E1 now "
2515 "in clock sync\n",
2516 __func__, hc->id);
2517 HFC_outb(hc, R_RX_OFF,
2518 hc->chan[hc->dnum[0]].jitter | V_RX_INIT);
2519 HFC_outb(hc, R_TX_OFF,
2520 hc->chan[hc->dnum[0]].jitter | V_RX_INIT);
2521 hc->chan[hc->dnum[0]].sync = 1;
2522 goto check_framesync;
2523 }
2524 break;
2525 case 1:
2526 if ((temp & 0x60) != 0x60) {
2527 if (debug & DEBUG_HFCMULTI_SYNC)
2528 printk(KERN_DEBUG
2529 "%s: (id=%d) E1 "
2530 "lost clock sync\n",
2531 __func__, hc->id);
2532 hc->chan[hc->dnum[0]].sync = 0;
2533 break;
2534 }
2535 check_framesync:
2536 temp = HFC_inb_nodebug(hc, R_SYNC_STA);
2537 if (temp == 0x27) {
2538 if (debug & DEBUG_HFCMULTI_SYNC)
2539 printk(KERN_DEBUG
2540 "%s: (id=%d) E1 "
2541 "now in frame sync\n",
2542 __func__, hc->id);
2543 hc->chan[hc->dnum[0]].sync = 2;
2544 }
2545 break;
2546 case 2:
2547 if ((temp & 0x60) != 0x60) {
2548 if (debug & DEBUG_HFCMULTI_SYNC)
2549 printk(KERN_DEBUG
2550 "%s: (id=%d) E1 lost "
2551 "clock & frame sync\n",
2552 __func__, hc->id);
2553 hc->chan[hc->dnum[0]].sync = 0;
2554 break;
2555 }
2556 temp = HFC_inb_nodebug(hc, R_SYNC_STA);
2557 if (temp != 0x27) {
2558 if (debug & DEBUG_HFCMULTI_SYNC)
2559 printk(KERN_DEBUG
2560 "%s: (id=%d) E1 "
2561 "lost frame sync\n",
2562 __func__, hc->id);
2563 hc->chan[hc->dnum[0]].sync = 1;
2564 }
2565 break;
2566 }
2567 }
2568
2569 if (test_bit(HFC_CHIP_WATCHDOG, &hc->chip))
2570 hfcmulti_watchdog(hc);
2571
2572 if (hc->leds)
2573 hfcmulti_leds(hc);
2574}
2575
2576static void
2577ph_state_irq(struct hfc_multi *hc, u_char r_irq_statech)
2578{
2579 struct dchannel *dch;
2580 int ch;
2581 int active;
2582 u_char st_status, temp;
2583
2584
2585 for (ch = 0; ch <= 31; ch++) {
2586 if (hc->chan[ch].dch) {
2587 dch = hc->chan[ch].dch;
2588 if (r_irq_statech & 1) {
2589 HFC_outb_nodebug(hc, R_ST_SEL,
2590 hc->chan[ch].port);
2591
2592 udelay(1);
2593
2594 st_status = HFC_inb_nodebug(hc, A_ST_RD_STATE);
2595 while (st_status != (temp =
2596 HFC_inb_nodebug(hc, A_ST_RD_STATE))) {
2597 if (debug & DEBUG_HFCMULTI_STATE)
2598 printk(KERN_DEBUG "%s: reread "
2599 "STATE because %d!=%d\n",
2600 __func__, temp,
2601 st_status);
2602 st_status = temp;
2603 }
2604
2605
2606 if (test_bit(HFC_CHIP_PLXSD, &hc->chip) &&
2607 dch->dev.D.protocol == ISDN_P_TE_S0) {
2608 if (st_status & V_FR_SYNC_ST)
2609 hc->syncronized |=
2610 (1 << hc->chan[ch].port);
2611 else
2612 hc->syncronized &=
2613 ~(1 << hc->chan[ch].port);
2614 }
2615 dch->state = st_status & 0x0f;
2616 if (dch->dev.D.protocol == ISDN_P_NT_S0)
2617 active = 3;
2618 else
2619 active = 7;
2620 if (dch->state == active) {
2621 HFC_outb_nodebug(hc, R_FIFO,
2622 (ch << 1) | 1);
2623 HFC_wait_nodebug(hc);
2624 HFC_outb_nodebug(hc,
2625 R_INC_RES_FIFO, V_RES_F);
2626 HFC_wait_nodebug(hc);
2627 dch->tx_idx = 0;
2628 }
2629 schedule_event(dch, FLG_PHCHANGE);
2630 if (debug & DEBUG_HFCMULTI_STATE)
2631 printk(KERN_DEBUG
2632 "%s: S/T newstate %x port %d\n",
2633 __func__, dch->state,
2634 hc->chan[ch].port);
2635 }
2636 r_irq_statech >>= 1;
2637 }
2638 }
2639 if (test_bit(HFC_CHIP_PLXSD, &hc->chip))
2640 plxsd_checksync(hc, 0);
2641}
2642
2643static void
2644fifo_irq(struct hfc_multi *hc, int block)
2645{
2646 int ch, j;
2647 struct dchannel *dch;
2648 struct bchannel *bch;
2649 u_char r_irq_fifo_bl;
2650
2651 r_irq_fifo_bl = HFC_inb_nodebug(hc, R_IRQ_FIFO_BL0 + block);
2652 j = 0;
2653 while (j < 8) {
2654 ch = (block << 2) + (j >> 1);
2655 dch = hc->chan[ch].dch;
2656 bch = hc->chan[ch].bch;
2657 if (((!dch) && (!bch)) || (!hc->created[hc->chan[ch].port])) {
2658 j += 2;
2659 continue;
2660 }
2661 if (dch && (r_irq_fifo_bl & (1 << j)) &&
2662 test_bit(FLG_ACTIVE, &dch->Flags)) {
2663 hfcmulti_tx(hc, ch);
2664
2665 HFC_outb_nodebug(hc, R_FIFO, 0);
2666 HFC_wait_nodebug(hc);
2667 }
2668 if (bch && (r_irq_fifo_bl & (1 << j)) &&
2669 test_bit(FLG_ACTIVE, &bch->Flags)) {
2670 hfcmulti_tx(hc, ch);
2671
2672 HFC_outb_nodebug(hc, R_FIFO, 0);
2673 HFC_wait_nodebug(hc);
2674 }
2675 j++;
2676 if (dch && (r_irq_fifo_bl & (1 << j)) &&
2677 test_bit(FLG_ACTIVE, &dch->Flags)) {
2678 hfcmulti_rx(hc, ch);
2679 }
2680 if (bch && (r_irq_fifo_bl & (1 << j)) &&
2681 test_bit(FLG_ACTIVE, &bch->Flags)) {
2682 hfcmulti_rx(hc, ch);
2683 }
2684 j++;
2685 }
2686}
2687
2688#ifdef IRQ_DEBUG
2689int irqsem;
2690#endif
2691static irqreturn_t
2692hfcmulti_interrupt(int intno, void *dev_id)
2693{
2694#ifdef IRQCOUNT_DEBUG
2695 static int iq1 = 0, iq2 = 0, iq3 = 0, iq4 = 0,
2696 iq5 = 0, iq6 = 0, iqcnt = 0;
2697#endif
2698 struct hfc_multi *hc = dev_id;
2699 struct dchannel *dch;
2700 u_char r_irq_statech, status, r_irq_misc, r_irq_oview;
2701 int i;
2702 void __iomem *plx_acc;
2703 u_short wval;
2704 u_char e1_syncsta, temp, temp2;
2705 u_long flags;
2706
2707 if (!hc) {
2708 printk(KERN_ERR "HFC-multi: Spurious interrupt!\n");
2709 return IRQ_NONE;
2710 }
2711
2712 spin_lock(&hc->lock);
2713
2714#ifdef IRQ_DEBUG
2715 if (irqsem)
2716 printk(KERN_ERR "irq for card %d during irq from "
2717 "card %d, this is no bug.\n", hc->id + 1, irqsem);
2718 irqsem = hc->id + 1;
2719#endif
2720#ifdef CONFIG_MISDN_HFCMULTI_8xx
2721 if (hc->immap->im_cpm.cp_pbdat & hc->pb_irqmsk)
2722 goto irq_notforus;
2723#endif
2724 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
2725 spin_lock_irqsave(&plx_lock, flags);
2726 plx_acc = hc->plx_membase + PLX_INTCSR;
2727 wval = readw(plx_acc);
2728 spin_unlock_irqrestore(&plx_lock, flags);
2729 if (!(wval & PLX_INTCSR_LINTI1_STATUS))
2730 goto irq_notforus;
2731 }
2732
2733 status = HFC_inb_nodebug(hc, R_STATUS);
2734 r_irq_statech = HFC_inb_nodebug(hc, R_IRQ_STATECH);
2735#ifdef IRQCOUNT_DEBUG
2736 if (r_irq_statech)
2737 iq1++;
2738 if (status & V_DTMF_STA)
2739 iq2++;
2740 if (status & V_LOST_STA)
2741 iq3++;
2742 if (status & V_EXT_IRQSTA)
2743 iq4++;
2744 if (status & V_MISC_IRQSTA)
2745 iq5++;
2746 if (status & V_FR_IRQSTA)
2747 iq6++;
2748 if (iqcnt++ > 5000) {
2749 printk(KERN_ERR "iq1:%x iq2:%x iq3:%x iq4:%x iq5:%x iq6:%x\n",
2750 iq1, iq2, iq3, iq4, iq5, iq6);
2751 iqcnt = 0;
2752 }
2753#endif
2754
2755 if (!r_irq_statech &&
2756 !(status & (V_DTMF_STA | V_LOST_STA | V_EXT_IRQSTA |
2757 V_MISC_IRQSTA | V_FR_IRQSTA))) {
2758
2759 goto irq_notforus;
2760 }
2761 hc->irqcnt++;
2762 if (r_irq_statech) {
2763 if (hc->ctype != HFC_TYPE_E1)
2764 ph_state_irq(hc, r_irq_statech);
2765 }
2766 if (status & V_EXT_IRQSTA)
2767 ;
2768 if (status & V_LOST_STA) {
2769
2770 HFC_outb(hc, R_INC_RES_FIFO, V_RES_LOST);
2771 }
2772 if (status & V_MISC_IRQSTA) {
2773
2774 r_irq_misc = HFC_inb_nodebug(hc, R_IRQ_MISC);
2775 r_irq_misc &= hc->hw.r_irqmsk_misc;
2776 if (r_irq_misc & V_STA_IRQ) {
2777 if (hc->ctype == HFC_TYPE_E1) {
2778
2779 dch = hc->chan[hc->dnum[0]].dch;
2780 e1_syncsta = HFC_inb_nodebug(hc, R_SYNC_STA);
2781 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)
2782 && hc->e1_getclock) {
2783 if (e1_syncsta & V_FR_SYNC_E1)
2784 hc->syncronized = 1;
2785 else
2786 hc->syncronized = 0;
2787 }
2788
2789 temp = HFC_inb_nodebug(hc, R_E1_RD_STA);
2790 while (temp != (temp2 =
2791 HFC_inb_nodebug(hc, R_E1_RD_STA))) {
2792 if (debug & DEBUG_HFCMULTI_STATE)
2793 printk(KERN_DEBUG "%s: reread "
2794 "STATE because %d!=%d\n",
2795 __func__, temp, temp2);
2796 temp = temp2;
2797 }
2798
2799 if (debug & DEBUG_HFCMULTI_STATE)
2800 printk(KERN_DEBUG
2801 "%s: E1 (id=%d) newstate %x\n",
2802 __func__, hc->id, temp & 0x7);
2803 for (i = 0; i < hc->ports; i++) {
2804 dch = hc->chan[hc->dnum[i]].dch;
2805 dch->state = temp & 0x7;
2806 schedule_event(dch, FLG_PHCHANGE);
2807 }
2808
2809 if (test_bit(HFC_CHIP_PLXSD, &hc->chip))
2810 plxsd_checksync(hc, 0);
2811 }
2812 }
2813 if (r_irq_misc & V_TI_IRQ) {
2814 if (hc->iclock_on)
2815 mISDN_clock_update(hc->iclock, poll, NULL);
2816 handle_timer_irq(hc);
2817 }
2818
2819 if (r_irq_misc & V_DTMF_IRQ)
2820 hfcmulti_dtmf(hc);
2821
2822 if (r_irq_misc & V_IRQ_PROC) {
2823 static int irq_proc_cnt;
2824 if (!irq_proc_cnt++)
2825 printk(KERN_DEBUG "%s: got V_IRQ_PROC -"
2826 " this should not happen\n", __func__);
2827 }
2828
2829 }
2830 if (status & V_FR_IRQSTA) {
2831
2832 r_irq_oview = HFC_inb_nodebug(hc, R_IRQ_OVIEW);
2833 for (i = 0; i < 8; i++) {
2834 if (r_irq_oview & (1 << i))
2835 fifo_irq(hc, i);
2836 }
2837 }
2838
2839#ifdef IRQ_DEBUG
2840 irqsem = 0;
2841#endif
2842 spin_unlock(&hc->lock);
2843 return IRQ_HANDLED;
2844
2845irq_notforus:
2846#ifdef IRQ_DEBUG
2847 irqsem = 0;
2848#endif
2849 spin_unlock(&hc->lock);
2850 return IRQ_NONE;
2851}
2852
2853
2854
2855
2856
2857
2858static void
2859hfcmulti_dbusy_timer(struct hfc_multi *hc)
2860{
2861}
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873static int
2874mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
2875 int bank_tx, int slot_rx, int bank_rx)
2876{
2877 int flow_tx = 0, flow_rx = 0, routing = 0;
2878 int oslot_tx, oslot_rx;
2879 int conf;
2880
2881 if (ch < 0 || ch > 31)
2882 return -EINVAL;
2883 oslot_tx = hc->chan[ch].slot_tx;
2884 oslot_rx = hc->chan[ch].slot_rx;
2885 conf = hc->chan[ch].conf;
2886
2887 if (debug & DEBUG_HFCMULTI_MODE)
2888 printk(KERN_DEBUG
2889 "%s: card %d channel %d protocol %x slot old=%d new=%d "
2890 "bank new=%d (TX) slot old=%d new=%d bank new=%d (RX)\n",
2891 __func__, hc->id, ch, protocol, oslot_tx, slot_tx,
2892 bank_tx, oslot_rx, slot_rx, bank_rx);
2893
2894 if (oslot_tx >= 0 && slot_tx != oslot_tx) {
2895
2896 if (debug & DEBUG_HFCMULTI_MODE)
2897 printk(KERN_DEBUG "%s: remove from slot %d (TX)\n",
2898 __func__, oslot_tx);
2899 if (hc->slot_owner[oslot_tx << 1] == ch) {
2900 HFC_outb(hc, R_SLOT, oslot_tx << 1);
2901 HFC_outb(hc, A_SL_CFG, 0);
2902 if (hc->ctype != HFC_TYPE_XHFC)
2903 HFC_outb(hc, A_CONF, 0);
2904 hc->slot_owner[oslot_tx << 1] = -1;
2905 } else {
2906 if (debug & DEBUG_HFCMULTI_MODE)
2907 printk(KERN_DEBUG
2908 "%s: we are not owner of this tx slot "
2909 "anymore, channel %d is.\n",
2910 __func__, hc->slot_owner[oslot_tx << 1]);
2911 }
2912 }
2913
2914 if (oslot_rx >= 0 && slot_rx != oslot_rx) {
2915
2916 if (debug & DEBUG_HFCMULTI_MODE)
2917 printk(KERN_DEBUG
2918 "%s: remove from slot %d (RX)\n",
2919 __func__, oslot_rx);
2920 if (hc->slot_owner[(oslot_rx << 1) | 1] == ch) {
2921 HFC_outb(hc, R_SLOT, (oslot_rx << 1) | V_SL_DIR);
2922 HFC_outb(hc, A_SL_CFG, 0);
2923 hc->slot_owner[(oslot_rx << 1) | 1] = -1;
2924 } else {
2925 if (debug & DEBUG_HFCMULTI_MODE)
2926 printk(KERN_DEBUG
2927 "%s: we are not owner of this rx slot "
2928 "anymore, channel %d is.\n",
2929 __func__,
2930 hc->slot_owner[(oslot_rx << 1) | 1]);
2931 }
2932 }
2933
2934 if (slot_tx < 0) {
2935 flow_tx = 0x80;
2936
2937 hc->chan[ch].slot_tx = -1;
2938 hc->chan[ch].bank_tx = 0;
2939 } else {
2940
2941 if (hc->chan[ch].txpending)
2942 flow_tx = 0x80;
2943 else
2944 flow_tx = 0xc0;
2945
2946 routing = bank_tx ? 0xc0 : 0x80;
2947 if (conf >= 0 || bank_tx > 1)
2948 routing = 0x40;
2949 if (debug & DEBUG_HFCMULTI_MODE)
2950 printk(KERN_DEBUG "%s: put channel %d to slot %d bank"
2951 " %d flow %02x routing %02x conf %d (TX)\n",
2952 __func__, ch, slot_tx, bank_tx,
2953 flow_tx, routing, conf);
2954 HFC_outb(hc, R_SLOT, slot_tx << 1);
2955 HFC_outb(hc, A_SL_CFG, (ch << 1) | routing);
2956 if (hc->ctype != HFC_TYPE_XHFC)
2957 HFC_outb(hc, A_CONF,
2958 (conf < 0) ? 0 : (conf | V_CONF_SL));
2959 hc->slot_owner[slot_tx << 1] = ch;
2960 hc->chan[ch].slot_tx = slot_tx;
2961 hc->chan[ch].bank_tx = bank_tx;
2962 }
2963 if (slot_rx < 0) {
2964
2965 flow_rx = 0x80;
2966 hc->chan[ch].slot_rx = -1;
2967 hc->chan[ch].bank_rx = 0;
2968 } else {
2969
2970 if (hc->chan[ch].txpending)
2971 flow_rx = 0x80;
2972 else
2973 flow_rx = 0xc0;
2974
2975 routing = bank_rx ? 0x80 : 0xc0;
2976 if (conf >= 0 || bank_rx > 1)
2977 routing = 0x40;
2978 if (debug & DEBUG_HFCMULTI_MODE)
2979 printk(KERN_DEBUG "%s: put channel %d to slot %d bank"
2980 " %d flow %02x routing %02x conf %d (RX)\n",
2981 __func__, ch, slot_rx, bank_rx,
2982 flow_rx, routing, conf);
2983 HFC_outb(hc, R_SLOT, (slot_rx << 1) | V_SL_DIR);
2984 HFC_outb(hc, A_SL_CFG, (ch << 1) | V_CH_DIR | routing);
2985 hc->slot_owner[(slot_rx << 1) | 1] = ch;
2986 hc->chan[ch].slot_rx = slot_rx;
2987 hc->chan[ch].bank_rx = bank_rx;
2988 }
2989
2990 switch (protocol) {
2991 case (ISDN_P_NONE):
2992
2993 HFC_outb(hc, R_FIFO, ch << 1);
2994 HFC_wait(hc);
2995 HFC_outb(hc, A_CON_HDLC, flow_tx | 0x00 | V_IFF);
2996 HFC_outb(hc, A_SUBCH_CFG, 0);
2997 HFC_outb(hc, A_IRQ_MSK, 0);
2998 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
2999 HFC_wait(hc);
3000
3001 HFC_outb(hc, R_FIFO, (ch << 1) | 1);
3002 HFC_wait(hc);
3003 HFC_outb(hc, A_CON_HDLC, flow_rx | 0x00);
3004 HFC_outb(hc, A_SUBCH_CFG, 0);
3005 HFC_outb(hc, A_IRQ_MSK, 0);
3006 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3007 HFC_wait(hc);
3008 if (hc->chan[ch].bch && hc->ctype != HFC_TYPE_E1) {
3009 hc->hw.a_st_ctrl0[hc->chan[ch].port] &=
3010 ((ch & 0x3) == 0) ? ~V_B1_EN : ~V_B2_EN;
3011 HFC_outb(hc, R_ST_SEL, hc->chan[ch].port);
3012
3013 udelay(1);
3014 HFC_outb(hc, A_ST_CTRL0,
3015 hc->hw.a_st_ctrl0[hc->chan[ch].port]);
3016 }
3017 if (hc->chan[ch].bch) {
3018 test_and_clear_bit(FLG_HDLC, &hc->chan[ch].bch->Flags);
3019 test_and_clear_bit(FLG_TRANSPARENT,
3020 &hc->chan[ch].bch->Flags);
3021 }
3022 break;
3023 case (ISDN_P_B_RAW):
3024
3025 if (test_bit(HFC_CHIP_B410P, &hc->chip) &&
3026 (hc->chan[ch].slot_rx < 0) &&
3027 (hc->chan[ch].slot_tx < 0)) {
3028
3029 printk(KERN_DEBUG
3030 "Setting B-channel %d to echo cancelable "
3031 "state on PCM slot %d\n", ch,
3032 ((ch / 4) * 8) + ((ch % 4) * 4) + 1);
3033 printk(KERN_DEBUG
3034 "Enabling pass through for channel\n");
3035 vpm_out(hc, ch, ((ch / 4) * 8) +
3036 ((ch % 4) * 4) + 1, 0x01);
3037
3038
3039 HFC_outb(hc, R_FIFO, (ch << 1));
3040 HFC_wait(hc);
3041 HFC_outb(hc, A_CON_HDLC, 0xc0 | V_HDLC_TRP | V_IFF);
3042 HFC_outb(hc, R_SLOT, (((ch / 4) * 8) +
3043 ((ch % 4) * 4) + 1) << 1);
3044 HFC_outb(hc, A_SL_CFG, 0x80 | (ch << 1));
3045
3046
3047 HFC_outb(hc, R_FIFO, 0x20 | (ch << 1) | 1);
3048 HFC_wait(hc);
3049 HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF);
3050 HFC_outb(hc, A_SUBCH_CFG, 0);
3051 HFC_outb(hc, A_IRQ_MSK, 0);
3052 if (hc->chan[ch].protocol != protocol) {
3053 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3054 HFC_wait(hc);
3055 }
3056 HFC_outb(hc, R_SLOT, ((((ch / 4) * 8) +
3057 ((ch % 4) * 4) + 1) << 1) | 1);
3058 HFC_outb(hc, A_SL_CFG, 0x80 | 0x20 | (ch << 1) | 1);
3059
3060
3061
3062 HFC_outb(hc, R_FIFO, (ch << 1) | 1);
3063 HFC_wait(hc);
3064 HFC_outb(hc, A_CON_HDLC, 0xc0 | V_HDLC_TRP | V_IFF);
3065 HFC_outb(hc, R_SLOT, ((((ch / 4) * 8) +
3066 ((ch % 4) * 4)) << 1) | 1);
3067 HFC_outb(hc, A_SL_CFG, 0x80 | 0x40 | (ch << 1) | 1);
3068
3069
3070 HFC_outb(hc, R_FIFO, 0x20 | (ch << 1));
3071 HFC_wait(hc);
3072 HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF);
3073 HFC_outb(hc, A_SUBCH_CFG, 0);
3074 HFC_outb(hc, A_IRQ_MSK, 0);
3075 if (hc->chan[ch].protocol != protocol) {
3076 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3077 HFC_wait(hc);
3078 }
3079
3080 HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence);
3081 HFC_outb(hc, R_SLOT, (((ch / 4) * 8) +
3082 ((ch % 4) * 4)) << 1);
3083 HFC_outb(hc, A_SL_CFG, 0x80 | 0x20 | (ch << 1));
3084 } else {
3085
3086 HFC_outb(hc, R_FIFO, ch << 1);
3087 HFC_wait(hc);
3088 if (hc->ctype == HFC_TYPE_XHFC)
3089 HFC_outb(hc, A_CON_HDLC, flow_tx | 0x07 << 2 |
3090 V_HDLC_TRP | V_IFF);
3091
3092 else
3093 HFC_outb(hc, A_CON_HDLC, flow_tx | 0x00 |
3094 V_HDLC_TRP | V_IFF);
3095 HFC_outb(hc, A_SUBCH_CFG, 0);
3096 HFC_outb(hc, A_IRQ_MSK, 0);
3097 if (hc->chan[ch].protocol != protocol) {
3098 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3099 HFC_wait(hc);
3100 }
3101
3102 HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence);
3103
3104 HFC_outb(hc, R_FIFO, (ch << 1) | 1);
3105 HFC_wait(hc);
3106 if (hc->ctype == HFC_TYPE_XHFC)
3107 HFC_outb(hc, A_CON_HDLC, flow_rx | 0x07 << 2 |
3108 V_HDLC_TRP);
3109
3110 else
3111 HFC_outb(hc, A_CON_HDLC, flow_rx | 0x00 |
3112 V_HDLC_TRP);
3113 HFC_outb(hc, A_SUBCH_CFG, 0);
3114 HFC_outb(hc, A_IRQ_MSK, 0);
3115 if (hc->chan[ch].protocol != protocol) {
3116 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3117 HFC_wait(hc);
3118 }
3119 }
3120 if (hc->ctype != HFC_TYPE_E1) {
3121 hc->hw.a_st_ctrl0[hc->chan[ch].port] |=
3122 ((ch & 0x3) == 0) ? V_B1_EN : V_B2_EN;
3123 HFC_outb(hc, R_ST_SEL, hc->chan[ch].port);
3124
3125 udelay(1);
3126 HFC_outb(hc, A_ST_CTRL0,
3127 hc->hw.a_st_ctrl0[hc->chan[ch].port]);
3128 }
3129 if (hc->chan[ch].bch)
3130 test_and_set_bit(FLG_TRANSPARENT,
3131 &hc->chan[ch].bch->Flags);
3132 break;
3133 case (ISDN_P_B_HDLC):
3134 case (ISDN_P_TE_S0):
3135 case (ISDN_P_NT_S0):
3136 case (ISDN_P_TE_E1):
3137 case (ISDN_P_NT_E1):
3138
3139 HFC_outb(hc, R_FIFO, ch << 1);
3140 HFC_wait(hc);
3141 if (hc->ctype == HFC_TYPE_E1 || hc->chan[ch].bch) {
3142
3143 HFC_outb(hc, A_CON_HDLC, flow_tx | 0x04);
3144 HFC_outb(hc, A_SUBCH_CFG, 0);
3145 } else {
3146
3147 HFC_outb(hc, A_CON_HDLC, flow_tx | 0x04 | V_IFF);
3148 HFC_outb(hc, A_SUBCH_CFG, 2);
3149 }
3150 HFC_outb(hc, A_IRQ_MSK, V_IRQ);
3151 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3152 HFC_wait(hc);
3153
3154 HFC_outb(hc, R_FIFO, (ch << 1) | 1);
3155 HFC_wait(hc);
3156 HFC_outb(hc, A_CON_HDLC, flow_rx | 0x04);
3157 if (hc->ctype == HFC_TYPE_E1 || hc->chan[ch].bch)
3158 HFC_outb(hc, A_SUBCH_CFG, 0);
3159 else
3160 HFC_outb(hc, A_SUBCH_CFG, 2);
3161 HFC_outb(hc, A_IRQ_MSK, V_IRQ);
3162 HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
3163 HFC_wait(hc);
3164 if (hc->chan[ch].bch) {
3165 test_and_set_bit(FLG_HDLC, &hc->chan[ch].bch->Flags);
3166 if (hc->ctype != HFC_TYPE_E1) {
3167 hc->hw.a_st_ctrl0[hc->chan[ch].port] |=
3168 ((ch & 0x3) == 0) ? V_B1_EN : V_B2_EN;
3169 HFC_outb(hc, R_ST_SEL, hc->chan[ch].port);
3170
3171 udelay(1);
3172 HFC_outb(hc, A_ST_CTRL0,
3173 hc->hw.a_st_ctrl0[hc->chan[ch].port]);
3174 }
3175 }
3176 break;
3177 default:
3178 printk(KERN_DEBUG "%s: protocol not known %x\n",
3179 __func__, protocol);
3180 hc->chan[ch].protocol = ISDN_P_NONE;
3181 return -ENOPROTOOPT;
3182 }
3183 hc->chan[ch].protocol = protocol;
3184 return 0;
3185}
3186
3187
3188
3189
3190
3191
3192static void
3193hfcmulti_pcm(struct hfc_multi *hc, int ch, int slot_tx, int bank_tx,
3194 int slot_rx, int bank_rx)
3195{
3196 if (slot_tx < 0 || slot_rx < 0 || bank_tx < 0 || bank_rx < 0) {
3197
3198 mode_hfcmulti(hc, ch, hc->chan[ch].protocol, -1, 0, -1, 0);
3199 return;
3200 }
3201
3202
3203 mode_hfcmulti(hc, ch, hc->chan[ch].protocol, slot_tx, bank_tx,
3204 slot_rx, bank_rx);
3205}
3206
3207
3208
3209
3210
3211static void
3212hfcmulti_conf(struct hfc_multi *hc, int ch, int num)
3213{
3214 if (num >= 0 && num <= 7)
3215 hc->chan[ch].conf = num;
3216 else
3217 hc->chan[ch].conf = -1;
3218 mode_hfcmulti(hc, ch, hc->chan[ch].protocol, hc->chan[ch].slot_tx,
3219 hc->chan[ch].bank_tx, hc->chan[ch].slot_rx,
3220 hc->chan[ch].bank_rx);
3221}
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233static int
3234hfcm_l1callback(struct dchannel *dch, u_int cmd)
3235{
3236 struct hfc_multi *hc = dch->hw;
3237 u_long flags;
3238
3239 switch (cmd) {
3240 case INFO3_P8:
3241 case INFO3_P10:
3242 break;
3243 case HW_RESET_REQ:
3244
3245 spin_lock_irqsave(&hc->lock, flags);
3246 if (hc->ctype == HFC_TYPE_E1) {
3247 if (debug & DEBUG_HFCMULTI_MSG)
3248 printk(KERN_DEBUG
3249 "%s: HW_RESET_REQ no BRI\n",
3250 __func__);
3251 } else {
3252 HFC_outb(hc, R_ST_SEL, hc->chan[dch->slot].port);
3253
3254 udelay(1);
3255 HFC_outb(hc, A_ST_WR_STATE, V_ST_LD_STA | 3);
3256 udelay(6);
3257 HFC_outb(hc, A_ST_WR_STATE, 3);
3258 HFC_outb(hc, A_ST_WR_STATE, 3 | (V_ST_ACT * 3));
3259
3260 }
3261 spin_unlock_irqrestore(&hc->lock, flags);
3262 l1_event(dch->l1, HW_POWERUP_IND);
3263 break;
3264 case HW_DEACT_REQ:
3265
3266 spin_lock_irqsave(&hc->lock, flags);
3267 if (hc->ctype == HFC_TYPE_E1) {
3268 if (debug & DEBUG_HFCMULTI_MSG)
3269 printk(KERN_DEBUG
3270 "%s: HW_DEACT_REQ no BRI\n",
3271 __func__);
3272 } else {
3273 HFC_outb(hc, R_ST_SEL, hc->chan[dch->slot].port);
3274
3275 udelay(1);
3276 HFC_outb(hc, A_ST_WR_STATE, V_ST_ACT * 2);
3277
3278 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
3279 hc->syncronized &=
3280 ~(1 << hc->chan[dch->slot].port);
3281 plxsd_checksync(hc, 0);
3282 }
3283 }
3284 skb_queue_purge(&dch->squeue);
3285 if (dch->tx_skb) {
3286 dev_kfree_skb(dch->tx_skb);
3287 dch->tx_skb = NULL;
3288 }
3289 dch->tx_idx = 0;
3290 if (dch->rx_skb) {
3291 dev_kfree_skb(dch->rx_skb);
3292 dch->rx_skb = NULL;
3293 }
3294 test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
3295 if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
3296 del_timer(&dch->timer);
3297 spin_unlock_irqrestore(&hc->lock, flags);
3298 break;
3299 case HW_POWERUP_REQ:
3300 spin_lock_irqsave(&hc->lock, flags);
3301 if (hc->ctype == HFC_TYPE_E1) {
3302 if (debug & DEBUG_HFCMULTI_MSG)
3303 printk(KERN_DEBUG
3304 "%s: HW_POWERUP_REQ no BRI\n",
3305 __func__);
3306 } else {
3307 HFC_outb(hc, R_ST_SEL, hc->chan[dch->slot].port);
3308
3309 udelay(1);
3310 HFC_outb(hc, A_ST_WR_STATE, 3 | 0x10);
3311 udelay(6);
3312 HFC_outb(hc, A_ST_WR_STATE, 3);
3313 }
3314 spin_unlock_irqrestore(&hc->lock, flags);
3315 break;
3316 case PH_ACTIVATE_IND:
3317 test_and_set_bit(FLG_ACTIVE, &dch->Flags);
3318 _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
3319 GFP_ATOMIC);
3320 break;
3321 case PH_DEACTIVATE_IND:
3322 test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
3323 _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
3324 GFP_ATOMIC);
3325 break;
3326 default:
3327 if (dch->debug & DEBUG_HW)
3328 printk(KERN_DEBUG "%s: unknown command %x\n",
3329 __func__, cmd);
3330 return -1;
3331 }
3332 return 0;
3333}
3334
3335
3336
3337
3338
3339static int
3340handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
3341{
3342 struct mISDNdevice *dev = container_of(ch, struct mISDNdevice, D);
3343 struct dchannel *dch = container_of(dev, struct dchannel, dev);
3344 struct hfc_multi *hc = dch->hw;
3345 struct mISDNhead *hh = mISDN_HEAD_P(skb);
3346 int ret = -EINVAL;
3347 unsigned int id;
3348 u_long flags;
3349
3350 switch (hh->prim) {
3351 case PH_DATA_REQ:
3352 if (skb->len < 1)
3353 break;
3354 spin_lock_irqsave(&hc->lock, flags);
3355 ret = dchannel_senddata(dch, skb);
3356 if (ret > 0) {
3357 id = hh->id;
3358 hfcmulti_tx(hc, dch->slot);
3359 ret = 0;
3360
3361 HFC_outb(hc, R_FIFO, 0);
3362 HFC_wait(hc);
3363 spin_unlock_irqrestore(&hc->lock, flags);
3364 queue_ch_frame(ch, PH_DATA_CNF, id, NULL);
3365 } else
3366 spin_unlock_irqrestore(&hc->lock, flags);
3367 return ret;
3368 case PH_ACTIVATE_REQ:
3369 if (dch->dev.D.protocol != ISDN_P_TE_S0) {
3370 spin_lock_irqsave(&hc->lock, flags);
3371 ret = 0;
3372 if (debug & DEBUG_HFCMULTI_MSG)
3373 printk(KERN_DEBUG
3374 "%s: PH_ACTIVATE port %d (0..%d)\n",
3375 __func__, hc->chan[dch->slot].port,
3376 hc->ports - 1);
3377
3378 if (hc->ctype == HFC_TYPE_E1) {
3379 ph_state_change(dch);
3380 if (debug & DEBUG_HFCMULTI_STATE)
3381 printk(KERN_DEBUG
3382 "%s: E1 report state %x \n",
3383 __func__, dch->state);
3384 } else {
3385 HFC_outb(hc, R_ST_SEL,
3386 hc->chan[dch->slot].port);
3387
3388 udelay(1);
3389 HFC_outb(hc, A_ST_WR_STATE, V_ST_LD_STA | 1);
3390
3391 udelay(6);
3392 HFC_outb(hc, A_ST_WR_STATE, 1);
3393 HFC_outb(hc, A_ST_WR_STATE, 1 |
3394 (V_ST_ACT * 3));
3395 dch->state = 1;
3396 }
3397 spin_unlock_irqrestore(&hc->lock, flags);
3398 } else
3399 ret = l1_event(dch->l1, hh->prim);
3400 break;
3401 case PH_DEACTIVATE_REQ:
3402 test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
3403 if (dch->dev.D.protocol != ISDN_P_TE_S0) {
3404 spin_lock_irqsave(&hc->lock, flags);
3405 if (debug & DEBUG_HFCMULTI_MSG)
3406 printk(KERN_DEBUG
3407 "%s: PH_DEACTIVATE port %d (0..%d)\n",
3408 __func__, hc->chan[dch->slot].port,
3409 hc->ports - 1);
3410
3411 if (hc->ctype == HFC_TYPE_E1) {
3412 if (debug & DEBUG_HFCMULTI_MSG)
3413 printk(KERN_DEBUG
3414 "%s: PH_DEACTIVATE no BRI\n",
3415 __func__);
3416 } else {
3417 HFC_outb(hc, R_ST_SEL,
3418 hc->chan[dch->slot].port);
3419
3420 udelay(1);
3421 HFC_outb(hc, A_ST_WR_STATE, V_ST_ACT * 2);
3422
3423 dch->state = 1;
3424 }
3425 skb_queue_purge(&dch->squeue);
3426 if (dch->tx_skb) {
3427 dev_kfree_skb(dch->tx_skb);
3428 dch->tx_skb = NULL;
3429 }
3430 dch->tx_idx = 0;
3431 if (dch->rx_skb) {
3432 dev_kfree_skb(dch->rx_skb);
3433 dch->rx_skb = NULL;
3434 }
3435 test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
3436 if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
3437 del_timer(&dch->timer);
3438#ifdef FIXME
3439 if (test_and_clear_bit(FLG_L1_BUSY, &dch->Flags))
3440 dchannel_sched_event(&hc->dch, D_CLEARBUSY);
3441#endif
3442 ret = 0;
3443 spin_unlock_irqrestore(&hc->lock, flags);
3444 } else
3445 ret = l1_event(dch->l1, hh->prim);
3446 break;
3447 }
3448 if (!ret)
3449 dev_kfree_skb(skb);
3450 return ret;
3451}
3452
3453static void
3454deactivate_bchannel(struct bchannel *bch)
3455{
3456 struct hfc_multi *hc = bch->hw;
3457 u_long flags;
3458
3459 spin_lock_irqsave(&hc->lock, flags);
3460 mISDN_clear_bchannel(bch);
3461 hc->chan[bch->slot].coeff_count = 0;
3462 hc->chan[bch->slot].rx_off = 0;
3463 hc->chan[bch->slot].conf = -1;
3464 mode_hfcmulti(hc, bch->slot, ISDN_P_NONE, -1, 0, -1, 0);
3465 spin_unlock_irqrestore(&hc->lock, flags);
3466}
3467
3468static int
3469handle_bmsg(struct mISDNchannel *ch, struct sk_buff *skb)
3470{
3471 struct bchannel *bch = container_of(ch, struct bchannel, ch);
3472 struct hfc_multi *hc = bch->hw;
3473 int ret = -EINVAL;
3474 struct mISDNhead *hh = mISDN_HEAD_P(skb);
3475 unsigned long flags;
3476
3477 switch (hh->prim) {
3478 case PH_DATA_REQ:
3479 if (!skb->len)
3480 break;
3481 spin_lock_irqsave(&hc->lock, flags);
3482 ret = bchannel_senddata(bch, skb);
3483 if (ret > 0) {
3484 hfcmulti_tx(hc, bch->slot);
3485 ret = 0;
3486
3487 HFC_outb_nodebug(hc, R_FIFO, 0);
3488 HFC_wait_nodebug(hc);
3489 }
3490 spin_unlock_irqrestore(&hc->lock, flags);
3491 return ret;
3492 case PH_ACTIVATE_REQ:
3493 if (debug & DEBUG_HFCMULTI_MSG)
3494 printk(KERN_DEBUG "%s: PH_ACTIVATE ch %d (0..32)\n",
3495 __func__, bch->slot);
3496 spin_lock_irqsave(&hc->lock, flags);
3497
3498 if (!test_and_set_bit(FLG_ACTIVE, &bch->Flags)) {
3499 hc->chan[bch->slot].txpending = 0;
3500 ret = mode_hfcmulti(hc, bch->slot,
3501 ch->protocol,
3502 hc->chan[bch->slot].slot_tx,
3503 hc->chan[bch->slot].bank_tx,
3504 hc->chan[bch->slot].slot_rx,
3505 hc->chan[bch->slot].bank_rx);
3506 if (!ret) {
3507 if (ch->protocol == ISDN_P_B_RAW && !hc->dtmf
3508 && test_bit(HFC_CHIP_DTMF, &hc->chip)) {
3509
3510 hc->dtmf = 1;
3511 if (debug & DEBUG_HFCMULTI_DTMF)
3512 printk(KERN_DEBUG
3513 "%s: start dtmf decoder\n",
3514 __func__);
3515 HFC_outb(hc, R_DTMF, hc->hw.r_dtmf |
3516 V_RST_DTMF);
3517 }
3518 }
3519 } else
3520 ret = 0;
3521 spin_unlock_irqrestore(&hc->lock, flags);
3522 if (!ret)
3523 _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0, NULL,
3524 GFP_KERNEL);
3525 break;
3526 case PH_CONTROL_REQ:
3527 spin_lock_irqsave(&hc->lock, flags);
3528 switch (hh->id) {
3529 case HFC_SPL_LOOP_ON:
3530 if (debug & DEBUG_HFCMULTI_MSG)
3531 printk(KERN_DEBUG
3532 "%s: HFC_SPL_LOOP_ON (len = %d)\n",
3533 __func__, skb->len);
3534 ret = 0;
3535 break;
3536 case HFC_SPL_LOOP_OFF:
3537 if (debug & DEBUG_HFCMULTI_MSG)
3538 printk(KERN_DEBUG "%s: HFC_SPL_LOOP_OFF\n",
3539 __func__);
3540 ret = 0;
3541 break;
3542 default:
3543 printk(KERN_ERR
3544 "%s: unknown PH_CONTROL_REQ info %x\n",
3545 __func__, hh->id);
3546 ret = -EINVAL;
3547 }
3548 spin_unlock_irqrestore(&hc->lock, flags);
3549 break;
3550 case PH_DEACTIVATE_REQ:
3551 deactivate_bchannel(bch);
3552 _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0, NULL,
3553 GFP_KERNEL);
3554 ret = 0;
3555 break;
3556 }
3557 if (!ret)
3558 dev_kfree_skb(skb);
3559 return ret;
3560}
3561
3562
3563
3564
3565static int
3566channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
3567{
3568 int ret = 0;
3569 struct dsp_features *features =
3570 (struct dsp_features *)(*((u_long *)&cq->p1));
3571 struct hfc_multi *hc = bch->hw;
3572 int slot_tx;
3573 int bank_tx;
3574 int slot_rx;
3575 int bank_rx;
3576 int num;
3577
3578 switch (cq->op) {
3579 case MISDN_CTRL_GETOP:
3580 ret = mISDN_ctrl_bchannel(bch, cq);
3581 cq->op |= MISDN_CTRL_HFC_OP | MISDN_CTRL_HW_FEATURES_OP;
3582 break;
3583 case MISDN_CTRL_RX_OFF:
3584 ret = mISDN_ctrl_bchannel(bch, cq);
3585 hc->chan[bch->slot].rx_off = !!cq->p1;
3586 if (!hc->chan[bch->slot].rx_off) {
3587
3588 HFC_outb_nodebug(hc, R_FIFO, (bch->slot << 1) | 1);
3589 HFC_wait_nodebug(hc);
3590 HFC_outb_nodebug(hc, R_INC_RES_FIFO, V_RES_F);
3591 HFC_wait_nodebug(hc);
3592 }
3593 if (debug & DEBUG_HFCMULTI_MSG)
3594 printk(KERN_DEBUG "%s: RX_OFF request (nr=%d off=%d)\n",
3595 __func__, bch->nr, hc->chan[bch->slot].rx_off);
3596 break;
3597 case MISDN_CTRL_FILL_EMPTY:
3598 ret = mISDN_ctrl_bchannel(bch, cq);
3599 hc->silence = bch->fill[0];
3600 memset(hc->silence_data, hc->silence, sizeof(hc->silence_data));
3601 break;
3602 case MISDN_CTRL_HW_FEATURES:
3603 if (debug & DEBUG_HFCMULTI_MSG)
3604 printk(KERN_DEBUG "%s: HW_FEATURE request\n",
3605 __func__);
3606
3607 features->hfc_id = hc->id;
3608 if (test_bit(HFC_CHIP_DTMF, &hc->chip))
3609 features->hfc_dtmf = 1;
3610 if (test_bit(HFC_CHIP_CONF, &hc->chip))
3611 features->hfc_conf = 1;
3612 features->hfc_loops = 0;
3613 if (test_bit(HFC_CHIP_B410P, &hc->chip)) {
3614 features->hfc_echocanhw = 1;
3615 } else {
3616 features->pcm_id = hc->pcm;
3617 features->pcm_slots = hc->slots;
3618 features->pcm_banks = 2;
3619 }
3620 break;
3621 case MISDN_CTRL_HFC_PCM_CONN:
3622 slot_tx = cq->p1 & 0xff;
3623 bank_tx = cq->p1 >> 8;
3624 slot_rx = cq->p2 & 0xff;
3625 bank_rx = cq->p2 >> 8;
3626 if (debug & DEBUG_HFCMULTI_MSG)
3627 printk(KERN_DEBUG
3628 "%s: HFC_PCM_CONN slot %d bank %d (TX) "
3629 "slot %d bank %d (RX)\n",
3630 __func__, slot_tx, bank_tx,
3631 slot_rx, bank_rx);
3632 if (slot_tx < hc->slots && bank_tx <= 2 &&
3633 slot_rx < hc->slots && bank_rx <= 2)
3634 hfcmulti_pcm(hc, bch->slot,
3635 slot_tx, bank_tx, slot_rx, bank_rx);
3636 else {
3637 printk(KERN_WARNING
3638 "%s: HFC_PCM_CONN slot %d bank %d (TX) "
3639 "slot %d bank %d (RX) out of range\n",
3640 __func__, slot_tx, bank_tx,
3641 slot_rx, bank_rx);
3642 ret = -EINVAL;
3643 }
3644 break;
3645 case MISDN_CTRL_HFC_PCM_DISC:
3646 if (debug & DEBUG_HFCMULTI_MSG)
3647 printk(KERN_DEBUG "%s: HFC_PCM_DISC\n",
3648 __func__);
3649 hfcmulti_pcm(hc, bch->slot, -1, 0, -1, 0);
3650 break;
3651 case MISDN_CTRL_HFC_CONF_JOIN:
3652 num = cq->p1 & 0xff;
3653 if (debug & DEBUG_HFCMULTI_MSG)
3654 printk(KERN_DEBUG "%s: HFC_CONF_JOIN conf %d\n",
3655 __func__, num);
3656 if (num <= 7)
3657 hfcmulti_conf(hc, bch->slot, num);
3658 else {
3659 printk(KERN_WARNING
3660 "%s: HW_CONF_JOIN conf %d out of range\n",
3661 __func__, num);
3662 ret = -EINVAL;
3663 }
3664 break;
3665 case MISDN_CTRL_HFC_CONF_SPLIT:
3666 if (debug & DEBUG_HFCMULTI_MSG)
3667 printk(KERN_DEBUG "%s: HFC_CONF_SPLIT\n", __func__);
3668 hfcmulti_conf(hc, bch->slot, -1);
3669 break;
3670 case MISDN_CTRL_HFC_ECHOCAN_ON:
3671 if (debug & DEBUG_HFCMULTI_MSG)
3672 printk(KERN_DEBUG "%s: HFC_ECHOCAN_ON\n", __func__);
3673 if (test_bit(HFC_CHIP_B410P, &hc->chip))
3674 vpm_echocan_on(hc, bch->slot, cq->p1);
3675 else
3676 ret = -EINVAL;
3677 break;
3678
3679 case MISDN_CTRL_HFC_ECHOCAN_OFF:
3680 if (debug & DEBUG_HFCMULTI_MSG)
3681 printk(KERN_DEBUG "%s: HFC_ECHOCAN_OFF\n",
3682 __func__);
3683 if (test_bit(HFC_CHIP_B410P, &hc->chip))
3684 vpm_echocan_off(hc, bch->slot);
3685 else
3686 ret = -EINVAL;
3687 break;
3688 default:
3689 ret = mISDN_ctrl_bchannel(bch, cq);
3690 break;
3691 }
3692 return ret;
3693}
3694
3695static int
3696hfcm_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
3697{
3698 struct bchannel *bch = container_of(ch, struct bchannel, ch);
3699 struct hfc_multi *hc = bch->hw;
3700 int err = -EINVAL;
3701 u_long flags;
3702
3703 if (bch->debug & DEBUG_HW)
3704 printk(KERN_DEBUG "%s: cmd:%x %p\n",
3705 __func__, cmd, arg);
3706 switch (cmd) {
3707 case CLOSE_CHANNEL:
3708 test_and_clear_bit(FLG_OPEN, &bch->Flags);
3709 deactivate_bchannel(bch);
3710 ch->protocol = ISDN_P_NONE;
3711 ch->peer = NULL;
3712 module_put(THIS_MODULE);
3713 err = 0;
3714 break;
3715 case CONTROL_CHANNEL:
3716 spin_lock_irqsave(&hc->lock, flags);
3717 err = channel_bctrl(bch, arg);
3718 spin_unlock_irqrestore(&hc->lock, flags);
3719 break;
3720 default:
3721 printk(KERN_WARNING "%s: unknown prim(%x)\n",
3722 __func__, cmd);
3723 }
3724 return err;
3725}
3726
3727
3728
3729
3730
3731
3732static void
3733ph_state_change(struct dchannel *dch)
3734{
3735 struct hfc_multi *hc;
3736 int ch, i;
3737
3738 if (!dch) {
3739 printk(KERN_WARNING "%s: ERROR given dch is NULL\n", __func__);
3740 return;
3741 }
3742 hc = dch->hw;
3743 ch = dch->slot;
3744
3745 if (hc->ctype == HFC_TYPE_E1) {
3746 if (dch->dev.D.protocol == ISDN_P_TE_E1) {
3747 if (debug & DEBUG_HFCMULTI_STATE)
3748 printk(KERN_DEBUG
3749 "%s: E1 TE (id=%d) newstate %x\n",
3750 __func__, hc->id, dch->state);
3751 } else {
3752 if (debug & DEBUG_HFCMULTI_STATE)
3753 printk(KERN_DEBUG
3754 "%s: E1 NT (id=%d) newstate %x\n",
3755 __func__, hc->id, dch->state);
3756 }
3757 switch (dch->state) {
3758 case (1):
3759 if (hc->e1_state != 1) {
3760 for (i = 1; i <= 31; i++) {
3761
3762 HFC_outb_nodebug(hc, R_FIFO,
3763 (i << 1) | 1);
3764 HFC_wait_nodebug(hc);
3765 HFC_outb_nodebug(hc, R_INC_RES_FIFO,
3766 V_RES_F);
3767 HFC_wait_nodebug(hc);
3768 }
3769 }
3770 test_and_set_bit(FLG_ACTIVE, &dch->Flags);
3771 _queue_data(&dch->dev.D, PH_ACTIVATE_IND,
3772 MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
3773 break;
3774
3775 default:
3776 if (hc->e1_state != 1)
3777 return;
3778 test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
3779 _queue_data(&dch->dev.D, PH_DEACTIVATE_IND,
3780 MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
3781 }
3782 hc->e1_state = dch->state;
3783 } else {
3784 if (dch->dev.D.protocol == ISDN_P_TE_S0) {
3785 if (debug & DEBUG_HFCMULTI_STATE)
3786 printk(KERN_DEBUG
3787 "%s: S/T TE newstate %x\n",
3788 __func__, dch->state);
3789 switch (dch->state) {
3790 case (0):
3791 l1_event(dch->l1, HW_RESET_IND);
3792 break;
3793 case (3):
3794 l1_event(dch->l1, HW_DEACT_IND);
3795 break;
3796 case (5):
3797 case (8):
3798 l1_event(dch->l1, ANYSIGNAL);
3799 break;
3800 case (6):
3801 l1_event(dch->l1, INFO2);
3802 break;
3803 case (7):
3804 l1_event(dch->l1, INFO4_P8);
3805 break;
3806 }
3807 } else {
3808 if (debug & DEBUG_HFCMULTI_STATE)
3809 printk(KERN_DEBUG "%s: S/T NT newstate %x\n",
3810 __func__, dch->state);
3811 switch (dch->state) {
3812 case (2):
3813 if (hc->chan[ch].nt_timer == 0) {
3814 hc->chan[ch].nt_timer = -1;
3815 HFC_outb(hc, R_ST_SEL,
3816 hc->chan[ch].port);
3817
3818 udelay(1);
3819 HFC_outb(hc, A_ST_WR_STATE, 4 |
3820 V_ST_LD_STA);
3821 udelay(6);
3822 HFC_outb(hc, A_ST_WR_STATE, 4);
3823 dch->state = 4;
3824 } else {
3825
3826 hc->chan[ch].nt_timer =
3827 nt_t1_count[poll_timer] + 1;
3828 HFC_outb(hc, R_ST_SEL,
3829 hc->chan[ch].port);
3830
3831 udelay(1);
3832
3833 HFC_outb(hc, A_ST_WR_STATE, 2 |
3834 V_SET_G2_G3);
3835 }
3836 break;
3837 case (1):
3838 hc->chan[ch].nt_timer = -1;
3839 test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
3840 _queue_data(&dch->dev.D, PH_DEACTIVATE_IND,
3841 MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
3842 break;
3843 case (4):
3844 hc->chan[ch].nt_timer = -1;
3845 break;
3846 case (3):
3847 hc->chan[ch].nt_timer = -1;
3848 test_and_set_bit(FLG_ACTIVE, &dch->Flags);
3849 _queue_data(&dch->dev.D, PH_ACTIVATE_IND,
3850 MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
3851 break;
3852 }
3853 }
3854 }
3855}
3856
3857
3858
3859
3860
3861static void
3862hfcmulti_initmode(struct dchannel *dch)
3863{
3864 struct hfc_multi *hc = dch->hw;
3865 u_char a_st_wr_state, r_e1_wr_sta;
3866 int i, pt;
3867
3868 if (debug & DEBUG_HFCMULTI_INIT)
3869 printk(KERN_DEBUG "%s: entered\n", __func__);
3870
3871 i = dch->slot;
3872 pt = hc->chan[i].port;
3873 if (hc->ctype == HFC_TYPE_E1) {
3874
3875 hc->chan[hc->dnum[pt]].slot_tx = -1;
3876 hc->chan[hc->dnum[pt]].slot_rx = -1;
3877 hc->chan[hc->dnum[pt]].conf = -1;
3878 if (hc->dnum[pt]) {
3879 mode_hfcmulti(hc, dch->slot, dch->dev.D.protocol,
3880 -1, 0, -1, 0);
3881 dch->timer.function = (void *) hfcmulti_dbusy_timer;
3882 dch->timer.data = (long) dch;
3883 init_timer(&dch->timer);
3884 }
3885 for (i = 1; i <= 31; i++) {
3886 if (!((1 << i) & hc->bmask[pt]))
3887 continue;
3888 hc->chan[i].slot_tx = -1;
3889 hc->chan[i].slot_rx = -1;
3890 hc->chan[i].conf = -1;
3891 mode_hfcmulti(hc, i, ISDN_P_NONE, -1, 0, -1, 0);
3892 }
3893 }
3894 if (hc->ctype == HFC_TYPE_E1 && pt == 0) {
3895
3896 dch = hc->chan[hc->dnum[0]].dch;
3897 if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dnum[0]].cfg)) {
3898 HFC_outb(hc, R_LOS0, 255);
3899 HFC_outb(hc, R_LOS1, 255);
3900 }
3901 if (test_bit(HFC_CFG_OPTICAL, &hc->chan[hc->dnum[0]].cfg)) {
3902 HFC_outb(hc, R_RX0, 0);
3903 hc->hw.r_tx0 = 0 | V_OUT_EN;
3904 } else {
3905 HFC_outb(hc, R_RX0, 1);
3906 hc->hw.r_tx0 = 1 | V_OUT_EN;
3907 }
3908 hc->hw.r_tx1 = V_ATX | V_NTRI;
3909 HFC_outb(hc, R_TX0, hc->hw.r_tx0);
3910 HFC_outb(hc, R_TX1, hc->hw.r_tx1);
3911 HFC_outb(hc, R_TX_FR0, 0x00);
3912 HFC_outb(hc, R_TX_FR1, 0xf8);
3913
3914 if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dnum[0]].cfg))
3915 HFC_outb(hc, R_TX_FR2, V_TX_MF | V_TX_E | V_NEG_E);
3916
3917 HFC_outb(hc, R_RX_FR0, V_AUTO_RESYNC | V_AUTO_RECO | 0);
3918
3919 if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dnum[0]].cfg))
3920 HFC_outb(hc, R_RX_FR1, V_RX_MF | V_RX_MF_SYNC);
3921
3922 if (dch->dev.D.protocol == ISDN_P_NT_E1) {
3923 if (debug & DEBUG_HFCMULTI_INIT)
3924 printk(KERN_DEBUG "%s: E1 port is NT-mode\n",
3925 __func__);
3926 r_e1_wr_sta = 0;
3927 hc->e1_getclock = 0;
3928 } else {
3929 if (debug & DEBUG_HFCMULTI_INIT)
3930 printk(KERN_DEBUG "%s: E1 port is TE-mode\n",
3931 __func__);
3932 r_e1_wr_sta = 0;
3933 hc->e1_getclock = 1;
3934 }
3935 if (test_bit(HFC_CHIP_RX_SYNC, &hc->chip))
3936 HFC_outb(hc, R_SYNC_OUT, V_SYNC_E1_RX);
3937 else
3938 HFC_outb(hc, R_SYNC_OUT, 0);
3939 if (test_bit(HFC_CHIP_E1CLOCK_GET, &hc->chip))
3940 hc->e1_getclock = 1;
3941 if (test_bit(HFC_CHIP_E1CLOCK_PUT, &hc->chip))
3942 hc->e1_getclock = 0;
3943 if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip)) {
3944
3945 if (debug & DEBUG_HFCMULTI_INIT)
3946 printk(KERN_DEBUG
3947 "%s: E1 port is clock master "
3948 "(clock from PCM)\n", __func__);
3949 HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC | V_PCM_SYNC);
3950 } else {
3951 if (hc->e1_getclock) {
3952
3953 if (debug & DEBUG_HFCMULTI_INIT)
3954 printk(KERN_DEBUG
3955 "%s: E1 port is clock slave "
3956 "(clock to PCM)\n", __func__);
3957 HFC_outb(hc, R_SYNC_CTRL, V_SYNC_OFFS);
3958 } else {
3959
3960 if (debug & DEBUG_HFCMULTI_INIT)
3961 printk(KERN_DEBUG "%s: E1 port is "
3962 "clock master "
3963 "(clock from QUARTZ)\n",
3964 __func__);
3965 HFC_outb(hc, R_SYNC_CTRL, V_EXT_CLK_SYNC |
3966 V_PCM_SYNC | V_JATT_OFF);
3967 HFC_outb(hc, R_SYNC_OUT, 0);
3968 }
3969 }
3970 HFC_outb(hc, R_JATT_ATT, 0x9c);
3971 HFC_outb(hc, R_PWM_MD, V_PWM0_MD);
3972 HFC_outb(hc, R_PWM0, 0x50);
3973 HFC_outb(hc, R_PWM1, 0xff);
3974
3975 HFC_outb(hc, R_E1_WR_STA, r_e1_wr_sta | V_E1_LD_STA);
3976 udelay(6);
3977 HFC_outb(hc, R_E1_WR_STA, r_e1_wr_sta);
3978 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
3979 hc->syncronized = 0;
3980 plxsd_checksync(hc, 0);
3981 }
3982 }
3983 if (hc->ctype != HFC_TYPE_E1) {
3984
3985 hc->chan[i].slot_tx = -1;
3986 hc->chan[i].slot_rx = -1;
3987 hc->chan[i].conf = -1;
3988 mode_hfcmulti(hc, i, dch->dev.D.protocol, -1, 0, -1, 0);
3989 dch->timer.function = (void *) hfcmulti_dbusy_timer;
3990 dch->timer.data = (long) dch;
3991 init_timer(&dch->timer);
3992 hc->chan[i - 2].slot_tx = -1;
3993 hc->chan[i - 2].slot_rx = -1;
3994 hc->chan[i - 2].conf = -1;
3995 mode_hfcmulti(hc, i - 2, ISDN_P_NONE, -1, 0, -1, 0);
3996 hc->chan[i - 1].slot_tx = -1;
3997 hc->chan[i - 1].slot_rx = -1;
3998 hc->chan[i - 1].conf = -1;
3999 mode_hfcmulti(hc, i - 1, ISDN_P_NONE, -1, 0, -1, 0);
4000
4001 HFC_outb(hc, R_ST_SEL, pt);
4002
4003 udelay(1);
4004 if (dch->dev.D.protocol == ISDN_P_NT_S0) {
4005 if (debug & DEBUG_HFCMULTI_INIT)
4006 printk(KERN_DEBUG
4007 "%s: ST port %d is NT-mode\n",
4008 __func__, pt);
4009
4010 HFC_outb(hc, A_ST_CLK_DLY, clockdelay_nt);
4011 a_st_wr_state = 1;
4012 hc->hw.a_st_ctrl0[pt] = V_ST_MD;
4013 } else {
4014 if (debug & DEBUG_HFCMULTI_INIT)
4015 printk(KERN_DEBUG
4016 "%s: ST port %d is TE-mode\n",
4017 __func__, pt);
4018
4019 HFC_outb(hc, A_ST_CLK_DLY, clockdelay_te);
4020 a_st_wr_state = 2;
4021 hc->hw.a_st_ctrl0[pt] = 0;
4022 }
4023 if (!test_bit(HFC_CFG_NONCAP_TX, &hc->chan[i].cfg))
4024 hc->hw.a_st_ctrl0[pt] |= V_TX_LI;
4025 if (hc->ctype == HFC_TYPE_XHFC) {
4026 hc->hw.a_st_ctrl0[pt] |= 0x40 ;
4027 HFC_outb(hc, 0x35 ,
4028 0x7c << 1 );
4029 }
4030
4031 HFC_outb(hc, A_ST_CTRL0, hc->hw.a_st_ctrl0[pt]);
4032
4033 if ((dch->dev.D.protocol == ISDN_P_NT_S0) ||
4034 test_bit(HFC_CFG_DIS_ECHANNEL, &hc->chan[i].cfg))
4035 HFC_outb(hc, A_ST_CTRL1, V_E_IGNO);
4036 else
4037 HFC_outb(hc, A_ST_CTRL1, 0);
4038
4039 HFC_outb(hc, A_ST_CTRL2, V_B1_RX_EN | V_B2_RX_EN);
4040
4041 HFC_outb(hc, A_ST_WR_STATE, a_st_wr_state | V_ST_LD_STA);
4042 udelay(6);
4043 HFC_outb(hc, A_ST_WR_STATE, a_st_wr_state);
4044 hc->hw.r_sci_msk |= 1 << pt;
4045
4046 HFC_outb(hc, R_SCI_MSK, hc->hw.r_sci_msk);
4047
4048 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4049 hc->syncronized &=
4050 ~(1 << hc->chan[dch->slot].port);
4051 plxsd_checksync(hc, 0);
4052 }
4053 }
4054 if (debug & DEBUG_HFCMULTI_INIT)
4055 printk("%s: done\n", __func__);
4056}
4057
4058
4059static int
4060open_dchannel(struct hfc_multi *hc, struct dchannel *dch,
4061 struct channel_req *rq)
4062{
4063 int err = 0;
4064 u_long flags;
4065
4066 if (debug & DEBUG_HW_OPEN)
4067 printk(KERN_DEBUG "%s: dev(%d) open from %p\n", __func__,
4068 dch->dev.id, __builtin_return_address(0));
4069 if (rq->protocol == ISDN_P_NONE)
4070 return -EINVAL;
4071 if ((dch->dev.D.protocol != ISDN_P_NONE) &&
4072 (dch->dev.D.protocol != rq->protocol)) {
4073 if (debug & DEBUG_HFCMULTI_MODE)
4074 printk(KERN_DEBUG "%s: change protocol %x to %x\n",
4075 __func__, dch->dev.D.protocol, rq->protocol);
4076 }
4077 if ((dch->dev.D.protocol == ISDN_P_TE_S0) &&
4078 (rq->protocol != ISDN_P_TE_S0))
4079 l1_event(dch->l1, CLOSE_CHANNEL);
4080 if (dch->dev.D.protocol != rq->protocol) {
4081 if (rq->protocol == ISDN_P_TE_S0) {
4082 err = create_l1(dch, hfcm_l1callback);
4083 if (err)
4084 return err;
4085 }
4086 dch->dev.D.protocol = rq->protocol;
4087 spin_lock_irqsave(&hc->lock, flags);
4088 hfcmulti_initmode(dch);
4089 spin_unlock_irqrestore(&hc->lock, flags);
4090 }
4091 if (test_bit(FLG_ACTIVE, &dch->Flags))
4092 _queue_data(&dch->dev.D, PH_ACTIVATE_IND, MISDN_ID_ANY,
4093 0, NULL, GFP_KERNEL);
4094 rq->ch = &dch->dev.D;
4095 if (!try_module_get(THIS_MODULE))
4096 printk(KERN_WARNING "%s:cannot get module\n", __func__);
4097 return 0;
4098}
4099
4100static int
4101open_bchannel(struct hfc_multi *hc, struct dchannel *dch,
4102 struct channel_req *rq)
4103{
4104 struct bchannel *bch;
4105 int ch;
4106
4107 if (!test_channelmap(rq->adr.channel, dch->dev.channelmap))
4108 return -EINVAL;
4109 if (rq->protocol == ISDN_P_NONE)
4110 return -EINVAL;
4111 if (hc->ctype == HFC_TYPE_E1)
4112 ch = rq->adr.channel;
4113 else
4114 ch = (rq->adr.channel - 1) + (dch->slot - 2);
4115 bch = hc->chan[ch].bch;
4116 if (!bch) {
4117 printk(KERN_ERR "%s:internal error ch %d has no bch\n",
4118 __func__, ch);
4119 return -EINVAL;
4120 }
4121 if (test_and_set_bit(FLG_OPEN, &bch->Flags))
4122 return -EBUSY;
4123 bch->ch.protocol = rq->protocol;
4124 hc->chan[ch].rx_off = 0;
4125 rq->ch = &bch->ch;
4126 if (!try_module_get(THIS_MODULE))
4127 printk(KERN_WARNING "%s:cannot get module\n", __func__);
4128 return 0;
4129}
4130
4131
4132
4133
4134static int
4135channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq)
4136{
4137 struct hfc_multi *hc = dch->hw;
4138 int ret = 0;
4139 int wd_mode, wd_cnt;
4140
4141 switch (cq->op) {
4142 case MISDN_CTRL_GETOP:
4143 cq->op = MISDN_CTRL_HFC_OP | MISDN_CTRL_L1_TIMER3;
4144 break;
4145 case MISDN_CTRL_HFC_WD_INIT:
4146 wd_cnt = cq->p1 & 0xf;
4147 wd_mode = !!(cq->p1 >> 4);
4148 if (debug & DEBUG_HFCMULTI_MSG)
4149 printk(KERN_DEBUG "%s: MISDN_CTRL_HFC_WD_INIT mode %s"
4150 ", counter 0x%x\n", __func__,
4151 wd_mode ? "AUTO" : "MANUAL", wd_cnt);
4152
4153 HFC_outb(hc, R_TI_WD, poll_timer | (wd_cnt << 4));
4154 hc->hw.r_bert_wd_md = (wd_mode ? V_AUTO_WD_RES : 0);
4155 if (hc->ctype == HFC_TYPE_XHFC)
4156 hc->hw.r_bert_wd_md |= 0x40 ;
4157
4158 HFC_outb(hc, R_BERT_WD_MD, hc->hw.r_bert_wd_md | V_WD_RES);
4159 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4160
4161 HFC_outb(hc, R_GPIO_SEL, V_GPIO_SEL7);
4162 HFC_outb(hc, R_GPIO_EN1, V_GPIO_EN15);
4163 HFC_outb(hc, R_GPIO_OUT1, 0);
4164 HFC_outb(hc, R_GPIO_OUT1, V_GPIO_OUT15);
4165 }
4166 break;
4167 case MISDN_CTRL_HFC_WD_RESET:
4168 if (debug & DEBUG_HFCMULTI_MSG)
4169 printk(KERN_DEBUG "%s: MISDN_CTRL_HFC_WD_RESET\n",
4170 __func__);
4171 HFC_outb(hc, R_BERT_WD_MD, hc->hw.r_bert_wd_md | V_WD_RES);
4172 break;
4173 case MISDN_CTRL_L1_TIMER3:
4174 ret = l1_event(dch->l1, HW_TIMER3_VALUE | (cq->p1 & 0xff));
4175 break;
4176 default:
4177 printk(KERN_WARNING "%s: unknown Op %x\n",
4178 __func__, cq->op);
4179 ret = -EINVAL;
4180 break;
4181 }
4182 return ret;
4183}
4184
4185static int
4186hfcm_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
4187{
4188 struct mISDNdevice *dev = container_of(ch, struct mISDNdevice, D);
4189 struct dchannel *dch = container_of(dev, struct dchannel, dev);
4190 struct hfc_multi *hc = dch->hw;
4191 struct channel_req *rq;
4192 int err = 0;
4193 u_long flags;
4194
4195 if (dch->debug & DEBUG_HW)
4196 printk(KERN_DEBUG "%s: cmd:%x %p\n",
4197 __func__, cmd, arg);
4198 switch (cmd) {
4199 case OPEN_CHANNEL:
4200 rq = arg;
4201 switch (rq->protocol) {
4202 case ISDN_P_TE_S0:
4203 case ISDN_P_NT_S0:
4204 if (hc->ctype == HFC_TYPE_E1) {
4205 err = -EINVAL;
4206 break;
4207 }
4208 err = open_dchannel(hc, dch, rq);
4209 break;
4210 case ISDN_P_TE_E1:
4211 case ISDN_P_NT_E1:
4212 if (hc->ctype != HFC_TYPE_E1) {
4213 err = -EINVAL;
4214 break;
4215 }
4216 err = open_dchannel(hc, dch, rq);
4217 break;
4218 default:
4219 spin_lock_irqsave(&hc->lock, flags);
4220 err = open_bchannel(hc, dch, rq);
4221 spin_unlock_irqrestore(&hc->lock, flags);
4222 }
4223 break;
4224 case CLOSE_CHANNEL:
4225 if (debug & DEBUG_HW_OPEN)
4226 printk(KERN_DEBUG "%s: dev(%d) close from %p\n",
4227 __func__, dch->dev.id,
4228 __builtin_return_address(0));
4229 module_put(THIS_MODULE);
4230 break;
4231 case CONTROL_CHANNEL:
4232 spin_lock_irqsave(&hc->lock, flags);
4233 err = channel_dctrl(dch, arg);
4234 spin_unlock_irqrestore(&hc->lock, flags);
4235 break;
4236 default:
4237 if (dch->debug & DEBUG_HW)
4238 printk(KERN_DEBUG "%s: unknown command %x\n",
4239 __func__, cmd);
4240 err = -EINVAL;
4241 }
4242 return err;
4243}
4244
4245static int
4246clockctl(void *priv, int enable)
4247{
4248 struct hfc_multi *hc = priv;
4249
4250 hc->iclock_on = enable;
4251 return 0;
4252}
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262static int
4263init_card(struct hfc_multi *hc)
4264{
4265 int err = -EIO;
4266 u_long flags;
4267 void __iomem *plx_acc;
4268 u_long plx_flags;
4269
4270 if (debug & DEBUG_HFCMULTI_INIT)
4271 printk(KERN_DEBUG "%s: entered\n", __func__);
4272
4273 spin_lock_irqsave(&hc->lock, flags);
4274
4275 hc->hw.r_irq_ctrl = V_FIFO_IRQ;
4276 disable_hwirq(hc);
4277 spin_unlock_irqrestore(&hc->lock, flags);
4278
4279 if (request_irq(hc->irq, hfcmulti_interrupt, IRQF_SHARED,
4280 "HFC-multi", hc)) {
4281 printk(KERN_WARNING "mISDN: Could not get interrupt %d.\n",
4282 hc->irq);
4283 hc->irq = 0;
4284 return -EIO;
4285 }
4286
4287 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4288 spin_lock_irqsave(&plx_lock, plx_flags);
4289 plx_acc = hc->plx_membase + PLX_INTCSR;
4290 writew((PLX_INTCSR_PCIINT_ENABLE | PLX_INTCSR_LINTI1_ENABLE),
4291 plx_acc);
4292 spin_unlock_irqrestore(&plx_lock, plx_flags);
4293 }
4294
4295 if (debug & DEBUG_HFCMULTI_INIT)
4296 printk(KERN_DEBUG "%s: IRQ %d count %d\n",
4297 __func__, hc->irq, hc->irqcnt);
4298 err = init_chip(hc);
4299 if (err)
4300 goto error;
4301
4302
4303
4304
4305
4306 spin_lock_irqsave(&hc->lock, flags);
4307 enable_hwirq(hc);
4308 spin_unlock_irqrestore(&hc->lock, flags);
4309
4310 set_current_state(TASK_UNINTERRUPTIBLE);
4311 schedule_timeout((100 * HZ) / 1000);
4312
4313 spin_lock_irqsave(&hc->lock, flags);
4314 disable_hwirq(hc);
4315 spin_unlock_irqrestore(&hc->lock, flags);
4316 if (debug & DEBUG_HFCMULTI_INIT)
4317 printk(KERN_DEBUG "%s: IRQ %d count %d\n",
4318 __func__, hc->irq, hc->irqcnt);
4319 if (hc->irqcnt) {
4320 if (debug & DEBUG_HFCMULTI_INIT)
4321 printk(KERN_DEBUG "%s: done\n", __func__);
4322
4323 return 0;
4324 }
4325 if (test_bit(HFC_CHIP_PCM_SLAVE, &hc->chip)) {
4326 printk(KERN_INFO "ignoring missing interrupts\n");
4327 return 0;
4328 }
4329
4330 printk(KERN_ERR "HFC PCI: IRQ(%d) getting no interrupts during init.\n",
4331 hc->irq);
4332
4333 err = -EIO;
4334
4335error:
4336 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4337 spin_lock_irqsave(&plx_lock, plx_flags);
4338 plx_acc = hc->plx_membase + PLX_INTCSR;
4339 writew(0x00, plx_acc);
4340 spin_unlock_irqrestore(&plx_lock, plx_flags);
4341 }
4342
4343 if (debug & DEBUG_HFCMULTI_INIT)
4344 printk(KERN_DEBUG "%s: free irq %d\n", __func__, hc->irq);
4345 if (hc->irq) {
4346 free_irq(hc->irq, hc);
4347 hc->irq = 0;
4348 }
4349
4350 if (debug & DEBUG_HFCMULTI_INIT)
4351 printk(KERN_DEBUG "%s: done (err=%d)\n", __func__, err);
4352 return err;
4353}
4354
4355
4356
4357
4358
4359static int
4360setup_pci(struct hfc_multi *hc, struct pci_dev *pdev,
4361 const struct pci_device_id *ent)
4362{
4363 struct hm_map *m = (struct hm_map *)ent->driver_data;
4364
4365 printk(KERN_INFO
4366 "HFC-multi: card manufacturer: '%s' card name: '%s' clock: %s\n",
4367 m->vendor_name, m->card_name, m->clock2 ? "double" : "normal");
4368
4369 hc->pci_dev = pdev;
4370 if (m->clock2)
4371 test_and_set_bit(HFC_CHIP_CLOCK2, &hc->chip);
4372
4373 if (ent->device == 0xB410) {
4374 test_and_set_bit(HFC_CHIP_B410P, &hc->chip);
4375 test_and_set_bit(HFC_CHIP_PCM_MASTER, &hc->chip);
4376 test_and_clear_bit(HFC_CHIP_PCM_SLAVE, &hc->chip);
4377 hc->slots = 32;
4378 }
4379
4380 if (hc->pci_dev->irq <= 0) {
4381 printk(KERN_WARNING "HFC-multi: No IRQ for PCI card found.\n");
4382 return -EIO;
4383 }
4384 if (pci_enable_device(hc->pci_dev)) {
4385 printk(KERN_WARNING "HFC-multi: Error enabling PCI card.\n");
4386 return -EIO;
4387 }
4388 hc->leds = m->leds;
4389 hc->ledstate = 0xAFFEAFFE;
4390 hc->opticalsupport = m->opticalsupport;
4391
4392 hc->pci_iobase = 0;
4393 hc->pci_membase = NULL;
4394 hc->plx_membase = NULL;
4395
4396
4397 if (m->io_mode)
4398 hc->io_mode = m->io_mode;
4399 switch (hc->io_mode) {
4400 case HFC_IO_MODE_PLXSD:
4401 test_and_set_bit(HFC_CHIP_PLXSD, &hc->chip);
4402 hc->slots = 128;
4403 hc->HFC_outb = HFC_outb_pcimem;
4404 hc->HFC_inb = HFC_inb_pcimem;
4405 hc->HFC_inw = HFC_inw_pcimem;
4406 hc->HFC_wait = HFC_wait_pcimem;
4407 hc->read_fifo = read_fifo_pcimem;
4408 hc->write_fifo = write_fifo_pcimem;
4409 hc->plx_origmembase = hc->pci_dev->resource[0].start;
4410
4411
4412 if (!hc->plx_origmembase) {
4413 printk(KERN_WARNING
4414 "HFC-multi: No IO-Memory for PCI PLX bridge found\n");
4415 pci_disable_device(hc->pci_dev);
4416 return -EIO;
4417 }
4418
4419 hc->plx_membase = ioremap(hc->plx_origmembase, 0x80);
4420 if (!hc->plx_membase) {
4421 printk(KERN_WARNING
4422 "HFC-multi: failed to remap plx address space. "
4423 "(internal error)\n");
4424 pci_disable_device(hc->pci_dev);
4425 return -EIO;
4426 }
4427 printk(KERN_INFO
4428 "HFC-multi: plx_membase:%#lx plx_origmembase:%#lx\n",
4429 (u_long)hc->plx_membase, hc->plx_origmembase);
4430
4431 hc->pci_origmembase = hc->pci_dev->resource[2].start;
4432
4433 if (!hc->pci_origmembase) {
4434 printk(KERN_WARNING
4435 "HFC-multi: No IO-Memory for PCI card found\n");
4436 pci_disable_device(hc->pci_dev);
4437 return -EIO;
4438 }
4439
4440 hc->pci_membase = ioremap(hc->pci_origmembase, 0x400);
4441 if (!hc->pci_membase) {
4442 printk(KERN_WARNING "HFC-multi: failed to remap io "
4443 "address space. (internal error)\n");
4444 pci_disable_device(hc->pci_dev);
4445 return -EIO;
4446 }
4447
4448 printk(KERN_INFO
4449 "card %d: defined at MEMBASE %#lx (%#lx) IRQ %d HZ %d "
4450 "leds-type %d\n",
4451 hc->id, (u_long)hc->pci_membase, hc->pci_origmembase,
4452 hc->pci_dev->irq, HZ, hc->leds);
4453 pci_write_config_word(hc->pci_dev, PCI_COMMAND, PCI_ENA_MEMIO);
4454 break;
4455 case HFC_IO_MODE_PCIMEM:
4456 hc->HFC_outb = HFC_outb_pcimem;
4457 hc->HFC_inb = HFC_inb_pcimem;
4458 hc->HFC_inw = HFC_inw_pcimem;
4459 hc->HFC_wait = HFC_wait_pcimem;
4460 hc->read_fifo = read_fifo_pcimem;
4461 hc->write_fifo = write_fifo_pcimem;
4462 hc->pci_origmembase = hc->pci_dev->resource[1].start;
4463 if (!hc->pci_origmembase) {
4464 printk(KERN_WARNING
4465 "HFC-multi: No IO-Memory for PCI card found\n");
4466 pci_disable_device(hc->pci_dev);
4467 return -EIO;
4468 }
4469
4470 hc->pci_membase = ioremap(hc->pci_origmembase, 256);
4471 if (!hc->pci_membase) {
4472 printk(KERN_WARNING
4473 "HFC-multi: failed to remap io address space. "
4474 "(internal error)\n");
4475 pci_disable_device(hc->pci_dev);
4476 return -EIO;
4477 }
4478 printk(KERN_INFO "card %d: defined at MEMBASE %#lx (%#lx) IRQ "
4479 "%d HZ %d leds-type %d\n", hc->id, (u_long)hc->pci_membase,
4480 hc->pci_origmembase, hc->pci_dev->irq, HZ, hc->leds);
4481 pci_write_config_word(hc->pci_dev, PCI_COMMAND, PCI_ENA_MEMIO);
4482 break;
4483 case HFC_IO_MODE_REGIO:
4484 hc->HFC_outb = HFC_outb_regio;
4485 hc->HFC_inb = HFC_inb_regio;
4486 hc->HFC_inw = HFC_inw_regio;
4487 hc->HFC_wait = HFC_wait_regio;
4488 hc->read_fifo = read_fifo_regio;
4489 hc->write_fifo = write_fifo_regio;
4490 hc->pci_iobase = (u_int) hc->pci_dev->resource[0].start;
4491 if (!hc->pci_iobase) {
4492 printk(KERN_WARNING
4493 "HFC-multi: No IO for PCI card found\n");
4494 pci_disable_device(hc->pci_dev);
4495 return -EIO;
4496 }
4497
4498 if (!request_region(hc->pci_iobase, 8, "hfcmulti")) {
4499 printk(KERN_WARNING "HFC-multi: failed to request "
4500 "address space at 0x%08lx (internal error)\n",
4501 hc->pci_iobase);
4502 pci_disable_device(hc->pci_dev);
4503 return -EIO;
4504 }
4505
4506 printk(KERN_INFO
4507 "%s %s: defined at IOBASE %#x IRQ %d HZ %d leds-type %d\n",
4508 m->vendor_name, m->card_name, (u_int) hc->pci_iobase,
4509 hc->pci_dev->irq, HZ, hc->leds);
4510 pci_write_config_word(hc->pci_dev, PCI_COMMAND, PCI_ENA_REGIO);
4511 break;
4512 default:
4513 printk(KERN_WARNING "HFC-multi: Invalid IO mode.\n");
4514 pci_disable_device(hc->pci_dev);
4515 return -EIO;
4516 }
4517
4518 pci_set_drvdata(hc->pci_dev, hc);
4519
4520
4521
4522 return 0;
4523}
4524
4525
4526
4527
4528
4529
4530static void
4531release_port(struct hfc_multi *hc, struct dchannel *dch)
4532{
4533 int pt, ci, i = 0;
4534 u_long flags;
4535 struct bchannel *pb;
4536
4537 ci = dch->slot;
4538 pt = hc->chan[ci].port;
4539
4540 if (debug & DEBUG_HFCMULTI_INIT)
4541 printk(KERN_DEBUG "%s: entered for port %d\n",
4542 __func__, pt + 1);
4543
4544 if (pt >= hc->ports) {
4545 printk(KERN_WARNING "%s: ERROR port out of range (%d).\n",
4546 __func__, pt + 1);
4547 return;
4548 }
4549
4550 if (debug & DEBUG_HFCMULTI_INIT)
4551 printk(KERN_DEBUG "%s: releasing port=%d\n",
4552 __func__, pt + 1);
4553
4554 if (dch->dev.D.protocol == ISDN_P_TE_S0)
4555 l1_event(dch->l1, CLOSE_CHANNEL);
4556
4557 hc->chan[ci].dch = NULL;
4558
4559 if (hc->created[pt]) {
4560 hc->created[pt] = 0;
4561 mISDN_unregister_device(&dch->dev);
4562 }
4563
4564 spin_lock_irqsave(&hc->lock, flags);
4565
4566 if (dch->timer.function) {
4567 del_timer(&dch->timer);
4568 dch->timer.function = NULL;
4569 }
4570
4571 if (hc->ctype == HFC_TYPE_E1) {
4572
4573 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4574 hc->syncronized = 0;
4575 plxsd_checksync(hc, 1);
4576 }
4577
4578 for (i = 0; i <= 31; i++) {
4579 if (!((1 << i) & hc->bmask[pt]))
4580 continue;
4581 if (hc->chan[i].bch) {
4582 if (debug & DEBUG_HFCMULTI_INIT)
4583 printk(KERN_DEBUG
4584 "%s: free port %d channel %d\n",
4585 __func__, hc->chan[i].port + 1, i);
4586 pb = hc->chan[i].bch;
4587 hc->chan[i].bch = NULL;
4588 spin_unlock_irqrestore(&hc->lock, flags);
4589 mISDN_freebchannel(pb);
4590 kfree(pb);
4591 kfree(hc->chan[i].coeff);
4592 spin_lock_irqsave(&hc->lock, flags);
4593 }
4594 }
4595 } else {
4596
4597 if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
4598 hc->syncronized &=
4599 ~(1 << hc->chan[ci].port);
4600 plxsd_checksync(hc, 1);
4601 }
4602
4603 if (hc->chan[ci - 2].bch) {
4604 if (debug & DEBUG_HFCMULTI_INIT)
4605 printk(KERN_DEBUG
4606 "%s: free port %d channel %d\n",
4607 __func__, hc->chan[ci - 2].port + 1,
4608 ci - 2);
4609 pb = hc->chan[ci - 2].bch;
4610 hc->chan[ci - 2].bch = NULL;
4611 spin_unlock_irqrestore(&hc->lock, flags);
4612 mISDN_freebchannel(pb);
4613 kfree(pb);
4614 kfree(hc->chan[ci - 2].coeff);
4615 spin_lock_irqsave(&hc->lock, flags);
4616 }
4617 if (hc->chan[ci - 1].bch) {
4618 if (debug & DEBUG_HFCMULTI_INIT)
4619 printk(KERN_DEBUG
4620 "%s: free port %d channel %d\n",
4621 __func__, hc->chan[ci - 1].port + 1,
4622 ci - 1);
4623 pb = hc->chan[ci - 1].bch;
4624 hc->chan[ci - 1].bch = NULL;
4625 spin_unlock_irqrestore(&hc->lock, flags);
4626 mISDN_freebchannel(pb);
4627 kfree(pb);
4628 kfree(hc->chan[ci - 1].coeff);
4629 spin_lock_irqsave(&hc->lock, flags);
4630 }
4631 }
4632
4633 spin_unlock_irqrestore(&hc->lock, flags);
4634
4635 if (debug & DEBUG_HFCMULTI_INIT)
4636 printk(KERN_DEBUG "%s: free port %d channel D(%d)\n", __func__,
4637 pt+1, ci);
4638 mISDN_freedchannel(dch);
4639 kfree(dch);
4640
4641 if (debug & DEBUG_HFCMULTI_INIT)
4642 printk(KERN_DEBUG "%s: done!\n", __func__);
4643}
4644
4645static void
4646release_card(struct hfc_multi *hc)
4647{
4648 u_long flags;
4649 int ch;
4650
4651 if (debug & DEBUG_HFCMULTI_INIT)
4652 printk(KERN_DEBUG "%s: release card (%d) entered\n",
4653 __func__, hc->id);
4654
4655
4656 if (hc->iclock)
4657 mISDN_unregister_clock(hc->iclock);
4658
4659
4660 spin_lock_irqsave(&hc->lock, flags);
4661 disable_hwirq(hc);
4662 spin_unlock_irqrestore(&hc->lock, flags);
4663 udelay(1000);
4664 if (hc->irq) {
4665 if (debug & DEBUG_HFCMULTI_INIT)
4666 printk(KERN_DEBUG "%s: free irq %d (hc=%p)\n",
4667 __func__, hc->irq, hc);
4668 free_irq(hc->irq, hc);
4669 hc->irq = 0;
4670
4671 }
4672
4673
4674 if (debug & DEBUG_HFCMULTI_INIT)
4675 printk(KERN_DEBUG "%s: disable all channels (d and b)\n",
4676 __func__);
4677 for (ch = 0; ch <= 31; ch++) {
4678 if (hc->chan[ch].dch)
4679 release_port(hc, hc->chan[ch].dch);
4680 }
4681
4682
4683 if (hc->leds)
4684 hfcmulti_leds(hc);
4685
4686
4687 release_io_hfcmulti(hc);
4688
4689 if (debug & DEBUG_HFCMULTI_INIT)
4690 printk(KERN_DEBUG "%s: remove instance from list\n",
4691 __func__);
4692 list_del(&hc->list);
4693
4694 if (debug & DEBUG_HFCMULTI_INIT)
4695 printk(KERN_DEBUG "%s: delete instance\n", __func__);
4696 if (hc == syncmaster)
4697 syncmaster = NULL;
4698 kfree(hc);
4699 if (debug & DEBUG_HFCMULTI_INIT)
4700 printk(KERN_DEBUG "%s: card successfully removed\n",
4701 __func__);
4702}
4703
4704static void
4705init_e1_port_hw(struct hfc_multi *hc, struct hm_map *m)
4706{
4707
4708 if (port[Port_cnt] & 0x001) {
4709 if (!m->opticalsupport) {
4710 printk(KERN_INFO
4711 "This board has no optical "
4712 "support\n");
4713 } else {
4714 if (debug & DEBUG_HFCMULTI_INIT)
4715 printk(KERN_DEBUG
4716 "%s: PORT set optical "
4717 "interfacs: card(%d) "
4718 "port(%d)\n",
4719 __func__,
4720 HFC_cnt + 1, 1);
4721 test_and_set_bit(HFC_CFG_OPTICAL,
4722 &hc->chan[hc->dnum[0]].cfg);
4723 }
4724 }
4725
4726 if (port[Port_cnt] & 0x004) {
4727 if (debug & DEBUG_HFCMULTI_INIT)
4728 printk(KERN_DEBUG "%s: PORT set "
4729 "LOS report: card(%d) port(%d)\n",
4730 __func__, HFC_cnt + 1, 1);
4731 test_and_set_bit(HFC_CFG_REPORT_LOS,
4732 &hc->chan[hc->dnum[0]].cfg);
4733 }
4734
4735 if (port[Port_cnt] & 0x008) {
4736 if (debug & DEBUG_HFCMULTI_INIT)
4737 printk(KERN_DEBUG "%s: PORT set "
4738 "AIS report: card(%d) port(%d)\n",
4739 __func__, HFC_cnt + 1, 1);
4740 test_and_set_bit(HFC_CFG_REPORT_AIS,
4741 &hc->chan[hc->dnum[0]].cfg);
4742 }
4743
4744 if (port[Port_cnt] & 0x010) {
4745 if (debug & DEBUG_HFCMULTI_INIT)
4746 printk(KERN_DEBUG
4747 "%s: PORT set SLIP report: "
4748 "card(%d) port(%d)\n",
4749 __func__, HFC_cnt + 1, 1);
4750 test_and_set_bit(HFC_CFG_REPORT_SLIP,
4751 &hc->chan[hc->dnum[0]].cfg);
4752 }
4753
4754 if (port[Port_cnt] & 0x020) {
4755 if (debug & DEBUG_HFCMULTI_INIT)
4756 printk(KERN_DEBUG
4757 "%s: PORT set RDI report: "
4758 "card(%d) port(%d)\n",
4759 __func__, HFC_cnt + 1, 1);
4760 test_and_set_bit(HFC_CFG_REPORT_RDI,
4761 &hc->chan[hc->dnum[0]].cfg);
4762 }
4763
4764 if (!(port[Port_cnt] & 0x100)) {
4765 if (debug & DEBUG_HFCMULTI_INIT)
4766 printk(KERN_DEBUG "%s: PORT turn on CRC4 report:"
4767 " card(%d) port(%d)\n",
4768 __func__, HFC_cnt + 1, 1);
4769 test_and_set_bit(HFC_CFG_CRC4,
4770 &hc->chan[hc->dnum[0]].cfg);
4771 } else {
4772 if (debug & DEBUG_HFCMULTI_INIT)
4773 printk(KERN_DEBUG "%s: PORT turn off CRC4"
4774 " report: card(%d) port(%d)\n",
4775 __func__, HFC_cnt + 1, 1);
4776 }
4777
4778 if (port[Port_cnt] & 0x0200) {
4779 if (debug & DEBUG_HFCMULTI_INIT)
4780 printk(KERN_DEBUG "%s: PORT force getting clock from "
4781 "E1: card(%d) port(%d)\n",
4782 __func__, HFC_cnt + 1, 1);
4783 test_and_set_bit(HFC_CHIP_E1CLOCK_GET, &hc->chip);
4784 } else
4785 if (port[Port_cnt] & 0x0400) {
4786 if (debug & DEBUG_HFCMULTI_INIT)
4787 printk(KERN_DEBUG "%s: PORT force putting clock to "
4788 "E1: card(%d) port(%d)\n",
4789 __func__, HFC_cnt + 1, 1);
4790 test_and_set_bit(HFC_CHIP_E1CLOCK_PUT, &hc->chip);
4791 }
4792
4793 if (port[Port_cnt] & 0x0800) {
4794 if (debug & DEBUG_HFCMULTI_INIT)
4795 printk(KERN_DEBUG "%s: PORT disable JATT PLL on "
4796 "E1: card(%d) port(%d)\n",
4797 __func__, HFC_cnt + 1, 1);
4798 test_and_set_bit(HFC_CHIP_RX_SYNC, &hc->chip);
4799 }
4800
4801 if (port[Port_cnt] & 0x3000) {
4802 hc->chan[hc->dnum[0]].jitter = (port[Port_cnt]>>12) & 0x3;
4803 if (debug & DEBUG_HFCMULTI_INIT)
4804 printk(KERN_DEBUG
4805 "%s: PORT set elastic "
4806 "buffer to %d: card(%d) port(%d)\n",
4807 __func__, hc->chan[hc->dnum[0]].jitter,
4808 HFC_cnt + 1, 1);
4809 } else
4810 hc->chan[hc->dnum[0]].jitter = 2;
4811}
4812
4813static int
4814init_e1_port(struct hfc_multi *hc, struct hm_map *m, int pt)
4815{
4816 struct dchannel *dch;
4817 struct bchannel *bch;
4818 int ch, ret = 0;
4819 char name[MISDN_MAX_IDLEN];
4820 int bcount = 0;
4821
4822 dch = kzalloc(sizeof(struct dchannel), GFP_KERNEL);
4823 if (!dch)
4824 return -ENOMEM;
4825 dch->debug = debug;
4826 mISDN_initdchannel(dch, MAX_DFRAME_LEN_L1, ph_state_change);
4827 dch->hw = hc;
4828 dch->dev.Dprotocols = (1 << ISDN_P_TE_E1) | (1 << ISDN_P_NT_E1);
4829 dch->dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
4830 (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
4831 dch->dev.D.send = handle_dmsg;
4832 dch->dev.D.ctrl = hfcm_dctrl;
4833 dch->slot = hc->dnum[pt];
4834 hc->chan[hc->dnum[pt]].dch = dch;
4835 hc->chan[hc->dnum[pt]].port = pt;
4836 hc->chan[hc->dnum[pt]].nt_timer = -1;
4837 for (ch = 1; ch <= 31; ch++) {
4838 if (!((1 << ch) & hc->bmask[pt]))
4839 continue;
4840 bch = kzalloc(sizeof(struct bchannel), GFP_KERNEL);
4841 if (!bch) {
4842 printk(KERN_ERR "%s: no memory for bchannel\n",
4843 __func__);
4844 ret = -ENOMEM;
4845 goto free_chan;
4846 }
4847 hc->chan[ch].coeff = kzalloc(512, GFP_KERNEL);
4848 if (!hc->chan[ch].coeff) {
4849 printk(KERN_ERR "%s: no memory for coeffs\n",
4850 __func__);
4851 ret = -ENOMEM;
4852 kfree(bch);
4853 goto free_chan;
4854 }
4855 bch->nr = ch;
4856 bch->slot = ch;
4857 bch->debug = debug;
4858 mISDN_initbchannel(bch, MAX_DATA_MEM, poll >> 1);
4859 bch->hw = hc;
4860 bch->ch.send = handle_bmsg;
4861 bch->ch.ctrl = hfcm_bctrl;
4862 bch->ch.nr = ch;
4863 list_add(&bch->ch.list, &dch->dev.bchannels);
4864 hc->chan[ch].bch = bch;
4865 hc->chan[ch].port = pt;
4866 set_channelmap(bch->nr, dch->dev.channelmap);
4867 bcount++;
4868 }
4869 dch->dev.nrbchan = bcount;
4870 if (pt == 0)
4871 init_e1_port_hw(hc, m);
4872 if (hc->ports > 1)
4873 snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d-%d",
4874 HFC_cnt + 1, pt+1);
4875 else
4876 snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d", HFC_cnt + 1);
4877 ret = mISDN_register_device(&dch->dev, &hc->pci_dev->dev, name);
4878 if (ret)
4879 goto free_chan;
4880 hc->created[pt] = 1;
4881 return ret;
4882free_chan:
4883 release_port(hc, dch);
4884 return ret;
4885}
4886
4887static int
4888init_multi_port(struct hfc_multi *hc, int pt)
4889{
4890 struct dchannel *dch;
4891 struct bchannel *bch;
4892 int ch, i, ret = 0;
4893 char name[MISDN_MAX_IDLEN];
4894
4895 dch = kzalloc(sizeof(struct dchannel), GFP_KERNEL);
4896 if (!dch)
4897 return -ENOMEM;
4898 dch->debug = debug;
4899 mISDN_initdchannel(dch, MAX_DFRAME_LEN_L1, ph_state_change);
4900 dch->hw = hc;
4901 dch->dev.Dprotocols = (1 << ISDN_P_TE_S0) | (1 << ISDN_P_NT_S0);
4902 dch->dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
4903 (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
4904 dch->dev.D.send = handle_dmsg;
4905 dch->dev.D.ctrl = hfcm_dctrl;
4906 dch->dev.nrbchan = 2;
4907 i = pt << 2;
4908 dch->slot = i + 2;
4909 hc->chan[i + 2].dch = dch;
4910 hc->chan[i + 2].port = pt;
4911 hc->chan[i + 2].nt_timer = -1;
4912 for (ch = 0; ch < dch->dev.nrbchan; ch++) {
4913 bch = kzalloc(sizeof(struct bchannel), GFP_KERNEL);
4914 if (!bch) {
4915 printk(KERN_ERR "%s: no memory for bchannel\n",
4916 __func__);
4917 ret = -ENOMEM;
4918 goto free_chan;
4919 }
4920 hc->chan[i + ch].coeff = kzalloc(512, GFP_KERNEL);
4921 if (!hc->chan[i + ch].coeff) {
4922 printk(KERN_ERR "%s: no memory for coeffs\n",
4923 __func__);
4924 ret = -ENOMEM;
4925 kfree(bch);
4926 goto free_chan;
4927 }
4928 bch->nr = ch + 1;
4929 bch->slot = i + ch;
4930 bch->debug = debug;
4931 mISDN_initbchannel(bch, MAX_DATA_MEM, poll >> 1);
4932 bch->hw = hc;
4933 bch->ch.send = handle_bmsg;
4934 bch->ch.ctrl = hfcm_bctrl;
4935 bch->ch.nr = ch + 1;
4936 list_add(&bch->ch.list, &dch->dev.bchannels);
4937 hc->chan[i + ch].bch = bch;
4938 hc->chan[i + ch].port = pt;
4939 set_channelmap(bch->nr, dch->dev.channelmap);
4940 }
4941
4942 if (port[Port_cnt] & 0x001) {
4943 if (debug & DEBUG_HFCMULTI_INIT)
4944 printk(KERN_DEBUG
4945 "%s: PROTOCOL set master clock: "
4946 "card(%d) port(%d)\n",
4947 __func__, HFC_cnt + 1, pt + 1);
4948 if (dch->dev.D.protocol != ISDN_P_TE_S0) {
4949 printk(KERN_ERR "Error: Master clock "
4950 "for port(%d) of card(%d) is only"
4951 " possible with TE-mode\n",
4952 pt + 1, HFC_cnt + 1);
4953 ret = -EINVAL;
4954 goto free_chan;
4955 }
4956 if (hc->masterclk >= 0) {
4957 printk(KERN_ERR "Error: Master clock "
4958 "for port(%d) of card(%d) already "
4959 "defined for port(%d)\n",
4960 pt + 1, HFC_cnt + 1, hc->masterclk + 1);
4961 ret = -EINVAL;
4962 goto free_chan;
4963 }
4964 hc->masterclk = pt;
4965 }
4966
4967 if (port[Port_cnt] & 0x002) {
4968 if (debug & DEBUG_HFCMULTI_INIT)
4969 printk(KERN_DEBUG
4970 "%s: PROTOCOL set non capacitive "
4971 "transmitter: card(%d) port(%d)\n",
4972 __func__, HFC_cnt + 1, pt + 1);
4973 test_and_set_bit(HFC_CFG_NONCAP_TX,
4974 &hc->chan[i + 2].cfg);
4975 }
4976
4977 if (port[Port_cnt] & 0x004) {
4978 if (debug & DEBUG_HFCMULTI_INIT)
4979 printk(KERN_DEBUG
4980 "%s: PROTOCOL disable E-channel: "
4981 "card(%d) port(%d)\n",
4982 __func__, HFC_cnt + 1, pt + 1);
4983 test_and_set_bit(HFC_CFG_DIS_ECHANNEL,
4984 &hc->chan[i + 2].cfg);
4985 }
4986 if (hc->ctype == HFC_TYPE_XHFC) {
4987 snprintf(name, MISDN_MAX_IDLEN - 1, "xhfc.%d-%d",
4988 HFC_cnt + 1, pt + 1);
4989 ret = mISDN_register_device(&dch->dev, NULL, name);
4990 } else {
4991 snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-%ds.%d-%d",
4992 hc->ctype, HFC_cnt + 1, pt + 1);
4993 ret = mISDN_register_device(&dch->dev, &hc->pci_dev->dev, name);
4994 }
4995 if (ret)
4996 goto free_chan;
4997 hc->created[pt] = 1;
4998 return ret;
4999free_chan:
5000 release_port(hc, dch);
5001 return ret;
5002}
5003
5004static int
5005hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
5006 const struct pci_device_id *ent)
5007{
5008 int ret_err = 0;
5009 int pt;
5010 struct hfc_multi *hc;
5011 u_long flags;
5012 u_char dips = 0, pmj = 0;
5013 int i, ch;
5014 u_int maskcheck;
5015
5016 if (HFC_cnt >= MAX_CARDS) {
5017 printk(KERN_ERR "too many cards (max=%d).\n",
5018 MAX_CARDS);
5019 return -EINVAL;
5020 }
5021 if ((type[HFC_cnt] & 0xff) && (type[HFC_cnt] & 0xff) != m->type) {
5022 printk(KERN_WARNING "HFC-MULTI: Card '%s:%s' type %d found but "
5023 "type[%d] %d was supplied as module parameter\n",
5024 m->vendor_name, m->card_name, m->type, HFC_cnt,
5025 type[HFC_cnt] & 0xff);
5026 printk(KERN_WARNING "HFC-MULTI: Load module without parameters "
5027 "first, to see cards and their types.");
5028 return -EINVAL;
5029 }
5030 if (debug & DEBUG_HFCMULTI_INIT)
5031 printk(KERN_DEBUG "%s: Registering %s:%s chip type %d (0x%x)\n",
5032 __func__, m->vendor_name, m->card_name, m->type,
5033 type[HFC_cnt]);
5034
5035
5036 hc = kzalloc(sizeof(struct hfc_multi), GFP_KERNEL);
5037 if (!hc) {
5038 printk(KERN_ERR "No kmem for HFC-Multi card\n");
5039 return -ENOMEM;
5040 }
5041 spin_lock_init(&hc->lock);
5042 hc->mtyp = m;
5043 hc->ctype = m->type;
5044 hc->ports = m->ports;
5045 hc->id = HFC_cnt;
5046 hc->pcm = pcm[HFC_cnt];
5047 hc->io_mode = iomode[HFC_cnt];
5048 if (hc->ctype == HFC_TYPE_E1 && dmask[E1_cnt]) {
5049
5050 pt = 0;
5051 maskcheck = 0;
5052 for (ch = 0; ch <= 31; ch++) {
5053 if (!((1 << ch) & dmask[E1_cnt]))
5054 continue;
5055 hc->dnum[pt] = ch;
5056 hc->bmask[pt] = bmask[bmask_cnt++];
5057 if ((maskcheck & hc->bmask[pt])
5058 || (dmask[E1_cnt] & hc->bmask[pt])) {
5059 printk(KERN_INFO
5060 "HFC-E1 #%d has overlapping B-channels on fragment #%d\n",
5061 E1_cnt + 1, pt);
5062 kfree(hc);
5063 return -EINVAL;
5064 }
5065 maskcheck |= hc->bmask[pt];
5066 printk(KERN_INFO
5067 "HFC-E1 #%d uses D-channel on slot %d and a B-channel map of 0x%08x\n",
5068 E1_cnt + 1, ch, hc->bmask[pt]);
5069 pt++;
5070 }
5071 hc->ports = pt;
5072 }
5073 if (hc->ctype == HFC_TYPE_E1 && !dmask[E1_cnt]) {
5074
5075 hc->dnum[0] = 16;
5076 hc->bmask[0] = 0xfffefffe;
5077 hc->ports = 1;
5078 }
5079
5080
5081 hc->masterclk = -1;
5082 if (type[HFC_cnt] & 0x100) {
5083 test_and_set_bit(HFC_CHIP_ULAW, &hc->chip);
5084 hc->silence = 0xff;
5085 } else
5086 hc->silence = 0x2a;
5087 if ((poll >> 1) > sizeof(hc->silence_data)) {
5088 printk(KERN_ERR "HFCMULTI error: silence_data too small, "
5089 "please fix\n");
5090 kfree(hc);
5091 return -EINVAL;
5092 }
5093 for (i = 0; i < (poll >> 1); i++)
5094 hc->silence_data[i] = hc->silence;
5095
5096 if (hc->ctype != HFC_TYPE_XHFC) {
5097 if (!(type[HFC_cnt] & 0x200))
5098 test_and_set_bit(HFC_CHIP_DTMF, &hc->chip);
5099 test_and_set_bit(HFC_CHIP_CONF, &hc->chip);
5100 }
5101
5102 if (type[HFC_cnt] & 0x800)
5103 test_and_set_bit(HFC_CHIP_PCM_SLAVE, &hc->chip);
5104 if (type[HFC_cnt] & 0x1000) {
5105 test_and_set_bit(HFC_CHIP_PCM_MASTER, &hc->chip);
5106 test_and_clear_bit(HFC_CHIP_PCM_SLAVE, &hc->chip);
5107 }
5108 if (type[HFC_cnt] & 0x4000)
5109 test_and_set_bit(HFC_CHIP_EXRAM_128, &hc->chip);
5110 if (type[HFC_cnt] & 0x8000)
5111 test_and_set_bit(HFC_CHIP_EXRAM_512, &hc->chip);
5112 hc->slots = 32;
5113 if (type[HFC_cnt] & 0x10000)
5114 hc->slots = 64;
5115 if (type[HFC_cnt] & 0x20000)
5116 hc->slots = 128;
5117 if (type[HFC_cnt] & 0x80000) {
5118 test_and_set_bit(HFC_CHIP_WATCHDOG, &hc->chip);
5119 hc->wdcount = 0;
5120 hc->wdbyte = V_GPIO_OUT2;
5121 printk(KERN_NOTICE "Watchdog enabled\n");
5122 }
5123
5124 if (pdev && ent)
5125
5126 ret_err = setup_pci(hc, pdev, ent);
5127 else
5128#ifdef CONFIG_MISDN_HFCMULTI_8xx
5129 ret_err = setup_embedded(hc, m);
5130#else
5131 {
5132 printk(KERN_WARNING "Embedded IO Mode not selected\n");
5133 ret_err = -EIO;
5134 }
5135#endif
5136 if (ret_err) {
5137 if (hc == syncmaster)
5138 syncmaster = NULL;
5139 kfree(hc);
5140 return ret_err;
5141 }
5142
5143 hc->HFC_outb_nodebug = hc->HFC_outb;
5144 hc->HFC_inb_nodebug = hc->HFC_inb;
5145 hc->HFC_inw_nodebug = hc->HFC_inw;
5146 hc->HFC_wait_nodebug = hc->HFC_wait;
5147#ifdef HFC_REGISTER_DEBUG
5148 hc->HFC_outb = HFC_outb_debug;
5149 hc->HFC_inb = HFC_inb_debug;
5150 hc->HFC_inw = HFC_inw_debug;
5151 hc->HFC_wait = HFC_wait_debug;
5152#endif
5153
5154 for (pt = 0; pt < hc->ports; pt++) {
5155 if (Port_cnt >= MAX_PORTS) {
5156 printk(KERN_ERR "too many ports (max=%d).\n",
5157 MAX_PORTS);
5158 ret_err = -EINVAL;
5159 goto free_card;
5160 }
5161 if (hc->ctype == HFC_TYPE_E1)
5162 ret_err = init_e1_port(hc, m, pt);
5163 else
5164 ret_err = init_multi_port(hc, pt);
5165 if (debug & DEBUG_HFCMULTI_INIT)
5166 printk(KERN_DEBUG
5167 "%s: Registering D-channel, card(%d) port(%d) "
5168 "result %d\n",
5169 __func__, HFC_cnt + 1, pt + 1, ret_err);
5170
5171 if (ret_err) {
5172 while (pt) {
5173 pt--;
5174 if (hc->ctype == HFC_TYPE_E1)
5175 release_port(hc,
5176 hc->chan[hc->dnum[pt]].dch);
5177 else
5178 release_port(hc,
5179 hc->chan[(pt << 2) + 2].dch);
5180 }
5181 goto free_card;
5182 }
5183 if (hc->ctype != HFC_TYPE_E1)
5184 Port_cnt++;
5185 }
5186 if (hc->ctype == HFC_TYPE_E1) {
5187 Port_cnt++;
5188 E1_cnt++;
5189 }
5190
5191
5192 switch (m->dip_type) {
5193 case DIP_4S:
5194
5195
5196
5197
5198
5199 dips = ((~HFC_inb(hc, R_GPIO_IN1) & 0xE0) >> 5) |
5200 ((~HFC_inb(hc, R_GPI_IN2) & 0x80) >> 3) |
5201 (~HFC_inb(hc, R_GPI_IN2) & 0x08);
5202
5203
5204 pmj = ((HFC_inb(hc, R_GPI_IN3) >> 4) & 0xf);
5205
5206 if (test_bit(HFC_CHIP_B410P, &hc->chip))
5207 pmj = ~pmj & 0xf;
5208
5209 printk(KERN_INFO "%s: %s DIPs(0x%x) jumpers(0x%x)\n",
5210 m->vendor_name, m->card_name, dips, pmj);
5211 break;
5212 case DIP_8S:
5213
5214
5215
5216
5217 HFC_outb(hc, R_BRG_PCM_CFG, 1 | V_PCM_CLK);
5218
5219 outw(0x4000, hc->pci_iobase + 4);
5220
5221
5222
5223
5224 dips = inb(hc->pci_iobase);
5225 dips = inb(hc->pci_iobase);
5226 dips = inb(hc->pci_iobase);
5227 dips = ~inb(hc->pci_iobase) & 0x3F;
5228 outw(0x0, hc->pci_iobase + 4);
5229
5230 HFC_outb(hc, R_BRG_PCM_CFG, V_PCM_CLK);
5231 printk(KERN_INFO "%s: %s DIPs(0x%x)\n",
5232 m->vendor_name, m->card_name, dips);
5233 break;
5234 case DIP_E1:
5235
5236
5237
5238
5239 dips = (~HFC_inb(hc, R_GPI_IN0) & 0xF0) >> 4;
5240 printk(KERN_INFO "%s: %s DIPs(0x%x)\n",
5241 m->vendor_name, m->card_name, dips);
5242 break;
5243 }
5244
5245
5246 spin_lock_irqsave(&HFClock, flags);
5247 list_add_tail(&hc->list, &HFClist);
5248 spin_unlock_irqrestore(&HFClock, flags);
5249
5250
5251 if (clock == HFC_cnt + 1)
5252 hc->iclock = mISDN_register_clock("HFCMulti", 0, clockctl, hc);
5253
5254
5255 hc->irq = (m->irq) ? : hc->pci_dev->irq;
5256 ret_err = init_card(hc);
5257 if (ret_err) {
5258 printk(KERN_ERR "init card returns %d\n", ret_err);
5259 release_card(hc);
5260 return ret_err;
5261 }
5262
5263
5264 spin_lock_irqsave(&hc->lock, flags);
5265 enable_hwirq(hc);
5266 spin_unlock_irqrestore(&hc->lock, flags);
5267 return 0;
5268
5269free_card:
5270 release_io_hfcmulti(hc);
5271 if (hc == syncmaster)
5272 syncmaster = NULL;
5273 kfree(hc);
5274 return ret_err;
5275}
5276
5277static void hfc_remove_pci(struct pci_dev *pdev)
5278{
5279 struct hfc_multi *card = pci_get_drvdata(pdev);
5280 u_long flags;
5281
5282 if (debug)
5283 printk(KERN_INFO "removing hfc_multi card vendor:%x "
5284 "device:%x subvendor:%x subdevice:%x\n",
5285 pdev->vendor, pdev->device,
5286 pdev->subsystem_vendor, pdev->subsystem_device);
5287
5288 if (card) {
5289 spin_lock_irqsave(&HFClock, flags);
5290 release_card(card);
5291 spin_unlock_irqrestore(&HFClock, flags);
5292 } else {
5293 if (debug)
5294 printk(KERN_DEBUG "%s: drvdata already removed\n",
5295 __func__);
5296 }
5297}
5298
5299#define VENDOR_CCD "Cologne Chip AG"
5300#define VENDOR_BN "beroNet GmbH"
5301#define VENDOR_DIG "Digium Inc."
5302#define VENDOR_JH "Junghanns.NET GmbH"
5303#define VENDOR_PRIM "PrimuX"
5304
5305static const struct hm_map hfcm_map[] = {
5306 {VENDOR_BN, "HFC-1S Card (mini PCI)", 4, 1, 1, 3, 0, DIP_4S, 0, 0},
5307 {VENDOR_BN, "HFC-2S Card", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
5308 {VENDOR_BN, "HFC-2S Card (mini PCI)", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
5309 {VENDOR_BN, "HFC-4S Card", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
5310 {VENDOR_BN, "HFC-4S Card (mini PCI)", 4, 4, 1, 2, 0, 0, 0, 0},
5311 {VENDOR_CCD, "HFC-4S Eval (old)", 4, 4, 0, 0, 0, 0, 0, 0},
5312 {VENDOR_CCD, "HFC-4S IOB4ST", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
5313 {VENDOR_CCD, "HFC-4S", 4, 4, 1, 2, 0, 0, 0, 0},
5314 {VENDOR_DIG, "HFC-4S Card", 4, 4, 0, 2, 0, 0, HFC_IO_MODE_REGIO, 0},
5315 {VENDOR_CCD, "HFC-4S Swyx 4xS0 SX2 QuadBri", 4, 4, 1, 2, 0, 0, 0, 0},
5316 {VENDOR_JH, "HFC-4S (junghanns 2.0)", 4, 4, 1, 2, 0, 0, 0, 0},
5317 {VENDOR_PRIM, "HFC-2S Primux Card", 4, 2, 0, 0, 0, 0, 0, 0},
5318
5319 {VENDOR_BN, "HFC-8S Card", 8, 8, 1, 0, 0, 0, 0, 0},
5320 {VENDOR_BN, "HFC-8S Card (+)", 8, 8, 1, 8, 0, DIP_8S,
5321 HFC_IO_MODE_REGIO, 0},
5322 {VENDOR_CCD, "HFC-8S Eval (old)", 8, 8, 0, 0, 0, 0, 0, 0},
5323 {VENDOR_CCD, "HFC-8S IOB4ST Recording", 8, 8, 1, 0, 0, 0, 0, 0},
5324
5325 {VENDOR_CCD, "HFC-8S IOB8ST", 8, 8, 1, 0, 0, 0, 0, 0},
5326 {VENDOR_CCD, "HFC-8S", 8, 8, 1, 0, 0, 0, 0, 0},
5327 {VENDOR_CCD, "HFC-8S", 8, 8, 1, 0, 0, 0, 0, 0},
5328
5329 {VENDOR_BN, "HFC-E1 Card", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
5330 {VENDOR_BN, "HFC-E1 Card (mini PCI)", 1, 1, 0, 1, 0, 0, 0, 0},
5331 {VENDOR_BN, "HFC-E1+ Card (Dual)", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
5332 {VENDOR_BN, "HFC-E1 Card (Dual)", 1, 1, 0, 1, 0, DIP_E1, 0, 0},
5333
5334 {VENDOR_CCD, "HFC-E1 Eval (old)", 1, 1, 0, 0, 0, 0, 0, 0},
5335 {VENDOR_CCD, "HFC-E1 IOB1E1", 1, 1, 0, 1, 0, 0, 0, 0},
5336 {VENDOR_CCD, "HFC-E1", 1, 1, 0, 1, 0, 0, 0, 0},
5337
5338 {VENDOR_CCD, "HFC-4S Speech Design", 4, 4, 0, 0, 0, 0,
5339 HFC_IO_MODE_PLXSD, 0},
5340 {VENDOR_CCD, "HFC-E1 Speech Design", 1, 1, 0, 0, 0, 0,
5341 HFC_IO_MODE_PLXSD, 0},
5342 {VENDOR_CCD, "HFC-4S OpenVox", 4, 4, 1, 0, 0, 0, 0, 0},
5343 {VENDOR_CCD, "HFC-2S OpenVox", 4, 2, 1, 0, 0, 0, 0, 0},
5344 {VENDOR_CCD, "HFC-8S OpenVox", 8, 8, 1, 0, 0, 0, 0, 0},
5345 {VENDOR_CCD, "XHFC-4S Speech Design", 5, 4, 0, 0, 0, 0,
5346 HFC_IO_MODE_EMBSD, XHFC_IRQ},
5347 {VENDOR_JH, "HFC-8S (junghanns)", 8, 8, 1, 0, 0, 0, 0, 0},
5348 {VENDOR_BN, "HFC-2S Beronet Card PCIe", 4, 2, 1, 3, 0, DIP_4S, 0, 0},
5349 {VENDOR_BN, "HFC-4S Beronet Card PCIe", 4, 4, 1, 2, 0, DIP_4S, 0, 0},
5350};
5351
5352#undef H
5353#define H(x) ((unsigned long)&hfcm_map[x])
5354static struct pci_device_id hfmultipci_ids[] = {
5355
5356
5357 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5358 PCI_SUBDEVICE_ID_CCD_BN1SM, 0, 0, H(0)},
5359 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5360 PCI_SUBDEVICE_ID_CCD_BN2S, 0, 0, H(1)},
5361 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5362 PCI_SUBDEVICE_ID_CCD_BN2SM, 0, 0, H(2)},
5363 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5364 PCI_SUBDEVICE_ID_CCD_BN4S, 0, 0, H(3)},
5365 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5366 PCI_SUBDEVICE_ID_CCD_BN4SM, 0, 0, H(4)},
5367 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5368 PCI_DEVICE_ID_CCD_HFC4S, 0, 0, H(5)},
5369 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5370 PCI_SUBDEVICE_ID_CCD_IOB4ST, 0, 0, H(6)},
5371 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5372 PCI_SUBDEVICE_ID_CCD_HFC4S, 0, 0, H(7)},
5373 { PCI_VENDOR_ID_DIGIUM, PCI_DEVICE_ID_DIGIUM_HFC4S,
5374 PCI_VENDOR_ID_DIGIUM, PCI_DEVICE_ID_DIGIUM_HFC4S, 0, 0, H(8)},
5375 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5376 PCI_SUBDEVICE_ID_CCD_SWYX4S, 0, 0, H(9)},
5377 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5378 PCI_SUBDEVICE_ID_CCD_JH4S20, 0, 0, H(10)},
5379 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5380 PCI_SUBDEVICE_ID_CCD_PMX2S, 0, 0, H(11)},
5381 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5382 PCI_SUBDEVICE_ID_CCD_OV4S, 0, 0, H(28)},
5383 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5384 PCI_SUBDEVICE_ID_CCD_OV2S, 0, 0, H(29)},
5385 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5386 0xb761, 0, 0, H(33)},
5387 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD,
5388 0xb762, 0, 0, H(34)},
5389
5390
5391 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5392 PCI_SUBDEVICE_ID_CCD_BN8S, 0, 0, H(12)},
5393 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5394 PCI_SUBDEVICE_ID_CCD_BN8SP, 0, 0, H(13)},
5395 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5396 PCI_DEVICE_ID_CCD_HFC8S, 0, 0, H(14)},
5397 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5398 PCI_SUBDEVICE_ID_CCD_IOB8STR, 0, 0, H(15)},
5399 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5400 PCI_SUBDEVICE_ID_CCD_IOB8ST, 0, 0, H(16)},
5401 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5402 PCI_SUBDEVICE_ID_CCD_IOB8ST_1, 0, 0, H(17)},
5403 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5404 PCI_SUBDEVICE_ID_CCD_HFC8S, 0, 0, H(18)},
5405 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5406 PCI_SUBDEVICE_ID_CCD_OV8S, 0, 0, H(30)},
5407 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD,
5408 PCI_SUBDEVICE_ID_CCD_JH8S, 0, 0, H(32)},
5409
5410
5411
5412 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5413 PCI_SUBDEVICE_ID_CCD_BNE1, 0, 0, H(19)},
5414 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5415 PCI_SUBDEVICE_ID_CCD_BNE1M, 0, 0, H(20)},
5416 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5417 PCI_SUBDEVICE_ID_CCD_BNE1DP, 0, 0, H(21)},
5418 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5419 PCI_SUBDEVICE_ID_CCD_BNE1D, 0, 0, H(22)},
5420
5421 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5422 PCI_DEVICE_ID_CCD_HFCE1, 0, 0, H(23)},
5423 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5424 PCI_SUBDEVICE_ID_CCD_IOB1E1, 0, 0, H(24)},
5425 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5426 PCI_SUBDEVICE_ID_CCD_HFCE1, 0, 0, H(25)},
5427
5428 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, PCI_VENDOR_ID_CCD,
5429 PCI_SUBDEVICE_ID_CCD_SPD4S, 0, 0, H(26)},
5430 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, PCI_VENDOR_ID_CCD,
5431 PCI_SUBDEVICE_ID_CCD_SPDE1, 0, 0, H(27)},
5432
5433 { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFCE1, PCI_VENDOR_ID_CCD,
5434 PCI_SUBDEVICE_ID_CCD_JHSE1, 0, 0, H(25)},
5435
5436 { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_HFC4S), 0 },
5437 { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_HFC8S), 0 },
5438 { PCI_VDEVICE(CCD, PCI_DEVICE_ID_CCD_HFCE1), 0 },
5439 {0, }
5440};
5441#undef H
5442
5443MODULE_DEVICE_TABLE(pci, hfmultipci_ids);
5444
5445static int
5446hfcmulti_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
5447{
5448 struct hm_map *m = (struct hm_map *)ent->driver_data;
5449 int ret;
5450
5451 if (m == NULL && ent->vendor == PCI_VENDOR_ID_CCD && (
5452 ent->device == PCI_DEVICE_ID_CCD_HFC4S ||
5453 ent->device == PCI_DEVICE_ID_CCD_HFC8S ||
5454 ent->device == PCI_DEVICE_ID_CCD_HFCE1)) {
5455 printk(KERN_ERR
5456 "Unknown HFC multiport controller (vendor:%04x device:%04x "
5457 "subvendor:%04x subdevice:%04x)\n", pdev->vendor,
5458 pdev->device, pdev->subsystem_vendor,
5459 pdev->subsystem_device);
5460 printk(KERN_ERR
5461 "Please contact the driver maintainer for support.\n");
5462 return -ENODEV;
5463 }
5464 ret = hfcmulti_init(m, pdev, ent);
5465 if (ret)
5466 return ret;
5467 HFC_cnt++;
5468 printk(KERN_INFO "%d devices registered\n", HFC_cnt);
5469 return 0;
5470}
5471
5472static struct pci_driver hfcmultipci_driver = {
5473 .name = "hfc_multi",
5474 .probe = hfcmulti_probe,
5475 .remove = hfc_remove_pci,
5476 .id_table = hfmultipci_ids,
5477};
5478
5479static void __exit
5480HFCmulti_cleanup(void)
5481{
5482 struct hfc_multi *card, *next;
5483
5484
5485 list_for_each_entry_safe(card, next, &HFClist, list)
5486 release_card(card);
5487 pci_unregister_driver(&hfcmultipci_driver);
5488}
5489
5490static int __init
5491HFCmulti_init(void)
5492{
5493 int err;
5494 int i, xhfc = 0;
5495 struct hm_map m;
5496
5497 printk(KERN_INFO "mISDN: HFC-multi driver %s\n", HFC_MULTI_VERSION);
5498
5499#ifdef IRQ_DEBUG
5500 printk(KERN_DEBUG "%s: IRQ_DEBUG IS ENABLED!\n", __func__);
5501#endif
5502
5503 spin_lock_init(&HFClock);
5504 spin_lock_init(&plx_lock);
5505
5506 if (debug & DEBUG_HFCMULTI_INIT)
5507 printk(KERN_DEBUG "%s: init entered\n", __func__);
5508
5509 switch (poll) {
5510 case 0:
5511 poll_timer = 6;
5512 poll = 128;
5513 break;
5514 case 8:
5515 poll_timer = 2;
5516 break;
5517 case 16:
5518 poll_timer = 3;
5519 break;
5520 case 32:
5521 poll_timer = 4;
5522 break;
5523 case 64:
5524 poll_timer = 5;
5525 break;
5526 case 128:
5527 poll_timer = 6;
5528 break;
5529 case 256:
5530 poll_timer = 7;
5531 break;
5532 default:
5533 printk(KERN_ERR
5534 "%s: Wrong poll value (%d).\n", __func__, poll);
5535 err = -EINVAL;
5536 return err;
5537
5538 }
5539
5540 if (!clock)
5541 clock = 1;
5542
5543
5544
5545 switch (hwid) {
5546 case HWID_MINIP4:
5547 xhfc = 1;
5548 m = hfcm_map[31];
5549 break;
5550 case HWID_MINIP8:
5551 xhfc = 2;
5552 m = hfcm_map[31];
5553 break;
5554 case HWID_MINIP16:
5555 xhfc = 4;
5556 m = hfcm_map[31];
5557 break;
5558 default:
5559 xhfc = 0;
5560 }
5561
5562 for (i = 0; i < xhfc; ++i) {
5563 err = hfcmulti_init(&m, NULL, NULL);
5564 if (err) {
5565 printk(KERN_ERR "error registering embedded driver: "
5566 "%x\n", err);
5567 return err;
5568 }
5569 HFC_cnt++;
5570 printk(KERN_INFO "%d devices registered\n", HFC_cnt);
5571 }
5572
5573
5574 err = pci_register_driver(&hfcmultipci_driver);
5575 if (err < 0) {
5576 printk(KERN_ERR "error registering pci driver: %x\n", err);
5577 return err;
5578 }
5579
5580 return 0;
5581}
5582
5583
5584module_init(HFCmulti_init);
5585module_exit(HFCmulti_cleanup);
5586