Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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> |
Joe Perches | 475be4d | 2012-02-19 19:52:38 -0800 | [diff] [blame] | 7 | * |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 */ |
| 41 | typedef struct act2000_cdef { |
| 42 | int bus; |
Joe Perches | 475be4d | 2012-02-19 19:52:38 -0800 | [diff] [blame] | 43 | int port; |
| 44 | int irq; |
| 45 | char id[10]; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 46 | } act2000_cdef; |
| 47 | |
| 48 | /* Struct for downloading firmware */ |
| 49 | typedef struct act2000_ddef { |
Joe Perches | 475be4d | 2012-02-19 19:52:38 -0800 | [diff] [blame] | 50 | int length; /* Length of code */ |
| 51 | char __user *buffer; /* Ptr. to code */ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 52 | } act2000_ddef; |
| 53 | |
| 54 | typedef struct act2000_fwid { |
Joe Perches | 475be4d | 2012-02-19 19:52:38 -0800 | [diff] [blame] | 55 | char isdn[4]; |
| 56 | char revlen[2]; |
| 57 | char revision[504]; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | |
| 118 | typedef 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 | |
| 129 | typedef struct msn_entry { |
| 130 | char eaz; |
Joe Perches | 475be4d | 2012-02-19 19:52:38 -0800 | [diff] [blame] | 131 | char msn[16]; |
| 132 | struct msn_entry *next; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 133 | } msn_entry; |
| 134 | |
| 135 | typedef 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 | |
Thomas Gleixner | e7ffec1 | 2010-10-03 20:08:13 +0200 | [diff] [blame] | 144 | typedef union act2000_irq_data { |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 145 | irq_data_isa isa; |
Thomas Gleixner | e7ffec1 | 2010-10-03 20:08:13 +0200 | [diff] [blame] | 146 | } act2000_irq_data; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 147 | |
| 148 | /* |
| 149 | * Per card driver data |
| 150 | */ |
| 151 | typedef 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; |
Thomas Gleixner | e7ffec1 | 2010-10-03 20:08:13 +0200 | [diff] [blame] | 179 | act2000_irq_data idat; /* Data used for IRQ handler */ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 180 | isdn_if interface; /* Interface to upper layer */ |
| 181 | char regname[35]; /* Name used for request_region */ |
| 182 | } act2000_card; |
| 183 | |
Adrian Bunk | b7b4d7a | 2006-01-08 01:02:16 -0800 | [diff] [blame] | 184 | static inline void act2000_schedule_tx(act2000_card *card) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 185 | { |
Joe Perches | 475be4d | 2012-02-19 19:52:38 -0800 | [diff] [blame] | 186 | schedule_work(&card->snd_tq); |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 187 | } |
| 188 | |
Adrian Bunk | b7b4d7a | 2006-01-08 01:02:16 -0800 | [diff] [blame] | 189 | static inline void act2000_schedule_rx(act2000_card *card) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 190 | { |
Joe Perches | 475be4d | 2012-02-19 19:52:38 -0800 | [diff] [blame] | 191 | schedule_work(&card->rcv_tq); |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 192 | } |
| 193 | |
Adrian Bunk | b7b4d7a | 2006-01-08 01:02:16 -0800 | [diff] [blame] | 194 | static inline void act2000_schedule_poll(act2000_card *card) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 195 | { |
Joe Perches | 475be4d | 2012-02-19 19:52:38 -0800 | [diff] [blame] | 196 | schedule_work(&card->poll_tq); |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 197 | } |
| 198 | |
| 199 | extern char *act2000_find_eaz(act2000_card *, char); |
| 200 | |
| 201 | #endif /* defined(__KERNEL__) || defined(__DEBUGVAR__) */ |
| 202 | #endif /* act2000_h */ |