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