708 lines
24 KiB
C
708 lines
24 KiB
C
/* $Id$
|
|
*
|
|
* ISDN low-level module for Eicon active ISDN-Cards.
|
|
*
|
|
* Copyright 1998 by Fritz Elfert (fritz@isdn4linux.de)
|
|
* Copyright 1998-2000 by Armin Schindler (mac@melware.de)
|
|
* Copyright 1999,2000 Cytronics & Melware (info@melware.de)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
* $Log$
|
|
* Revision 1.18 1999/11/25 11:43:27 armin
|
|
* Fixed statectrl and connect message.
|
|
* X.75 fix and HDLC/transparent with autoconnect.
|
|
* Minor cleanup.
|
|
*
|
|
* Revision 1.17 1999/10/26 21:15:33 armin
|
|
* using define for checking phone number len to avoid buffer overflow.
|
|
*
|
|
* Revision 1.16 1999/10/08 22:09:33 armin
|
|
* Some fixes of cards interface handling.
|
|
* Bugfix of NULL pointer occurence.
|
|
* Changed a few log outputs.
|
|
*
|
|
* Revision 1.15 1999/09/26 14:17:53 armin
|
|
* Improved debug and log via readstat()
|
|
*
|
|
* Revision 1.14 1999/09/08 20:17:31 armin
|
|
* Added microchannel patch from Erik Weber.
|
|
*
|
|
* Revision 1.13 1999/09/06 07:29:35 fritz
|
|
* Changed my mail-address.
|
|
*
|
|
* Revision 1.12 1999/09/04 06:20:05 keil
|
|
* Changes from kernel set_current_state()
|
|
*
|
|
* Revision 1.11 1999/08/29 17:23:44 armin
|
|
* New setup compat.
|
|
* Bugfix if compile as not module.
|
|
*
|
|
* Revision 1.10 1999/08/22 20:26:41 calle
|
|
* backported changes from kernel 2.3.14:
|
|
* - several #include "config.h" gone, others come.
|
|
* - "struct device" changed to "struct net_device" in 2.3.14, added a
|
|
* define in isdn_compat.h for older kernel versions.
|
|
*
|
|
* Revision 1.9 1999/08/18 20:16:57 armin
|
|
* Added XLOG function for all cards.
|
|
* Bugfix of alloc_skb NULL pointer.
|
|
*
|
|
* Revision 1.8 1999/07/25 15:12:01 armin
|
|
* fix of some debug logs.
|
|
* enabled ISA-cards option.
|
|
*
|
|
* Revision 1.7 1999/07/11 17:16:23 armin
|
|
* Bugfixes in queue handling.
|
|
* Added DSP-DTMF decoder functions.
|
|
* Reorganized ack_handler.
|
|
*
|
|
* Revision 1.6 1999/06/09 19:31:24 armin
|
|
* Wrong PLX size for request_region() corrected.
|
|
* Added first MCA code from Erik Weber.
|
|
*
|
|
* Revision 1.5 1999/03/29 11:19:41 armin
|
|
* I/O stuff now in seperate file (eicon_io.c)
|
|
* Old ISA type cards (S,SX,SCOM,Quadro,S2M) implemented.
|
|
*
|
|
* Revision 1.4 1999/03/02 12:37:42 armin
|
|
* Added some important checks.
|
|
* Analog Modem with DSP.
|
|
* Channels will be added to Link-Level after loading firmware.
|
|
*
|
|
* Revision 1.3 1999/01/24 20:14:07 armin
|
|
* Changed and added debug stuff.
|
|
* Better data sending. (still problems with tty's flip buffer)
|
|
*
|
|
* Revision 1.2 1999/01/10 18:46:04 armin
|
|
* Bug with wrong values in HLC fixed.
|
|
* Bytes to send are counted and limited now.
|
|
*
|
|
* Revision 1.1 1999/01/01 18:09:41 armin
|
|
* First checkin of new eicon driver.
|
|
* DIVA-Server BRI/PCI and PRI/PCI are supported.
|
|
* Old diehl code is obsolete.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef eicon_h
|
|
#define eicon_h
|
|
|
|
#define EICON_IOCTL_SETMMIO 0
|
|
#define EICON_IOCTL_GETMMIO 1
|
|
#define EICON_IOCTL_SETIRQ 2
|
|
#define EICON_IOCTL_GETIRQ 3
|
|
#define EICON_IOCTL_LOADBOOT 4
|
|
#define EICON_IOCTL_ADDCARD 5
|
|
#define EICON_IOCTL_GETTYPE 6
|
|
#define EICON_IOCTL_LOADPCI 7
|
|
#define EICON_IOCTL_LOADISA 8
|
|
#define EICON_IOCTL_GETVER 9
|
|
#define EICON_IOCTL_GETXLOG 10
|
|
|
|
#define EICON_IOCTL_MANIF 90
|
|
|
|
#define EICON_IOCTL_FREEIT 97
|
|
#define EICON_IOCTL_TEST 98
|
|
#define EICON_IOCTL_DEBUGVAR 99
|
|
|
|
/* Bus types */
|
|
#define EICON_BUS_ISA 1
|
|
#define EICON_BUS_MCA 2
|
|
#define EICON_BUS_PCI 3
|
|
|
|
/* Constants for describing Card-Type */
|
|
#define EICON_CTYPE_S 0
|
|
#define EICON_CTYPE_SX 1
|
|
#define EICON_CTYPE_SCOM 2
|
|
#define EICON_CTYPE_QUADRO 3
|
|
#define EICON_CTYPE_S2M 4
|
|
#define EICON_CTYPE_MAESTRA 5
|
|
#define EICON_CTYPE_MAESTRAQ 6
|
|
#define EICON_CTYPE_MAESTRAQ_U 7
|
|
#define EICON_CTYPE_MAESTRAP 8
|
|
#define EICON_CTYPE_ISABRI 0x10
|
|
#define EICON_CTYPE_ISAPRI 0x20
|
|
#define EICON_CTYPE_MASK 0x0f
|
|
#define EICON_CTYPE_QUADRO_NR(n) (n<<4)
|
|
|
|
#define MAX_HEADER_LEN 10
|
|
|
|
#define MAX_STATUS_BUFFER 150
|
|
|
|
/* Struct for adding new cards */
|
|
typedef struct eicon_cdef {
|
|
int membase;
|
|
int irq;
|
|
char id[10];
|
|
} eicon_cdef;
|
|
|
|
#define EICON_ISA_BOOT_MEMCHK 1
|
|
#define EICON_ISA_BOOT_NORMAL 2
|
|
|
|
/* Struct for downloading protocol via ioctl for ISA cards */
|
|
/* same struct for downloading protocol via ioctl for MCA cards */
|
|
typedef struct {
|
|
/* start-up parameters */
|
|
unsigned char tei;
|
|
unsigned char nt2;
|
|
unsigned char skip1;
|
|
unsigned char WatchDog;
|
|
unsigned char Permanent;
|
|
unsigned char XInterface;
|
|
unsigned char StableL2;
|
|
unsigned char NoOrderCheck;
|
|
unsigned char HandsetType;
|
|
unsigned char skip2;
|
|
unsigned char LowChannel;
|
|
unsigned char ProtVersion;
|
|
unsigned char Crc4;
|
|
unsigned char Loopback;
|
|
unsigned char oad[32];
|
|
unsigned char osa[32];
|
|
unsigned char spid[32];
|
|
unsigned char boot_opt;
|
|
unsigned long bootstrap_len;
|
|
unsigned long firmware_len;
|
|
unsigned char code[1]; /* Rest (bootstrap- and firmware code) will be allocated */
|
|
} eicon_isa_codebuf;
|
|
|
|
/* Struct for downloading protocol via ioctl for PCI cards */
|
|
typedef struct {
|
|
/* start-up parameters */
|
|
unsigned char tei;
|
|
unsigned char nt2;
|
|
unsigned char WatchDog;
|
|
unsigned char Permanent;
|
|
unsigned char XInterface;
|
|
unsigned char StableL2;
|
|
unsigned char NoOrderCheck;
|
|
unsigned char HandsetType;
|
|
unsigned char LowChannel;
|
|
unsigned char ProtVersion;
|
|
unsigned char Crc4;
|
|
unsigned char NoHscx30Mode; /* switch PRI into No HSCX30 test mode */
|
|
unsigned char Loopback; /* switch card into Loopback mode */
|
|
struct q931_link_s
|
|
{
|
|
unsigned char oad[32];
|
|
unsigned char osa[32];
|
|
unsigned char spid[32];
|
|
} l[2];
|
|
unsigned long protocol_len;
|
|
unsigned int dsp_code_num;
|
|
unsigned long dsp_code_len[9];
|
|
unsigned char code[1]; /* Rest (protocol- and dsp code) will be allocated */
|
|
} eicon_pci_codebuf;
|
|
|
|
/* Data for downloading protocol via ioctl */
|
|
typedef union {
|
|
eicon_isa_codebuf isa;
|
|
eicon_isa_codebuf mca;
|
|
eicon_pci_codebuf pci;
|
|
} eicon_codebuf;
|
|
|
|
/* Data for Management interface */
|
|
typedef struct {
|
|
int count;
|
|
int pos;
|
|
int length[50];
|
|
unsigned char data[700];
|
|
} eicon_manifbuf;
|
|
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
/* Kernel includes */
|
|
#include <linux/config.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/string.h>
|
|
#include <linux/tqueue.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/skbuff.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/major.h>
|
|
#include <asm/segment.h>
|
|
#include <asm/io.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/signal.h>
|
|
#include <linux/malloc.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/mman.h>
|
|
#include <linux/ioport.h>
|
|
#include <linux/timer.h>
|
|
#include <linux/wait.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/ctype.h>
|
|
|
|
#include <linux/isdn.h>
|
|
#include <linux/isdnif.h>
|
|
|
|
#include <linux/isdn_compat.h>
|
|
|
|
typedef struct {
|
|
__u16 length __attribute__ ((packed)); /* length of data/parameter field */
|
|
__u8 P[1]; /* data/parameter field */
|
|
} eicon_PBUFFER;
|
|
|
|
#include "eicon_isa.h"
|
|
|
|
/* Macro for delay via schedule() */
|
|
#define SLEEP(j) { \
|
|
set_current_state(TASK_UNINTERRUPTIBLE); \
|
|
schedule_timeout(j); \
|
|
}
|
|
|
|
#endif /* KERNEL */
|
|
|
|
#define DIVAS_SHARED_OFFSET (0x1000)
|
|
|
|
#define MIPS_BUFFER_SZ 128
|
|
#define MIPS_MAINT_OFFS 0xff00
|
|
|
|
#define XLOG_ERR_CARD_NUM (13)
|
|
#define XLOG_ERR_DONE (14)
|
|
#define XLOG_ERR_CMD (15)
|
|
#define XLOG_ERR_TIMEOUT (16)
|
|
#define XLOG_ERR_CARD_STATE (17)
|
|
#define XLOG_ERR_UNKNOWN (18)
|
|
#define XLOG_OK (0)
|
|
|
|
#define TRACE_OK (1)
|
|
|
|
typedef struct {
|
|
__u8 Id __attribute__ ((packed));
|
|
__u8 uX __attribute__ ((packed));
|
|
__u8 listen __attribute__ ((packed));
|
|
__u8 active __attribute__ ((packed));
|
|
__u8 sin[3] __attribute__ ((packed));
|
|
__u8 bc[6] __attribute__ ((packed));
|
|
__u8 llc[6] __attribute__ ((packed));
|
|
__u8 hlc[6] __attribute__ ((packed));
|
|
__u8 oad[20] __attribute__ ((packed));
|
|
}DSigStruc;
|
|
|
|
typedef struct {
|
|
__u32 cx_b1 __attribute__ ((packed));
|
|
__u32 cx_b2 __attribute__ ((packed));
|
|
__u32 cr_b1 __attribute__ ((packed));
|
|
__u32 cr_b2 __attribute__ ((packed));
|
|
__u32 px_b1 __attribute__ ((packed));
|
|
__u32 px_b2 __attribute__ ((packed));
|
|
__u32 pr_b1 __attribute__ ((packed));
|
|
__u32 pr_b2 __attribute__ ((packed));
|
|
__u16 er_b1 __attribute__ ((packed));
|
|
__u16 er_b2 __attribute__ ((packed));
|
|
}BL1Struc;
|
|
|
|
typedef struct {
|
|
__u32 XTotal __attribute__ ((packed));
|
|
__u32 RTotal __attribute__ ((packed));
|
|
__u16 XError __attribute__ ((packed));
|
|
__u16 RError __attribute__ ((packed));
|
|
}L2Struc;
|
|
|
|
typedef struct {
|
|
__u16 free_n;
|
|
}OSStruc;
|
|
|
|
typedef union
|
|
{
|
|
DSigStruc DSigStats;
|
|
BL1Struc BL1Stats;
|
|
L2Struc L2Stats;
|
|
OSStruc OSStats;
|
|
__u8 b[MIPS_BUFFER_SZ];
|
|
__u16 w[MIPS_BUFFER_SZ>>1];
|
|
__u16 l[MIPS_BUFFER_SZ>>2]; /* word is wrong, do not use! Use 'd' instead. */
|
|
__u32 d[MIPS_BUFFER_SZ>>2];
|
|
} MIPS_BUFFER;
|
|
|
|
typedef struct
|
|
{
|
|
__u8 req __attribute__ ((packed));
|
|
__u8 rc __attribute__ ((packed));
|
|
__u8 reserved[2] __attribute__ ((packed)); /* R3000 alignment ... */
|
|
__u8 *mem __attribute__ ((packed));
|
|
__u16 length __attribute__ ((packed)); /* used to be short */
|
|
__u16 port __attribute__ ((packed));
|
|
__u8 fill[4] __attribute__ ((packed)); /* data at offset 16 */
|
|
MIPS_BUFFER data __attribute__ ((packed));
|
|
} mi_pc_maint_t;
|
|
|
|
typedef struct
|
|
{
|
|
__u16 command;
|
|
mi_pc_maint_t pcm;
|
|
}xlogreq_t;
|
|
|
|
typedef struct{
|
|
__u16 code __attribute__ ((packed)); /* used to be short */
|
|
__u16 timeh __attribute__ ((packed));
|
|
__u16 timel __attribute__ ((packed));
|
|
char buffer[MIPS_BUFFER_SZ - 6];
|
|
}xlog_entry_t;
|
|
|
|
|
|
#define DSP_COMBIFILE_FORMAT_IDENTIFICATION_SIZE 48
|
|
#define DSP_COMBIFILE_FORMAT_VERSION_BCD 0x0100
|
|
|
|
#define DSP_FILE_FORMAT_IDENTIFICATION_SIZE 48
|
|
#define DSP_FILE_FORMAT_VERSION_BCD 0x0100
|
|
|
|
typedef struct tag_dsp_combifile_header
|
|
{
|
|
char format_identification[DSP_COMBIFILE_FORMAT_IDENTIFICATION_SIZE] __attribute__ ((packed));
|
|
__u16 format_version_bcd __attribute__ ((packed));
|
|
__u16 header_size __attribute__ ((packed));
|
|
__u16 combifile_description_size __attribute__ ((packed));
|
|
__u16 directory_entries __attribute__ ((packed));
|
|
__u16 directory_size __attribute__ ((packed));
|
|
__u16 download_count __attribute__ ((packed));
|
|
__u16 usage_mask_size __attribute__ ((packed));
|
|
} t_dsp_combifile_header;
|
|
|
|
typedef struct tag_dsp_combifile_directory_entry
|
|
{
|
|
__u16 card_type_number __attribute__ ((packed));
|
|
__u16 file_set_number __attribute__ ((packed));
|
|
} t_dsp_combifile_directory_entry;
|
|
|
|
typedef struct tag_dsp_file_header
|
|
{
|
|
char format_identification[DSP_FILE_FORMAT_IDENTIFICATION_SIZE] __attribute__ ((packed));
|
|
__u16 format_version_bcd __attribute__ ((packed));
|
|
__u16 download_id __attribute__ ((packed));
|
|
__u16 download_flags __attribute__ ((packed));
|
|
__u16 required_processing_power __attribute__ ((packed));
|
|
__u16 interface_channel_count __attribute__ ((packed));
|
|
__u16 header_size __attribute__ ((packed));
|
|
__u16 download_description_size __attribute__ ((packed));
|
|
__u16 memory_block_table_size __attribute__ ((packed));
|
|
__u16 memory_block_count __attribute__ ((packed));
|
|
__u16 segment_table_size __attribute__ ((packed));
|
|
__u16 segment_count __attribute__ ((packed));
|
|
__u16 symbol_table_size __attribute__ ((packed));
|
|
__u16 symbol_count __attribute__ ((packed));
|
|
__u16 total_data_size_dm __attribute__ ((packed));
|
|
__u16 data_block_count_dm __attribute__ ((packed));
|
|
__u16 total_data_size_pm __attribute__ ((packed));
|
|
__u16 data_block_count_pm __attribute__ ((packed));
|
|
} t_dsp_file_header;
|
|
|
|
typedef struct tag_dsp_memory_block_desc
|
|
{
|
|
__u16 alias_memory_block;
|
|
__u16 memory_type;
|
|
__u16 address;
|
|
__u16 size; /* DSP words */
|
|
} t_dsp_memory_block_desc;
|
|
|
|
typedef struct tag_dsp_segment_desc
|
|
{
|
|
__u16 memory_block;
|
|
__u16 attributes;
|
|
__u16 base;
|
|
__u16 size;
|
|
__u16 alignment; /* ==0 -> no other legal start address than base */
|
|
} t_dsp_segment_desc;
|
|
|
|
typedef struct tag_dsp_symbol_desc
|
|
{
|
|
__u16 symbol_id;
|
|
__u16 segment;
|
|
__u16 offset;
|
|
__u16 size; /* DSP words */
|
|
} t_dsp_symbol_desc;
|
|
|
|
typedef struct tag_dsp_data_block_header
|
|
{
|
|
__u16 attributes;
|
|
__u16 segment;
|
|
__u16 offset;
|
|
__u16 size; /* DSP words */
|
|
} t_dsp_data_block_header;
|
|
|
|
typedef struct tag_dsp_download_desc /* be sure to keep native alignment for MAESTRA's */
|
|
{
|
|
__u16 download_id;
|
|
__u16 download_flags;
|
|
__u16 required_processing_power;
|
|
__u16 interface_channel_count;
|
|
__u16 excess_header_size;
|
|
__u16 memory_block_count;
|
|
__u16 segment_count;
|
|
__u16 symbol_count;
|
|
__u16 data_block_count_dm;
|
|
__u16 data_block_count_pm;
|
|
__u8 * p_excess_header_data __attribute__ ((packed));
|
|
char * p_download_description __attribute__ ((packed));
|
|
t_dsp_memory_block_desc *p_memory_block_table __attribute__ ((packed));
|
|
t_dsp_segment_desc *p_segment_table __attribute__ ((packed));
|
|
t_dsp_symbol_desc *p_symbol_table __attribute__ ((packed));
|
|
__u16 * p_data_blocks_dm __attribute__ ((packed));
|
|
__u16 * p_data_blocks_pm __attribute__ ((packed));
|
|
} t_dsp_download_desc;
|
|
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
typedef struct {
|
|
__u8 Req; /* pending request */
|
|
__u8 Rc; /* return code received */
|
|
__u8 Ind; /* indication received */
|
|
__u8 ReqCh; /* channel of current Req */
|
|
__u8 RcCh; /* channel of current Rc */
|
|
__u8 IndCh; /* channel of current Ind */
|
|
__u8 D3Id; /* ID used by this entity */
|
|
__u8 B2Id; /* ID used by this entity */
|
|
__u8 GlobalId; /* reserved field */
|
|
__u8 XNum; /* number of X-buffers */
|
|
__u8 RNum; /* number of R-buffers */
|
|
struct sk_buff_head X; /* X-buffer queue */
|
|
struct sk_buff_head R; /* R-buffer queue */
|
|
__u8 RNR; /* receive not ready flag */
|
|
__u8 complete; /* receive complete status */
|
|
__u8 busy; /* busy flag */
|
|
__u16 ref; /* saved reference */
|
|
} entity;
|
|
|
|
#define FAX_MAX_SCANLINE 256
|
|
|
|
typedef struct {
|
|
__u8 PrevObject;
|
|
__u8 NextObject;
|
|
__u8 abLine[FAX_MAX_SCANLINE];
|
|
__u8 abFrame[FAX_MAX_SCANLINE];
|
|
unsigned int LineLen;
|
|
unsigned int LineDataLen;
|
|
__u32 LineData;
|
|
unsigned int NullBytesPos;
|
|
__u8 NullByteExist;
|
|
int PageCount;
|
|
__u8 Dle;
|
|
__u8 Eop;
|
|
} eicon_ch_fax_buf;
|
|
|
|
typedef struct {
|
|
int No; /* Channel Number */
|
|
unsigned short fsm_state; /* Current D-Channel state */
|
|
unsigned short statectrl; /* State controling bits */
|
|
unsigned short eazmask; /* EAZ-Mask for this Channel */
|
|
int queued; /* User-Data Bytes in TX queue */
|
|
int waitq; /* User-Data Bytes in wait queue */
|
|
int waitpq; /* User-Data Bytes in packet queue */
|
|
struct sk_buff *tskb1; /* temp skb 1 */
|
|
struct sk_buff *tskb2; /* temp skb 2 */
|
|
unsigned char l2prot; /* Layer 2 protocol */
|
|
unsigned char l3prot; /* Layer 3 protocol */
|
|
#ifdef CONFIG_ISDN_TTY_FAX
|
|
T30_s *fax; /* pointer to fax data in LL */
|
|
eicon_ch_fax_buf fax2; /* fax related struct */
|
|
#endif
|
|
entity e; /* Entity */
|
|
char cpn[32]; /* remember cpn */
|
|
char oad[32]; /* remember oad */
|
|
char dsa[32]; /* remember dsa */
|
|
char osa[32]; /* remember osa */
|
|
unsigned char cause[2]; /* Last Cause */
|
|
unsigned char si1;
|
|
unsigned char si2;
|
|
unsigned char plan;
|
|
unsigned char screen;
|
|
} eicon_chan;
|
|
|
|
typedef struct {
|
|
eicon_chan *ptr;
|
|
} eicon_chan_ptr;
|
|
|
|
#include "eicon_pci.h"
|
|
|
|
#define EICON_FLAGS_RUNNING 1 /* Cards driver activated */
|
|
#define EICON_FLAGS_PVALID 2 /* Cards port is valid */
|
|
#define EICON_FLAGS_IVALID 4 /* Cards irq is valid */
|
|
#define EICON_FLAGS_MVALID 8 /* Cards membase is valid */
|
|
#define EICON_FLAGS_LOADED 8 /* Firmware loaded */
|
|
|
|
#define EICON_BCH 2 /* # of channels per card */
|
|
|
|
/* D-Channel states */
|
|
#define EICON_STATE_NULL 0
|
|
#define EICON_STATE_ICALL 1
|
|
#define EICON_STATE_OCALL 2
|
|
#define EICON_STATE_IWAIT 3
|
|
#define EICON_STATE_OWAIT 4
|
|
#define EICON_STATE_IBWAIT 5
|
|
#define EICON_STATE_OBWAIT 6
|
|
#define EICON_STATE_BWAIT 7
|
|
#define EICON_STATE_BHWAIT 8
|
|
#define EICON_STATE_BHWAIT2 9
|
|
#define EICON_STATE_DHWAIT 10
|
|
#define EICON_STATE_DHWAIT2 11
|
|
#define EICON_STATE_BSETUP 12
|
|
#define EICON_STATE_ACTIVE 13
|
|
#define EICON_STATE_ICALLW 14
|
|
#define EICON_STATE_LISTEN 15
|
|
#define EICON_STATE_WMCONN 16
|
|
|
|
#define EICON_MAX_QUEUE 2138
|
|
|
|
#define EICON_LOCK_TX 0
|
|
#define EICON_LOCK_RX 1
|
|
|
|
typedef union {
|
|
eicon_isa_card isa;
|
|
eicon_pci_card pci;
|
|
eicon_isa_card mca;
|
|
} eicon_hwif;
|
|
|
|
typedef struct {
|
|
__u8 ret;
|
|
__u8 id;
|
|
__u8 ch;
|
|
} eicon_ack;
|
|
|
|
typedef struct {
|
|
__u8 code;
|
|
__u8 id;
|
|
__u8 ch;
|
|
} eicon_req;
|
|
|
|
typedef struct {
|
|
__u8 ret;
|
|
__u8 id;
|
|
__u8 ch;
|
|
__u8 more;
|
|
} eicon_indhdr;
|
|
|
|
typedef struct msn_entry {
|
|
char eaz;
|
|
char msn[16];
|
|
struct msn_entry * next;
|
|
} msn_entry;
|
|
|
|
/*
|
|
* Per card driver data
|
|
*/
|
|
typedef struct eicon_card {
|
|
eicon_hwif hwif; /* Hardware dependant interface */
|
|
u_char ptype; /* Protocol type (1TR6 or Euro) */
|
|
u_char bus; /* Bustype (ISA, MCA, PCI) */
|
|
u_char type; /* Cardtype (EICON_CTYPE_...) */
|
|
struct eicon_card *qnext; /* Pointer to next quadro adapter */
|
|
int Feature; /* Protocol Feature Value */
|
|
struct eicon_card *next; /* Pointer to next device struct */
|
|
int myid; /* Driver-Nr. assigned by linklevel */
|
|
unsigned long flags; /* Statusflags */
|
|
struct sk_buff_head rcvq; /* Receive-Message queue */
|
|
struct sk_buff_head sndq; /* Send-Message queue */
|
|
struct sk_buff_head rackq; /* Req-Ack-Message queue */
|
|
struct sk_buff_head sackq; /* Data-Ack-Message queue */
|
|
struct sk_buff_head statq; /* Status-Message queue */
|
|
int statq_entries;
|
|
struct tq_struct snd_tq; /* Task struct for xmit bh */
|
|
struct tq_struct rcv_tq; /* Task struct for rcv bh */
|
|
struct tq_struct ack_tq; /* Task struct for ack bh */
|
|
msn_entry *msn_list;
|
|
eicon_chan* IdTable[256]; /* Table to find entity */
|
|
__u16 ref_in;
|
|
__u16 ref_out;
|
|
int nchannels; /* Number of B-Channels */
|
|
int ReadyInt; /* Ready Interrupt */
|
|
eicon_chan *bch; /* B-Channel status/control */
|
|
char status_buf[256]; /* Buffer for status messages */
|
|
char *status_buf_read;
|
|
char *status_buf_write;
|
|
char *status_buf_end;
|
|
isdn_if interface; /* Interface to upper layer */
|
|
char regname[35]; /* Name used for request_region */
|
|
#ifdef CONFIG_MCA
|
|
int mca_slot; /* # of cards MCA slot */
|
|
int mca_io; /* MCA cards IO port */
|
|
#endif /* CONFIG_MCA */
|
|
} eicon_card;
|
|
|
|
/* -----------------------------------------------------------**
|
|
** The PROTOCOL_FEATURE_STRING **
|
|
** defines capabilities and **
|
|
** features of the actual protocol code. It's used as a bit **
|
|
** mask. **
|
|
** The following Bits are defined: **
|
|
** -----------------------------------------------------------*/
|
|
#define PROTCAP_TELINDUS 0x0001 /* Telindus Variant of protocol code */
|
|
#define PROTCAP_MANIF 0x0002 /* Management interface implemented */
|
|
#define PROTCAP_V_42 0x0004 /* V42 implemented */
|
|
#define PROTCAP_V90D 0x0008 /* V.90D (implies up to 384k DSP code) */
|
|
#define PROTCAP_EXTD_FAX 0x0010 /* Extended FAX (ECM, 2D, T6, Polling) */
|
|
#define PROTCAP_FREE4 0x0020 /* not used */
|
|
#define PROTCAP_FREE5 0x0040 /* not used */
|
|
#define PROTCAP_FREE6 0x0080 /* not used */
|
|
#define PROTCAP_FREE7 0x0100 /* not used */
|
|
#define PROTCAP_FREE8 0x0200 /* not used */
|
|
#define PROTCAP_FREE9 0x0400 /* not used */
|
|
#define PROTCAP_FREE10 0x0800 /* not used */
|
|
#define PROTCAP_FREE11 0x1000 /* not used */
|
|
#define PROTCAP_FREE12 0x2000 /* not used */
|
|
#define PROTCAP_FREE13 0x4000 /* not used */
|
|
#define PROTCAP_EXTENSION 0x8000 /* used for future extentions */
|
|
|
|
#include "eicon_idi.h"
|
|
|
|
extern eicon_card *cards;
|
|
extern char *eicon_ctype_name[];
|
|
|
|
|
|
extern __inline__ void eicon_schedule_tx(eicon_card *card)
|
|
{
|
|
queue_task(&card->snd_tq, &tq_immediate);
|
|
mark_bh(IMMEDIATE_BH);
|
|
}
|
|
|
|
extern __inline__ void eicon_schedule_rx(eicon_card *card)
|
|
{
|
|
queue_task(&card->rcv_tq, &tq_immediate);
|
|
mark_bh(IMMEDIATE_BH);
|
|
}
|
|
|
|
extern __inline__ void eicon_schedule_ack(eicon_card *card)
|
|
{
|
|
queue_task(&card->ack_tq, &tq_immediate);
|
|
mark_bh(IMMEDIATE_BH);
|
|
}
|
|
|
|
extern char *eicon_find_eaz(eicon_card *, char);
|
|
extern int eicon_addcard(int, int, int, char *);
|
|
extern void eicon_io_transmit(eicon_card *card);
|
|
extern void eicon_irq(int irq, void *dev_id, struct pt_regs *regs);
|
|
extern void eicon_io_rcv_dispatch(eicon_card *ccard);
|
|
extern void eicon_io_ack_dispatch(eicon_card *ccard);
|
|
extern int eicon_get_xlog(eicon_card *card, xlogreq_t *xlogreq);
|
|
#ifdef CONFIG_MCA
|
|
extern int eicon_mca_find_card(int, int, int, char *);
|
|
extern int eicon_mca_probe(int, int, int, int, char *);
|
|
extern int eicon_info(char *, int , void *);
|
|
#endif /* CONFIG_MCA */
|
|
|
|
extern ulong DebugVar;
|
|
extern void eicon_log(eicon_card * card, int level, const char *fmt, ...);
|
|
extern void eicon_putstatus(eicon_card * card, char * buf);
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* eicon_h */
|