[go: nahoru, domu]

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