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
;
977 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
978 PCTRL_CMD_SILON
, 1, &p1
);
979 ch
->state
= STFAX_SILDET
;
983 ch
->mod
= ch
->newmod
;
986 ch
->cmd
= ch
->newcmd
;
988 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
990 ch
->state
= STFAX_LINE
;
994 pr_debug("%s: RSP_DISC unknown newcmd %x\n",
995 ch
->is
->name
, ch
->newcmd
);
998 } else if (ch
->state
== STFAX_ACTIV
) {
999 if (test_and_clear_bit(FLG_LL_OK
, &ch
->bch
.Flags
))
1000 deliver_status(ch
, HW_MOD_OK
);
1001 else if (ch
->cmd
== PCTRL_CMD_FRM
)
1002 deliver_status(ch
, HW_MOD_NOCARR
);
1004 deliver_status(ch
, HW_MOD_FCERROR
);
1005 ch
->state
= STFAX_READY
;
1006 } else if (ch
->state
!= STFAX_SILDET
) {
1007 /* ignore in STFAX_SILDET */
1008 ch
->state
= STFAX_READY
;
1009 deliver_status(ch
, HW_MOD_FCERROR
);
1012 case PSEV_RSP_SILDET
:
1013 pr_debug("%s: pump stev RSP_SILDET\n", ch
->is
->name
);
1014 if (ch
->state
== STFAX_SILDET
) {
1015 ch
->mod
= ch
->newmod
;
1018 ch
->cmd
= ch
->newcmd
;
1020 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
1022 ch
->state
= STFAX_LINE
;
1026 case PSEV_RSP_SILOFF
:
1027 pr_debug("%s: pump stev RSP_SILOFF\n", ch
->is
->name
);
1029 case PSEV_RSP_FCERR
:
1030 if (ch
->state
== STFAX_LINE
) {
1031 pr_debug("%s: pump stev RSP_FCERR try %d\n",
1032 ch
->is
->name
, ch
->try_mod
);
1033 if (ch
->try_mod
--) {
1034 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
,
1035 ch
->cmd
, 1, &ch
->mod
);
1039 pr_debug("%s: pump stev RSP_FCERR\n", ch
->is
->name
);
1040 ch
->state
= STFAX_ESCAPE
;
1041 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
, PCTRL_CMD_ESC
,
1043 deliver_status(ch
, HW_MOD_FCERROR
);
1051 mISDNisar_irq(struct isar_hw
*isar
)
1055 get_irq_infos(isar
);
1056 switch (isar
->iis
& ISAR_IIS_MSCMSD
) {
1057 case ISAR_IIS_RDATA
:
1058 ch
= sel_bch_isar(isar
, isar
->iis
>> 6);
1062 pr_debug("%s: ISAR spurious IIS_RDATA %x/%x/%x\n",
1063 isar
->name
, isar
->iis
, isar
->cmsb
,
1065 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
1068 case ISAR_IIS_GSTEV
:
1069 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
1070 isar
->bstat
|= isar
->cmsb
;
1071 check_send(isar
, isar
->cmsb
);
1073 case ISAR_IIS_BSTEV
:
1074 #ifdef ERROR_STATISTIC
1075 ch
= sel_bch_isar(isar
, isar
->iis
>> 6);
1077 if (isar
->cmsb
== BSTEV_TBO
)
1079 if (isar
->cmsb
== BSTEV_RBO
)
1083 pr_debug("%s: Buffer STEV dpath%d msb(%x)\n",
1084 isar
->name
, isar
->iis
>> 6, isar
->cmsb
);
1085 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
1087 case ISAR_IIS_PSTEV
:
1088 ch
= sel_bch_isar(isar
, isar
->iis
>> 6);
1090 rcv_mbox(isar
, NULL
);
1091 if (ch
->bch
.state
== ISDN_P_B_MODEM_ASYNC
)
1092 isar_pump_statev_modem(ch
, isar
->cmsb
);
1093 else if (ch
->bch
.state
== ISDN_P_B_T30_FAX
)
1094 isar_pump_statev_fax(ch
, isar
->cmsb
);
1095 else if (ch
->bch
.state
== ISDN_P_B_RAW
) {
1097 tt
= isar
->cmsb
| 0x30;
1100 else if (tt
== 0x3f)
1104 tt
|= DTMF_TONE_VAL
;
1105 _queue_data(&ch
->bch
.ch
, PH_CONTROL_IND
,
1106 MISDN_ID_ANY
, sizeof(tt
), &tt
,
1109 pr_debug("%s: ISAR IIS_PSTEV pm %d sta %x\n",
1110 isar
->name
, ch
->bch
.state
,
1113 pr_debug("%s: ISAR spurious IIS_PSTEV %x/%x/%x\n",
1114 isar
->name
, isar
->iis
, isar
->cmsb
,
1116 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
1119 case ISAR_IIS_PSTRSP
:
1120 ch
= sel_bch_isar(isar
, isar
->iis
>> 6);
1122 rcv_mbox(isar
, NULL
);
1123 isar_pump_status_rsp(ch
);
1125 pr_debug("%s: ISAR spurious IIS_PSTRSP %x/%x/%x\n",
1126 isar
->name
, isar
->iis
, isar
->cmsb
,
1128 isar
->write_reg(isar
->hw
, ISAR_IIA
, 0);
1132 case ISAR_IIS_BSTRSP
:
1133 case ISAR_IIS_IOM2RSP
:
1134 rcv_mbox(isar
, NULL
);
1136 case ISAR_IIS_INVMSG
:
1137 rcv_mbox(isar
, NULL
);
1138 pr_debug("%s: invalid msg his:%x\n", isar
->name
, isar
->cmsb
);
1141 rcv_mbox(isar
, NULL
);
1142 pr_debug("%s: unhandled msg iis(%x) ctrl(%x/%x)\n",
1143 isar
->name
, isar
->iis
, isar
->cmsb
, isar
->clsb
);
1147 EXPORT_SYMBOL(mISDNisar_irq
);
1150 ftimer_handler(struct timer_list
*t
)
1152 struct isar_ch
*ch
= from_timer(ch
, t
, ftimer
);
1154 pr_debug("%s: ftimer flags %lx\n", ch
->is
->name
, ch
->bch
.Flags
);
1155 test_and_clear_bit(FLG_FTI_RUN
, &ch
->bch
.Flags
);
1156 if (test_and_clear_bit(FLG_LL_CONN
, &ch
->bch
.Flags
))
1157 deliver_status(ch
, HW_MOD_CONNECT
);
1161 setup_pump(struct isar_ch
*ch
) {
1162 u8 dps
= SET_DPS(ch
->dpath
);
1165 switch (ch
->bch
.state
) {
1169 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCFG
, PMOD_BYPASS
, 0, NULL
);
1171 case ISDN_P_B_L2DTMF
:
1172 if (test_bit(FLG_DTMFSEND
, &ch
->bch
.Flags
)) {
1173 param
[0] = 5; /* TOA 5 db */
1174 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCFG
,
1175 PMOD_DTMF_TRANS
, 1, param
);
1177 param
[0] = 40; /* REL -46 dbm */
1178 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCFG
,
1179 PMOD_DTMF
, 1, param
);
1182 case ISDN_P_B_MODEM_ASYNC
:
1183 ctrl
= PMOD_DATAMODEM
;
1184 if (test_bit(FLG_ORIGIN
, &ch
->bch
.Flags
)) {
1186 param
[5] = PV32P6_CTN
;
1188 param
[5] = PV32P6_ATN
;
1190 param
[0] = 6; /* 6 db */
1191 param
[1] = PV32P2_V23R
| PV32P2_V22A
| PV32P2_V22B
|
1192 PV32P2_V22C
| PV32P2_V21
| PV32P2_BEL
;
1193 param
[2] = PV32P3_AMOD
| PV32P3_V32B
| PV32P3_V23B
;
1194 param
[3] = PV32P4_UT144
;
1195 param
[4] = PV32P5_UT144
;
1196 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCFG
, ctrl
, 6, param
);
1198 case ISDN_P_B_T30_FAX
:
1200 if (test_bit(FLG_ORIGIN
, &ch
->bch
.Flags
)) {
1202 param
[1] = PFAXP2_CTN
;
1204 param
[1] = PFAXP2_ATN
;
1206 param
[0] = 6; /* 6 db */
1207 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCFG
, ctrl
, 2, param
);
1208 ch
->state
= STFAX_NULL
;
1211 test_and_set_bit(FLG_FTI_RUN
, &ch
->bch
.Flags
);
1215 send_mbox(ch
->is
, dps
| ISAR_HIS_PSTREQ
, 0, 0, NULL
);
1220 setup_sart(struct isar_ch
*ch
) {
1221 u8 dps
= SET_DPS(ch
->dpath
);
1222 u8 ctrl
, param
[2] = {0, 0};
1224 switch (ch
->bch
.state
) {
1226 send_mbox(ch
->is
, dps
| ISAR_HIS_SARTCFG
, SMODE_DISABLE
,
1230 case ISDN_P_B_L2DTMF
:
1231 send_mbox(ch
->is
, dps
| ISAR_HIS_SARTCFG
, SMODE_BINARY
,
1235 case ISDN_P_B_T30_FAX
:
1236 send_mbox(ch
->is
, dps
| ISAR_HIS_SARTCFG
, SMODE_HDLC
,
1239 case ISDN_P_B_MODEM_ASYNC
:
1240 ctrl
= SMODE_V14
| SCTRL_HDMC_BOTH
;
1241 param
[0] = S_P1_CHS_8
;
1242 param
[1] = S_P2_BFT_DEF
;
1243 send_mbox(ch
->is
, dps
| ISAR_HIS_SARTCFG
, ctrl
, 2, param
);
1247 send_mbox(ch
->is
, dps
| ISAR_HIS_BSTREQ
, 0, 0, NULL
);
1252 setup_iom2(struct isar_ch
*ch
) {
1253 u8 dps
= SET_DPS(ch
->dpath
);
1254 u8 cmsb
= IOM_CTRL_ENA
, msg
[5] = {IOM_P1_TXD
, 0, 0, 0, 0};
1256 if (ch
->bch
.nr
== 2) {
1260 switch (ch
->bch
.state
) {
1264 msg
[1] = ch
->dpath
+ 2;
1265 msg
[3] = ch
->dpath
+ 2;
1270 case ISDN_P_B_MODEM_ASYNC
:
1271 case ISDN_P_B_T30_FAX
:
1272 cmsb
|= IOM_CTRL_RCV
;
1274 case ISDN_P_B_L2DTMF
:
1275 if (test_bit(FLG_DTMFSEND
, &ch
->bch
.Flags
))
1276 cmsb
|= IOM_CTRL_RCV
;
1277 cmsb
|= IOM_CTRL_ALAW
;
1280 send_mbox(ch
->is
, dps
| ISAR_HIS_IOM2CFG
, cmsb
, 5, msg
);
1282 send_mbox(ch
->is
, dps
| ISAR_HIS_IOM2REQ
, 0, 0, NULL
);
1287 modeisar(struct isar_ch
*ch
, u32 bprotocol
)
1289 /* Here we are selecting the best datapath for requested protocol */
1290 if (ch
->bch
.state
== ISDN_P_NONE
) { /* New Setup */
1291 switch (bprotocol
) {
1292 case ISDN_P_NONE
: /* init */
1294 /* no init for dpath 0 */
1296 test_and_clear_bit(FLG_HDLC
, &ch
->bch
.Flags
);
1297 test_and_clear_bit(FLG_TRANSPARENT
, &ch
->bch
.Flags
);
1301 /* best is datapath 2 */
1302 if (!test_and_set_bit(ISAR_DP2_USE
, &ch
->is
->Flags
))
1304 else if (!test_and_set_bit(ISAR_DP1_USE
,
1308 pr_info("modeisar both paths in use\n");
1311 if (bprotocol
== ISDN_P_B_HDLC
)
1312 test_and_set_bit(FLG_HDLC
, &ch
->bch
.Flags
);
1314 test_and_set_bit(FLG_TRANSPARENT
,
1317 case ISDN_P_B_MODEM_ASYNC
:
1318 case ISDN_P_B_T30_FAX
:
1319 case ISDN_P_B_L2DTMF
:
1320 /* only datapath 1 */
1321 if (!test_and_set_bit(ISAR_DP1_USE
, &ch
->is
->Flags
))
1324 pr_info("%s: ISAR modeisar analog functions"
1325 "only with DP1\n", ch
->is
->name
);
1330 pr_info("%s: protocol not known %x\n", ch
->is
->name
,
1332 return -ENOPROTOOPT
;
1335 pr_debug("%s: ISAR ch%d dp%d protocol %x->%x\n", ch
->is
->name
,
1336 ch
->bch
.nr
, ch
->dpath
, ch
->bch
.state
, bprotocol
);
1337 ch
->bch
.state
= bprotocol
;
1341 if (ch
->bch
.state
== ISDN_P_NONE
) {
1342 /* Clear resources */
1344 test_and_clear_bit(ISAR_DP1_USE
, &ch
->is
->Flags
);
1345 else if (ch
->dpath
== 2)
1346 test_and_clear_bit(ISAR_DP2_USE
, &ch
->is
->Flags
);
1348 ch
->is
->ctrl(ch
->is
->hw
, HW_DEACT_IND
, ch
->bch
.nr
);
1350 ch
->is
->ctrl(ch
->is
->hw
, HW_ACTIVATE_IND
, ch
->bch
.nr
);
1355 isar_pump_cmd(struct isar_ch
*ch
, u32 cmd
, u8 para
)
1357 u8 dps
= SET_DPS(ch
->dpath
);
1358 u8 ctrl
= 0, nom
= 0, p1
= 0;
1360 pr_debug("%s: isar_pump_cmd %x/%x state(%x)\n",
1361 ch
->is
->name
, cmd
, para
, ch
->bch
.state
);
1364 if (ch
->state
== STFAX_READY
) {
1366 ctrl
= PCTRL_CMD_FTM
;
1368 ch
->state
= STFAX_LINE
;
1374 } else if ((ch
->state
== STFAX_ACTIV
) &&
1375 (ch
->cmd
== PCTRL_CMD_FTM
) && (ch
->mod
== para
))
1376 deliver_status(ch
, HW_MOD_CONNECT
);
1379 ch
->newcmd
= PCTRL_CMD_FTM
;
1381 ctrl
= PCTRL_CMD_ESC
;
1382 ch
->state
= STFAX_ESCAPE
;
1386 if (ch
->state
== STFAX_READY
) {
1388 ctrl
= PCTRL_CMD_FTH
;
1390 ch
->state
= STFAX_LINE
;
1396 } else if ((ch
->state
== STFAX_ACTIV
) &&
1397 (ch
->cmd
== PCTRL_CMD_FTH
) && (ch
->mod
== para
))
1398 deliver_status(ch
, HW_MOD_CONNECT
);
1401 ch
->newcmd
= PCTRL_CMD_FTH
;
1403 ctrl
= PCTRL_CMD_ESC
;
1404 ch
->state
= STFAX_ESCAPE
;
1408 if (ch
->state
== STFAX_READY
) {
1410 ctrl
= PCTRL_CMD_FRM
;
1412 ch
->state
= STFAX_LINE
;
1418 } else if ((ch
->state
== STFAX_ACTIV
) &&
1419 (ch
->cmd
== PCTRL_CMD_FRM
) && (ch
->mod
== para
))
1420 deliver_status(ch
, HW_MOD_CONNECT
);
1423 ch
->newcmd
= PCTRL_CMD_FRM
;
1425 ctrl
= PCTRL_CMD_ESC
;
1426 ch
->state
= STFAX_ESCAPE
;
1430 if (ch
->state
== STFAX_READY
) {
1432 ctrl
= PCTRL_CMD_FRH
;
1434 ch
->state
= STFAX_LINE
;
1440 } else if ((ch
->state
== STFAX_ACTIV
) &&
1441 (ch
->cmd
== PCTRL_CMD_FRH
) && (ch
->mod
== para
))
1442 deliver_status(ch
, HW_MOD_CONNECT
);
1445 ch
->newcmd
= PCTRL_CMD_FRH
;
1447 ctrl
= PCTRL_CMD_ESC
;
1448 ch
->state
= STFAX_ESCAPE
;
1451 case PCTRL_CMD_TDTMF
:
1454 ctrl
= PCTRL_CMD_TDTMF
;
1458 send_mbox(ch
->is
, dps
| ISAR_HIS_PUMPCTRL
, ctrl
, nom
, &p1
);
1462 isar_setup(struct isar_hw
*isar
)
1469 for (i
= 0; i
< 2; i
++) {
1471 send_mbox(isar
, (i
? ISAR_HIS_DPS2
: ISAR_HIS_DPS1
) |
1472 ISAR_HIS_P12CFG
, 4, 1, &msg
);
1473 isar
->ch
[i
].mml
= msg
;
1474 isar
->ch
[i
].bch
.state
= 0;
1475 isar
->ch
[i
].dpath
= i
+ 1;
1476 modeisar(&isar
->ch
[i
], ISDN_P_NONE
);
1481 isar_l2l1(struct mISDNchannel
*ch
, struct sk_buff
*skb
)
1483 struct bchannel
*bch
= container_of(ch
, struct bchannel
, ch
);
1484 struct isar_ch
*ich
= container_of(bch
, struct isar_ch
, bch
);
1486 struct mISDNhead
*hh
= mISDN_HEAD_P(skb
);
1492 spin_lock_irqsave(ich
->is
->hwlock
, flags
);
1493 ret
= bchannel_senddata(bch
, skb
);
1494 if (ret
> 0) { /* direct TX */
1496 isar_fill_fifo(ich
);
1498 spin_unlock_irqrestore(ich
->is
->hwlock
, flags
);
1500 case PH_ACTIVATE_REQ
:
1501 spin_lock_irqsave(ich
->is
->hwlock
, flags
);
1502 if (!test_and_set_bit(FLG_ACTIVE
, &bch
->Flags
))
1503 ret
= modeisar(ich
, ch
->protocol
);
1506 spin_unlock_irqrestore(ich
->is
->hwlock
, flags
);
1508 _queue_data(ch
, PH_ACTIVATE_IND
, MISDN_ID_ANY
, 0,
1511 case PH_DEACTIVATE_REQ
:
1512 spin_lock_irqsave(ich
->is
->hwlock
, flags
);
1513 mISDN_clear_bchannel(bch
);
1514 modeisar(ich
, ISDN_P_NONE
);
1515 spin_unlock_irqrestore(ich
->is
->hwlock
, flags
);
1516 _queue_data(ch
, PH_DEACTIVATE_IND
, MISDN_ID_ANY
, 0,
1520 case PH_CONTROL_REQ
:
1521 val
= (u32
*)skb
->data
;
1522 pr_debug("%s: PH_CONTROL | REQUEST %x/%x\n", ich
->is
->name
,
1524 if ((hh
->id
== 0) && ((*val
& ~DTMF_TONE_MASK
) ==
1526 if (bch
->state
== ISDN_P_B_L2DTMF
) {
1527 char tt
= *val
& DTMF_TONE_MASK
;
1536 spin_lock_irqsave(ich
->is
->hwlock
, flags
);
1537 isar_pump_cmd(ich
, PCTRL_CMD_TDTMF
, tt
);
1538 spin_unlock_irqrestore(ich
->is
->hwlock
, flags
);
1540 pr_info("%s: DTMF send wrong protocol %x\n",
1541 __func__
, bch
->state
);
1544 } else if ((hh
->id
== HW_MOD_FRM
) || (hh
->id
== HW_MOD_FRH
) ||
1545 (hh
->id
== HW_MOD_FTM
) || (hh
->id
== HW_MOD_FTH
)) {
1546 for (id
= 0; id
< FAXMODCNT
; id
++)
1547 if (faxmodulation
[id
] == *val
)
1549 if ((FAXMODCNT
> id
) &&
1550 test_bit(FLG_INITIALIZED
, &bch
->Flags
)) {
1551 pr_debug("%s: isar: new mod\n", ich
->is
->name
);
1552 isar_pump_cmd(ich
, hh
->id
, *val
);
1555 pr_info("%s: wrong modulation\n",
1559 } else if (hh
->id
== HW_MOD_LASTDATA
)
1560 test_and_set_bit(FLG_DLEETX
, &bch
->Flags
);
1562 pr_info("%s: unknown PH_CONTROL_REQ %x\n",
1563 ich
->is
->name
, hh
->id
);
1568 pr_info("%s: %s unknown prim(%x,%x)\n",
1569 ich
->is
->name
, __func__
, hh
->prim
, hh
->id
);
1578 channel_bctrl(struct bchannel
*bch
, struct mISDN_ctrl_req
*cq
)
1580 return mISDN_ctrl_bchannel(bch
, cq
);
1584 isar_bctrl(struct mISDNchannel
*ch
, u32 cmd
, void *arg
)
1586 struct bchannel
*bch
= container_of(ch
, struct bchannel
, ch
);
1587 struct isar_ch
*ich
= container_of(bch
, struct isar_ch
, bch
);
1591 pr_debug("%s: %s cmd:%x %p\n", ich
->is
->name
, __func__
, cmd
, arg
);
1594 test_and_clear_bit(FLG_OPEN
, &bch
->Flags
);
1595 cancel_work_sync(&bch
->workq
);
1596 spin_lock_irqsave(ich
->is
->hwlock
, flags
);
1597 mISDN_clear_bchannel(bch
);
1598 modeisar(ich
, ISDN_P_NONE
);
1599 spin_unlock_irqrestore(ich
->is
->hwlock
, flags
);
1600 ch
->protocol
= ISDN_P_NONE
;
1602 module_put(ich
->is
->owner
);
1605 case CONTROL_CHANNEL
:
1606 ret
= channel_bctrl(bch
, arg
);
1609 pr_info("%s: %s unknown prim(%x)\n",
1610 ich
->is
->name
, __func__
, cmd
);
1616 free_isar(struct isar_hw
*isar
)
1618 modeisar(&isar
->ch
[0], ISDN_P_NONE
);
1619 modeisar(&isar
->ch
[1], ISDN_P_NONE
);
1620 del_timer(&isar
->ch
[0].ftimer
);
1621 del_timer(&isar
->ch
[1].ftimer
);
1622 test_and_clear_bit(FLG_INITIALIZED
, &isar
->ch
[0].bch
.Flags
);
1623 test_and_clear_bit(FLG_INITIALIZED
, &isar
->ch
[1].bch
.Flags
);
1627 init_isar(struct isar_hw
*isar
)
1632 isar
->version
= ISARVersion(isar
);
1633 if (isar
->ch
[0].bch
.debug
& DEBUG_HW
)
1634 pr_notice("%s: Testing version %d (%d time)\n",
1635 isar
->name
, isar
->version
, 3 - cnt
);
1636 if (isar
->version
== 1)
1638 isar
->ctrl(isar
->hw
, HW_RESET_REQ
, 0);
1640 if (isar
->version
!= 1)
1642 timer_setup(&isar
->ch
[0].ftimer
, ftimer_handler
, 0);
1643 test_and_set_bit(FLG_INITIALIZED
, &isar
->ch
[0].bch
.Flags
);
1644 timer_setup(&isar
->ch
[1].ftimer
, ftimer_handler
, 0);
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
);