linux/drivers/isdn/act2000/act2000.h
<<
>>
Prefs
   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 irq_data {
 145        irq_data_isa isa;
 146} 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        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