2 * mISDNisar.c ISAR (Siemens PSB 7110) specific functions
4 * Author Karsten Keil (keil@isdn4linux.de)
6 * Copyright 2009 by Karsten Keil <keil@isdn4linux.de>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 /* define this to enable static debug messages, if you kernel supports
24 * dynamic debugging, you should use debugfs for this
28 #include <linux/gfp.h>
29 #include <linux/delay.h>
30 #include <linux/vmalloc.h>
31 #include <linux/mISDNhw.h>
32 #include <linux/module.h>
35 #define ISAR_REV "2.1"
37 MODULE_AUTHOR("Karsten Keil");
38 MODULE_LICENSE("GPL v2");
39 MODULE_VERSION(ISAR_REV
);
41 #define DEBUG_HW_FIRMWARE_FIFO 0x10000
43 static const u8 faxmodulation_s
[] = "3,24,48,72,73,74,96,97,98,121,122,145,146";
44 static const u8 faxmodulation
[] = {3, 24, 48, 72, 73, 74, 96, 97, 98, 121,
48 static void isar_setup(struct isar_hw
*);
51 waitforHIA(struct isar_hw
*isar
, int timeout
)
54 u8 val
= isar
->read_reg(isar
->hw
, ISAR_HIA
);
56 while ((val
& 1) && t
) {
59 val
= isar
->read_reg(isar
->hw
, ISAR_HIA
);
61 pr_debug("%s: HIA after %dus\n", isar
->name
, timeout
- t
);
66 * send msg to ISAR mailbox
67 * if msg is NULL use isar->buf
70 send_mbox(struct isar_hw
*isar
, u8 his
, u8 creg
, u8 len
, u8
*msg
)
72 if (!waitforHIA(isar
, 1000))
74 pr_debug("send_mbox(%02x,%02x,%d)\n", his
, creg
, len
);
75 isar
->write_reg(isar
->hw
, ISAR_CTRL_H
, creg
);
76 isar
->write_reg(isar
->hw
, ISAR_CTRL_L
, len
);
77 isar
->write_reg(isar
->hw
, ISAR_WADR
, 0);
81 isar
->write_fifo(isar
->hw
, ISAR_MBOX
, msg
, len
);
82 if (isar
->ch
[0].bch
.debug
& DEBUG_HW_BFIFO
) {
85 while (l
< (int)len
) {
86 hex_dump_to_buffer(msg
+ l
, len
- l
, 32, 1,
88 pr_debug("%s: %s %02x: %s\n", isar
->name
,
89 __func__
, l
, isar
->log
);
94 isar
->write_reg(isar
->hw
, ISAR_HIS
, his
);
95 waitforHIA(isar
, 1000);
100 * receive message from ISAR mailbox
101 * if msg is NULL use isar->buf
104 rcv_mbox(struct isar_hw
*isar
, u8
*msg
)
108 isar
->write_reg(isar
->hw
, ISAR_RADR
, 0);
109 if (msg
&& isar
->clsb
) {
110 isar
->read_fifo(isar
->hw
, ISAR_MBOX
, msg
, isar
->clsb
);
111 if (isar
->ch
[0].bch
.debug
& DEBUG_HW_BFIFO
) {
114 while (l
< (int)isar
->clsb
) {
115 hex_dump_to_buffer(msg
+ l
, isar
->clsb
- l
, 32,
116 1, isar
->log
, 256, 1);
117 pr_debug("%s: %s %02x: %s\n", isar
->name
,
118 __func__
, l
, isar
->log
);
123 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
127 get_irq_infos(struct isar_hw
*isar
)
129 isar
->iis
= isar
->read_reg(isar
->hw
, ISAR_IIS
);
130 isar
->cmsb
= isar
->read_reg(isar
->hw
, ISAR_CTRL_H
);
131 isar
->clsb
= isar
->read_reg(isar
->hw
, ISAR_CTRL_L
);
132 pr_debug("%s: rcv_mbox(%02x,%02x,%d)\n", isar
->name
,
133 isar
->iis
, isar
->cmsb
, isar
->clsb
);
137 * poll answer message from ISAR mailbox
138 * should be used only with ISAR IRQs disabled before DSP was started
142 poll_mbox(struct isar_hw
*isar
, int maxdelay
)
147 irq
= isar
->read_reg(isar
->hw
, ISAR_IRQBIT
);
148 while (t
&& !(irq
& ISAR_IRQSTA
)) {
154 rcv_mbox(isar
, NULL
);
156 pr_debug("%s: pulled %d bytes after %d us\n",
157 isar
->name
, isar
->clsb
, maxdelay
- t
);
162 ISARVersion(struct isar_hw
*isar
)
166 /* disable ISAR IRQ */
167 isar
->write_reg(isar
->hw
, ISAR_IRQBIT
, 0);
168 isar
->buf
[0] = ISAR_MSG_HWVER
;
171 if (!send_mbox(isar
, ISAR_HIS_VNR
, 0, 3, NULL
))
173 if (!poll_mbox(isar
, 1000))
175 if (isar
->iis
== ISAR_IIS_VNR
) {
176 if (isar
->clsb
== 1) {
177 ver
= isar
->buf
[0] & 0xf;
186 load_firmware(struct isar_hw
*isar
, const u8
*buf
, int size
)
188 u32 saved_debug
= isar
->ch
[0].bch
.debug
;
191 u16 left
, val
, *sp
= (u16
*)buf
;
201 if (1 != isar
->version
) {
202 pr_err("%s: ISAR wrong version %d firmware download aborted\n",
203 isar
->name
, isar
->version
);
206 if (!(saved_debug
& DEBUG_HW_FIRMWARE_FIFO
))
207 isar
->ch
[0].bch
.debug
&= ~DEBUG_HW_BFIFO
;
208 pr_debug("%s: load firmware %d words (%d bytes)\n",
209 isar
->name
, size
/ 2, size
);
212 /* disable ISAR IRQ */
213 spin_lock_irqsave(isar
->hwlock
, flags
);
214 isar
->write_reg(isar
->hw
, ISAR_IRQBIT
, 0);
215 spin_unlock_irqrestore(isar
->hwlock
, flags
);
217 blk_head
.sadr
= le16_to_cpu(*sp
++);
218 blk_head
.len
= le16_to_cpu(*sp
++);
219 blk_head
.d_key
= le16_to_cpu(*sp
++);
221 pr_debug("ISAR firmware block (%#x,%d,%#x)\n",
222 blk_head
.sadr
, blk_head
.len
, blk_head
.d_key
& 0xff);
224 if (cnt
+ left
> size
) {
225 pr_info("%s: firmware error have %d need %d words\n",
226 isar
->name
, size
, cnt
+ left
);
230 spin_lock_irqsave(isar
->hwlock
, flags
);
231 if (!send_mbox(isar
, ISAR_HIS_DKEY
, blk_head
.d_key
& 0xff,
233 pr_info("ISAR send_mbox dkey failed\n");
237 if (!poll_mbox(isar
, 1000)) {
238 pr_warning("ISAR poll_mbox dkey failed\n");
242 spin_unlock_irqrestore(isar
->hwlock
, flags
);
243 if ((isar
->iis
!= ISAR_IIS_DKEY
) || isar
->cmsb
|| isar
->clsb
) {
244 pr_info("ISAR wrong dkey response (%x,%x,%x)\n",
245 isar
->iis
, isar
->cmsb
, isar
->clsb
);
256 /* the ISAR is big endian */
257 *mp
++ = blk_head
.sadr
>> 8;
258 *mp
++ = blk_head
.sadr
& 0xFF;
262 pr_debug("%s: load %3d words at %04x\n", isar
->name
,
264 blk_head
.sadr
+= noc
;
266 val
= le16_to_cpu(*sp
++);
271 spin_lock_irqsave(isar
->hwlock
, flags
);
272 if (!send_mbox(isar
, ISAR_HIS_FIRM
, 0, nom
, NULL
)) {
273 pr_info("ISAR send_mbox prog failed\n");
277 if (!poll_mbox(isar
, 1000)) {
278 pr_info("ISAR poll_mbox prog failed\n");
282 spin_unlock_irqrestore(isar
->hwlock
, flags
);
283 if ((isar
->iis
!= ISAR_IIS_FIRM
) ||
284 isar
->cmsb
|| isar
->clsb
) {
285 pr_info("ISAR wrong prog response (%x,%x,%x)\n",
286 isar
->iis
, isar
->cmsb
, isar
->clsb
);
291 pr_debug("%s: ISAR firmware block %d words loaded\n",
292 isar
->name
, blk_head
.len
);
294 isar
->ch
[0].bch
.debug
= saved_debug
;
302 spin_lock_irqsave(isar
->hwlock
, flags
);
303 if (!send_mbox(isar
, ISAR_HIS_STDSP
, 0, 2, NULL
)) {
304 pr_info("ISAR send_mbox start dsp failed\n");
308 if (!poll_mbox(isar
, 1000)) {
309 pr_info("ISAR poll_mbox start dsp failed\n");
313 if ((isar
->iis
!= ISAR_IIS_STDSP
) || isar
->cmsb
|| isar
->clsb
) {
314 pr_info("ISAR wrong start dsp response (%x,%x,%x)\n",
315 isar
->iis
, isar
->cmsb
, isar
->clsb
);
319 pr_debug("%s: ISAR start dsp success\n", isar
->name
);
321 /* NORMAL mode entered */
322 /* Enable IRQs of ISAR */
323 isar
->write_reg(isar
->hw
, ISAR_IRQBIT
, ISAR_IRQSTA
);
324 spin_unlock_irqrestore(isar
->hwlock
, flags
);
325 cnt
= 1000; /* max 1s */
326 while ((!isar
->bstat
) && cnt
) {
331 pr_info("ISAR no general status event received\n");
335 pr_debug("%s: ISAR general status event %x\n",
336 isar
->name
, isar
->bstat
);
342 spin_lock_irqsave(isar
->hwlock
, flags
);
343 if (!send_mbox(isar
, ISAR_HIS_DIAG
, ISAR_CTRL_STST
, 0, NULL
)) {
344 pr_info("ISAR send_mbox self tst failed\n");
348 spin_unlock_irqrestore(isar
->hwlock
, flags
);
349 cnt
= 10000; /* max 100 ms */
350 while ((isar
->iis
!= ISAR_IIS_DIAG
) && cnt
) {
356 pr_info("ISAR no self tst response\n");
360 if ((isar
->cmsb
== ISAR_CTRL_STST
) && (isar
->clsb
== 1)
361 && (isar
->buf
[0] == 0))
362 pr_debug("%s: ISAR selftest OK\n", isar
->name
);
364 pr_info("ISAR selftest not OK %x/%x/%x\n",
365 isar
->cmsb
, isar
->clsb
, isar
->buf
[0]);
369 spin_lock_irqsave(isar
->hwlock
, flags
);
371 if (!send_mbox(isar
, ISAR_HIS_DIAG
, ISAR_CTRL_SWVER
, 0, NULL
)) {
372 pr_info("ISAR RQST SVN failed\n");
376 spin_unlock_irqrestore(isar
->hwlock
, flags
);
377 cnt
= 30000; /* max 300 ms */
378 while ((isar
->iis
!= ISAR_IIS_DIAG
) && cnt
) {
384 pr_info("ISAR no SVN response\n");
388 if ((isar
->cmsb
== ISAR_CTRL_SWVER
) && (isar
->clsb
== 1)) {
389 pr_notice("%s: ISAR software version %#x\n",
390 isar
->name
, isar
->buf
[0]);
392 pr_info("%s: ISAR wrong swver response (%x,%x)"
393 " cnt(%d)\n", isar
->name
, isar
->cmsb
,
399 spin_lock_irqsave(isar
->hwlock
, flags
);
401 spin_unlock_irqrestore(isar
->hwlock
, flags
);
404 spin_lock_irqsave(isar
->hwlock
, flags
);
406 isar
->ch
[0].bch
.debug
= saved_debug
;
408 /* disable ISAR IRQ */
409 isar
->write_reg(isar
->hw
, ISAR_IRQBIT
, 0);
410 spin_unlock_irqrestore(isar
->hwlock
, flags
);
415 deliver_status(struct isar_ch
*ch
, int status
)
417 pr_debug("%s: HL->LL FAXIND %x\n", ch
->is
->name
, status
);
418 _queue_data(&ch
->bch
.ch
, PH_CONTROL_IND
, status
, 0, NULL
, GFP_ATOMIC
);
422 isar_rcv_frame(struct isar_ch
*ch
)
428 pr_debug("%s; ISAR zero len frame\n", ch
->is
->name
);
429 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
432 if (test_bit(FLG_RX_OFF
, &ch
->bch
.Flags
)) {
433 ch
->bch
.dropcnt
+= ch
->is
->clsb
;
434 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
437 switch (ch
->bch
.state
) {
439 pr_debug("%s: ISAR protocol 0 spurious IIS_RDATA %x/%x/%x\n",
440 ch
->is
->name
, ch
->is
->iis
, ch
->is
->cmsb
, ch
->is
->clsb
);
441 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
444 case ISDN_P_B_L2DTMF
:
445 case ISDN_P_B_MODEM_ASYNC
:
446 maxlen
= bchannel_get_rxbuf(&ch
->bch
, ch
->is
->clsb
);
448 pr_warning("%s.B%d: No bufferspace for %d bytes\n",
449 ch
->is
->name
, ch
->bch
.nr
, ch
->is
->clsb
);
450 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
453 rcv_mbox(ch
->is
, skb_put(ch
->bch
.rx_skb
, ch
->is
->clsb
));
454 recv_Bchannel(&ch
->bch
, 0, false);
457 maxlen
= bchannel_get_rxbuf(&ch
->bch
, ch
->is
->clsb
);
459 pr_warning("%s.B%d: No bufferspace for %d bytes\n",
460 ch
->is
->name
, ch
->bch
.nr
, ch
->is
->clsb
);
461 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
464 if (ch
->is
->cmsb
& HDLC_ERROR
) {
465 pr_debug("%s: ISAR frame error %x len %d\n",
466 ch
->is
->name
, ch
->is
->cmsb
, ch
->is
->clsb
);
467 #ifdef ERROR_STATISTIC
468 if (ch
->is
->cmsb
& HDLC_ERR_RER
)
470 if (ch
->is
->cmsb
& HDLC_ERR_CER
)
473 skb_trim(ch
->bch
.rx_skb
, 0);
474 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
477 if (ch
->is
->cmsb
& HDLC_FSD
)
478 skb_trim(ch
->bch
.rx_skb
, 0);
479 ptr
= skb_put(ch
->bch
.rx_skb
, ch
->is
->clsb
);
480 rcv_mbox(ch
->is
, ptr
);
481 if (ch
->is
->cmsb
& HDLC_FED
) {
482 if (ch
->bch
.rx_skb
->len
< 3) { /* last 2 are the FCS */
483 pr_debug("%s: ISAR frame to short %d\n",
484 ch
->is
->name
, ch
->bch
.rx_skb
->len
);
485 skb_trim(ch
->bch
.rx_skb
, 0);
488 skb_trim(ch
->bch
.rx_skb
, ch
->bch
.rx_skb
->len
- 2);
489 recv_Bchannel(&ch
->bch
, 0, false);
492 case ISDN_P_B_T30_FAX
:
493 if (ch
->state
!= STFAX_ACTIV
) {
494 pr_debug("%s: isar_rcv_frame: not ACTIV\n",
496 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
498 skb_trim(ch
->bch
.rx_skb
, 0);
501 if (!ch
->bch
.rx_skb
) {
502 ch
->bch
.rx_skb
= mI_alloc_skb(ch
->bch
.maxlen
,
504 if (unlikely(!ch
->bch
.rx_skb
)) {
505 pr_info("%s: B receive out of memory\n",
507 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
511 if (ch
->cmd
== PCTRL_CMD_FRM
) {
512 rcv_mbox(ch
->is
, skb_put(ch
->bch
.rx_skb
, ch
->is
->clsb
));
513 pr_debug("%s: isar_rcv_frame: %d\n",
514 ch
->is
->name
, ch
->bch
.rx_skb
->len
);
515 if (ch
->is
->cmsb
& SART_NMD
) { /* ABORT */
516 pr_debug("%s: isar_rcv_frame: no more data\n",
518 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
519 send_mbox(ch
->is
, SET_DPS(ch
->dpath
) |
520 ISAR_HIS_PUMPCTRL
, PCTRL_CMD_ESC
,
522 ch
->state
= STFAX_ESCAPE
;
523 /* set_skb_flag(skb, DF_NOMOREDATA); */
525 recv_Bchannel(&ch
->bch
, 0, false);
526 if (ch
->is
->cmsb
& SART_NMD
)
527 deliver_status(ch
, HW_MOD_NOCARR
);
530 if (ch
->cmd
!= PCTRL_CMD_FRH
) {
531 pr_debug("%s: isar_rcv_frame: unknown fax mode %x\n",
532 ch
->is
->name
, ch
->cmd
);
533 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
535 skb_trim(ch
->bch
.rx_skb
, 0);
539 if ((ch
->bch
.rx_skb
->len
+ ch
->is
->clsb
) >
540 (ch
->bch
.maxlen
+ 2)) {
541 pr_info("%s: %s incoming packet too large\n",
542 ch
->is
->name
, __func__
);
543 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
544 skb_trim(ch
->bch
.rx_skb
, 0);
546 } else if (ch
->is
->cmsb
& HDLC_ERROR
) {
547 pr_info("%s: ISAR frame error %x len %d\n",
548 ch
->is
->name
, ch
->is
->cmsb
, ch
->is
->clsb
);
549 skb_trim(ch
->bch
.rx_skb
, 0);
550 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
553 if (ch
->is
->cmsb
& HDLC_FSD
)
554 skb_trim(ch
->bch
.rx_skb
, 0);
555 ptr
= skb_put(ch
->bch
.rx_skb
, ch
->is
->clsb
);
556 rcv_mbox(ch
->is
, ptr
);
557 if (ch
->is
->cmsb
& HDLC_FED
) {
558 if (ch
->bch
.rx_skb
->len
< 3) { /* last 2 are the FCS */
559 pr_info("%s: ISAR frame to short %d\n",
560 ch
->is
->name
, ch
->bch
.rx_skb
->len
);
561 skb_trim(ch
->bch
.rx_skb
, 0);
564 skb_trim(ch
->bch
.rx_skb
, ch
->bch
.rx_skb
->len
- 2);
565 recv_Bchannel(&ch
->bch
, 0, false);
567 if (ch
->is
->cmsb
& SART_NMD
) { /* ABORT */
568 pr_debug("%s: isar_rcv_frame: no more data\n",
570 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
572 skb_trim(ch
->bch
.rx_skb
, 0);
573 send_mbox(ch
->is
, SET_DPS(ch
->dpath
) |
574 ISAR_HIS_PUMPCTRL
, PCTRL_CMD_ESC
, 0, NULL
);
575 ch
->state
= STFAX_ESCAPE
;
576 deliver_status(ch
, HW_MOD_NOCARR
);
580 pr_info("isar_rcv_frame protocol (%x)error\n", ch
->bch
.state
);
581 ch
->is
->write_reg(ch
->is
->hw
, ISAR_IIA
, 0);
587 isar_fill_fifo(struct isar_ch
*ch
)
593 pr_debug("%s: ch%d tx_skb %d tx_idx %d\n", ch
->is
->name
, ch
->bch
.nr
,
594 ch
->bch
.tx_skb
? ch
->bch
.tx_skb
->len
: -1, ch
->bch
.tx_idx
);
595 if (!(ch
->is
->bstat
&
596 (ch
->dpath
== 1 ? BSTAT_RDM1
: BSTAT_RDM2
)))
598 if (!ch
->bch
.tx_skb
) {
599 if (!test_bit(FLG_TX_EMPTY
, &ch
->bch
.Flags
) ||
600 (ch
->bch
.state
!= ISDN_P_B_RAW
))
603 /* use the card buffer */
604 memset(ch
->is
->buf
, ch
->bch
.fill
[0], count
);
605 send_mbox(ch
->is
, SET_DPS(ch
->dpath
) | ISAR_HIS_SDATA
,
606 0, count
, ch
->is
->buf
);
609 count
= ch
->bch
.tx_skb
->len
- ch
->bch
.tx_idx
;
612 if (count
> ch
->mml
) {
618 ptr
= ch
->bch
.tx_skb
->data
+ ch
->bch
.tx_idx
;
619 if (!ch
->bch
.tx_idx
) {
620 pr_debug("%s: frame start\n", ch
->is
->name
);
621 if ((ch
->bch
.state
== ISDN_P_B_T30_FAX
) &&
622 (ch
->cmd
== PCTRL_CMD_FTH
)) {
624 if ((ptr
[0] == 0xff) && (ptr
[1] == 0x13)) {
626 test_and_set_bit(FLG_LASTDATA
,
628 pr_debug("%s: set LASTDATA\n",
631 test_and_set_bit(FLG_DLEETX
,
638 ch
->bch
.tx_idx
+= count
;
639 switch (ch
->bch
.state
) {
641 pr_info("%s: wrong protocol 0\n", __func__
);
644 case ISDN_P_B_L2DTMF
:
645 case ISDN_P_B_MODEM_ASYNC
:
646 send_mbox(ch
->is
, SET_DPS(ch
->dpath
) | ISAR_HIS_SDATA
,
650 send_mbox(ch
->is
, SET_DPS(ch
->dpath
) | ISAR_HIS_SDATA
,
653 case ISDN_P_B_T30_FAX
:
654 if (ch
->state
!= STFAX_ACTIV
)
655 pr_debug("%s: not ACTIV\n", ch
->is
->name
);
656 else if (ch
->cmd
== PCTRL_CMD_FTH
)
657 send_mbox(ch
->is
, SET_DPS(ch
->dpath
) | ISAR_HIS_SDATA
,
659 else if (ch
->cmd
== PCTRL_CMD_FTM
)
660 send_mbox(ch
->is
, SET_DPS(ch
->dpath
) | ISAR_HIS_SDATA
,
663 pr_debug("%s: not FTH/FTM\n", ch
->is
->name
);
666 pr_info("%s: protocol(%x) error\n",
667 __func__
, ch
->bch
.state
);
672 static inline struct isar_ch
*
673 sel_bch_isar(struct isar_hw
*isar
, u8 dpath
)
675 struct isar_ch
*base
= &isar
->ch
[0];
677 if ((!dpath
) || (dpath
> 2))
679 if (base
->dpath
== dpath
)
682 if (base
->dpath
== dpath
)
688 send_next(struct isar_ch
*ch
)
690 pr_debug("%s: %s ch%d tx_skb %d tx_idx %d\n", ch
->is
->name
, __func__
,
691 ch
->bch
.nr
, ch
->bch
.tx_skb
? ch
->bch
.tx_skb
->len
: -1,
693 if (ch
->bch
.state
== ISDN_P_B_T30_FAX
) {
694 if (ch
->cmd
== PCTRL_CMD_FTH
) {
695 if (test_bit(FLG_LASTDATA
, &ch
->bch
.Flags
)) {
696 pr_debug("set NMD_DATA\n");
697 test_and_set_bit(FLG_NMD_DATA
, &ch
->bch
.Flags
);
699 } else if (ch
->cmd
== PCTRL_CMD_FTM
) {
700 if (test_bit(FLG_DLEETX
, &ch
->bch
.Flags
)) {
701 test_and_set_bit(FLG_LASTDATA
, &ch
->bch
.Flags
);
702 test_and_set_bit(FLG_NMD_DATA
, &ch
->bch
.Flags
);
707 dev_kfree_skb(ch
->bch
.tx_skb
);
708 if (get_next_bframe(&ch
->bch
)) {
710 test_and_clear_bit(FLG_TX_EMPTY
, &ch
->bch
.Flags
);
711 } else if (test_bit(FLG_TX_EMPTY
, &ch
->bch
.Flags
)) {
714 if (test_and_clear_bit(FLG_DLEETX
, &ch
->bch
.Flags
)) {
715 if (test_and_clear_bit(FLG_LASTDATA
,
717 if (test_and_clear_bit(FLG_NMD_DATA
,
720 send_mbox(ch
->is
, SET_DPS(ch
->dpath
) |
721 ISAR_HIS_SDATA
, 0x01, 1, &zd
);
723 test_and_set_bit(FLG_LL_OK
, &ch
->bch
.Flags
);
725 deliver_status(ch
, HW_MOD_CONNECT
);
727 } else if (test_bit(FLG_FILLEMPTY
, &ch
->bch
.Flags
)) {
728 test_and_set_bit(FLG_TX_EMPTY
, &ch
->bch
.Flags
);
734 check_send(struct isar_hw
*isar
, u8 rdm
)
738 pr_debug("%s: rdm %x\n", isar
->name
, rdm
);
739 if (rdm
& BSTAT_RDM1
) {
740 ch
= sel_bch_isar(isar
, 1);
741 if (ch
&& test_bit(FLG_ACTIVE
, &ch
->bch
.Flags
)) {
742 if (ch
->bch
.tx_skb
&& (ch
->bch
.tx_skb
->len
>
749 if (rdm
& BSTAT_RDM2
) {
750 ch
= sel_bch_isar(isar
, 2);
751 if (ch
&& test_bit(FLG_ACTIVE
, &ch
->bch
.Flags
)) {
752 if (ch
->bch
.tx_skb
&& (ch
->bch
.tx_skb
->len
>
761 const char *dmril
[] = {"NO SPEED", "1200/75", "NODEF2", "75/1200", "NODEF4",
762 "300", "600", "1200", "2400", "4800", "7200",
763 "9600nt", "9600t", "12000", "14400", "WRONG"};
764 const char *dmrim
[] = {"NO MOD", "NO DEF", "V32/V32b", "V22", "V21",
765 "Bell103", "V23", "Bell202", "V17", "V29", "V27ter"};
768 isar_pump_status_rsp(struct isar_ch
*ch
) {
769 u8 ril
= ch
->is
->buf
[0];
772 if (!test_and_clear_bit(ISAR_RATE_REQ
, &ch
->is
->Flags
))
775 pr_info("%s: wrong pstrsp ril=%d\n", ch
->is
->name
, ril
);
778 switch (ch
->is
->buf
[1]) {
813 sprintf(ch
->conmsg
, "%s %s", dmril
[ril
], dmrim
[rim
]);
814 pr_debug("%s: pump strsp %s\n", ch
->is
->name
, ch
->conmsg
);
818 isar_pump_statev_modem(struct isar_ch
*ch
, u8 devt
) {
819 u8 dps
= SET_DPS(ch
->dpath
);
822 case PSEV_10MS_TIMER
:
823 pr_debug("%s: pump stev TIMER\n", ch
->is
->name
);
826 pr_debug("%s: pump stev CONNECT\n", ch
->is
->name
);
827 deliver_status(ch
, HW_MOD_CONNECT
);
830 pr_debug("%s: pump stev NO CONNECT\n", ch
->is
->name
);
831 send_mbox(ch
->is
, dps
| ISAR_HIS_PSTREQ
, 0, 0, NULL
);
832 deliver_status(ch
, HW_MOD_NOCARR
);
835 pr_debug("%s: pump stev V24 OFF\n", ch
->is
->name
);
838 pr_debug("%s: pump stev CTS ON\n", ch
->is
->name
);
841 pr_debug("%s pump stev CTS OFF\n", ch
->is
->name
);
844 pr_debug("%s: pump stev CARRIER ON\n", ch
->is
->name
);
845 test_and_set_bit(ISAR_RATE_REQ
, &ch
->is
->Flags
);
846 send_mbox(ch
->is
, dps
| ISAR_HIS_PSTREQ
, 0, 0, NULL
);
849 pr_debug("%s: pump stev CARRIER OFF\n", ch
->is
->name
);
852 pr_debug("%s: pump stev DSR ON\n", ch
->is
->name
);
855 pr_debug("%s: pump stev DSR_OFF\n", ch
->is
->name
);
858 pr_debug("%s: pump stev REMOTE RETRAIN\n", ch
->is
->name
);
861 pr_debug("%s: pump stev REMOTE RENEGOTIATE\n", ch
->is
->name
);
864 pr_debug("%s: pump stev GSTN CLEAR\n", ch
->is
->name
);
867 pr_info("u%s: unknown pump stev %x\n", ch
->is
->name
, devt
);
873 isar_pump_statev_fax(struct isar_ch
*ch
, u8 devt
) {
874 u8 dps
= SET_DPS(ch
->dpath
);
878 case PSEV_10MS_TIMER
:
879 pr_debug("%s: pump stev TIMER\n", ch
->is
->name
);
882 pr_debug("%s: pump stev RSP_READY\n", ch
->is
->name
);
883 ch
->state
= STFAX_READY
;
884 deliver_status(ch
, HW_MOD_READY
);
886 if (test_bit(BC_FLG_ORIG
, &ch
->bch
.Flags
))
887 isar_pump_cmd(bch
, HW_MOD_FRH
, 3);
889 isar_pump_cmd(bch
, HW_MOD_FTH
, 3);
893 if (ch
->state
== STFAX_LINE
) {
894 pr_debug("%s: pump stev LINE_TX_H\n", ch
->is
->name
);
895 ch
->state
= STFAX_CONT
;
896 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
897 PCTRL_CMD_CONT
, 0, NULL
);
899 pr_debug("%s: pump stev LINE_TX_H wrong st %x\n",
900 ch
->is
->name
, ch
->state
);
904 if (ch
->state
== STFAX_LINE
) {
905 pr_debug("%s: pump stev LINE_RX_H\n", ch
->is
->name
);
906 ch
->state
= STFAX_CONT
;
907 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
908 PCTRL_CMD_CONT
, 0, NULL
);
910 pr_debug("%s: pump stev LINE_RX_H wrong st %x\n",
911 ch
->is
->name
, ch
->state
);
915 if (ch
->state
== STFAX_LINE
) {
916 pr_debug("%s: pump stev LINE_TX_B\n", ch
->is
->name
);
917 ch
->state
= STFAX_CONT
;
918 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
919 PCTRL_CMD_CONT
, 0, NULL
);
921 pr_debug("%s: pump stev LINE_TX_B wrong st %x\n",
922 ch
->is
->name
, ch
->state
);
926 if (ch
->state
== STFAX_LINE
) {
927 pr_debug("%s: pump stev LINE_RX_B\n", ch
->is
->name
);
928 ch
->state
= STFAX_CONT
;
929 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
930 PCTRL_CMD_CONT
, 0, NULL
);
932 pr_debug("%s: pump stev LINE_RX_B wrong st %x\n",
933 ch
->is
->name
, ch
->state
);
937 if (ch
->state
== STFAX_CONT
) {
938 pr_debug("%s: pump stev RSP_CONN\n", ch
->is
->name
);
939 ch
->state
= STFAX_ACTIV
;
940 test_and_set_bit(ISAR_RATE_REQ
, &ch
->is
->Flags
);
941 send_mbox(ch
->is
, dps
| ISAR_HIS_PSTREQ
, 0, 0, NULL
);
942 if (ch
->cmd
== PCTRL_CMD_FTH
) {
943 int delay
= (ch
->mod
== 3) ? 1000 : 200;
944 /* 1s (200 ms) Flags before data */
945 if (test_and_set_bit(FLG_FTI_RUN
,
947 del_timer(&ch
->ftimer
);
949 jiffies
+ ((delay
* HZ
) / 1000);
950 test_and_set_bit(FLG_LL_CONN
,
952 add_timer(&ch
->ftimer
);
954 deliver_status(ch
, HW_MOD_CONNECT
);
957 pr_debug("%s: pump stev RSP_CONN wrong st %x\n",
958 ch
->is
->name
, ch
->state
);
962 pr_debug("%s: pump stev FLAGS_DET\n", ch
->is
->name
);
965 pr_debug("%s: pump stev RSP_DISC state(%d)\n",
966 ch
->is
->name
, ch
->state
);
967 if (ch
->state
== STFAX_ESCAPE
) {
969 switch (ch
->newcmd
) {
971 ch
->state
= STFAX_READY
;
976 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
977 PCTRL_CMD_SILON
, 1, &p1
);
978 ch
->state
= STFAX_SILDET
;
982 ch
->mod
= ch
->newmod
;
985 ch
->cmd
= ch
->newcmd
;
987 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
989 ch
->state
= STFAX_LINE
;
993 pr_debug("%s: RSP_DISC unknown newcmd %x\n",
994 ch
->is
->name
, ch
->newcmd
);
997 } else if (ch
->state
== STFAX_ACTIV
) {
998 if (test_and_clear_bit(FLG_LL_OK
, &ch
->bch
.Flags
))
999 deliver_status(ch
, HW_MOD_OK
);
1000 else if (ch
->cmd
== PCTRL_CMD_FRM
)
1001 deliver_status(ch
, HW_MOD_NOCARR
);
1003 deliver_status(ch
, HW_MOD_FCERROR
);
1004 ch
->state
= STFAX_READY
;
1005 } else if (ch
->state
!= STFAX_SILDET
) {
1006 /* ignore in STFAX_SILDET */
1007 ch
->state
= STFAX_READY
;
1008 deliver_status(ch
, HW_MOD_FCERROR
);
1011 case PSEV_RSP_SILDET
:
1012 pr_debug("%s: pump stev RSP_SILDET\n", ch
->is
->name
);
1013 if (ch
->state
== STFAX_SILDET
) {
1014 ch
->mod
= ch
->newmod
;
1017 ch
->cmd
= ch
->newcmd
;
1019 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
1021 ch
->state
= STFAX_LINE
;
1025 case PSEV_RSP_SILOFF
:
1026 pr_debug("%s: pump stev RSP_SILOFF\n", ch
->is
->name
);
1028 case PSEV_RSP_FCERR
:
1029 if (ch
->state
== STFAX_LINE
) {
1030 pr_debug("%s: pump stev RSP_FCERR try %d\n",
1031 ch
->is
->name
, ch
->try_mod
);
1032 if (ch
->try_mod
--) {
1033 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
1034 ch
->cmd
, 1, &ch
->mod
);
1038 pr_debug("%s: pump stev RSP_FCERR\n", ch
->is
->name
);
1039 ch
->state
= STFAX_ESCAPE
;
1040 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
, PCTRL_CMD_ESC
,
1042 deliver_status(ch
, HW_MOD_FCERROR
);
1050 mISDNisar_irq(struct isar_hw
*isar
)
1054 get_irq_infos(isar
);
1055 switch (isar
->iis
& ISAR_IIS_MSCMSD
) {
1056 case ISAR_IIS_RDATA
:
1057 ch
= sel_bch_isar(isar
, isar
->iis
>> 6);
1061 pr_debug("%s: ISAR spurious IIS_RDATA %x/%x/%x\n",
1062 isar
->name
, isar
->iis
, isar
->cmsb
,
1064 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
1067 case ISAR_IIS_GSTEV
:
1068 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
1069 isar
->bstat
|= isar
->cmsb
;
1070 check_send(isar
, isar
->cmsb
);
1072 case ISAR_IIS_BSTEV
:
1073 #ifdef ERROR_STATISTIC
1074 ch
= sel_bch_isar(isar
, isar
->iis
>> 6);
1076 if (isar
->cmsb
== BSTEV_TBO
)
1078 if (isar
->cmsb
== BSTEV_RBO
)
1082 pr_debug("%s: Buffer STEV dpath%d msb(%x)\n",
1083 isar
->name
, isar
->iis
>> 6, isar
->cmsb
);
1084 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
1086 case ISAR_IIS_PSTEV
:
1087 ch
= sel_bch_isar(isar
, isar
->iis
>> 6);
1089 rcv_mbox(isar
, NULL
);
1090 if (ch
->bch
.state
== ISDN_P_B_MODEM_ASYNC
)
1091 isar_pump_statev_modem(ch
, isar
->cmsb
);
1092 else if (ch
->bch
.state
== ISDN_P_B_T30_FAX
)
1093 isar_pump_statev_fax(ch
, isar
->cmsb
);
1094 else if (ch
->bch
.state
== ISDN_P_B_RAW
) {
1096 tt
= isar
->cmsb
| 0x30;
1099 else if (tt
== 0x3f)
1103 tt
|= DTMF_TONE_VAL
;
1104 _queue_data(&ch
->bch
.ch
, PH_CONTROL_IND
,
1105 MISDN_ID_ANY
, sizeof(tt
), &tt
,
1108 pr_debug("%s: ISAR IIS_PSTEV pm %d sta %x\n",
1109 isar
->name
, ch
->bch
.state
,
1112 pr_debug("%s: ISAR spurious IIS_PSTEV %x/%x/%x\n",
1113 isar
->name
, isar
->iis
, isar
->cmsb
,
1115 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
1118 case ISAR_IIS_PSTRSP
:
1119 ch
= sel_bch_isar(isar
, isar
->iis
>> 6);
1121 rcv_mbox(isar
, NULL
);
1122 isar_pump_status_rsp(ch
);
1124 pr_debug("%s: ISAR spurious IIS_PSTRSP %x/%x/%x\n",
1125 isar
->name
, isar
->iis
, isar
->cmsb
,
1127 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
1131 case ISAR_IIS_BSTRSP
:
1132 case ISAR_IIS_IOM2RSP
:
1133 rcv_mbox(isar
, NULL
);
1135 case ISAR_IIS_INVMSG
:
1136 rcv_mbox(isar
, NULL
);
1137 pr_debug("%s: invalid msg his:%x\n", isar
->name
, isar
->cmsb
);
1140 rcv_mbox(isar
, NULL
);
1141 pr_debug("%s: unhandled msg iis(%x) ctrl(%x/%x)\n",
1142 isar
->name
, isar
->iis
, isar
->cmsb
, isar
->clsb
);
1146 EXPORT_SYMBOL(mISDNisar_irq
);
1149 ftimer_handler(unsigned long data
)
1151 struct isar_ch
*ch
= (struct isar_ch
*)data
;
1153 pr_debug("%s: ftimer flags %lx\n", ch
->is
->name
, ch
->bch
.Flags
);
1154 test_and_clear_bit(FLG_FTI_RUN
, &ch
->bch
.Flags
);
1155 if (test_and_clear_bit(FLG_LL_CONN
, &ch
->bch
.Flags
))
1156 deliver_status(ch
, HW_MOD_CONNECT
);
1160 setup_pump(struct isar_ch
*ch
) {
1161 u8 dps
= SET_DPS(ch
->dpath
);
1164 switch (ch
->bch
.state
) {
1168 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCFG
, PMOD_BYPASS
, 0, NULL
);
1170 case ISDN_P_B_L2DTMF
:
1171 if (test_bit(FLG_DTMFSEND
, &ch
->bch
.Flags
)) {
1172 param
[0] = 5; /* TOA 5 db */
1173 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCFG
,
1174 PMOD_DTMF_TRANS
, 1, param
);
1176 param
[0] = 40; /* REL -46 dbm */
1177 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCFG
,
1178 PMOD_DTMF
, 1, param
);
1180 case ISDN_P_B_MODEM_ASYNC
:
1181 ctrl
= PMOD_DATAMODEM
;
1182 if (test_bit(FLG_ORIGIN
, &ch
->bch
.Flags
)) {
1184 param
[5] = PV32P6_CTN
;
1186 param
[5] = PV32P6_ATN
;
1188 param
[0] = 6; /* 6 db */
1189 param
[1] = PV32P2_V23R
| PV32P2_V22A
| PV32P2_V22B
|
1190 PV32P2_V22C
| PV32P2_V21
| PV32P2_BEL
;
1191 param
[2] = PV32P3_AMOD
| PV32P3_V32B
| PV32P3_V23B
;
1192 param
[3] = PV32P4_UT144
;
1193 param
[4] = PV32P5_UT144
;
1194 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCFG
, ctrl
, 6, param
);
1196 case ISDN_P_B_T30_FAX
:
1198 if (test_bit(FLG_ORIGIN
, &ch
->bch
.Flags
)) {
1200 param
[1] = PFAXP2_CTN
;
1202 param
[1] = PFAXP2_ATN
;
1204 param
[0] = 6; /* 6 db */
1205 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCFG
, ctrl
, 2, param
);
1206 ch
->state
= STFAX_NULL
;
1209 test_and_set_bit(FLG_FTI_RUN
, &ch
->bch
.Flags
);
1213 send_mbox(ch
->is
, dps
| ISAR_HIS_PSTREQ
, 0, 0, NULL
);
1218 setup_sart(struct isar_ch
*ch
) {
1219 u8 dps
= SET_DPS(ch
->dpath
);
1220 u8 ctrl
, param
[2] = {0, 0};
1222 switch (ch
->bch
.state
) {
1224 send_mbox(ch
->is
, dps
| ISAR_HIS_SARTCFG
, SMODE_DISABLE
,
1228 case ISDN_P_B_L2DTMF
:
1229 send_mbox(ch
->is
, dps
| ISAR_HIS_SARTCFG
, SMODE_BINARY
,
1233 case ISDN_P_B_T30_FAX
:
1234 send_mbox(ch
->is
, dps
| ISAR_HIS_SARTCFG
, SMODE_HDLC
,
1237 case ISDN_P_B_MODEM_ASYNC
:
1238 ctrl
= SMODE_V14
| SCTRL_HDMC_BOTH
;
1239 param
[0] = S_P1_CHS_8
;
1240 param
[1] = S_P2_BFT_DEF
;
1241 send_mbox(ch
->is
, dps
| ISAR_HIS_SARTCFG
, ctrl
, 2, param
);
1245 send_mbox(ch
->is
, dps
| ISAR_HIS_BSTREQ
, 0, 0, NULL
);
1250 setup_iom2(struct isar_ch
*ch
) {
1251 u8 dps
= SET_DPS(ch
->dpath
);
1252 u8 cmsb
= IOM_CTRL_ENA
, msg
[5] = {IOM_P1_TXD
, 0, 0, 0, 0};
1254 if (ch
->bch
.nr
== 2) {
1258 switch (ch
->bch
.state
) {
1262 msg
[1] = ch
->dpath
+ 2;
1263 msg
[3] = ch
->dpath
+ 2;
1268 case ISDN_P_B_MODEM_ASYNC
:
1269 case ISDN_P_B_T30_FAX
:
1270 cmsb
|= IOM_CTRL_RCV
;
1271 case ISDN_P_B_L2DTMF
:
1272 if (test_bit(FLG_DTMFSEND
, &ch
->bch
.Flags
))
1273 cmsb
|= IOM_CTRL_RCV
;
1274 cmsb
|= IOM_CTRL_ALAW
;
1277 send_mbox(ch
->is
, dps
| ISAR_HIS_IOM2CFG
, cmsb
, 5, msg
);
1279 send_mbox(ch
->is
, dps
| ISAR_HIS_IOM2REQ
, 0, 0, NULL
);
1284 modeisar(struct isar_ch
*ch
, u32 bprotocol
)
1286 /* Here we are selecting the best datapath for requested protocol */
1287 if (ch
->bch
.state
== ISDN_P_NONE
) { /* New Setup */
1288 switch (bprotocol
) {
1289 case ISDN_P_NONE
: /* init */
1291 /* no init for dpath 0 */
1293 test_and_clear_bit(FLG_HDLC
, &ch
->bch
.Flags
);
1294 test_and_clear_bit(FLG_TRANSPARENT
, &ch
->bch
.Flags
);
1298 /* best is datapath 2 */
1299 if (!test_and_set_bit(ISAR_DP2_USE
, &ch
->is
->Flags
))
1301 else if (!test_and_set_bit(ISAR_DP1_USE
,
1305 pr_info("modeisar both paths in use\n");
1308 if (bprotocol
== ISDN_P_B_HDLC
)
1309 test_and_set_bit(FLG_HDLC
, &ch
->bch
.Flags
);
1311 test_and_set_bit(FLG_TRANSPARENT
,
1314 case ISDN_P_B_MODEM_ASYNC
:
1315 case ISDN_P_B_T30_FAX
:
1316 case ISDN_P_B_L2DTMF
:
1317 /* only datapath 1 */
1318 if (!test_and_set_bit(ISAR_DP1_USE
, &ch
->is
->Flags
))
1321 pr_info("%s: ISAR modeisar analog functions"
1322 "only with DP1\n", ch
->is
->name
);
1327 pr_info("%s: protocol not known %x\n", ch
->is
->name
,
1329 return -ENOPROTOOPT
;
1332 pr_debug("%s: ISAR ch%d dp%d protocol %x->%x\n", ch
->is
->name
,
1333 ch
->bch
.nr
, ch
->dpath
, ch
->bch
.state
, bprotocol
);
1334 ch
->bch
.state
= bprotocol
;
1338 if (ch
->bch
.state
== ISDN_P_NONE
) {
1339 /* Clear resources */
1341 test_and_clear_bit(ISAR_DP1_USE
, &ch
->is
->Flags
);
1342 else if (ch
->dpath
== 2)
1343 test_and_clear_bit(ISAR_DP2_USE
, &ch
->is
->Flags
);
1345 ch
->is
->ctrl(ch
->is
->hw
, HW_DEACT_IND
, ch
->bch
.nr
);
1347 ch
->is
->ctrl(ch
->is
->hw
, HW_ACTIVATE_IND
, ch
->bch
.nr
);
1352 isar_pump_cmd(struct isar_ch
*ch
, u32 cmd
, u8 para
)
1354 u8 dps
= SET_DPS(ch
->dpath
);
1355 u8 ctrl
= 0, nom
= 0, p1
= 0;
1357 pr_debug("%s: isar_pump_cmd %x/%x state(%x)\n",
1358 ch
->is
->name
, cmd
, para
, ch
->bch
.state
);
1361 if (ch
->state
== STFAX_READY
) {
1363 ctrl
= PCTRL_CMD_FTM
;
1365 ch
->state
= STFAX_LINE
;
1371 } else if ((ch
->state
== STFAX_ACTIV
) &&
1372 (ch
->cmd
== PCTRL_CMD_FTM
) && (ch
->mod
== para
))
1373 deliver_status(ch
, HW_MOD_CONNECT
);
1376 ch
->newcmd
= PCTRL_CMD_FTM
;
1378 ctrl
= PCTRL_CMD_ESC
;
1379 ch
->state
= STFAX_ESCAPE
;
1383 if (ch
->state
== STFAX_READY
) {
1385 ctrl
= PCTRL_CMD_FTH
;
1387 ch
->state
= STFAX_LINE
;
1393 } else if ((ch
->state
== STFAX_ACTIV
) &&
1394 (ch
->cmd
== PCTRL_CMD_FTH
) && (ch
->mod
== para
))
1395 deliver_status(ch
, HW_MOD_CONNECT
);
1398 ch
->newcmd
= PCTRL_CMD_FTH
;
1400 ctrl
= PCTRL_CMD_ESC
;
1401 ch
->state
= STFAX_ESCAPE
;
1405 if (ch
->state
== STFAX_READY
) {
1407 ctrl
= PCTRL_CMD_FRM
;
1409 ch
->state
= STFAX_LINE
;
1415 } else if ((ch
->state
== STFAX_ACTIV
) &&
1416 (ch
->cmd
== PCTRL_CMD_FRM
) && (ch
->mod
== para
))
1417 deliver_status(ch
, HW_MOD_CONNECT
);
1420 ch
->newcmd
= PCTRL_CMD_FRM
;
1422 ctrl
= PCTRL_CMD_ESC
;
1423 ch
->state
= STFAX_ESCAPE
;
1427 if (ch
->state
== STFAX_READY
) {
1429 ctrl
= PCTRL_CMD_FRH
;
1431 ch
->state
= STFAX_LINE
;
1437 } else if ((ch
->state
== STFAX_ACTIV
) &&
1438 (ch
->cmd
== PCTRL_CMD_FRH
) && (ch
->mod
== para
))
1439 deliver_status(ch
, HW_MOD_CONNECT
);
1442 ch
->newcmd
= PCTRL_CMD_FRH
;
1444 ctrl
= PCTRL_CMD_ESC
;
1445 ch
->state
= STFAX_ESCAPE
;
1448 case PCTRL_CMD_TDTMF
:
1451 ctrl
= PCTRL_CMD_TDTMF
;
1455 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
, ctrl
, nom
, &p1
);
1459 isar_setup(struct isar_hw
*isar
)
1466 for (i
= 0; i
< 2; i
++) {
1468 send_mbox(isar
, (i
? ISAR_HIS_DPS2
: ISAR_HIS_DPS1
) |
1469 ISAR_HIS_P12CFG
, 4, 1, &msg
);
1470 isar
->ch
[i
].mml
= msg
;
1471 isar
->ch
[i
].bch
.state
= 0;
1472 isar
->ch
[i
].dpath
= i
+ 1;
1473 modeisar(&isar
->ch
[i
], ISDN_P_NONE
);
1478 isar_l2l1(struct mISDNchannel
*ch
, struct sk_buff
*skb
)
1480 struct bchannel
*bch
= container_of(ch
, struct bchannel
, ch
);
1481 struct isar_ch
*ich
= container_of(bch
, struct isar_ch
, bch
);
1483 struct mISDNhead
*hh
= mISDN_HEAD_P(skb
);
1489 spin_lock_irqsave(ich
->is
->hwlock
, flags
);
1490 ret
= bchannel_senddata(bch
, skb
);
1491 if (ret
> 0) { /* direct TX */
1493 isar_fill_fifo(ich
);
1495 spin_unlock_irqrestore(ich
->is
->hwlock
, flags
);
1497 case PH_ACTIVATE_REQ
:
1498 spin_lock_irqsave(ich
->is
->hwlock
, flags
);
1499 if (!test_and_set_bit(FLG_ACTIVE
, &bch
->Flags
))
1500 ret
= modeisar(ich
, ch
->protocol
);
1503 spin_unlock_irqrestore(ich
->is
->hwlock
, flags
);
1505 _queue_data(ch
, PH_ACTIVATE_IND
, MISDN_ID_ANY
, 0,
1508 case PH_DEACTIVATE_REQ
:
1509 spin_lock_irqsave(ich
->is
->hwlock
, flags
);
1510 mISDN_clear_bchannel(bch
);
1511 modeisar(ich
, ISDN_P_NONE
);
1512 spin_unlock_irqrestore(ich
->is
->hwlock
, flags
);
1513 _queue_data(ch
, PH_DEACTIVATE_IND
, MISDN_ID_ANY
, 0,
1517 case PH_CONTROL_REQ
:
1518 val
= (u32
*)skb
->data
;
1519 pr_debug("%s: PH_CONTROL | REQUEST %x/%x\n", ich
->is
->name
,
1521 if ((hh
->id
== 0) && ((*val
& ~DTMF_TONE_MASK
) ==
1523 if (bch
->state
== ISDN_P_B_L2DTMF
) {
1524 char tt
= *val
& DTMF_TONE_MASK
;
1533 spin_lock_irqsave(ich
->is
->hwlock
, flags
);
1534 isar_pump_cmd(ich
, PCTRL_CMD_TDTMF
, tt
);
1535 spin_unlock_irqrestore(ich
->is
->hwlock
, flags
);
1537 pr_info("%s: DTMF send wrong protocol %x\n",
1538 __func__
, bch
->state
);
1541 } else if ((hh
->id
== HW_MOD_FRM
) || (hh
->id
== HW_MOD_FRH
) ||
1542 (hh
->id
== HW_MOD_FTM
) || (hh
->id
== HW_MOD_FTH
)) {
1543 for (id
= 0; id
< FAXMODCNT
; id
++)
1544 if (faxmodulation
[id
] == *val
)
1546 if ((FAXMODCNT
> id
) &&
1547 test_bit(FLG_INITIALIZED
, &bch
->Flags
)) {
1548 pr_debug("%s: isar: new mod\n", ich
->is
->name
);
1549 isar_pump_cmd(ich
, hh
->id
, *val
);
1552 pr_info("%s: wrong modulation\n",
1556 } else if (hh
->id
== HW_MOD_LASTDATA
)
1557 test_and_set_bit(FLG_DLEETX
, &bch
->Flags
);
1559 pr_info("%s: unknown PH_CONTROL_REQ %x\n",
1560 ich
->is
->name
, hh
->id
);
1564 pr_info("%s: %s unknown prim(%x,%x)\n",
1565 ich
->is
->name
, __func__
, hh
->prim
, hh
->id
);
1574 channel_bctrl(struct bchannel
*bch
, struct mISDN_ctrl_req
*cq
)
1576 return mISDN_ctrl_bchannel(bch
, cq
);
1580 isar_bctrl(struct mISDNchannel
*ch
, u32 cmd
, void *arg
)
1582 struct bchannel
*bch
= container_of(ch
, struct bchannel
, ch
);
1583 struct isar_ch
*ich
= container_of(bch
, struct isar_ch
, bch
);
1587 pr_debug("%s: %s cmd:%x %p\n", ich
->is
->name
, __func__
, cmd
, arg
);
1590 test_and_clear_bit(FLG_OPEN
, &bch
->Flags
);
1591 cancel_work_sync(&bch
->workq
);
1592 spin_lock_irqsave(ich
->is
->hwlock
, flags
);
1593 mISDN_clear_bchannel(bch
);
1594 modeisar(ich
, ISDN_P_NONE
);
1595 spin_unlock_irqrestore(ich
->is
->hwlock
, flags
);
1596 ch
->protocol
= ISDN_P_NONE
;
1598 module_put(ich
->is
->owner
);
1601 case CONTROL_CHANNEL
:
1602 ret
= channel_bctrl(bch
, arg
);
1605 pr_info("%s: %s unknown prim(%x)\n",
1606 ich
->is
->name
, __func__
, cmd
);
1612 free_isar(struct isar_hw
*isar
)
1614 modeisar(&isar
->ch
[0], ISDN_P_NONE
);
1615 modeisar(&isar
->ch
[1], ISDN_P_NONE
);
1616 del_timer(&isar
->ch
[0].ftimer
);
1617 del_timer(&isar
->ch
[1].ftimer
);
1618 test_and_clear_bit(FLG_INITIALIZED
, &isar
->ch
[0].bch
.Flags
);
1619 test_and_clear_bit(FLG_INITIALIZED
, &isar
->ch
[1].bch
.Flags
);
1623 init_isar(struct isar_hw
*isar
)
1628 isar
->version
= ISARVersion(isar
);
1629 if (isar
->ch
[0].bch
.debug
& DEBUG_HW
)
1630 pr_notice("%s: Testing version %d (%d time)\n",
1631 isar
->name
, isar
->version
, 3 - cnt
);
1632 if (isar
->version
== 1)
1634 isar
->ctrl(isar
->hw
, HW_RESET_REQ
, 0);
1636 if (isar
->version
!= 1)
1638 isar
->ch
[0].ftimer
.function
= &ftimer_handler
;
1639 isar
->ch
[0].ftimer
.data
= (long)&isar
->ch
[0];
1640 init_timer(&isar
->ch
[0].ftimer
);
1641 test_and_set_bit(FLG_INITIALIZED
, &isar
->ch
[0].bch
.Flags
);
1642 isar
->ch
[1].ftimer
.function
= &ftimer_handler
;
1643 isar
->ch
[1].ftimer
.data
= (long)&isar
->ch
[1];
1644 init_timer(&isar
->ch
[1].ftimer
);
1645 test_and_set_bit(FLG_INITIALIZED
, &isar
->ch
[1].bch
.Flags
);
1650 isar_open(struct isar_hw
*isar
, struct channel_req
*rq
)
1652 struct bchannel
*bch
;
1654 if (rq
->adr
.channel
== 0 || rq
->adr
.channel
> 2)
1656 if (rq
->protocol
== ISDN_P_NONE
)
1658 bch
= &isar
->ch
[rq
->adr
.channel
- 1].bch
;
1659 if (test_and_set_bit(FLG_OPEN
, &bch
->Flags
))
1660 return -EBUSY
; /* b-channel can be only open once */
1661 bch
->ch
.protocol
= rq
->protocol
;
1667 mISDNisar_init(struct isar_hw
*isar
, void *hw
)
1672 for (i
= 0; i
< 2; i
++) {
1673 isar
->ch
[i
].bch
.nr
= i
+ 1;
1674 mISDN_initbchannel(&isar
->ch
[i
].bch
, MAX_DATA_MEM
, 32);
1675 isar
->ch
[i
].bch
.ch
.nr
= i
+ 1;
1676 isar
->ch
[i
].bch
.ch
.send
= &isar_l2l1
;
1677 isar
->ch
[i
].bch
.ch
.ctrl
= isar_bctrl
;
1678 isar
->ch
[i
].bch
.hw
= hw
;
1679 isar
->ch
[i
].is
= isar
;
1682 isar
->init
= &init_isar
;
1683 isar
->release
= &free_isar
;
1684 isar
->firmware
= &load_firmware
;
1685 isar
->open
= &isar_open
;
1687 ret
= (1 << (ISDN_P_B_RAW
& ISDN_P_B_MASK
)) |
1688 (1 << (ISDN_P_B_HDLC
& ISDN_P_B_MASK
)) |
1689 (1 << (ISDN_P_B_L2DTMF
& ISDN_P_B_MASK
)) |
1690 (1 << (ISDN_P_B_MODEM_ASYNC
& ISDN_P_B_MASK
)) |
1691 (1 << (ISDN_P_B_T30_FAX
& ISDN_P_B_MASK
));
1695 EXPORT_SYMBOL(mISDNisar_init
);
1697 static int __init
isar_mod_init(void)
1699 pr_notice("mISDN: ISAR driver Rev. %s\n", ISAR_REV
);
1703 static void __exit
isar_mod_cleanup(void)
1705 pr_notice("mISDN: ISAR module unloaded\n");
1707 module_init(isar_mod_init
);
1708 module_exit(isar_mod_cleanup
);