cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mISDNif.h (15250B)


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