11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* $Id: config.c,v 2.84.2.5 2004/02/11 13:21:33 keil Exp $
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author       Karsten Keil
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright    by Karsten Keil      <keil@isdn4linux.de>
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              by Kai Germaschewski <kai.germaschewski@gmx.de>
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This software may be used and distributed according to the terms
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the GNU General Public License, incorporated herein by reference.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * For changes and modifications please read
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Documentation/isdn/HiSax.cert
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * based on the teles driver from Jan den Ouden
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/stddef.h>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/timer.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "hisax.h"
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel_stat.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/workqueue.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h>
265a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HISAX_STATUS_BUFSIZE 4096
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This structure array contains one entry per card. An entry looks
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * like this:
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * { type, protocol, p0, p1, p2, NULL }
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * type
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    1 Teles 16.0       p0=irq p1=membase p2=iobase
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    2 Teles  8.0       p0=irq p1=membase
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    3 Teles 16.3       p0=irq p1=iobase
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    4 Creatix PNP      p0=irq p1=IO0 (ISAC)  p2=IO1 (HSCX)
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    5 AVM A1 (Fritz)   p0=irq p1=iobase
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    6 ELSA PC          [p0=iobase] or nothing (autodetect)
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    7 ELSA Quickstep   p0=irq p1=iobase
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    8 Teles PCMCIA     p0=irq p1=iobase
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    9 ITK ix1-micro    p0=irq p1=iobase
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   10 ELSA PCMCIA      p0=irq p1=iobase
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   11 Eicon.Diehl Diva p0=irq p1=iobase
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   12 Asuscom ISDNLink p0=irq p1=iobase
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   13 Teleint          p0=irq p1=iobase
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   14 Teles 16.3c      p0=irq p1=iobase
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   15 Sedlbauer speed  p0=irq p1=iobase
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   15 Sedlbauer PC/104	p0=irq p1=iobase
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   15 Sedlbauer speed pci	no parameter
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   16 USR Sportster internal  p0=irq  p1=iobase
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   17 MIC card                p0=irq  p1=iobase
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   18 ELSA Quickstep 1000PCI  no parameter
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   19 Compaq ISDN S0 ISA card p0=irq  p1=IO0 (HSCX)  p2=IO1 (ISAC) p3=IO2
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   20 Travers Technologies NETjet-S PCI card
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   21 TELES PCI               no parameter
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   22 Sedlbauer Speed Star    p0=irq p1=iobase
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   23 reserved
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   24 Dr Neuhaus Niccy PnP/PCI card p0=irq p1=IO0 p2=IO1 (PnP only)
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   25 Teles S0Box             p0=irq p1=iobase (from isapnp setup)
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   26 AVM A1 PCMCIA (Fritz)   p0=irq p1=iobase
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   27 AVM PnP/PCI 		p0=irq p1=iobase (PCI no parameter)
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   28 Sedlbauer Speed Fax+ 	p0=irq p1=iobase (from isapnp setup)
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   29 Siemens I-Surf          p0=irq p1=iobase p2=memory (from isapnp setup)
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   30 ACER P10                p0=irq p1=iobase (from isapnp setup)
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   31 HST Saphir              p0=irq  p1=iobase
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   32 Telekom A4T             none
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   33 Scitel Quadro		p0=subcontroller (4*S0, subctrl 1...4)
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   34	Gazel ISDN cards
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   35 HFC 2BDS0 PCI           none
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   36 Winbond 6692 PCI        none
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   37 HFC 2BDS0 S+/SP         p0=irq p1=iobase
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   38 Travers Technologies NETspider-U PCI card
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   39 HFC 2BDS0-SP PCMCIA     p0=irq p1=iobase
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   40 hotplug interface
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   41 Formula-n enter:now ISDN PCI a/b   none
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * protocol can be either ISDN_PTYPE_EURO or ISDN_PTYPE_1TR6 or ISDN_PTYPE_NI1
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char *CardType[] = {
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"No Card", "Teles 16.0", "Teles 8.0", "Teles 16.3",
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"Creatix/Teles PnP", "AVM A1", "Elsa ML", "Elsa Quickstep",
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"Teles PCMCIA",	"ITK ix1-micro Rev.2", "Elsa PCMCIA",
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"Eicon.Diehl Diva", "ISDNLink",	"TeleInt", "Teles 16.3c",
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"Sedlbauer Speed Card", "USR Sportster", "ith mic Linux",
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"Elsa PCI", "Compaq ISA", "NETjet-S", "Teles PCI",
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"Sedlbauer Speed Star (PCMCIA)", "AMD 7930", "NICCY", "S0Box",
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"AVM A1 (PCMCIA)", "AVM Fritz PnP/PCI", "Sedlbauer Speed Fax +",
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"Siemens I-Surf", "Acer P10", "HST Saphir", "Telekom A4T",
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"Scitel Quadro", "Gazel", "HFC 2BDS0 PCI", "Winbond 6692",
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"HFC 2BDS0 SX", "NETspider-U", "HFC-2BDS0-SP PCMCIA",
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	"Hotplug", "Formula-n enter:now PCI a/b",
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_ELSA
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_ELSA
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0,0,0}
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_AVM_A1
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_A1
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {10,0x340,0,0}
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_AVM_A1_PCMCIA
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_A1_PCMCIA
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {11,0x170,0,0}
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_FRITZPCI
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_FRITZPCI
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0,0,0}
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_16_3
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_16_3
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {15,0x180,0,0}
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_S0BOX
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_S0BOX
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {7,0x378,0,0}
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_16_0
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_16_0
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {15,0xd0000,0xd80,0}
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_TELESPCI
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_TELESPCI
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0,0,0}
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_IX1MICROR2
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_IX1MICROR2
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {5,0x390,0,0}
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_DIEHLDIVA
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_DIEHLDIVA
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0x0,0,0}
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_ASUSCOM
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_ASUSCOM
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {5,0x200,0,0}
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_TELEINT
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_TELEINT
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {5,0x300,0,0}
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_SEDLBAUER
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_SEDLBAUER
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {11,0x270,0,0}
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_SPORTSTER
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_SPORTSTER
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {7,0x268,0,0}
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_MIC
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_MIC
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {12,0x3e0,0,0}
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_NETJET
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_NETJET_S
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0,0,0}
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_HFCS
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_TELES3C
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {5,0x500,0,0}
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_HFC_PCI
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_HFC_PCI
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0,0,0}
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_HFC_SX
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_HFC_SX
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {5,0x2E0,0,0}
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_NICCY
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_NICCY
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0x0,0,0}
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_ISURF
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_ISURF
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {5,0x100,0xc8000,0}
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_HSTSAPHIR
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_HSTSAPHIR
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {5,0x250,0,0}
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_BKM_A4T
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_BKM_A4T
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0x0,0,0}
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_SCT_QUADRO
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_SCT_QUADRO
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {1,0x0,0,0}
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_GAZEL
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_GAZEL
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {15,0x180,0,0}
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_W6692
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_W6692
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0,0,0}
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_NETJET_U
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CARD
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_CFG
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD ISDN_CTYPE_NETJET_U
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0,0,0}
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_1TR6
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_PROTO ISDN_PTYPE_1TR6
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_PROTO_NAME "1TR6"
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_NI1
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_PROTO
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_PROTO ISDN_PTYPE_NI1
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_PROTO_NAME
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_PROTO_NAME "NI1"
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_EURO
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_PROTO
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_PROTO ISDN_PTYPE_EURO
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEFAULT_PROTO_NAME
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_PROTO_NAME "EURO"
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef DEFAULT_PROTO
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_PROTO ISDN_PTYPE_UNKNOWN
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_PROTO_NAME "UNKNOWN"
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef DEFAULT_CARD
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CARD 0
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_CFG {0,0,0,0}
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FIRST_CARD { \
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DEFAULT_CARD, \
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DEFAULT_PROTO, \
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DEFAULT_CFG, \
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	NULL, \
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct IsdnCard cards[HISAX_MAX_CARDS] = {
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FIRST_CARD,
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HISAX_IDSIZE (HISAX_MAX_CARDS*8)
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char HiSaxID[HISAX_IDSIZE] = { 0, };
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
326672c3fd9069e5a138f9d4afc9aeb5aa34aacce32Adrian Bunkstatic char *HiSax_id = HiSaxID;
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef MODULE
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Variables for insmod */
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int type[HISAX_MAX_CARDS] = { 0, };
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int protocol[HISAX_MAX_CARDS] = { 0, };
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int io[HISAX_MAX_CARDS] = { 0, };
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef IO0_IO1
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_16_3
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IO0_IO1
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_NICCY
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef IO0_IO1
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IO0_IO1
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef IO0_IO1
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int io0[HISAX_MAX_CARDS] __devinitdata = { 0, };
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int io1[HISAX_MAX_CARDS] __devinitdata = { 0, };
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int irq[HISAX_MAX_CARDS] __devinitdata = { 0, };
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int mem[HISAX_MAX_CARDS] __devinitdata = { 0, };
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char *id = HiSaxID;
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("ISDN4Linux: Driver for passive ISDN cards");
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Karsten Keil");
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL");
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_array(type, int, NULL, 0);
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_array(protocol, int, NULL, 0);
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_array(io, int, NULL, 0);
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_array(irq, int, NULL, 0);
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_array(mem, int, NULL, 0);
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(id, charp, 0);
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef IO0_IO1
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_array(io0, int, NULL, 0);
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_array(io1, int, NULL, 0);
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* MODULE */
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint nrcards;
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldschar *HiSax_getrev(const char *revision)
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *rev;
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *p;
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((p = strchr(revision, ':'))) {
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		rev = p + 2;
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		p = strchr(rev, '$');
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*--p = 0;
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		rev = "???";
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return rev;
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
379672c3fd9069e5a138f9d4afc9aeb5aa34aacce32Adrian Bunkstatic void __init HiSaxVersion(void)
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char tmp[64];
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "HiSax: Linux Driver for passive ISDN cards\n");
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef MODULE
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "HiSax: Version 3.5 (module)\n");
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "HiSax: Version 3.5 (kernel)\n");
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(tmp, l1_revision);
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "HiSax: Layer1 Revision %s\n", HiSax_getrev(tmp));
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(tmp, l2_revision);
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "HiSax: Layer2 Revision %s\n", HiSax_getrev(tmp));
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(tmp, tei_revision);
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "HiSax: TeiMgr Revision %s\n", HiSax_getrev(tmp));
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(tmp, l3_revision);
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "HiSax: Layer3 Revision %s\n", HiSax_getrev(tmp));
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(tmp, lli_revision);
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "HiSax: LinkLayer Revision %s\n",
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       HiSax_getrev(tmp));
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef MODULE
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_ARG	(HISAX_MAX_CARDS*5)
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init HiSax_setup(char *line)
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i, j, argc;
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int ints[MAX_ARG + 1];
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *str;
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	str = get_options(line, MAX_ARG, ints);
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	argc = ints[0];
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax_setup: argc(%d) str(%s)\n", argc, str);
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	i = 0;
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j = 1;
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (argc && (i < HISAX_MAX_CARDS)) {
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cards[i].protocol = DEFAULT_PROTO;
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (argc) {
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[i].typ = ints[j];
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j++;
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			argc--;
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (argc) {
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[i].protocol = ints[j];
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j++;
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			argc--;
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (argc) {
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[i].para[0] = ints[j];
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j++;
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			argc--;
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (argc) {
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[i].para[1] = ints[j];
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j++;
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			argc--;
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (argc) {
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[i].para[2] = ints[j];
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j++;
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			argc--;
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		i++;
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  	if (str && *str) {
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (strlen(str) < HISAX_IDSIZE)
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			strcpy(HiSaxID, str);
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_WARNING "HiSax: ID too long!");
4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(HiSaxID, "HiSax");
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	HiSax_id = HiSaxID;
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds__setup("hisax=", HiSax_setup);
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* MODULES */
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_TELES0
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_teles0(struct IsdnCard *card);
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_TELES3
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_teles3(struct IsdnCard *card);
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_S0BOX
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_s0box(struct IsdnCard *card);
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_TELESPCI
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_telespci(struct IsdnCard *card);
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_AVM_A1
4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_avm_a1(struct IsdnCard *card);
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_AVM_A1_PCMCIA
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_avm_a1_pcmcia(struct IsdnCard *card);
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_FRITZPCI
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_avm_pcipnp(struct IsdnCard *card);
4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_ELSA
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_elsa(struct IsdnCard *card);
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_IX1MICROR2
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_ix1micro(struct IsdnCard *card);
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_DIEHLDIVA
4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_diva(struct IsdnCard *card);
4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_ASUSCOM
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_asuscom(struct IsdnCard *card);
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_TELEINT
5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_TeleInt(struct IsdnCard *card);
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_SEDLBAUER
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_sedlbauer(struct IsdnCard *card);
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_SPORTSTER
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_sportster(struct IsdnCard *card);
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_MIC
5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_mic(struct IsdnCard *card);
5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_NETJET_S
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_netjet_s(struct IsdnCard *card);
5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_HFCS
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_hfcs(struct IsdnCard *card);
5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_HFC_PCI
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_hfcpci(struct IsdnCard *card);
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_HFC_SX
5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_hfcsx(struct IsdnCard *card);
5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_NICCY
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_niccy(struct IsdnCard *card);
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_ISURF
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_isurf(struct IsdnCard *card);
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_HSTSAPHIR
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_saphir(struct IsdnCard *card);
5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_BKM_A4T
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_bkm_a4t(struct IsdnCard *card);
5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_SCT_QUADRO
5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_sct_quadro(struct IsdnCard *card);
5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_GAZEL
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_gazel(struct IsdnCard *card);
5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_W6692
5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_w6692(struct IsdnCard *card);
5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_NETJET_U
5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_netjet_u(struct IsdnCard *card);
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_FN_ENTERNOW_PCI
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int setup_enternow_pci(struct IsdnCard *card);
5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Find card with given driverId
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline struct IsdnCardState *hisax_findcard(int driverid)
5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < nrcards; i++)
5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cards[i].cs)
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (cards[i].cs->myid == driverid)
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return cards[i].cs;
5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return NULL;
5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Find card with given card number
5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
588672c3fd9069e5a138f9d4afc9aeb5aa34aacce32Adrian Bunk#if 0
5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct IsdnCardState *hisax_get_card(int cardnr)
5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((cardnr <= nrcards) && (cardnr > 0))
5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cards[cardnr - 1].cs)
5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return cards[cardnr - 1].cs;
5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return NULL;
5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
596672c3fd9069e5a138f9d4afc9aeb5aa34aacce32Adrian Bunk#endif  /*  0  */
5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
598672c3fd9069e5a138f9d4afc9aeb5aa34aacce32Adrian Bunkstatic int HiSax_readstatus(u_char __user *buf, int len, int id, int channel)
5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int count, cnt;
6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_char __user *p = buf;
6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct IsdnCardState *cs = hisax_findcard(id);
6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (cs) {
6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (len > HISAX_STATUS_BUFSIZE) {
6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_WARNING
6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       "HiSax: status overflow readstat %d/%d\n",
6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       len, HISAX_STATUS_BUFSIZE);
6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		count = cs->status_end - cs->status_read + 1;
6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (count >= len)
6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			count = len;
6137786ce192fc4917fb9b789dd823476ff8fd6cf66Jeff Garzik		if (copy_to_user(p, cs->status_read, count))
6147786ce192fc4917fb9b789dd823476ff8fd6cf66Jeff Garzik			return -EFAULT;
6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->status_read += count;
6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cs->status_read > cs->status_end)
6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cs->status_read = cs->status_buf;
6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		p += count;
6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		count = len - count;
6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while (count) {
6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (count > HISAX_STATUS_BUFSIZE)
6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cnt = HISAX_STATUS_BUFSIZE;
6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else
6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cnt = count;
6257786ce192fc4917fb9b789dd823476ff8fd6cf66Jeff Garzik			if (copy_to_user(p, cs->status_read, cnt))
6267786ce192fc4917fb9b789dd823476ff8fd6cf66Jeff Garzik				return -EFAULT;
6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			p += cnt;
6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cs->status_read += cnt % HISAX_STATUS_BUFSIZE;
6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			count -= cnt;
6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return len;
6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_ERR
6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       "HiSax: if_readstatus called with invalid driverId!\n");
6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENODEV;
6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint jiftime(char *s, long mark)
6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	s += 8;
6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*s-- = '\0';
6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*s-- = mark % 10 + '0';
6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mark /= 10;
6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*s-- = mark % 10 + '0';
6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mark /= 10;
6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*s-- = '.';
6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*s-- = mark % 10 + '0';
6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mark /= 10;
6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*s-- = mark % 6 + '0';
6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mark /= 6;
6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*s-- = ':';
6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*s-- = mark % 10 + '0';
6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mark /= 10;
6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*s-- = mark % 10 + '0';
6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 8;
6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic u_char tmpbuf[HISAX_STATUS_BUFSIZE];
6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid VHiSax_putstatus(struct IsdnCardState *cs, char *head, char *fmt,
6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		      va_list args)
6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* if head == NULL the fmt contains the full info */
6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_long		flags;
6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int		count, i;
6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_char		*p;
6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	isdn_ctrl	ic;
6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int		len;
6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!cs) {
6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_WARNING "HiSax: No CardStatus for message");
6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spin_lock_irqsave(&cs->statlock, flags);
6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = tmpbuf;
6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (head) {
6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		p += jiftime(p, jiffies);
6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		p += sprintf(p, " %s", head);
6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		p += vsprintf(p, fmt, args);
6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*p++ = '\n';
6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*p = 0;
6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		len = p - tmpbuf;
6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		p = tmpbuf;
6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		p = fmt;
6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		len = strlen(fmt);
6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (len > HISAX_STATUS_BUFSIZE) {
6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		spin_unlock_irqrestore(&cs->statlock, flags);
6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_WARNING "HiSax: status overflow %d/%d\n",
6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       len, HISAX_STATUS_BUFSIZE);
6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	count = len;
6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	i = cs->status_end - cs->status_write + 1;
6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (i >= len)
7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		i = len;
7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len -= i;
7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	memcpy(cs->status_write, p, i);
7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->status_write += i;
7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (cs->status_write > cs->status_end)
7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->status_write = cs->status_buf;
7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p += i;
7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (len) {
7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		memcpy(cs->status_write, p, len);
7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->status_write += len;
7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef KERNELSTACK_DEBUG
7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	i = (ulong) & len - current->kernel_stack_page;
7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sprintf(tmpbuf, "kstack %s %lx use %ld\n", current->comm,
7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		current->kernel_stack_page, i);
7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len = strlen(tmpbuf);
7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (p = tmpbuf, i = len; i > 0; i--, p++) {
7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*cs->status_write++ = *p;
7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cs->status_write > cs->status_end)
7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cs->status_write = cs->status_buf;
7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		count++;
7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spin_unlock_irqrestore(&cs->statlock, flags);
7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (count) {
7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ic.command = ISDN_STAT_STAVAIL;
7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ic.driver = cs->myid;
7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ic.arg = count;
7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->iif.statcallb(&ic);
7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid HiSax_putstatus(struct IsdnCardState *cs, char *head, char *fmt, ...)
7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	va_list args;
7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	va_start(args, fmt);
7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	VHiSax_putstatus(cs, head, fmt, args);
7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	va_end(args);
7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ll_run(struct IsdnCardState *cs, int addfeatures)
7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	isdn_ctrl ic;
7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ic.driver = cs->myid;
7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ic.command = ISDN_STAT_RUN;
7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->iif.features |= addfeatures;
7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->iif.statcallb(&ic);
7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
752672c3fd9069e5a138f9d4afc9aeb5aa34aacce32Adrian Bunkstatic void ll_stop(struct IsdnCardState *cs)
7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	isdn_ctrl ic;
7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ic.command = ISDN_STAT_STOP;
7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ic.driver = cs->myid;
7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->iif.statcallb(&ic);
7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	//      CallcFreeChan(cs);
7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ll_unload(struct IsdnCardState *cs)
7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	isdn_ctrl ic;
7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ic.command = ISDN_STAT_UNLOAD;
7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ic.driver = cs->myid;
7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->iif.statcallb(&ic);
7693c7208f253571ee5f157b98f0e315b5172afe092Jesper Juhl	kfree(cs->status_buf);
7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->status_read = NULL;
7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->status_write = NULL;
7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->status_end = NULL;
7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kfree(cs->dlog);
7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->dlog = NULL;
7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void closecard(int cardnr)
7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct IsdnCardState *csta = cards[cardnr].cs;
7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (csta->bcs->BC_Close != NULL) {
7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		csta->bcs->BC_Close(csta->bcs + 1);
7831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		csta->bcs->BC_Close(csta->bcs);
7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	skb_queue_purge(&csta->rq);
7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	skb_queue_purge(&csta->sq);
7883c7208f253571ee5f157b98f0e315b5172afe092Jesper Juhl	kfree(csta->rcvbuf);
7893c7208f253571ee5f157b98f0e315b5172afe092Jesper Juhl	csta->rcvbuf = NULL;
7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (csta->tx_skb) {
7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev_kfree_skb(csta->tx_skb);
7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		csta->tx_skb = NULL;
7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (csta->DC_Close != NULL) {
7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		csta->DC_Close(csta);
7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (csta->cardmsg)
7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		csta->cardmsg(csta, CARD_RELEASE, NULL);
7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (csta->dbusytimer.function != NULL) // FIXME?
8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		del_timer(&csta->dbusytimer);
8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ll_unload(csta);
8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
80440f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixnerstatic irqreturn_t card_irq(int intno, void *dev_id)
80540f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner{
80640f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner	struct IsdnCardState *cs = dev_id;
80740f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner	irqreturn_t ret = cs->irq_func(intno, cs);
80840f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner
80940f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner	if (ret == IRQ_HANDLED)
81040f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner		cs->irq_cnt++;
81140f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner	return ret;
81240f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner}
81340f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner
8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int init_card(struct IsdnCardState *cs)
8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int 	irq_cnt, cnt = 3, ret;
8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!cs->irq) {
8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = cs->cardmsg(cs, CARD_INIT, NULL);
8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return(ret);
8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
82240f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner	irq_cnt = cs->irq_cnt = 0;
8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "%s: IRQ %d count %d\n", CardType[cs->typ],
8241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cs->irq, irq_cnt);
82540f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner	if (request_irq(cs->irq, card_irq, cs->irq_flags, "HiSax", cs)) {
8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_WARNING "HiSax: couldn't get interrupt %d\n",
8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       cs->irq);
8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (cnt) {
8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->cardmsg(cs, CARD_INIT, NULL);
8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Timeout 10ms */
8331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		msleep(10);
8341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "%s: IRQ %d count %d\n",
83540f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner		       CardType[cs->typ], cs->irq, cs->irq_cnt);
83640f08a724fcc21285cf3a75aec957aef908605c6Thomas Gleixner		if (cs->irq_cnt == irq_cnt) {
8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_WARNING
8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       "%s: IRQ(%d) getting no interrupts during init %d\n",
8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       CardType[cs->typ], cs->irq, 4 - cnt);
8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (cnt == 1) {
8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				free_irq(cs->irq, cs);
8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 2;
8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cs->cardmsg(cs, CARD_RESET, NULL);
8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cnt--;
8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cs->cardmsg(cs, CARD_TEST, NULL);
8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 3;
8531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8552fddb6e277ebdb9690c3c7aa0eead5c208701b71Sam Ravnborgstatic int __devinit hisax_cs_setup_card(struct IsdnCard *card)
8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
85782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	int ret;
8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (card->typ) {
8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_TELES0
8611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_16_0:
8621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_8_0:
8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_teles0(card);
8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_TELES3
8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_16_3:
8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_PNP:
8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_TELESPCMCIA:
8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_COMPAQ_ISA:
8711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_teles3(card);
8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
8731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_S0BOX
8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_S0BOX:
8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_s0box(card);
8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_TELESPCI
8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_TELESPCI:
8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_telespci(card);
8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_AVM_A1
8851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_A1:
8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_avm_a1(card);
8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
8881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_AVM_A1_PCMCIA
8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_A1_PCMCIA:
8911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_avm_a1_pcmcia(card);
8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_FRITZPCI
8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_FRITZPCI:
8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_avm_pcipnp(card);
8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_ELSA
9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_ELSA:
9011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_ELSA_PNP:
9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_ELSA_PCMCIA:
9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_ELSA_PCI:
9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_elsa(card);
9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_IX1MICROR2
9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_IX1MICROR2:
9091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_ix1micro(card);
9101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_DIEHLDIVA
9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_DIEHLDIVA:
9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_diva(card);
9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_ASUSCOM
9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_ASUSCOM:
9191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_asuscom(card);
9201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_TELEINT
9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_TELEINT:
9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_TeleInt(card);
9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_SEDLBAUER
9281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_SEDLBAUER:
9291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_SEDLBAUER_PCMCIA:
9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_SEDLBAUER_FAX:
9311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_sedlbauer(card);
9321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_SPORTSTER
9351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_SPORTSTER:
9361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_sportster(card);
9371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_MIC
9401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_MIC:
9411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_mic(card);
9421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_NETJET_S
9451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_NETJET_S:
9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_netjet_s(card);
9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_HFCS
9501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_TELES3C:
9511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_ACERP10:
9521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_hfcs(card);
9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_HFC_PCI
9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_HFC_PCI:
9571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_hfcpci(card);
9581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_HFC_SX
9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_HFC_SX:
9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_hfcsx(card);
9631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_NICCY
9661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_NICCY:
9671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_niccy(card);
9681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_ISURF
9711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_ISURF:
9721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_isurf(card);
9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_HSTSAPHIR
9761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_HSTSAPHIR:
9771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_saphir(card);
9781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if	CARD_BKM_A4T
9811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_BKM_A4T:
9821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_bkm_a4t(card);
9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if	CARD_SCT_QUADRO
9861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_SCT_QUADRO:
9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_sct_quadro(card);
9881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_GAZEL
9911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_GAZEL:
9921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_gazel(card);
9931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_W6692
9961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_W6692:
9971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_w6692(card);
9981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
10001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_NETJET_U
10011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_NETJET_U:
10021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_netjet_u(card);
10031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
10041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
10051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if CARD_FN_ENTERNOW_PCI
10061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_ENTERNOW:
10071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = setup_enternow_pci(card);
10081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
10091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
10101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ISDN_CTYPE_DYNAMIC:
10111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = 2;
10121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
10131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
10141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_WARNING
10151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       "HiSax: Support for %s Card not selected\n",
10161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       CardType[card->typ]);
101782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		ret = 0;
101882bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		break;
101982bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	}
102082bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik
102182bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	return ret;
102282bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik}
102382bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik
1024881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzikstatic int hisax_cs_new(int cardnr, char *id, struct IsdnCard *card,
1025881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik			struct IsdnCardState **cs_out, int *busy_flag,
1026881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik			struct module *lockowner)
102782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik{
102882bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	struct IsdnCardState *cs;
102982bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik
1030881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	*cs_out = NULL;
1031881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik
103282bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs = kzalloc(sizeof(struct IsdnCardState), GFP_ATOMIC);
103382bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	if (!cs) {
103482bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		printk(KERN_WARNING
103582bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		       "HiSax: No memory for IsdnCardState(card %d)\n",
103682bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		       cardnr + 1);
103782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		goto out;
103882bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	}
103982bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	card->cs = cs;
104082bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	spin_lock_init(&cs->statlock);
104182bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	spin_lock_init(&cs->lock);
104282bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->chanlimit = 2;	/* maximum B-channel number */
104382bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->logecho = 0;	/* No echo logging */
104482bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->cardnr = cardnr;
104582bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->debug = L1_DEB_WARN;
104682bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->HW_Flags = 0;
104782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->busy_flag = busy_flag;
104882bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->irq_flags = I4L_IRQ_FLAG;
104982bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#if TEI_PER_CARD
105082bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	if (card->protocol == ISDN_PTYPE_NI1)
105182bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		test_and_set_bit(FLG_TWO_DCHAN, &cs->HW_Flags);
105282bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#else
105382bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	test_and_set_bit(FLG_TWO_DCHAN, &cs->HW_Flags);
105482bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#endif
105582bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->protocol = card->protocol;
105682bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik
105782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	if (card->typ <= 0 || card->typ > ISDN_CTYPE_COUNT) {
105882bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		printk(KERN_WARNING
105982bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		       "HiSax: Card Type %d out of range\n", card->typ);
106082bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		goto outf_cs;
106182bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	}
106282bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	if (!(cs->dlog = kmalloc(MAX_DLOG_SPACE, GFP_ATOMIC))) {
106382bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		printk(KERN_WARNING
106482bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		       "HiSax: No memory for dlog(card %d)\n", cardnr + 1);
10651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto outf_cs;
10661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
106782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	if (!(cs->status_buf = kmalloc(HISAX_STATUS_BUFSIZE, GFP_ATOMIC))) {
106882bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		printk(KERN_WARNING
106982bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		       "HiSax: No memory for status_buf(card %d)\n",
107082bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		       cardnr + 1);
107182bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		goto outf_dlog;
107282bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	}
107382bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->stlist = NULL;
107482bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->status_read = cs->status_buf;
107582bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->status_write = cs->status_buf;
107682bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->status_end = cs->status_buf + HISAX_STATUS_BUFSIZE - 1;
107782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->typ = card->typ;
107882bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#ifdef MODULE
107982bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->iif.owner = lockowner;
108082bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#endif
108182bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	strcpy(cs->iif.id, id);
108282bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->iif.channels = 2;
108382bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->iif.maxbufsize = MAX_DATA_SIZE;
108482bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->iif.hl_hdrlen = MAX_HEADER_LEN;
108582bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->iif.features =
108682bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		ISDN_FEATURE_L2_X75I |
108782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		ISDN_FEATURE_L2_HDLC |
108882bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		ISDN_FEATURE_L2_HDLC_56K |
108982bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		ISDN_FEATURE_L2_TRANS |
109082bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		ISDN_FEATURE_L3_TRANS |
109182bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#ifdef	CONFIG_HISAX_1TR6
109282bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		ISDN_FEATURE_P_1TR6 |
109382bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#endif
109482bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#ifdef	CONFIG_HISAX_EURO
109582bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		ISDN_FEATURE_P_EURO |
109682bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#endif
109782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#ifdef	CONFIG_HISAX_NI1
109882bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		ISDN_FEATURE_P_NI1 |
109982bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik#endif
110082bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik		0;
110182bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik
110282bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->iif.command = HiSax_command;
110382bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->iif.writecmd = NULL;
110482bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->iif.writebuf_skb = HiSax_writebuf_skb;
110582bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->iif.readstat = HiSax_readstatus;
110682bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	register_isdn(&cs->iif);
110782bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik	cs->myid = cs->iif.channels;
110882bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik
1109881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	*cs_out = cs;
1110881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	return 1;	/* success */
1111881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik
1112881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzikoutf_dlog:
1113881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	kfree(cs->dlog);
1114881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzikoutf_cs:
1115881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	kfree(cs);
1116881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	card->cs = NULL;
1117881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzikout:
1118881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	return 0;	/* error */
1119881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik}
1120881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik
1121881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzikstatic int hisax_cs_setup(int cardnr, struct IsdnCard *card,
1122881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik			  struct IsdnCardState *cs)
1123881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik{
1124881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	int ret;
112582bcda95969dc9852f5cc64001c078ec7d3d95efJeff Garzik
11261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(cs->rcvbuf = kmalloc(MAX_DFRAME_LEN_L1, GFP_ATOMIC))) {
11271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_WARNING "HiSax: No memory for isac rcvbuf\n");
11281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ll_unload(cs);
11291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto outf_cs;
11301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
11311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->rcvidx = 0;
11321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->tx_skb = NULL;
11331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->tx_cnt = 0;
11341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->event = 0;
11351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	skb_queue_head_init(&cs->rq);
11371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	skb_queue_head_init(&cs->sq);
11381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_bcstate(cs, 0);
11401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_bcstate(cs, 1);
11411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* init_card only handles interrupts which are not */
11431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* used here for the loadable driver */
11441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (card->typ) {
11451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_DYNAMIC:
11461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ret = 0;
11471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
11481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
11491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ret = init_card(cs);
11501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
11511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
11521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ret) {
11531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		closecard(cardnr);
11541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto outf_cs;
11551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
11561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_tei(cs, cs->protocol);
11571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ret = CallcNewChan(cs);
11581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ret) {
11591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		closecard(cardnr);
11601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto outf_cs;
11611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
11621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* ISAR needs firmware download first */
11631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!test_bit(HW_ISAR, &cs->HW_Flags))
11641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ll_run(cs, 0);
11651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1166881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	return 1;
1167881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik
1168881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzikoutf_cs:
1169881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	kfree(cs);
1170881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	card->cs = NULL;
11719ee0be05dc69b61e5a869bffebd638b31898dae2Florin Malita	return 0;
1172881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik}
1173881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik
11742fddb6e277ebdb9690c3c7aa0eead5c208701b71Sam Ravnborg/* Used from an exported function but calls __devinit functions.
11752fddb6e277ebdb9690c3c7aa0eead5c208701b71Sam Ravnborg * Tell modpost not to warn (__ref)
11762fddb6e277ebdb9690c3c7aa0eead5c208701b71Sam Ravnborg */
1177d38c8475b4f3a684ac673dcedc88ffdb17b74882Jeff Garzikstatic int __ref checkcard(int cardnr, char *id, int *busy_flag,
1178d38c8475b4f3a684ac673dcedc88ffdb17b74882Jeff Garzik			   struct module *lockowner,
1179d38c8475b4f3a684ac673dcedc88ffdb17b74882Jeff Garzik			   hisax_setup_func_t card_setup)
1180881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik{
1181881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	int ret;
1182881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	struct IsdnCard *card = cards + cardnr;
1183881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	struct IsdnCardState *cs;
1184881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik
1185881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	ret = hisax_cs_new(cardnr, id, card, &cs, busy_flag, lockowner);
1186881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	if (!ret)
1187881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik		return 0;
1188881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik
1189881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	printk(KERN_INFO
1190881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	       "HiSax: Card %d Protocol %s Id=%s (%d)\n", cardnr + 1,
1191881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	       (card->protocol == ISDN_PTYPE_1TR6) ? "1TR6" :
1192881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	       (card->protocol == ISDN_PTYPE_EURO) ? "EDSS1" :
1193881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	       (card->protocol == ISDN_PTYPE_LEASED) ? "LEASED" :
1194881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	       (card->protocol == ISDN_PTYPE_NI1) ? "NI1" :
1195881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	       "NONE", cs->iif.id, cs->myid);
1196881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik
1197d38c8475b4f3a684ac673dcedc88ffdb17b74882Jeff Garzik	ret = card_setup(card);
1198881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	if (!ret) {
1199881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik		ll_unload(cs);
1200881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik		goto outf_cs;
1201881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	}
1202881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik
1203881ebdc9f4fb6466a6198ef7943b8637e0a48232Jeff Garzik	ret = hisax_cs_setup(cardnr, card, cs);
12041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	goto out;
12051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds outf_cs:
12071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kfree(cs);
12081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	card->cs = NULL;
12091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out:
12101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ret;
12111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
12121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1213672c3fd9069e5a138f9d4afc9aeb5aa34aacce32Adrian Bunkstatic void HiSax_shiftcards(int idx)
12141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
12151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
12161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = idx; i < (HISAX_MAX_CARDS - 1); i++)
12181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		memcpy(&cards[i], &cards[i + 1], sizeof(cards[i]));
12191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
12201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
122156d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Virostatic int __init HiSax_inithardware(int *busy_flag)
12221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
12231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int foundcards = 0;
12241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i = 0;
12251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int t = ',';
12261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int flg = 0;
12271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *id;
12281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *next_id = HiSax_id;
12291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char ids[20];
12301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (strchr(HiSax_id, ','))
12321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		t = ',';
12331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else if (strchr(HiSax_id, '%'))
12341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		t = '%';
12351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (i < nrcards) {
12371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cards[i].typ < 1)
12381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
12391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		id = next_id;
12401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if ((next_id = strchr(id, t))) {
12411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			*next_id++ = 0;
12421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			strcpy(ids, id);
12431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			flg = i + 1;
12441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
12451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			next_id = id;
12461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (flg >= i)
12471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				strcpy(ids, id);
12481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else
12491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				sprintf(ids, "%s%d", id, i);
12501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1251d38c8475b4f3a684ac673dcedc88ffdb17b74882Jeff Garzik		if (checkcard(i, ids, busy_flag, THIS_MODULE,
1252d38c8475b4f3a684ac673dcedc88ffdb17b74882Jeff Garzik			      hisax_cs_setup_card)) {
12531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			foundcards++;
12541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			i++;
12551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
12561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* make sure we don't oops the module */
12571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (cards[i].typ > 0 && cards[i].typ <= ISDN_CTYPE_COUNT) {
12581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_WARNING
12591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       		"HiSax: Card %s not installed !\n",
12601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       		CardType[cards[i].typ]);
12611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
12621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			HiSax_shiftcards(i);
12631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			nrcards--;
12641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
12651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
12661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return foundcards;
12671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
12681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid HiSax_closecard(int cardnr)
12701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
12711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i, last = nrcards - 1;
12721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (cardnr > last || cardnr < 0)
12741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
12751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (cards[cardnr].cs) {
12761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ll_stop(cards[cardnr].cs);
12771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		release_tei(cards[cardnr].cs);
12781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		CallcFreeChan(cards[cardnr].cs);
12791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		closecard(cardnr);
12811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cards[cardnr].cs->irq)
12821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			free_irq(cards[cardnr].cs->irq, cards[cardnr].cs);
12831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		kfree((void *) cards[cardnr].cs);
12841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cards[cardnr].cs = NULL;
12851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
12861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	i = cardnr;
12871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (i <= last) {
12881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cards[i] = cards[i + 1];
12891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		i++;
12901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
12911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	nrcards--;
12921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
12931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid HiSax_reportcard(int cardnr, int sel)
12951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
12961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct IsdnCardState *cs = cards[cardnr].cs;
12971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax: reportcard No %d\n", cardnr + 1);
12991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax: Type %s\n", CardType[cs->typ]);
13001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax: debuglevel %x\n", cs->debug);
13011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax: HiSax_reportcard address 0x%lX\n",
13021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       (ulong) & HiSax_reportcard);
13031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax: cs 0x%lX\n", (ulong) cs);
13041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax: HW_Flags %lx bc0 flg %lx bc1 flg %lx\n",
13051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cs->HW_Flags, cs->bcs[0].Flag, cs->bcs[1].Flag);
13061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax: bcs 0 mode %d ch%d\n",
13071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cs->bcs[0].mode, cs->bcs[0].channel);
13081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax: bcs 1 mode %d ch%d\n",
13091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cs->bcs[1].mode, cs->bcs[1].channel);
13101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef ERROR_STATISTIC
13111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax: dc errors(rx,crc,tx) %d,%d,%d\n",
13121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cs->err_rx, cs->err_crc, cs->err_tx);
13131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG
13141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       "HiSax: bc0 errors(inv,rdo,crc,tx) %d,%d,%d,%d\n",
13151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cs->bcs[0].err_inv, cs->bcs[0].err_rdo, cs->bcs[0].err_crc,
13161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cs->bcs[0].err_tx);
13171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG
13181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       "HiSax: bc1 errors(inv,rdo,crc,tx) %d,%d,%d,%d\n",
13191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cs->bcs[1].err_inv, cs->bcs[1].err_rdo, cs->bcs[1].err_crc,
13201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cs->bcs[1].err_tx);
13211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sel == 99) {
13221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->err_rx  = 0;
13231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->err_crc = 0;
13241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->err_tx  = 0;
13251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->bcs[0].err_inv = 0;
13261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->bcs[0].err_rdo = 0;
13271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->bcs[0].err_crc = 0;
13281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->bcs[0].err_tx  = 0;
13291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->bcs[1].err_inv = 0;
13301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->bcs[1].err_rdo = 0;
13311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->bcs[1].err_crc = 0;
13321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->bcs[1].err_tx  = 0;
13331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
13341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
13351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
13361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init HiSax_init(void)
13381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
13391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i, retval;
13401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef MODULE
13411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int j;
13421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int nzproto = 0;
13431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
13441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	HiSaxVersion();
13461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	retval = CallcNew();
13471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (retval)
13481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out;
13491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	retval = Isdnl3New();
13501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (retval)
13511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out_callc;
13521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	retval = Isdnl2New();
13531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (retval)
13541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out_isdnl3;
13551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	retval = TeiNew();
13561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (retval)
13571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out_isdnl2;
13581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	retval = Isdnl1New();
13591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (retval)
13601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out_tei;
13611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef MODULE
13631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!type[0]) {
13641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* We 'll register drivers later, but init basic functions */
13651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (i = 0; i < HISAX_MAX_CARDS; i++)
13661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[i].typ = 0;
13671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
13681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
13691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_ELSA
13701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (type[0] == ISDN_CTYPE_ELSA_PCMCIA) {
13711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* we have exported  and return in this case */
13721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
13731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
13741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
13751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_SEDLBAUER
13761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (type[0] == ISDN_CTYPE_SEDLBAUER_PCMCIA) {
13771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* we have to export  and return in this case */
13781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
13791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
13801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
13811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_AVM_A1_PCMCIA
13821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (type[0] == ISDN_CTYPE_A1_PCMCIA) {
13831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* we have to export  and return in this case */
13841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
13851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
13861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
13871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_HFC_SX
13881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (type[0] == ISDN_CTYPE_HFC_SP_PCMCIA) {
13891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* we have to export  and return in this case */
13901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
13911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
13921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
13931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
13941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	nrcards = 0;
13951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef MODULE
13961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (id)			/* If id= string used */
13971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		HiSax_id = id;
13981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = j = 0; j < HISAX_MAX_CARDS; i++) {
13991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cards[j].typ = type[i];
14001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (protocol[i]) {
14011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].protocol = protocol[i];
14021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			nzproto++;
14031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
14041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].protocol = DEFAULT_PROTO;
14051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
14061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (type[i]) {
14071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_16_0:
14081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[0] = irq[i];
14091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[1] = mem[i];
14101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[2] = io[i];
14111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
14121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_8_0:
14141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[0] = irq[i];
14151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[1] = mem[i];
14161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
14171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef IO0_IO1
14191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_PNP:
14201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_NICCY:
14211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[0] = irq[i];
14221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[1] = io0[i];
14231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[2] = io1[i];
14241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
14251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_COMPAQ_ISA:
14261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[0] = irq[i];
14271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[1] = io0[i];
14281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[2] = io1[i];
14291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[3] = io[i];
14301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
14311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
14321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_ELSA:
14331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_HFC_PCI:
14341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[0] = io[i];
14351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
14361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_16_3:
14371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_TELESPCMCIA:
14381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_A1:
14391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_A1_PCMCIA:
14401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_ELSA_PNP:
14411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_ELSA_PCMCIA:
14421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_IX1MICROR2:
14431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_DIEHLDIVA:
14441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_ASUSCOM:
14451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_TELEINT:
14461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_SEDLBAUER:
14471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_SEDLBAUER_PCMCIA:
14481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_SEDLBAUER_FAX:
14491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_SPORTSTER:
14501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_MIC:
14511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_TELES3C:
14521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_ACERP10:
14531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_S0BOX:
14541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_FRITZPCI:
14551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_HSTSAPHIR:
14561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_GAZEL:
14571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_HFC_SX:
14581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_HFC_SP_PCMCIA:
14591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[0] = irq[i];
14601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[1] = io[i];
14611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
14621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_ISURF:
14631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[0] = irq[i];
14641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[1] = io[i];
14651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cards[j].para[2] = mem[i];
14661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
14671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_ELSA_PCI:
14681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_NETJET_S:
14691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_TELESPCI:
14701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_W6692:
14711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_NETJET_U:
14721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
14731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_BKM_A4T:
14741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
14751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case ISDN_CTYPE_SCT_QUADRO:
14761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (irq[i]) {
14771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cards[j].para[0] = irq[i];
14781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
14791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				/* QUADRO is a 4 BRI card */
14801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cards[j++].para[0] = 1;
14811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				/* we need to check if further cards can be added */
14821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j < HISAX_MAX_CARDS) {
14831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					cards[j].typ = ISDN_CTYPE_SCT_QUADRO;
14841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					cards[j].protocol = protocol[i];
14851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					cards[j++].para[0] = 2;
14861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
14871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j < HISAX_MAX_CARDS) {
14881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					cards[j].typ = ISDN_CTYPE_SCT_QUADRO;
14891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					cards[j].protocol = protocol[i];
14901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					cards[j++].para[0] = 3;
14911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
14921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j < HISAX_MAX_CARDS) {
14931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					cards[j].typ = ISDN_CTYPE_SCT_QUADRO;
14941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					cards[j].protocol = protocol[i];
14951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					cards[j].para[0] = 4;
14961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
14971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
14981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
14991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
15001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j++;
15011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
15021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!nzproto) {
15031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_WARNING
15041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       "HiSax: Warning - no protocol specified\n");
15051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_WARNING "HiSax: using protocol %s\n",
15061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       DEFAULT_PROTO_NAME);
15071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
15081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
15091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!HiSax_id)
15101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		HiSax_id = HiSaxID;
15111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!HiSaxID[0])
15121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(HiSaxID, "HiSax");
15131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < HISAX_MAX_CARDS; i++)
15141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cards[i].typ > 0)
15151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			nrcards++;
15161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_DEBUG "HiSax: Total %d card%s defined\n",
15171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       nrcards, (nrcards > 1) ? "s" : "");
15181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Install only, if at least one card found */
15201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!HiSax_inithardware(NULL))
15211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENODEV;
15221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
15231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out_tei:
15251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TeiFree();
15261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out_isdnl2:
15271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Isdnl2Free();
15281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out_isdnl3:
15291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Isdnl3Free();
15301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out_callc:
15311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	CallcFree();
15321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds out:
15331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return retval;
15341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
15351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit HiSax_exit(void)
15371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
15381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cardnr = nrcards - 1;
15391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (cardnr >= 0)
15411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		HiSax_closecard(cardnr--);
15421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Isdnl1Free();
15431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TeiFree();
15441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Isdnl2Free();
15451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Isdnl3Free();
15461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	CallcFree();
15471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "HiSax module removed\n");
15481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
15491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
155056d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viro#ifdef CONFIG_HOTPLUG
155156d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viro
155256d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viroint __devinit hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card)
15531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
15541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_char ids[16];
15551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int ret = -1;
15561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cards[nrcards] = *card;
15581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (nrcards)
15591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sprintf(ids, "HiSax%d", nrcards);
15601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
15611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sprintf(ids, "HiSax");
1562d38c8475b4f3a684ac673dcedc88ffdb17b74882Jeff Garzik	if (!checkcard(nrcards, ids, busy_flag, THIS_MODULE,
1563d38c8475b4f3a684ac673dcedc88ffdb17b74882Jeff Garzik		       hisax_cs_setup_card))
15641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto error;
15651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ret = nrcards;
15671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	nrcards++;
15681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldserror:
15691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ret;
15701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
15711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(hisax_init_pcmcia);
157356d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viro#endif
157456d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viro
15751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(HiSax_closecard);
15761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "hisax_if.h"
15781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(hisax_register);
15801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(hisax_unregister);
15811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_d_l1l2(struct hisax_if *ifc, int pr, void *arg);
15831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_b_l1l2(struct hisax_if *ifc, int pr, void *arg);
15841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_d_l2l1(struct PStack *st, int pr, void *arg);
15851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_b_l2l1(struct PStack *st, int pr, void *arg);
15861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int hisax_cardmsg(struct IsdnCardState *cs, int mt, void *arg);
15871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int hisax_bc_setstack(struct PStack *st, struct BCState *bcs);
15881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_bc_close(struct BCState *bcs);
1589c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howellsstatic void hisax_bh(struct work_struct *work);
15901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void EChannel_proc_rcv(struct hisax_d_if *d_if);
15911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
159256d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Virostatic int hisax_setup_card_dynamic(struct IsdnCard *card)
159356d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viro{
159456d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viro	return 2;
159556d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viro}
159656d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viro
15971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[],
15981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   char *name, int protocol)
15991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
16001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i, retval;
16011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char id[20];
16021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct IsdnCardState *cs;
16031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < HISAX_MAX_CARDS; i++) {
16051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!cards[i].typ)
16061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
16071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
16081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (i >= HISAX_MAX_CARDS)
16101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EBUSY;
16111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cards[i].typ = ISDN_CTYPE_DYNAMIC;
16131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cards[i].protocol = protocol;
16141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sprintf(id, "%s%d", name, i);
16151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	nrcards++;
161656d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viro	retval = checkcard(i, id, NULL, hisax_d_if->owner,
161756d74dd5f7ad8b6b0979ce915d51cf03bcc57267Al Viro				hisax_setup_card_dynamic);
16181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (retval == 0) { // yuck
16191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cards[i].typ = 0;
16201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		nrcards--;
1621ae2d990eede0ef5938c210d48a177c044258ecd8Alan Stern		return -EINVAL;
16221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
16231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs = cards[i].cs;
16241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hisax_d_if->cs = cs;
16251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->hw.hisax_d_if = hisax_d_if;
16261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->cardmsg = hisax_cardmsg;
1627c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells	INIT_WORK(&cs->tqueue, hisax_bh);
16281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cs->channel[0].d_st->l2.l2l1 = hisax_d_l2l1;
16291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < 2; i++) {
16301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->bcs[i].BC_SetStack = hisax_bc_setstack;
16311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cs->bcs[i].BC_Close = hisax_bc_close;
16321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		b_if[i]->ifc.l1l2 = hisax_b_l1l2;
16341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		hisax_d_if->b_if[i] = b_if[i];
16361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
16371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hisax_d_if->ifc.l1l2 = hisax_d_l1l2;
16381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	skb_queue_head_init(&hisax_d_if->erq);
16391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clear_bit(0, &hisax_d_if->ph_state);
16401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
16421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
16431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid hisax_unregister(struct hisax_d_if *hisax_d_if)
16451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
16461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cards[hisax_d_if->cs->cardnr].typ = 0;
16471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	HiSax_closecard(hisax_d_if->cs->cardnr);
16481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	skb_queue_purge(&hisax_d_if->erq);
16491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
16501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "isdnl1.h"
16521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_sched_event(struct IsdnCardState *cs, int event)
16541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
16551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	test_and_set_bit(event, &cs->event);
16561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	schedule_work(&cs->tqueue);
16571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
16581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1659c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howellsstatic void hisax_bh(struct work_struct *work)
16601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1661c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells	struct IsdnCardState *cs =
1662c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howells		container_of(work, struct IsdnCardState, tqueue);
16631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct PStack *st;
16641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int pr;
16651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (test_and_clear_bit(D_RCVBUFREADY, &cs->event))
16671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		DChannel_proc_rcv(cs);
16681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (test_and_clear_bit(E_RCVBUFREADY, &cs->event))
16691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		EChannel_proc_rcv(cs->hw.hisax_d_if);
16701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) {
16711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (test_bit(0, &cs->hw.hisax_d_if->ph_state))
16721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pr = PH_ACTIVATE | INDICATION;
16731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
16741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pr = PH_DEACTIVATE | INDICATION;
16751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (st = cs->stlist; st; st = st->next)
16761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			st->l1.l1l2(st, pr, NULL);
16771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
16791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
16801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_b_sched_event(struct BCState *bcs, int event)
16821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
16831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	test_and_set_bit(event, &bcs->event);
16841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	schedule_work(&bcs->tqueue);
16851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
16861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void D_L2L1(struct hisax_d_if *d_if, int pr, void *arg)
16881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
16891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_if *ifc = (struct hisax_if *) d_if;
16901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ifc->l2l1(ifc, pr, arg);
16911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
16921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void B_L2L1(struct hisax_b_if *b_if, int pr, void *arg)
16941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
16951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_if *ifc = (struct hisax_if *) b_if;
16961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ifc->l2l1(ifc, pr, arg);
16971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
16981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_d_l1l2(struct hisax_if *ifc, int pr, void *arg)
17001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
17011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_d_if *d_if = (struct hisax_d_if *) ifc;
17021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct IsdnCardState *cs = d_if->cs;
17031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct PStack *st;
17041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sk_buff *skb;
17051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (pr) {
17071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_ACTIVATE | INDICATION:
17081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		set_bit(0, &d_if->ph_state);
17091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		hisax_sched_event(cs, D_L1STATECHANGE);
17101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_DEACTIVATE | INDICATION:
17121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		clear_bit(0, &d_if->ph_state);
17131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		hisax_sched_event(cs, D_L1STATECHANGE);
17141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_DATA | INDICATION:
17161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		skb_queue_tail(&cs->rq, arg);
17171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		hisax_sched_event(cs, D_RCVBUFREADY);
17181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_DATA | CONFIRM:
17201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		skb = skb_dequeue(&cs->sq);
17211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (skb) {
17221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			D_L2L1(d_if, PH_DATA | REQUEST, skb);
17231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
17241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
17251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		clear_bit(FLG_L1_DBUSY, &cs->HW_Flags);
17261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (st = cs->stlist; st; st = st->next) {
17271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags)) {
17281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
17291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
17301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
17311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
17321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_DATA_E | INDICATION:
17341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		skb_queue_tail(&d_if->erq, arg);
17351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		hisax_sched_event(cs, E_RCVBUFREADY);
17361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
17381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("pr %#x\n", pr);
17391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
17411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
17421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_b_l1l2(struct hisax_if *ifc, int pr, void *arg)
17441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
17451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_b_if *b_if = (struct hisax_b_if *) ifc;
17461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct BCState *bcs = b_if->bcs;
17471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct PStack *st = bcs->st;
17481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sk_buff *skb;
17491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	// FIXME use isdnl1?
17511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (pr) {
17521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_ACTIVATE | INDICATION:
17531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		st->l1.l1l2(st, pr, NULL);
17541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_DEACTIVATE | INDICATION:
17561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		st->l1.l1l2(st, pr, NULL);
17571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		clear_bit(BC_FLG_BUSY, &bcs->Flag);
17581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		skb_queue_purge(&bcs->squeue);
17591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bcs->hw.b_if = NULL;
17601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_DATA | INDICATION:
17621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		skb_queue_tail(&bcs->rqueue, arg);
17631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		hisax_b_sched_event(bcs, B_RCVBUFREADY);
17641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_DATA | CONFIRM:
176617a4506d0eb1f78c9018c06a79e7dd09ae78c3a8Alan Cox		bcs->tx_cnt -= (long)arg;
17671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag)) {
17681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			u_long	flags;
17691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			spin_lock_irqsave(&bcs->aclock, flags);
177017a4506d0eb1f78c9018c06a79e7dd09ae78c3a8Alan Cox			bcs->ackcnt += (long)arg;
17711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			spin_unlock_irqrestore(&bcs->aclock, flags);
17721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			schedule_event(bcs, B_ACKPENDING);
17731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
17741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		skb = skb_dequeue(&bcs->squeue);
17751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (skb) {
17761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			B_L2L1(b_if, PH_DATA | REQUEST, skb);
17771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
17781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
17791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		clear_bit(BC_FLG_BUSY, &bcs->Flag);
17801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags)) {
17811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
17821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
17831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
17851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("hisax_b_l1l2 pr %#x\n", pr);
17861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
17871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
17881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
17891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_d_l2l1(struct PStack *st, int pr, void *arg)
17911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
17921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct IsdnCardState *cs = st->l1.hardware;
17931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_d_if *hisax_d_if = cs->hw.hisax_d_if;
17941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sk_buff *skb = arg;
17951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (pr) {
17971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_DATA | REQUEST:
17981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_PULL | INDICATION:
17991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cs->debug & DEB_DLOG_HEX)
18001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LogFrame(cs, skb->data, skb->len);
18011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cs->debug & DEB_DLOG_VERBOSE)
18021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dlogframe(cs, skb, 0);
18031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		Logl2Frame(cs, skb, "PH_DATA_REQ", 0);
18041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		// FIXME lock?
18051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!test_and_set_bit(FLG_L1_DBUSY, &cs->HW_Flags))
18061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			D_L2L1(hisax_d_if, PH_DATA | REQUEST, skb);
18071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
18081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			skb_queue_tail(&cs->sq, skb);
18091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
18101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_PULL | REQUEST:
18111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!test_bit(FLG_L1_DBUSY, &cs->HW_Flags))
18121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
18131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
18141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
18151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
18161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
18171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		D_L2L1(hisax_d_if, pr, arg);
18181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
18191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
18201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
18211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int hisax_cardmsg(struct IsdnCardState *cs, int mt, void *arg)
18231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
18241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
18251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
18261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_b_l2l1(struct PStack *st, int pr, void *arg)
18281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
18291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct BCState *bcs = st->l1.bcs;
18301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_b_if *b_if = bcs->hw.b_if;
18311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (pr) {
18331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_ACTIVATE | REQUEST:
183417a4506d0eb1f78c9018c06a79e7dd09ae78c3a8Alan Cox		B_L2L1(b_if, pr, (void *)(unsigned long)st->l1.mode);
18351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
18361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_DATA | REQUEST:
18371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_PULL | INDICATION:
18381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		// FIXME lock?
18391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!test_and_set_bit(BC_FLG_BUSY, &bcs->Flag)) {
18401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			B_L2L1(b_if, PH_DATA | REQUEST, arg);
18411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
18421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			skb_queue_tail(&bcs->squeue, arg);
18431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
18441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
18451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_PULL | REQUEST:
18461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!test_bit(BC_FLG_BUSY, &bcs->Flag))
18471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
18481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
18491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
18501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
18511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PH_DEACTIVATE | REQUEST:
18521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
18531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		skb_queue_purge(&bcs->squeue);
18541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
18551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		B_L2L1(b_if, pr, arg);
18561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
18571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
18581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
18591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int hisax_bc_setstack(struct PStack *st, struct BCState *bcs)
18611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
18621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct IsdnCardState *cs = st->l1.hardware;
18631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_d_if *hisax_d_if = cs->hw.hisax_d_if;
18641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bcs->channel = st->l1.bc;
18661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bcs->hw.b_if = hisax_d_if->b_if[st->l1.bc];
18681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hisax_d_if->b_if[st->l1.bc]->bcs = bcs;
18691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	st->l1.bcs = bcs;
18711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	st->l2.l2l1 = hisax_b_l2l1;
18721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	setstack_manager(st);
18731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bcs->st = st;
18741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	setstack_l1_B(st);
18751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	skb_queue_head_init(&bcs->rqueue);
18761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	skb_queue_head_init(&bcs->squeue);
18771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
18781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
18791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void hisax_bc_close(struct BCState *bcs)
18811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
18821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hisax_b_if *b_if = bcs->hw.b_if;
18831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (b_if)
18851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		B_L2L1(b_if, PH_DEACTIVATE | REQUEST, NULL);
18861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
18871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void EChannel_proc_rcv(struct hisax_d_if *d_if)
18891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
18901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct IsdnCardState *cs = d_if->cs;
18911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_char *ptr;
18921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sk_buff *skb;
18931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while ((skb = skb_dequeue(&d_if->erq)) != NULL) {
18951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (cs->debug & DEB_DLOG_HEX) {
18961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ptr = cs->dlog;
18971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if ((skb->len) < MAX_DLOG_SPACE / 3 - 10) {
18981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				*ptr++ = 'E';
18991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				*ptr++ = 'C';
19001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				*ptr++ = 'H';
19011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				*ptr++ = 'O';
19021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				*ptr++ = ':';
19031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ptr += QuickHex(ptr, skb->data, skb->len);
19041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ptr--;
19051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				*ptr++ = '\n';
19061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				*ptr = 0;
19071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				HiSax_putstatus(cs, NULL, cs->dlog);
19081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else
19091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				HiSax_putstatus(cs, "LogEcho: ",
19101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						"warning Frame too big (%d)",
19111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						skb->len);
19121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
19131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev_kfree_skb_any(skb);
19141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
19151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
19161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PCI
19181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
19191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1920f8bf5681cf15f77692c8ad8cb95d059ff7c622c9Namhyung Kimstatic struct pci_device_id hisax_pci_tbl[] __devinitdata __used = {
19211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_FRITZPCI
19228f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(AVM,      PCI_DEVICE_ID_AVM_A1)			},
19231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
19241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_DIEHLDIVA
19258f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(EICON,    PCI_DEVICE_ID_EICON_DIVA20)		},
19268f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(EICON,    PCI_DEVICE_ID_EICON_DIVA20_U)	},
19278f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(EICON,    PCI_DEVICE_ID_EICON_DIVA201)		},
19288f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe/*##########################################################################*/
19298f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(EICON,    PCI_DEVICE_ID_EICON_DIVA202)		},
19308f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe/*##########################################################################*/
19311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
19321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_ELSA
19338f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(ELSA,     PCI_DEVICE_ID_ELSA_MICROLINK)	},
19348f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(ELSA,     PCI_DEVICE_ID_ELSA_QS3000)		},
19351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
19361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_GAZEL
19378f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(PLX,      PCI_DEVICE_ID_PLX_R685)			},
19388f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(PLX,      PCI_DEVICE_ID_PLX_R753)			},
19398f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(PLX,      PCI_DEVICE_ID_PLX_DJINN_ITOO)	},
19408f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(PLX,      PCI_DEVICE_ID_PLX_OLITEC)		},
19411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1942e3f2769e6e896a5d734593e4842014cab220d027Robert P. J. Day#ifdef CONFIG_HISAX_SCT_QUADRO
19438f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(PLX,      PCI_DEVICE_ID_PLX_9050)			},
19441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
19451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_NICCY
19468f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(SATSAGEM, PCI_DEVICE_ID_SATSAGEM_NICCY)	},
19471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
19481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_SEDLBAUER
19498f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(TIGERJET, PCI_DEVICE_ID_TIGERJET_100)		},
19501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
19511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_HISAX_NETJET) || defined(CONFIG_HISAX_NETJET_U)
19528f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(TIGERJET, PCI_DEVICE_ID_TIGERJET_300)		},
19531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
19541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_HISAX_TELESPCI) || defined(CONFIG_HISAX_SCT_QUADRO)
19558f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(ZORAN,    PCI_DEVICE_ID_ZORAN_36120)		},
19561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
19571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_W6692
19588f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(DYNALINK, PCI_DEVICE_ID_DYNALINK_IS64PH)	},
19598f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(WINBOND2, PCI_DEVICE_ID_WINBOND2_6692)		},
19601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
19611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HISAX_HFC_PCI
19628f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_2BD0)			},
19638f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B000)			},
19648f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B006)			},
19658f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B007)			},
19668f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B008)			},
19678f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B009)			},
19688f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B00A)			},
19698f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B00B)			},
19708f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B00C)			},
19718f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B100)			},
19728f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B700)			},
19738f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(CCD,      PCI_DEVICE_ID_CCD_B701)			},
19748f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(ABOCOM,   PCI_DEVICE_ID_ABOCOM_2BD1)		},
19758f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(ASUSTEK,  PCI_DEVICE_ID_ASUSTEK_0675)		},
19768f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(BERKOM,   PCI_DEVICE_ID_BERKOM_T_CONCEPT)	},
19778f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(BERKOM,   PCI_DEVICE_ID_BERKOM_A1T)		},
19788f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(ANIGMA,   PCI_DEVICE_ID_ANIGMA_MC145575)	},
19798f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(ZOLTRIX,  PCI_DEVICE_ID_ZOLTRIX_2BD0)		},
19808f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(DIGI,     PCI_DEVICE_ID_DIGI_DF_M_IOM2_E)	},
19818f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(DIGI,     PCI_DEVICE_ID_DIGI_DF_M_E)		},
19828f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(DIGI,     PCI_DEVICE_ID_DIGI_DF_M_IOM2_A)	},
19838f31539dfa36d8cf880576348d149af0cc1d788aPeter Huewe	{PCI_VDEVICE(DIGI,     PCI_DEVICE_ID_DIGI_DF_M_A)		},
19841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
19851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ }				/* Terminating entry */
19861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
19871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, hisax_pci_tbl);
19891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* CONFIG_PCI */
19901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(HiSax_init);
19921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(HiSax_exit);
19931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(FsmNew);
19951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(FsmFree);
19961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(FsmEvent);
19971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(FsmChangeState);
19981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(FsmInitTimer);
19991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(FsmDelTimer);
20001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(FsmRestartTimer);
2001