xref: /linux-6.15/include/linux/mISDNif.h (revision 23680f0b)
11b2b03f8SKarsten Keil /*
21b2b03f8SKarsten Keil  *
31b2b03f8SKarsten Keil  * Author	Karsten Keil <[email protected]>
41b2b03f8SKarsten Keil  *
51b2b03f8SKarsten Keil  * Copyright 2008  by Karsten Keil <[email protected]>
61b2b03f8SKarsten Keil  *
71b2b03f8SKarsten Keil  * This code is free software; you can redistribute it and/or modify
81b2b03f8SKarsten Keil  * it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
91b2b03f8SKarsten Keil  * version 2.1 as published by the Free Software Foundation.
101b2b03f8SKarsten Keil  *
111b2b03f8SKarsten Keil  * This code is distributed in the hope that it will be useful,
121b2b03f8SKarsten Keil  * but WITHOUT ANY WARRANTY; without even the implied warranty of
131b2b03f8SKarsten Keil  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141b2b03f8SKarsten Keil  * GNU LESSER GENERAL PUBLIC LICENSE for more details.
151b2b03f8SKarsten Keil  *
161b2b03f8SKarsten Keil  */
171b2b03f8SKarsten Keil 
181b2b03f8SKarsten Keil #ifndef mISDNIF_H
191b2b03f8SKarsten Keil #define mISDNIF_H
201b2b03f8SKarsten Keil 
211b2b03f8SKarsten Keil #include <linux/types.h>
221b2b03f8SKarsten Keil #include <linux/errno.h>
231b2b03f8SKarsten Keil #include <linux/socket.h>
241b2b03f8SKarsten Keil 
251b2b03f8SKarsten Keil /*
261b2b03f8SKarsten Keil  * ABI Version 32 bit
271b2b03f8SKarsten Keil  *
281b2b03f8SKarsten Keil  * <8 bit> Major version
291b2b03f8SKarsten Keil  *		- changed if any interface become backwards incompatible
301b2b03f8SKarsten Keil  *
311b2b03f8SKarsten Keil  * <8 bit> Minor version
321b2b03f8SKarsten Keil  *              - changed if any interface is extended but backwards compatible
331b2b03f8SKarsten Keil  *
341b2b03f8SKarsten Keil  * <16 bit> Release number
351b2b03f8SKarsten Keil  *              - should be incremented on every checkin
361b2b03f8SKarsten Keil  */
371b2b03f8SKarsten Keil #define	MISDN_MAJOR_VERSION	1
388b6015f7SMatthias Urlichs #define	MISDN_MINOR_VERSION	1
39034005a0SKarsten Keil #define MISDN_RELEASE		29
401b2b03f8SKarsten Keil 
411b2b03f8SKarsten Keil /* primitives for information exchange
421b2b03f8SKarsten Keil  * generell format
431b2b03f8SKarsten Keil  * <16  bit  0 >
441b2b03f8SKarsten Keil  * <8  bit command>
451b2b03f8SKarsten Keil  *    BIT 8 = 1 LAYER private
461b2b03f8SKarsten Keil  *    BIT 7 = 1 answer
471b2b03f8SKarsten Keil  *    BIT 6 = 1 DATA
481b2b03f8SKarsten Keil  * <8  bit target layer mask>
491b2b03f8SKarsten Keil  *
501b2b03f8SKarsten Keil  * Layer = 00 is reserved for general commands
511b2b03f8SKarsten Keil    Layer = 01  L2 -> HW
521b2b03f8SKarsten Keil    Layer = 02  HW -> L2
531b2b03f8SKarsten Keil    Layer = 04  L3 -> L2
541b2b03f8SKarsten Keil    Layer = 08  L2 -> L3
551b2b03f8SKarsten Keil  * Layer = FF is reserved for broadcast commands
561b2b03f8SKarsten Keil  */
571b2b03f8SKarsten Keil 
581b2b03f8SKarsten Keil #define MISDN_CMDMASK		0xff00
591b2b03f8SKarsten Keil #define MISDN_LAYERMASK		0x00ff
601b2b03f8SKarsten Keil 
611b2b03f8SKarsten Keil /* generell commands */
621b2b03f8SKarsten Keil #define OPEN_CHANNEL		0x0100
631b2b03f8SKarsten Keil #define CLOSE_CHANNEL		0x0200
641b2b03f8SKarsten Keil #define CONTROL_CHANNEL		0x0300
651b2b03f8SKarsten Keil #define CHECK_DATA		0x0400
661b2b03f8SKarsten Keil 
671b2b03f8SKarsten Keil /* layer 2 -> layer 1 */
681b2b03f8SKarsten Keil #define PH_ACTIVATE_REQ		0x0101
691b2b03f8SKarsten Keil #define PH_DEACTIVATE_REQ	0x0201
701b2b03f8SKarsten Keil #define PH_DATA_REQ		0x2001
711b2b03f8SKarsten Keil #define MPH_ACTIVATE_REQ	0x0501
721b2b03f8SKarsten Keil #define MPH_DEACTIVATE_REQ	0x0601
731b2b03f8SKarsten Keil #define MPH_INFORMATION_REQ	0x0701
741b2b03f8SKarsten Keil #define PH_CONTROL_REQ		0x0801
751b2b03f8SKarsten Keil 
761b2b03f8SKarsten Keil /* layer 1 -> layer 2 */
771b2b03f8SKarsten Keil #define PH_ACTIVATE_IND		0x0102
781b2b03f8SKarsten Keil #define PH_ACTIVATE_CNF		0x4102
791b2b03f8SKarsten Keil #define PH_DEACTIVATE_IND	0x0202
801b2b03f8SKarsten Keil #define PH_DEACTIVATE_CNF	0x4202
811b2b03f8SKarsten Keil #define PH_DATA_IND		0x2002
821f28fa19SMartin Bachem #define PH_DATA_E_IND		0x3002
831b2b03f8SKarsten Keil #define MPH_ACTIVATE_IND	0x0502
841b2b03f8SKarsten Keil #define MPH_DEACTIVATE_IND	0x0602
851b2b03f8SKarsten Keil #define MPH_INFORMATION_IND	0x0702
861b2b03f8SKarsten Keil #define PH_DATA_CNF		0x6002
871b2b03f8SKarsten Keil #define PH_CONTROL_IND		0x0802
881b2b03f8SKarsten Keil #define PH_CONTROL_CNF		0x4802
891b2b03f8SKarsten Keil 
901b2b03f8SKarsten Keil /* layer 3 -> layer 2 */
911b2b03f8SKarsten Keil #define DL_ESTABLISH_REQ	0x1004
921b2b03f8SKarsten Keil #define DL_RELEASE_REQ		0x1104
931b2b03f8SKarsten Keil #define DL_DATA_REQ		0x3004
941b2b03f8SKarsten Keil #define DL_UNITDATA_REQ		0x3104
951b2b03f8SKarsten Keil #define DL_INFORMATION_REQ	0x0004
961b2b03f8SKarsten Keil 
971b2b03f8SKarsten Keil /* layer 2 -> layer 3 */
981b2b03f8SKarsten Keil #define DL_ESTABLISH_IND	0x1008
991b2b03f8SKarsten Keil #define DL_ESTABLISH_CNF	0x5008
1001b2b03f8SKarsten Keil #define DL_RELEASE_IND		0x1108
1011b2b03f8SKarsten Keil #define DL_RELEASE_CNF		0x5108
1021b2b03f8SKarsten Keil #define DL_DATA_IND		0x3008
1031b2b03f8SKarsten Keil #define DL_UNITDATA_IND		0x3108
1041b2b03f8SKarsten Keil #define DL_INFORMATION_IND	0x0008
1051b2b03f8SKarsten Keil 
1063dbda77eSUwe Kleine-Koenig /* intern layer 2 management */
1071b2b03f8SKarsten Keil #define MDL_ASSIGN_REQ		0x1804
1081b2b03f8SKarsten Keil #define MDL_ASSIGN_IND		0x1904
1091b2b03f8SKarsten Keil #define MDL_REMOVE_REQ		0x1A04
1101b2b03f8SKarsten Keil #define MDL_REMOVE_IND		0x1B04
1111b2b03f8SKarsten Keil #define MDL_STATUS_UP_IND	0x1C04
1121b2b03f8SKarsten Keil #define MDL_STATUS_DOWN_IND	0x1D04
1131b2b03f8SKarsten Keil #define MDL_STATUS_UI_IND	0x1E04
1141b2b03f8SKarsten Keil #define MDL_ERROR_IND		0x1F04
1151b2b03f8SKarsten Keil #define MDL_ERROR_RSP		0x5F04
1161b2b03f8SKarsten Keil 
1178423e6b2SKarsten Keil /* intern layer 2 */
1188423e6b2SKarsten Keil #define DL_TIMER200_IND		0x7004
1198423e6b2SKarsten Keil #define DL_TIMER203_IND		0x7304
1208423e6b2SKarsten Keil #define DL_INTERN_MSG		0x7804
1218423e6b2SKarsten Keil 
1221b2b03f8SKarsten Keil /* DL_INFORMATION_IND types */
1231b2b03f8SKarsten Keil #define DL_INFO_L2_CONNECT	0x0001
1241b2b03f8SKarsten Keil #define DL_INFO_L2_REMOVED	0x0002
1251b2b03f8SKarsten Keil 
1261b2b03f8SKarsten Keil /* PH_CONTROL types */
1271b2b03f8SKarsten Keil /* TOUCH TONE IS 0x20XX  XX "0"..."9", "A","B","C","D","*","#" */
1281b2b03f8SKarsten Keil #define DTMF_TONE_VAL		0x2000
1291b2b03f8SKarsten Keil #define DTMF_TONE_MASK		0x007F
1301b2b03f8SKarsten Keil #define DTMF_TONE_START		0x2100
1311b2b03f8SKarsten Keil #define DTMF_TONE_STOP		0x2200
1321b2b03f8SKarsten Keil #define DTMF_HFC_COEF		0x4000
1331b2b03f8SKarsten Keil #define DSP_CONF_JOIN		0x2403
1341b2b03f8SKarsten Keil #define DSP_CONF_SPLIT		0x2404
1351b2b03f8SKarsten Keil #define DSP_RECEIVE_OFF		0x2405
1361b2b03f8SKarsten Keil #define DSP_RECEIVE_ON		0x2406
1371b2b03f8SKarsten Keil #define DSP_ECHO_ON		0x2407
1381b2b03f8SKarsten Keil #define DSP_ECHO_OFF		0x2408
1391b2b03f8SKarsten Keil #define DSP_MIX_ON		0x2409
1401b2b03f8SKarsten Keil #define DSP_MIX_OFF		0x240a
1411b2b03f8SKarsten Keil #define DSP_DELAY		0x240b
1421b2b03f8SKarsten Keil #define DSP_JITTER		0x240c
1431b2b03f8SKarsten Keil #define DSP_TXDATA_ON		0x240d
1441b2b03f8SKarsten Keil #define DSP_TXDATA_OFF		0x240e
1451b2b03f8SKarsten Keil #define DSP_TX_DEJITTER		0x240f
1461b2b03f8SKarsten Keil #define DSP_TX_DEJ_OFF		0x2410
1471b2b03f8SKarsten Keil #define DSP_TONE_PATT_ON	0x2411
1481b2b03f8SKarsten Keil #define DSP_TONE_PATT_OFF	0x2412
1491b2b03f8SKarsten Keil #define DSP_VOL_CHANGE_TX	0x2413
1501b2b03f8SKarsten Keil #define DSP_VOL_CHANGE_RX	0x2414
1511b2b03f8SKarsten Keil #define DSP_BF_ENABLE_KEY	0x2415
1521b2b03f8SKarsten Keil #define DSP_BF_DISABLE		0x2416
1531b2b03f8SKarsten Keil #define DSP_BF_ACCEPT		0x2416
1541b2b03f8SKarsten Keil #define DSP_BF_REJECT		0x2417
1551b2b03f8SKarsten Keil #define DSP_PIPELINE_CFG	0x2418
1561b2b03f8SKarsten Keil #define HFC_VOL_CHANGE_TX	0x2601
1571b2b03f8SKarsten Keil #define HFC_VOL_CHANGE_RX	0x2602
1581b2b03f8SKarsten Keil #define HFC_SPL_LOOP_ON		0x2603
1591b2b03f8SKarsten Keil #define HFC_SPL_LOOP_OFF	0x2604
160da2272c9SKarsten Keil /* for T30 FAX and analog modem */
161da2272c9SKarsten Keil #define HW_MOD_FRM		0x4000
162da2272c9SKarsten Keil #define HW_MOD_FRH		0x4001
163da2272c9SKarsten Keil #define HW_MOD_FTM		0x4002
164da2272c9SKarsten Keil #define HW_MOD_FTH		0x4003
165da2272c9SKarsten Keil #define HW_MOD_FTS		0x4004
166da2272c9SKarsten Keil #define HW_MOD_CONNECT		0x4010
167da2272c9SKarsten Keil #define HW_MOD_OK		0x4011
168da2272c9SKarsten Keil #define HW_MOD_NOCARR		0x4012
169da2272c9SKarsten Keil #define HW_MOD_FCERROR		0x4013
170da2272c9SKarsten Keil #define HW_MOD_READY		0x4014
171da2272c9SKarsten Keil #define HW_MOD_LASTDATA		0x4015
1721b2b03f8SKarsten Keil 
1731b2b03f8SKarsten Keil /* DSP_TONE_PATT_ON parameter */
1741b2b03f8SKarsten Keil #define TONE_OFF			0x0000
1751b2b03f8SKarsten Keil #define TONE_GERMAN_DIALTONE		0x0001
1761b2b03f8SKarsten Keil #define TONE_GERMAN_OLDDIALTONE		0x0002
1771b2b03f8SKarsten Keil #define TONE_AMERICAN_DIALTONE		0x0003
1781b2b03f8SKarsten Keil #define TONE_GERMAN_DIALPBX		0x0004
1791b2b03f8SKarsten Keil #define TONE_GERMAN_OLDDIALPBX		0x0005
1801b2b03f8SKarsten Keil #define TONE_AMERICAN_DIALPBX		0x0006
1811b2b03f8SKarsten Keil #define TONE_GERMAN_RINGING		0x0007
1821b2b03f8SKarsten Keil #define TONE_GERMAN_OLDRINGING		0x0008
1831b2b03f8SKarsten Keil #define TONE_AMERICAN_RINGPBX		0x000b
1841b2b03f8SKarsten Keil #define TONE_GERMAN_RINGPBX		0x000c
1851b2b03f8SKarsten Keil #define TONE_GERMAN_OLDRINGPBX		0x000d
1861b2b03f8SKarsten Keil #define TONE_AMERICAN_RINGING		0x000e
1871b2b03f8SKarsten Keil #define TONE_GERMAN_BUSY		0x000f
1881b2b03f8SKarsten Keil #define TONE_GERMAN_OLDBUSY		0x0010
1891b2b03f8SKarsten Keil #define TONE_AMERICAN_BUSY		0x0011
1901b2b03f8SKarsten Keil #define TONE_GERMAN_HANGUP		0x0012
1911b2b03f8SKarsten Keil #define TONE_GERMAN_OLDHANGUP		0x0013
1921b2b03f8SKarsten Keil #define TONE_AMERICAN_HANGUP		0x0014
1931b2b03f8SKarsten Keil #define TONE_SPECIAL_INFO		0x0015
1941b2b03f8SKarsten Keil #define TONE_GERMAN_GASSENBESETZT	0x0016
1951b2b03f8SKarsten Keil #define TONE_GERMAN_AUFSCHALTTON	0x0016
1961b2b03f8SKarsten Keil 
1971b2b03f8SKarsten Keil /* MPH_INFORMATION_IND */
1981b2b03f8SKarsten Keil #define L1_SIGNAL_LOS_OFF	0x0010
1991b2b03f8SKarsten Keil #define L1_SIGNAL_LOS_ON	0x0011
2001b2b03f8SKarsten Keil #define L1_SIGNAL_AIS_OFF	0x0012
2011b2b03f8SKarsten Keil #define L1_SIGNAL_AIS_ON	0x0013
2021b2b03f8SKarsten Keil #define L1_SIGNAL_RDI_OFF	0x0014
2031b2b03f8SKarsten Keil #define L1_SIGNAL_RDI_ON	0x0015
2041b2b03f8SKarsten Keil #define L1_SIGNAL_SLIP_RX	0x0020
2051b2b03f8SKarsten Keil #define L1_SIGNAL_SLIP_TX	0x0021
2061b2b03f8SKarsten Keil 
2071b2b03f8SKarsten Keil /*
2081b2b03f8SKarsten Keil  * protocol ids
2091b2b03f8SKarsten Keil  * D channel 1-31
2101b2b03f8SKarsten Keil  * B channel 33 - 63
2111b2b03f8SKarsten Keil  */
2121b2b03f8SKarsten Keil 
2131b2b03f8SKarsten Keil #define ISDN_P_NONE		0
2141b2b03f8SKarsten Keil #define ISDN_P_BASE		0
2151b2b03f8SKarsten Keil #define ISDN_P_TE_S0		0x01
2161b2b03f8SKarsten Keil #define ISDN_P_NT_S0  		0x02
2171b2b03f8SKarsten Keil #define ISDN_P_TE_E1		0x03
2181b2b03f8SKarsten Keil #define ISDN_P_NT_E1  		0x04
21902282eeeSMartin Bachem #define ISDN_P_TE_UP0		0x05
22002282eeeSMartin Bachem #define ISDN_P_NT_UP0		0x06
22102282eeeSMartin Bachem 
22202282eeeSMartin Bachem #define IS_ISDN_P_TE(p) ((p == ISDN_P_TE_S0) || (p == ISDN_P_TE_E1) || \
2231b4d3312SAndreas Eversberg 				(p == ISDN_P_TE_UP0) || (p == ISDN_P_LAPD_TE))
22402282eeeSMartin Bachem #define IS_ISDN_P_NT(p) ((p == ISDN_P_NT_S0) || (p == ISDN_P_NT_E1) || \
2251b4d3312SAndreas Eversberg 				(p == ISDN_P_NT_UP0) || (p == ISDN_P_LAPD_NT))
22602282eeeSMartin Bachem #define IS_ISDN_P_S0(p) ((p == ISDN_P_TE_S0) || (p == ISDN_P_NT_S0))
22702282eeeSMartin Bachem #define IS_ISDN_P_E1(p) ((p == ISDN_P_TE_E1) || (p == ISDN_P_NT_E1))
22802282eeeSMartin Bachem #define IS_ISDN_P_UP0(p) ((p == ISDN_P_TE_UP0) || (p == ISDN_P_NT_UP0))
22902282eeeSMartin Bachem 
23002282eeeSMartin Bachem 
2311b2b03f8SKarsten Keil #define ISDN_P_LAPD_TE		0x10
2321b2b03f8SKarsten Keil #define	ISDN_P_LAPD_NT		0x11
2331b2b03f8SKarsten Keil 
2341b2b03f8SKarsten Keil #define ISDN_P_B_MASK		0x1f
2351b2b03f8SKarsten Keil #define ISDN_P_B_START		0x20
2361b2b03f8SKarsten Keil 
2371b2b03f8SKarsten Keil #define ISDN_P_B_RAW		0x21
2381b2b03f8SKarsten Keil #define ISDN_P_B_HDLC		0x22
2391b2b03f8SKarsten Keil #define ISDN_P_B_X75SLP		0x23
2401b2b03f8SKarsten Keil #define ISDN_P_B_L2DTMF		0x24
2411b2b03f8SKarsten Keil #define ISDN_P_B_L2DSP		0x25
2421b2b03f8SKarsten Keil #define ISDN_P_B_L2DSPHDLC	0x26
243da2272c9SKarsten Keil #define ISDN_P_B_T30_FAX	0x27
244da2272c9SKarsten Keil #define ISDN_P_B_MODEM_ASYNC	0x28
2451b2b03f8SKarsten Keil 
2461b2b03f8SKarsten Keil #define OPTION_L2_PMX		1
2471b2b03f8SKarsten Keil #define OPTION_L2_PTP		2
2481b2b03f8SKarsten Keil #define OPTION_L2_FIXEDTEI	3
2491b2b03f8SKarsten Keil #define OPTION_L2_CLEANUP	4
250e73f6b22SAndreas Eversberg #define OPTION_L1_HOLD		5
2511b2b03f8SKarsten Keil 
2521b2b03f8SKarsten Keil /* should be in sync with linux/kobject.h:KOBJ_NAME_LEN */
2531b2b03f8SKarsten Keil #define MISDN_MAX_IDLEN		20
2541b2b03f8SKarsten Keil 
2551b2b03f8SKarsten Keil struct mISDNhead {
2561b2b03f8SKarsten Keil 	unsigned int	prim;
2571b2b03f8SKarsten Keil 	unsigned int	id;
258bc10502dSEric Dumazet }  __packed;
2591b2b03f8SKarsten Keil 
2601b2b03f8SKarsten Keil #define MISDN_HEADER_LEN	sizeof(struct mISDNhead)
2611b2b03f8SKarsten Keil #define MAX_DATA_SIZE		2048
2621b2b03f8SKarsten Keil #define MAX_DATA_MEM		(MAX_DATA_SIZE + MISDN_HEADER_LEN)
2631b2b03f8SKarsten Keil #define MAX_DFRAME_LEN		260
2641b2b03f8SKarsten Keil 
2651b2b03f8SKarsten Keil #define MISDN_ID_ADDR_MASK	0xFFFF
2661b2b03f8SKarsten Keil #define MISDN_ID_TEI_MASK	0xFF00
2671b2b03f8SKarsten Keil #define MISDN_ID_SAPI_MASK	0x00FF
2681b2b03f8SKarsten Keil #define MISDN_ID_TEI_ANY	0x7F00
2691b2b03f8SKarsten Keil 
2701b2b03f8SKarsten Keil #define MISDN_ID_ANY		0xFFFF
2711b2b03f8SKarsten Keil #define MISDN_ID_NONE		0xFFFE
2721b2b03f8SKarsten Keil 
2731b2b03f8SKarsten Keil #define GROUP_TEI		127
2741b2b03f8SKarsten Keil #define TEI_SAPI		63
2751b2b03f8SKarsten Keil #define CTRL_SAPI		0
2761b2b03f8SKarsten Keil 
277ff4cc1deSKarsten Keil #define MISDN_MAX_CHANNEL	127
278ff4cc1deSKarsten Keil #define MISDN_CHMAP_SIZE	((MISDN_MAX_CHANNEL + 1) >> 3)
2791b2b03f8SKarsten Keil 
2801b2b03f8SKarsten Keil #define SOL_MISDN	0
2811b2b03f8SKarsten Keil 
2821b2b03f8SKarsten Keil struct sockaddr_mISDN {
2831b2b03f8SKarsten Keil 	sa_family_t    family;
2841b2b03f8SKarsten Keil 	unsigned char	dev;
2851b2b03f8SKarsten Keil 	unsigned char	channel;
2861b2b03f8SKarsten Keil 	unsigned char	sapi;
2871b2b03f8SKarsten Keil 	unsigned char	tei;
2881b2b03f8SKarsten Keil };
2891b2b03f8SKarsten Keil 
2901b2b03f8SKarsten Keil struct mISDNversion {
2911b2b03f8SKarsten Keil 	unsigned char	major;
2921b2b03f8SKarsten Keil 	unsigned char	minor;
2931b2b03f8SKarsten Keil 	unsigned short	release;
2941b2b03f8SKarsten Keil };
2951b2b03f8SKarsten Keil 
2961b2b03f8SKarsten Keil struct mISDN_devinfo {
2971b2b03f8SKarsten Keil 	u_int			id;
2981b2b03f8SKarsten Keil 	u_int			Dprotocols;
2991b2b03f8SKarsten Keil 	u_int			Bprotocols;
3001b2b03f8SKarsten Keil 	u_int			protocol;
301ff4cc1deSKarsten Keil 	u_char			channelmap[MISDN_CHMAP_SIZE];
3021b2b03f8SKarsten Keil 	u_int			nrbchan;
3031b2b03f8SKarsten Keil 	char			name[MISDN_MAX_IDLEN];
3041b2b03f8SKarsten Keil };
3051b2b03f8SKarsten Keil 
3068b6015f7SMatthias Urlichs struct mISDN_devrename {
3078b6015f7SMatthias Urlichs 	u_int			id;
3088b6015f7SMatthias Urlichs 	char			name[MISDN_MAX_IDLEN]; /* new name */
3098b6015f7SMatthias Urlichs };
3108b6015f7SMatthias Urlichs 
3113f75e84aSMartin Bachem /* MPH_INFORMATION_REQ payload */
3123f75e84aSMartin Bachem struct ph_info_ch {
3133f75e84aSMartin Bachem 	__u32 protocol;
3143f75e84aSMartin Bachem 	__u64 Flags;
3153f75e84aSMartin Bachem };
3163f75e84aSMartin Bachem 
3173f75e84aSMartin Bachem struct ph_info_dch {
3183f75e84aSMartin Bachem 	struct ph_info_ch ch;
3193f75e84aSMartin Bachem 	__u16 state;
3203f75e84aSMartin Bachem 	__u16 num_bch;
3213f75e84aSMartin Bachem };
3223f75e84aSMartin Bachem 
3233f75e84aSMartin Bachem struct ph_info {
3243f75e84aSMartin Bachem 	struct ph_info_dch dch;
3253f75e84aSMartin Bachem 	struct ph_info_ch  bch[];
3263f75e84aSMartin Bachem };
3273f75e84aSMartin Bachem 
3288b6015f7SMatthias Urlichs /* timer device ioctl */
3298b6015f7SMatthias Urlichs #define IMADDTIMER	_IOR('I', 64, int)
3308b6015f7SMatthias Urlichs #define IMDELTIMER	_IOR('I', 65, int)
3318b6015f7SMatthias Urlichs 
3328b6015f7SMatthias Urlichs /* socket ioctls */
3338b6015f7SMatthias Urlichs #define	IMGETVERSION	_IOR('I', 66, int)
3348b6015f7SMatthias Urlichs #define	IMGETCOUNT	_IOR('I', 67, int)
3358b6015f7SMatthias Urlichs #define IMGETDEVINFO	_IOR('I', 68, int)
3368b6015f7SMatthias Urlichs #define IMCTRLREQ	_IOR('I', 69, int)
3378b6015f7SMatthias Urlichs #define IMCLEAR_L2	_IOR('I', 70, int)
3388b6015f7SMatthias Urlichs #define IMSETDEVNAME	_IOR('I', 71, struct mISDN_devrename)
339e73f6b22SAndreas Eversberg #define IMHOLD_L1	_IOR('I', 72, int)
3408b6015f7SMatthias Urlichs 
341ff4cc1deSKarsten Keil static inline int
test_channelmap(u_int nr,u_char * map)342ff4cc1deSKarsten Keil test_channelmap(u_int nr, u_char *map)
343ff4cc1deSKarsten Keil {
344ff4cc1deSKarsten Keil 	if (nr <= MISDN_MAX_CHANNEL)
345ff4cc1deSKarsten Keil 		return map[nr >> 3] & (1 << (nr & 7));
346ff4cc1deSKarsten Keil 	else
347ff4cc1deSKarsten Keil 		return 0;
348ff4cc1deSKarsten Keil }
349ff4cc1deSKarsten Keil 
350ff4cc1deSKarsten Keil static inline void
set_channelmap(u_int nr,u_char * map)351ff4cc1deSKarsten Keil set_channelmap(u_int nr, u_char *map)
352ff4cc1deSKarsten Keil {
353ff4cc1deSKarsten Keil 	map[nr >> 3] |= (1 << (nr & 7));
354ff4cc1deSKarsten Keil }
355ff4cc1deSKarsten Keil 
356ff4cc1deSKarsten Keil static inline void
clear_channelmap(u_int nr,u_char * map)357ff4cc1deSKarsten Keil clear_channelmap(u_int nr, u_char *map)
358ff4cc1deSKarsten Keil {
359ff4cc1deSKarsten Keil 	map[nr >> 3] &= ~(1 << (nr & 7));
360ff4cc1deSKarsten Keil }
361ff4cc1deSKarsten Keil 
3621b2b03f8SKarsten Keil /* CONTROL_CHANNEL parameters */
3631b2b03f8SKarsten Keil #define MISDN_CTRL_GETOP		0x0000
3641b2b03f8SKarsten Keil #define MISDN_CTRL_LOOP			0x0001
3651b2b03f8SKarsten Keil #define MISDN_CTRL_CONNECT		0x0002
3661b2b03f8SKarsten Keil #define MISDN_CTRL_DISCONNECT		0x0004
367034005a0SKarsten Keil #define MISDN_CTRL_RX_BUFFER		0x0008
3681b2b03f8SKarsten Keil #define MISDN_CTRL_PCMCONNECT		0x0010
3691b2b03f8SKarsten Keil #define MISDN_CTRL_PCMDISCONNECT	0x0020
3701b2b03f8SKarsten Keil #define MISDN_CTRL_SETPEER		0x0040
3711b2b03f8SKarsten Keil #define MISDN_CTRL_UNSETPEER		0x0080
3721b2b03f8SKarsten Keil #define MISDN_CTRL_RX_OFF		0x0100
3738dd2f36fSAndreas Eversberg #define MISDN_CTRL_FILL_EMPTY		0x0200
3741b4d3312SAndreas Eversberg #define MISDN_CTRL_GETPEER		0x0400
375c626c127SKarsten Keil #define MISDN_CTRL_L1_TIMER3		0x0800
3761b2b03f8SKarsten Keil #define MISDN_CTRL_HW_FEATURES_OP	0x2000
3771b2b03f8SKarsten Keil #define MISDN_CTRL_HW_FEATURES		0x2001
3781b2b03f8SKarsten Keil #define MISDN_CTRL_HFC_OP		0x4000
3791b2b03f8SKarsten Keil #define MISDN_CTRL_HFC_PCM_CONN		0x4001
3801b2b03f8SKarsten Keil #define MISDN_CTRL_HFC_PCM_DISC		0x4002
3811b2b03f8SKarsten Keil #define MISDN_CTRL_HFC_CONF_JOIN	0x4003
3821b2b03f8SKarsten Keil #define MISDN_CTRL_HFC_CONF_SPLIT	0x4004
3831b2b03f8SKarsten Keil #define MISDN_CTRL_HFC_RECEIVE_OFF	0x4005
3841b2b03f8SKarsten Keil #define MISDN_CTRL_HFC_RECEIVE_ON	0x4006
3851b2b03f8SKarsten Keil #define MISDN_CTRL_HFC_ECHOCAN_ON 	0x4007
3861b2b03f8SKarsten Keil #define MISDN_CTRL_HFC_ECHOCAN_OFF 	0x4008
3877df3bb8fSAndreas Eversberg #define MISDN_CTRL_HFC_WD_INIT		0x4009
3887df3bb8fSAndreas Eversberg #define MISDN_CTRL_HFC_WD_RESET		0x400A
3891b2b03f8SKarsten Keil 
390034005a0SKarsten Keil /* special RX buffer value for MISDN_CTRL_RX_BUFFER request.p1 is the minimum
391034005a0SKarsten Keil  * buffer size request.p2 the maximum. Using  MISDN_CTRL_RX_SIZE_IGNORE will
392034005a0SKarsten Keil  * not change the value, but still read back the actual stetting.
393034005a0SKarsten Keil  */
394034005a0SKarsten Keil #define MISDN_CTRL_RX_SIZE_IGNORE	-1
395034005a0SKarsten Keil 
3961b2b03f8SKarsten Keil /* socket options */
3971b2b03f8SKarsten Keil #define MISDN_TIME_STAMP		0x0001
3981b2b03f8SKarsten Keil 
3991b2b03f8SKarsten Keil struct mISDN_ctrl_req {
4001b2b03f8SKarsten Keil 	int		op;
4011b2b03f8SKarsten Keil 	int		channel;
4021b2b03f8SKarsten Keil 	int		p1;
4031b2b03f8SKarsten Keil 	int		p2;
4041b2b03f8SKarsten Keil };
4051b2b03f8SKarsten Keil 
4061b2b03f8SKarsten Keil /* muxer options */
4071b2b03f8SKarsten Keil #define MISDN_OPT_ALL		1
4081b2b03f8SKarsten Keil #define MISDN_OPT_TEIMGR	2
4091b2b03f8SKarsten Keil 
4101b2b03f8SKarsten Keil #ifdef __KERNEL__
4111b2b03f8SKarsten Keil #include <linux/list.h>
4121b2b03f8SKarsten Keil #include <linux/skbuff.h>
4131b2b03f8SKarsten Keil #include <linux/net.h>
4141b2b03f8SKarsten Keil #include <net/sock.h>
4151b2b03f8SKarsten Keil #include <linux/completion.h>
4161b2b03f8SKarsten Keil 
4171b2b03f8SKarsten Keil #define DEBUG_CORE		0x000000ff
4181b2b03f8SKarsten Keil #define DEBUG_CORE_FUNC		0x00000002
4191b2b03f8SKarsten Keil #define DEBUG_SOCKET		0x00000004
4201b2b03f8SKarsten Keil #define DEBUG_MANAGER		0x00000008
4211b2b03f8SKarsten Keil #define DEBUG_SEND_ERR		0x00000010
4221b2b03f8SKarsten Keil #define DEBUG_MSG_THREAD	0x00000020
4231b2b03f8SKarsten Keil #define DEBUG_QUEUE_FUNC	0x00000040
4241b2b03f8SKarsten Keil #define DEBUG_L1		0x0000ff00
4251b2b03f8SKarsten Keil #define DEBUG_L1_FSM		0x00000200
4261b2b03f8SKarsten Keil #define DEBUG_L2		0x00ff0000
4271b2b03f8SKarsten Keil #define DEBUG_L2_FSM		0x00020000
4281b2b03f8SKarsten Keil #define DEBUG_L2_CTRL		0x00040000
4291b2b03f8SKarsten Keil #define DEBUG_L2_RECV		0x00080000
4301b2b03f8SKarsten Keil #define DEBUG_L2_TEI		0x00100000
4311b2b03f8SKarsten Keil #define DEBUG_L2_TEIFSM		0x00200000
4321b2b03f8SKarsten Keil #define DEBUG_TIMER		0x01000000
4333bd69ad1SAndreas Eversberg #define DEBUG_CLOCK		0x02000000
4341b2b03f8SKarsten Keil 
4351b2b03f8SKarsten Keil #define mISDN_HEAD_P(s)		((struct mISDNhead *)&s->cb[0])
4361b2b03f8SKarsten Keil #define mISDN_HEAD_PRIM(s)	(((struct mISDNhead *)&s->cb[0])->prim)
4371b2b03f8SKarsten Keil #define mISDN_HEAD_ID(s)	(((struct mISDNhead *)&s->cb[0])->id)
4381b2b03f8SKarsten Keil 
4391b2b03f8SKarsten Keil /* socket states */
4401b2b03f8SKarsten Keil #define MISDN_OPEN	1
4411b2b03f8SKarsten Keil #define MISDN_BOUND	2
4421b2b03f8SKarsten Keil #define MISDN_CLOSED	3
4431b2b03f8SKarsten Keil 
4441b2b03f8SKarsten Keil struct mISDNchannel;
4451b2b03f8SKarsten Keil struct mISDNdevice;
4461b2b03f8SKarsten Keil struct mISDNstack;
4473bd69ad1SAndreas Eversberg struct mISDNclock;
4481b2b03f8SKarsten Keil 
4491b2b03f8SKarsten Keil struct channel_req {
4501b2b03f8SKarsten Keil 	u_int			protocol;
4511b2b03f8SKarsten Keil 	struct sockaddr_mISDN	adr;
4521b2b03f8SKarsten Keil 	struct mISDNchannel	*ch;
4531b2b03f8SKarsten Keil };
4541b2b03f8SKarsten Keil 
4551b2b03f8SKarsten Keil typedef	int	(ctrl_func_t)(struct mISDNchannel *, u_int, void *);
4561b2b03f8SKarsten Keil typedef	int	(send_func_t)(struct mISDNchannel *, struct sk_buff *);
4571b2b03f8SKarsten Keil typedef int	(create_func_t)(struct channel_req *);
4581b2b03f8SKarsten Keil 
4591b2b03f8SKarsten Keil struct Bprotocol {
4601b2b03f8SKarsten Keil 	struct list_head	list;
4611b2b03f8SKarsten Keil 	char			*name;
4621b2b03f8SKarsten Keil 	u_int			Bprotocols;
4631b2b03f8SKarsten Keil 	create_func_t		*create;
4641b2b03f8SKarsten Keil };
4651b2b03f8SKarsten Keil 
4661b2b03f8SKarsten Keil struct mISDNchannel {
4671b2b03f8SKarsten Keil 	struct list_head	list;
4681b2b03f8SKarsten Keil 	u_int			protocol;
4691b2b03f8SKarsten Keil 	u_int			nr;
4701b2b03f8SKarsten Keil 	u_long			opt;
4711b2b03f8SKarsten Keil 	u_int			addr;
4721b2b03f8SKarsten Keil 	struct mISDNstack	*st;
4731b2b03f8SKarsten Keil 	struct mISDNchannel	*peer;
4741b2b03f8SKarsten Keil 	send_func_t		*send;
4751b2b03f8SKarsten Keil 	send_func_t		*recv;
4761b2b03f8SKarsten Keil 	ctrl_func_t		*ctrl;
4771b2b03f8SKarsten Keil };
4781b2b03f8SKarsten Keil 
4791b2b03f8SKarsten Keil struct mISDN_sock_list {
4801b2b03f8SKarsten Keil 	struct hlist_head	head;
4811b2b03f8SKarsten Keil 	rwlock_t		lock;
4821b2b03f8SKarsten Keil };
4831b2b03f8SKarsten Keil 
4841b2b03f8SKarsten Keil struct mISDN_sock {
4851b2b03f8SKarsten Keil 	struct sock		sk;
4861b2b03f8SKarsten Keil 	struct mISDNchannel	ch;
4871b2b03f8SKarsten Keil 	u_int			cmask;
4881b2b03f8SKarsten Keil 	struct mISDNdevice	*dev;
4891b2b03f8SKarsten Keil };
4901b2b03f8SKarsten Keil 
4911b2b03f8SKarsten Keil 
4921b2b03f8SKarsten Keil 
4931b2b03f8SKarsten Keil struct mISDNdevice {
4941b2b03f8SKarsten Keil 	struct mISDNchannel	D;
4951b2b03f8SKarsten Keil 	u_int			id;
4961b2b03f8SKarsten Keil 	u_int			Dprotocols;
4971b2b03f8SKarsten Keil 	u_int			Bprotocols;
4981b2b03f8SKarsten Keil 	u_int			nrbchan;
499ff4cc1deSKarsten Keil 	u_char			channelmap[MISDN_CHMAP_SIZE];
5001b2b03f8SKarsten Keil 	struct list_head	bchannels;
5011b2b03f8SKarsten Keil 	struct mISDNchannel	*teimgr;
5021b2b03f8SKarsten Keil 	struct device		dev;
5031b2b03f8SKarsten Keil };
5041b2b03f8SKarsten Keil 
5051b2b03f8SKarsten Keil struct mISDNstack {
5061b2b03f8SKarsten Keil 	u_long			status;
5071b2b03f8SKarsten Keil 	struct mISDNdevice	*dev;
5081b2b03f8SKarsten Keil 	struct task_struct	*thread;
5091b2b03f8SKarsten Keil 	struct completion	*notify;
5101b2b03f8SKarsten Keil 	wait_queue_head_t	workq;
5111b2b03f8SKarsten Keil 	struct sk_buff_head	msgq;
5121b2b03f8SKarsten Keil 	struct list_head	layer2;
5131b2b03f8SKarsten Keil 	struct mISDNchannel	*layer1;
5141b2b03f8SKarsten Keil 	struct mISDNchannel	own;
5151b2b03f8SKarsten Keil 	struct mutex		lmutex; /* protect lists */
5161b2b03f8SKarsten Keil 	struct mISDN_sock_list	l1sock;
5171b2b03f8SKarsten Keil #ifdef MISDN_MSG_STATS
5181b2b03f8SKarsten Keil 	u_int			msg_cnt;
5191b2b03f8SKarsten Keil 	u_int			sleep_cnt;
5201b2b03f8SKarsten Keil 	u_int			stopped_cnt;
5211b2b03f8SKarsten Keil #endif
5221b2b03f8SKarsten Keil };
5231b2b03f8SKarsten Keil 
5243bd69ad1SAndreas Eversberg typedef	int	(clockctl_func_t)(void *, int);
5253bd69ad1SAndreas Eversberg 
5263bd69ad1SAndreas Eversberg struct	mISDNclock {
5273bd69ad1SAndreas Eversberg 	struct list_head	list;
5283bd69ad1SAndreas Eversberg 	char			name[64];
5293bd69ad1SAndreas Eversberg 	int			pri;
5303bd69ad1SAndreas Eversberg 	clockctl_func_t		*ctl;
5313bd69ad1SAndreas Eversberg 	void			*priv;
5323bd69ad1SAndreas Eversberg };
5333bd69ad1SAndreas Eversberg 
534ff4cc1deSKarsten Keil /* global alloc/queue functions */
5351b2b03f8SKarsten Keil 
5361b2b03f8SKarsten Keil static inline struct sk_buff *
mI_alloc_skb(unsigned int len,gfp_t gfp_mask)5371b2b03f8SKarsten Keil mI_alloc_skb(unsigned int len, gfp_t gfp_mask)
5381b2b03f8SKarsten Keil {
5391b2b03f8SKarsten Keil 	struct sk_buff	*skb;
5401b2b03f8SKarsten Keil 
5411b2b03f8SKarsten Keil 	skb = alloc_skb(len + MISDN_HEADER_LEN, gfp_mask);
5421b2b03f8SKarsten Keil 	if (likely(skb))
5431b2b03f8SKarsten Keil 		skb_reserve(skb, MISDN_HEADER_LEN);
5441b2b03f8SKarsten Keil 	return skb;
5451b2b03f8SKarsten Keil }
5461b2b03f8SKarsten Keil 
5471b2b03f8SKarsten Keil static inline struct sk_buff *
_alloc_mISDN_skb(u_int prim,u_int id,u_int len,void * dp,gfp_t gfp_mask)5481b2b03f8SKarsten Keil _alloc_mISDN_skb(u_int prim, u_int id, u_int len, void *dp, gfp_t gfp_mask)
5491b2b03f8SKarsten Keil {
5501b2b03f8SKarsten Keil 	struct sk_buff	*skb = mI_alloc_skb(len, gfp_mask);
5511b2b03f8SKarsten Keil 	struct mISDNhead *hh;
5521b2b03f8SKarsten Keil 
5531b2b03f8SKarsten Keil 	if (!skb)
5541b2b03f8SKarsten Keil 		return NULL;
5551b2b03f8SKarsten Keil 	if (len)
55659ae1d12SJohannes Berg 		skb_put_data(skb, dp, len);
5571b2b03f8SKarsten Keil 	hh = mISDN_HEAD_P(skb);
5581b2b03f8SKarsten Keil 	hh->prim = prim;
5591b2b03f8SKarsten Keil 	hh->id = id;
5601b2b03f8SKarsten Keil 	return skb;
5611b2b03f8SKarsten Keil }
5621b2b03f8SKarsten Keil 
5631b2b03f8SKarsten Keil static inline void
_queue_data(struct mISDNchannel * ch,u_int prim,u_int id,u_int len,void * dp,gfp_t gfp_mask)5641b2b03f8SKarsten Keil _queue_data(struct mISDNchannel *ch, u_int prim,
5651b2b03f8SKarsten Keil     u_int id, u_int len, void *dp, gfp_t gfp_mask)
5661b2b03f8SKarsten Keil {
5671b2b03f8SKarsten Keil 	struct sk_buff		*skb;
5681b2b03f8SKarsten Keil 
5691b2b03f8SKarsten Keil 	if (!ch->peer)
5701b2b03f8SKarsten Keil 		return;
5711b2b03f8SKarsten Keil 	skb = _alloc_mISDN_skb(prim, id, len, dp, gfp_mask);
5721b2b03f8SKarsten Keil 	if (!skb)
5731b2b03f8SKarsten Keil 		return;
5741b2b03f8SKarsten Keil 	if (ch->recv(ch->peer, skb))
5751b2b03f8SKarsten Keil 		dev_kfree_skb(skb);
5761b2b03f8SKarsten Keil }
5771b2b03f8SKarsten Keil 
5781b2b03f8SKarsten Keil /* global register/unregister functions */
5791b2b03f8SKarsten Keil 
580b36b654aSMatthias Urlichs extern int	mISDN_register_device(struct mISDNdevice *,
581b36b654aSMatthias Urlichs 					struct device *parent, char *name);
5821b2b03f8SKarsten Keil extern void	mISDN_unregister_device(struct mISDNdevice *);
5831b2b03f8SKarsten Keil extern int	mISDN_register_Bprotocol(struct Bprotocol *);
5841b2b03f8SKarsten Keil extern void	mISDN_unregister_Bprotocol(struct Bprotocol *);
5853bd69ad1SAndreas Eversberg extern struct mISDNclock *mISDN_register_clock(char *, int, clockctl_func_t *,
5863bd69ad1SAndreas Eversberg 						void *);
5873bd69ad1SAndreas Eversberg extern void	mISDN_unregister_clock(struct mISDNclock *);
5881b2b03f8SKarsten Keil 
dev_to_mISDN(const struct device * dev)589*23680f0bSGreg Kroah-Hartman static inline struct mISDNdevice *dev_to_mISDN(const struct device *dev)
590b36b654aSMatthias Urlichs {
59157de16e6SMartin Bachem 	if (dev)
592b36b654aSMatthias Urlichs 		return dev_get_drvdata(dev);
59357de16e6SMartin Bachem 	else
59457de16e6SMartin Bachem 		return NULL;
595b36b654aSMatthias Urlichs }
596b36b654aSMatthias Urlichs 
5971b2b03f8SKarsten Keil extern void	set_channel_address(struct mISDNchannel *, u_int, u_int);
598ebf918cfSTina Ruchandani extern void	mISDN_clock_update(struct mISDNclock *, int, ktime_t *);
5993bd69ad1SAndreas Eversberg extern unsigned short mISDN_clock_get(void);
600f45ebf3aSKarsten Keil extern const char *mISDNDevName4ch(struct mISDNchannel *);
6011b2b03f8SKarsten Keil 
6021b2b03f8SKarsten Keil #endif /* __KERNEL__ */
6031b2b03f8SKarsten Keil #endif /* mISDNIF_H */
604