PageRenderTime 31ms CodeModel.GetById 15ms app.highlight 14ms RepoModel.GetById 0ms app.codeStats 1ms

/drivers/isdn/act2000/capi.h

https://bitbucket.org/ndreys/linux-sunxi
C++ Header | 365 lines | 308 code | 18 blank | 39 comment | 0 complexity | 8413945f7bab5f879914dfd31f79bfdd MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  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 */
 19typedef struct actcapi_msgcmd {
 20	__u8 cmd;
 21	__u8 subcmd;
 22} actcapi_msgcmd;
 23
 24/* CAPI message header */
 25typedef 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) */
 33typedef struct actcapi_msgdsc {
 34	actcapi_msgcmd cmd;
 35	char *description;
 36} actcapi_msgdsc;
 37
 38/* CAPI Address */
 39typedef 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 */
 46typedef  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 */
 57typedef 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 */
 78typedef struct actcapi_msn {
 79	__u8 eaz;
 80	__u8 len;                            /* Length of MSN                */
 81	__u8 msn[15];
 82}  __attribute__((packed)) actcapi_msn;
 83
 84typedef struct actcapi_dlpd {
 85	__u8 len;                            /* Length of structure          */
 86	__u16 dlen;                          /* Data Length                  */
 87	__u8 laa;                            /* 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} __attribute__((packed)) actcapi_dlpd;
 93
 94typedef struct actcapi_ncpd {
 95	__u8   len;                          /* Length of structure          */
 96	__u16  lic;
 97	__u16  hic;
 98	__u16  ltc;
 99	__u16  htc;
100	__u16  loc;
101	__u16  hoc;
102	__u8   modulo;
103} __attribute__((packed)) 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
139typedef 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		} __attribute ((packed)) 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;
179			__u8  si1;
180			__u8  si2;
181			__u8  eaz;
182			actcapi_addr addr;
183		} __attribute__ ((packed)) 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		} __attribute__ ((packed)) 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		} __attribute__ ((packed)) 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		} __attribute__ ((packed)) 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		} __attribute__ ((packed)) connect_b3_ind;
221		struct connect_b3_resp {
222			__u16 ncci;
223			__u8  rejectcause;
224			actcapi_ncpi ncpi;
225		} __attribute__ ((packed)) 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		} __attribute__ ((packed)) 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		} __attribute__ ((packed)) 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		} __attribute__ ((packed)) 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		} __attribute__ ((packed)) 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;
283		} __attribute__ ((packed)) 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;
292		} __attribute__ ((packed)) 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;
300			__u16 eazmask;
301			__u16 simask;
302		} __attribute__ ((packed)) listen_req;
303		struct listen_conf {
304			__u8  controller;
305			__u16 info;
306		} __attribute__ ((packed)) listen_conf;
307		struct data_b3_req {
308			__u16 fakencci;
309			__u16 datalen;
310			__u32 unused;
311			__u8  blocknr;
312			__u16 flags;
313		} __attribute ((packed)) data_b3_req;
314		struct data_b3_ind {
315			__u16 fakencci;
316			__u16 datalen;
317			__u32 unused;
318			__u8  blocknr;
319			__u16 flags;
320		} __attribute__ ((packed)) data_b3_ind;
321		struct data_b3_resp {
322			__u16 ncci;
323			__u8  blocknr;
324		} __attribute__ ((packed)) data_b3_resp;
325		struct data_b3_conf {
326			__u16 ncci;
327			__u8  blocknr;
328			__u16 info;
329		} __attribute__ ((packed)) data_b3_conf;
330	} msg;
331} __attribute__ ((packed)) actcapi_msg;
332
333static inline unsigned short
334actcapi_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
350extern int actcapi_chkhdr(act2000_card *, actcapi_msghdr *);
351extern int actcapi_listen_req(act2000_card *);
352extern int actcapi_manufacturer_req_net(act2000_card *);
353extern int actcapi_manufacturer_req_errh(act2000_card *);
354extern int actcapi_manufacturer_req_msn(act2000_card *);
355extern int actcapi_connect_req(act2000_card *, act2000_chan *, char *, char, int, int);
356extern void actcapi_select_b2_protocol_req(act2000_card *, act2000_chan *);
357extern void actcapi_disconnect_b3_req(act2000_card *, act2000_chan *);
358extern void actcapi_connect_resp(act2000_card *, act2000_chan *, __u8);
359extern void actcapi_dispatch(struct work_struct *);
360#ifdef DEBUG_MSG
361extern void actcapi_debug_msg(struct sk_buff *skb, int);
362#else
363#define actcapi_debug_msg(skb, len)
364#endif
365#endif