cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mISDNisar.c (43321B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * mISDNisar.c   ISAR (Siemens PSB 7110) specific functions
      4 *
      5 * Author Karsten Keil (keil@isdn4linux.de)
      6 *
      7 * Copyright 2009  by Karsten Keil <keil@isdn4linux.de>
      8 */
      9
     10/* define this to enable static debug messages, if you kernel supports
     11 * dynamic debugging, you should use debugfs for this
     12 */
     13/* #define DEBUG */
     14
     15#include <linux/gfp.h>
     16#include <linux/delay.h>
     17#include <linux/vmalloc.h>
     18#include <linux/mISDNhw.h>
     19#include <linux/module.h>
     20#include "isar.h"
     21
     22#define ISAR_REV	"2.1"
     23
     24MODULE_AUTHOR("Karsten Keil");
     25MODULE_LICENSE("GPL v2");
     26MODULE_VERSION(ISAR_REV);
     27
     28#define DEBUG_HW_FIRMWARE_FIFO	0x10000
     29
     30static const u8 faxmodulation[] = {3, 24, 48, 72, 73, 74, 96, 97, 98, 121,
     31				   122, 145, 146};
     32#define FAXMODCNT 13
     33
     34static void isar_setup(struct isar_hw *);
     35
     36static inline int
     37waitforHIA(struct isar_hw *isar, int timeout)
     38{
     39	int t = timeout;
     40	u8 val = isar->read_reg(isar->hw, ISAR_HIA);
     41
     42	while ((val & 1) && t) {
     43		udelay(1);
     44		t--;
     45		val = isar->read_reg(isar->hw, ISAR_HIA);
     46	}
     47	pr_debug("%s: HIA after %dus\n", isar->name, timeout - t);
     48	return timeout;
     49}
     50
     51/*
     52 * send msg to ISAR mailbox
     53 * if msg is NULL use isar->buf
     54 */
     55static int
     56send_mbox(struct isar_hw *isar, u8 his, u8 creg, u8 len, u8 *msg)
     57{
     58	if (!waitforHIA(isar, 1000))
     59		return 0;
     60	pr_debug("send_mbox(%02x,%02x,%d)\n", his, creg, len);
     61	isar->write_reg(isar->hw, ISAR_CTRL_H, creg);
     62	isar->write_reg(isar->hw, ISAR_CTRL_L, len);
     63	isar->write_reg(isar->hw, ISAR_WADR, 0);
     64	if (!msg)
     65		msg = isar->buf;
     66	if (msg && len) {
     67		isar->write_fifo(isar->hw, ISAR_MBOX, msg, len);
     68		if (isar->ch[0].bch.debug & DEBUG_HW_BFIFO) {
     69			int l = 0;
     70
     71			while (l < (int)len) {
     72				hex_dump_to_buffer(msg + l, len - l, 32, 1,
     73						   isar->log, 256, 1);
     74				pr_debug("%s: %s %02x: %s\n", isar->name,
     75					 __func__, l, isar->log);
     76				l += 32;
     77			}
     78		}
     79	}
     80	isar->write_reg(isar->hw, ISAR_HIS, his);
     81	waitforHIA(isar, 1000);
     82	return 1;
     83}
     84
     85/*
     86 * receive message from ISAR mailbox
     87 * if msg is NULL use isar->buf
     88 */
     89static void
     90rcv_mbox(struct isar_hw *isar, u8 *msg)
     91{
     92	if (!msg)
     93		msg = isar->buf;
     94	isar->write_reg(isar->hw, ISAR_RADR, 0);
     95	if (msg && isar->clsb) {
     96		isar->read_fifo(isar->hw, ISAR_MBOX, msg, isar->clsb);
     97		if (isar->ch[0].bch.debug & DEBUG_HW_BFIFO) {
     98			int l = 0;
     99
    100			while (l < (int)isar->clsb) {
    101				hex_dump_to_buffer(msg + l, isar->clsb - l, 32,
    102						   1, isar->log, 256, 1);
    103				pr_debug("%s: %s %02x: %s\n", isar->name,
    104					 __func__, l, isar->log);
    105				l += 32;
    106			}
    107		}
    108	}
    109	isar->write_reg(isar->hw, ISAR_IIA, 0);
    110}
    111
    112static inline void
    113get_irq_infos(struct isar_hw *isar)
    114{
    115	isar->iis = isar->read_reg(isar->hw, ISAR_IIS);
    116	isar->cmsb = isar->read_reg(isar->hw, ISAR_CTRL_H);
    117	isar->clsb = isar->read_reg(isar->hw, ISAR_CTRL_L);
    118	pr_debug("%s: rcv_mbox(%02x,%02x,%d)\n", isar->name,
    119		 isar->iis, isar->cmsb, isar->clsb);
    120}
    121
    122/*
    123 * poll answer message from ISAR mailbox
    124 * should be used only with ISAR IRQs disabled before DSP was started
    125 *
    126 */
    127static int
    128poll_mbox(struct isar_hw *isar, int maxdelay)
    129{
    130	int t = maxdelay;
    131	u8 irq;
    132
    133	irq = isar->read_reg(isar->hw, ISAR_IRQBIT);
    134	while (t && !(irq & ISAR_IRQSTA)) {
    135		udelay(1);
    136		t--;
    137	}
    138	if (t)	{
    139		get_irq_infos(isar);
    140		rcv_mbox(isar, NULL);
    141	}
    142	pr_debug("%s: pulled %d bytes after %d us\n",
    143		 isar->name, isar->clsb, maxdelay - t);
    144	return t;
    145}
    146
    147static int
    148ISARVersion(struct isar_hw *isar)
    149{
    150	int ver;
    151
    152	/* disable ISAR IRQ */
    153	isar->write_reg(isar->hw, ISAR_IRQBIT, 0);
    154	isar->buf[0] = ISAR_MSG_HWVER;
    155	isar->buf[1] = 0;
    156	isar->buf[2] = 1;
    157	if (!send_mbox(isar, ISAR_HIS_VNR, 0, 3, NULL))
    158		return -1;
    159	if (!poll_mbox(isar, 1000))
    160		return -2;
    161	if (isar->iis == ISAR_IIS_VNR) {
    162		if (isar->clsb == 1) {
    163			ver = isar->buf[0] & 0xf;
    164			return ver;
    165		}
    166		return -3;
    167	}
    168	return -4;
    169}
    170
    171static int
    172load_firmware(struct isar_hw *isar, const u8 *buf, int size)
    173{
    174	u32	saved_debug = isar->ch[0].bch.debug;
    175	int	ret, cnt;
    176	u8	nom, noc;
    177	u16	left, val, *sp = (u16 *)buf;
    178	u8	*mp;
    179	u_long	flags;
    180
    181	struct {
    182		u16 sadr;
    183		u16 len;
    184		u16 d_key;
    185	} blk_head;
    186
    187	if (1 != isar->version) {
    188		pr_err("%s: ISAR wrong version %d firmware download aborted\n",
    189		       isar->name, isar->version);
    190		return -EINVAL;
    191	}
    192	if (!(saved_debug & DEBUG_HW_FIRMWARE_FIFO))
    193		isar->ch[0].bch.debug &= ~DEBUG_HW_BFIFO;
    194	pr_debug("%s: load firmware %d words (%d bytes)\n",
    195		 isar->name, size / 2, size);
    196	cnt = 0;
    197	size /= 2;
    198	/* disable ISAR IRQ */
    199	spin_lock_irqsave(isar->hwlock, flags);
    200	isar->write_reg(isar->hw, ISAR_IRQBIT, 0);
    201	spin_unlock_irqrestore(isar->hwlock, flags);
    202	while (cnt < size) {
    203		blk_head.sadr = le16_to_cpu(*sp++);
    204		blk_head.len = le16_to_cpu(*sp++);
    205		blk_head.d_key = le16_to_cpu(*sp++);
    206		cnt += 3;
    207		pr_debug("ISAR firmware block (%#x,%d,%#x)\n",
    208			 blk_head.sadr, blk_head.len, blk_head.d_key & 0xff);
    209		left = blk_head.len;
    210		if (cnt + left > size) {
    211			pr_info("%s: firmware error have %d need %d words\n",
    212				isar->name, size, cnt + left);
    213			ret = -EINVAL;
    214			goto reterrflg;
    215		}
    216		spin_lock_irqsave(isar->hwlock, flags);
    217		if (!send_mbox(isar, ISAR_HIS_DKEY, blk_head.d_key & 0xff,
    218			       0, NULL)) {
    219			pr_info("ISAR send_mbox dkey failed\n");
    220			ret = -ETIME;
    221			goto reterror;
    222		}
    223		if (!poll_mbox(isar, 1000)) {
    224			pr_warn("ISAR poll_mbox dkey failed\n");
    225			ret = -ETIME;
    226			goto reterror;
    227		}
    228		spin_unlock_irqrestore(isar->hwlock, flags);
    229		if ((isar->iis != ISAR_IIS_DKEY) || isar->cmsb || isar->clsb) {
    230			pr_info("ISAR wrong dkey response (%x,%x,%x)\n",
    231				isar->iis, isar->cmsb, isar->clsb);
    232			ret = 1;
    233			goto reterrflg;
    234		}
    235		while (left > 0) {
    236			if (left > 126)
    237				noc = 126;
    238			else
    239				noc = left;
    240			nom = (2 * noc) + 3;
    241			mp  = isar->buf;
    242			/* the ISAR is big endian */
    243			*mp++ = blk_head.sadr >> 8;
    244			*mp++ = blk_head.sadr & 0xFF;
    245			left -= noc;
    246			cnt += noc;
    247			*mp++ = noc;
    248			pr_debug("%s: load %3d words at %04x\n", isar->name,
    249				 noc, blk_head.sadr);
    250			blk_head.sadr += noc;
    251			while (noc) {
    252				val = le16_to_cpu(*sp++);
    253				*mp++ = val >> 8;
    254				*mp++ = val & 0xFF;
    255				noc--;
    256			}
    257			spin_lock_irqsave(isar->hwlock, flags);
    258			if (!send_mbox(isar, ISAR_HIS_FIRM, 0, nom, NULL)) {
    259				pr_info("ISAR send_mbox prog failed\n");
    260				ret = -ETIME;
    261				goto reterror;
    262			}
    263			if (!poll_mbox(isar, 1000)) {
    264				pr_info("ISAR poll_mbox prog failed\n");
    265				ret = -ETIME;
    266				goto reterror;
    267			}
    268			spin_unlock_irqrestore(isar->hwlock, flags);
    269			if ((isar->iis != ISAR_IIS_FIRM) ||
    270			    isar->cmsb || isar->clsb) {
    271				pr_info("ISAR wrong prog response (%x,%x,%x)\n",
    272					isar->iis, isar->cmsb, isar->clsb);
    273				ret = -EIO;
    274				goto reterrflg;
    275			}
    276		}
    277		pr_debug("%s: ISAR firmware block %d words loaded\n",
    278			 isar->name, blk_head.len);
    279	}
    280	isar->ch[0].bch.debug = saved_debug;
    281	/* 10ms delay */
    282	cnt = 10;
    283	while (cnt--)
    284		mdelay(1);
    285	isar->buf[0] = 0xff;
    286	isar->buf[1] = 0xfe;
    287	isar->bstat = 0;
    288	spin_lock_irqsave(isar->hwlock, flags);
    289	if (!send_mbox(isar, ISAR_HIS_STDSP, 0, 2, NULL)) {
    290		pr_info("ISAR send_mbox start dsp failed\n");
    291		ret = -ETIME;
    292		goto reterror;
    293	}
    294	if (!poll_mbox(isar, 1000)) {
    295		pr_info("ISAR poll_mbox start dsp failed\n");
    296		ret = -ETIME;
    297		goto reterror;
    298	}
    299	if ((isar->iis != ISAR_IIS_STDSP) || isar->cmsb || isar->clsb) {
    300		pr_info("ISAR wrong start dsp response (%x,%x,%x)\n",
    301			isar->iis, isar->cmsb, isar->clsb);
    302		ret = -EIO;
    303		goto reterror;
    304	} else
    305		pr_debug("%s: ISAR start dsp success\n", isar->name);
    306
    307	/* NORMAL mode entered */
    308	/* Enable IRQs of ISAR */
    309	isar->write_reg(isar->hw, ISAR_IRQBIT, ISAR_IRQSTA);
    310	spin_unlock_irqrestore(isar->hwlock, flags);
    311	cnt = 1000; /* max 1s */
    312	while ((!isar->bstat) && cnt) {
    313		mdelay(1);
    314		cnt--;
    315	}
    316	if (!cnt) {
    317		pr_info("ISAR no general status event received\n");
    318		ret = -ETIME;
    319		goto reterrflg;
    320	} else
    321		pr_debug("%s: ISAR general status event %x\n",
    322			 isar->name, isar->bstat);
    323	/* 10ms delay */
    324	cnt = 10;
    325	while (cnt--)
    326		mdelay(1);
    327	isar->iis = 0;
    328	spin_lock_irqsave(isar->hwlock, flags);
    329	if (!send_mbox(isar, ISAR_HIS_DIAG, ISAR_CTRL_STST, 0, NULL)) {
    330		pr_info("ISAR send_mbox self tst failed\n");
    331		ret = -ETIME;
    332		goto reterror;
    333	}
    334	spin_unlock_irqrestore(isar->hwlock, flags);
    335	cnt = 10000; /* max 100 ms */
    336	while ((isar->iis != ISAR_IIS_DIAG) && cnt) {
    337		udelay(10);
    338		cnt--;
    339	}
    340	mdelay(1);
    341	if (!cnt) {
    342		pr_info("ISAR no self tst response\n");
    343		ret = -ETIME;
    344		goto reterrflg;
    345	}
    346	if ((isar->cmsb == ISAR_CTRL_STST) && (isar->clsb == 1)
    347	    && (isar->buf[0] == 0))
    348		pr_debug("%s: ISAR selftest OK\n", isar->name);
    349	else {
    350		pr_info("ISAR selftest not OK %x/%x/%x\n",
    351			isar->cmsb, isar->clsb, isar->buf[0]);
    352		ret = -EIO;
    353		goto reterrflg;
    354	}
    355	spin_lock_irqsave(isar->hwlock, flags);
    356	isar->iis = 0;
    357	if (!send_mbox(isar, ISAR_HIS_DIAG, ISAR_CTRL_SWVER, 0, NULL)) {
    358		pr_info("ISAR RQST SVN failed\n");
    359		ret = -ETIME;
    360		goto reterror;
    361	}
    362	spin_unlock_irqrestore(isar->hwlock, flags);
    363	cnt = 30000; /* max 300 ms */
    364	while ((isar->iis != ISAR_IIS_DIAG) && cnt) {
    365		udelay(10);
    366		cnt--;
    367	}
    368	mdelay(1);
    369	if (!cnt) {
    370		pr_info("ISAR no SVN response\n");
    371		ret = -ETIME;
    372		goto reterrflg;
    373	} else {
    374		if ((isar->cmsb == ISAR_CTRL_SWVER) && (isar->clsb == 1)) {
    375			pr_notice("%s: ISAR software version %#x\n",
    376				  isar->name, isar->buf[0]);
    377		} else {
    378			pr_info("%s: ISAR wrong swver response (%x,%x)"
    379				" cnt(%d)\n", isar->name, isar->cmsb,
    380				isar->clsb, cnt);
    381			ret = -EIO;
    382			goto reterrflg;
    383		}
    384	}
    385	spin_lock_irqsave(isar->hwlock, flags);
    386	isar_setup(isar);
    387	spin_unlock_irqrestore(isar->hwlock, flags);
    388	ret = 0;
    389reterrflg:
    390	spin_lock_irqsave(isar->hwlock, flags);
    391reterror:
    392	isar->ch[0].bch.debug = saved_debug;
    393	if (ret)
    394		/* disable ISAR IRQ */
    395		isar->write_reg(isar->hw, ISAR_IRQBIT, 0);
    396	spin_unlock_irqrestore(isar->hwlock, flags);
    397	return ret;
    398}
    399
    400static inline void
    401deliver_status(struct isar_ch *ch, int status)
    402{
    403	pr_debug("%s: HL->LL FAXIND %x\n", ch->is->name, status);
    404	_queue_data(&ch->bch.ch, PH_CONTROL_IND, status, 0, NULL, GFP_ATOMIC);
    405}
    406
    407static inline void
    408isar_rcv_frame(struct isar_ch *ch)
    409{
    410	u8	*ptr;
    411	int	maxlen;
    412
    413	if (!ch->is->clsb) {
    414		pr_debug("%s; ISAR zero len frame\n", ch->is->name);
    415		ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    416		return;
    417	}
    418	if (test_bit(FLG_RX_OFF, &ch->bch.Flags)) {
    419		ch->bch.dropcnt += ch->is->clsb;
    420		ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    421		return;
    422	}
    423	switch (ch->bch.state) {
    424	case ISDN_P_NONE:
    425		pr_debug("%s: ISAR protocol 0 spurious IIS_RDATA %x/%x/%x\n",
    426			 ch->is->name, ch->is->iis, ch->is->cmsb, ch->is->clsb);
    427		ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    428		break;
    429	case ISDN_P_B_RAW:
    430	case ISDN_P_B_L2DTMF:
    431	case ISDN_P_B_MODEM_ASYNC:
    432		maxlen = bchannel_get_rxbuf(&ch->bch, ch->is->clsb);
    433		if (maxlen < 0) {
    434			pr_warn("%s.B%d: No bufferspace for %d bytes\n",
    435				ch->is->name, ch->bch.nr, ch->is->clsb);
    436			ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    437			break;
    438		}
    439		rcv_mbox(ch->is, skb_put(ch->bch.rx_skb, ch->is->clsb));
    440		recv_Bchannel(&ch->bch, 0, false);
    441		break;
    442	case ISDN_P_B_HDLC:
    443		maxlen = bchannel_get_rxbuf(&ch->bch, ch->is->clsb);
    444		if (maxlen < 0) {
    445			pr_warn("%s.B%d: No bufferspace for %d bytes\n",
    446				ch->is->name, ch->bch.nr, ch->is->clsb);
    447			ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    448			break;
    449		}
    450		if (ch->is->cmsb & HDLC_ERROR) {
    451			pr_debug("%s: ISAR frame error %x len %d\n",
    452				 ch->is->name, ch->is->cmsb, ch->is->clsb);
    453#ifdef ERROR_STATISTIC
    454			if (ch->is->cmsb & HDLC_ERR_RER)
    455				ch->bch.err_inv++;
    456			if (ch->is->cmsb & HDLC_ERR_CER)
    457				ch->bch.err_crc++;
    458#endif
    459			skb_trim(ch->bch.rx_skb, 0);
    460			ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    461			break;
    462		}
    463		if (ch->is->cmsb & HDLC_FSD)
    464			skb_trim(ch->bch.rx_skb, 0);
    465		ptr = skb_put(ch->bch.rx_skb, ch->is->clsb);
    466		rcv_mbox(ch->is, ptr);
    467		if (ch->is->cmsb & HDLC_FED) {
    468			if (ch->bch.rx_skb->len < 3) { /* last 2 are the FCS */
    469				pr_debug("%s: ISAR frame too short %d\n",
    470					 ch->is->name, ch->bch.rx_skb->len);
    471				skb_trim(ch->bch.rx_skb, 0);
    472				break;
    473			}
    474			skb_trim(ch->bch.rx_skb, ch->bch.rx_skb->len - 2);
    475			recv_Bchannel(&ch->bch, 0, false);
    476		}
    477		break;
    478	case ISDN_P_B_T30_FAX:
    479		if (ch->state != STFAX_ACTIV) {
    480			pr_debug("%s: isar_rcv_frame: not ACTIV\n",
    481				 ch->is->name);
    482			ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    483			if (ch->bch.rx_skb)
    484				skb_trim(ch->bch.rx_skb, 0);
    485			break;
    486		}
    487		if (!ch->bch.rx_skb) {
    488			ch->bch.rx_skb = mI_alloc_skb(ch->bch.maxlen,
    489						      GFP_ATOMIC);
    490			if (unlikely(!ch->bch.rx_skb)) {
    491				pr_info("%s: B receive out of memory\n",
    492					__func__);
    493				ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    494				break;
    495			}
    496		}
    497		if (ch->cmd == PCTRL_CMD_FRM) {
    498			rcv_mbox(ch->is, skb_put(ch->bch.rx_skb, ch->is->clsb));
    499			pr_debug("%s: isar_rcv_frame: %d\n",
    500				 ch->is->name, ch->bch.rx_skb->len);
    501			if (ch->is->cmsb & SART_NMD) { /* ABORT */
    502				pr_debug("%s: isar_rcv_frame: no more data\n",
    503					 ch->is->name);
    504				ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    505				send_mbox(ch->is, SET_DPS(ch->dpath) |
    506					  ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC,
    507					  0, NULL);
    508				ch->state = STFAX_ESCAPE;
    509				/* set_skb_flag(skb, DF_NOMOREDATA); */
    510			}
    511			recv_Bchannel(&ch->bch, 0, false);
    512			if (ch->is->cmsb & SART_NMD)
    513				deliver_status(ch, HW_MOD_NOCARR);
    514			break;
    515		}
    516		if (ch->cmd != PCTRL_CMD_FRH) {
    517			pr_debug("%s: isar_rcv_frame: unknown fax mode %x\n",
    518				 ch->is->name, ch->cmd);
    519			ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    520			if (ch->bch.rx_skb)
    521				skb_trim(ch->bch.rx_skb, 0);
    522			break;
    523		}
    524		/* PCTRL_CMD_FRH */
    525		if ((ch->bch.rx_skb->len + ch->is->clsb) >
    526		    (ch->bch.maxlen + 2)) {
    527			pr_info("%s: %s incoming packet too large\n",
    528				ch->is->name, __func__);
    529			ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    530			skb_trim(ch->bch.rx_skb, 0);
    531			break;
    532		}  else if (ch->is->cmsb & HDLC_ERROR) {
    533			pr_info("%s: ISAR frame error %x len %d\n",
    534				ch->is->name, ch->is->cmsb, ch->is->clsb);
    535			skb_trim(ch->bch.rx_skb, 0);
    536			ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    537			break;
    538		}
    539		if (ch->is->cmsb & HDLC_FSD)
    540			skb_trim(ch->bch.rx_skb, 0);
    541		ptr = skb_put(ch->bch.rx_skb, ch->is->clsb);
    542		rcv_mbox(ch->is, ptr);
    543		if (ch->is->cmsb & HDLC_FED) {
    544			if (ch->bch.rx_skb->len < 3) { /* last 2 are the FCS */
    545				pr_info("%s: ISAR frame too short %d\n",
    546					ch->is->name, ch->bch.rx_skb->len);
    547				skb_trim(ch->bch.rx_skb, 0);
    548				break;
    549			}
    550			skb_trim(ch->bch.rx_skb, ch->bch.rx_skb->len - 2);
    551			recv_Bchannel(&ch->bch, 0, false);
    552		}
    553		if (ch->is->cmsb & SART_NMD) { /* ABORT */
    554			pr_debug("%s: isar_rcv_frame: no more data\n",
    555				 ch->is->name);
    556			ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    557			if (ch->bch.rx_skb)
    558				skb_trim(ch->bch.rx_skb, 0);
    559			send_mbox(ch->is, SET_DPS(ch->dpath) |
    560				  ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 0, NULL);
    561			ch->state = STFAX_ESCAPE;
    562			deliver_status(ch, HW_MOD_NOCARR);
    563		}
    564		break;
    565	default:
    566		pr_info("isar_rcv_frame protocol (%x)error\n", ch->bch.state);
    567		ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
    568		break;
    569	}
    570}
    571
    572static void
    573isar_fill_fifo(struct isar_ch *ch)
    574{
    575	int count;
    576	u8 msb;
    577	u8 *ptr;
    578
    579	pr_debug("%s: ch%d  tx_skb %d tx_idx %d\n", ch->is->name, ch->bch.nr,
    580		 ch->bch.tx_skb ? ch->bch.tx_skb->len : -1, ch->bch.tx_idx);
    581	if (!(ch->is->bstat &
    582	      (ch->dpath == 1 ? BSTAT_RDM1 : BSTAT_RDM2)))
    583		return;
    584	if (!ch->bch.tx_skb) {
    585		if (!test_bit(FLG_TX_EMPTY, &ch->bch.Flags) ||
    586		    (ch->bch.state != ISDN_P_B_RAW))
    587			return;
    588		count = ch->mml;
    589		/* use the card buffer */
    590		memset(ch->is->buf, ch->bch.fill[0], count);
    591		send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA,
    592			  0, count, ch->is->buf);
    593		return;
    594	}
    595	count = ch->bch.tx_skb->len - ch->bch.tx_idx;
    596	if (count <= 0)
    597		return;
    598	if (count > ch->mml) {
    599		msb = 0;
    600		count = ch->mml;
    601	} else {
    602		msb = HDLC_FED;
    603	}
    604	ptr = ch->bch.tx_skb->data + ch->bch.tx_idx;
    605	if (!ch->bch.tx_idx) {
    606		pr_debug("%s: frame start\n", ch->is->name);
    607		if ((ch->bch.state == ISDN_P_B_T30_FAX) &&
    608		    (ch->cmd == PCTRL_CMD_FTH)) {
    609			if (count > 1) {
    610				if ((ptr[0] == 0xff) && (ptr[1] == 0x13)) {
    611					/* last frame */
    612					test_and_set_bit(FLG_LASTDATA,
    613							 &ch->bch.Flags);
    614					pr_debug("%s: set LASTDATA\n",
    615						 ch->is->name);
    616					if (msb == HDLC_FED)
    617						test_and_set_bit(FLG_DLEETX,
    618								 &ch->bch.Flags);
    619				}
    620			}
    621		}
    622		msb |= HDLC_FST;
    623	}
    624	ch->bch.tx_idx += count;
    625	switch (ch->bch.state) {
    626	case ISDN_P_NONE:
    627		pr_info("%s: wrong protocol 0\n", __func__);
    628		break;
    629	case ISDN_P_B_RAW:
    630	case ISDN_P_B_L2DTMF:
    631	case ISDN_P_B_MODEM_ASYNC:
    632		send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA,
    633			  0, count, ptr);
    634		break;
    635	case ISDN_P_B_HDLC:
    636		send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA,
    637			  msb, count, ptr);
    638		break;
    639	case ISDN_P_B_T30_FAX:
    640		if (ch->state != STFAX_ACTIV)
    641			pr_debug("%s: not ACTIV\n", ch->is->name);
    642		else if (ch->cmd == PCTRL_CMD_FTH)
    643			send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA,
    644				  msb, count, ptr);
    645		else if (ch->cmd == PCTRL_CMD_FTM)
    646			send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA,
    647				  0, count, ptr);
    648		else
    649			pr_debug("%s: not FTH/FTM\n", ch->is->name);
    650		break;
    651	default:
    652		pr_info("%s: protocol(%x) error\n",
    653			__func__, ch->bch.state);
    654		break;
    655	}
    656}
    657
    658static inline struct isar_ch *
    659sel_bch_isar(struct isar_hw *isar, u8 dpath)
    660{
    661	struct isar_ch	*base = &isar->ch[0];
    662
    663	if ((!dpath) || (dpath > 2))
    664		return NULL;
    665	if (base->dpath == dpath)
    666		return base;
    667	base++;
    668	if (base->dpath == dpath)
    669		return base;
    670	return NULL;
    671}
    672
    673static void
    674send_next(struct isar_ch *ch)
    675{
    676	pr_debug("%s: %s ch%d tx_skb %d tx_idx %d\n", ch->is->name, __func__,
    677		 ch->bch.nr, ch->bch.tx_skb ? ch->bch.tx_skb->len : -1,
    678		 ch->bch.tx_idx);
    679	if (ch->bch.state == ISDN_P_B_T30_FAX) {
    680		if (ch->cmd == PCTRL_CMD_FTH) {
    681			if (test_bit(FLG_LASTDATA, &ch->bch.Flags)) {
    682				pr_debug("set NMD_DATA\n");
    683				test_and_set_bit(FLG_NMD_DATA, &ch->bch.Flags);
    684			}
    685		} else if (ch->cmd == PCTRL_CMD_FTM) {
    686			if (test_bit(FLG_DLEETX, &ch->bch.Flags)) {
    687				test_and_set_bit(FLG_LASTDATA, &ch->bch.Flags);
    688				test_and_set_bit(FLG_NMD_DATA, &ch->bch.Flags);
    689			}
    690		}
    691	}
    692	dev_kfree_skb(ch->bch.tx_skb);
    693	if (get_next_bframe(&ch->bch)) {
    694		isar_fill_fifo(ch);
    695		test_and_clear_bit(FLG_TX_EMPTY, &ch->bch.Flags);
    696	} else if (test_bit(FLG_TX_EMPTY, &ch->bch.Flags)) {
    697		isar_fill_fifo(ch);
    698	} else {
    699		if (test_and_clear_bit(FLG_DLEETX, &ch->bch.Flags)) {
    700			if (test_and_clear_bit(FLG_LASTDATA,
    701					       &ch->bch.Flags)) {
    702				if (test_and_clear_bit(FLG_NMD_DATA,
    703						       &ch->bch.Flags)) {
    704					u8 zd = 0;
    705					send_mbox(ch->is, SET_DPS(ch->dpath) |
    706						  ISAR_HIS_SDATA, 0x01, 1, &zd);
    707				}
    708				test_and_set_bit(FLG_LL_OK, &ch->bch.Flags);
    709			} else {
    710				deliver_status(ch, HW_MOD_CONNECT);
    711			}
    712		} else if (test_bit(FLG_FILLEMPTY, &ch->bch.Flags)) {
    713			test_and_set_bit(FLG_TX_EMPTY, &ch->bch.Flags);
    714		}
    715	}
    716}
    717
    718static void
    719check_send(struct isar_hw *isar, u8 rdm)
    720{
    721	struct isar_ch	*ch;
    722
    723	pr_debug("%s: rdm %x\n", isar->name, rdm);
    724	if (rdm & BSTAT_RDM1) {
    725		ch = sel_bch_isar(isar, 1);
    726		if (ch && test_bit(FLG_ACTIVE, &ch->bch.Flags)) {
    727			if (ch->bch.tx_skb && (ch->bch.tx_skb->len >
    728					       ch->bch.tx_idx))
    729				isar_fill_fifo(ch);
    730			else
    731				send_next(ch);
    732		}
    733	}
    734	if (rdm & BSTAT_RDM2) {
    735		ch = sel_bch_isar(isar, 2);
    736		if (ch && test_bit(FLG_ACTIVE, &ch->bch.Flags)) {
    737			if (ch->bch.tx_skb && (ch->bch.tx_skb->len >
    738					       ch->bch.tx_idx))
    739				isar_fill_fifo(ch);
    740			else
    741				send_next(ch);
    742		}
    743	}
    744}
    745
    746static const char *dmril[] = {"NO SPEED", "1200/75", "NODEF2", "75/1200", "NODEF4",
    747		       "300", "600", "1200", "2400", "4800", "7200",
    748		       "9600nt", "9600t", "12000", "14400", "WRONG"};
    749static const char *dmrim[] = {"NO MOD", "NO DEF", "V32/V32b", "V22", "V21",
    750		       "Bell103", "V23", "Bell202", "V17", "V29", "V27ter"};
    751
    752static void
    753isar_pump_status_rsp(struct isar_ch *ch) {
    754	u8 ril = ch->is->buf[0];
    755	u8 rim;
    756
    757	if (!test_and_clear_bit(ISAR_RATE_REQ, &ch->is->Flags))
    758		return;
    759	if (ril > 14) {
    760		pr_info("%s: wrong pstrsp ril=%d\n", ch->is->name, ril);
    761		ril = 15;
    762	}
    763	switch (ch->is->buf[1]) {
    764	case 0:
    765		rim = 0;
    766		break;
    767	case 0x20:
    768		rim = 2;
    769		break;
    770	case 0x40:
    771		rim = 3;
    772		break;
    773	case 0x41:
    774		rim = 4;
    775		break;
    776	case 0x51:
    777		rim = 5;
    778		break;
    779	case 0x61:
    780		rim = 6;
    781		break;
    782	case 0x71:
    783		rim = 7;
    784		break;
    785	case 0x82:
    786		rim = 8;
    787		break;
    788	case 0x92:
    789		rim = 9;
    790		break;
    791	case 0xa2:
    792		rim = 10;
    793		break;
    794	default:
    795		rim = 1;
    796		break;
    797	}
    798	sprintf(ch->conmsg, "%s %s", dmril[ril], dmrim[rim]);
    799	pr_debug("%s: pump strsp %s\n", ch->is->name, ch->conmsg);
    800}
    801
    802static void
    803isar_pump_statev_modem(struct isar_ch *ch, u8 devt) {
    804	u8 dps = SET_DPS(ch->dpath);
    805
    806	switch (devt) {
    807	case PSEV_10MS_TIMER:
    808		pr_debug("%s: pump stev TIMER\n", ch->is->name);
    809		break;
    810	case PSEV_CON_ON:
    811		pr_debug("%s: pump stev CONNECT\n", ch->is->name);
    812		deliver_status(ch, HW_MOD_CONNECT);
    813		break;
    814	case PSEV_CON_OFF:
    815		pr_debug("%s: pump stev NO CONNECT\n", ch->is->name);
    816		send_mbox(ch->is, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
    817		deliver_status(ch, HW_MOD_NOCARR);
    818		break;
    819	case PSEV_V24_OFF:
    820		pr_debug("%s: pump stev V24 OFF\n", ch->is->name);
    821		break;
    822	case PSEV_CTS_ON:
    823		pr_debug("%s: pump stev CTS ON\n", ch->is->name);
    824		break;
    825	case PSEV_CTS_OFF:
    826		pr_debug("%s pump stev CTS OFF\n", ch->is->name);
    827		break;
    828	case PSEV_DCD_ON:
    829		pr_debug("%s: pump stev CARRIER ON\n", ch->is->name);
    830		test_and_set_bit(ISAR_RATE_REQ, &ch->is->Flags);
    831		send_mbox(ch->is, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
    832		break;
    833	case PSEV_DCD_OFF:
    834		pr_debug("%s: pump stev CARRIER OFF\n", ch->is->name);
    835		break;
    836	case PSEV_DSR_ON:
    837		pr_debug("%s: pump stev DSR ON\n", ch->is->name);
    838		break;
    839	case PSEV_DSR_OFF:
    840		pr_debug("%s: pump stev DSR_OFF\n", ch->is->name);
    841		break;
    842	case PSEV_REM_RET:
    843		pr_debug("%s: pump stev REMOTE RETRAIN\n", ch->is->name);
    844		break;
    845	case PSEV_REM_REN:
    846		pr_debug("%s: pump stev REMOTE RENEGOTIATE\n", ch->is->name);
    847		break;
    848	case PSEV_GSTN_CLR:
    849		pr_debug("%s: pump stev GSTN CLEAR\n", ch->is->name);
    850		break;
    851	default:
    852		pr_info("u%s: unknown pump stev %x\n", ch->is->name, devt);
    853		break;
    854	}
    855}
    856
    857static void
    858isar_pump_statev_fax(struct isar_ch *ch, u8 devt) {
    859	u8 dps = SET_DPS(ch->dpath);
    860	u8 p1;
    861
    862	switch (devt) {
    863	case PSEV_10MS_TIMER:
    864		pr_debug("%s: pump stev TIMER\n", ch->is->name);
    865		break;
    866	case PSEV_RSP_READY:
    867		pr_debug("%s: pump stev RSP_READY\n", ch->is->name);
    868		ch->state = STFAX_READY;
    869		deliver_status(ch, HW_MOD_READY);
    870#ifdef AUTOCON
    871		if (test_bit(BC_FLG_ORIG, &ch->bch.Flags))
    872			isar_pump_cmd(bch, HW_MOD_FRH, 3);
    873		else
    874			isar_pump_cmd(bch, HW_MOD_FTH, 3);
    875#endif
    876		break;
    877	case PSEV_LINE_TX_H:
    878		if (ch->state == STFAX_LINE) {
    879			pr_debug("%s: pump stev LINE_TX_H\n", ch->is->name);
    880			ch->state = STFAX_CONT;
    881			send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
    882				  PCTRL_CMD_CONT, 0, NULL);
    883		} else {
    884			pr_debug("%s: pump stev LINE_TX_H wrong st %x\n",
    885				 ch->is->name, ch->state);
    886		}
    887		break;
    888	case PSEV_LINE_RX_H:
    889		if (ch->state == STFAX_LINE) {
    890			pr_debug("%s: pump stev LINE_RX_H\n", ch->is->name);
    891			ch->state = STFAX_CONT;
    892			send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
    893				  PCTRL_CMD_CONT, 0, NULL);
    894		} else {
    895			pr_debug("%s: pump stev LINE_RX_H wrong st %x\n",
    896				 ch->is->name, ch->state);
    897		}
    898		break;
    899	case PSEV_LINE_TX_B:
    900		if (ch->state == STFAX_LINE) {
    901			pr_debug("%s: pump stev LINE_TX_B\n", ch->is->name);
    902			ch->state = STFAX_CONT;
    903			send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
    904				  PCTRL_CMD_CONT, 0, NULL);
    905		} else {
    906			pr_debug("%s: pump stev LINE_TX_B wrong st %x\n",
    907				 ch->is->name, ch->state);
    908		}
    909		break;
    910	case PSEV_LINE_RX_B:
    911		if (ch->state == STFAX_LINE) {
    912			pr_debug("%s: pump stev LINE_RX_B\n", ch->is->name);
    913			ch->state = STFAX_CONT;
    914			send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
    915				  PCTRL_CMD_CONT, 0, NULL);
    916		} else {
    917			pr_debug("%s: pump stev LINE_RX_B wrong st %x\n",
    918				 ch->is->name, ch->state);
    919		}
    920		break;
    921	case PSEV_RSP_CONN:
    922		if (ch->state == STFAX_CONT) {
    923			pr_debug("%s: pump stev RSP_CONN\n", ch->is->name);
    924			ch->state = STFAX_ACTIV;
    925			test_and_set_bit(ISAR_RATE_REQ, &ch->is->Flags);
    926			send_mbox(ch->is, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
    927			if (ch->cmd == PCTRL_CMD_FTH) {
    928				int delay = (ch->mod == 3) ? 1000 : 200;
    929				/* 1s (200 ms) Flags before data */
    930				if (test_and_set_bit(FLG_FTI_RUN,
    931						     &ch->bch.Flags))
    932					del_timer(&ch->ftimer);
    933				ch->ftimer.expires =
    934					jiffies + ((delay * HZ) / 1000);
    935				test_and_set_bit(FLG_LL_CONN,
    936						 &ch->bch.Flags);
    937				add_timer(&ch->ftimer);
    938			} else {
    939				deliver_status(ch, HW_MOD_CONNECT);
    940			}
    941		} else {
    942			pr_debug("%s: pump stev RSP_CONN wrong st %x\n",
    943				 ch->is->name, ch->state);
    944		}
    945		break;
    946	case PSEV_FLAGS_DET:
    947		pr_debug("%s: pump stev FLAGS_DET\n", ch->is->name);
    948		break;
    949	case PSEV_RSP_DISC:
    950		pr_debug("%s: pump stev RSP_DISC state(%d)\n",
    951			 ch->is->name, ch->state);
    952		if (ch->state == STFAX_ESCAPE) {
    953			p1 = 5;
    954			switch (ch->newcmd) {
    955			case 0:
    956				ch->state = STFAX_READY;
    957				break;
    958			case PCTRL_CMD_FTM:
    959				p1 = 2;
    960				fallthrough;
    961			case PCTRL_CMD_FTH:
    962				send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
    963					  PCTRL_CMD_SILON, 1, &p1);
    964				ch->state = STFAX_SILDET;
    965				break;
    966			case PCTRL_CMD_FRH:
    967			case PCTRL_CMD_FRM:
    968				ch->mod = ch->newmod;
    969				p1 = ch->newmod;
    970				ch->newmod = 0;
    971				ch->cmd = ch->newcmd;
    972				ch->newcmd = 0;
    973				send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
    974					  ch->cmd, 1, &p1);
    975				ch->state = STFAX_LINE;
    976				ch->try_mod = 3;
    977				break;
    978			default:
    979				pr_debug("%s: RSP_DISC unknown newcmd %x\n",
    980					 ch->is->name, ch->newcmd);
    981				break;
    982			}
    983		} else if (ch->state == STFAX_ACTIV) {
    984			if (test_and_clear_bit(FLG_LL_OK, &ch->bch.Flags))
    985				deliver_status(ch, HW_MOD_OK);
    986			else if (ch->cmd == PCTRL_CMD_FRM)
    987				deliver_status(ch, HW_MOD_NOCARR);
    988			else
    989				deliver_status(ch, HW_MOD_FCERROR);
    990			ch->state = STFAX_READY;
    991		} else if (ch->state != STFAX_SILDET) {
    992			/* ignore in STFAX_SILDET */
    993			ch->state = STFAX_READY;
    994			deliver_status(ch, HW_MOD_FCERROR);
    995		}
    996		break;
    997	case PSEV_RSP_SILDET:
    998		pr_debug("%s: pump stev RSP_SILDET\n", ch->is->name);
    999		if (ch->state == STFAX_SILDET) {
   1000			ch->mod = ch->newmod;
   1001			p1 = ch->newmod;
   1002			ch->newmod = 0;
   1003			ch->cmd = ch->newcmd;
   1004			ch->newcmd = 0;
   1005			send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
   1006				  ch->cmd, 1, &p1);
   1007			ch->state = STFAX_LINE;
   1008			ch->try_mod = 3;
   1009		}
   1010		break;
   1011	case PSEV_RSP_SILOFF:
   1012		pr_debug("%s: pump stev RSP_SILOFF\n", ch->is->name);
   1013		break;
   1014	case PSEV_RSP_FCERR:
   1015		if (ch->state == STFAX_LINE) {
   1016			pr_debug("%s: pump stev RSP_FCERR try %d\n",
   1017				 ch->is->name, ch->try_mod);
   1018			if (ch->try_mod--) {
   1019				send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL,
   1020					  ch->cmd, 1, &ch->mod);
   1021				break;
   1022			}
   1023		}
   1024		pr_debug("%s: pump stev RSP_FCERR\n", ch->is->name);
   1025		ch->state = STFAX_ESCAPE;
   1026		send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC,
   1027			  0, NULL);
   1028		deliver_status(ch, HW_MOD_FCERROR);
   1029		break;
   1030	default:
   1031		break;
   1032	}
   1033}
   1034
   1035void
   1036mISDNisar_irq(struct isar_hw *isar)
   1037{
   1038	struct isar_ch *ch;
   1039
   1040	get_irq_infos(isar);
   1041	switch (isar->iis & ISAR_IIS_MSCMSD) {
   1042	case ISAR_IIS_RDATA:
   1043		ch = sel_bch_isar(isar, isar->iis >> 6);
   1044		if (ch)
   1045			isar_rcv_frame(ch);
   1046		else {
   1047			pr_debug("%s: ISAR spurious IIS_RDATA %x/%x/%x\n",
   1048				 isar->name, isar->iis, isar->cmsb,
   1049				 isar->clsb);
   1050			isar->write_reg(isar->hw, ISAR_IIA, 0);
   1051		}
   1052		break;
   1053	case ISAR_IIS_GSTEV:
   1054		isar->write_reg(isar->hw, ISAR_IIA, 0);
   1055		isar->bstat |= isar->cmsb;
   1056		check_send(isar, isar->cmsb);
   1057		break;
   1058	case ISAR_IIS_BSTEV:
   1059#ifdef ERROR_STATISTIC
   1060		ch = sel_bch_isar(isar, isar->iis >> 6);
   1061		if (ch) {
   1062			if (isar->cmsb == BSTEV_TBO)
   1063				ch->bch.err_tx++;
   1064			if (isar->cmsb == BSTEV_RBO)
   1065				ch->bch.err_rdo++;
   1066		}
   1067#endif
   1068		pr_debug("%s: Buffer STEV dpath%d msb(%x)\n",
   1069			 isar->name, isar->iis >> 6, isar->cmsb);
   1070		isar->write_reg(isar->hw, ISAR_IIA, 0);
   1071		break;
   1072	case ISAR_IIS_PSTEV:
   1073		ch = sel_bch_isar(isar, isar->iis >> 6);
   1074		if (ch) {
   1075			rcv_mbox(isar, NULL);
   1076			if (ch->bch.state == ISDN_P_B_MODEM_ASYNC)
   1077				isar_pump_statev_modem(ch, isar->cmsb);
   1078			else if (ch->bch.state == ISDN_P_B_T30_FAX)
   1079				isar_pump_statev_fax(ch, isar->cmsb);
   1080			else if (ch->bch.state == ISDN_P_B_RAW) {
   1081				int	tt;
   1082				tt = isar->cmsb | 0x30;
   1083				if (tt == 0x3e)
   1084					tt = '*';
   1085				else if (tt == 0x3f)
   1086					tt = '#';
   1087				else if (tt > '9')
   1088					tt += 7;
   1089				tt |= DTMF_TONE_VAL;
   1090				_queue_data(&ch->bch.ch, PH_CONTROL_IND,
   1091					    MISDN_ID_ANY, sizeof(tt), &tt,
   1092					    GFP_ATOMIC);
   1093			} else
   1094				pr_debug("%s: ISAR IIS_PSTEV pm %d sta %x\n",
   1095					 isar->name, ch->bch.state,
   1096					 isar->cmsb);
   1097		} else {
   1098			pr_debug("%s: ISAR spurious IIS_PSTEV %x/%x/%x\n",
   1099				 isar->name, isar->iis, isar->cmsb,
   1100				 isar->clsb);
   1101			isar->write_reg(isar->hw, ISAR_IIA, 0);
   1102		}
   1103		break;
   1104	case ISAR_IIS_PSTRSP:
   1105		ch = sel_bch_isar(isar, isar->iis >> 6);
   1106		if (ch) {
   1107			rcv_mbox(isar, NULL);
   1108			isar_pump_status_rsp(ch);
   1109		} else {
   1110			pr_debug("%s: ISAR spurious IIS_PSTRSP %x/%x/%x\n",
   1111				 isar->name, isar->iis, isar->cmsb,
   1112				 isar->clsb);
   1113			isar->write_reg(isar->hw, ISAR_IIA, 0);
   1114		}
   1115		break;
   1116	case ISAR_IIS_DIAG:
   1117	case ISAR_IIS_BSTRSP:
   1118	case ISAR_IIS_IOM2RSP:
   1119		rcv_mbox(isar, NULL);
   1120		break;
   1121	case ISAR_IIS_INVMSG:
   1122		rcv_mbox(isar, NULL);
   1123		pr_debug("%s: invalid msg his:%x\n", isar->name, isar->cmsb);
   1124		break;
   1125	default:
   1126		rcv_mbox(isar, NULL);
   1127		pr_debug("%s: unhandled msg iis(%x) ctrl(%x/%x)\n",
   1128			 isar->name, isar->iis, isar->cmsb, isar->clsb);
   1129		break;
   1130	}
   1131}
   1132EXPORT_SYMBOL(mISDNisar_irq);
   1133
   1134static void
   1135ftimer_handler(struct timer_list *t)
   1136{
   1137	struct isar_ch *ch = from_timer(ch, t, ftimer);
   1138
   1139	pr_debug("%s: ftimer flags %lx\n", ch->is->name, ch->bch.Flags);
   1140	test_and_clear_bit(FLG_FTI_RUN, &ch->bch.Flags);
   1141	if (test_and_clear_bit(FLG_LL_CONN, &ch->bch.Flags))
   1142		deliver_status(ch, HW_MOD_CONNECT);
   1143}
   1144
   1145static void
   1146setup_pump(struct isar_ch *ch) {
   1147	u8 dps = SET_DPS(ch->dpath);
   1148	u8 ctrl, param[6];
   1149
   1150	switch (ch->bch.state) {
   1151	case ISDN_P_NONE:
   1152	case ISDN_P_B_RAW:
   1153	case ISDN_P_B_HDLC:
   1154		send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG, PMOD_BYPASS, 0, NULL);
   1155		break;
   1156	case ISDN_P_B_L2DTMF:
   1157		if (test_bit(FLG_DTMFSEND, &ch->bch.Flags)) {
   1158			param[0] = 5; /* TOA 5 db */
   1159			send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG,
   1160				  PMOD_DTMF_TRANS, 1, param);
   1161		} else {
   1162			param[0] = 40; /* REL -46 dbm */
   1163			send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG,
   1164				  PMOD_DTMF, 1, param);
   1165		}
   1166		fallthrough;
   1167	case ISDN_P_B_MODEM_ASYNC:
   1168		ctrl = PMOD_DATAMODEM;
   1169		if (test_bit(FLG_ORIGIN, &ch->bch.Flags)) {
   1170			ctrl |= PCTRL_ORIG;
   1171			param[5] = PV32P6_CTN;
   1172		} else {
   1173			param[5] = PV32P6_ATN;
   1174		}
   1175		param[0] = 6; /* 6 db */
   1176		param[1] = PV32P2_V23R | PV32P2_V22A | PV32P2_V22B |
   1177			PV32P2_V22C | PV32P2_V21 | PV32P2_BEL;
   1178		param[2] = PV32P3_AMOD | PV32P3_V32B | PV32P3_V23B;
   1179		param[3] = PV32P4_UT144;
   1180		param[4] = PV32P5_UT144;
   1181		send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG, ctrl, 6, param);
   1182		break;
   1183	case ISDN_P_B_T30_FAX:
   1184		ctrl = PMOD_FAX;
   1185		if (test_bit(FLG_ORIGIN, &ch->bch.Flags)) {
   1186			ctrl |= PCTRL_ORIG;
   1187			param[1] = PFAXP2_CTN;
   1188		} else {
   1189			param[1] = PFAXP2_ATN;
   1190		}
   1191		param[0] = 6; /* 6 db */
   1192		send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG, ctrl, 2, param);
   1193		ch->state = STFAX_NULL;
   1194		ch->newcmd = 0;
   1195		ch->newmod = 0;
   1196		test_and_set_bit(FLG_FTI_RUN, &ch->bch.Flags);
   1197		break;
   1198	}
   1199	udelay(1000);
   1200	send_mbox(ch->is, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
   1201	udelay(1000);
   1202}
   1203
   1204static void
   1205setup_sart(struct isar_ch *ch) {
   1206	u8 dps = SET_DPS(ch->dpath);
   1207	u8 ctrl, param[2] = {0, 0};
   1208
   1209	switch (ch->bch.state) {
   1210	case ISDN_P_NONE:
   1211		send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, SMODE_DISABLE,
   1212			  0, NULL);
   1213		break;
   1214	case ISDN_P_B_RAW:
   1215	case ISDN_P_B_L2DTMF:
   1216		send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, SMODE_BINARY,
   1217			  2, param);
   1218		break;
   1219	case ISDN_P_B_HDLC:
   1220	case ISDN_P_B_T30_FAX:
   1221		send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, SMODE_HDLC,
   1222			  1, param);
   1223		break;
   1224	case ISDN_P_B_MODEM_ASYNC:
   1225		ctrl = SMODE_V14 | SCTRL_HDMC_BOTH;
   1226		param[0] = S_P1_CHS_8;
   1227		param[1] = S_P2_BFT_DEF;
   1228		send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, ctrl, 2, param);
   1229		break;
   1230	}
   1231	udelay(1000);
   1232	send_mbox(ch->is, dps | ISAR_HIS_BSTREQ, 0, 0, NULL);
   1233	udelay(1000);
   1234}
   1235
   1236static void
   1237setup_iom2(struct isar_ch *ch) {
   1238	u8 dps = SET_DPS(ch->dpath);
   1239	u8 cmsb = IOM_CTRL_ENA, msg[5] = {IOM_P1_TXD, 0, 0, 0, 0};
   1240
   1241	if (ch->bch.nr == 2) {
   1242		msg[1] = 1;
   1243		msg[3] = 1;
   1244	}
   1245	switch (ch->bch.state) {
   1246	case ISDN_P_NONE:
   1247		cmsb = 0;
   1248		/* dummy slot */
   1249		msg[1] = ch->dpath + 2;
   1250		msg[3] = ch->dpath + 2;
   1251		break;
   1252	case ISDN_P_B_RAW:
   1253	case ISDN_P_B_HDLC:
   1254		break;
   1255	case ISDN_P_B_MODEM_ASYNC:
   1256	case ISDN_P_B_T30_FAX:
   1257		cmsb |= IOM_CTRL_RCV;
   1258		fallthrough;
   1259	case ISDN_P_B_L2DTMF:
   1260		if (test_bit(FLG_DTMFSEND, &ch->bch.Flags))
   1261			cmsb |= IOM_CTRL_RCV;
   1262		cmsb |= IOM_CTRL_ALAW;
   1263		break;
   1264	}
   1265	send_mbox(ch->is, dps | ISAR_HIS_IOM2CFG, cmsb, 5, msg);
   1266	udelay(1000);
   1267	send_mbox(ch->is, dps | ISAR_HIS_IOM2REQ, 0, 0, NULL);
   1268	udelay(1000);
   1269}
   1270
   1271static int
   1272modeisar(struct isar_ch *ch, u32 bprotocol)
   1273{
   1274	/* Here we are selecting the best datapath for requested protocol */
   1275	if (ch->bch.state == ISDN_P_NONE) { /* New Setup */
   1276		switch (bprotocol) {
   1277		case ISDN_P_NONE: /* init */
   1278			if (!ch->dpath)
   1279				/* no init for dpath 0 */
   1280				return 0;
   1281			test_and_clear_bit(FLG_HDLC, &ch->bch.Flags);
   1282			test_and_clear_bit(FLG_TRANSPARENT, &ch->bch.Flags);
   1283			break;
   1284		case ISDN_P_B_RAW:
   1285		case ISDN_P_B_HDLC:
   1286			/* best is datapath 2 */
   1287			if (!test_and_set_bit(ISAR_DP2_USE, &ch->is->Flags))
   1288				ch->dpath = 2;
   1289			else if (!test_and_set_bit(ISAR_DP1_USE,
   1290						   &ch->is->Flags))
   1291				ch->dpath = 1;
   1292			else {
   1293				pr_info("modeisar both paths in use\n");
   1294				return -EBUSY;
   1295			}
   1296			if (bprotocol == ISDN_P_B_HDLC)
   1297				test_and_set_bit(FLG_HDLC, &ch->bch.Flags);
   1298			else
   1299				test_and_set_bit(FLG_TRANSPARENT,
   1300						 &ch->bch.Flags);
   1301			break;
   1302		case ISDN_P_B_MODEM_ASYNC:
   1303		case ISDN_P_B_T30_FAX:
   1304		case ISDN_P_B_L2DTMF:
   1305			/* only datapath 1 */
   1306			if (!test_and_set_bit(ISAR_DP1_USE, &ch->is->Flags))
   1307				ch->dpath = 1;
   1308			else {
   1309				pr_info("%s: ISAR modeisar analog functions"
   1310					"only with DP1\n", ch->is->name);
   1311				return -EBUSY;
   1312			}
   1313			break;
   1314		default:
   1315			pr_info("%s: protocol not known %x\n", ch->is->name,
   1316				bprotocol);
   1317			return -ENOPROTOOPT;
   1318		}
   1319	}
   1320	pr_debug("%s: ISAR ch%d dp%d protocol %x->%x\n", ch->is->name,
   1321		 ch->bch.nr, ch->dpath, ch->bch.state, bprotocol);
   1322	ch->bch.state = bprotocol;
   1323	setup_pump(ch);
   1324	setup_iom2(ch);
   1325	setup_sart(ch);
   1326	if (ch->bch.state == ISDN_P_NONE) {
   1327		/* Clear resources */
   1328		if (ch->dpath == 1)
   1329			test_and_clear_bit(ISAR_DP1_USE, &ch->is->Flags);
   1330		else if (ch->dpath == 2)
   1331			test_and_clear_bit(ISAR_DP2_USE, &ch->is->Flags);
   1332		ch->dpath = 0;
   1333		ch->is->ctrl(ch->is->hw, HW_DEACT_IND, ch->bch.nr);
   1334	} else
   1335		ch->is->ctrl(ch->is->hw, HW_ACTIVATE_IND, ch->bch.nr);
   1336	return 0;
   1337}
   1338
   1339static void
   1340isar_pump_cmd(struct isar_ch *ch, u32 cmd, u8 para)
   1341{
   1342	u8 dps = SET_DPS(ch->dpath);
   1343	u8 ctrl = 0, nom = 0, p1 = 0;
   1344
   1345	pr_debug("%s: isar_pump_cmd %x/%x state(%x)\n",
   1346		 ch->is->name, cmd, para, ch->bch.state);
   1347	switch (cmd) {
   1348	case HW_MOD_FTM:
   1349		if (ch->state == STFAX_READY) {
   1350			p1 = para;
   1351			ctrl = PCTRL_CMD_FTM;
   1352			nom = 1;
   1353			ch->state = STFAX_LINE;
   1354			ch->cmd = ctrl;
   1355			ch->mod = para;
   1356			ch->newmod = 0;
   1357			ch->newcmd = 0;
   1358			ch->try_mod = 3;
   1359		} else if ((ch->state == STFAX_ACTIV) &&
   1360			   (ch->cmd == PCTRL_CMD_FTM) && (ch->mod == para))
   1361			deliver_status(ch, HW_MOD_CONNECT);
   1362		else {
   1363			ch->newmod = para;
   1364			ch->newcmd = PCTRL_CMD_FTM;
   1365			nom = 0;
   1366			ctrl = PCTRL_CMD_ESC;
   1367			ch->state = STFAX_ESCAPE;
   1368		}
   1369		break;
   1370	case HW_MOD_FTH:
   1371		if (ch->state == STFAX_READY) {
   1372			p1 = para;
   1373			ctrl = PCTRL_CMD_FTH;
   1374			nom = 1;
   1375			ch->state = STFAX_LINE;
   1376			ch->cmd = ctrl;
   1377			ch->mod = para;
   1378			ch->newmod = 0;
   1379			ch->newcmd = 0;
   1380			ch->try_mod = 3;
   1381		} else if ((ch->state == STFAX_ACTIV) &&
   1382			   (ch->cmd == PCTRL_CMD_FTH) && (ch->mod == para))
   1383			deliver_status(ch, HW_MOD_CONNECT);
   1384		else {
   1385			ch->newmod = para;
   1386			ch->newcmd = PCTRL_CMD_FTH;
   1387			nom = 0;
   1388			ctrl = PCTRL_CMD_ESC;
   1389			ch->state = STFAX_ESCAPE;
   1390		}
   1391		break;
   1392	case HW_MOD_FRM:
   1393		if (ch->state == STFAX_READY) {
   1394			p1 = para;
   1395			ctrl = PCTRL_CMD_FRM;
   1396			nom = 1;
   1397			ch->state = STFAX_LINE;
   1398			ch->cmd = ctrl;
   1399			ch->mod = para;
   1400			ch->newmod = 0;
   1401			ch->newcmd = 0;
   1402			ch->try_mod = 3;
   1403		} else if ((ch->state == STFAX_ACTIV) &&
   1404			   (ch->cmd == PCTRL_CMD_FRM) && (ch->mod == para))
   1405			deliver_status(ch, HW_MOD_CONNECT);
   1406		else {
   1407			ch->newmod = para;
   1408			ch->newcmd = PCTRL_CMD_FRM;
   1409			nom = 0;
   1410			ctrl = PCTRL_CMD_ESC;
   1411			ch->state = STFAX_ESCAPE;
   1412		}
   1413		break;
   1414	case HW_MOD_FRH:
   1415		if (ch->state == STFAX_READY) {
   1416			p1 = para;
   1417			ctrl = PCTRL_CMD_FRH;
   1418			nom = 1;
   1419			ch->state = STFAX_LINE;
   1420			ch->cmd = ctrl;
   1421			ch->mod = para;
   1422			ch->newmod = 0;
   1423			ch->newcmd = 0;
   1424			ch->try_mod = 3;
   1425		} else if ((ch->state == STFAX_ACTIV) &&
   1426			   (ch->cmd == PCTRL_CMD_FRH) && (ch->mod == para))
   1427			deliver_status(ch, HW_MOD_CONNECT);
   1428		else {
   1429			ch->newmod = para;
   1430			ch->newcmd = PCTRL_CMD_FRH;
   1431			nom = 0;
   1432			ctrl = PCTRL_CMD_ESC;
   1433			ch->state = STFAX_ESCAPE;
   1434		}
   1435		break;
   1436	case PCTRL_CMD_TDTMF:
   1437		p1 = para;
   1438		nom = 1;
   1439		ctrl = PCTRL_CMD_TDTMF;
   1440		break;
   1441	}
   1442	if (ctrl)
   1443		send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, ctrl, nom, &p1);
   1444}
   1445
   1446static void
   1447isar_setup(struct isar_hw *isar)
   1448{
   1449	u8 msg;
   1450	int i;
   1451
   1452	/* Dpath 1, 2 */
   1453	msg = 61;
   1454	for (i = 0; i < 2; i++) {
   1455		/* Buffer Config */
   1456		send_mbox(isar, (i ? ISAR_HIS_DPS2 : ISAR_HIS_DPS1) |
   1457			  ISAR_HIS_P12CFG, 4, 1, &msg);
   1458		isar->ch[i].mml = msg;
   1459		isar->ch[i].bch.state = 0;
   1460		isar->ch[i].dpath = i + 1;
   1461		modeisar(&isar->ch[i], ISDN_P_NONE);
   1462	}
   1463}
   1464
   1465static int
   1466isar_l2l1(struct mISDNchannel *ch, struct sk_buff *skb)
   1467{
   1468	struct bchannel *bch = container_of(ch, struct bchannel, ch);
   1469	struct isar_ch *ich = container_of(bch, struct isar_ch, bch);
   1470	int ret = -EINVAL;
   1471	struct mISDNhead *hh = mISDN_HEAD_P(skb);
   1472	u32 id, *val;
   1473	u_long flags;
   1474
   1475	switch (hh->prim) {
   1476	case PH_DATA_REQ:
   1477		spin_lock_irqsave(ich->is->hwlock, flags);
   1478		ret = bchannel_senddata(bch, skb);
   1479		if (ret > 0) { /* direct TX */
   1480			ret = 0;
   1481			isar_fill_fifo(ich);
   1482		}
   1483		spin_unlock_irqrestore(ich->is->hwlock, flags);
   1484		return ret;
   1485	case PH_ACTIVATE_REQ:
   1486		spin_lock_irqsave(ich->is->hwlock, flags);
   1487		if (!test_and_set_bit(FLG_ACTIVE, &bch->Flags))
   1488			ret = modeisar(ich, ch->protocol);
   1489		else
   1490			ret = 0;
   1491		spin_unlock_irqrestore(ich->is->hwlock, flags);
   1492		if (!ret)
   1493			_queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
   1494				    NULL, GFP_KERNEL);
   1495		break;
   1496	case PH_DEACTIVATE_REQ:
   1497		spin_lock_irqsave(ich->is->hwlock, flags);
   1498		mISDN_clear_bchannel(bch);
   1499		modeisar(ich, ISDN_P_NONE);
   1500		spin_unlock_irqrestore(ich->is->hwlock, flags);
   1501		_queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
   1502			    NULL, GFP_KERNEL);
   1503		ret = 0;
   1504		break;
   1505	case PH_CONTROL_REQ:
   1506		val = (u32 *)skb->data;
   1507		pr_debug("%s: PH_CONTROL | REQUEST %x/%x\n", ich->is->name,
   1508			 hh->id, *val);
   1509		if ((hh->id == 0) && ((*val & ~DTMF_TONE_MASK) ==
   1510				      DTMF_TONE_VAL)) {
   1511			if (bch->state == ISDN_P_B_L2DTMF) {
   1512				char tt = *val & DTMF_TONE_MASK;
   1513
   1514				if (tt == '*')
   1515					tt = 0x1e;
   1516				else if (tt == '#')
   1517					tt = 0x1f;
   1518				else if (tt > '9')
   1519					tt -= 7;
   1520				tt &= 0x1f;
   1521				spin_lock_irqsave(ich->is->hwlock, flags);
   1522				isar_pump_cmd(ich, PCTRL_CMD_TDTMF, tt);
   1523				spin_unlock_irqrestore(ich->is->hwlock, flags);
   1524			} else {
   1525				pr_info("%s: DTMF send wrong protocol %x\n",
   1526					__func__, bch->state);
   1527				return -EINVAL;
   1528			}
   1529		} else if ((hh->id == HW_MOD_FRM) || (hh->id == HW_MOD_FRH) ||
   1530			   (hh->id == HW_MOD_FTM) || (hh->id == HW_MOD_FTH)) {
   1531			for (id = 0; id < FAXMODCNT; id++)
   1532				if (faxmodulation[id] == *val)
   1533					break;
   1534			if ((FAXMODCNT > id) &&
   1535			    test_bit(FLG_INITIALIZED, &bch->Flags)) {
   1536				pr_debug("%s: isar: new mod\n", ich->is->name);
   1537				isar_pump_cmd(ich, hh->id, *val);
   1538				ret = 0;
   1539			} else {
   1540				pr_info("%s: wrong modulation\n",
   1541					ich->is->name);
   1542				ret = -EINVAL;
   1543			}
   1544		} else if (hh->id == HW_MOD_LASTDATA)
   1545			test_and_set_bit(FLG_DLEETX, &bch->Flags);
   1546		else {
   1547			pr_info("%s: unknown PH_CONTROL_REQ %x\n",
   1548				ich->is->name, hh->id);
   1549			ret = -EINVAL;
   1550		}
   1551		fallthrough;
   1552	default:
   1553		pr_info("%s: %s unknown prim(%x,%x)\n",
   1554			ich->is->name, __func__, hh->prim, hh->id);
   1555		ret = -EINVAL;
   1556	}
   1557	if (!ret)
   1558		dev_kfree_skb(skb);
   1559	return ret;
   1560}
   1561
   1562static int
   1563channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
   1564{
   1565	return mISDN_ctrl_bchannel(bch, cq);
   1566}
   1567
   1568static int
   1569isar_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
   1570{
   1571	struct bchannel *bch = container_of(ch, struct bchannel, ch);
   1572	struct isar_ch *ich = container_of(bch, struct isar_ch, bch);
   1573	int ret = -EINVAL;
   1574	u_long flags;
   1575
   1576	pr_debug("%s: %s cmd:%x %p\n", ich->is->name, __func__, cmd, arg);
   1577	switch (cmd) {
   1578	case CLOSE_CHANNEL:
   1579		test_and_clear_bit(FLG_OPEN, &bch->Flags);
   1580		cancel_work_sync(&bch->workq);
   1581		spin_lock_irqsave(ich->is->hwlock, flags);
   1582		mISDN_clear_bchannel(bch);
   1583		modeisar(ich, ISDN_P_NONE);
   1584		spin_unlock_irqrestore(ich->is->hwlock, flags);
   1585		ch->protocol = ISDN_P_NONE;
   1586		ch->peer = NULL;
   1587		module_put(ich->is->owner);
   1588		ret = 0;
   1589		break;
   1590	case CONTROL_CHANNEL:
   1591		ret = channel_bctrl(bch, arg);
   1592		break;
   1593	default:
   1594		pr_info("%s: %s unknown prim(%x)\n",
   1595			ich->is->name, __func__, cmd);
   1596	}
   1597	return ret;
   1598}
   1599
   1600static void
   1601free_isar(struct isar_hw *isar)
   1602{
   1603	modeisar(&isar->ch[0], ISDN_P_NONE);
   1604	modeisar(&isar->ch[1], ISDN_P_NONE);
   1605	del_timer(&isar->ch[0].ftimer);
   1606	del_timer(&isar->ch[1].ftimer);
   1607	test_and_clear_bit(FLG_INITIALIZED, &isar->ch[0].bch.Flags);
   1608	test_and_clear_bit(FLG_INITIALIZED, &isar->ch[1].bch.Flags);
   1609}
   1610
   1611static int
   1612init_isar(struct isar_hw *isar)
   1613{
   1614	int	cnt = 3;
   1615
   1616	while (cnt--) {
   1617		isar->version = ISARVersion(isar);
   1618		if (isar->ch[0].bch.debug & DEBUG_HW)
   1619			pr_notice("%s: Testing version %d (%d time)\n",
   1620				  isar->name, isar->version, 3 - cnt);
   1621		if (isar->version == 1)
   1622			break;
   1623		isar->ctrl(isar->hw, HW_RESET_REQ, 0);
   1624	}
   1625	if (isar->version != 1)
   1626		return -EINVAL;
   1627	timer_setup(&isar->ch[0].ftimer, ftimer_handler, 0);
   1628	test_and_set_bit(FLG_INITIALIZED, &isar->ch[0].bch.Flags);
   1629	timer_setup(&isar->ch[1].ftimer, ftimer_handler, 0);
   1630	test_and_set_bit(FLG_INITIALIZED, &isar->ch[1].bch.Flags);
   1631	return 0;
   1632}
   1633
   1634static int
   1635isar_open(struct isar_hw *isar, struct channel_req *rq)
   1636{
   1637	struct bchannel		*bch;
   1638
   1639	if (rq->adr.channel == 0 || rq->adr.channel > 2)
   1640		return -EINVAL;
   1641	if (rq->protocol == ISDN_P_NONE)
   1642		return -EINVAL;
   1643	bch = &isar->ch[rq->adr.channel - 1].bch;
   1644	if (test_and_set_bit(FLG_OPEN, &bch->Flags))
   1645		return -EBUSY; /* b-channel can be only open once */
   1646	bch->ch.protocol = rq->protocol;
   1647	rq->ch = &bch->ch;
   1648	return 0;
   1649}
   1650
   1651u32
   1652mISDNisar_init(struct isar_hw *isar, void *hw)
   1653{
   1654	u32 ret, i;
   1655
   1656	isar->hw = hw;
   1657	for (i = 0; i < 2; i++) {
   1658		isar->ch[i].bch.nr = i + 1;
   1659		mISDN_initbchannel(&isar->ch[i].bch, MAX_DATA_MEM, 32);
   1660		isar->ch[i].bch.ch.nr = i + 1;
   1661		isar->ch[i].bch.ch.send = &isar_l2l1;
   1662		isar->ch[i].bch.ch.ctrl = isar_bctrl;
   1663		isar->ch[i].bch.hw = hw;
   1664		isar->ch[i].is = isar;
   1665	}
   1666
   1667	isar->init = &init_isar;
   1668	isar->release = &free_isar;
   1669	isar->firmware = &load_firmware;
   1670	isar->open = &isar_open;
   1671
   1672	ret =	(1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
   1673		(1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK)) |
   1674		(1 << (ISDN_P_B_L2DTMF & ISDN_P_B_MASK)) |
   1675		(1 << (ISDN_P_B_MODEM_ASYNC & ISDN_P_B_MASK)) |
   1676		(1 << (ISDN_P_B_T30_FAX & ISDN_P_B_MASK));
   1677
   1678	return ret;
   1679}
   1680EXPORT_SYMBOL(mISDNisar_init);
   1681
   1682static int __init isar_mod_init(void)
   1683{
   1684	pr_notice("mISDN: ISAR driver Rev. %s\n", ISAR_REV);
   1685	return 0;
   1686}
   1687
   1688static void __exit isar_mod_cleanup(void)
   1689{
   1690	pr_notice("mISDN: ISAR module unloaded\n");
   1691}
   1692module_init(isar_mod_init);
   1693module_exit(isar_mod_cleanup);