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