1/* $Id: act2000.h,v 1.8.6.3 2001/09/23 22:24:32 kai Exp $ 2 * 3 * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000. 4 * 5 * Author Fritz Elfert 6 * Copyright by Fritz Elfert <fritz@isdn4linux.de> 7 * 8 * This software may be used and distributed according to the terms 9 * of the GNU General Public License, incorporated herein by reference. 10 * 11 * Thanks to Friedemann Baitinger and IBM Germany 12 * 13 */ 14 15#ifndef act2000_h 16#define act2000_h 17 18#include <linux/compiler.h> 19 20#define ACT2000_IOCTL_SETPORT 1 21#define ACT2000_IOCTL_GETPORT 2 22#define ACT2000_IOCTL_SETIRQ 3 23#define ACT2000_IOCTL_GETIRQ 4 24#define ACT2000_IOCTL_SETBUS 5 25#define ACT2000_IOCTL_GETBUS 6 26#define ACT2000_IOCTL_SETPROTO 7 27#define ACT2000_IOCTL_GETPROTO 8 28#define ACT2000_IOCTL_SETMSN 9 29#define ACT2000_IOCTL_GETMSN 10 30#define ACT2000_IOCTL_LOADBOOT 11 31#define ACT2000_IOCTL_ADDCARD 12 32 33#define ACT2000_IOCTL_TEST 98 34#define ACT2000_IOCTL_DEBUGVAR 99 35 36#define ACT2000_BUS_ISA 1 37#define ACT2000_BUS_MCA 2 38#define ACT2000_BUS_PCMCIA 3 39 40/* Struct for adding new cards */ 41typedef struct act2000_cdef { 42 int bus; 43 int port; 44 int irq; 45 char id[10]; 46} act2000_cdef; 47 48/* Struct for downloading firmware */ 49typedef struct act2000_ddef { 50 int length; /* Length of code */ 51 char __user *buffer; /* Ptr. to code */ 52} act2000_ddef; 53 54typedef struct act2000_fwid { 55 char isdn[4]; 56 char revlen[2]; 57 char revision[504]; 58} act2000_fwid; 59 60#if defined(__KERNEL__) || defined(__DEBUGVAR__) 61 62#ifdef __KERNEL__ 63/* Kernel includes */ 64 65#include <linux/sched.h> 66#include <linux/string.h> 67#include <linux/workqueue.h> 68#include <linux/interrupt.h> 69#include <linux/skbuff.h> 70#include <linux/errno.h> 71#include <linux/fs.h> 72#include <linux/major.h> 73#include <asm/io.h> 74#include <linux/kernel.h> 75#include <linux/signal.h> 76#include <linux/slab.h> 77#include <linux/mm.h> 78#include <linux/mman.h> 79#include <linux/ioport.h> 80#include <linux/timer.h> 81#include <linux/wait.h> 82#include <linux/delay.h> 83#include <linux/ctype.h> 84#include <linux/isdnif.h> 85 86#endif /* __KERNEL__ */ 87 88#define ACT2000_PORTLEN 8 89 90#define ACT2000_FLAGS_RUNNING 1 /* Cards driver activated */ 91#define ACT2000_FLAGS_PVALID 2 /* Cards port is valid */ 92#define ACT2000_FLAGS_IVALID 4 /* Cards irq is valid */ 93#define ACT2000_FLAGS_LOADED 8 /* Firmware loaded */ 94 95#define ACT2000_BCH 2 /* # of channels per card */ 96 97/* D-Channel states */ 98#define ACT2000_STATE_NULL 0 99#define ACT2000_STATE_ICALL 1 100#define ACT2000_STATE_OCALL 2 101#define ACT2000_STATE_IWAIT 3 102#define ACT2000_STATE_OWAIT 4 103#define ACT2000_STATE_IBWAIT 5 104#define ACT2000_STATE_OBWAIT 6 105#define ACT2000_STATE_BWAIT 7 106#define ACT2000_STATE_BHWAIT 8 107#define ACT2000_STATE_BHWAIT2 9 108#define ACT2000_STATE_DHWAIT 10 109#define ACT2000_STATE_DHWAIT2 11 110#define ACT2000_STATE_BSETUP 12 111#define ACT2000_STATE_ACTIVE 13 112 113#define ACT2000_MAX_QUEUED 8000 /* 2 * maxbuff */ 114 115#define ACT2000_LOCK_TX 0 116#define ACT2000_LOCK_RX 1 117 118typedef struct act2000_chan { 119 unsigned short callref; /* Call Reference */ 120 unsigned short fsm_state; /* Current D-Channel state */ 121 unsigned short eazmask; /* EAZ-Mask for this Channel */ 122 short queued; /* User-Data Bytes in TX queue */ 123 unsigned short plci; 124 unsigned short ncci; 125 unsigned char l2prot; /* Layer 2 protocol */ 126 unsigned char l3prot; /* Layer 3 protocol */ 127} act2000_chan; 128 129typedef struct msn_entry { 130 char eaz; 131 char msn[16]; 132 struct msn_entry *next; 133} msn_entry; 134 135typedef struct irq_data_isa { 136 __u8 *rcvptr; 137 __u16 rcvidx; 138 __u16 rcvlen; 139 struct sk_buff *rcvskb; 140 __u8 rcvignore; 141 __u8 rcvhdr[8]; 142} irq_data_isa; 143 144typedef union act2000_irq_data { 145 irq_data_isa isa; 146} act2000_irq_data; 147 148/* 149 * Per card driver data 150 */ 151typedef struct act2000_card { 152 unsigned short port; /* Base-port-address */ 153 unsigned short irq; /* Interrupt */ 154 u_char ptype; /* Protocol type (1TR6 or Euro) */ 155 u_char bus; /* Cardtype (ISA, MCA, PCMCIA) */ 156 struct act2000_card *next; /* Pointer to next device struct */ 157 spinlock_t lock; /* protect critical operations */ 158 int myid; /* Driver-Nr. assigned by linklevel */ 159 unsigned long flags; /* Statusflags */ 160 unsigned long ilock; /* Semaphores for IRQ-Routines */ 161 struct sk_buff_head rcvq; /* Receive-Message queue */ 162 struct sk_buff_head sndq; /* Send-Message queue */ 163 struct sk_buff_head ackq; /* Data-Ack-Message queue */ 164 u_char *ack_msg; /* Ptr to User Data in User skb */ 165 __u16 need_b3ack; /* Flag: Need ACK for current skb */ 166 struct sk_buff *sbuf; /* skb which is currently sent */ 167 struct timer_list ptimer; /* Poll timer */ 168 struct work_struct snd_tq; /* Task struct for xmit bh */ 169 struct work_struct rcv_tq; /* Task struct for rcv bh */ 170 struct work_struct poll_tq; /* Task struct for polled rcv bh */ 171 msn_entry *msn_list; 172 unsigned short msgnum; /* Message number for sending */ 173 spinlock_t mnlock; /* lock for msgnum */ 174 act2000_chan bch[ACT2000_BCH]; /* B-Channel status/control */ 175 char status_buf[256]; /* Buffer for status messages */ 176 char *status_buf_read; 177 char *status_buf_write; 178 char *status_buf_end; 179 act2000_irq_data idat; /* Data used for IRQ handler */ 180 isdn_if interface; /* Interface to upper layer */ 181 char regname[35]; /* Name used for request_region */ 182} act2000_card; 183 184static inline void act2000_schedule_tx(act2000_card *card) 185{ 186 schedule_work(&card->snd_tq); 187} 188 189static inline void act2000_schedule_rx(act2000_card *card) 190{ 191 schedule_work(&card->rcv_tq); 192} 193 194static inline void act2000_schedule_poll(act2000_card *card) 195{ 196 schedule_work(&card->poll_tq); 197} 198 199extern char *act2000_find_eaz(act2000_card *, char); 200 201#endif /* defined(__KERNEL__) || defined(__DEBUGVAR__) */ 202#endif /* act2000_h */ 203