1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Author Karsten Keil <kkeil@novell.com>
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright 2008 by Karsten Keil <kkeil@novell.com>
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * This code is free software; you can redistribute it and/or modify
8*4882a593Smuzhiyun * it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
9*4882a593Smuzhiyun * version 2.1 as published by the Free Software Foundation.
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * This code is distributed in the hope that it will be useful,
12*4882a593Smuzhiyun * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*4882a593Smuzhiyun * GNU LESSER GENERAL PUBLIC LICENSE for more details.
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun */
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #ifndef mISDNIF_H
19*4882a593Smuzhiyun #define mISDNIF_H
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #include <stdarg.h>
22*4882a593Smuzhiyun #include <linux/types.h>
23*4882a593Smuzhiyun #include <linux/errno.h>
24*4882a593Smuzhiyun #include <linux/socket.h>
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun /*
27*4882a593Smuzhiyun * ABI Version 32 bit
28*4882a593Smuzhiyun *
29*4882a593Smuzhiyun * <8 bit> Major version
30*4882a593Smuzhiyun * - changed if any interface become backwards incompatible
31*4882a593Smuzhiyun *
32*4882a593Smuzhiyun * <8 bit> Minor version
33*4882a593Smuzhiyun * - changed if any interface is extended but backwards compatible
34*4882a593Smuzhiyun *
35*4882a593Smuzhiyun * <16 bit> Release number
36*4882a593Smuzhiyun * - should be incremented on every checkin
37*4882a593Smuzhiyun */
38*4882a593Smuzhiyun #define MISDN_MAJOR_VERSION 1
39*4882a593Smuzhiyun #define MISDN_MINOR_VERSION 1
40*4882a593Smuzhiyun #define MISDN_RELEASE 29
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun /* primitives for information exchange
43*4882a593Smuzhiyun * generell format
44*4882a593Smuzhiyun * <16 bit 0 >
45*4882a593Smuzhiyun * <8 bit command>
46*4882a593Smuzhiyun * BIT 8 = 1 LAYER private
47*4882a593Smuzhiyun * BIT 7 = 1 answer
48*4882a593Smuzhiyun * BIT 6 = 1 DATA
49*4882a593Smuzhiyun * <8 bit target layer mask>
50*4882a593Smuzhiyun *
51*4882a593Smuzhiyun * Layer = 00 is reserved for general commands
52*4882a593Smuzhiyun Layer = 01 L2 -> HW
53*4882a593Smuzhiyun Layer = 02 HW -> L2
54*4882a593Smuzhiyun Layer = 04 L3 -> L2
55*4882a593Smuzhiyun Layer = 08 L2 -> L3
56*4882a593Smuzhiyun * Layer = FF is reserved for broadcast commands
57*4882a593Smuzhiyun */
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun #define MISDN_CMDMASK 0xff00
60*4882a593Smuzhiyun #define MISDN_LAYERMASK 0x00ff
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun /* generell commands */
63*4882a593Smuzhiyun #define OPEN_CHANNEL 0x0100
64*4882a593Smuzhiyun #define CLOSE_CHANNEL 0x0200
65*4882a593Smuzhiyun #define CONTROL_CHANNEL 0x0300
66*4882a593Smuzhiyun #define CHECK_DATA 0x0400
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun /* layer 2 -> layer 1 */
69*4882a593Smuzhiyun #define PH_ACTIVATE_REQ 0x0101
70*4882a593Smuzhiyun #define PH_DEACTIVATE_REQ 0x0201
71*4882a593Smuzhiyun #define PH_DATA_REQ 0x2001
72*4882a593Smuzhiyun #define MPH_ACTIVATE_REQ 0x0501
73*4882a593Smuzhiyun #define MPH_DEACTIVATE_REQ 0x0601
74*4882a593Smuzhiyun #define MPH_INFORMATION_REQ 0x0701
75*4882a593Smuzhiyun #define PH_CONTROL_REQ 0x0801
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun /* layer 1 -> layer 2 */
78*4882a593Smuzhiyun #define PH_ACTIVATE_IND 0x0102
79*4882a593Smuzhiyun #define PH_ACTIVATE_CNF 0x4102
80*4882a593Smuzhiyun #define PH_DEACTIVATE_IND 0x0202
81*4882a593Smuzhiyun #define PH_DEACTIVATE_CNF 0x4202
82*4882a593Smuzhiyun #define PH_DATA_IND 0x2002
83*4882a593Smuzhiyun #define PH_DATA_E_IND 0x3002
84*4882a593Smuzhiyun #define MPH_ACTIVATE_IND 0x0502
85*4882a593Smuzhiyun #define MPH_DEACTIVATE_IND 0x0602
86*4882a593Smuzhiyun #define MPH_INFORMATION_IND 0x0702
87*4882a593Smuzhiyun #define PH_DATA_CNF 0x6002
88*4882a593Smuzhiyun #define PH_CONTROL_IND 0x0802
89*4882a593Smuzhiyun #define PH_CONTROL_CNF 0x4802
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun /* layer 3 -> layer 2 */
92*4882a593Smuzhiyun #define DL_ESTABLISH_REQ 0x1004
93*4882a593Smuzhiyun #define DL_RELEASE_REQ 0x1104
94*4882a593Smuzhiyun #define DL_DATA_REQ 0x3004
95*4882a593Smuzhiyun #define DL_UNITDATA_REQ 0x3104
96*4882a593Smuzhiyun #define DL_INFORMATION_REQ 0x0004
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun /* layer 2 -> layer 3 */
99*4882a593Smuzhiyun #define DL_ESTABLISH_IND 0x1008
100*4882a593Smuzhiyun #define DL_ESTABLISH_CNF 0x5008
101*4882a593Smuzhiyun #define DL_RELEASE_IND 0x1108
102*4882a593Smuzhiyun #define DL_RELEASE_CNF 0x5108
103*4882a593Smuzhiyun #define DL_DATA_IND 0x3008
104*4882a593Smuzhiyun #define DL_UNITDATA_IND 0x3108
105*4882a593Smuzhiyun #define DL_INFORMATION_IND 0x0008
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun /* intern layer 2 management */
108*4882a593Smuzhiyun #define MDL_ASSIGN_REQ 0x1804
109*4882a593Smuzhiyun #define MDL_ASSIGN_IND 0x1904
110*4882a593Smuzhiyun #define MDL_REMOVE_REQ 0x1A04
111*4882a593Smuzhiyun #define MDL_REMOVE_IND 0x1B04
112*4882a593Smuzhiyun #define MDL_STATUS_UP_IND 0x1C04
113*4882a593Smuzhiyun #define MDL_STATUS_DOWN_IND 0x1D04
114*4882a593Smuzhiyun #define MDL_STATUS_UI_IND 0x1E04
115*4882a593Smuzhiyun #define MDL_ERROR_IND 0x1F04
116*4882a593Smuzhiyun #define MDL_ERROR_RSP 0x5F04
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun /* intern layer 2 */
119*4882a593Smuzhiyun #define DL_TIMER200_IND 0x7004
120*4882a593Smuzhiyun #define DL_TIMER203_IND 0x7304
121*4882a593Smuzhiyun #define DL_INTERN_MSG 0x7804
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun /* DL_INFORMATION_IND types */
124*4882a593Smuzhiyun #define DL_INFO_L2_CONNECT 0x0001
125*4882a593Smuzhiyun #define DL_INFO_L2_REMOVED 0x0002
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun /* PH_CONTROL types */
128*4882a593Smuzhiyun /* TOUCH TONE IS 0x20XX XX "0"..."9", "A","B","C","D","*","#" */
129*4882a593Smuzhiyun #define DTMF_TONE_VAL 0x2000
130*4882a593Smuzhiyun #define DTMF_TONE_MASK 0x007F
131*4882a593Smuzhiyun #define DTMF_TONE_START 0x2100
132*4882a593Smuzhiyun #define DTMF_TONE_STOP 0x2200
133*4882a593Smuzhiyun #define DTMF_HFC_COEF 0x4000
134*4882a593Smuzhiyun #define DSP_CONF_JOIN 0x2403
135*4882a593Smuzhiyun #define DSP_CONF_SPLIT 0x2404
136*4882a593Smuzhiyun #define DSP_RECEIVE_OFF 0x2405
137*4882a593Smuzhiyun #define DSP_RECEIVE_ON 0x2406
138*4882a593Smuzhiyun #define DSP_ECHO_ON 0x2407
139*4882a593Smuzhiyun #define DSP_ECHO_OFF 0x2408
140*4882a593Smuzhiyun #define DSP_MIX_ON 0x2409
141*4882a593Smuzhiyun #define DSP_MIX_OFF 0x240a
142*4882a593Smuzhiyun #define DSP_DELAY 0x240b
143*4882a593Smuzhiyun #define DSP_JITTER 0x240c
144*4882a593Smuzhiyun #define DSP_TXDATA_ON 0x240d
145*4882a593Smuzhiyun #define DSP_TXDATA_OFF 0x240e
146*4882a593Smuzhiyun #define DSP_TX_DEJITTER 0x240f
147*4882a593Smuzhiyun #define DSP_TX_DEJ_OFF 0x2410
148*4882a593Smuzhiyun #define DSP_TONE_PATT_ON 0x2411
149*4882a593Smuzhiyun #define DSP_TONE_PATT_OFF 0x2412
150*4882a593Smuzhiyun #define DSP_VOL_CHANGE_TX 0x2413
151*4882a593Smuzhiyun #define DSP_VOL_CHANGE_RX 0x2414
152*4882a593Smuzhiyun #define DSP_BF_ENABLE_KEY 0x2415
153*4882a593Smuzhiyun #define DSP_BF_DISABLE 0x2416
154*4882a593Smuzhiyun #define DSP_BF_ACCEPT 0x2416
155*4882a593Smuzhiyun #define DSP_BF_REJECT 0x2417
156*4882a593Smuzhiyun #define DSP_PIPELINE_CFG 0x2418
157*4882a593Smuzhiyun #define HFC_VOL_CHANGE_TX 0x2601
158*4882a593Smuzhiyun #define HFC_VOL_CHANGE_RX 0x2602
159*4882a593Smuzhiyun #define HFC_SPL_LOOP_ON 0x2603
160*4882a593Smuzhiyun #define HFC_SPL_LOOP_OFF 0x2604
161*4882a593Smuzhiyun /* for T30 FAX and analog modem */
162*4882a593Smuzhiyun #define HW_MOD_FRM 0x4000
163*4882a593Smuzhiyun #define HW_MOD_FRH 0x4001
164*4882a593Smuzhiyun #define HW_MOD_FTM 0x4002
165*4882a593Smuzhiyun #define HW_MOD_FTH 0x4003
166*4882a593Smuzhiyun #define HW_MOD_FTS 0x4004
167*4882a593Smuzhiyun #define HW_MOD_CONNECT 0x4010
168*4882a593Smuzhiyun #define HW_MOD_OK 0x4011
169*4882a593Smuzhiyun #define HW_MOD_NOCARR 0x4012
170*4882a593Smuzhiyun #define HW_MOD_FCERROR 0x4013
171*4882a593Smuzhiyun #define HW_MOD_READY 0x4014
172*4882a593Smuzhiyun #define HW_MOD_LASTDATA 0x4015
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun /* DSP_TONE_PATT_ON parameter */
175*4882a593Smuzhiyun #define TONE_OFF 0x0000
176*4882a593Smuzhiyun #define TONE_GERMAN_DIALTONE 0x0001
177*4882a593Smuzhiyun #define TONE_GERMAN_OLDDIALTONE 0x0002
178*4882a593Smuzhiyun #define TONE_AMERICAN_DIALTONE 0x0003
179*4882a593Smuzhiyun #define TONE_GERMAN_DIALPBX 0x0004
180*4882a593Smuzhiyun #define TONE_GERMAN_OLDDIALPBX 0x0005
181*4882a593Smuzhiyun #define TONE_AMERICAN_DIALPBX 0x0006
182*4882a593Smuzhiyun #define TONE_GERMAN_RINGING 0x0007
183*4882a593Smuzhiyun #define TONE_GERMAN_OLDRINGING 0x0008
184*4882a593Smuzhiyun #define TONE_AMERICAN_RINGPBX 0x000b
185*4882a593Smuzhiyun #define TONE_GERMAN_RINGPBX 0x000c
186*4882a593Smuzhiyun #define TONE_GERMAN_OLDRINGPBX 0x000d
187*4882a593Smuzhiyun #define TONE_AMERICAN_RINGING 0x000e
188*4882a593Smuzhiyun #define TONE_GERMAN_BUSY 0x000f
189*4882a593Smuzhiyun #define TONE_GERMAN_OLDBUSY 0x0010
190*4882a593Smuzhiyun #define TONE_AMERICAN_BUSY 0x0011
191*4882a593Smuzhiyun #define TONE_GERMAN_HANGUP 0x0012
192*4882a593Smuzhiyun #define TONE_GERMAN_OLDHANGUP 0x0013
193*4882a593Smuzhiyun #define TONE_AMERICAN_HANGUP 0x0014
194*4882a593Smuzhiyun #define TONE_SPECIAL_INFO 0x0015
195*4882a593Smuzhiyun #define TONE_GERMAN_GASSENBESETZT 0x0016
196*4882a593Smuzhiyun #define TONE_GERMAN_AUFSCHALTTON 0x0016
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun /* MPH_INFORMATION_IND */
199*4882a593Smuzhiyun #define L1_SIGNAL_LOS_OFF 0x0010
200*4882a593Smuzhiyun #define L1_SIGNAL_LOS_ON 0x0011
201*4882a593Smuzhiyun #define L1_SIGNAL_AIS_OFF 0x0012
202*4882a593Smuzhiyun #define L1_SIGNAL_AIS_ON 0x0013
203*4882a593Smuzhiyun #define L1_SIGNAL_RDI_OFF 0x0014
204*4882a593Smuzhiyun #define L1_SIGNAL_RDI_ON 0x0015
205*4882a593Smuzhiyun #define L1_SIGNAL_SLIP_RX 0x0020
206*4882a593Smuzhiyun #define L1_SIGNAL_SLIP_TX 0x0021
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun /*
209*4882a593Smuzhiyun * protocol ids
210*4882a593Smuzhiyun * D channel 1-31
211*4882a593Smuzhiyun * B channel 33 - 63
212*4882a593Smuzhiyun */
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun #define ISDN_P_NONE 0
215*4882a593Smuzhiyun #define ISDN_P_BASE 0
216*4882a593Smuzhiyun #define ISDN_P_TE_S0 0x01
217*4882a593Smuzhiyun #define ISDN_P_NT_S0 0x02
218*4882a593Smuzhiyun #define ISDN_P_TE_E1 0x03
219*4882a593Smuzhiyun #define ISDN_P_NT_E1 0x04
220*4882a593Smuzhiyun #define ISDN_P_TE_UP0 0x05
221*4882a593Smuzhiyun #define ISDN_P_NT_UP0 0x06
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun #define IS_ISDN_P_TE(p) ((p == ISDN_P_TE_S0) || (p == ISDN_P_TE_E1) || \
224*4882a593Smuzhiyun (p == ISDN_P_TE_UP0) || (p == ISDN_P_LAPD_TE))
225*4882a593Smuzhiyun #define IS_ISDN_P_NT(p) ((p == ISDN_P_NT_S0) || (p == ISDN_P_NT_E1) || \
226*4882a593Smuzhiyun (p == ISDN_P_NT_UP0) || (p == ISDN_P_LAPD_NT))
227*4882a593Smuzhiyun #define IS_ISDN_P_S0(p) ((p == ISDN_P_TE_S0) || (p == ISDN_P_NT_S0))
228*4882a593Smuzhiyun #define IS_ISDN_P_E1(p) ((p == ISDN_P_TE_E1) || (p == ISDN_P_NT_E1))
229*4882a593Smuzhiyun #define IS_ISDN_P_UP0(p) ((p == ISDN_P_TE_UP0) || (p == ISDN_P_NT_UP0))
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun #define ISDN_P_LAPD_TE 0x10
233*4882a593Smuzhiyun #define ISDN_P_LAPD_NT 0x11
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun #define ISDN_P_B_MASK 0x1f
236*4882a593Smuzhiyun #define ISDN_P_B_START 0x20
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun #define ISDN_P_B_RAW 0x21
239*4882a593Smuzhiyun #define ISDN_P_B_HDLC 0x22
240*4882a593Smuzhiyun #define ISDN_P_B_X75SLP 0x23
241*4882a593Smuzhiyun #define ISDN_P_B_L2DTMF 0x24
242*4882a593Smuzhiyun #define ISDN_P_B_L2DSP 0x25
243*4882a593Smuzhiyun #define ISDN_P_B_L2DSPHDLC 0x26
244*4882a593Smuzhiyun #define ISDN_P_B_T30_FAX 0x27
245*4882a593Smuzhiyun #define ISDN_P_B_MODEM_ASYNC 0x28
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun #define OPTION_L2_PMX 1
248*4882a593Smuzhiyun #define OPTION_L2_PTP 2
249*4882a593Smuzhiyun #define OPTION_L2_FIXEDTEI 3
250*4882a593Smuzhiyun #define OPTION_L2_CLEANUP 4
251*4882a593Smuzhiyun #define OPTION_L1_HOLD 5
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun /* should be in sync with linux/kobject.h:KOBJ_NAME_LEN */
254*4882a593Smuzhiyun #define MISDN_MAX_IDLEN 20
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun struct mISDNhead {
257*4882a593Smuzhiyun unsigned int prim;
258*4882a593Smuzhiyun unsigned int id;
259*4882a593Smuzhiyun } __packed;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun #define MISDN_HEADER_LEN sizeof(struct mISDNhead)
262*4882a593Smuzhiyun #define MAX_DATA_SIZE 2048
263*4882a593Smuzhiyun #define MAX_DATA_MEM (MAX_DATA_SIZE + MISDN_HEADER_LEN)
264*4882a593Smuzhiyun #define MAX_DFRAME_LEN 260
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun #define MISDN_ID_ADDR_MASK 0xFFFF
267*4882a593Smuzhiyun #define MISDN_ID_TEI_MASK 0xFF00
268*4882a593Smuzhiyun #define MISDN_ID_SAPI_MASK 0x00FF
269*4882a593Smuzhiyun #define MISDN_ID_TEI_ANY 0x7F00
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun #define MISDN_ID_ANY 0xFFFF
272*4882a593Smuzhiyun #define MISDN_ID_NONE 0xFFFE
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun #define GROUP_TEI 127
275*4882a593Smuzhiyun #define TEI_SAPI 63
276*4882a593Smuzhiyun #define CTRL_SAPI 0
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun #define MISDN_MAX_CHANNEL 127
279*4882a593Smuzhiyun #define MISDN_CHMAP_SIZE ((MISDN_MAX_CHANNEL + 1) >> 3)
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun #define SOL_MISDN 0
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun struct sockaddr_mISDN {
284*4882a593Smuzhiyun sa_family_t family;
285*4882a593Smuzhiyun unsigned char dev;
286*4882a593Smuzhiyun unsigned char channel;
287*4882a593Smuzhiyun unsigned char sapi;
288*4882a593Smuzhiyun unsigned char tei;
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun struct mISDNversion {
292*4882a593Smuzhiyun unsigned char major;
293*4882a593Smuzhiyun unsigned char minor;
294*4882a593Smuzhiyun unsigned short release;
295*4882a593Smuzhiyun };
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun struct mISDN_devinfo {
298*4882a593Smuzhiyun u_int id;
299*4882a593Smuzhiyun u_int Dprotocols;
300*4882a593Smuzhiyun u_int Bprotocols;
301*4882a593Smuzhiyun u_int protocol;
302*4882a593Smuzhiyun u_char channelmap[MISDN_CHMAP_SIZE];
303*4882a593Smuzhiyun u_int nrbchan;
304*4882a593Smuzhiyun char name[MISDN_MAX_IDLEN];
305*4882a593Smuzhiyun };
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun struct mISDN_devrename {
308*4882a593Smuzhiyun u_int id;
309*4882a593Smuzhiyun char name[MISDN_MAX_IDLEN]; /* new name */
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun /* MPH_INFORMATION_REQ payload */
313*4882a593Smuzhiyun struct ph_info_ch {
314*4882a593Smuzhiyun __u32 protocol;
315*4882a593Smuzhiyun __u64 Flags;
316*4882a593Smuzhiyun };
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun struct ph_info_dch {
319*4882a593Smuzhiyun struct ph_info_ch ch;
320*4882a593Smuzhiyun __u16 state;
321*4882a593Smuzhiyun __u16 num_bch;
322*4882a593Smuzhiyun };
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun struct ph_info {
325*4882a593Smuzhiyun struct ph_info_dch dch;
326*4882a593Smuzhiyun struct ph_info_ch bch[];
327*4882a593Smuzhiyun };
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun /* timer device ioctl */
330*4882a593Smuzhiyun #define IMADDTIMER _IOR('I', 64, int)
331*4882a593Smuzhiyun #define IMDELTIMER _IOR('I', 65, int)
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun /* socket ioctls */
334*4882a593Smuzhiyun #define IMGETVERSION _IOR('I', 66, int)
335*4882a593Smuzhiyun #define IMGETCOUNT _IOR('I', 67, int)
336*4882a593Smuzhiyun #define IMGETDEVINFO _IOR('I', 68, int)
337*4882a593Smuzhiyun #define IMCTRLREQ _IOR('I', 69, int)
338*4882a593Smuzhiyun #define IMCLEAR_L2 _IOR('I', 70, int)
339*4882a593Smuzhiyun #define IMSETDEVNAME _IOR('I', 71, struct mISDN_devrename)
340*4882a593Smuzhiyun #define IMHOLD_L1 _IOR('I', 72, int)
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun static inline int
test_channelmap(u_int nr,u_char * map)343*4882a593Smuzhiyun test_channelmap(u_int nr, u_char *map)
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun if (nr <= MISDN_MAX_CHANNEL)
346*4882a593Smuzhiyun return map[nr >> 3] & (1 << (nr & 7));
347*4882a593Smuzhiyun else
348*4882a593Smuzhiyun return 0;
349*4882a593Smuzhiyun }
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun static inline void
set_channelmap(u_int nr,u_char * map)352*4882a593Smuzhiyun set_channelmap(u_int nr, u_char *map)
353*4882a593Smuzhiyun {
354*4882a593Smuzhiyun map[nr >> 3] |= (1 << (nr & 7));
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun static inline void
clear_channelmap(u_int nr,u_char * map)358*4882a593Smuzhiyun clear_channelmap(u_int nr, u_char *map)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun map[nr >> 3] &= ~(1 << (nr & 7));
361*4882a593Smuzhiyun }
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun /* CONTROL_CHANNEL parameters */
364*4882a593Smuzhiyun #define MISDN_CTRL_GETOP 0x0000
365*4882a593Smuzhiyun #define MISDN_CTRL_LOOP 0x0001
366*4882a593Smuzhiyun #define MISDN_CTRL_CONNECT 0x0002
367*4882a593Smuzhiyun #define MISDN_CTRL_DISCONNECT 0x0004
368*4882a593Smuzhiyun #define MISDN_CTRL_RX_BUFFER 0x0008
369*4882a593Smuzhiyun #define MISDN_CTRL_PCMCONNECT 0x0010
370*4882a593Smuzhiyun #define MISDN_CTRL_PCMDISCONNECT 0x0020
371*4882a593Smuzhiyun #define MISDN_CTRL_SETPEER 0x0040
372*4882a593Smuzhiyun #define MISDN_CTRL_UNSETPEER 0x0080
373*4882a593Smuzhiyun #define MISDN_CTRL_RX_OFF 0x0100
374*4882a593Smuzhiyun #define MISDN_CTRL_FILL_EMPTY 0x0200
375*4882a593Smuzhiyun #define MISDN_CTRL_GETPEER 0x0400
376*4882a593Smuzhiyun #define MISDN_CTRL_L1_TIMER3 0x0800
377*4882a593Smuzhiyun #define MISDN_CTRL_HW_FEATURES_OP 0x2000
378*4882a593Smuzhiyun #define MISDN_CTRL_HW_FEATURES 0x2001
379*4882a593Smuzhiyun #define MISDN_CTRL_HFC_OP 0x4000
380*4882a593Smuzhiyun #define MISDN_CTRL_HFC_PCM_CONN 0x4001
381*4882a593Smuzhiyun #define MISDN_CTRL_HFC_PCM_DISC 0x4002
382*4882a593Smuzhiyun #define MISDN_CTRL_HFC_CONF_JOIN 0x4003
383*4882a593Smuzhiyun #define MISDN_CTRL_HFC_CONF_SPLIT 0x4004
384*4882a593Smuzhiyun #define MISDN_CTRL_HFC_RECEIVE_OFF 0x4005
385*4882a593Smuzhiyun #define MISDN_CTRL_HFC_RECEIVE_ON 0x4006
386*4882a593Smuzhiyun #define MISDN_CTRL_HFC_ECHOCAN_ON 0x4007
387*4882a593Smuzhiyun #define MISDN_CTRL_HFC_ECHOCAN_OFF 0x4008
388*4882a593Smuzhiyun #define MISDN_CTRL_HFC_WD_INIT 0x4009
389*4882a593Smuzhiyun #define MISDN_CTRL_HFC_WD_RESET 0x400A
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun /* special RX buffer value for MISDN_CTRL_RX_BUFFER request.p1 is the minimum
392*4882a593Smuzhiyun * buffer size request.p2 the maximum. Using MISDN_CTRL_RX_SIZE_IGNORE will
393*4882a593Smuzhiyun * not change the value, but still read back the actual stetting.
394*4882a593Smuzhiyun */
395*4882a593Smuzhiyun #define MISDN_CTRL_RX_SIZE_IGNORE -1
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun /* socket options */
398*4882a593Smuzhiyun #define MISDN_TIME_STAMP 0x0001
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun struct mISDN_ctrl_req {
401*4882a593Smuzhiyun int op;
402*4882a593Smuzhiyun int channel;
403*4882a593Smuzhiyun int p1;
404*4882a593Smuzhiyun int p2;
405*4882a593Smuzhiyun };
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun /* muxer options */
408*4882a593Smuzhiyun #define MISDN_OPT_ALL 1
409*4882a593Smuzhiyun #define MISDN_OPT_TEIMGR 2
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun #ifdef __KERNEL__
412*4882a593Smuzhiyun #include <linux/list.h>
413*4882a593Smuzhiyun #include <linux/skbuff.h>
414*4882a593Smuzhiyun #include <linux/net.h>
415*4882a593Smuzhiyun #include <net/sock.h>
416*4882a593Smuzhiyun #include <linux/completion.h>
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun #define DEBUG_CORE 0x000000ff
419*4882a593Smuzhiyun #define DEBUG_CORE_FUNC 0x00000002
420*4882a593Smuzhiyun #define DEBUG_SOCKET 0x00000004
421*4882a593Smuzhiyun #define DEBUG_MANAGER 0x00000008
422*4882a593Smuzhiyun #define DEBUG_SEND_ERR 0x00000010
423*4882a593Smuzhiyun #define DEBUG_MSG_THREAD 0x00000020
424*4882a593Smuzhiyun #define DEBUG_QUEUE_FUNC 0x00000040
425*4882a593Smuzhiyun #define DEBUG_L1 0x0000ff00
426*4882a593Smuzhiyun #define DEBUG_L1_FSM 0x00000200
427*4882a593Smuzhiyun #define DEBUG_L2 0x00ff0000
428*4882a593Smuzhiyun #define DEBUG_L2_FSM 0x00020000
429*4882a593Smuzhiyun #define DEBUG_L2_CTRL 0x00040000
430*4882a593Smuzhiyun #define DEBUG_L2_RECV 0x00080000
431*4882a593Smuzhiyun #define DEBUG_L2_TEI 0x00100000
432*4882a593Smuzhiyun #define DEBUG_L2_TEIFSM 0x00200000
433*4882a593Smuzhiyun #define DEBUG_TIMER 0x01000000
434*4882a593Smuzhiyun #define DEBUG_CLOCK 0x02000000
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun #define mISDN_HEAD_P(s) ((struct mISDNhead *)&s->cb[0])
437*4882a593Smuzhiyun #define mISDN_HEAD_PRIM(s) (((struct mISDNhead *)&s->cb[0])->prim)
438*4882a593Smuzhiyun #define mISDN_HEAD_ID(s) (((struct mISDNhead *)&s->cb[0])->id)
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun /* socket states */
441*4882a593Smuzhiyun #define MISDN_OPEN 1
442*4882a593Smuzhiyun #define MISDN_BOUND 2
443*4882a593Smuzhiyun #define MISDN_CLOSED 3
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun struct mISDNchannel;
446*4882a593Smuzhiyun struct mISDNdevice;
447*4882a593Smuzhiyun struct mISDNstack;
448*4882a593Smuzhiyun struct mISDNclock;
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun struct channel_req {
451*4882a593Smuzhiyun u_int protocol;
452*4882a593Smuzhiyun struct sockaddr_mISDN adr;
453*4882a593Smuzhiyun struct mISDNchannel *ch;
454*4882a593Smuzhiyun };
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun typedef int (ctrl_func_t)(struct mISDNchannel *, u_int, void *);
457*4882a593Smuzhiyun typedef int (send_func_t)(struct mISDNchannel *, struct sk_buff *);
458*4882a593Smuzhiyun typedef int (create_func_t)(struct channel_req *);
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun struct Bprotocol {
461*4882a593Smuzhiyun struct list_head list;
462*4882a593Smuzhiyun char *name;
463*4882a593Smuzhiyun u_int Bprotocols;
464*4882a593Smuzhiyun create_func_t *create;
465*4882a593Smuzhiyun };
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun struct mISDNchannel {
468*4882a593Smuzhiyun struct list_head list;
469*4882a593Smuzhiyun u_int protocol;
470*4882a593Smuzhiyun u_int nr;
471*4882a593Smuzhiyun u_long opt;
472*4882a593Smuzhiyun u_int addr;
473*4882a593Smuzhiyun struct mISDNstack *st;
474*4882a593Smuzhiyun struct mISDNchannel *peer;
475*4882a593Smuzhiyun send_func_t *send;
476*4882a593Smuzhiyun send_func_t *recv;
477*4882a593Smuzhiyun ctrl_func_t *ctrl;
478*4882a593Smuzhiyun };
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun struct mISDN_sock_list {
481*4882a593Smuzhiyun struct hlist_head head;
482*4882a593Smuzhiyun rwlock_t lock;
483*4882a593Smuzhiyun };
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun struct mISDN_sock {
486*4882a593Smuzhiyun struct sock sk;
487*4882a593Smuzhiyun struct mISDNchannel ch;
488*4882a593Smuzhiyun u_int cmask;
489*4882a593Smuzhiyun struct mISDNdevice *dev;
490*4882a593Smuzhiyun };
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun struct mISDNdevice {
495*4882a593Smuzhiyun struct mISDNchannel D;
496*4882a593Smuzhiyun u_int id;
497*4882a593Smuzhiyun u_int Dprotocols;
498*4882a593Smuzhiyun u_int Bprotocols;
499*4882a593Smuzhiyun u_int nrbchan;
500*4882a593Smuzhiyun u_char channelmap[MISDN_CHMAP_SIZE];
501*4882a593Smuzhiyun struct list_head bchannels;
502*4882a593Smuzhiyun struct mISDNchannel *teimgr;
503*4882a593Smuzhiyun struct device dev;
504*4882a593Smuzhiyun };
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun struct mISDNstack {
507*4882a593Smuzhiyun u_long status;
508*4882a593Smuzhiyun struct mISDNdevice *dev;
509*4882a593Smuzhiyun struct task_struct *thread;
510*4882a593Smuzhiyun struct completion *notify;
511*4882a593Smuzhiyun wait_queue_head_t workq;
512*4882a593Smuzhiyun struct sk_buff_head msgq;
513*4882a593Smuzhiyun struct list_head layer2;
514*4882a593Smuzhiyun struct mISDNchannel *layer1;
515*4882a593Smuzhiyun struct mISDNchannel own;
516*4882a593Smuzhiyun struct mutex lmutex; /* protect lists */
517*4882a593Smuzhiyun struct mISDN_sock_list l1sock;
518*4882a593Smuzhiyun #ifdef MISDN_MSG_STATS
519*4882a593Smuzhiyun u_int msg_cnt;
520*4882a593Smuzhiyun u_int sleep_cnt;
521*4882a593Smuzhiyun u_int stopped_cnt;
522*4882a593Smuzhiyun #endif
523*4882a593Smuzhiyun };
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun typedef int (clockctl_func_t)(void *, int);
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun struct mISDNclock {
528*4882a593Smuzhiyun struct list_head list;
529*4882a593Smuzhiyun char name[64];
530*4882a593Smuzhiyun int pri;
531*4882a593Smuzhiyun clockctl_func_t *ctl;
532*4882a593Smuzhiyun void *priv;
533*4882a593Smuzhiyun };
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun /* global alloc/queue functions */
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun static inline struct sk_buff *
mI_alloc_skb(unsigned int len,gfp_t gfp_mask)538*4882a593Smuzhiyun mI_alloc_skb(unsigned int len, gfp_t gfp_mask)
539*4882a593Smuzhiyun {
540*4882a593Smuzhiyun struct sk_buff *skb;
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun skb = alloc_skb(len + MISDN_HEADER_LEN, gfp_mask);
543*4882a593Smuzhiyun if (likely(skb))
544*4882a593Smuzhiyun skb_reserve(skb, MISDN_HEADER_LEN);
545*4882a593Smuzhiyun return skb;
546*4882a593Smuzhiyun }
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun static inline struct sk_buff *
_alloc_mISDN_skb(u_int prim,u_int id,u_int len,void * dp,gfp_t gfp_mask)549*4882a593Smuzhiyun _alloc_mISDN_skb(u_int prim, u_int id, u_int len, void *dp, gfp_t gfp_mask)
550*4882a593Smuzhiyun {
551*4882a593Smuzhiyun struct sk_buff *skb = mI_alloc_skb(len, gfp_mask);
552*4882a593Smuzhiyun struct mISDNhead *hh;
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun if (!skb)
555*4882a593Smuzhiyun return NULL;
556*4882a593Smuzhiyun if (len)
557*4882a593Smuzhiyun skb_put_data(skb, dp, len);
558*4882a593Smuzhiyun hh = mISDN_HEAD_P(skb);
559*4882a593Smuzhiyun hh->prim = prim;
560*4882a593Smuzhiyun hh->id = id;
561*4882a593Smuzhiyun return skb;
562*4882a593Smuzhiyun }
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun static inline void
_queue_data(struct mISDNchannel * ch,u_int prim,u_int id,u_int len,void * dp,gfp_t gfp_mask)565*4882a593Smuzhiyun _queue_data(struct mISDNchannel *ch, u_int prim,
566*4882a593Smuzhiyun u_int id, u_int len, void *dp, gfp_t gfp_mask)
567*4882a593Smuzhiyun {
568*4882a593Smuzhiyun struct sk_buff *skb;
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun if (!ch->peer)
571*4882a593Smuzhiyun return;
572*4882a593Smuzhiyun skb = _alloc_mISDN_skb(prim, id, len, dp, gfp_mask);
573*4882a593Smuzhiyun if (!skb)
574*4882a593Smuzhiyun return;
575*4882a593Smuzhiyun if (ch->recv(ch->peer, skb))
576*4882a593Smuzhiyun dev_kfree_skb(skb);
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun /* global register/unregister functions */
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun extern int mISDN_register_device(struct mISDNdevice *,
582*4882a593Smuzhiyun struct device *parent, char *name);
583*4882a593Smuzhiyun extern void mISDN_unregister_device(struct mISDNdevice *);
584*4882a593Smuzhiyun extern int mISDN_register_Bprotocol(struct Bprotocol *);
585*4882a593Smuzhiyun extern void mISDN_unregister_Bprotocol(struct Bprotocol *);
586*4882a593Smuzhiyun extern struct mISDNclock *mISDN_register_clock(char *, int, clockctl_func_t *,
587*4882a593Smuzhiyun void *);
588*4882a593Smuzhiyun extern void mISDN_unregister_clock(struct mISDNclock *);
589*4882a593Smuzhiyun
dev_to_mISDN(struct device * dev)590*4882a593Smuzhiyun static inline struct mISDNdevice *dev_to_mISDN(struct device *dev)
591*4882a593Smuzhiyun {
592*4882a593Smuzhiyun if (dev)
593*4882a593Smuzhiyun return dev_get_drvdata(dev);
594*4882a593Smuzhiyun else
595*4882a593Smuzhiyun return NULL;
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun extern void set_channel_address(struct mISDNchannel *, u_int, u_int);
599*4882a593Smuzhiyun extern void mISDN_clock_update(struct mISDNclock *, int, ktime_t *);
600*4882a593Smuzhiyun extern unsigned short mISDN_clock_get(void);
601*4882a593Smuzhiyun extern const char *mISDNDevName4ch(struct mISDNchannel *);
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun #endif /* __KERNEL__ */
604*4882a593Smuzhiyun #endif /* mISDNIF_H */
605