1 /* $Id: elsa.c,v 1.14 1997/04/13 19:53:25 keil Exp $
3 * elsa.c low level stuff for Elsa isdn cards
5 * Author Karsten Keil (keil@temic-ech.spacenet.de)
7 * Thanks to Elsa GmbH for documents and informations
11 * Revision 1.14 1997/04/13 19:53:25 keil
12 * Fixed QS1000 init, change in IRQ check delay for SMP
14 * Revision 1.13 1997/04/07 22:58:07 keil
15 * need include config.h
17 * Revision 1.12 1997/04/06 22:54:14 keil
20 * Revision 1.11 1997/03/23 21:45:46 keil
21 * Add support for ELSA PCMCIA
23 * Revision 1.10 1997/03/12 21:42:19 keil
24 * Bugfix: IRQ hangs with QS1000
26 * Revision 1.9 1997/03/04 15:57:39 keil
27 * bugfix IRQ reset Quickstep, ELSA PC changes, some stuff for new cards
29 * Revision 1.8 1997/01/27 15:51:48 keil
32 * Revision 1.7 1997/01/21 22:20:48 keil
33 * Elsa Quickstep support
35 * Revision 1.6 1997/01/09 18:22:46 keil
38 * Revision 1.5 1996/12/08 19:46:14 keil
39 * PCC-8 correct IRQs; starting ARCOFI support
41 * Revision 1.4 1996/11/18 20:50:54 keil
42 * with PCF Pro release 16 Byte IO
44 * Revision 1.3 1996/11/18 15:33:04 keil
45 * PCC and PCFPro support
47 * Revision 1.2 1996/10/27 22:08:03 keil
50 * Revision 1.1 1996/10/13 20:04:52 keil
58 #define __NO_VERSION__
59 #include <linux/config.h>
64 #include <linux/kernel_stat.h>
66 extern const char *CardType
[];
68 const char *Elsa_revision
= "$Revision: 1.14 $";
69 const char *Elsa_Types
[] =
70 {"None", "PC", "PCC-8", "PCC-16", "PCF", "PCF-Pro",
71 "PCMCIA", "QS 1000", "QS 3000"};
73 const char *ITACVer
[] =
74 {"?0?", "?1?", "?2?", "?3?", "?4?", "V2.2",
77 #define byteout(addr,val) outb_p(val,addr)
78 #define bytein(addr) inb_p(addr)
81 readhscx(unsigned int adr
, int hscx
, u_char off
)
88 byteout(adr
+ CARD_ALE
, off
+ (hscx
? 0x60 : 0x20));
89 ret
= bytein(adr
+ CARD_HSCX
);
95 read_fifo_hscx(unsigned int adr
, int hscx
, u_char
* data
, int size
)
97 /* fifo read without cli because it's allready done */
99 byteout(adr
+ CARD_ALE
, (hscx
? 0x40 : 0));
100 insb(adr
+ CARD_HSCX
, data
, size
);
105 writehscx(unsigned int adr
, int hscx
, u_char off
, u_char data
)
111 byteout(adr
+ CARD_ALE
, off
+ (hscx
? 0x60 : 0x20));
112 byteout(adr
+ CARD_HSCX
, data
);
113 restore_flags(flags
);
117 write_fifo_hscx(unsigned int adr
, int hscx
, u_char
* data
, int size
)
119 /* fifo write without cli because it's allready done */
120 byteout(adr
+ CARD_ALE
, (hscx
? 0x40 : 0));
121 outsb(adr
+ CARD_HSCX
, data
, size
);
125 readisac(unsigned int adr
, u_char off
)
132 byteout(adr
+ CARD_ALE
, off
+ 0x20);
133 ret
= bytein(adr
+ CARD_ISAC
);
134 restore_flags(flags
);
139 read_fifo_isac(unsigned int adr
, u_char
* data
, int size
)
141 /* fifo read without cli because it's allready done */
143 byteout(adr
+ CARD_ALE
, 0);
144 insb(adr
+ CARD_ISAC
, data
, size
);
149 writeisac(unsigned int adr
, u_char off
, u_char data
)
155 byteout(adr
+ CARD_ALE
, off
+ 0x20);
156 byteout(adr
+ CARD_ISAC
, data
);
157 restore_flags(flags
);
161 write_fifo_isac(unsigned int adr
, u_char
* data
, int size
)
163 /* fifo write without cli because it's allready done */
165 byteout(adr
+ CARD_ALE
, 0);
166 outsb(adr
+ CARD_ISAC
, data
, size
);
169 #ifdef CONFIG_HISAX_ELSA_PCC
171 readitac(unsigned int adr
, u_char off
)
178 byteout(adr
+ CARD_ALE
, off
);
179 ret
= bytein(adr
+ CARD_ITAC
);
180 restore_flags(flags
);
185 writeitac(unsigned int adr
, u_char off
, u_char data
)
191 byteout(adr
+ CARD_ALE
, off
);
192 byteout(adr
+ CARD_ITAC
, data
);
193 restore_flags(flags
);
197 TimerRun(struct IsdnCardState
*sp
)
201 val
= bytein(sp
->cfg_reg
+ CARD_CONFIG
);
202 if (sp
->subtyp
== ELSA_QS1000
)
203 return (0 == (val
& TIMER_RUN
));
204 else if (sp
->subtyp
== ELSA_PCC8
)
205 return (val
& TIMER_RUN_PCC8
);
206 return (val
& TIMER_RUN
);
210 elsa_led_handler(struct IsdnCardState
*sp
)
213 u_char outval
= 0xf0;
217 if ((sp
->ph_state
== 0) || (sp
->ph_state
== 15)) {
220 if (sp
->hs
[0].mode
!= 0)
222 if (sp
->hs
[1].mode
!= 0)
225 cval
= (sp
->counter
>> 6) & 3;
231 outval
|= LINE_LED
| STAT_LED
;
243 outval
|= LINE_LED
| STAT_LED
;
268 byteout(sp
->cfg_reg
+ CARD_CONTROL
, outval
);
273 waitforCEC(int adr
, int hscx
)
277 while ((readhscx(adr
, hscx
, HSCX_STAR
) & 0x04) && to
) {
282 printk(KERN_WARNING
"Elsa: waitforCEC timeout\n");
287 waitforXFW(int adr
, int hscx
)
291 while ((!(readhscx(adr
, hscx
, HSCX_STAR
) & 0x44) == 0x40) && to
) {
296 printk(KERN_WARNING
"Elsa: waitforXFW timeout\n");
300 writehscxCMDR(int adr
, int hscx
, u_char data
)
306 waitforCEC(adr
, hscx
);
307 writehscx(adr
, hscx
, HSCX_CMDR
, data
);
308 restore_flags(flags
);
312 * fast interrupt here
317 hscxreport(struct IsdnCardState
*sp
, int hscx
)
319 printk(KERN_DEBUG
"HSCX %d\n", hscx
);
320 printk(KERN_DEBUG
"ISTA %x\n", readhscx(sp
->cfg_reg
, hscx
, HSCX_ISTA
));
321 printk(KERN_DEBUG
"STAR %x\n", readhscx(sp
->cfg_reg
, hscx
, HSCX_STAR
));
322 printk(KERN_DEBUG
"EXIR %x\n", readhscx(sp
->cfg_reg
, hscx
, HSCX_EXIR
));
326 elsa_report(struct IsdnCardState
*sp
)
328 printk(KERN_DEBUG
"ISAC\n");
329 printk(KERN_DEBUG
"ISTA %x\n", readisac(sp
->cfg_reg
, ISAC_ISTA
));
330 printk(KERN_DEBUG
"STAR %x\n", readisac(sp
->cfg_reg
, ISAC_STAR
));
331 printk(KERN_DEBUG
"EXIR %x\n", readisac(sp
->cfg_reg
, ISAC_EXIR
));
337 * HSCX stuff goes here
341 hscx_empty_fifo(struct HscxState
*hsp
, int count
)
344 struct IsdnCardState
*sp
= hsp
->sp
;
347 if ((sp
->debug
& L1_DEB_HSCX
) && !(sp
->debug
& L1_DEB_HSCX_FIFO
))
348 debugl1(sp
, "hscx_empty_fifo");
350 if (hsp
->rcvidx
+ count
> HSCX_BUFMAX
) {
351 if (sp
->debug
& L1_DEB_WARN
)
352 debugl1(sp
, "hscx_empty_fifo: incoming packet too large");
353 writehscxCMDR(sp
->cfg_reg
, hsp
->hscx
, 0x80);
357 ptr
= hsp
->rcvbuf
+ hsp
->rcvidx
;
358 hsp
->rcvidx
+= count
;
361 read_fifo_hscx(sp
->cfg_reg
, hsp
->hscx
, ptr
, count
);
362 writehscxCMDR(sp
->cfg_reg
, hsp
->hscx
, 0x80);
363 restore_flags(flags
);
364 if (sp
->debug
& L1_DEB_HSCX_FIFO
) {
368 t
+= sprintf(t
, "hscx_empty_fifo %c cnt %d",
369 hsp
->hscx
? 'B' : 'A', count
);
370 QuickHex(t
, ptr
, count
);
376 hscx_fill_fifo(struct HscxState
*hsp
)
378 struct IsdnCardState
*sp
= hsp
->sp
;
384 if ((sp
->debug
& L1_DEB_HSCX
) && !(sp
->debug
& L1_DEB_HSCX_FIFO
))
385 debugl1(sp
, "hscx_fill_fifo");
389 if (hsp
->tx_skb
->len
<= 0)
392 more
= (hsp
->mode
== 1) ? 1 : 0;
393 if (hsp
->tx_skb
->len
> 32) {
397 count
= hsp
->tx_skb
->len
;
399 waitforXFW(sp
->cfg_reg
, hsp
->hscx
);
402 ptr
= hsp
->tx_skb
->data
;
403 skb_pull(hsp
->tx_skb
, count
);
404 hsp
->tx_cnt
-= count
;
406 write_fifo_hscx(sp
->cfg_reg
, hsp
->hscx
, ptr
, count
);
407 writehscxCMDR(sp
->cfg_reg
, hsp
->hscx
, more
? 0x8 : 0xa);
408 restore_flags(flags
);
409 if (sp
->debug
& L1_DEB_HSCX_FIFO
) {
413 t
+= sprintf(t
, "hscx_fill_fifo %c cnt %d",
414 hsp
->hscx
? 'B' : 'A', count
);
415 QuickHex(t
, ptr
, count
);
421 hscx_interrupt(struct IsdnCardState
*sp
, u_char val
, u_char hscx
)
424 struct HscxState
*hsp
= sp
->hs
+ hscx
;
432 if (val
& 0x80) { /* RME */
434 r
= readhscx(sp
->cfg_reg
, hsp
->hscx
, HSCX_RSTA
);
435 if ((r
& 0xf0) != 0xa0) {
437 if (sp
->debug
& L1_DEB_WARN
)
438 debugl1(sp
, "HSCX invalid frame");
439 if ((r
& 0x40) && hsp
->mode
)
440 if (sp
->debug
& L1_DEB_WARN
) {
441 sprintf(tmp
, "HSCX RDO mode=%d",
446 if (sp
->debug
& L1_DEB_WARN
)
447 debugl1(sp
, "HSCX CRC error");
448 writehscxCMDR(sp
->cfg_reg
, hsp
->hscx
, 0x80);
450 count
= readhscx(sp
->cfg_reg
, hsp
->hscx
, HSCX_RBCL
) & 0x1f;
453 hscx_empty_fifo(hsp
, count
);
454 if ((count
= hsp
->rcvidx
- 1) > 0) {
455 if (sp
->debug
& L1_DEB_HSCX_FIFO
) {
456 sprintf(tmp
, "HX Frame %d", count
);
459 if (!(skb
= dev_alloc_skb(count
)))
460 printk(KERN_WARNING
"Elsa: receive out of memory\n");
462 memcpy(skb_put(skb
, count
), hsp
->rcvbuf
, count
);
463 skb_queue_tail(&hsp
->rqueue
, skb
);
468 hscx_sched_event(hsp
, HSCX_RCVBUFREADY
);
470 if (val
& 0x40) { /* RPF */
471 hscx_empty_fifo(hsp
, 32);
472 if (hsp
->mode
== 1) {
473 /* receive audio data */
474 if (!(skb
= dev_alloc_skb(32)))
475 printk(KERN_WARNING
"elsa: receive out of memory\n");
477 memcpy(skb_put(skb
, 32), hsp
->rcvbuf
, 32);
478 skb_queue_tail(&hsp
->rqueue
, skb
);
481 hscx_sched_event(hsp
, HSCX_RCVBUFREADY
);
484 if (val
& 0x10) { /* XPR */
486 if (hsp
->tx_skb
->len
) {
490 SET_SKB_FREE(hsp
->tx_skb
);
491 dev_kfree_skb(hsp
->tx_skb
, FREE_WRITE
);
493 if (hsp
->st
->l4
.l1writewakeup
)
494 hsp
->st
->l4
.l1writewakeup(hsp
->st
);
497 if ((hsp
->tx_skb
= skb_dequeue(&hsp
->squeue
))) {
501 hscx_sched_event(hsp
, HSCX_XMTBUFREADY
);
506 * ISAC stuff goes here
510 isac_empty_fifo(struct IsdnCardState
*sp
, int count
)
515 if ((sp
->debug
& L1_DEB_ISAC
) && !(sp
->debug
& L1_DEB_ISAC_FIFO
))
516 debugl1(sp
, "isac_empty_fifo");
518 if ((sp
->rcvidx
+ count
) >= MAX_DFRAME_LEN
) {
519 if (sp
->debug
& L1_DEB_WARN
) {
521 sprintf(tmp
, "isac_empty_fifo overrun %d",
525 writeisac(sp
->cfg_reg
, ISAC_CMDR
, 0x80);
529 ptr
= sp
->rcvbuf
+ sp
->rcvidx
;
533 read_fifo_isac(sp
->cfg_reg
, ptr
, count
);
534 writeisac(sp
->cfg_reg
, ISAC_CMDR
, 0x80);
535 restore_flags(flags
);
536 if (sp
->debug
& L1_DEB_ISAC_FIFO
) {
540 t
+= sprintf(t
, "isac_empty_fifo cnt %d", count
);
541 QuickHex(t
, ptr
, count
);
547 isac_fill_fifo(struct IsdnCardState
*sp
)
553 if ((sp
->debug
& L1_DEB_ISAC
) && !(sp
->debug
& L1_DEB_ISAC_FIFO
))
554 debugl1(sp
, "isac_fill_fifo");
559 count
= sp
->tx_skb
->len
;
570 ptr
= sp
->tx_skb
->data
;
571 skb_pull(sp
->tx_skb
, count
);
573 write_fifo_isac(sp
->cfg_reg
, ptr
, count
);
574 writeisac(sp
->cfg_reg
, ISAC_CMDR
, more
? 0x8 : 0xa);
575 restore_flags(flags
);
576 if (sp
->debug
& L1_DEB_ISAC_FIFO
) {
580 t
+= sprintf(t
, "isac_fill_fifo cnt %d", count
);
581 QuickHex(t
, ptr
, count
);
587 ph_command(struct IsdnCardState
*sp
, unsigned int command
)
589 if (sp
->debug
& L1_DEB_ISAC
) {
591 sprintf(tmp
, "ph_command %d", command
);
594 writeisac(sp
->cfg_reg
, ISAC_CIX0
, (command
<< 2) | 3);
598 isac_interrupt(struct IsdnCardState
*sp
, u_char val
)
605 struct BufHeader
*ibh
;
609 if (sp
->debug
& L1_DEB_ISAC
) {
610 sprintf(tmp
, "ISAC interrupt %x", val
);
613 if (val
& 0x80) { /* RME */
614 exval
= readisac(sp
->cfg_reg
, ISAC_RSTA
);
615 if ((exval
& 0x70) != 0x20) {
617 if (sp
->debug
& L1_DEB_WARN
)
618 debugl1(sp
, "ISAC RDO");
620 if (sp
->debug
& L1_DEB_WARN
)
621 debugl1(sp
, "ISAC CRC error");
622 writeisac(sp
->cfg_reg
, ISAC_CMDR
, 0x80);
624 count
= readisac(sp
->cfg_reg
, ISAC_RBCL
) & 0x1f;
627 isac_empty_fifo(sp
, count
);
628 if ((count
= sp
->rcvidx
) > 0) {
630 if (!(skb
= alloc_skb(count
, GFP_ATOMIC
)))
631 printk(KERN_WARNING
"Elsa: D receive out of memory\n");
633 memcpy(skb_put(skb
, count
), sp
->rcvbuf
, count
);
634 skb_queue_tail(&sp
->rq
, skb
);
639 isac_sched_event(sp
, ISAC_RCVBUFREADY
);
641 if (val
& 0x40) { /* RPF */
642 isac_empty_fifo(sp
, 32);
644 if (val
& 0x20) { /* RSC */
646 if (sp
->debug
& L1_DEB_WARN
)
647 debugl1(sp
, "ISAC RSC interrupt");
649 if (val
& 0x10) { /* XPR */
651 if (sp
->tx_skb
->len
) {
655 SET_SKB_FREE(sp
->tx_skb
);
656 dev_kfree_skb(sp
->tx_skb
, FREE_WRITE
);
660 if ((sp
->tx_skb
= skb_dequeue(&sp
->sq
))) {
664 isac_sched_event(sp
, ISAC_XMTBUFREADY
);
667 if (val
& 0x04) { /* CISQ */
668 sp
->ph_state
= (readisac(sp
->cfg_reg
, ISAC_CIX0
) >> 2)
670 if (sp
->debug
& L1_DEB_ISAC
) {
671 sprintf(tmp
, "l1state %d", sp
->ph_state
);
676 if (val
& 0x02) { /* SIN */
678 if (sp
->debug
& L1_DEB_WARN
)
679 debugl1(sp
, "ISAC SIN interrupt");
681 if (val
& 0x01) { /* EXI */
682 exval
= readisac(sp
->cfg_reg
, ISAC_EXIR
);
683 if (sp
->debug
& L1_DEB_WARN
) {
684 sprintf(tmp
, "ISAC EXIR %02x", exval
);
688 v1
= readisac(sp
->cfg_reg
, ISAC_MOSR
);
689 if (sp
->debug
& L1_DEB_WARN
) {
690 sprintf(tmp
, "ISAC MOSR %02x", v1
);
696 if (BufPoolGet(&(sp
->mon_rx
), &(sp
->rbufpool
),
697 GFP_ATOMIC
, (void *) 1, 3)) {
698 if (sp
->debug
& L1_DEB_WARN
)
699 debugl1(sp
, "ISAC MON RX out of buffers!");
700 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0x0a);
708 if (sp
->mon_rxp
>= 3072) {
709 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0x0a);
711 if (sp
->debug
& L1_DEB_WARN
)
712 debugl1(sp
, "ISAC MON RX overflow!");
715 *ptr
= readisac(sp
->cfg_reg
, ISAC_MOR0
);
716 if (sp
->debug
& L1_DEB_WARN
) {
717 sprintf(tmp
, "ISAC MOR0 %02x", *ptr
);
724 if (BufPoolGet(&(sp
->mon_rx
), &(sp
->rbufpool
),
725 GFP_ATOMIC
, (void *) 1, 3)) {
726 if (sp
->debug
& L1_DEB_WARN
)
727 debugl1(sp
, "ISAC MON RX out of buffers!");
728 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0xa0);
736 if (sp
->mon_rxp
>= 3072) {
737 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0xa0);
739 if (sp
->debug
& L1_DEB_WARN
)
740 debugl1(sp
, "ISAC MON RX overflow!");
743 *ptr
= readisac(sp
->cfg_reg
, ISAC_MOR1
);
744 if (sp
->debug
& L1_DEB_WARN
) {
745 sprintf(tmp
, "ISAC MOR1 %02x", *ptr
);
751 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0x0a);
752 sp
->mon_rx
->datasize
= sp
->mon_rxp
;
753 sp
->mon_flg
|= MON0_RX
;
756 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0xa0);
757 sp
->mon_rx
->datasize
= sp
->mon_rxp
;
758 sp
->mon_flg
|= MON1_RX
;
763 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0x0a);
766 count
= ibh
->datasize
- sp
->mon_txp
;
768 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0x0f);
769 BufPoolRelease(sp
->mon_tx
);
772 sp
->mon_flg
|= MON0_TX
;
778 writeisac(sp
->cfg_reg
, ISAC_MOX0
, *ptr
);
784 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0xa0);
787 count
= ibh
->datasize
- sp
->mon_txp
;
789 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0xf0);
790 BufPoolRelease(sp
->mon_tx
);
793 sp
->mon_flg
|= MON1_TX
;
799 writeisac(sp
->cfg_reg
, ISAC_MOX1
, *ptr
);
808 hscx_int_main(struct IsdnCardState
*sp
, u_char val
)
812 struct HscxState
*hsp
;
817 exval
= readhscx(sp
->cfg_reg
, 1, HSCX_EXIR
);
822 /* Here we lost an TX interrupt, so
823 * restart transmitting the whole frame.
826 skb_push(hsp
->tx_skb
, hsp
->count
);
827 hsp
->tx_cnt
+= hsp
->count
;
830 writehscxCMDR(sp
->cfg_reg
, hsp
->hscx
, 0x01);
831 if (sp
->debug
& L1_DEB_WARN
) {
832 sprintf(tmp
, "HSCX B EXIR %x Lost TX", exval
);
836 } else if (sp
->debug
& L1_DEB_HSCX
) {
837 sprintf(tmp
, "HSCX B EXIR %x", exval
);
842 if (sp
->debug
& L1_DEB_HSCX
) {
843 sprintf(tmp
, "HSCX B interrupt %x", val
);
846 hscx_interrupt(sp
, val
, 1);
850 exval
= readhscx(sp
->cfg_reg
, 0, HSCX_EXIR
);
855 /* Here we lost an TX interrupt, so
856 * restart transmitting the whole frame.
859 skb_push(hsp
->tx_skb
, hsp
->count
);
860 hsp
->tx_cnt
+= hsp
->count
;
863 writehscxCMDR(sp
->cfg_reg
, hsp
->hscx
, 0x01);
864 if (sp
->debug
& L1_DEB_WARN
) {
865 sprintf(tmp
, "HSCX A EXIR %x Lost TX", exval
);
869 } else if (sp
->debug
& L1_DEB_HSCX
) {
870 sprintf(tmp
, "HSCX A EXIR %x", exval
);
875 exval
= readhscx(sp
->cfg_reg
, 0, HSCX_ISTA
);
876 if (sp
->debug
& L1_DEB_HSCX
) {
877 sprintf(tmp
, "HSCX A interrupt %x", exval
);
880 hscx_interrupt(sp
, exval
, 0);
885 elsa_interrupt(int intno
, void *dev_id
, struct pt_regs
*regs
)
887 struct IsdnCardState
*sp
;
890 sp
= (struct IsdnCardState
*) dev_id
;
893 printk(KERN_WARNING
"Elsa: Spurious interrupt!\n");
896 #ifdef CONFIG_HISAX_ELSA_PCC
900 byteout(sp
->cfg_reg
+ CARD_START_TIMER
, 0);
901 if (!(sp
->counter
++ & 0x3f)) {
902 /* Call LEDs all 64 tics */
903 elsa_led_handler(sp
);
907 val
= readhscx(sp
->cfg_reg
, 1, HSCX_ISTA
);
910 hscx_int_main(sp
, val
);
912 val
= readisac(sp
->cfg_reg
, ISAC_ISTA
);
915 isac_interrupt(sp
, val
);
917 #ifdef CONFIG_HISAX_ELSA_PCC
921 val
= readhscx(sp
->cfg_reg
, 1, HSCX_ISTA
);
923 if (sp
->debug
& L1_DEB_HSCX
)
924 debugl1(sp
, "HSCX IntStat after IntRoutine");
927 val
= readisac(sp
->cfg_reg
, ISAC_ISTA
);
929 if (sp
->debug
& L1_DEB_ISAC
)
930 debugl1(sp
, "ISAC IntStat after IntRoutine");
933 writehscx(sp
->cfg_reg
, 0, HSCX_MASK
, 0xFF);
934 writehscx(sp
->cfg_reg
, 1, HSCX_MASK
, 0xFF);
935 writeisac(sp
->cfg_reg
, ISAC_MASK
, 0xFF);
936 #ifdef CONFIG_HISAX_ELSA_PCC
937 if (sp
->subtyp
== ELSA_QS1000
) {
938 byteout(sp
->cfg_reg
+ CARD_START_TIMER
, 0);
939 byteout(sp
->cfg_reg
+ CARD_TRIG_IRQ
, 0xff);
942 writehscx(sp
->cfg_reg
, 0, HSCX_MASK
, 0x0);
943 writehscx(sp
->cfg_reg
, 1, HSCX_MASK
, 0x0);
944 writeisac(sp
->cfg_reg
, ISAC_MASK
, 0x0);
949 initisac(struct IsdnCardState
*sp
)
951 unsigned int adr
= sp
->cfg_reg
;
953 /* Elsa IOM 2 Mode */
954 writeisac(adr
, ISAC_MASK
, 0xff);
955 writeisac(adr
, ISAC_ADF2
, 0x80);
956 writeisac(adr
, ISAC_SQXR
, 0x2f);
957 writeisac(adr
, ISAC_SPCR
, 0x00);
958 writeisac(adr
, ISAC_STCR
, 0x70);
959 writeisac(adr
, ISAC_MODE
, 0xc9);
960 writeisac(adr
, ISAC_TIMR
, 0x00);
961 writeisac(adr
, ISAC_ADF1
, 0x00);
962 writeisac(adr
, ISAC_CIX0
, (1 << 2) | 3);
963 writeisac(adr
, ISAC_MASK
, 0xff);
964 writeisac(adr
, ISAC_MASK
, 0x0);
968 modehscx(struct HscxState
*hs
, int mode
, int ichan
)
970 struct IsdnCardState
*sp
= hs
->sp
;
973 if (sp
->debug
& L1_DEB_HSCX
) {
975 sprintf(tmp
, "hscx %c mode %d ichan %d",
976 'A' + hscx
, mode
, ichan
);
980 writehscx(sp
->cfg_reg
, hscx
, HSCX_CCR1
, 0x85);
981 writehscx(sp
->cfg_reg
, hscx
, HSCX_XAD1
, 0xFF);
982 writehscx(sp
->cfg_reg
, hscx
, HSCX_XAD2
, 0xFF);
983 writehscx(sp
->cfg_reg
, hscx
, HSCX_RAH2
, 0xFF);
984 writehscx(sp
->cfg_reg
, hscx
, HSCX_XBCH
, 0x0);
985 writehscx(sp
->cfg_reg
, hscx
, HSCX_RLCR
, 0x0);
986 writehscx(sp
->cfg_reg
, hscx
, HSCX_CCR2
, 0x30);
990 writehscx(sp
->cfg_reg
, hscx
, HSCX_TSAX
, 0xff);
991 writehscx(sp
->cfg_reg
, hscx
, HSCX_TSAR
, 0xff);
992 writehscx(sp
->cfg_reg
, hscx
, HSCX_XCCR
, 7);
993 writehscx(sp
->cfg_reg
, hscx
, HSCX_RCCR
, 7);
994 writehscx(sp
->cfg_reg
, hscx
, HSCX_MODE
, 0x84);
998 writehscx(sp
->cfg_reg
, hscx
, HSCX_TSAX
, 0x2f);
999 writehscx(sp
->cfg_reg
, hscx
, HSCX_TSAR
, 0x2f);
1001 writehscx(sp
->cfg_reg
, hscx
, HSCX_TSAX
, 0x3);
1002 writehscx(sp
->cfg_reg
, hscx
, HSCX_TSAR
, 0x3);
1004 writehscx(sp
->cfg_reg
, hscx
, HSCX_XCCR
, 7);
1005 writehscx(sp
->cfg_reg
, hscx
, HSCX_RCCR
, 7);
1006 writehscx(sp
->cfg_reg
, hscx
, HSCX_MODE
, 0xe4);
1007 writehscx(sp
->cfg_reg
, hscx
, HSCX_CMDR
, 0x41);
1011 writehscx(sp
->cfg_reg
, hscx
, HSCX_TSAX
, 0x2f);
1012 writehscx(sp
->cfg_reg
, hscx
, HSCX_TSAR
, 0x2f);
1014 writehscx(sp
->cfg_reg
, hscx
, HSCX_TSAX
, 0x3);
1015 writehscx(sp
->cfg_reg
, hscx
, HSCX_TSAR
, 0x3);
1017 writehscx(sp
->cfg_reg
, hscx
, HSCX_XCCR
, 7);
1018 writehscx(sp
->cfg_reg
, hscx
, HSCX_RCCR
, 7);
1019 writehscx(sp
->cfg_reg
, hscx
, HSCX_MODE
, 0x8c);
1020 writehscx(sp
->cfg_reg
, hscx
, HSCX_CMDR
, 0x41);
1023 writehscx(sp
->cfg_reg
, hscx
, HSCX_ISTA
, 0x00);
1027 release_io_elsa(struct IsdnCard
*card
)
1031 if (card
->sp
->subtyp
== ELSA_PCFPRO
)
1033 if (card
->sp
->cfg_reg
)
1034 release_region(card
->sp
->cfg_reg
, bytecnt
);
1038 reset_elsa(struct IsdnCardState
*sp
)
1040 #ifdef CONFIG_HISAX_ELSA_PCC
1042 byteout(sp
->cfg_reg
+ CARD_START_TIMER
, 0);
1043 while (TimerRun(sp
));
1044 byteout(sp
->cfg_reg
+ CARD_CONTROL
, 0x00); /* Reset On */
1046 byteout(sp
->cfg_reg
+ CARD_START_TIMER
, 0);
1047 while (TimerRun(sp
));
1048 byteout(sp
->cfg_reg
+ CARD_CONTROL
, ISDN_RESET
); /* Reset Off */
1050 byteout(sp
->cfg_reg
+ CARD_START_TIMER
, 0);
1051 while (TimerRun(sp
));
1052 byteout(sp
->cfg_reg
+ CARD_TRIG_IRQ
, 0xff);
1057 clear_pending_ints(struct IsdnCardState
*sp
)
1059 #ifdef CONFIG_HISAX_ELSA_PCMCIA
1063 val
= readhscx(sp
->cfg_reg
, 1, HSCX_ISTA
);
1064 sprintf(tmp
, "HSCX B ISTA %x", val
);
1067 val
= readhscx(sp
->cfg_reg
, 1, HSCX_EXIR
);
1068 sprintf(tmp
, "HSCX B EXIR %x", val
);
1070 } else if (val
& 0x02) {
1071 val
= readhscx(sp
->cfg_reg
, 0, HSCX_EXIR
);
1072 sprintf(tmp
, "HSCX A EXIR %x", val
);
1075 val
= readhscx(sp
->cfg_reg
, 0, HSCX_ISTA
);
1076 sprintf(tmp
, "HSCX A ISTA %x", val
);
1078 val
= readhscx(sp
->cfg_reg
, 1, HSCX_STAR
);
1079 sprintf(tmp
, "HSCX B STAR %x", val
);
1081 val
= readhscx(sp
->cfg_reg
, 0, HSCX_STAR
);
1082 sprintf(tmp
, "HSCX A STAR %x", val
);
1084 val
= readisac(sp
->cfg_reg
, ISAC_STAR
);
1085 sprintf(tmp
, "ISAC STAR %x", val
);
1087 val
= readisac(sp
->cfg_reg
, ISAC_MODE
);
1088 sprintf(tmp
, "ISAC MODE %x", val
);
1090 val
= readisac(sp
->cfg_reg
, ISAC_ADF2
);
1091 sprintf(tmp
, "ISAC ADF2 %x", val
);
1093 val
= readisac(sp
->cfg_reg
, ISAC_ISTA
);
1094 sprintf(tmp
, "ISAC ISTA %x", val
);
1097 val
= readisac(sp
->cfg_reg
, ISAC_EXIR
);
1098 sprintf(tmp
, "ISAC EXIR %x", val
);
1100 } else if (val
& 0x04) {
1101 val
= readisac(sp
->cfg_reg
, ISAC_CIR0
);
1102 sprintf(tmp
, "ISAC CIR0 %x", val
);
1106 writehscx(sp
->cfg_reg
, 0, HSCX_MASK
, 0xFF);
1107 writehscx(sp
->cfg_reg
, 1, HSCX_MASK
, 0xFF);
1108 writeisac(sp
->cfg_reg
, ISAC_MASK
, 0xFF);
1109 #ifdef CONFIG_HISAX_ELSA_PCC
1110 if (sp
->subtyp
== ELSA_QS1000
) {
1111 byteout(sp
->cfg_reg
+ CARD_START_TIMER
, 0);
1112 byteout(sp
->cfg_reg
+ CARD_TRIG_IRQ
, 0xff);
1115 writehscx(sp
->cfg_reg
, 0, HSCX_MASK
, 0x0);
1116 writehscx(sp
->cfg_reg
, 1, HSCX_MASK
, 0x0);
1117 writeisac(sp
->cfg_reg
, ISAC_MASK
, 0x0);
1118 writeisac(sp
->cfg_reg
, ISAC_CMDR
, 0x41);
1122 check_arcofi(struct IsdnCardState
*sp
)
1131 if (BufPoolGet(&(sp
->mon_tx
), &(sp
->sbufpool
),
1132 GFP_ATOMIC
, (void *) 1, 3)) {
1133 if (sp
->debug
& L1_DEB_WARN
)
1134 debugl1(sp
, "ISAC MON TX out of buffers!");
1138 p
= DATAPTR(sp
->mon_tx
);
1141 sp
->mon_tx
->datasize
= 2;
1144 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0xa0);
1145 val
= readisac(sp
->cfg_reg
, ISAC_MOSR
);
1146 writeisac(sp
->cfg_reg
, ISAC_MOX1
, 0xa0);
1147 writeisac(sp
->cfg_reg
, ISAC_MOCR
, 0xb0);
1151 restore_flags(flags
);
1152 if (sp
->mon_flg
& MON1_TX
) {
1153 if (sp
->mon_flg
& MON1_RX
) {
1154 sprintf(tmp
, "Arcofi response received %d bytes", sp
->mon_rx
->datasize
);
1156 p
= DATAPTR(sp
->mon_rx
);
1158 t
+= sprintf(tmp
, "Arcofi data");
1159 QuickHex(t
, p
, sp
->mon_rx
->datasize
);
1161 BufPoolRelease(sp
->mon_rx
);
1166 } else if (sp
->mon_tx
) {
1167 BufPoolRelease(sp
->mon_tx
);
1170 sprintf(tmp
, "Arcofi not detected");
1178 initelsa(struct IsdnCardState
*sp
)
1180 int ret
, irq_cnt
, cnt
= 3;
1183 irq_cnt
= kstat_irqs(sp
->irq
);
1184 printk(KERN_INFO
"Elsa: IRQ %d count %d\n", sp
->irq
, irq_cnt
);
1185 ret
= get_irq(sp
->cardnr
, &elsa_interrupt
);
1186 #ifdef CONFIG_HISAX_ELSA_PCC
1187 byteout(sp
->cfg_reg
+ CARD_TRIG_IRQ
, 0xff);
1189 while (ret
&& cnt
) {
1191 clear_pending_ints(sp
);
1193 sp
->modehscx(sp
->hs
, 0, 0);
1194 sp
->modehscx(sp
->hs
+ 1, 0, 0);
1198 #ifdef CONFIG_HISAX_ELSA_PCC
1199 byteout(sp
->cfg_reg
+ CARD_CONTROL
, ISDN_RESET
| ENABLE_TIM_INT
);
1200 byteout(sp
->cfg_reg
+ CARD_START_TIMER
, 0);
1201 current
->state
= TASK_INTERRUPTIBLE
;
1202 current
->timeout
= jiffies
+ (110 * HZ
) / 1000; /* Timeout 110ms */
1204 restore_flags(flags
);
1205 printk(KERN_INFO
"Elsa: %d timer tics in 110 msek\n",
1207 if (abs(sp
->counter
- 13) < 3) {
1208 printk(KERN_INFO
"Elsa: timer and irq OK\n");
1211 "Elsa: timer tic problem (%d/12) maybe an IRQ(%d) conflict\n",
1212 sp
->counter
, sp
->irq
);
1215 printk(KERN_INFO
"Elsa: IRQ %d count %d\n", sp
->irq
,
1216 kstat_irqs(sp
->irq
));
1217 if (kstat_irqs(sp
->irq
) == irq_cnt
) {
1219 "Elsa: IRQ(%d) getting no interrupts during init %d\n",
1222 free_irq(sp
->irq
, sp
);
1237 #ifdef CONFIG_HISAX_ELSA_PCC
1238 static unsigned char
1239 probe_elsa_adr(unsigned int adr
)
1241 int i
, in1
, in2
, p16_1
= 0, p16_2
= 0, p8_1
= 0, p8_2
= 0, pc_1
= 0,
1242 pc_2
= 0, pfp_1
= 0, pfp_2
= 0;
1245 if (check_region(adr
, 8)) {
1247 "Elsa: Probing Port 0x%x: already in use\n",
1253 for (i
= 0; i
< 16; i
++) {
1254 in1
= inb(adr
+ CARD_CONFIG
); /* 'toggelt' bei */
1255 in2
= inb(adr
+ CARD_CONFIG
); /* jedem Zugriff */
1256 p16_1
+= 0x04 & in1
;
1257 p16_2
+= 0x04 & in2
;
1262 pfp_1
+= 0x40 & in1
;
1263 pfp_2
+= 0x40 & in2
;
1265 restore_flags(flags
);
1266 printk(KERN_INFO
"Elsa: Probing IO 0x%x", adr
);
1267 if (65 == ++p16_1
* ++p16_2
) {
1268 printk(" PCC-16/PCF found\n");
1269 return (ELSA_PCC16
);
1270 } else if (1025 == ++pfp_1
* ++pfp_2
) {
1271 printk(" PCF-Pro found\n");
1272 return (ELSA_PCFPRO
);
1273 } else if (33 == ++p8_1
* ++p8_2
) {
1274 printk(" PCC8 found\n");
1276 } else if (17 == ++pc_1
* ++pc_2
) {
1277 printk(" PC found\n");
1280 printk(" failed\n");
1286 probe_elsa(struct IsdnCardState
*sp
)
1289 unsigned int CARD_portlist
[] =
1290 {0x160, 0x170, 0x260, 0x360, 0};
1292 for (i
= 0; CARD_portlist
[i
]; i
++) {
1293 if ((sp
->subtyp
= probe_elsa_adr(CARD_portlist
[i
])))
1296 return (CARD_portlist
[i
]);
1301 setup_elsa(struct IsdnCard
*card
)
1303 #ifdef CONFIG_HISAX_ELSA_PCC
1307 u_char val
, verA
, verB
;
1308 struct IsdnCardState
*sp
= card
->sp
;
1311 strcpy(tmp
, Elsa_revision
);
1312 printk(KERN_NOTICE
"HiSax: Elsa driver Rev. %s\n", HiSax_getrev(tmp
));
1313 #ifdef CONFIG_HISAX_ELSA_PCC
1314 if (sp
->typ
== ISDN_CTYPE_ELSA
) {
1315 sp
->cfg_reg
= card
->para
[0];
1316 printk(KERN_INFO
"Elsa: Microlink IO probing\n");
1318 if (!(sp
->subtyp
= probe_elsa_adr(sp
->cfg_reg
))) {
1320 "Elsa: no Elsa Microlink at 0x%x\n",
1325 sp
->cfg_reg
= probe_elsa(sp
);
1327 val
= bytein(sp
->cfg_reg
+ CARD_CONFIG
);
1328 if (sp
->subtyp
== ELSA_PC
) {
1329 const u_char CARD_IrqTab
[8] =
1330 {7, 3, 5, 9, 0, 0, 0, 0};
1331 sp
->irq
= CARD_IrqTab
[(val
& IRQ_INDEX_PC
) >> 2];
1332 } else if (sp
->subtyp
== ELSA_PCC8
) {
1333 const u_char CARD_IrqTab
[8] =
1334 {7, 3, 5, 9, 0, 0, 0, 0};
1335 sp
->irq
= CARD_IrqTab
[(val
& IRQ_INDEX_PCC8
) >> 4];
1337 const u_char CARD_IrqTab
[8] =
1338 {15, 10, 15, 3, 11, 5, 11, 9};
1339 sp
->irq
= CARD_IrqTab
[(val
& IRQ_INDEX
) >> 3];
1341 val
= bytein(sp
->cfg_reg
+ CARD_ALE
) & 0x7;
1345 if (val
== 'B' || val
== 'C')
1347 if ((sp
->subtyp
== ELSA_PCFPRO
) && (val
= 'G'))
1350 "Elsa: %s found at 0x%x Rev.:%c IRQ %d\n",
1351 Elsa_Types
[sp
->subtyp
],
1354 val
= bytein(sp
->cfg_reg
+ CARD_ALE
) & 0x08;
1357 "Elsa: Microlink S0 bus power bad\n");
1360 "No Elsa Microlink found\n");
1363 } else if (sp
->typ
== ISDN_CTYPE_ELSA_QS1000
) {
1364 sp
->cfg_reg
= card
->para
[1];
1365 sp
->irq
= card
->para
[0];
1366 sp
->subtyp
= ELSA_QS1000
;
1368 "Elsa: %s found at 0x%x IRQ %d\n",
1369 Elsa_Types
[sp
->subtyp
],
1375 #ifdef CONFIG_HISAX_ELSA_PCMCIA
1376 if (sp
->typ
== ISDN_CTYPE_ELSA_QS1000
) {
1377 sp
->cfg_reg
= card
->para
[1];
1378 sp
->irq
= card
->para
[0];
1379 sp
->subtyp
= ELSA_PCMCIA
;
1381 "Elsa: %s found at 0x%x IRQ %d\n",
1382 Elsa_Types
[sp
->subtyp
],
1389 switch (sp
->subtyp
) {
1413 "Unknown ELSA subtype %d\n", sp
->subtyp
);
1417 if (check_region((sp
->cfg_reg
), bytecnt
)) {
1419 "HiSax: %s config port %x-%x already in use\n",
1420 CardType
[card
->typ
],
1422 sp
->cfg_reg
+ bytecnt
);
1425 request_region(sp
->cfg_reg
, bytecnt
, "elsa isdn");
1429 #ifdef CONFIG_HISAX_ELSA_PCC
1430 byteout(sp
->cfg_reg
+ CARD_TRIG_IRQ
, 0xff);
1431 byteout(sp
->cfg_reg
+ CARD_START_TIMER
, 0);
1432 if (!TimerRun(sp
)) {
1433 byteout(sp
->cfg_reg
+ CARD_START_TIMER
, 0); /* 2. Versuch */
1434 if (!TimerRun(sp
)) {
1436 "Elsa: timer do not start\n");
1437 release_io_elsa(card
);
1443 HZDELAY(1); /* wait >=10 ms */
1444 restore_flags(flags
);
1446 printk(KERN_WARNING
"Elsa: timer do not run down\n");
1447 release_io_elsa(card
);
1450 printk(KERN_INFO
"Elsa: timer OK; resetting card\n");
1453 verA
= readhscx(sp
->cfg_reg
, 0, HSCX_VSTR
) & 0xf;
1454 verB
= readhscx(sp
->cfg_reg
, 1, HSCX_VSTR
) & 0xf;
1455 printk(KERN_INFO
"Elsa: HSCX version A: %s B: %s\n",
1456 HscxVersion(verA
), HscxVersion(verB
));
1457 val
= readisac(sp
->cfg_reg
, ISAC_RBCH
);
1458 printk(KERN_INFO
"Elsa: ISAC %s\n",
1461 #ifdef CONFIG_HISAX_ELSA_PCMCIA
1462 if ((verA
== 0) | (verA
== 0xf) | (verB
== 0) | (verB
== 0xf)) {
1464 "Elsa: wrong HSCX versions check IO address\n");
1465 release_io_elsa(card
);
1470 #ifdef CONFIG_HISAX_ELSA_PCC
1471 if (sp
->subtyp
== ELSA_PC
) {
1472 val
= readitac(sp
->cfg_reg
, ITAC_SYS
);
1473 printk(KERN_INFO
"Elsa: ITAC version %s\n", ITACVer
[val
& 7]);
1474 writeitac(sp
->cfg_reg
, ITAC_ISEN
, 0);
1475 writeitac(sp
->cfg_reg
, ITAC_RFIE
, 0);
1476 writeitac(sp
->cfg_reg
, ITAC_XFIE
, 0);
1477 writeitac(sp
->cfg_reg
, ITAC_SCIE
, 0);
1478 writeitac(sp
->cfg_reg
, ITAC_STIE
, 0);
1481 sp
->modehscx
= &modehscx
;
1482 sp
->ph_command
= &ph_command
;
1483 sp
->hscx_fill_fifo
= &hscx_fill_fifo
;
1484 sp
->isac_fill_fifo
= &isac_fill_fifo
;