e82a9289ad96693ab214ad8709003abacf2e9d8d
[pandora-kernel.git] / drivers / isdn / act2000 / capi.h
1 /* $Id: capi.h,v 1.6.6.2 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 CAPI_H
16 #define CAPI_H
17
18 /* Command-part of a CAPI message */
19 typedef struct actcapi_msgcmd {
20         __u8 cmd;
21         __u8 subcmd;
22 } actcapi_msgcmd;
23
24 /* CAPI message header */
25 typedef struct actcapi_msghdr {
26         __u16 len;
27         __u16 applicationID;
28         actcapi_msgcmd cmd;
29         __u16 msgnum;
30 } actcapi_msghdr;
31
32 /* CAPI message description (for debugging) */
33 typedef struct actcapi_msgdsc {
34         actcapi_msgcmd cmd;
35         char *description;
36 } actcapi_msgdsc;
37
38 /* CAPI Address */
39 typedef struct actcapi_addr {
40         __u8 len;                            /* Length of element            */
41         __u8 tnp;                            /* Type/Numbering Plan          */
42         __u8 num[20];                        /* Caller ID                    */
43 } actcapi_addr;
44
45 /* CAPI INFO element mask */
46 typedef  union actcapi_infonr {              /* info number                  */
47         __u16 mask;                          /* info-mask field              */
48         struct bmask {                       /* bit definitions              */
49                 unsigned  codes : 3;         /* code set                     */
50                 unsigned  rsvd  : 5;         /* reserved                     */
51                 unsigned  svind : 1;         /* single, variable length ind. */
52                 unsigned  wtype : 7;         /* W-element type               */
53         } bmask;
54 } actcapi_infonr;
55
56 /* CAPI INFO element */
57 typedef union  actcapi_infoel {              /* info element                 */
58         __u8 len;                            /* length of info element       */
59         __u8 display[40];                    /* display contents             */
60         __u8 uuinfo[40];                     /* User-user info field         */
61         struct cause {                       /* Cause information            */
62                 unsigned ext2  : 1;          /* extension                    */
63                 unsigned cod   : 2;          /* coding standard              */
64                 unsigned spare : 1;          /* spare                        */
65                 unsigned loc   : 4;          /* location                     */
66                 unsigned ext1  : 1;          /* extension                    */
67                 unsigned cval  : 7;          /* Cause value                  */
68         } cause;                     
69         struct charge {                      /* Charging information         */
70                 __u8 toc;                    /* type of charging info        */
71                 __u8 unit[10];               /* charging units               */
72         } charge;
73         __u8 date[20];                       /* date fields                  */
74         __u8 stat;                           /* state of remote party        */
75 } actcapi_infoel;
76
77 /* Message for EAZ<->MSN Mapping */
78 typedef struct actcapi_msn {
79         __u8 eaz;
80         __u8 len;                            /* Length of MSN                */
81         __u8 msn[15] __attribute__ ((packed));
82 } actcapi_msn;
83
84 typedef struct actcapi_dlpd {
85         __u8 len;                            /* Length of structure          */
86         __u16 dlen __attribute__ ((packed)); /* Data Length                  */
87         __u8 laa __attribute__ ((packed));   /* Link Address A               */
88         __u8 lab;                            /* Link Address B               */
89         __u8 modulo;                         /* Modulo Mode                  */
90         __u8 win;                            /* Window size                  */
91         __u8 xid[100];                       /* XID Information              */
92 } actcapi_dlpd;
93
94 typedef struct actcapi_ncpd {
95         __u8   len;                          /* Length of structure          */
96         __u16  lic __attribute__ ((packed));
97         __u16  hic __attribute__ ((packed));
98         __u16  ltc __attribute__ ((packed));
99         __u16  htc __attribute__ ((packed));
100         __u16  loc __attribute__ ((packed));
101         __u16  hoc __attribute__ ((packed));
102         __u8   modulo __attribute__ ((packed));
103 } actcapi_ncpd;
104 #define actcapi_ncpi actcapi_ncpd
105
106 /*
107  * Layout of NCCI field in a B3 DATA CAPI message is different from
108  * standard at act2000:
109  *
110  * Bit 0-4  = PLCI
111  * Bit 5-7  = Controller
112  * Bit 8-15 = NCCI
113  */
114 #define MAKE_NCCI(plci,contr,ncci) \
115         ((plci & 0x1f) | ((contr & 0x7) << 5) | ((ncci & 0xff) << 8))
116
117 #define EVAL_NCCI(fakencci,plci,contr,ncci) { \
118         plci  = fakencci & 0x1f; \
119         contr = (fakencci >> 5) & 0x7; \
120         ncci  = (fakencci >> 8) & 0xff; \
121 }
122
123 /*
124  * Layout of PLCI field in a B3 DATA CAPI message is different from
125  * standard at act2000:
126  *
127  * Bit 0-4  = PLCI
128  * Bit 5-7  = Controller
129  * Bit 8-15 = reserved (must be 0)
130  */
131 #define MAKE_PLCI(plci,contr) \
132         ((plci & 0x1f) | ((contr & 0x7) << 5))
133
134 #define EVAL_PLCI(fakeplci,plci,contr) { \
135         plci  = fakeplci & 0x1f; \
136         contr = (fakeplci >> 5) & 0x7; \
137 }
138
139 typedef struct actcapi_msg {
140         actcapi_msghdr hdr;
141         union {
142                 __u16 manuf_msg;
143                 struct manufacturer_req_net {
144                         __u16 manuf_msg;
145                         __u16 controller;
146                         __u8  nettype;
147                 } manufacturer_req_net;
148                 struct manufacturer_req_v42 {
149                         __u16 manuf_msg;
150                         __u16 controller;
151                         __u32 v42control;
152                 } manufacturer_req_v42;
153                 struct manufacturer_conf_v42 {
154                         __u16 manuf_msg;
155                         __u16 controller;
156                 } manufacturer_conf_v42;
157                 struct manufacturer_req_err {
158                         __u16 manuf_msg;
159                         __u16 controller;
160                 } manufacturer_req_err;
161                 struct manufacturer_ind_err {
162                         __u16 manuf_msg;
163                         __u16 controller;
164                         __u32 errcode;
165                         __u8  errstring; /* actually up to 160 */
166                 } manufacturer_ind_err;
167                 struct manufacturer_req_msn {
168                         __u16 manuf_msg;
169                         __u16 controller;
170                         actcapi_msn msnmap;
171                 } manufacturer_req_msn;
172                 /* TODO: TraceInit-req/conf/ind/resp and
173                  *       TraceDump-req/conf/ind/resp
174                  */
175                 struct connect_req {
176                         __u8  controller;
177                         __u8  bchan;
178                         __u32 infomask __attribute__ ((packed));
179                         __u8  si1;
180                         __u8  si2;
181                         __u8  eaz;
182                         actcapi_addr addr;
183                 } connect_req;
184                 struct connect_conf {
185                         __u16 plci;
186                         __u16 info;
187                 } connect_conf;
188                 struct connect_ind {
189                         __u16 plci;
190                         __u8  controller;
191                         __u8  si1;
192                         __u8  si2;
193                         __u8  eaz;
194                         actcapi_addr addr;
195                 } connect_ind;
196                 struct connect_resp {
197                         __u16 plci;
198                         __u8  rejectcause;
199                 } connect_resp;
200                 struct connect_active_ind {
201                         __u16 plci;
202                         actcapi_addr addr;
203                 } connect_active_ind;
204                 struct connect_active_resp {
205                         __u16 plci;
206                 } connect_active_resp;
207                 struct connect_b3_req {
208                         __u16 plci;
209                         actcapi_ncpi ncpi;
210                 } connect_b3_req;
211                 struct connect_b3_conf {
212                         __u16 plci;
213                         __u16 ncci;
214                         __u16 info;
215                 } connect_b3_conf;
216                 struct connect_b3_ind {
217                         __u16 ncci;
218                         __u16 plci;
219                         actcapi_ncpi ncpi;
220                 } connect_b3_ind;
221                 struct connect_b3_resp {
222                         __u16 ncci;
223                         __u8  rejectcause;
224                         actcapi_ncpi ncpi __attribute__ ((packed));
225                 } connect_b3_resp;
226                 struct disconnect_req {
227                         __u16 plci;
228                         __u8  cause;
229                 } disconnect_req;
230                 struct disconnect_conf {
231                         __u16 plci;
232                         __u16 info;
233                 } disconnect_conf;
234                 struct disconnect_ind {
235                         __u16 plci;
236                         __u16 info;
237                 } disconnect_ind;
238                 struct disconnect_resp {
239                         __u16 plci;
240                 } disconnect_resp;
241                 struct connect_b3_active_ind {
242                         __u16 ncci;
243                         actcapi_ncpi ncpi;
244                 } connect_b3_active_ind;
245                 struct connect_b3_active_resp {
246                         __u16 ncci;
247                 } connect_b3_active_resp;
248                 struct disconnect_b3_req {
249                         __u16 ncci;
250                         actcapi_ncpi ncpi;
251                 } disconnect_b3_req;
252                 struct disconnect_b3_conf {
253                         __u16 ncci;
254                         __u16 info;
255                 } disconnect_b3_conf;
256                 struct disconnect_b3_ind {
257                         __u16 ncci;
258                         __u16 info;
259                         actcapi_ncpi ncpi;
260                 } disconnect_b3_ind;
261                 struct disconnect_b3_resp {
262                         __u16 ncci;
263                 } disconnect_b3_resp;
264                 struct info_ind {
265                         __u16 plci;
266                         actcapi_infonr nr;
267                         actcapi_infoel el;
268                 } info_ind;
269                 struct info_resp {
270                         __u16 plci;
271                 } info_resp;
272                 struct listen_b3_req {
273                         __u16 plci;
274                 } listen_b3_req;
275                 struct listen_b3_conf {
276                         __u16 plci;
277                         __u16 info;
278                 } listen_b3_conf;
279                 struct select_b2_protocol_req {
280                         __u16 plci;
281                         __u8  protocol;
282                         actcapi_dlpd dlpd __attribute__ ((packed));
283                 } select_b2_protocol_req;
284                 struct select_b2_protocol_conf {
285                         __u16 plci;
286                         __u16 info;
287                 } select_b2_protocol_conf;
288                 struct select_b3_protocol_req {
289                         __u16 plci;
290                         __u8  protocol;
291                         actcapi_ncpd ncpd __attribute__ ((packed));
292                 } select_b3_protocol_req;
293                 struct select_b3_protocol_conf {
294                         __u16 plci;
295                         __u16 info;
296                 } select_b3_protocol_conf;
297                 struct listen_req {
298                         __u8  controller;
299                         __u32 infomask __attribute__ ((packed));  
300                         __u16 eazmask __attribute__ ((packed));
301                         __u16 simask __attribute__ ((packed));
302                 } listen_req;
303                 struct listen_conf {
304                         __u8  controller;
305                         __u16 info __attribute__ ((packed));
306                 } listen_conf;
307                 struct data_b3_req {
308                         __u16 fakencci;
309                         __u16 datalen;
310                         __u32 unused;
311                         __u8  blocknr;
312                         __u16 flags __attribute__ ((packed));
313                 } data_b3_req;
314                 struct data_b3_ind {
315                         __u16 fakencci;
316                         __u16 datalen;
317                         __u32 unused;
318                         __u8  blocknr;
319                         __u16 flags __attribute__ ((packed));
320                 } data_b3_ind;
321                 struct data_b3_resp {
322                         __u16 ncci;
323                         __u8  blocknr;
324                 } data_b3_resp;
325                 struct data_b3_conf {
326                         __u16 ncci;
327                         __u8  blocknr;
328                         __u16 info __attribute__ ((packed));
329                 } data_b3_conf;
330         } msg;
331 } actcapi_msg;
332
333 static inline unsigned short
334 actcapi_nextsmsg(act2000_card *card)
335 {
336         unsigned long flags;
337         unsigned short n;
338
339         spin_lock_irqsave(&card->mnlock, flags);
340         n = card->msgnum;
341         card->msgnum++;
342         card->msgnum &= 0x7fff;
343         spin_unlock_irqrestore(&card->mnlock, flags);
344         return n;
345 }
346 #define DEBUG_MSG
347 #undef DEBUG_DATA_MSG
348 #undef DEBUG_DUMP_SKB
349
350 extern int actcapi_chkhdr(act2000_card *, actcapi_msghdr *);
351 extern int actcapi_listen_req(act2000_card *);
352 extern int actcapi_manufacturer_req_net(act2000_card *);
353 extern int actcapi_manufacturer_req_errh(act2000_card *);
354 extern int actcapi_manufacturer_req_msn(act2000_card *);
355 extern int actcapi_connect_req(act2000_card *, act2000_chan *, char *, char, int, int);
356 extern void actcapi_select_b2_protocol_req(act2000_card *, act2000_chan *);
357 extern void actcapi_disconnect_b3_req(act2000_card *, act2000_chan *);
358 extern void actcapi_connect_resp(act2000_card *, act2000_chan *, __u8);
359 extern void actcapi_dispatch(act2000_card *);
360 #ifdef DEBUG_MSG
361 extern void actcapi_debug_msg(struct sk_buff *skb, int);
362 #else
363 #define actcapi_debug_msg(skb, len)
364 #endif
365 #endif