1/* $Id: elsa.c,v 2.32.2.4 2004/01/24 20:47:21 keil Exp $
2 *
3 * low level stuff for Elsa isdn cards
4 *
5 * Author       Karsten Keil
6 * Copyright    by Karsten Keil      <keil@isdn4linux.de>
7 *
8 * This software may be used and distributed according to the terms
9 * of the GNU General Public License, incorporated herein by reference.
10 *
11 * For changes and modifications please read
12 * Documentation/isdn/HiSax.cert
13 *
14 * Thanks to    Elsa GmbH for documents and information
15 *
16 *              Klaus Lichtenwalder (Klaus.Lichtenwalder@WebForum.DE)
17 *              for ELSA PCMCIA support
18 *
19 */
20
21#include <linux/init.h>
22#include <linux/slab.h>
23#include "hisax.h"
24#include "arcofi.h"
25#include "isac.h"
26#include "ipac.h"
27#include "hscx.h"
28#include "isdnl1.h"
29#include <linux/pci.h>
30#include <linux/isapnp.h>
31#include <linux/serial.h>
32#include <linux/serial_reg.h>
33
34static const char *Elsa_revision = "$Revision: 2.32.2.4 $";
35static const char *Elsa_Types[] =
36{"None", "PC", "PCC-8", "PCC-16", "PCF", "PCF-Pro",
37 "PCMCIA", "QS 1000", "QS 3000", "Microlink PCI", "QS 3000 PCI",
38 "PCMCIA-IPAC" };
39
40static const char *ITACVer[] =
41{"?0?", "?1?", "?2?", "?3?", "?4?", "V2.2",
42 "B1", "A1"};
43
44#define byteout(addr, val) outb(val, addr)
45#define bytein(addr) inb(addr)
46
47#define ELSA_ISAC	0
48#define ELSA_ISAC_PCM	1
49#define ELSA_ITAC	1
50#define ELSA_HSCX	2
51#define ELSA_ALE	3
52#define ELSA_ALE_PCM	4
53#define ELSA_CONTROL	4
54#define ELSA_CONFIG	5
55#define ELSA_START_TIMER 6
56#define ELSA_TRIG_IRQ	7
57
58#define ELSA_PC      1
59#define ELSA_PCC8    2
60#define ELSA_PCC16   3
61#define ELSA_PCF     4
62#define ELSA_PCFPRO  5
63#define ELSA_PCMCIA  6
64#define ELSA_QS1000  7
65#define ELSA_QS3000  8
66#define ELSA_QS1000PCI 9
67#define ELSA_QS3000PCI 10
68#define ELSA_PCMCIA_IPAC 11
69
70/* PCI stuff */
71#define ELSA_PCI_IRQ_MASK	0x04
72
73/* ITAC Registeradressen (only Microlink PC) */
74#define ITAC_SYS	0x34
75#define ITAC_ISEN	0x48
76#define ITAC_RFIE	0x4A
77#define ITAC_XFIE	0x4C
78#define ITAC_SCIE	0x4E
79#define ITAC_STIE	0x46
80
81/***                                                                    ***
82 ***   Makros als Befehle fuer die Kartenregister                       ***
83 ***   (mehrere Befehle werden durch Bit-Oderung kombiniert)            ***
84 ***                                                                    ***/
85
86/* Config-Register (Read) */
87#define ELIRQF_TIMER_RUN       0x02	/* Bit 1 des Config-Reg     */
88#define ELIRQF_TIMER_RUN_PCC8  0x01	/* Bit 0 des Config-Reg  bei PCC */
89#define ELSA_IRQ_IDX       0x38	/* Bit 3,4,5 des Config-Reg */
90#define ELSA_IRQ_IDX_PCC8  0x30	/* Bit 4,5 des Config-Reg */
91#define ELSA_IRQ_IDX_PC    0x0c	/* Bit 2,3 des Config-Reg */
92
93/* Control-Register (Write) */
94#define ELSA_LINE_LED        0x02	/* Bit 1 Gelbe LED */
95#define ELSA_STAT_LED        0x08	/* Bit 3 Gruene LED */
96#define ELSA_ISDN_RESET      0x20	/* Bit 5 Reset-Leitung */
97#define ELSA_ENA_TIMER_INT   0x80	/* Bit 7 Freigabe Timer Interrupt */
98
99/* ALE-Register (Read) */
100#define ELSA_HW_RELEASE      0x07	/* Bit 0-2 Hardwarerkennung */
101#define ELSA_S0_POWER_BAD    0x08	/* Bit 3 S0-Bus Spannung fehlt */
102
103/* Status Flags */
104#define ELIRQF_TIMER_AKTIV 1
105#define ELSA_BAD_PWR     2
106#define ELSA_ASSIGN      4
107
108#define RS_ISR_PASS_LIMIT 256
109#define FLG_MODEM_ACTIVE 1
110/* IPAC AUX */
111#define ELSA_IPAC_LINE_LED	0x40	/* Bit 6 Gelbe LED */
112#define ELSA_IPAC_STAT_LED	0x80	/* Bit 7 Gruene LED */
113
114#if ARCOFI_USE
115static struct arcofi_msg ARCOFI_XOP_F =
116{NULL,0,2,{0xa1,0x3f,0,0,0,0,0,0,0,0}}; /* Normal OP */
117static struct arcofi_msg ARCOFI_XOP_1 =
118{&ARCOFI_XOP_F,0,2,{0xa1,0x31,0,0,0,0,0,0,0,0}}; /* PWR UP */
119static struct arcofi_msg ARCOFI_SOP_F =
120{&ARCOFI_XOP_1,0,10,{0xa1,0x1f,0x00,0x50,0x10,0x00,0x00,0x80,0x02,0x12}};
121static struct arcofi_msg ARCOFI_COP_9 =
122{&ARCOFI_SOP_F,0,10,{0xa1,0x29,0x80,0xcb,0xe9,0x88,0x00,0xc8,0xd8,0x80}}; /* RX */
123static struct arcofi_msg ARCOFI_COP_8 =
124{&ARCOFI_COP_9,0,10,{0xa1,0x28,0x49,0x31,0x8,0x13,0x6e,0x88,0x2a,0x61}}; /* TX */
125static struct arcofi_msg ARCOFI_COP_7 =
126{&ARCOFI_COP_8,0,4,{0xa1,0x27,0x80,0x80,0,0,0,0,0,0}}; /* GZ */
127static struct arcofi_msg ARCOFI_COP_6 =
128{&ARCOFI_COP_7,0,6,{0xa1,0x26,0,0,0x82,0x7c,0,0,0,0}}; /* GRL GRH */
129static struct arcofi_msg ARCOFI_COP_5 =
130{&ARCOFI_COP_6,0,4,{0xa1,0x25,0xbb,0x4a,0,0,0,0,0,0}}; /* GTX */
131static struct arcofi_msg ARCOFI_VERSION =
132{NULL,1,2,{0xa0,0,0,0,0,0,0,0,0,0}};
133static struct arcofi_msg ARCOFI_XOP_0 =
134{NULL,0,2,{0xa1,0x30,0,0,0,0,0,0,0,0}}; /* PWR Down */
135
136static void set_arcofi(struct IsdnCardState *cs, int bc);
137
138#include "elsa_ser.c"
139#endif /* ARCOFI_USE */
140
141static inline u_char
142readreg(unsigned int ale, unsigned int adr, u_char off)
143{
144	register u_char ret;
145
146	byteout(ale, off);
147	ret = bytein(adr);
148	return (ret);
149}
150
151static inline void
152readfifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
153{
154	byteout(ale, off);
155	insb(adr, data, size);
156}
157
158
159static inline void
160writereg(unsigned int ale, unsigned int adr, u_char off, u_char data)
161{
162	byteout(ale, off);
163	byteout(adr, data);
164}
165
166static inline void
167writefifo(unsigned int ale, unsigned int adr, u_char off, u_char *data, int size)
168{
169	byteout(ale, off);
170	outsb(adr, data, size);
171}
172
173/* Interface functions */
174
175static u_char
176ReadISAC(struct IsdnCardState *cs, u_char offset)
177{
178	return (readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset));
179}
180
181static void
182WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
183{
184	writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset, value);
185}
186
187static void
188ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
189{
190	readfifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0, data, size);
191}
192
193static void
194WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
195{
196	writefifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0, data, size);
197}
198
199static u_char
200ReadISAC_IPAC(struct IsdnCardState *cs, u_char offset)
201{
202	return (readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset + 0x80));
203}
204
205static void
206WriteISAC_IPAC(struct IsdnCardState *cs, u_char offset, u_char value)
207{
208	writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset | 0x80, value);
209}
210
211static void
212ReadISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
213{
214	readfifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0x80, data, size);
215}
216
217static void
218WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char *data, int size)
219{
220	writefifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0x80, data, size);
221}
222
223static u_char
224ReadHSCX(struct IsdnCardState *cs, int hscx, u_char offset)
225{
226	return (readreg(cs->hw.elsa.ale,
227			cs->hw.elsa.hscx, offset + (hscx ? 0x40 : 0)));
228}
229
230static void
231WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
232{
233	writereg(cs->hw.elsa.ale,
234		 cs->hw.elsa.hscx, offset + (hscx ? 0x40 : 0), value);
235}
236
237static inline u_char
238readitac(struct IsdnCardState *cs, u_char off)
239{
240	register u_char ret;
241
242	byteout(cs->hw.elsa.ale, off);
243	ret = bytein(cs->hw.elsa.itac);
244	return (ret);
245}
246
247static inline void
248writeitac(struct IsdnCardState *cs, u_char off, u_char data)
249{
250	byteout(cs->hw.elsa.ale, off);
251	byteout(cs->hw.elsa.itac, data);
252}
253
254static inline int
255TimerRun(struct IsdnCardState *cs)
256{
257	register u_char v;
258
259	v = bytein(cs->hw.elsa.cfg);
260	if ((cs->subtyp == ELSA_QS1000) || (cs->subtyp == ELSA_QS3000))
261		return (0 == (v & ELIRQF_TIMER_RUN));
262	else if (cs->subtyp == ELSA_PCC8)
263		return (v & ELIRQF_TIMER_RUN_PCC8);
264	return (v & ELIRQF_TIMER_RUN);
265}
266/*
267 * fast interrupt HSCX stuff goes here
268 */
269
270#define READHSCX(cs, nr, reg) readreg(cs->hw.elsa.ale,			\
271				      cs->hw.elsa.hscx, reg + (nr ? 0x40 : 0))
272#define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.elsa.ale,		\
273					      cs->hw.elsa.hscx, reg + (nr ? 0x40 : 0), data)
274
275#define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.elsa.ale,	\
276						cs->hw.elsa.hscx, (nr ? 0x40 : 0), ptr, cnt)
277
278#define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.elsa.ale,	\
279						  cs->hw.elsa.hscx, (nr ? 0x40 : 0), ptr, cnt)
280
281#include "hscx_irq.c"
282
283static irqreturn_t
284elsa_interrupt(int intno, void *dev_id)
285{
286	struct IsdnCardState *cs = dev_id;
287	u_long flags;
288	u_char val;
289	int icnt = 5;
290
291	if ((cs->typ == ISDN_CTYPE_ELSA_PCMCIA) && (*cs->busy_flag == 1)) {
292		/* The card tends to generate interrupts while being removed
293		   causing us to just crash the kernel. bad. */
294		printk(KERN_WARNING "Elsa: card not available!\n");
295		return IRQ_NONE;
296	}
297	spin_lock_irqsave(&cs->lock, flags);
298#if ARCOFI_USE
299	if (cs->hw.elsa.MFlag) {
300		val = serial_inp(cs, UART_IIR);
301		if (!(val & UART_IIR_NO_INT)) {
302			debugl1(cs, "IIR %02x", val);
303			rs_interrupt_elsa(cs);
304		}
305	}
306#endif
307	val = readreg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_ISTA + 0x40);
308Start_HSCX:
309	if (val) {
310		hscx_int_main(cs, val);
311	}
312	val = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_ISTA);
313Start_ISAC:
314	if (val) {
315		isac_interrupt(cs, val);
316	}
317	val = readreg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_ISTA + 0x40);
318	if (val && icnt) {
319		if (cs->debug & L1_DEB_HSCX)
320			debugl1(cs, "HSCX IntStat after IntRoutine");
321		icnt--;
322		goto Start_HSCX;
323	}
324	val = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_ISTA);
325	if (val && icnt) {
326		if (cs->debug & L1_DEB_ISAC)
327			debugl1(cs, "ISAC IntStat after IntRoutine");
328		icnt--;
329		goto Start_ISAC;
330	}
331	if (!icnt)
332		printk(KERN_WARNING"ELSA IRQ LOOP\n");
333	writereg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_MASK, 0xFF);
334	writereg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_MASK + 0x40, 0xFF);
335	writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_MASK, 0xFF);
336	if (cs->hw.elsa.status & ELIRQF_TIMER_AKTIV) {
337		if (!TimerRun(cs)) {
338			/* Timer Restart */
339			byteout(cs->hw.elsa.timer, 0);
340			cs->hw.elsa.counter++;
341		}
342	}
343#if ARCOFI_USE
344	if (cs->hw.elsa.MFlag) {
345		val = serial_inp(cs, UART_MCR);
346		val ^= 0x8;
347		serial_outp(cs, UART_MCR, val);
348		val = serial_inp(cs, UART_MCR);
349		val ^= 0x8;
350		serial_outp(cs, UART_MCR, val);
351	}
352#endif
353	if (cs->hw.elsa.trig)
354		byteout(cs->hw.elsa.trig, 0x00);
355	writereg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_MASK, 0x0);
356	writereg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_MASK + 0x40, 0x0);
357	writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_MASK, 0x0);
358	spin_unlock_irqrestore(&cs->lock, flags);
359	return IRQ_HANDLED;
360}
361
362static irqreturn_t
363elsa_interrupt_ipac(int intno, void *dev_id)
364{
365	struct IsdnCardState *cs = dev_id;
366	u_long flags;
367	u_char ista, val;
368	int icnt = 5;
369
370	spin_lock_irqsave(&cs->lock, flags);
371	if (cs->subtyp == ELSA_QS1000PCI || cs->subtyp == ELSA_QS3000PCI) {
372		val = bytein(cs->hw.elsa.cfg + 0x4c); /* PCI IRQ */
373		if (!(val & ELSA_PCI_IRQ_MASK)) {
374			spin_unlock_irqrestore(&cs->lock, flags);
375			return IRQ_NONE;
376		}
377	}
378#if ARCOFI_USE
379	if (cs->hw.elsa.MFlag) {
380		val = serial_inp(cs, UART_IIR);
381		if (!(val & UART_IIR_NO_INT)) {
382			debugl1(cs, "IIR %02x", val);
383			rs_interrupt_elsa(cs);
384		}
385	}
386#endif
387	ista = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ISTA);
388Start_IPAC:
389	if (cs->debug & L1_DEB_IPAC)
390		debugl1(cs, "IPAC ISTA %02X", ista);
391	if (ista & 0x0f) {
392		val = readreg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_ISTA + 0x40);
393		if (ista & 0x01)
394			val |= 0x01;
395		if (ista & 0x04)
396			val |= 0x02;
397		if (ista & 0x08)
398			val |= 0x04;
399		if (val)
400			hscx_int_main(cs, val);
401	}
402	if (ista & 0x20) {
403		val = 0xfe & readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_ISTA + 0x80);
404		if (val) {
405			isac_interrupt(cs, val);
406		}
407	}
408	if (ista & 0x10) {
409		val = 0x01;
410		isac_interrupt(cs, val);
411	}
412	ista  = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ISTA);
413	if ((ista & 0x3f) && icnt) {
414		icnt--;
415		goto Start_IPAC;
416	}
417	if (!icnt)
418		printk(KERN_WARNING "ELSA IRQ LOOP\n");
419	writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_MASK, 0xFF);
420	writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_MASK, 0xC0);
421	spin_unlock_irqrestore(&cs->lock, flags);
422	return IRQ_HANDLED;
423}
424
425static void
426release_io_elsa(struct IsdnCardState *cs)
427{
428	int bytecnt = 8;
429
430	del_timer(&cs->hw.elsa.tl);
431#if ARCOFI_USE
432	clear_arcofi(cs);
433#endif
434	if (cs->hw.elsa.ctrl)
435		byteout(cs->hw.elsa.ctrl, 0);	/* LEDs Out */
436	if (cs->subtyp == ELSA_QS1000PCI) {
437		byteout(cs->hw.elsa.cfg + 0x4c, 0x01);  /* disable IRQ */
438		writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, 0xff);
439		bytecnt = 2;
440		release_region(cs->hw.elsa.cfg, 0x80);
441	}
442	if (cs->subtyp == ELSA_QS3000PCI) {
443		byteout(cs->hw.elsa.cfg + 0x4c, 0x03); /* disable ELSA PCI IRQ */
444		writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, 0xff);
445		release_region(cs->hw.elsa.cfg, 0x80);
446	}
447	if (cs->subtyp == ELSA_PCMCIA_IPAC) {
448		writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, 0xff);
449	}
450	if ((cs->subtyp == ELSA_PCFPRO) ||
451	    (cs->subtyp == ELSA_QS3000) ||
452	    (cs->subtyp == ELSA_PCF) ||
453	    (cs->subtyp == ELSA_QS3000PCI)) {
454		bytecnt = 16;
455#if ARCOFI_USE
456		release_modem(cs);
457#endif
458	}
459	if (cs->hw.elsa.base)
460		release_region(cs->hw.elsa.base, bytecnt);
461}
462
463static void
464reset_elsa(struct IsdnCardState *cs)
465{
466	if (cs->hw.elsa.timer) {
467		/* Wait 1 Timer */
468		byteout(cs->hw.elsa.timer, 0);
469		while (TimerRun(cs));
470		cs->hw.elsa.ctrl_reg |= 0x50;
471		cs->hw.elsa.ctrl_reg &= ~ELSA_ISDN_RESET;	/* Reset On */
472		byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
473		/* Wait 1 Timer */
474		byteout(cs->hw.elsa.timer, 0);
475		while (TimerRun(cs));
476		cs->hw.elsa.ctrl_reg |= ELSA_ISDN_RESET;	/* Reset Off */
477		byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
478		/* Wait 1 Timer */
479		byteout(cs->hw.elsa.timer, 0);
480		while (TimerRun(cs));
481		if (cs->hw.elsa.trig)
482			byteout(cs->hw.elsa.trig, 0xff);
483	}
484	if ((cs->subtyp == ELSA_QS1000PCI) || (cs->subtyp == ELSA_QS3000PCI) || (cs->subtyp == ELSA_PCMCIA_IPAC)) {
485		writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_POTA2, 0x20);
486		mdelay(10);
487		writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_POTA2, 0x00);
488		writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_MASK, 0xc0);
489		mdelay(10);
490		if (cs->subtyp != ELSA_PCMCIA_IPAC) {
491			writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ACFG, 0x0);
492			writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_AOE, 0x3c);
493		} else {
494			writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_PCFG, 0x10);
495			writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ACFG, 0x4);
496			writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_AOE, 0xf8);
497		}
498		writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, 0xff);
499		if (cs->subtyp == ELSA_QS1000PCI)
500			byteout(cs->hw.elsa.cfg + 0x4c, 0x41); /* enable ELSA PCI IRQ */
501		else if (cs->subtyp == ELSA_QS3000PCI)
502			byteout(cs->hw.elsa.cfg + 0x4c, 0x43); /* enable ELSA PCI IRQ */
503	}
504}
505
506#if ARCOFI_USE
507
508static void
509set_arcofi(struct IsdnCardState *cs, int bc) {
510	cs->dc.isac.arcofi_bc = bc;
511	arcofi_fsm(cs, ARCOFI_START, &ARCOFI_COP_5);
512	wait_event_interruptible(cs->dc.isac.arcofi_wait,
513				 cs->dc.isac.arcofi_state == ARCOFI_NOP);
514}
515
516static int
517check_arcofi(struct IsdnCardState *cs)
518{
519	int arcofi_present = 0;
520	char tmp[40];
521	char *t;
522	u_char *p;
523
524	if (!cs->dc.isac.mon_tx)
525		if (!(cs->dc.isac.mon_tx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC))) {
526			if (cs->debug & L1_DEB_WARN)
527				debugl1(cs, "ISAC MON TX out of buffers!");
528			return (0);
529		}
530	cs->dc.isac.arcofi_bc = 0;
531	arcofi_fsm(cs, ARCOFI_START, &ARCOFI_VERSION);
532	wait_event_interruptible(cs->dc.isac.arcofi_wait,
533				 cs->dc.isac.arcofi_state == ARCOFI_NOP);
534	if (!test_and_clear_bit(FLG_ARCOFI_ERROR, &cs->HW_Flags)) {
535		debugl1(cs, "Arcofi response received %d bytes", cs->dc.isac.mon_rxp);
536		p = cs->dc.isac.mon_rx;
537		t = tmp;
538		t += sprintf(tmp, "Arcofi data");
539		QuickHex(t, p, cs->dc.isac.mon_rxp);
540		debugl1(cs, "%s", tmp);
541		if ((cs->dc.isac.mon_rxp == 2) && (cs->dc.isac.mon_rx[0] == 0xa0)) {
542			switch (cs->dc.isac.mon_rx[1]) {
543			case 0x80:
544				debugl1(cs, "Arcofi 2160 detected");
545				arcofi_present = 1;
546				break;
547			case 0x82:
548				debugl1(cs, "Arcofi 2165 detected");
549				arcofi_present = 2;
550				break;
551			case 0x84:
552				debugl1(cs, "Arcofi 2163 detected");
553				arcofi_present = 3;
554				break;
555			default:
556				debugl1(cs, "unknown Arcofi response");
557				break;
558			}
559		} else
560			debugl1(cs, "undefined Monitor response");
561		cs->dc.isac.mon_rxp = 0;
562	} else if (cs->dc.isac.mon_tx) {
563		debugl1(cs, "Arcofi not detected");
564	}
565	if (arcofi_present) {
566		if (cs->subtyp == ELSA_QS1000) {
567			cs->subtyp = ELSA_QS3000;
568			printk(KERN_INFO
569			       "Elsa: %s detected modem at 0x%lx\n",
570			       Elsa_Types[cs->subtyp],
571			       cs->hw.elsa.base + 8);
572			release_region(cs->hw.elsa.base, 8);
573			if (!request_region(cs->hw.elsa.base, 16, "elsa isdn modem")) {
574				printk(KERN_WARNING
575				       "HiSax: %s config port %lx-%lx already in use\n",
576				       Elsa_Types[cs->subtyp],
577				       cs->hw.elsa.base + 8,
578				       cs->hw.elsa.base + 16);
579			}
580		} else if (cs->subtyp == ELSA_PCC16) {
581			cs->subtyp = ELSA_PCF;
582			printk(KERN_INFO
583			       "Elsa: %s detected modem at 0x%lx\n",
584			       Elsa_Types[cs->subtyp],
585			       cs->hw.elsa.base + 8);
586			release_region(cs->hw.elsa.base, 8);
587			if (!request_region(cs->hw.elsa.base, 16, "elsa isdn modem")) {
588				printk(KERN_WARNING
589				       "HiSax: %s config port %lx-%lx already in use\n",
590				       Elsa_Types[cs->subtyp],
591				       cs->hw.elsa.base + 8,
592				       cs->hw.elsa.base + 16);
593			}
594		} else
595			printk(KERN_INFO
596			       "Elsa: %s detected modem at 0x%lx\n",
597			       Elsa_Types[cs->subtyp],
598			       cs->hw.elsa.base + 8);
599		arcofi_fsm(cs, ARCOFI_START, &ARCOFI_XOP_0);
600		wait_event_interruptible(cs->dc.isac.arcofi_wait,
601				 cs->dc.isac.arcofi_state == ARCOFI_NOP);
602		return (1);
603	}
604	return (0);
605}
606#endif /* ARCOFI_USE */
607
608static void
609elsa_led_handler(struct IsdnCardState *cs)
610{
611	int blink = 0;
612
613	if (cs->subtyp == ELSA_PCMCIA || cs->subtyp == ELSA_PCMCIA_IPAC)
614		return;
615	del_timer(&cs->hw.elsa.tl);
616	if (cs->hw.elsa.status & ELSA_ASSIGN)
617		cs->hw.elsa.ctrl_reg |= ELSA_STAT_LED;
618	else if (cs->hw.elsa.status & ELSA_BAD_PWR)
619		cs->hw.elsa.ctrl_reg &= ~ELSA_STAT_LED;
620	else {
621		cs->hw.elsa.ctrl_reg ^= ELSA_STAT_LED;
622		blink = 250;
623	}
624	if (cs->hw.elsa.status & 0xf000)
625		cs->hw.elsa.ctrl_reg |= ELSA_LINE_LED;
626	else if (cs->hw.elsa.status & 0x0f00) {
627		cs->hw.elsa.ctrl_reg ^= ELSA_LINE_LED;
628		blink = 500;
629	} else
630		cs->hw.elsa.ctrl_reg &= ~ELSA_LINE_LED;
631
632	if ((cs->subtyp == ELSA_QS1000PCI) ||
633	    (cs->subtyp == ELSA_QS3000PCI)) {
634		u_char led = 0xff;
635		if (cs->hw.elsa.ctrl_reg & ELSA_LINE_LED)
636			led ^= ELSA_IPAC_LINE_LED;
637		if (cs->hw.elsa.ctrl_reg & ELSA_STAT_LED)
638			led ^= ELSA_IPAC_STAT_LED;
639		writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, led);
640	} else
641		byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
642	if (blink) {
643		init_timer(&cs->hw.elsa.tl);
644		cs->hw.elsa.tl.expires = jiffies + ((blink * HZ) / 1000);
645		add_timer(&cs->hw.elsa.tl);
646	}
647}
648
649static int
650Elsa_card_msg(struct IsdnCardState *cs, int mt, void *arg)
651{
652	int ret = 0;
653	u_long flags;
654
655	switch (mt) {
656	case CARD_RESET:
657		spin_lock_irqsave(&cs->lock, flags);
658		reset_elsa(cs);
659		spin_unlock_irqrestore(&cs->lock, flags);
660		return (0);
661	case CARD_RELEASE:
662		release_io_elsa(cs);
663		return (0);
664	case CARD_INIT:
665		spin_lock_irqsave(&cs->lock, flags);
666		cs->debug |= L1_DEB_IPAC;
667		reset_elsa(cs);
668		inithscxisac(cs, 1);
669		if ((cs->subtyp == ELSA_QS1000) ||
670		    (cs->subtyp == ELSA_QS3000))
671		{
672			byteout(cs->hw.elsa.timer, 0);
673		}
674		if (cs->hw.elsa.trig)
675			byteout(cs->hw.elsa.trig, 0xff);
676		inithscxisac(cs, 2);
677		spin_unlock_irqrestore(&cs->lock, flags);
678		return (0);
679	case CARD_TEST:
680		if ((cs->subtyp == ELSA_PCMCIA) ||
681		    (cs->subtyp == ELSA_PCMCIA_IPAC) ||
682		    (cs->subtyp == ELSA_QS1000PCI)) {
683			return (0);
684		} else if (cs->subtyp == ELSA_QS3000PCI) {
685			ret = 0;
686		} else {
687			spin_lock_irqsave(&cs->lock, flags);
688			cs->hw.elsa.counter = 0;
689			cs->hw.elsa.ctrl_reg |= ELSA_ENA_TIMER_INT;
690			cs->hw.elsa.status |= ELIRQF_TIMER_AKTIV;
691			byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
692			byteout(cs->hw.elsa.timer, 0);
693			spin_unlock_irqrestore(&cs->lock, flags);
694			msleep(110);
695			spin_lock_irqsave(&cs->lock, flags);
696			cs->hw.elsa.ctrl_reg &= ~ELSA_ENA_TIMER_INT;
697			byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
698			cs->hw.elsa.status &= ~ELIRQF_TIMER_AKTIV;
699			spin_unlock_irqrestore(&cs->lock, flags);
700			printk(KERN_INFO "Elsa: %d timer tics in 110 msek\n",
701			       cs->hw.elsa.counter);
702			if ((cs->hw.elsa.counter > 10) &&
703			    (cs->hw.elsa.counter < 16)) {
704				printk(KERN_INFO "Elsa: timer and irq OK\n");
705				ret = 0;
706			} else {
707				printk(KERN_WARNING
708				       "Elsa: timer tic problem (%d/12) maybe an IRQ(%d) conflict\n",
709				       cs->hw.elsa.counter, cs->irq);
710				ret = 1;
711			}
712		}
713#if ARCOFI_USE
714		if (check_arcofi(cs)) {
715			init_modem(cs);
716		}
717#endif
718		elsa_led_handler(cs);
719		return (ret);
720	case (MDL_REMOVE | REQUEST):
721		cs->hw.elsa.status &= 0;
722		break;
723	case (MDL_ASSIGN | REQUEST):
724		cs->hw.elsa.status |= ELSA_ASSIGN;
725		break;
726	case MDL_INFO_SETUP:
727		if ((long) arg)
728			cs->hw.elsa.status |= 0x0200;
729		else
730			cs->hw.elsa.status |= 0x0100;
731		break;
732	case MDL_INFO_CONN:
733		if ((long) arg)
734			cs->hw.elsa.status |= 0x2000;
735		else
736			cs->hw.elsa.status |= 0x1000;
737		break;
738	case MDL_INFO_REL:
739		if ((long) arg) {
740			cs->hw.elsa.status &= ~0x2000;
741			cs->hw.elsa.status &= ~0x0200;
742		} else {
743			cs->hw.elsa.status &= ~0x1000;
744			cs->hw.elsa.status &= ~0x0100;
745		}
746		break;
747#if ARCOFI_USE
748	case CARD_AUX_IND:
749		if (cs->hw.elsa.MFlag) {
750			int len;
751			u_char *msg;
752
753			if (!arg)
754				return (0);
755			msg = arg;
756			len = *msg;
757			msg++;
758			modem_write_cmd(cs, msg, len);
759		}
760		break;
761#endif
762	}
763	if (cs->typ == ISDN_CTYPE_ELSA) {
764		int pwr = bytein(cs->hw.elsa.ale);
765		if (pwr & 0x08)
766			cs->hw.elsa.status |= ELSA_BAD_PWR;
767		else
768			cs->hw.elsa.status &= ~ELSA_BAD_PWR;
769	}
770	elsa_led_handler(cs);
771	return (ret);
772}
773
774static unsigned char
775probe_elsa_adr(unsigned int adr, int typ)
776{
777	int i, in1, in2, p16_1 = 0, p16_2 = 0, p8_1 = 0, p8_2 = 0, pc_1 = 0,
778		pc_2 = 0, pfp_1 = 0, pfp_2 = 0;
779
780	/* In case of the elsa pcmcia card, this region is in use,
781	   reserved for us by the card manager. So we do not check it
782	   here, it would fail. */
783	if (typ != ISDN_CTYPE_ELSA_PCMCIA) {
784		if (request_region(adr, 8, "elsa card")) {
785			release_region(adr, 8);
786		} else {
787			printk(KERN_WARNING
788			       "Elsa: Probing Port 0x%x: already in use\n", adr);
789			return (0);
790		}
791	}
792	for (i = 0; i < 16; i++) {
793		in1 = inb(adr + ELSA_CONFIG);	/* 'toggelt' bei */
794		in2 = inb(adr + ELSA_CONFIG);	/* jedem Zugriff */
795		p16_1 += 0x04 & in1;
796		p16_2 += 0x04 & in2;
797		p8_1 += 0x02 & in1;
798		p8_2 += 0x02 & in2;
799		pc_1 += 0x01 & in1;
800		pc_2 += 0x01 & in2;
801		pfp_1 += 0x40 & in1;
802		pfp_2 += 0x40 & in2;
803	}
804	printk(KERN_INFO "Elsa: Probing IO 0x%x", adr);
805	if (65 == ++p16_1 * ++p16_2) {
806		printk(" PCC-16/PCF found\n");
807		return (ELSA_PCC16);
808	} else if (1025 == ++pfp_1 * ++pfp_2) {
809		printk(" PCF-Pro found\n");
810		return (ELSA_PCFPRO);
811	} else if (33 == ++p8_1 * ++p8_2) {
812		printk(" PCC8 found\n");
813		return (ELSA_PCC8);
814	} else if (17 == ++pc_1 * ++pc_2) {
815		printk(" PC found\n");
816		return (ELSA_PC);
817	} else {
818		printk(" failed\n");
819		return (0);
820	}
821}
822
823static unsigned int
824probe_elsa(struct IsdnCardState *cs)
825{
826	int i;
827	unsigned int CARD_portlist[] =
828		{0x160, 0x170, 0x260, 0x360, 0};
829
830	for (i = 0; CARD_portlist[i]; i++) {
831		if ((cs->subtyp = probe_elsa_adr(CARD_portlist[i], cs->typ)))
832			break;
833	}
834	return (CARD_portlist[i]);
835}
836
837static int setup_elsa_isa(struct IsdnCard *card)
838{
839	struct IsdnCardState *cs = card->cs;
840	u_char val;
841
842	cs->hw.elsa.base = card->para[0];
843	printk(KERN_INFO "Elsa: Microlink IO probing\n");
844	if (cs->hw.elsa.base) {
845		if (!(cs->subtyp = probe_elsa_adr(cs->hw.elsa.base,
846						  cs->typ))) {
847			printk(KERN_WARNING
848			       "Elsa: no Elsa Microlink at %#lx\n",
849			       cs->hw.elsa.base);
850			return (0);
851		}
852	} else
853		cs->hw.elsa.base = probe_elsa(cs);
854
855	if (!cs->hw.elsa.base) {
856		printk(KERN_WARNING
857		       "No Elsa Microlink found\n");
858		return (0);
859	}
860
861	cs->hw.elsa.cfg = cs->hw.elsa.base + ELSA_CONFIG;
862	cs->hw.elsa.ctrl = cs->hw.elsa.base + ELSA_CONTROL;
863	cs->hw.elsa.ale = cs->hw.elsa.base + ELSA_ALE;
864	cs->hw.elsa.isac = cs->hw.elsa.base + ELSA_ISAC;
865	cs->hw.elsa.itac = cs->hw.elsa.base + ELSA_ITAC;
866	cs->hw.elsa.hscx = cs->hw.elsa.base + ELSA_HSCX;
867	cs->hw.elsa.trig = cs->hw.elsa.base + ELSA_TRIG_IRQ;
868	cs->hw.elsa.timer = cs->hw.elsa.base + ELSA_START_TIMER;
869	val = bytein(cs->hw.elsa.cfg);
870	if (cs->subtyp == ELSA_PC) {
871		const u_char CARD_IrqTab[8] =
872			{7, 3, 5, 9, 0, 0, 0, 0};
873		cs->irq = CARD_IrqTab[(val & ELSA_IRQ_IDX_PC) >> 2];
874	} else if (cs->subtyp == ELSA_PCC8) {
875		const u_char CARD_IrqTab[8] =
876			{7, 3, 5, 9, 0, 0, 0, 0};
877		cs->irq = CARD_IrqTab[(val & ELSA_IRQ_IDX_PCC8) >> 4];
878	} else {
879		const u_char CARD_IrqTab[8] =
880			{15, 10, 15, 3, 11, 5, 11, 9};
881		cs->irq = CARD_IrqTab[(val & ELSA_IRQ_IDX) >> 3];
882	}
883	val = bytein(cs->hw.elsa.ale) & ELSA_HW_RELEASE;
884	if (val < 3)
885		val |= 8;
886	val += 'A' - 3;
887	if (val == 'B' || val == 'C')
888		val ^= 1;
889	if ((cs->subtyp == ELSA_PCFPRO) && (val == 'G'))
890		val = 'C';
891	printk(KERN_INFO
892	       "Elsa: %s found at %#lx Rev.:%c IRQ %d\n",
893	       Elsa_Types[cs->subtyp],
894	       cs->hw.elsa.base,
895	       val, cs->irq);
896	val = bytein(cs->hw.elsa.ale) & ELSA_S0_POWER_BAD;
897	if (val) {
898		printk(KERN_WARNING
899		       "Elsa: Microlink S0 bus power bad\n");
900		cs->hw.elsa.status |= ELSA_BAD_PWR;
901	}
902
903	return (1);
904}
905
906#ifdef __ISAPNP__
907static struct isapnp_device_id elsa_ids[] = {
908	{ ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
909	  ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
910	  (unsigned long) "Elsa QS1000" },
911	{ ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134),
912	  ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134),
913	  (unsigned long) "Elsa QS3000" },
914	{ 0, }
915};
916
917static struct isapnp_device_id *ipid = &elsa_ids[0];
918static struct pnp_card *pnp_c = NULL;
919#endif	/* __ISAPNP__ */
920
921static int setup_elsa_isapnp(struct IsdnCard *card)
922{
923	struct IsdnCardState *cs = card->cs;
924
925#ifdef __ISAPNP__
926	if (!card->para[1] && isapnp_present()) {
927		struct pnp_dev *pnp_d;
928		while (ipid->card_vendor) {
929			if ((pnp_c = pnp_find_card(ipid->card_vendor,
930						   ipid->card_device, pnp_c))) {
931				pnp_d = NULL;
932				if ((pnp_d = pnp_find_dev(pnp_c,
933							  ipid->vendor, ipid->function, pnp_d))) {
934					int err;
935
936					printk(KERN_INFO "HiSax: %s detected\n",
937					       (char *)ipid->driver_data);
938					pnp_disable_dev(pnp_d);
939					err = pnp_activate_dev(pnp_d);
940					if (err < 0) {
941						printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n",
942						       __func__, err);
943						return (0);
944					}
945					card->para[1] = pnp_port_start(pnp_d, 0);
946					card->para[0] = pnp_irq(pnp_d, 0);
947
948					if (!card->para[0] || !card->para[1]) {
949						printk(KERN_ERR "Elsa PnP:some resources are missing %ld/%lx\n",
950						       card->para[0], card->para[1]);
951						pnp_disable_dev(pnp_d);
952						return (0);
953					}
954					if (ipid->function == ISAPNP_FUNCTION(0x133))
955						cs->subtyp = ELSA_QS1000;
956					else
957						cs->subtyp = ELSA_QS3000;
958					break;
959				} else {
960					printk(KERN_ERR "Elsa PnP: PnP error card found, no device\n");
961					return (0);
962				}
963			}
964			ipid++;
965			pnp_c = NULL;
966		}
967		if (!ipid->card_vendor) {
968			printk(KERN_INFO "Elsa PnP: no ISAPnP card found\n");
969			return (0);
970		}
971	}
972#endif	/* __ISAPNP__ */
973
974	if (card->para[1] && card->para[0]) {
975		cs->hw.elsa.base = card->para[1];
976		cs->irq = card->para[0];
977		if (!cs->subtyp)
978			cs->subtyp = ELSA_QS1000;
979	} else {
980		printk(KERN_ERR "Elsa PnP: no parameter\n");
981	}
982	cs->hw.elsa.cfg = cs->hw.elsa.base + ELSA_CONFIG;
983	cs->hw.elsa.ale = cs->hw.elsa.base + ELSA_ALE;
984	cs->hw.elsa.isac = cs->hw.elsa.base + ELSA_ISAC;
985	cs->hw.elsa.hscx = cs->hw.elsa.base + ELSA_HSCX;
986	cs->hw.elsa.trig = cs->hw.elsa.base + ELSA_TRIG_IRQ;
987	cs->hw.elsa.timer = cs->hw.elsa.base + ELSA_START_TIMER;
988	cs->hw.elsa.ctrl = cs->hw.elsa.base + ELSA_CONTROL;
989	printk(KERN_INFO
990	       "Elsa: %s defined at %#lx IRQ %d\n",
991	       Elsa_Types[cs->subtyp],
992	       cs->hw.elsa.base,
993	       cs->irq);
994
995	return (1);
996}
997
998static void setup_elsa_pcmcia(struct IsdnCard *card)
999{
1000	struct IsdnCardState *cs = card->cs;
1001	u_char val;
1002
1003	cs->hw.elsa.base = card->para[1];
1004	cs->irq = card->para[0];
1005	val = readreg(cs->hw.elsa.base + 0, cs->hw.elsa.base + 2, IPAC_ID);
1006	if ((val == 1) || (val == 2)) { /* IPAC version 1.1/1.2 */
1007		cs->subtyp = ELSA_PCMCIA_IPAC;
1008		cs->hw.elsa.ale = cs->hw.elsa.base + 0;
1009		cs->hw.elsa.isac = cs->hw.elsa.base + 2;
1010		cs->hw.elsa.hscx = cs->hw.elsa.base + 2;
1011		test_and_set_bit(HW_IPAC, &cs->HW_Flags);
1012	} else {
1013		cs->subtyp = ELSA_PCMCIA;
1014		cs->hw.elsa.ale = cs->hw.elsa.base + ELSA_ALE_PCM;
1015		cs->hw.elsa.isac = cs->hw.elsa.base + ELSA_ISAC_PCM;
1016		cs->hw.elsa.hscx = cs->hw.elsa.base + ELSA_HSCX;
1017	}
1018	cs->hw.elsa.timer = 0;
1019	cs->hw.elsa.trig = 0;
1020	cs->hw.elsa.ctrl = 0;
1021	cs->irq_flags |= IRQF_SHARED;
1022	printk(KERN_INFO
1023	       "Elsa: %s defined at %#lx IRQ %d\n",
1024	       Elsa_Types[cs->subtyp],
1025	       cs->hw.elsa.base,
1026	       cs->irq);
1027}
1028
1029#ifdef CONFIG_PCI
1030static	struct pci_dev *dev_qs1000 = NULL;
1031static	struct pci_dev *dev_qs3000 = NULL;
1032
1033static int setup_elsa_pci(struct IsdnCard *card)
1034{
1035	struct IsdnCardState *cs = card->cs;
1036
1037	cs->subtyp = 0;
1038	if ((dev_qs1000 = hisax_find_pci_device(PCI_VENDOR_ID_ELSA,
1039						PCI_DEVICE_ID_ELSA_MICROLINK, dev_qs1000))) {
1040		if (pci_enable_device(dev_qs1000))
1041			return (0);
1042		cs->subtyp = ELSA_QS1000PCI;
1043		cs->irq = dev_qs1000->irq;
1044		cs->hw.elsa.cfg = pci_resource_start(dev_qs1000, 1);
1045		cs->hw.elsa.base = pci_resource_start(dev_qs1000, 3);
1046	} else if ((dev_qs3000 = hisax_find_pci_device(PCI_VENDOR_ID_ELSA,
1047						       PCI_DEVICE_ID_ELSA_QS3000, dev_qs3000))) {
1048		if (pci_enable_device(dev_qs3000))
1049			return (0);
1050		cs->subtyp = ELSA_QS3000PCI;
1051		cs->irq = dev_qs3000->irq;
1052		cs->hw.elsa.cfg = pci_resource_start(dev_qs3000, 1);
1053		cs->hw.elsa.base = pci_resource_start(dev_qs3000, 3);
1054	} else {
1055		printk(KERN_WARNING "Elsa: No PCI card found\n");
1056		return (0);
1057	}
1058	if (!cs->irq) {
1059		printk(KERN_WARNING "Elsa: No IRQ for PCI card found\n");
1060		return (0);
1061	}
1062
1063	if (!(cs->hw.elsa.base && cs->hw.elsa.cfg)) {
1064		printk(KERN_WARNING "Elsa: No IO-Adr for PCI card found\n");
1065		return (0);
1066	}
1067	if ((cs->hw.elsa.cfg & 0xff) || (cs->hw.elsa.base & 0xf)) {
1068		printk(KERN_WARNING "Elsa: You may have a wrong PCI bios\n");
1069		printk(KERN_WARNING "Elsa: If your system hangs now, read\n");
1070		printk(KERN_WARNING "Elsa: Documentation/isdn/README.HiSax\n");
1071	}
1072	cs->hw.elsa.ale  = cs->hw.elsa.base;
1073	cs->hw.elsa.isac = cs->hw.elsa.base + 1;
1074	cs->hw.elsa.hscx = cs->hw.elsa.base + 1;
1075	test_and_set_bit(HW_IPAC, &cs->HW_Flags);
1076	cs->hw.elsa.timer = 0;
1077	cs->hw.elsa.trig  = 0;
1078	cs->irq_flags |= IRQF_SHARED;
1079	printk(KERN_INFO
1080	       "Elsa: %s defined at %#lx/0x%x IRQ %d\n",
1081	       Elsa_Types[cs->subtyp],
1082	       cs->hw.elsa.base,
1083	       cs->hw.elsa.cfg,
1084	       cs->irq);
1085
1086	return (1);
1087}
1088
1089#else
1090
1091static int setup_elsa_pci(struct IsdnCard *card)
1092{
1093	return (1);
1094}
1095#endif /* CONFIG_PCI */
1096
1097static int setup_elsa_common(struct IsdnCard *card)
1098{
1099	struct IsdnCardState *cs = card->cs;
1100	u_char val;
1101	int bytecnt;
1102
1103	switch (cs->subtyp) {
1104	case ELSA_PC:
1105	case ELSA_PCC8:
1106	case ELSA_PCC16:
1107	case ELSA_QS1000:
1108	case ELSA_PCMCIA:
1109	case ELSA_PCMCIA_IPAC:
1110		bytecnt = 8;
1111		break;
1112	case ELSA_PCFPRO:
1113	case ELSA_PCF:
1114	case ELSA_QS3000:
1115	case ELSA_QS3000PCI:
1116		bytecnt = 16;
1117		break;
1118	case ELSA_QS1000PCI:
1119		bytecnt = 2;
1120		break;
1121	default:
1122		printk(KERN_WARNING
1123		       "Unknown ELSA subtype %d\n", cs->subtyp);
1124		return (0);
1125	}
1126	/* In case of the elsa pcmcia card, this region is in use,
1127	   reserved for us by the card manager. So we do not check it
1128	   here, it would fail. */
1129	if (cs->typ != ISDN_CTYPE_ELSA_PCMCIA && !request_region(cs->hw.elsa.base, bytecnt, "elsa isdn")) {
1130		printk(KERN_WARNING
1131		       "HiSax: ELSA config port %#lx-%#lx already in use\n",
1132		       cs->hw.elsa.base,
1133		       cs->hw.elsa.base + bytecnt);
1134		return (0);
1135	}
1136	if ((cs->subtyp == ELSA_QS1000PCI) || (cs->subtyp == ELSA_QS3000PCI)) {
1137		if (!request_region(cs->hw.elsa.cfg, 0x80, "elsa isdn pci")) {
1138			printk(KERN_WARNING
1139			       "HiSax: ELSA pci port %x-%x already in use\n",
1140			       cs->hw.elsa.cfg,
1141			       cs->hw.elsa.cfg + 0x80);
1142			release_region(cs->hw.elsa.base, bytecnt);
1143			return (0);
1144		}
1145	}
1146#if ARCOFI_USE
1147	init_arcofi(cs);
1148#endif
1149	setup_isac(cs);
1150	cs->hw.elsa.tl.function = (void *) elsa_led_handler;
1151	cs->hw.elsa.tl.data = (long) cs;
1152	init_timer(&cs->hw.elsa.tl);
1153	/* Teste Timer */
1154	if (cs->hw.elsa.timer) {
1155		byteout(cs->hw.elsa.trig, 0xff);
1156		byteout(cs->hw.elsa.timer, 0);
1157		if (!TimerRun(cs)) {
1158			byteout(cs->hw.elsa.timer, 0);	/* 2. Versuch */
1159			if (!TimerRun(cs)) {
1160				printk(KERN_WARNING
1161				       "Elsa: timer do not start\n");
1162				release_io_elsa(cs);
1163				return (0);
1164			}
1165		}
1166		HZDELAY((HZ / 100) + 1);	/* wait >=10 ms */
1167		if (TimerRun(cs)) {
1168			printk(KERN_WARNING "Elsa: timer do not run down\n");
1169			release_io_elsa(cs);
1170			return (0);
1171		}
1172		printk(KERN_INFO "Elsa: timer OK; resetting card\n");
1173	}
1174	cs->BC_Read_Reg = &ReadHSCX;
1175	cs->BC_Write_Reg = &WriteHSCX;
1176	cs->BC_Send_Data = &hscx_fill_fifo;
1177	cs->cardmsg = &Elsa_card_msg;
1178	if ((cs->subtyp == ELSA_QS1000PCI) || (cs->subtyp == ELSA_QS3000PCI) || (cs->subtyp == ELSA_PCMCIA_IPAC)) {
1179		cs->readisac = &ReadISAC_IPAC;
1180		cs->writeisac = &WriteISAC_IPAC;
1181		cs->readisacfifo = &ReadISACfifo_IPAC;
1182		cs->writeisacfifo = &WriteISACfifo_IPAC;
1183		cs->irq_func = &elsa_interrupt_ipac;
1184		val = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ID);
1185		printk(KERN_INFO "Elsa: IPAC version %x\n", val);
1186	} else {
1187		cs->readisac = &ReadISAC;
1188		cs->writeisac = &WriteISAC;
1189		cs->readisacfifo = &ReadISACfifo;
1190		cs->writeisacfifo = &WriteISACfifo;
1191		cs->irq_func = &elsa_interrupt;
1192		ISACVersion(cs, "Elsa:");
1193		if (HscxVersion(cs, "Elsa:")) {
1194			printk(KERN_WARNING
1195			       "Elsa: wrong HSCX versions check IO address\n");
1196			release_io_elsa(cs);
1197			return (0);
1198		}
1199	}
1200	if (cs->subtyp == ELSA_PC) {
1201		val = readitac(cs, ITAC_SYS);
1202		printk(KERN_INFO "Elsa: ITAC version %s\n", ITACVer[val & 7]);
1203		writeitac(cs, ITAC_ISEN, 0);
1204		writeitac(cs, ITAC_RFIE, 0);
1205		writeitac(cs, ITAC_XFIE, 0);
1206		writeitac(cs, ITAC_SCIE, 0);
1207		writeitac(cs, ITAC_STIE, 0);
1208	}
1209	return (1);
1210}
1211
1212int setup_elsa(struct IsdnCard *card)
1213{
1214	int rc;
1215	struct IsdnCardState *cs = card->cs;
1216	char tmp[64];
1217
1218	strcpy(tmp, Elsa_revision);
1219	printk(KERN_INFO "HiSax: Elsa driver Rev. %s\n", HiSax_getrev(tmp));
1220	cs->hw.elsa.ctrl_reg = 0;
1221	cs->hw.elsa.status = 0;
1222	cs->hw.elsa.MFlag = 0;
1223	cs->subtyp = 0;
1224
1225	if (cs->typ == ISDN_CTYPE_ELSA) {
1226		rc = setup_elsa_isa(card);
1227		if (!rc)
1228			return (0);
1229
1230	} else if (cs->typ == ISDN_CTYPE_ELSA_PNP) {
1231		rc = setup_elsa_isapnp(card);
1232		if (!rc)
1233			return (0);
1234
1235	} else if (cs->typ == ISDN_CTYPE_ELSA_PCMCIA)
1236		setup_elsa_pcmcia(card);
1237
1238	else if (cs->typ == ISDN_CTYPE_ELSA_PCI) {
1239		rc = setup_elsa_pci(card);
1240		if (!rc)
1241			return (0);
1242
1243	} else
1244		return (0);
1245
1246	return setup_elsa_common(card);
1247}
1248