# isdnif.h

    /* $Id$
     *
     * Linux ISDN subsystem
     *
     * Definition of the interface between the subsystem and its low-level drivers.
     *
     * Copyright 1994,95,96 by Fritz Elfert (fritz@wuemaus.franken.de)
     * Copyright 1995,96    Thinking Objects Software GmbH Wuerzburg
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 2, or (at your option)
     * any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     *
     * $Log$
     * Revision 1.25  1998/06/17 19:51:55  he
     * merged with 2.1.10[34] (cosmetics and udelay() -> mdelay())
     * brute force fix to avoid Ugh's in isdn_tty_write()
     * cleaned up some dead code
     *
     * Revision 1.24  1998/03/19 13:18:57  keil
     * Start of a CAPI like interface for supplementary Service
     * first service: SUSPEND
     *
     * Revision 1.23  1998/02/20 17:36:52  fritz
     * Added L2-protocols for V.110, changed FEATURE-Flag-constants.
     *
     * Revision 1.22  1998/01/31 22:14:12  keil
     * changes for 2.1.82
     *
     * Revision 1.21  1997/10/09 21:28:13  fritz
     * New HL<->LL interface:
     *   New BSENT callback with nr. of bytes included.
     *   Sending without ACK.
     *   New L1 error status (not yet in use).
     *   Cleaned up obsolete structures.
     * Implemented Cisco-SLARP.
     * Changed local net-interface data to be dynamically allocated.
     * Removed old 2.0 compatibility stuff.
     *
     * Revision 1.20  1997/05/27 15:18:06  fritz
     * Added changes for recent 2.1.x kernels:
     *   changed return type of isdn_close
     *   queue_task_* -> queue_task
     *   clear/set_bit -> test_and_... where apropriate.
     *   changed type of hard_header_cache parameter.
     *
     * Revision 1.19  1997/03/25 23:13:56  keil
     * NI-1 US protocol
     *
     * Revision 1.18  1997/03/04 22:09:18  calle
     * Change macros copy_from_user and copy_to_user in inline function.
     * These are now correct replacements of the functions for 2.1.xx
     *
     * Revision 1.17  1997/02/10 21:12:53  fritz
     * More setup-interface changes.
     *
     * Revision 1.16  1997/02/10 19:42:57  fritz
     * New interface for reporting incoming calls.
     *
     * Revision 1.15  1997/02/09 00:18:42  keil
     * leased line support
     *
     * Revision 1.14  1997/02/03 23:43:00  fritz
     * Misc changes for Kernel 2.1.X compatibility.
     *
     * Revision 1.13  1996/11/13 02:39:59  fritz
     * More compatibility changes.
     *
     * Revision 1.12  1996/11/06 17:38:48  keil
     * more changes for 2.1.X
     *
     * Revision 1.11  1996/10/23 11:59:42  fritz
     * More compatibility changes.
     *
     * Revision 1.10  1996/10/22 23:14:19  fritz
     * Changes for compatibility to 2.0.X and 2.1.X kernels.
     *
     * Revision 1.9  1996/06/06 21:24:24  fritz
     * Started adding support for suspend/resume.
     *
     * Revision 1.8  1996/05/18 01:45:37  fritz
     * More spelling corrections.
     *
     * Revision 1.7  1996/05/18 01:37:19  fritz
     * Added spelling corrections and some minor changes
     * to stay in sync with kernel.
     *
     * Revision 1.6  1996/05/17 03:59:28  fritz
     * Marked rcvcallb and writebuf obsolete.
     *
     * Revision 1.5  1996/05/01 11:43:54  fritz
     * Removed STANDALONE
     *
     * Revision 1.4  1996/05/01 11:38:40  fritz
     * Added ISDN_FEATURE_L2_TRANS
     *
     * Revision 1.3  1996/04/29 22:57:54  fritz
     * Added driverId and channel parameters to
     * writecmd() and readstat().
     * Added constant for voice-support.
     *
     * Revision 1.2  1996/04/20 17:02:40  fritz
     * Changes to support skbuffs for Lowlevel-Drivers.
     * Misc. typos
     *
     * Revision 1.1  1996/01/09 05:50:51  fritz
     * Initial revision
     *
     */

    #ifndef isdnif_h
    #define isdnif_h

    /*
     * Values for general protocol-selection
     */
    #define ISDN_PTYPE_UNKNOWN   0   /* Protocol undefined   */
    #define ISDN_PTYPE_1TR6      1   /* german 1TR6-protocol */
    #define ISDN_PTYPE_EURO      2   /* EDSS1-protocol       */
    #define ISDN_PTYPE_LEASED    3   /* for leased lines     */
    #define ISDN_PTYPE_NI1       4   /* US NI-1 protocol     */
    #define ISDN_PTYPE_MAX       7   /* Max. 8 Protocols     */

    /*
     * Values for Layer-2-protocol-selection
     */
    #define ISDN_PROTO_L2_X75I   0   /* X75/LAPB with I-Frames            */
    #define ISDN_PROTO_L2_X75UI  1   /* X75/LAPB with UI-Frames           */
    #define ISDN_PROTO_L2_X75BUI 2   /* X75/LAPB with UI-Frames           */
    #define ISDN_PROTO_L2_HDLC   3   /* HDLC                              */
    #define ISDN_PROTO_L2_TRANS  4   /* Transparent (Voice)               */
    #define ISDN_PROTO_L2_X25DTE 5   /* X25/LAPB DTE mode                 */
    #define ISDN_PROTO_L2_X25DCE 6   /* X25/LAPB DCE mode                 */
    #define ISDN_PROTO_L2_V11096 7   /* V.110 bitrate adaption 9600 Baud  */
    #define ISDN_PROTO_L2_V11019 8   /* V.110 bitrate adaption 19200 Baud */
    #define ISDN_PROTO_L2_V11038 9   /* V.110 bitrate adaption 38400 Baud */
    #define ISDN_PROTO_L2_MODEM  10  /* Analog Modem on Board */
    #define ISDN_PROTO_L2_MAX    15  /* Max. 16 Protocols                 */

    /*
     * Values for Layer-3-protocol-selection
     */
    #define ISDN_PROTO_L3_TRANS  0   /* Transparent                 */
    #define ISDN_PROTO_L3_MAX    7   /* Max. 8 Protocols            */

    #ifdef __KERNEL__

    #include <linux/skbuff.h>

    /*
     * Commands from linklevel to lowlevel
     *
     */
    #define ISDN_CMD_IOCTL    0       /* Perform ioctl                         */
    #define ISDN_CMD_DIAL     1       /* Dial out                              */
    #define ISDN_CMD_ACCEPTD  2       /* Accept an incoming call on D-Chan.    */
    #define ISDN_CMD_ACCEPTB  3       /* Request B-Channel connect.            */
    #define ISDN_CMD_HANGUP   4       /* Hangup                                */
    #define ISDN_CMD_CLREAZ   5       /* Clear EAZ(s) of channel               */
    #define ISDN_CMD_SETEAZ   6       /* Set EAZ(s) of channel                 */
    #define ISDN_CMD_GETEAZ   7       /* Get EAZ(s) of channel                 */
    #define ISDN_CMD_SETSIL   8       /* Set Service-Indicator-List of channel */
    #define ISDN_CMD_GETSIL   9       /* Get Service-Indicator-List of channel */
    #define ISDN_CMD_SETL2   10       /* Set B-Chan. Layer2-Parameter          */
    #define ISDN_CMD_GETL2   11       /* Get B-Chan. Layer2-Parameter          */
    #define ISDN_CMD_SETL3   12       /* Set B-Chan. Layer3-Parameter          */
    #define ISDN_CMD_GETL3   13       /* Get B-Chan. Layer3-Parameter          */
    #define ISDN_CMD_LOCK    14       /* Signal usage by upper levels          */
    #define ISDN_CMD_UNLOCK  15       /* Release usage-lock                    */
    #define ISDN_CMD_SUSPEND 16       /* Suspend connection                    */
    #define ISDN_CMD_RESUME  17       /* Resume connection                     */
    #define CAPI_PUT_MESSAGE 18       /* CAPI message send down or up          */

    /*
     * Status-Values delivered from lowlevel to linklevel via
     * statcallb().
     *
     */
    #define ISDN_STAT_STAVAIL 256    /* Raw status-data available             */
    #define ISDN_STAT_ICALL   257    /* Incoming call detected                */
    #define ISDN_STAT_RUN     258    /* Signal protocol-code is running       */
    #define ISDN_STAT_STOP    259    /* Signal halt of protocol-code          */
    #define ISDN_STAT_DCONN   260    /* Signal D-Channel connect              */
    #define ISDN_STAT_BCONN   261    /* Signal B-Channel connect              */
    #define ISDN_STAT_DHUP    262    /* Signal D-Channel disconnect           */
    #define ISDN_STAT_BHUP    263    /* Signal B-Channel disconnect           */
    #define ISDN_STAT_CINF    264    /* Charge-Info                           */
    #define ISDN_STAT_LOAD    265    /* Signal new lowlevel-driver is loaded  */
    #define ISDN_STAT_UNLOAD  266    /* Signal unload of lowlevel-driver      */
    #define ISDN_STAT_BSENT   267    /* Signal packet sent                    */
    #define ISDN_STAT_NODCH   268    /* Signal no D-Channel                   */
    #define ISDN_STAT_ADDCH   269    /* Add more Channels                     */
    #define ISDN_STAT_CAUSE   270    /* Cause-Message                         */
    #define ISDN_STAT_L1ERR   271    /* Signal Layer-1 Error                  */

    /*
     * Values for errcode field
     */
    #define ISDN_STAT_L1ERR_SEND 1
    #define ISDN_STAT_L1ERR_RECV 2

    /*
     * Values for feature-field of interface-struct.
     */
    /* Layer 2 */
    #define ISDN_FEATURE_L2_X75I    (0x0001 << ISDN_PROTO_L2_X75I)
    #define ISDN_FEATURE_L2_X75UI   (0x0001 << ISDN_PROTO_L2_X75UI)
    #define ISDN_FEATURE_L2_X75BUI  (0x0001 << ISDN_PROTO_L2_X75BUI)
    #define ISDN_FEATURE_L2_HDLC    (0x0001 << ISDN_PROTO_L2_HDLC)
    #define ISDN_FEATURE_L2_TRANS   (0x0001 << ISDN_PROTO_L2_TRANS)
    #define ISDN_FEATURE_L2_X25DTE  (0x0001 << ISDN_PROTO_L2_X25DTE)
    #define ISDN_FEATURE_L2_X25DCE  (0x0001 << ISDN_PROTO_L2_X25DCE)
    #define ISDN_FEATURE_L2_V11096  (0x0001 << ISDN_PROTO_L2_V11096)
    #define ISDN_FEATURE_L2_V11019  (0x0001 << ISDN_PROTO_L2_V11019)
    #define ISDN_FEATURE_L2_V11038  (0x0001 << ISDN_PROTO_L2_V11038)
    #define ISDN_FEATURE_L2_MODEM   (0x0001 << ISDN_PROTO_L2_MODEM)

    #define ISDN_FEATURE_L2_MASK    (0x0FFFF) /* Max. 16 protocols */
    #define ISDN_FEATURE_L2_SHIFT   (0)

    /* Layer 3 */
    #define ISDN_FEATURE_L3_TRANS   (0x10000 << ISDN_PROTO_L3_TRANS)

    #define ISDN_FEATURE_L3_MASK    (0x0FF0000) /* Max. 8 Protocols */
    #define ISDN_FEATURE_L3_SHIFT   (16)

    /* Signaling */
    #define ISDN_FEATURE_P_UNKNOWN  (0x1000000 << ISDN_PTYPE_UNKNOWN)
    #define ISDN_FEATURE_P_1TR6     (0x1000000 << ISDN_PTYPE_1TR6)
    #define ISDN_FEATURE_P_EURO     (0x1000000 << ISDN_PTYPE_EURO)
    #define ISDN_FEATURE_P_NI1      (0x1000000 << ISDN_PTYPE_NI1)

    #define ISDN_FEATURE_P_MASK     (0x0FF000000) /* Max. 8 Protocols */
    #define ISDN_FEATURE_P_SHIFT    (24)

    typedef struct setup_parm {
        unsigned char phone[32];	/* Remote Phone-Number */
        unsigned char eazmsn[32];	/* Local EAZ or MSN    */
        unsigned char si1;      /* Service Indicator 1 */
        unsigned char si2;      /* Service Indicator 2 */
        unsigned char plan;     /* Numbering plan      */
        unsigned char screen;   /* Screening info      */
    } setup_parm;

    /* CAPI structs */

    /* this is compatible to the old union size */
    #define MAX_CAPI_PARA_LEN 50

    typedef struct {
    	/* Header */
    	__u16 Length;
    	__u16 ApplId;
    	__u8 Command;
    	__u8 Subcommand;
    	__u16 Messagenumber;

    	/* Parameter */
    	union {
    		__u32 Controller;
    		__u32 PLCI;
    		__u32 NCCI;
    	} adr;
    	__u8 para[MAX_CAPI_PARA_LEN];
    } capi_msg;

    /*
     * Structure for exchanging above infos
     *
     */
    typedef struct {
      int   driver;                  /* Lowlevel-Driver-ID                    */
      int   command;                 /* Command or Status (see above)         */
      ulong arg;                     /* Additional Data                       */
      union {
    	ulong errcode;               /* Type of error with STAT_L1ERR         */
    	int   length;                /* Amount of bytes sent with STAT_BSENT  */
    	u_char	num[50];	/* Additional Data			*/
    	setup_parm 	setup;	/* For SETUP msg			*/
    	capi_msg  	cmsg;	/* For CAPI like messages		*/
      } parm;
    } isdn_ctrl;

    /*
     * The interface-struct itself (initialized at load-time of lowlevel-driver)
     *
     * See Documentation/isdn/INTERFACE for a description, how the communication
     * between the ISDN subsystem and its drivers is done.
     *
     */
    typedef struct {
      /* Number of channels supported by this driver
       */
      int channels;

      /*
       * Maximum Size of transmit/receive-buffer this driver supports.
       */
      int maxbufsize;

      /* Feature-Flags for this driver.
       * See defines ISDN_FEATURE_... for Values
       */
      unsigned long features;

      /*
       * Needed for calculating
       * dev->hard_header_len = linklayer header + hl_hdrlen;
       * Drivers, not supporting sk_buff's should set this to 0.
       */
      unsigned short hl_hdrlen;

      /*
       * Receive-Callback using sk_buff's
       * Parameters:
       *             int                    Driver-ID
       *             int                    local channel-number (0 ...)
       *             struct sk_buff *skb    received Data
       */
      void (*rcvcallb_skb)(int, int, struct sk_buff *);

      /* Status-Callback
       * Parameters:
       *             isdn_ctrl*
       *                   driver  = Driver ID.
       *                   command = One of above ISDN_STAT_... constants.
       *                   arg     = depending on status-type.
       *                   num     = depending on status-type.
       */
      int (*statcallb)(isdn_ctrl*);

      /* Send command
       * Parameters:
       *             isdn_ctrl*
       *                   driver  = Driver ID.
       *                   command = One of above ISDN_CMD_... constants.
       *                   arg     = depending on command.
       *                   num     = depending on command.
       */
      int (*command)(isdn_ctrl*);

      /*
       * Send data using sk_buff's
       * Parameters:
       *             int                    driverId
       *             int                    local channel-number (0...)
       *             int                    Flag: Need ACK for this packet.
       *             struct sk_buff *skb    Data to send
       */
      int (*writebuf_skb) (int, int, int, struct sk_buff *);

      /* Send raw D-Channel-Commands
       * Parameters:
       *             u_char pointer data
       *             int    length of data
       *             int    Flag: 0 = Call form Kernel-Space (use memcpy,
       *                              no schedule allowed)
       *                          1 = Data is in User-Space (use memcpy_fromfs,
       *                              may schedule)
       *             int    driverId
       *             int    local channel-number (0 ...)
       */
      int (*writecmd)(const u_char*, int, int, int, int);

      /* Read raw Status replies
       *             u_char pointer data (volatile)
       *             int    length of buffer
       *             int    Flag: 0 = Call form Kernel-Space (use memcpy,
       *                              no schedule allowed)
       *                          1 = Data is in User-Space (use memcpy_fromfs,
       *                              may schedule)
       *             int    driverId
       *             int    local channel-number (0 ...)
       */
      int (*readstat)(u_char*, int, int, int, int);

      char id[20];
    } isdn_if;

    /*
     * Function which must be called by lowlevel-driver at loadtime with
     * the following fields of above struct set:
     *
     * channels     Number of channels that will be supported.
     * hl_hdrlen    Space to preserve in sk_buff's when sending. Drivers, not
     *              supporting sk_buff's should set this to 0.
     * command      Address of Command-Handler.
     * features     Bitwise coded Features of this driver. (use ISDN_FEATURE_...)
     * writebuf_skb Address of Skbuff-Send-Handler.
     * writecmd        "    "  D-Channel  " which accepts raw D-Ch-Commands.
     * readstat        "    "  D-Channel  " which delivers raw Status-Data.
     *
     * The linklevel-driver fills the following fields:
     *
     * channels      Driver-ID assigned to this driver. (Must be used on all
     *               subsequent callbacks.
     * rcvcallb_skb  Address of handler for received Skbuff's.
     * statcallb        "    "     "    for status-changes.
     *
     */
    extern int register_isdn(isdn_if*);

    #ifndef LINUX_VERSION_CODE
    #include <linux/version.h>
    #endif
    #include <asm/uaccess.h>

    #endif /* __KERNEL__ */
    #endif /* isdnif_h */