xref: /OK3568_Linux_fs/kernel/include/linux/mISDNif.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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