linux/include/linux/mISDNif.h
<<
>>
Prefs
   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 */
 604