1 /* $Id: teles0.c,v 1.8 1997/04/13 19:54:04 keil Exp $
3 * teles0.c low level stuff for Teles Memory IO isdn cards
4 * based on the teles driver from Jan den Ouden
6 * Author Karsten Keil (keil@temic-ech.spacenet.de)
8 * Thanks to Jan den Ouden
13 * Revision 1.8 1997/04/13 19:54:04 keil
14 * Change in IRQ check delay for SMP
16 * Revision 1.7 1997/04/06 22:54:04 keil
19 * Revision 1.6 1997/01/27 15:52:18 keil
22 * Revision 1.5 1997/01/21 22:25:59 keil
25 * Revision 1.4 1996/11/05 19:41:27 keil
26 * more changes for 2.1
28 * Revision 1.3 1996/10/30 10:22:58 keil
29 * Changes for 2.1 kernels
31 * Revision 1.2 1996/10/27 22:08:34 keil
34 * Revision 1.1 1996/10/13 20:04:58 keil
40 #define __NO_VERSION__
45 #include <linux/kernel_stat.h>
47 extern const char *CardType
[];
49 const char *teles0_revision
= "$Revision: 1.8 $";
51 #define byteout(addr,val) outb_p(val,addr)
52 #define bytein(addr) inb_p(addr)
55 readisac(unsigned int adr
, u_char off
)
57 return readb(adr
+ 0x120 + ((off
& 1) ? 0x1ff : 0) + off
);
61 writeisac(unsigned int adr
, u_char off
, u_char data
)
63 writeb(data
, adr
+ 0x120 + ((off
& 1) ? 0x1ff : 0) + off
);
68 readhscx(unsigned int adr
, int hscx
, u_char off
)
70 return readb(adr
+ (hscx
? 0x1e0 : 0x1a0) +
71 ((off
& 1) ? 0x1ff : 0) + off
);
75 writehscx(unsigned int adr
, int hscx
, u_char off
, u_char data
)
77 writeb(data
, adr
+ (hscx
? 0x1e0 : 0x1a0) +
78 ((off
& 1) ? 0x1ff : 0) + off
);
82 read_fifo_isac(unsigned int adr
, u_char
* data
, int size
)
85 register u_char
*ad
= (u_char
*) (adr
+ 0x100);
86 for (i
= 0; i
< size
; i
++)
91 write_fifo_isac(unsigned int adr
, u_char
* data
, int size
)
94 register u_char
*ad
= (u_char
*) (adr
+ 0x100);
95 for (i
= 0; i
< size
; i
++)
100 read_fifo_hscx(unsigned int adr
, int hscx
, u_char
* data
, int size
)
103 register u_char
*ad
= (u_char
*) (adr
+ (hscx
? 0x1c0 : 0x180));
104 for (i
= 0; i
< size
; i
++)
109 write_fifo_hscx(unsigned int adr
, int hscx
, u_char
* data
, int size
)
112 register u_char
*ad
= (u_char
*) (adr
+ (hscx
? 0x1c0 : 0x180));
113 for (i
= 0; i
< size
; i
++)
117 waitforCEC(int adr
, int hscx
)
121 while ((readhscx(adr
, hscx
, HSCX_STAR
) & 0x04) && to
) {
126 printk(KERN_WARNING
"Teles0: waitforCEC timeout\n");
131 waitforXFW(int adr
, int hscx
)
135 while ((!(readhscx(adr
, hscx
, HSCX_STAR
) & 0x44) == 0x40) && to
) {
140 printk(KERN_WARNING
"Teles0: waitforXFW timeout\n");
144 writehscxCMDR(int adr
, int hscx
, u_char data
)
150 waitforCEC(adr
, hscx
);
151 writehscx(adr
, hscx
, HSCX_CMDR
, data
);
152 restore_flags(flags
);
156 * fast interrupt here
161 hscxreport(struct IsdnCardState
*sp
, int hscx
)
163 printk(KERN_DEBUG
"HSCX %d\n", hscx
);
164 printk(KERN_DEBUG
"ISTA %x\n", readhscx(sp
->membase
, hscx
, HSCX_ISTA
));
165 printk(KERN_DEBUG
"STAR %x\n", readhscx(sp
->membase
, hscx
, HSCX_STAR
));
166 printk(KERN_DEBUG
"EXIR %x\n", readhscx(sp
->membase
, hscx
, HSCX_EXIR
));
170 teles0_report(struct IsdnCardState
*sp
)
172 printk(KERN_DEBUG
"ISAC\n");
173 printk(KERN_DEBUG
"ISTA %x\n", readisac(sp
->membase
, ISAC_ISTA
));
174 printk(KERN_DEBUG
"STAR %x\n", readisac(sp
->membase
, ISAC_STAR
));
175 printk(KERN_DEBUG
"EXIR %x\n", readisac(sp
->membase
, ISAC_EXIR
));
181 * HSCX stuff goes here
185 hscx_empty_fifo(struct HscxState
*hsp
, int count
)
188 struct IsdnCardState
*sp
= hsp
->sp
;
191 if ((sp
->debug
& L1_DEB_HSCX
) && !(sp
->debug
& L1_DEB_HSCX_FIFO
))
192 debugl1(sp
, "hscx_empty_fifo");
194 if (hsp
->rcvidx
+ count
> HSCX_BUFMAX
) {
195 if (sp
->debug
& L1_DEB_WARN
)
196 debugl1(sp
, "hscx_empty_fifo: incoming packet too large");
197 writehscxCMDR(sp
->membase
, hsp
->hscx
, 0x80);
201 ptr
= hsp
->rcvbuf
+ hsp
->rcvidx
;
202 hsp
->rcvidx
+= count
;
205 read_fifo_hscx(sp
->membase
, hsp
->hscx
, ptr
, count
);
206 writehscxCMDR(sp
->membase
, hsp
->hscx
, 0x80);
207 restore_flags(flags
);
208 if (sp
->debug
& L1_DEB_HSCX_FIFO
) {
212 t
+= sprintf(t
, "hscx_empty_fifo %c cnt %d",
213 hsp
->hscx
? 'B' : 'A', count
);
214 QuickHex(t
, ptr
, count
);
220 hscx_fill_fifo(struct HscxState
*hsp
)
222 struct IsdnCardState
*sp
= hsp
->sp
;
227 if ((sp
->debug
& L1_DEB_HSCX
) && !(sp
->debug
& L1_DEB_HSCX_FIFO
))
228 debugl1(sp
, "hscx_fill_fifo");
232 if (hsp
->tx_skb
->len
<= 0)
235 more
= (hsp
->mode
== 1) ? 1 : 0;
236 if (hsp
->tx_skb
->len
> 32) {
240 count
= hsp
->tx_skb
->len
;
242 waitforXFW(sp
->membase
, hsp
->hscx
);
245 ptr
= hsp
->tx_skb
->data
;
246 skb_pull(hsp
->tx_skb
, count
);
247 hsp
->tx_cnt
-= count
;
249 write_fifo_hscx(sp
->membase
, hsp
->hscx
, ptr
, count
);
250 writehscxCMDR(sp
->membase
, hsp
->hscx
, more
? 0x8 : 0xa);
251 restore_flags(flags
);
252 if (sp
->debug
& L1_DEB_HSCX_FIFO
) {
256 t
+= sprintf(t
, "hscx_fill_fifo %c cnt %d",
257 hsp
->hscx
? 'B' : 'A', count
);
258 QuickHex(t
, ptr
, count
);
264 hscx_interrupt(struct IsdnCardState
*sp
, u_char val
, u_char hscx
)
267 struct HscxState
*hsp
= sp
->hs
+ hscx
;
275 if (val
& 0x80) { /* RME */
277 r
= readhscx(sp
->membase
, hsp
->hscx
, HSCX_RSTA
);
278 if ((r
& 0xf0) != 0xa0) {
280 if (sp
->debug
& L1_DEB_WARN
)
281 debugl1(sp
, "HSCX invalid frame");
282 if ((r
& 0x40) && hsp
->mode
)
283 if (sp
->debug
& L1_DEB_WARN
) {
284 sprintf(tmp
, "HSCX RDO mode=%d",
289 if (sp
->debug
& L1_DEB_WARN
)
290 debugl1(sp
, "HSCX CRC error");
291 writehscxCMDR(sp
->membase
, hsp
->hscx
, 0x80);
293 count
= readhscx(sp
->membase
, hsp
->hscx
, HSCX_RBCL
) & 0x1f;
296 hscx_empty_fifo(hsp
, count
);
297 if ((count
= hsp
->rcvidx
- 1) > 0) {
298 if (!(skb
= dev_alloc_skb(count
)))
299 printk(KERN_WARNING
"AVM: receive out of memory\n");
301 memcpy(skb_put(skb
, count
), hsp
->rcvbuf
, count
);
302 skb_queue_tail(&hsp
->rqueue
, skb
);
307 hscx_sched_event(hsp
, HSCX_RCVBUFREADY
);
309 if (val
& 0x40) { /* RPF */
310 hscx_empty_fifo(hsp
, 32);
311 if (hsp
->mode
== 1) {
312 /* receive audio data */
313 if (!(skb
= dev_alloc_skb(32)))
314 printk(KERN_WARNING
"AVM: receive out of memory\n");
316 memcpy(skb_put(skb
, 32), hsp
->rcvbuf
, 32);
317 skb_queue_tail(&hsp
->rqueue
, skb
);
320 hscx_sched_event(hsp
, HSCX_RCVBUFREADY
);
323 if (val
& 0x10) { /* XPR */
325 if (hsp
->tx_skb
->len
) {
329 SET_SKB_FREE(hsp
->tx_skb
);
330 dev_kfree_skb(hsp
->tx_skb
, FREE_WRITE
);
332 if (hsp
->st
->l4
.l1writewakeup
)
333 hsp
->st
->l4
.l1writewakeup(hsp
->st
);
336 if ((hsp
->tx_skb
= skb_dequeue(&hsp
->squeue
))) {
340 hscx_sched_event(hsp
, HSCX_XMTBUFREADY
);
345 * ISAC stuff goes here
349 isac_empty_fifo(struct IsdnCardState
*sp
, int count
)
354 if ((sp
->debug
& L1_DEB_ISAC
) && !(sp
->debug
& L1_DEB_ISAC_FIFO
))
355 debugl1(sp
, "isac_empty_fifo");
357 if ((sp
->rcvidx
+ count
) >= MAX_DFRAME_LEN
) {
358 if (sp
->debug
& L1_DEB_WARN
) {
360 sprintf(tmp
, "isac_empty_fifo overrun %d",
364 writeisac(sp
->membase
, ISAC_CMDR
, 0x80);
368 ptr
= sp
->rcvbuf
+ sp
->rcvidx
;
372 read_fifo_isac(sp
->membase
, ptr
, count
);
373 writeisac(sp
->membase
, ISAC_CMDR
, 0x80);
374 restore_flags(flags
);
375 if (sp
->debug
& L1_DEB_ISAC_FIFO
) {
379 t
+= sprintf(t
, "isac_empty_fifo cnt %d", count
);
380 QuickHex(t
, ptr
, count
);
386 isac_fill_fifo(struct IsdnCardState
*sp
)
392 if ((sp
->debug
& L1_DEB_ISAC
) && !(sp
->debug
& L1_DEB_ISAC_FIFO
))
393 debugl1(sp
, "isac_fill_fifo");
398 count
= sp
->tx_skb
->len
;
409 ptr
= sp
->tx_skb
->data
;
410 skb_pull(sp
->tx_skb
, count
);
412 write_fifo_isac(sp
->membase
, ptr
, count
);
413 writeisac(sp
->membase
, ISAC_CMDR
, more
? 0x8 : 0xa);
414 restore_flags(flags
);
415 if (sp
->debug
& L1_DEB_ISAC_FIFO
) {
419 t
+= sprintf(t
, "isac_fill_fifo cnt %d", count
);
420 QuickHex(t
, ptr
, count
);
426 ph_command(struct IsdnCardState
*sp
, unsigned int command
)
428 if (sp
->debug
& L1_DEB_ISAC
) {
430 sprintf(tmp
, "ph_command %d", command
);
433 writeisac(sp
->membase
, ISAC_CIX0
, (command
<< 2) | 3);
437 isac_interrupt(struct IsdnCardState
*sp
, u_char val
)
444 if (sp
->debug
& L1_DEB_ISAC
) {
445 sprintf(tmp
, "ISAC interrupt %x", val
);
448 if (val
& 0x80) { /* RME */
449 exval
= readisac(sp
->membase
, ISAC_RSTA
);
450 if ((exval
& 0x70) != 0x20) {
452 if (sp
->debug
& L1_DEB_WARN
)
453 debugl1(sp
, "ISAC RDO");
455 if (sp
->debug
& L1_DEB_WARN
)
456 debugl1(sp
, "ISAC CRC error");
457 writeisac(sp
->membase
, ISAC_CMDR
, 0x80);
459 count
= readisac(sp
->membase
, ISAC_RBCL
) & 0x1f;
462 isac_empty_fifo(sp
, count
);
463 if ((count
= sp
->rcvidx
) > 0) {
464 if (!(skb
= alloc_skb(count
, GFP_ATOMIC
)))
465 printk(KERN_WARNING
"AVM: D receive out of memory\n");
467 memcpy(skb_put(skb
, count
), sp
->rcvbuf
, count
);
468 skb_queue_tail(&sp
->rq
, skb
);
473 isac_sched_event(sp
, ISAC_RCVBUFREADY
);
475 if (val
& 0x40) { /* RPF */
476 isac_empty_fifo(sp
, 32);
478 if (val
& 0x20) { /* RSC */
480 if (sp
->debug
& L1_DEB_WARN
)
481 debugl1(sp
, "ISAC RSC interrupt");
483 if (val
& 0x10) { /* XPR */
485 if (sp
->tx_skb
->len
) {
489 SET_SKB_FREE(sp
->tx_skb
);
490 dev_kfree_skb(sp
->tx_skb
, FREE_WRITE
);
494 if ((sp
->tx_skb
= skb_dequeue(&sp
->sq
))) {
498 isac_sched_event(sp
, ISAC_XMTBUFREADY
);
501 if (val
& 0x04) { /* CISQ */
502 sp
->ph_state
= (readisac(sp
->membase
, ISAC_CIX0
) >> 2)
504 if (sp
->debug
& L1_DEB_ISAC
) {
505 sprintf(tmp
, "l1state %d", sp
->ph_state
);
510 if (val
& 0x02) { /* SIN */
512 if (sp
->debug
& L1_DEB_WARN
)
513 debugl1(sp
, "ISAC SIN interrupt");
515 if (val
& 0x01) { /* EXI */
516 exval
= readisac(sp
->membase
, ISAC_EXIR
);
517 if (sp
->debug
& L1_DEB_WARN
) {
518 sprintf(tmp
, "ISAC EXIR %02x", exval
);
525 hscx_int_main(struct IsdnCardState
*sp
, u_char val
)
529 struct HscxState
*hsp
;
535 exval
= readhscx(sp
->membase
, 1, HSCX_EXIR
);
540 /* Here we lost an TX interrupt, so
541 * restart transmitting the whole frame.
544 skb_push(hsp
->tx_skb
, hsp
->count
);
545 hsp
->tx_cnt
+= hsp
->count
;
548 writehscxCMDR(sp
->membase
, hsp
->hscx
, 0x01);
549 if (sp
->debug
& L1_DEB_WARN
) {
550 sprintf(tmp
, "HSCX B EXIR %x Lost TX", exval
);
554 } else if (sp
->debug
& L1_DEB_HSCX
) {
555 sprintf(tmp
, "HSCX B EXIR %x", exval
);
560 if (sp
->debug
& L1_DEB_HSCX
) {
561 sprintf(tmp
, "HSCX B interrupt %x", val
);
564 hscx_interrupt(sp
, val
, 1);
568 exval
= readhscx(sp
->membase
, 0, HSCX_EXIR
);
573 /* Here we lost an TX interrupt, so
574 * restart transmitting the whole frame.
577 skb_push(hsp
->tx_skb
, hsp
->count
);
578 hsp
->tx_cnt
+= hsp
->count
;
581 writehscxCMDR(sp
->membase
, hsp
->hscx
, 0x01);
582 if (sp
->debug
& L1_DEB_WARN
) {
583 sprintf(tmp
, "HSCX A EXIR %x Lost TX", exval
);
587 } else if (sp
->debug
& L1_DEB_HSCX
) {
588 sprintf(tmp
, "HSCX A EXIR %x", exval
);
593 exval
= readhscx(sp
->membase
, 0, HSCX_ISTA
);
594 if (sp
->debug
& L1_DEB_HSCX
) {
595 sprintf(tmp
, "HSCX A interrupt %x", exval
);
598 hscx_interrupt(sp
, exval
, 0);
603 telesS0_interrupt(int intno
, void *dev_id
, struct pt_regs
*regs
)
605 struct IsdnCardState
*sp
;
606 u_char val
, stat
= 0;
608 sp
= (struct IsdnCardState
*) dev_id
;
611 printk(KERN_WARNING
"Teles0: Spurious interrupt!\n");
614 val
= readhscx(sp
->membase
, 1, HSCX_ISTA
);
617 hscx_int_main(sp
, val
);
620 val
= readisac(sp
->membase
, ISAC_ISTA
);
623 isac_interrupt(sp
, val
);
626 val
= readhscx(sp
->membase
, 1, HSCX_ISTA
);
628 if (sp
->debug
& L1_DEB_HSCX
)
629 debugl1(sp
, "HSCX IntStat after IntRoutine");
632 val
= readisac(sp
->membase
, ISAC_ISTA
);
634 if (sp
->debug
& L1_DEB_ISAC
)
635 debugl1(sp
, "ISAC IntStat after IntRoutine");
639 writehscx(sp
->membase
, 0, HSCX_MASK
, 0xFF);
640 writehscx(sp
->membase
, 1, HSCX_MASK
, 0xFF);
641 writehscx(sp
->membase
, 0, HSCX_MASK
, 0x0);
642 writehscx(sp
->membase
, 1, HSCX_MASK
, 0x0);
645 writeisac(sp
->membase
, ISAC_MASK
, 0xFF);
646 writeisac(sp
->membase
, ISAC_MASK
, 0x0);
652 initisac(struct IsdnCardState
*sp
)
654 unsigned int adr
= sp
->membase
;
656 /* 16.0 IOM 1 Mode */
657 writeisac(adr
, ISAC_MASK
, 0xff);
658 writeisac(adr
, ISAC_ADF2
, 0x0);
659 writeisac(adr
, ISAC_SPCR
, 0xa);
660 writeisac(adr
, ISAC_ADF1
, 0x2);
661 writeisac(adr
, ISAC_STCR
, 0x70);
662 writeisac(adr
, ISAC_MODE
, 0xc9);
663 writeisac(adr
, ISAC_CMDR
, 0x41);
664 writeisac(adr
, ISAC_CIX0
, (1 << 2) | 3);
665 writeisac(adr
, ISAC_MASK
, 0xff);
666 writeisac(adr
, ISAC_MASK
, 0x0);
670 modehscx(struct HscxState
*hs
, int mode
, int ichan
)
672 struct IsdnCardState
*sp
= hs
->sp
;
675 if (sp
->debug
& L1_DEB_HSCX
) {
677 sprintf(tmp
, "hscx %c mode %d ichan %d",
678 'A' + hscx
, mode
, ichan
);
682 writehscx(sp
->membase
, hscx
, HSCX_CCR1
, 0x85);
683 writehscx(sp
->membase
, hscx
, HSCX_XAD1
, 0xFF);
684 writehscx(sp
->membase
, hscx
, HSCX_XAD2
, 0xFF);
685 writehscx(sp
->membase
, hscx
, HSCX_RAH2
, 0xFF);
686 writehscx(sp
->membase
, hscx
, HSCX_XBCH
, 0x0);
688 /* Switch IOM 1 SSI */
694 writehscx(sp
->membase
, hscx
, HSCX_CCR2
, 0x30);
695 writehscx(sp
->membase
, hscx
, HSCX_TSAX
, 0xff);
696 writehscx(sp
->membase
, hscx
, HSCX_TSAR
, 0xff);
697 writehscx(sp
->membase
, hscx
, HSCX_XCCR
, 7);
698 writehscx(sp
->membase
, hscx
, HSCX_RCCR
, 7);
699 writehscx(sp
->membase
, hscx
, HSCX_MODE
, 0x84);
703 writehscx(sp
->membase
, hscx
, HSCX_CCR2
, 0x30);
704 writehscx(sp
->membase
, hscx
, HSCX_TSAX
, 0x7);
705 writehscx(sp
->membase
, hscx
, HSCX_TSAR
, 0x7);
706 writehscx(sp
->membase
, hscx
, HSCX_XCCR
, 7);
707 writehscx(sp
->membase
, hscx
, HSCX_RCCR
, 7);
709 writehscx(sp
->membase
, hscx
, HSCX_CCR2
, 0x30);
710 writehscx(sp
->membase
, hscx
, HSCX_TSAX
, 0x3);
711 writehscx(sp
->membase
, hscx
, HSCX_TSAR
, 0x3);
712 writehscx(sp
->membase
, hscx
, HSCX_XCCR
, 7);
713 writehscx(sp
->membase
, hscx
, HSCX_RCCR
, 7);
715 writehscx(sp
->membase
, hscx
, HSCX_MODE
, 0xe4);
716 writehscx(sp
->membase
, hscx
, HSCX_CMDR
, 0x41);
720 writehscx(sp
->membase
, hscx
, HSCX_CCR2
, 0x30);
721 writehscx(sp
->membase
, hscx
, HSCX_TSAX
, 0x7);
722 writehscx(sp
->membase
, hscx
, HSCX_TSAR
, 0x7);
723 writehscx(sp
->membase
, hscx
, HSCX_XCCR
, 7);
724 writehscx(sp
->membase
, hscx
, HSCX_RCCR
, 7);
726 writehscx(sp
->membase
, hscx
, HSCX_CCR2
, 0x30);
727 writehscx(sp
->membase
, hscx
, HSCX_TSAX
, 0x3);
728 writehscx(sp
->membase
, hscx
, HSCX_TSAR
, 0x3);
729 writehscx(sp
->membase
, hscx
, HSCX_XCCR
, 7);
730 writehscx(sp
->membase
, hscx
, HSCX_RCCR
, 7);
732 writehscx(sp
->membase
, hscx
, HSCX_MODE
, 0x8c);
733 writehscx(sp
->membase
, hscx
, HSCX_CMDR
, 0x41);
736 writehscx(sp
->membase
, hscx
, HSCX_ISTA
, 0x00);
740 release_io_teles0(struct IsdnCard
*card
)
742 if (card
->sp
->cfg_reg
)
743 release_region(card
->sp
->cfg_reg
, 8);
747 clear_pending_ints(struct IsdnCardState
*sp
)
752 val
= readhscx(sp
->membase
, 1, HSCX_ISTA
);
753 sprintf(tmp
, "HSCX B ISTA %x", val
);
756 val
= readhscx(sp
->membase
, 1, HSCX_EXIR
);
757 sprintf(tmp
, "HSCX B EXIR %x", val
);
759 } else if (val
& 0x02) {
760 val
= readhscx(sp
->membase
, 0, HSCX_EXIR
);
761 sprintf(tmp
, "HSCX A EXIR %x", val
);
764 val
= readhscx(sp
->membase
, 0, HSCX_ISTA
);
765 sprintf(tmp
, "HSCX A ISTA %x", val
);
767 val
= readhscx(sp
->membase
, 1, HSCX_STAR
);
768 sprintf(tmp
, "HSCX B STAR %x", val
);
770 val
= readhscx(sp
->membase
, 0, HSCX_STAR
);
771 sprintf(tmp
, "HSCX A STAR %x", val
);
773 val
= readisac(sp
->membase
, ISAC_STAR
);
774 sprintf(tmp
, "ISAC STAR %x", val
);
776 val
= readisac(sp
->membase
, ISAC_MODE
);
777 sprintf(tmp
, "ISAC MODE %x", val
);
779 val
= readisac(sp
->membase
, ISAC_ADF2
);
780 sprintf(tmp
, "ISAC ADF2 %x", val
);
782 val
= readisac(sp
->membase
, ISAC_ISTA
);
783 sprintf(tmp
, "ISAC ISTA %x", val
);
786 val
= readisac(sp
->membase
, ISAC_EXIR
);
787 sprintf(tmp
, "ISAC EXIR %x", val
);
789 } else if (val
& 0x04) {
790 val
= readisac(sp
->membase
, ISAC_CIR0
);
791 sprintf(tmp
, "ISAC CIR0 %x", val
);
794 writeisac(sp
->membase
, ISAC_MASK
, 0);
795 writeisac(sp
->membase
, ISAC_CMDR
, 0x41);
799 initteles0(struct IsdnCardState
*sp
)
805 sp
->counter
= kstat_irqs(sp
->irq
);
806 sprintf(tmp
, "IRQ %d count %d", sp
->irq
, sp
->counter
);
808 clear_pending_ints(sp
);
809 ret
= get_irq(sp
->cardnr
, &telesS0_interrupt
);
812 sp
->modehscx(sp
->hs
, 0, 0);
813 sp
->modehscx(sp
->hs
+ 1, 0, 0);
814 while (loop
++ < 10) {
815 /* At least 1-3 irqs must happen
816 * (one from HSCX A, one from HSCX B, 3rd from ISAC)
818 if (kstat_irqs(sp
->irq
) > sp
->counter
)
820 current
->state
= TASK_INTERRUPTIBLE
;
821 current
->timeout
= jiffies
+ 1;
824 sprintf(tmp
, "IRQ %d count %d", sp
->irq
,
825 kstat_irqs(sp
->irq
));
827 if (kstat_irqs(sp
->irq
) == sp
->counter
) {
829 "Teles0: IRQ(%d) getting no interrupts during init\n",
831 free_irq(sp
->irq
, sp
);
839 setup_teles0(struct IsdnCard
*card
)
841 u_char cfval
, val
, verA
, verB
;
842 struct IsdnCardState
*sp
= card
->sp
;
846 strcpy(tmp
, teles0_revision
);
847 printk(KERN_NOTICE
"HiSax: Teles 8.0/16.0 driver Rev. %s\n", HiSax_getrev(tmp
));
848 if ((sp
->typ
!= ISDN_CTYPE_16_0
) && (sp
->typ
!= ISDN_CTYPE_8_0
))
851 if (sp
->typ
== ISDN_CTYPE_16_0
)
852 sp
->cfg_reg
= card
->para
[2];
856 if (card
->para
[1] < 0x10000) {
859 "Teles0: membase configured DOSish, assuming 0x%lx\n",
860 (unsigned long) card
->para
[1]);
862 sp
->membase
= card
->para
[1];
863 sp
->irq
= card
->para
[0];
865 if (check_region((sp
->cfg_reg
), 8)) {
867 "HiSax: %s config port %x-%x already in use\n",
873 request_region(sp
->cfg_reg
, 8, "teles cfg");
905 cfval
|= ((card
->para
[1] >> 9) & 0xF0);
907 if ((val
= bytein(sp
->cfg_reg
+ 0)) != 0x51) {
908 printk(KERN_WARNING
"Teles0: 16.0 Byte at %x is %x\n",
909 sp
->cfg_reg
+ 0, val
);
910 release_region(sp
->cfg_reg
, 8);
913 if ((val
= bytein(sp
->cfg_reg
+ 1)) != 0x93) {
914 printk(KERN_WARNING
"Teles0: 16.0 Byte at %x is %x\n",
915 sp
->cfg_reg
+ 1, val
);
916 release_region(sp
->cfg_reg
, 8);
919 val
= bytein(sp
->cfg_reg
+ 2); /* 0x1e=without AB
923 if (val
!= 0x1e && val
!= 0x1f) {
924 printk(KERN_WARNING
"Teles0: 16.0 Byte at %x is %x\n",
925 sp
->cfg_reg
+ 2, val
);
926 release_region(sp
->cfg_reg
, 8);
930 byteout(sp
->cfg_reg
+ 4, cfval
);
932 HZDELAY(HZ
/ 10 + 1);
933 byteout(sp
->cfg_reg
+ 4, cfval
| 1);
934 HZDELAY(HZ
/ 10 + 1);
935 restore_flags(flags
);
938 "HiSax: %s config irq:%d mem:%x cfg:%x\n",
939 CardType
[sp
->typ
], sp
->irq
,
940 sp
->membase
, sp
->cfg_reg
);
941 verA
= readhscx(sp
->membase
, 0, HSCX_VSTR
) & 0xf;
942 verB
= readhscx(sp
->membase
, 1, HSCX_VSTR
) & 0xf;
943 printk(KERN_INFO
"Teles0: HSCX version A: %s B: %s\n",
944 HscxVersion(verA
), HscxVersion(verB
));
945 val
= readisac(sp
->membase
, ISAC_RBCH
);
946 printk(KERN_INFO
"Teles0: ISAC %s\n",
949 if ((verA
== 0) | (verA
== 0xf) | (verB
== 0) | (verB
== 0xf)) {
951 "Teles0: wrong HSCX versions check IO/MEM addresses\n");
952 release_io_teles0(card
);
956 writeb(0, sp
->membase
+ 0x80);
959 writeb(1, sp
->membase
+ 0x80);
961 restore_flags(flags
);
963 sp
->modehscx
= &modehscx
;
964 sp
->ph_command
= &ph_command
;
965 sp
->hscx_fill_fifo
= &hscx_fill_fifo
;
966 sp
->isac_fill_fifo
= &isac_fill_fifo
;