1 /* $Id: isar.c,v 1.17.6.5 2001/09/23 11:51:33 keil Exp $
3 * isar.c ISAR (Siemens PSB 7110) specific routines
5 * Author Karsten Keil (keil@isdn4linux.de)
7 * This file is (c) under GNU General Public License
11 #include <linux/init.h>
15 #include <linux/interrupt.h>
17 #define DBG_LOADFIRM 0
18 #define DUMP_MBOXFRAME 2
24 const u8 faxmodulation_s
[] = "3,24,48,72,73,74,96,97,98,121,122,145,146";
25 const u8 faxmodulation
[] = {3,24,48,72,73,74,96,97,98,121,122,145,146};
28 static void __isar_setup(struct IsdnCardState
*cs
);
29 static void isar_pump_cmd(struct BCState
*bcs
, u8 cmd
, u8 para
);
30 static inline void ll_deliver_faxstat(struct BCState
*bcs
, u8 status
);
31 static spinlock_t isar_lock
= SPIN_LOCK_UNLOCKED
;
34 isar_read_reg(struct IsdnCardState
*cs
, int mode
, u8 addr
)
36 return cs
->bc_hw_ops
->read_reg(cs
, mode
, addr
);
40 isar_write_reg(struct IsdnCardState
*cs
, int mode
, u8 addr
, u8 val
)
42 cs
->bc_hw_ops
->write_reg(cs
, mode
, addr
, val
);
46 waitforHIA(struct IsdnCardState
*cs
, int timeout
)
49 while ((isar_read_reg(cs
, 0, ISAR_HIA
) & 1) && timeout
) {
54 printk(KERN_WARNING
"HiSax: ISAR waitforHIA timeout\n");
60 sendmsg(struct IsdnCardState
*cs
, u8 his
, u8 creg
, u8 len
,
66 if (!waitforHIA(cs
, 4000))
69 if (cs
->debug
& L1_DEB_HSCX
)
70 debugl1(cs
, "sendmsg(%02x,%02x,%d)", his
, creg
, len
);
72 spin_lock_irqsave(&isar_lock
, flags
);
73 isar_write_reg(cs
, 0, ISAR_CTRL_H
, creg
);
74 isar_write_reg(cs
, 0, ISAR_CTRL_L
, len
);
75 isar_write_reg(cs
, 0, ISAR_WADR
, 0);
77 isar_write_reg(cs
, 1, ISAR_MBOX
, msg
[0]);
79 isar_write_reg(cs
, 2, ISAR_MBOX
, msg
[i
]);
81 if (cs
->debug
& L1_DEB_HSCX_FIFO
) {
87 t
+= sprintf(t
, "sendmbox cnt %d", len
);
88 QuickHex(t
, &msg
[len
-i
], (i
>64) ? 64:i
);
95 isar_write_reg(cs
, 1, ISAR_HIS
, his
);
96 spin_unlock_irqrestore(&isar_lock
, flags
);
97 waitforHIA(cs
, 10000);
101 /* Call only with IRQ disabled !!! */
103 rcv_mbox(struct IsdnCardState
*cs
, struct isar_reg
*ireg
, u8
*msg
)
107 isar_write_reg(cs
, 1, ISAR_RADR
, 0);
108 if (msg
&& ireg
->clsb
) {
109 msg
[0] = isar_read_reg(cs
, 1, ISAR_MBOX
);
110 for (i
=1; i
< ireg
->clsb
; i
++)
111 msg
[i
] = isar_read_reg(cs
, 2, ISAR_MBOX
);
113 if (cs
->debug
& L1_DEB_HSCX_FIFO
) {
119 t
+= sprintf(t
, "rcv_mbox cnt %d", ireg
->clsb
);
120 QuickHex(t
, &msg
[ireg
->clsb
-i
], (i
>64) ? 64:i
);
127 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
130 /* Call only with IRQ disabled !!! */
132 get_irq_infos(struct IsdnCardState
*cs
, struct isar_reg
*ireg
)
134 ireg
->iis
= isar_read_reg(cs
, 1, ISAR_IIS
);
135 ireg
->cmsb
= isar_read_reg(cs
, 1, ISAR_CTRL_H
);
136 ireg
->clsb
= isar_read_reg(cs
, 1, ISAR_CTRL_L
);
138 if (cs
->debug
& L1_DEB_HSCX
)
139 debugl1(cs
, "rcv_mbox(%02x,%02x,%d)", ireg
->iis
, ireg
->cmsb
,
145 waitrecmsg(struct IsdnCardState
*cs
, u8
*len
,
146 u8
*msg
, int maxdelay
)
150 struct isar_reg
*ir
= cs
->bcs
[0].hw
.isar
.reg
;
153 while((!(isar_read_reg(cs
, 0, ISAR_IRQBIT
) & ISAR_IRQSTA
)) &&
154 (timeout
++ < maxdelay
))
156 if (timeout
>= maxdelay
) {
157 printk(KERN_WARNING
"isar recmsg IRQSTA timeout\n");
160 spin_lock_irqsave(&isar_lock
, flags
);
161 get_irq_infos(cs
, ir
);
162 rcv_mbox(cs
, ir
, msg
);
164 spin_unlock_irqrestore(&isar_lock
, flags
);
169 ISARVersion(struct IsdnCardState
*cs
, char *s
)
172 u8 msg
[] = ISAR_MSG_HWVER
;
177 cs
->card_ops
->reset(cs
);
178 /* disable ISAR IRQ */
179 isar_write_reg(cs
, 0, ISAR_IRQBIT
, 0);
181 cs
->debug
&= ~(L1_DEB_HSCX
| L1_DEB_HSCX_FIFO
);
182 if (!sendmsg(cs
, ISAR_HIS_VNR
, 0, 3, msg
))
184 if (!waitrecmsg(cs
, &len
, tmp
, 100000))
187 if (cs
->bcs
[0].hw
.isar
.reg
->iis
== ISAR_IIS_VNR
) {
190 printk(KERN_INFO
"%s ISAR version %d\n", s
, ver
);
199 isar_load_firmware(struct IsdnCardState
*cs
, u8
*buf
)
201 int ret
, size
, cnt
, debug
;
203 u_short sadr
, left
, *sp
;
205 u8
*msg
, *tmpmsg
, *mp
, tmp
[64];
206 struct isar_reg
*ireg
= cs
->bcs
[0].hw
.isar
.reg
;
208 struct {u_short sadr
;
213 #define BLK_HEAD_SIZE 6
214 if (1 != (ret
= ISARVersion(cs
, "Testing"))) {
215 printk(KERN_ERR
"isar_load_firmware wrong isar version %d\n", ret
);
220 cs
->debug
&= ~(L1_DEB_HSCX
| L1_DEB_HSCX_FIFO
);
222 printk(KERN_DEBUG
"isar_load_firmware buf %#lx\n", (u_long
)buf
);
223 if ((ret
= verify_area(VERIFY_READ
, (void *) p
, sizeof(int)))) {
224 printk(KERN_ERR
"isar_load_firmware verify_area ret %d\n", ret
);
227 if ((ret
= copy_from_user(&size
, p
, sizeof(int)))) {
228 printk(KERN_ERR
"isar_load_firmware copy_from_user ret %d\n", ret
);
232 printk(KERN_DEBUG
"isar_load_firmware size: %d\n", size
);
233 if ((ret
= verify_area(VERIFY_READ
, (void *) p
, size
))) {
234 printk(KERN_ERR
"isar_load_firmware verify_area ret %d\n", ret
);
238 /* disable ISAR IRQ */
239 isar_write_reg(cs
, 0, ISAR_IRQBIT
, 0);
240 if (!(msg
= kmalloc(256, GFP_KERNEL
))) {
241 printk(KERN_ERR
"isar_load_firmware no buffer\n");
244 if (!(tmpmsg
= kmalloc(256, GFP_KERNEL
))) {
245 printk(KERN_ERR
"isar_load_firmware no tmp buffer\n");
250 if ((ret
= copy_from_user(&blk_head
, p
, BLK_HEAD_SIZE
))) {
251 printk(KERN_ERR
"isar_load_firmware copy_from_user ret %d\n", ret
);
256 sadr
= (blk_head
.sadr
& 0xff)*256 + blk_head
.sadr
/256;
257 blk_head
.sadr
= sadr
;
258 sadr
= (blk_head
.len
& 0xff)*256 + blk_head
.len
/256;
260 sadr
= (blk_head
.d_key
& 0xff)*256 + blk_head
.d_key
/256;
261 blk_head
.d_key
= sadr
;
262 #endif /* __BIG_ENDIAN */
263 cnt
+= BLK_HEAD_SIZE
;
265 printk(KERN_DEBUG
"isar firmware block (%#x,%5d,%#x)\n",
266 blk_head
.sadr
, blk_head
.len
, blk_head
.d_key
& 0xff);
267 sadr
= blk_head
.sadr
;
269 if (!sendmsg(cs
, ISAR_HIS_DKEY
, blk_head
.d_key
& 0xff, 0, NULL
)) {
270 printk(KERN_ERR
"isar sendmsg dkey failed\n");
271 ret
= 1;goto reterror
;
273 if (!waitrecmsg(cs
, &len
, tmp
, 100000)) {
274 printk(KERN_ERR
"isar waitrecmsg dkey failed\n");
275 ret
= 1;goto reterror
;
277 if ((ireg
->iis
!= ISAR_IIS_DKEY
) || ireg
->cmsb
|| len
) {
278 printk(KERN_ERR
"isar wrong dkey response (%x,%x,%x)\n",
279 ireg
->iis
, ireg
->cmsb
, len
);
280 ret
= 1;goto reterror
;
293 if ((ret
= copy_from_user(tmpmsg
, p
, nom
))) {
294 printk(KERN_ERR
"isar_load_firmware copy_from_user ret %d\n", ret
);
301 sp
= (u_short
*)tmpmsg
;
303 printk(KERN_DEBUG
"isar: load %3d words at %04x left %d\n",
314 #endif /* __BIG_ENDIAN */
318 if (!sendmsg(cs
, ISAR_HIS_FIRM
, 0, nom
, msg
)) {
319 printk(KERN_ERR
"isar sendmsg prog failed\n");
320 ret
= 1;goto reterror
;
322 if (!waitrecmsg(cs
, &len
, tmp
, 100000)) {
323 printk(KERN_ERR
"isar waitrecmsg prog failed\n");
324 ret
= 1;goto reterror
;
326 if ((ireg
->iis
!= ISAR_IIS_FIRM
) || ireg
->cmsb
|| len
) {
327 printk(KERN_ERR
"isar wrong prog response (%x,%x,%x)\n",
328 ireg
->iis
, ireg
->cmsb
, len
);
329 ret
= 1;goto reterror
;
332 printk(KERN_DEBUG
"isar firmware block %5d words loaded\n",
342 if (!sendmsg(cs
, ISAR_HIS_STDSP
, 0, 2, msg
)) {
343 printk(KERN_ERR
"isar sendmsg start dsp failed\n");
344 ret
= 1;goto reterror
;
346 if (!waitrecmsg(cs
, &len
, tmp
, 100000)) {
347 printk(KERN_ERR
"isar waitrecmsg start dsp failed\n");
348 ret
= 1;goto reterror
;
350 if ((ireg
->iis
!= ISAR_IIS_STDSP
) || ireg
->cmsb
|| len
) {
351 printk(KERN_ERR
"isar wrong start dsp response (%x,%x,%x)\n",
352 ireg
->iis
, ireg
->cmsb
, len
);
353 ret
= 1;goto reterror
;
355 printk(KERN_DEBUG
"isar start dsp success\n");
356 /* NORMAL mode entered */
357 /* Enable IRQs of ISAR */
358 isar_write_reg(cs
, 0, ISAR_IRQBIT
, ISAR_IRQSTA
);
359 cnt
= 1000; /* max 1s */
360 while ((!ireg
->bstat
) && cnt
) {
365 printk(KERN_ERR
"isar no general status event received\n");
366 ret
= 1;goto reterror
;
368 printk(KERN_DEBUG
"isar general status event %x\n",
376 if (!sendmsg(cs
, ISAR_HIS_DIAG
, ISAR_CTRL_STST
, 0, NULL
)) {
377 printk(KERN_ERR
"isar sendmsg self tst failed\n");
378 ret
= 1;goto reterror
;
380 cnt
= 10000; /* max 100 ms */
381 while ((ireg
->iis
!= ISAR_IIS_DIAG
) && cnt
) {
387 printk(KERN_ERR
"isar no self tst response\n");
388 ret
= 1;goto reterror
;
390 if ((ireg
->cmsb
== ISAR_CTRL_STST
) && (ireg
->clsb
== 1)
391 && (ireg
->par
[0] == 0)) {
392 printk(KERN_DEBUG
"isar selftest OK\n");
394 printk(KERN_DEBUG
"isar selftest not OK %x/%x/%x\n",
395 ireg
->cmsb
, ireg
->clsb
, ireg
->par
[0]);
396 ret
= 1;goto reterror
;
399 if (!sendmsg(cs
, ISAR_HIS_DIAG
, ISAR_CTRL_SWVER
, 0, NULL
)) {
400 printk(KERN_ERR
"isar RQST SVN failed\n");
401 ret
= 1;goto reterror
;
403 cnt
= 30000; /* max 300 ms */
404 while ((ireg
->iis
!= ISAR_IIS_DIAG
) && cnt
) {
410 printk(KERN_ERR
"isar no SVN response\n");
411 ret
= 1;goto reterror
;
413 if ((ireg
->cmsb
== ISAR_CTRL_SWVER
) && (ireg
->clsb
== 1))
414 printk(KERN_DEBUG
"isar software version %#x\n",
417 printk(KERN_ERR
"isar wrong swver response (%x,%x) cnt(%d)\n",
418 ireg
->cmsb
, ireg
->clsb
, cnt
);
419 ret
= 1;goto reterror
;
428 /* disable ISAR IRQ */
429 isar_write_reg(cs
, 0, ISAR_IRQBIT
, 0);
435 extern void BChannel_bh(struct BCState
*);
440 struct BCState
*bcs
= data
;
443 if (test_and_clear_bit(B_LL_NOCARRIER
, &bcs
->event
))
444 ll_deliver_faxstat(bcs
, ISDN_FAX_CLASS1_NOCARR
);
445 if (test_and_clear_bit(B_LL_CONNECT
, &bcs
->event
))
446 ll_deliver_faxstat(bcs
, ISDN_FAX_CLASS1_CONNECT
);
447 if (test_and_clear_bit(B_LL_OK
, &bcs
->event
))
448 ll_deliver_faxstat(bcs
, ISDN_FAX_CLASS1_OK
);
452 send_DLE_ETX(struct BCState
*bcs
)
454 u8 dleetx
[2] = {DLE
,ETX
};
457 if ((skb
= dev_alloc_skb(2))) {
458 memcpy(skb_put(skb
, 2), dleetx
, 2);
459 skb_queue_tail(&bcs
->rqueue
, skb
);
460 sched_b_event(bcs
, B_RCVBUFREADY
);
462 printk(KERN_WARNING
"HiSax: skb out of memory\n");
467 dle_count(unsigned char *buf
, int len
)
478 insert_dle(unsigned char *dest
, unsigned char *src
, int count
) {
479 /* <DLE> in input stream have to be flagged as <DLE><DLE> */
488 isar_rcv_frame(struct IsdnCardState
*cs
, struct BCState
*bcs
)
492 struct isar_reg
*ireg
= bcs
->hw
.isar
.reg
;
495 debugl1(cs
, "isar zero len frame");
496 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
501 debugl1(cs
, "isar mode 0 spurious IIS_RDATA %x/%x/%x",
502 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
503 printk(KERN_WARNING
"isar mode 0 spurious IIS_RDATA %x/%x/%x\n",
504 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
505 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
509 if ((skb
= dev_alloc_skb(ireg
->clsb
))) {
510 rcv_mbox(cs
, ireg
, (u8
*)skb_put(skb
, ireg
->clsb
));
511 skb_queue_tail(&bcs
->rqueue
, skb
);
512 sched_b_event(bcs
, B_RCVBUFREADY
);
514 printk(KERN_WARNING
"HiSax: skb out of memory\n");
515 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
519 if ((bcs
->hw
.isar
.rcvidx
+ ireg
->clsb
) > HSCX_BUFMAX
) {
520 if (cs
->debug
& L1_DEB_WARN
)
521 debugl1(cs
, "isar_rcv_frame: incoming packet too large");
522 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
523 bcs
->hw
.isar
.rcvidx
= 0;
524 } else if (ireg
->cmsb
& HDLC_ERROR
) {
525 if (cs
->debug
& L1_DEB_WARN
)
526 debugl1(cs
, "isar frame error %x len %d",
527 ireg
->cmsb
, ireg
->clsb
);
528 #ifdef ERROR_STATISTIC
529 if (ireg
->cmsb
& HDLC_ERR_RER
)
531 if (ireg
->cmsb
& HDLC_ERR_CER
)
534 bcs
->hw
.isar
.rcvidx
= 0;
535 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
537 if (ireg
->cmsb
& HDLC_FSD
)
538 bcs
->hw
.isar
.rcvidx
= 0;
539 ptr
= bcs
->hw
.isar
.rcvbuf
+ bcs
->hw
.isar
.rcvidx
;
540 bcs
->hw
.isar
.rcvidx
+= ireg
->clsb
;
541 rcv_mbox(cs
, ireg
, ptr
);
542 if (ireg
->cmsb
& HDLC_FED
) {
543 if (bcs
->hw
.isar
.rcvidx
< 3) { /* last 2 bytes are the FCS */
544 if (cs
->debug
& L1_DEB_WARN
)
545 debugl1(cs
, "isar frame to short %d",
546 bcs
->hw
.isar
.rcvidx
);
547 } else if (!(skb
= dev_alloc_skb(bcs
->hw
.isar
.rcvidx
-2))) {
548 printk(KERN_WARNING
"ISAR: receive out of memory\n");
550 memcpy(skb_put(skb
, bcs
->hw
.isar
.rcvidx
-2),
551 bcs
->hw
.isar
.rcvbuf
, bcs
->hw
.isar
.rcvidx
-2);
552 skb_queue_tail(&bcs
->rqueue
, skb
);
553 sched_b_event(bcs
, B_RCVBUFREADY
);
555 bcs
->hw
.isar
.rcvidx
= 0;
560 if (bcs
->hw
.isar
.state
!= STFAX_ACTIV
) {
561 if (cs
->debug
& L1_DEB_WARN
)
562 debugl1(cs
, "isar_rcv_frame: not ACTIV");
563 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
564 bcs
->hw
.isar
.rcvidx
= 0;
567 if (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FRM
) {
568 rcv_mbox(cs
, ireg
, bcs
->hw
.isar
.rcvbuf
);
569 bcs
->hw
.isar
.rcvidx
= ireg
->clsb
+
570 dle_count(bcs
->hw
.isar
.rcvbuf
, ireg
->clsb
);
571 if (cs
->debug
& L1_DEB_HSCX
)
572 debugl1(cs
, "isar_rcv_frame: raw(%d) dle(%d)",
573 ireg
->clsb
, bcs
->hw
.isar
.rcvidx
);
574 if ((skb
= dev_alloc_skb(bcs
->hw
.isar
.rcvidx
))) {
575 insert_dle((u8
*)skb_put(skb
, bcs
->hw
.isar
.rcvidx
),
576 bcs
->hw
.isar
.rcvbuf
, ireg
->clsb
);
577 skb_queue_tail(&bcs
->rqueue
, skb
);
578 sched_b_event(bcs
, B_RCVBUFREADY
);
579 if (ireg
->cmsb
& SART_NMD
) { /* ABORT */
580 if (cs
->debug
& L1_DEB_WARN
)
581 debugl1(cs
, "isar_rcv_frame: no more data");
582 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
583 bcs
->hw
.isar
.rcvidx
= 0;
585 sendmsg(cs
, SET_DPS(bcs
->hw
.isar
.dpath
) |
586 ISAR_HIS_PUMPCTRL
, PCTRL_CMD_ESC
,
588 bcs
->hw
.isar
.state
= STFAX_ESCAPE
;
589 sched_b_event(bcs
, B_LL_NOCARRIER
);
592 printk(KERN_WARNING
"HiSax: skb out of memory\n");
593 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
597 if (bcs
->hw
.isar
.cmd
!= PCTRL_CMD_FRH
) {
598 if (cs
->debug
& L1_DEB_WARN
)
599 debugl1(cs
, "isar_rcv_frame: unknown fax mode %x",
601 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
602 bcs
->hw
.isar
.rcvidx
= 0;
606 if ((bcs
->hw
.isar
.rcvidx
+ ireg
->clsb
) > HSCX_BUFMAX
) {
607 if (cs
->debug
& L1_DEB_WARN
)
608 debugl1(cs
, "isar_rcv_frame: incoming packet too large");
609 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
610 bcs
->hw
.isar
.rcvidx
= 0;
611 } else if (ireg
->cmsb
& HDLC_ERROR
) {
612 if (cs
->debug
& L1_DEB_WARN
)
613 debugl1(cs
, "isar frame error %x len %d",
614 ireg
->cmsb
, ireg
->clsb
);
615 bcs
->hw
.isar
.rcvidx
= 0;
616 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
618 if (ireg
->cmsb
& HDLC_FSD
)
619 bcs
->hw
.isar
.rcvidx
= 0;
620 ptr
= bcs
->hw
.isar
.rcvbuf
+ bcs
->hw
.isar
.rcvidx
;
621 bcs
->hw
.isar
.rcvidx
+= ireg
->clsb
;
622 rcv_mbox(cs
, ireg
, ptr
);
623 if (ireg
->cmsb
& HDLC_FED
) {
624 int len
= bcs
->hw
.isar
.rcvidx
+
625 dle_count(bcs
->hw
.isar
.rcvbuf
, bcs
->hw
.isar
.rcvidx
);
626 if (bcs
->hw
.isar
.rcvidx
< 3) { /* last 2 bytes are the FCS */
627 if (cs
->debug
& L1_DEB_WARN
)
628 debugl1(cs
, "isar frame to short %d",
629 bcs
->hw
.isar
.rcvidx
);
630 } else if (!(skb
= dev_alloc_skb(bcs
->hw
.isar
.rcvidx
))) {
631 printk(KERN_WARNING
"ISAR: receive out of memory\n");
633 insert_dle((u8
*)skb_put(skb
, len
),
635 bcs
->hw
.isar
.rcvidx
);
636 skb_queue_tail(&bcs
->rqueue
, skb
);
637 sched_b_event(bcs
, B_RCVBUFREADY
);
639 sched_b_event(bcs
, B_LL_OK
);
641 bcs
->hw
.isar
.rcvidx
= 0;
644 if (ireg
->cmsb
& SART_NMD
) { /* ABORT */
645 if (cs
->debug
& L1_DEB_WARN
)
646 debugl1(cs
, "isar_rcv_frame: no more data");
647 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
648 bcs
->hw
.isar
.rcvidx
= 0;
650 sendmsg(cs
, SET_DPS(bcs
->hw
.isar
.dpath
) |
651 ISAR_HIS_PUMPCTRL
, PCTRL_CMD_ESC
, 0, NULL
);
652 bcs
->hw
.isar
.state
= STFAX_ESCAPE
;
653 sched_b_event(bcs
, B_LL_NOCARRIER
);
657 printk(KERN_ERR
"isar_rcv_frame mode (%x)error\n", bcs
->mode
);
658 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
664 isar_fill_fifo(struct BCState
*bcs
)
666 struct IsdnCardState
*cs
= bcs
->cs
;
671 if ((cs
->debug
& L1_DEB_HSCX
) && !(cs
->debug
& L1_DEB_HSCX_FIFO
))
672 debugl1(cs
, "isar_fill_fifo");
675 if (bcs
->tx_skb
->len
<= 0)
677 if (!(bcs
->hw
.isar
.reg
->bstat
&
678 (bcs
->hw
.isar
.dpath
== 1 ? BSTAT_RDM1
: BSTAT_RDM2
)))
680 if (bcs
->tx_skb
->len
> bcs
->hw
.isar
.mml
) {
682 count
= bcs
->hw
.isar
.mml
;
684 count
= bcs
->tx_skb
->len
;
687 ptr
= bcs
->tx_skb
->data
;
690 if ((bcs
->mode
== L1_MODE_FAX
) &&
691 (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FTH
)) {
692 if (bcs
->tx_skb
->len
> 1) {
693 if ((ptr
[0]== 0xff) && (ptr
[1] == 0x13))
695 test_and_set_bit(BC_FLG_LASTDATA
,
700 skb_pull(bcs
->tx_skb
, count
);
701 bcs
->tx_cnt
-= count
;
705 printk(KERN_ERR
"isar_fill_fifo wrong mode 0\n");
709 sendmsg(cs
, SET_DPS(bcs
->hw
.isar
.dpath
) | ISAR_HIS_SDATA
,
713 sendmsg(cs
, SET_DPS(bcs
->hw
.isar
.dpath
) | ISAR_HIS_SDATA
,
717 if (bcs
->hw
.isar
.state
!= STFAX_ACTIV
) {
718 if (cs
->debug
& L1_DEB_WARN
)
719 debugl1(cs
, "isar_fill_fifo: not ACTIV");
720 } else if (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FTH
) {
721 sendmsg(cs
, SET_DPS(bcs
->hw
.isar
.dpath
) | ISAR_HIS_SDATA
,
723 } else if (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FTM
) {
724 sendmsg(cs
, SET_DPS(bcs
->hw
.isar
.dpath
) | ISAR_HIS_SDATA
,
727 if (cs
->debug
& L1_DEB_WARN
)
728 debugl1(cs
, "isar_fill_fifo: not FTH/FTM");
733 debugl1(cs
, "isar_fill_fifo mode(%x) error", bcs
->mode
);
734 printk(KERN_ERR
"isar_fill_fifo mode(%x) error\n", bcs
->mode
);
740 struct BCState
*sel_bcs_isar(struct IsdnCardState
*cs
, u8 dpath
)
742 if ((!dpath
) || (dpath
== 3))
744 if (cs
->bcs
[0].hw
.isar
.dpath
== dpath
)
746 if (cs
->bcs
[1].hw
.isar
.dpath
== dpath
)
752 send_frames(struct BCState
*bcs
)
755 if (bcs
->tx_skb
->len
) {
759 xmit_complete_b(bcs
);
760 if (bcs
->mode
== L1_MODE_FAX
) {
761 if (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FTH
) {
762 if (test_bit(BC_FLG_LASTDATA
, &bcs
->Flag
)) {
763 test_and_set_bit(BC_FLG_NMD_DATA
, &bcs
->Flag
);
765 } else if (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FTM
) {
766 if (test_bit(BC_FLG_DLEETX
, &bcs
->Flag
)) {
767 test_and_set_bit(BC_FLG_LASTDATA
, &bcs
->Flag
);
768 test_and_set_bit(BC_FLG_NMD_DATA
, &bcs
->Flag
);
775 if ((bcs
->tx_skb
= skb_dequeue(&bcs
->squeue
))) {
777 test_and_set_bit(BC_FLG_BUSY
, &bcs
->Flag
);
780 if (test_and_clear_bit(BC_FLG_DLEETX
, &bcs
->Flag
)) {
781 if (test_and_clear_bit(BC_FLG_LASTDATA
, &bcs
->Flag
)) {
782 if (test_and_clear_bit(BC_FLG_NMD_DATA
, &bcs
->Flag
)) {
784 sendmsg(bcs
->cs
, SET_DPS(bcs
->hw
.isar
.dpath
) |
785 ISAR_HIS_SDATA
, 0x01, 1, &dummy
);
787 test_and_set_bit(BC_FLG_LL_OK
, &bcs
->Flag
);
789 sched_b_event(bcs
, B_LL_CONNECT
);
792 test_and_clear_bit(BC_FLG_BUSY
, &bcs
->Flag
);
793 sched_b_event(bcs
, B_XMTBUFREADY
);
798 check_send(struct IsdnCardState
*cs
, u8 rdm
)
802 if (rdm
& BSTAT_RDM1
) {
803 if ((bcs
= sel_bcs_isar(cs
, 1))) {
809 if (rdm
& BSTAT_RDM2
) {
810 if ((bcs
= sel_bcs_isar(cs
, 2))) {
819 const char *dmril
[] = {"NO SPEED", "1200/75", "NODEF2", "75/1200", "NODEF4",
820 "300", "600", "1200", "2400", "4800", "7200",
821 "9600nt", "9600t", "12000", "14400", "WRONG"};
822 const char *dmrim
[] = {"NO MOD", "NO DEF", "V32/V32b", "V22", "V21",
823 "Bell103", "V23", "Bell202", "V17", "V29", "V27ter"};
826 isar_pump_status_rsp(struct BCState
*bcs
, struct isar_reg
*ireg
) {
827 struct IsdnCardState
*cs
= bcs
->cs
;
828 u8 ril
= ireg
->par
[0];
831 if (!test_and_clear_bit(ISAR_RATE_REQ
, &bcs
->hw
.isar
.reg
->Flags
))
834 if (cs
->debug
& L1_DEB_WARN
)
835 debugl1(cs
, "wrong pstrsp ril=%d",ril
);
838 switch(ireg
->par
[1]) {
873 sprintf(bcs
->hw
.isar
.conmsg
,"%s %s", dmril
[ril
], dmrim
[rim
]);
874 bcs
->conmsg
= bcs
->hw
.isar
.conmsg
;
875 if (cs
->debug
& L1_DEB_HSCX
)
876 debugl1(cs
, "pump strsp %s", bcs
->conmsg
);
880 isar_pump_statev_modem(struct BCState
*bcs
, u8 devt
) {
881 struct IsdnCardState
*cs
= bcs
->cs
;
882 u8 dps
= SET_DPS(bcs
->hw
.isar
.dpath
);
885 case PSEV_10MS_TIMER
:
886 if (cs
->debug
& L1_DEB_HSCX
)
887 debugl1(cs
, "pump stev TIMER");
890 if (cs
->debug
& L1_DEB_HSCX
)
891 debugl1(cs
, "pump stev CONNECT");
892 l1_msg_b(bcs
->st
, PH_ACTIVATE
| REQUEST
, NULL
);
895 if (cs
->debug
& L1_DEB_HSCX
)
896 debugl1(cs
, "pump stev NO CONNECT");
897 sendmsg(cs
, dps
| ISAR_HIS_PSTREQ
, 0, 0, NULL
);
898 l1_msg_b(bcs
->st
, PH_DEACTIVATE
| REQUEST
, NULL
);
901 if (cs
->debug
& L1_DEB_HSCX
)
902 debugl1(cs
, "pump stev V24 OFF");
905 if (cs
->debug
& L1_DEB_HSCX
)
906 debugl1(cs
, "pump stev CTS ON");
909 if (cs
->debug
& L1_DEB_HSCX
)
910 debugl1(cs
, "pump stev CTS OFF");
913 if (cs
->debug
& L1_DEB_HSCX
)
914 debugl1(cs
, "pump stev CARRIER ON");
915 test_and_set_bit(ISAR_RATE_REQ
, &bcs
->hw
.isar
.reg
->Flags
);
916 sendmsg(cs
, dps
| ISAR_HIS_PSTREQ
, 0, 0, NULL
);
919 if (cs
->debug
& L1_DEB_HSCX
)
920 debugl1(cs
, "pump stev CARRIER OFF");
923 if (cs
->debug
& L1_DEB_HSCX
)
924 debugl1(cs
, "pump stev DSR ON");
927 if (cs
->debug
& L1_DEB_HSCX
)
928 debugl1(cs
, "pump stev DSR_OFF");
931 if (cs
->debug
& L1_DEB_HSCX
)
932 debugl1(cs
, "pump stev REMOTE RETRAIN");
935 if (cs
->debug
& L1_DEB_HSCX
)
936 debugl1(cs
, "pump stev REMOTE RENEGOTIATE");
939 if (cs
->debug
& L1_DEB_HSCX
)
940 debugl1(cs
, "pump stev GSTN CLEAR", devt
);
943 if (cs
->debug
& L1_DEB_HSCX
)
944 debugl1(cs
, "unknown pump stev %x", devt
);
950 ll_deliver_faxstat(struct BCState
*bcs
, u8 status
)
953 struct Channel
*chanp
= (struct Channel
*) bcs
->st
->lli
.userdata
;
955 if (bcs
->cs
->debug
& L1_DEB_HSCX
)
956 debugl1(bcs
->cs
, "HL->LL FAXIND %x", status
);
957 ic
.driver
= bcs
->cs
->myid
;
958 ic
.command
= ISDN_STAT_FAXIND
;
959 ic
.arg
= chanp
->chan
;
960 ic
.parm
.aux
.cmd
= status
;
961 bcs
->cs
->iif
.statcallb(&ic
);
965 isar_pump_statev_fax(struct BCState
*bcs
, u8 devt
) {
966 struct IsdnCardState
*cs
= bcs
->cs
;
967 u8 dps
= SET_DPS(bcs
->hw
.isar
.dpath
);
971 case PSEV_10MS_TIMER
:
972 if (cs
->debug
& L1_DEB_HSCX
)
973 debugl1(cs
, "pump stev TIMER");
976 if (cs
->debug
& L1_DEB_HSCX
)
977 debugl1(cs
, "pump stev RSP_READY");
978 bcs
->hw
.isar
.state
= STFAX_READY
;
979 l1_msg_b(bcs
->st
, PH_ACTIVATE
| REQUEST
, NULL
);
980 if (test_bit(BC_FLG_ORIG
, &bcs
->Flag
)) {
981 isar_pump_cmd(bcs
, ISDN_FAX_CLASS1_FRH
, 3);
983 isar_pump_cmd(bcs
, ISDN_FAX_CLASS1_FTH
, 3);
987 if (bcs
->hw
.isar
.state
== STFAX_LINE
) {
988 if (cs
->debug
& L1_DEB_HSCX
)
989 debugl1(cs
, "pump stev LINE_TX_H");
990 bcs
->hw
.isar
.state
= STFAX_CONT
;
991 sendmsg(cs
, dps
| ISAR_HIS_PUMPCTRL
, PCTRL_CMD_CONT
, 0, NULL
);
993 if (cs
->debug
& L1_DEB_WARN
)
994 debugl1(cs
, "pump stev LINE_TX_H wrong st %x",
999 if (bcs
->hw
.isar
.state
== STFAX_LINE
) {
1000 if (cs
->debug
& L1_DEB_HSCX
)
1001 debugl1(cs
, "pump stev LINE_RX_H");
1002 bcs
->hw
.isar
.state
= STFAX_CONT
;
1003 sendmsg(cs
, dps
| ISAR_HIS_PUMPCTRL
, PCTRL_CMD_CONT
, 0, NULL
);
1005 if (cs
->debug
& L1_DEB_WARN
)
1006 debugl1(cs
, "pump stev LINE_RX_H wrong st %x",
1007 bcs
->hw
.isar
.state
);
1010 case PSEV_LINE_TX_B
:
1011 if (bcs
->hw
.isar
.state
== STFAX_LINE
) {
1012 if (cs
->debug
& L1_DEB_HSCX
)
1013 debugl1(cs
, "pump stev LINE_TX_B");
1014 bcs
->hw
.isar
.state
= STFAX_CONT
;
1015 sendmsg(cs
, dps
| ISAR_HIS_PUMPCTRL
, PCTRL_CMD_CONT
, 0, NULL
);
1017 if (cs
->debug
& L1_DEB_WARN
)
1018 debugl1(cs
, "pump stev LINE_TX_B wrong st %x",
1019 bcs
->hw
.isar
.state
);
1022 case PSEV_LINE_RX_B
:
1023 if (bcs
->hw
.isar
.state
== STFAX_LINE
) {
1024 if (cs
->debug
& L1_DEB_HSCX
)
1025 debugl1(cs
, "pump stev LINE_RX_B");
1026 bcs
->hw
.isar
.state
= STFAX_CONT
;
1027 sendmsg(cs
, dps
| ISAR_HIS_PUMPCTRL
, PCTRL_CMD_CONT
, 0, NULL
);
1029 if (cs
->debug
& L1_DEB_WARN
)
1030 debugl1(cs
, "pump stev LINE_RX_B wrong st %x",
1031 bcs
->hw
.isar
.state
);
1035 if (bcs
->hw
.isar
.state
== STFAX_CONT
) {
1036 if (cs
->debug
& L1_DEB_HSCX
)
1037 debugl1(cs
, "pump stev RSP_CONN");
1038 bcs
->hw
.isar
.state
= STFAX_ACTIV
;
1039 test_and_set_bit(ISAR_RATE_REQ
, &bcs
->hw
.isar
.reg
->Flags
);
1040 sendmsg(cs
, dps
| ISAR_HIS_PSTREQ
, 0, 0, NULL
);
1041 if (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FTH
) {
1042 /* 1s Flags before data */
1043 if (test_and_set_bit(BC_FLG_FTI_RUN
, &bcs
->Flag
))
1044 del_timer(&bcs
->hw
.isar
.ftimer
);
1046 bcs
->hw
.isar
.ftimer
.expires
=
1047 jiffies
+ ((1000 * HZ
)/1000);
1048 test_and_set_bit(BC_FLG_LL_CONN
,
1050 add_timer(&bcs
->hw
.isar
.ftimer
);
1052 sched_b_event(bcs
, B_LL_CONNECT
);
1055 if (cs
->debug
& L1_DEB_WARN
)
1056 debugl1(cs
, "pump stev RSP_CONN wrong st %x",
1057 bcs
->hw
.isar
.state
);
1060 case PSEV_FLAGS_DET
:
1061 if (cs
->debug
& L1_DEB_HSCX
)
1062 debugl1(cs
, "pump stev FLAGS_DET");
1065 if (cs
->debug
& L1_DEB_HSCX
)
1066 debugl1(cs
, "pump stev RSP_DISC");
1067 if (bcs
->hw
.isar
.state
== STFAX_ESCAPE
) {
1068 switch(bcs
->hw
.isar
.newcmd
) {
1070 bcs
->hw
.isar
.state
= STFAX_READY
;
1075 sendmsg(cs
, dps
| ISAR_HIS_PUMPCTRL
,
1076 PCTRL_CMD_SILON
, 1, &p1
);
1077 bcs
->hw
.isar
.state
= STFAX_SILDET
;
1081 p1
= bcs
->hw
.isar
.mod
= bcs
->hw
.isar
.newmod
;
1082 bcs
->hw
.isar
.newmod
= 0;
1083 bcs
->hw
.isar
.cmd
= bcs
->hw
.isar
.newcmd
;
1084 bcs
->hw
.isar
.newcmd
= 0;
1085 sendmsg(cs
, dps
| ISAR_HIS_PUMPCTRL
,
1086 bcs
->hw
.isar
.cmd
, 1, &p1
);
1087 bcs
->hw
.isar
.state
= STFAX_LINE
;
1088 bcs
->hw
.isar
.try_mod
= 3;
1091 if (cs
->debug
& L1_DEB_HSCX
)
1092 debugl1(cs
, "RSP_DISC unknown newcmd %x", bcs
->hw
.isar
.newcmd
);
1095 } else if (bcs
->hw
.isar
.state
== STFAX_ACTIV
) {
1096 if (test_and_clear_bit(BC_FLG_LL_OK
, &bcs
->Flag
)) {
1097 sched_b_event(bcs
, B_LL_OK
);
1098 } else if (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FRM
) {
1100 sched_b_event(bcs
, B_LL_NOCARRIER
);
1102 ll_deliver_faxstat(bcs
, ISDN_FAX_CLASS1_FCERROR
);
1104 bcs
->hw
.isar
.state
= STFAX_READY
;
1106 bcs
->hw
.isar
.state
= STFAX_READY
;
1107 ll_deliver_faxstat(bcs
, ISDN_FAX_CLASS1_FCERROR
);
1110 case PSEV_RSP_SILDET
:
1111 if (cs
->debug
& L1_DEB_HSCX
)
1112 debugl1(cs
, "pump stev RSP_SILDET");
1113 if (bcs
->hw
.isar
.state
== STFAX_SILDET
) {
1114 p1
= bcs
->hw
.isar
.mod
= bcs
->hw
.isar
.newmod
;
1115 bcs
->hw
.isar
.newmod
= 0;
1116 bcs
->hw
.isar
.cmd
= bcs
->hw
.isar
.newcmd
;
1117 bcs
->hw
.isar
.newcmd
= 0;
1118 sendmsg(cs
, dps
| ISAR_HIS_PUMPCTRL
,
1119 bcs
->hw
.isar
.cmd
, 1, &p1
);
1120 bcs
->hw
.isar
.state
= STFAX_LINE
;
1121 bcs
->hw
.isar
.try_mod
= 3;
1124 case PSEV_RSP_SILOFF
:
1125 if (cs
->debug
& L1_DEB_HSCX
)
1126 debugl1(cs
, "pump stev RSP_SILOFF");
1128 case PSEV_RSP_FCERR
:
1129 if (bcs
->hw
.isar
.state
== STFAX_LINE
) {
1130 if (cs
->debug
& L1_DEB_HSCX
)
1131 debugl1(cs
, "pump stev RSP_FCERR try %d",
1132 bcs
->hw
.isar
.try_mod
);
1133 if (bcs
->hw
.isar
.try_mod
--) {
1134 sendmsg(cs
, dps
| ISAR_HIS_PUMPCTRL
,
1135 bcs
->hw
.isar
.cmd
, 1,
1140 if (cs
->debug
& L1_DEB_HSCX
)
1141 debugl1(cs
, "pump stev RSP_FCERR");
1142 bcs
->hw
.isar
.state
= STFAX_ESCAPE
;
1143 sendmsg(cs
, dps
| ISAR_HIS_PUMPCTRL
, PCTRL_CMD_ESC
, 0, NULL
);
1144 ll_deliver_faxstat(bcs
, ISDN_FAX_CLASS1_FCERROR
);
1151 static char debbuf
[128];
1154 isar_int_main(struct IsdnCardState
*cs
)
1156 struct isar_reg
*ireg
= cs
->bcs
[0].hw
.isar
.reg
;
1157 struct BCState
*bcs
;
1159 get_irq_infos(cs
, ireg
);
1160 switch (ireg
->iis
& ISAR_IIS_MSCMSD
) {
1161 case ISAR_IIS_RDATA
:
1162 if ((bcs
= sel_bcs_isar(cs
, ireg
->iis
>> 6))) {
1163 isar_rcv_frame(cs
, bcs
);
1165 debugl1(cs
, "isar spurious IIS_RDATA %x/%x/%x",
1166 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
1167 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
1170 case ISAR_IIS_GSTEV
:
1171 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
1172 ireg
->bstat
|= ireg
->cmsb
;
1173 check_send(cs
, ireg
->cmsb
);
1175 case ISAR_IIS_BSTEV
:
1176 #ifdef ERROR_STATISTIC
1177 if ((bcs
= sel_bcs_isar(cs
, ireg
->iis
>> 6))) {
1178 if (ireg
->cmsb
== BSTEV_TBO
)
1180 if (ireg
->cmsb
== BSTEV_RBO
)
1184 if (cs
->debug
& L1_DEB_WARN
)
1185 debugl1(cs
, "Buffer STEV dpath%d msb(%x)",
1186 ireg
->iis
>>6, ireg
->cmsb
);
1187 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
1189 case ISAR_IIS_PSTEV
:
1190 if ((bcs
= sel_bcs_isar(cs
, ireg
->iis
>> 6))) {
1191 rcv_mbox(cs
, ireg
, (u8
*)ireg
->par
);
1192 if (bcs
->mode
== L1_MODE_V32
) {
1193 isar_pump_statev_modem(bcs
, ireg
->cmsb
);
1194 } else if (bcs
->mode
== L1_MODE_FAX
) {
1195 isar_pump_statev_fax(bcs
, ireg
->cmsb
);
1197 if (cs
->debug
& L1_DEB_WARN
)
1198 debugl1(cs
, "isar IIS_PSTEV pmode %d stat %x",
1199 bcs
->mode
, ireg
->cmsb
);
1202 debugl1(cs
, "isar spurious IIS_PSTEV %x/%x/%x",
1203 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
1204 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
1207 case ISAR_IIS_PSTRSP
:
1208 if ((bcs
= sel_bcs_isar(cs
, ireg
->iis
>> 6))) {
1209 rcv_mbox(cs
, ireg
, (u8
*)ireg
->par
);
1210 isar_pump_status_rsp(bcs
, ireg
);
1212 debugl1(cs
, "isar spurious IIS_PSTRSP %x/%x/%x",
1213 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
1214 isar_write_reg(cs
, 1, ISAR_IIA
, 0);
1218 case ISAR_IIS_BSTRSP
:
1219 case ISAR_IIS_IOM2RSP
:
1220 rcv_mbox(cs
, ireg
, (u8
*)ireg
->par
);
1221 if ((cs
->debug
& (L1_DEB_HSCX
| L1_DEB_HSCX_FIFO
))
1225 tp
+= sprintf(debbuf
, "msg iis(%x) msb(%x)",
1226 ireg
->iis
, ireg
->cmsb
);
1227 QuickHex(tp
, (u8
*)ireg
->par
, ireg
->clsb
);
1228 debugl1(cs
, debbuf
);
1231 case ISAR_IIS_INVMSG
:
1232 rcv_mbox(cs
, ireg
, debbuf
);
1233 if (cs
->debug
& L1_DEB_WARN
)
1234 debugl1(cs
, "invalid msg his:%x",
1238 rcv_mbox(cs
, ireg
, debbuf
);
1239 if (cs
->debug
& L1_DEB_WARN
)
1240 debugl1(cs
, "unhandled msg iis(%x) ctrl(%x/%x)",
1241 ireg
->iis
, ireg
->cmsb
, ireg
->clsb
);
1247 ftimer_handler(struct BCState
*bcs
) {
1249 debugl1(bcs
->cs
, "ftimer flags %04x",
1251 test_and_clear_bit(BC_FLG_FTI_RUN
, &bcs
->Flag
);
1252 if (test_and_clear_bit(BC_FLG_LL_CONN
, &bcs
->Flag
)) {
1253 sched_b_event(bcs
, B_LL_CONNECT
);
1258 setup_pump(struct BCState
*bcs
) {
1259 struct IsdnCardState
*cs
= bcs
->cs
;
1260 u8 dps
= SET_DPS(bcs
->hw
.isar
.dpath
);
1263 switch (bcs
->mode
) {
1267 sendmsg(cs
, dps
| ISAR_HIS_PUMPCFG
, PMOD_BYPASS
, 0, NULL
);
1270 ctrl
= PMOD_DATAMODEM
;
1271 if (test_bit(BC_FLG_ORIG
, &bcs
->Flag
)) {
1273 param
[5] = PV32P6_CTN
;
1275 param
[5] = PV32P6_ATN
;
1277 param
[0] = 6; /* 6 db */
1278 param
[1] = PV32P2_V23R
| PV32P2_V22A
| PV32P2_V22B
|
1279 PV32P2_V22C
| PV32P2_V21
| PV32P2_BEL
;
1280 param
[2] = PV32P3_AMOD
| PV32P3_V32B
| PV32P3_V23B
;
1281 param
[3] = PV32P4_UT144
;
1282 param
[4] = PV32P5_UT144
;
1283 sendmsg(cs
, dps
| ISAR_HIS_PUMPCFG
, ctrl
, 6, param
);
1287 if (test_bit(BC_FLG_ORIG
, &bcs
->Flag
)) {
1289 param
[1] = PFAXP2_CTN
;
1291 param
[1] = PFAXP2_ATN
;
1293 param
[0] = 6; /* 6 db */
1294 sendmsg(cs
, dps
| ISAR_HIS_PUMPCFG
, ctrl
, 2, param
);
1295 bcs
->hw
.isar
.state
= STFAX_NULL
;
1296 bcs
->hw
.isar
.newcmd
= 0;
1297 bcs
->hw
.isar
.newmod
= 0;
1298 test_and_set_bit(BC_FLG_FTI_RUN
, &bcs
->Flag
);
1302 sendmsg(cs
, dps
| ISAR_HIS_PSTREQ
, 0, 0, NULL
);
1307 setup_sart(struct BCState
*bcs
) {
1308 struct IsdnCardState
*cs
= bcs
->cs
;
1309 u8 dps
= SET_DPS(bcs
->hw
.isar
.dpath
);
1312 switch (bcs
->mode
) {
1314 sendmsg(cs
, dps
| ISAR_HIS_SARTCFG
, SMODE_DISABLE
, 0,
1318 sendmsg(cs
, dps
| ISAR_HIS_SARTCFG
, SMODE_BINARY
, 2,
1324 sendmsg(cs
, dps
| ISAR_HIS_SARTCFG
, SMODE_HDLC
, 1,
1328 ctrl
= SMODE_V14
| SCTRL_HDMC_BOTH
;
1329 param
[0] = S_P1_CHS_8
;
1330 param
[1] = S_P2_BFT_DEF
;
1331 sendmsg(cs
, dps
| ISAR_HIS_SARTCFG
, ctrl
, 2,
1336 sendmsg(cs
, dps
| ISAR_HIS_BSTREQ
, 0, 0, NULL
);
1341 setup_iom2(struct BCState
*bcs
) {
1342 struct IsdnCardState
*cs
= bcs
->cs
;
1343 u8 dps
= SET_DPS(bcs
->hw
.isar
.dpath
);
1344 u8 cmsb
= IOM_CTRL_ENA
, msg
[5] = {IOM_P1_TXD
,0,0,0,0};
1347 msg
[1] = msg
[3] = 1;
1348 switch (bcs
->mode
) {
1352 msg
[1] = msg
[3] = bcs
->hw
.isar
.dpath
+ 2;
1359 cmsb
|= IOM_CTRL_ALAW
| IOM_CTRL_RCV
;
1362 sendmsg(cs
, dps
| ISAR_HIS_IOM2CFG
, cmsb
, 5, msg
);
1364 sendmsg(cs
, dps
| ISAR_HIS_IOM2REQ
, 0, 0, NULL
);
1369 modeisar(struct BCState
*bcs
, int mode
, int bc
)
1371 struct IsdnCardState
*cs
= bcs
->cs
;
1373 /* Here we are selecting the best datapath for requested mode */
1374 if(bcs
->mode
== L1_MODE_NULL
) { /* New Setup */
1377 case L1_MODE_NULL
: /* init */
1378 if (!bcs
->hw
.isar
.dpath
)
1379 /* no init for dpath 0 */
1384 /* best is datapath 2 */
1385 if (!test_and_set_bit(ISAR_DP2_USE
,
1386 &bcs
->hw
.isar
.reg
->Flags
))
1387 bcs
->hw
.isar
.dpath
= 2;
1388 else if (!test_and_set_bit(ISAR_DP1_USE
,
1389 &bcs
->hw
.isar
.reg
->Flags
))
1390 bcs
->hw
.isar
.dpath
= 1;
1392 printk(KERN_WARNING
"isar modeisar both pathes in use\n");
1398 /* only datapath 1 */
1399 if (!test_and_set_bit(ISAR_DP1_USE
,
1400 &bcs
->hw
.isar
.reg
->Flags
))
1401 bcs
->hw
.isar
.dpath
= 1;
1403 printk(KERN_WARNING
"isar modeisar analog funktions only with DP1\n");
1404 debugl1(cs
, "isar modeisar analog funktions only with DP1");
1410 if (cs
->debug
& L1_DEB_HSCX
)
1411 debugl1(cs
, "isar dp%d mode %d->%d ichan %d",
1412 bcs
->hw
.isar
.dpath
, bcs
->mode
, mode
, bc
);
1417 if (bcs
->mode
== L1_MODE_NULL
) {
1418 /* Clear resources */
1419 if (bcs
->hw
.isar
.dpath
== 1)
1420 test_and_clear_bit(ISAR_DP1_USE
, &bcs
->hw
.isar
.reg
->Flags
);
1421 else if (bcs
->hw
.isar
.dpath
== 2)
1422 test_and_clear_bit(ISAR_DP2_USE
, &bcs
->hw
.isar
.reg
->Flags
);
1423 bcs
->hw
.isar
.dpath
= 0;
1429 isar_pump_cmd(struct BCState
*bcs
, u8 cmd
, u8 para
)
1431 struct IsdnCardState
*cs
= bcs
->cs
;
1432 u8 dps
= SET_DPS(bcs
->hw
.isar
.dpath
);
1433 u8 ctrl
= 0, nom
= 0, p1
= 0;
1436 case ISDN_FAX_CLASS1_FTM
:
1437 if (bcs
->hw
.isar
.state
== STFAX_READY
) {
1439 ctrl
= PCTRL_CMD_FTM
;
1441 bcs
->hw
.isar
.state
= STFAX_LINE
;
1442 bcs
->hw
.isar
.cmd
= ctrl
;
1443 bcs
->hw
.isar
.mod
= para
;
1444 bcs
->hw
.isar
.newmod
= 0;
1445 bcs
->hw
.isar
.newcmd
= 0;
1446 bcs
->hw
.isar
.try_mod
= 3;
1447 } else if ((bcs
->hw
.isar
.state
== STFAX_ACTIV
) &&
1448 (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FTM
) &&
1449 (bcs
->hw
.isar
.mod
== para
)) {
1450 ll_deliver_faxstat(bcs
, ISDN_FAX_CLASS1_CONNECT
);
1452 bcs
->hw
.isar
.newmod
= para
;
1453 bcs
->hw
.isar
.newcmd
= PCTRL_CMD_FTM
;
1455 ctrl
= PCTRL_CMD_ESC
;
1456 bcs
->hw
.isar
.state
= STFAX_ESCAPE
;
1459 case ISDN_FAX_CLASS1_FTH
:
1460 if (bcs
->hw
.isar
.state
== STFAX_READY
) {
1462 ctrl
= PCTRL_CMD_FTH
;
1464 bcs
->hw
.isar
.state
= STFAX_LINE
;
1465 bcs
->hw
.isar
.cmd
= ctrl
;
1466 bcs
->hw
.isar
.mod
= para
;
1467 bcs
->hw
.isar
.newmod
= 0;
1468 bcs
->hw
.isar
.newcmd
= 0;
1469 bcs
->hw
.isar
.try_mod
= 3;
1470 } else if ((bcs
->hw
.isar
.state
== STFAX_ACTIV
) &&
1471 (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FTH
) &&
1472 (bcs
->hw
.isar
.mod
== para
)) {
1473 ll_deliver_faxstat(bcs
, ISDN_FAX_CLASS1_CONNECT
);
1475 bcs
->hw
.isar
.newmod
= para
;
1476 bcs
->hw
.isar
.newcmd
= PCTRL_CMD_FTH
;
1478 ctrl
= PCTRL_CMD_ESC
;
1479 bcs
->hw
.isar
.state
= STFAX_ESCAPE
;
1482 case ISDN_FAX_CLASS1_FRM
:
1483 if (bcs
->hw
.isar
.state
== STFAX_READY
) {
1485 ctrl
= PCTRL_CMD_FRM
;
1487 bcs
->hw
.isar
.state
= STFAX_LINE
;
1488 bcs
->hw
.isar
.cmd
= ctrl
;
1489 bcs
->hw
.isar
.mod
= para
;
1490 bcs
->hw
.isar
.newmod
= 0;
1491 bcs
->hw
.isar
.newcmd
= 0;
1492 bcs
->hw
.isar
.try_mod
= 3;
1493 } else if ((bcs
->hw
.isar
.state
== STFAX_ACTIV
) &&
1494 (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FRM
) &&
1495 (bcs
->hw
.isar
.mod
== para
)) {
1496 ll_deliver_faxstat(bcs
, ISDN_FAX_CLASS1_CONNECT
);
1498 bcs
->hw
.isar
.newmod
= para
;
1499 bcs
->hw
.isar
.newcmd
= PCTRL_CMD_FRM
;
1501 ctrl
= PCTRL_CMD_ESC
;
1502 bcs
->hw
.isar
.state
= STFAX_ESCAPE
;
1505 case ISDN_FAX_CLASS1_FRH
:
1506 if (bcs
->hw
.isar
.state
== STFAX_READY
) {
1508 ctrl
= PCTRL_CMD_FRH
;
1510 bcs
->hw
.isar
.state
= STFAX_LINE
;
1511 bcs
->hw
.isar
.cmd
= ctrl
;
1512 bcs
->hw
.isar
.mod
= para
;
1513 bcs
->hw
.isar
.newmod
= 0;
1514 bcs
->hw
.isar
.newcmd
= 0;
1515 bcs
->hw
.isar
.try_mod
= 3;
1516 } else if ((bcs
->hw
.isar
.state
== STFAX_ACTIV
) &&
1517 (bcs
->hw
.isar
.cmd
== PCTRL_CMD_FRH
) &&
1518 (bcs
->hw
.isar
.mod
== para
)) {
1519 ll_deliver_faxstat(bcs
, ISDN_FAX_CLASS1_CONNECT
);
1521 bcs
->hw
.isar
.newmod
= para
;
1522 bcs
->hw
.isar
.newcmd
= PCTRL_CMD_FRH
;
1524 ctrl
= PCTRL_CMD_ESC
;
1525 bcs
->hw
.isar
.state
= STFAX_ESCAPE
;
1530 sendmsg(cs
, dps
| ISAR_HIS_PUMPCTRL
, ctrl
, nom
, &p1
);
1534 __isar_setup(struct IsdnCardState
*cs
)
1541 for (i
=0; i
<2; i
++) {
1543 sendmsg(cs
, (i
? ISAR_HIS_DPS2
: ISAR_HIS_DPS1
) |
1544 ISAR_HIS_P12CFG
, 4, 1, &msg
);
1545 cs
->bcs
[i
].hw
.isar
.mml
= msg
;
1546 cs
->bcs
[i
].mode
= 0;
1547 cs
->bcs
[i
].hw
.isar
.dpath
= i
+ 1;
1548 modeisar(&cs
->bcs
[i
], 0, 0);
1549 INIT_WORK(&cs
->bcs
[i
].work
, isar_bh
, &cs
->bcs
[i
]);
1554 isar_l2l1(struct PStack
*st
, int pr
, void *arg
)
1556 struct sk_buff
*skb
= arg
;
1559 case (PH_DATA
| REQUEST
):
1560 xmit_data_req_b(st
->l1
.bcs
, skb
);
1562 case (PH_PULL
| INDICATION
):
1563 xmit_pull_ind_b(st
->l1
.bcs
, skb
);
1565 case (PH_PULL
| REQUEST
):
1566 xmit_pull_req_b(st
);
1568 case (PH_ACTIVATE
| REQUEST
):
1569 test_and_set_bit(BC_FLG_ACTIV
, &st
->l1
.bcs
->Flag
);
1570 st
->l1
.bcs
->hw
.isar
.conmsg
[0] = 0;
1571 if (test_bit(FLG_ORIG
, &st
->l2
.flag
))
1572 test_and_set_bit(BC_FLG_ORIG
, &st
->l1
.bcs
->Flag
);
1574 test_and_clear_bit(BC_FLG_ORIG
, &st
->l1
.bcs
->Flag
);
1575 switch(st
->l1
.mode
) {
1578 if (modeisar(st
->l1
.bcs
, st
->l1
.mode
, st
->l1
.bc
))
1579 l1_msg_b(st
, PH_DEACTIVATE
| REQUEST
, arg
);
1581 l1_msg_b(st
, PH_ACTIVATE
| REQUEST
, arg
);
1585 if (modeisar(st
->l1
.bcs
, st
->l1
.mode
, st
->l1
.bc
))
1586 l1_msg_b(st
, PH_DEACTIVATE
| REQUEST
, arg
);
1590 case (PH_DEACTIVATE
| REQUEST
):
1591 l1_msg_b(st
, pr
, arg
);
1593 case (PH_DEACTIVATE
| CONFIRM
):
1594 test_and_clear_bit(BC_FLG_ACTIV
, &st
->l1
.bcs
->Flag
);
1595 test_and_clear_bit(BC_FLG_BUSY
, &st
->l1
.bcs
->Flag
);
1596 if (st
->l1
.bcs
->cs
->debug
& L1_DEB_HSCX
)
1597 debugl1(st
->l1
.bcs
->cs
, "PDAC clear BC_FLG_BUSY");
1598 modeisar(st
->l1
.bcs
, 0, st
->l1
.bc
);
1599 L1L2(st
, PH_DEACTIVATE
| CONFIRM
, NULL
);
1605 close_isarstate(struct BCState
*bcs
)
1607 modeisar(bcs
, 0, bcs
->channel
);
1608 if (test_and_clear_bit(BC_FLG_INIT
, &bcs
->Flag
)) {
1609 if (bcs
->hw
.isar
.rcvbuf
) {
1610 kfree(bcs
->hw
.isar
.rcvbuf
);
1611 bcs
->hw
.isar
.rcvbuf
= NULL
;
1613 skb_queue_purge(&bcs
->rqueue
);
1614 skb_queue_purge(&bcs
->squeue
);
1616 dev_kfree_skb_any(bcs
->tx_skb
);
1618 test_and_clear_bit(BC_FLG_BUSY
, &bcs
->Flag
);
1619 if (bcs
->cs
->debug
& L1_DEB_HSCX
)
1620 debugl1(bcs
->cs
, "closeisar clear BC_FLG_BUSY");
1623 del_timer(&bcs
->hw
.isar
.ftimer
);
1627 open_isarstate(struct IsdnCardState
*cs
, struct BCState
*bcs
)
1629 if (!test_and_set_bit(BC_FLG_INIT
, &bcs
->Flag
)) {
1630 if (!(bcs
->hw
.isar
.rcvbuf
= kmalloc(HSCX_BUFMAX
, GFP_ATOMIC
))) {
1632 "HiSax: No memory for isar.rcvbuf\n");
1635 skb_queue_head_init(&bcs
->rqueue
);
1636 skb_queue_head_init(&bcs
->squeue
);
1639 test_and_clear_bit(BC_FLG_BUSY
, &bcs
->Flag
);
1640 if (cs
->debug
& L1_DEB_HSCX
)
1641 debugl1(cs
, "openisar clear BC_FLG_BUSY");
1643 bcs
->hw
.isar
.rcvidx
= 0;
1645 bcs
->hw
.isar
.ftimer
.function
= (void *) ftimer_handler
;
1646 bcs
->hw
.isar
.ftimer
.data
= (long) bcs
;
1647 init_timer(&bcs
->hw
.isar
.ftimer
);
1652 setstack_isar(struct PStack
*st
, struct BCState
*bcs
)
1654 bcs
->channel
= st
->l1
.bc
;
1655 if (open_isarstate(st
->l1
.hardware
, bcs
))
1658 st
->l1
.l2l1
= isar_l2l1
;
1659 setstack_manager(st
);
1666 isar_auxcmd(struct IsdnCardState
*cs
, isdn_ctrl
*ic
) {
1669 struct BCState
*bcs
;
1671 if (cs
->debug
& L1_DEB_HSCX
)
1672 debugl1(cs
, "isar_auxcmd cmd/ch %x/%d", ic
->command
, ic
->arg
);
1673 switch (ic
->command
) {
1674 case (ISDN_CMD_FAXCMD
):
1675 bcs
= cs
->channel
[ic
->arg
].bcs
;
1676 if (cs
->debug
& L1_DEB_HSCX
)
1677 debugl1(cs
, "isar_auxcmd cmd/subcmd %d/%d",
1678 ic
->parm
.aux
.cmd
, ic
->parm
.aux
.subcmd
);
1679 switch(ic
->parm
.aux
.cmd
) {
1680 case ISDN_FAX_CLASS1_CTRL
:
1681 if (ic
->parm
.aux
.subcmd
== ETX
)
1682 test_and_set_bit(BC_FLG_DLEETX
,
1685 case ISDN_FAX_CLASS1_FRM
:
1686 case ISDN_FAX_CLASS1_FRH
:
1687 case ISDN_FAX_CLASS1_FTM
:
1688 case ISDN_FAX_CLASS1_FTH
:
1689 if (ic
->parm
.aux
.subcmd
== AT_QUERY
) {
1690 sprintf(ic
->parm
.aux
.para
,
1691 "%d", bcs
->hw
.isar
.mod
);
1692 ic
->command
= ISDN_STAT_FAXIND
;
1693 ic
->parm
.aux
.cmd
= ISDN_FAX_CLASS1_QUERY
;
1694 cs
->iif
.statcallb(ic
);
1696 } else if (ic
->parm
.aux
.subcmd
== AT_EQ_QUERY
) {
1697 strcpy(ic
->parm
.aux
.para
, faxmodulation_s
);
1698 ic
->command
= ISDN_STAT_FAXIND
;
1699 ic
->parm
.aux
.cmd
= ISDN_FAX_CLASS1_QUERY
;
1700 cs
->iif
.statcallb(ic
);
1702 } else if (ic
->parm
.aux
.subcmd
== AT_EQ_VALUE
) {
1703 for(i
=0;i
<FAXMODCNT
;i
++)
1704 if (faxmodulation
[i
]==ic
->parm
.aux
.para
[0])
1706 if ((FAXMODCNT
> i
) &&
1707 test_bit(BC_FLG_INIT
, &bcs
->Flag
)) {
1710 ic
->parm
.aux
.para
[0]);
1714 /* wrong modulation or not activ */
1717 ic
->command
= ISDN_STAT_FAXIND
;
1718 ic
->parm
.aux
.cmd
= ISDN_FAX_CLASS1_ERROR
;
1719 cs
->iif
.statcallb(ic
);
1722 case (ISDN_CMD_IOCTL
):
1724 case (9): /* load firmware */
1725 features
= ISDN_FEATURE_L2_MODEM
|
1726 ISDN_FEATURE_L2_FAX
|
1727 ISDN_FEATURE_L3_FCLASS1
;
1728 memcpy(&adr
, ic
->parm
.num
, sizeof(ulong
));
1729 if (isar_load_firmware(cs
, (u8
*)adr
))
1732 ll_run(cs
, features
);
1735 printk(KERN_DEBUG
"HiSax: invalid ioctl %d\n",
1746 static struct bc_l1_ops isar_l1_ops
= {
1747 .fill_fifo
= isar_fill_fifo
,
1748 .open
= setstack_isar
,
1749 .close
= close_isarstate
,
1753 initisar(struct IsdnCardState
*cs
)
1755 cs
->bc_l1_ops
= &isar_l1_ops
;
1759 isar_setup(struct IsdnCardState
*cs
, struct bc_hw_ops
*isar_ops
)
1761 cs
->bc_hw_ops
= isar_ops
;
1762 return ISARVersion(cs
, "HiSax:");