1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Kernel CAPI 2.0 Module 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright 1999 by Carsten Paeth <calle@calle.de> 5*4882a593Smuzhiyun * Copyright 2002 by Kai Germaschewski <kai@germaschewski.name> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * This software may be used and distributed according to the terms 8*4882a593Smuzhiyun * of the GNU General Public License, incorporated herein by reference. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/kernel.h> 14*4882a593Smuzhiyun #include <linux/spinlock.h> 15*4882a593Smuzhiyun #include <linux/list.h> 16*4882a593Smuzhiyun #include <linux/isdn/capilli.h> 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifdef KCAPI_DEBUG 19*4882a593Smuzhiyun #define DBG(format, arg...) do { \ 20*4882a593Smuzhiyun printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \ 21*4882a593Smuzhiyun } while (0) 22*4882a593Smuzhiyun #else 23*4882a593Smuzhiyun #define DBG(format, arg...) /* */ 24*4882a593Smuzhiyun #endif 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun enum { 27*4882a593Smuzhiyun CAPI_CTR_DETACHED = 0, 28*4882a593Smuzhiyun CAPI_CTR_DETECTED = 1, 29*4882a593Smuzhiyun CAPI_CTR_LOADING = 2, 30*4882a593Smuzhiyun CAPI_CTR_RUNNING = 3, 31*4882a593Smuzhiyun }; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun extern struct capi_ctr *capi_controller[CAPI_MAXCONTR]; 34*4882a593Smuzhiyun extern struct mutex capi_controller_lock; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun extern struct capi20_appl *capi_applications[CAPI_MAXAPPL]; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun void kcapi_proc_init(void); 39*4882a593Smuzhiyun void kcapi_proc_exit(void); 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun struct capi20_appl { 42*4882a593Smuzhiyun u16 applid; 43*4882a593Smuzhiyun capi_register_params rparam; 44*4882a593Smuzhiyun void (*recv_message)(struct capi20_appl *ap, struct sk_buff *skb); 45*4882a593Smuzhiyun void *private; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* internal to kernelcapi.o */ 48*4882a593Smuzhiyun unsigned long nrecvctlpkt; 49*4882a593Smuzhiyun unsigned long nrecvdatapkt; 50*4882a593Smuzhiyun unsigned long nsentctlpkt; 51*4882a593Smuzhiyun unsigned long nsentdatapkt; 52*4882a593Smuzhiyun struct mutex recv_mtx; 53*4882a593Smuzhiyun struct sk_buff_head recv_queue; 54*4882a593Smuzhiyun struct work_struct recv_work; 55*4882a593Smuzhiyun int release_in_progress; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun u16 capi20_isinstalled(void); 59*4882a593Smuzhiyun u16 capi20_register(struct capi20_appl *ap); 60*4882a593Smuzhiyun u16 capi20_release(struct capi20_appl *ap); 61*4882a593Smuzhiyun u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb); 62*4882a593Smuzhiyun u16 capi20_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN]); 63*4882a593Smuzhiyun u16 capi20_get_version(u32 contr, struct capi_version *verp); 64*4882a593Smuzhiyun u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN]); 65*4882a593Smuzhiyun u16 capi20_get_profile(u32 contr, struct capi_profile *profp); 66*4882a593Smuzhiyun int capi20_manufacturer(unsigned long cmd, void __user *data); 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define CAPICTR_UP 0 69*4882a593Smuzhiyun #define CAPICTR_DOWN 1 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun int kcapi_init(void); 72*4882a593Smuzhiyun void kcapi_exit(void); 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /*----- basic-type definitions -----*/ 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun typedef __u8 *_cstruct; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun typedef enum { 79*4882a593Smuzhiyun CAPI_COMPOSE, 80*4882a593Smuzhiyun CAPI_DEFAULT 81*4882a593Smuzhiyun } _cmstruct; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /* 84*4882a593Smuzhiyun The _cmsg structure contains all possible CAPI 2.0 parameter. 85*4882a593Smuzhiyun All parameters are stored here first. The function CAPI_CMSG_2_MESSAGE 86*4882a593Smuzhiyun assembles the parameter and builds CAPI2.0 conform messages. 87*4882a593Smuzhiyun CAPI_MESSAGE_2_CMSG disassembles CAPI 2.0 messages and stores the 88*4882a593Smuzhiyun parameter in the _cmsg structure 89*4882a593Smuzhiyun */ 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun typedef struct { 92*4882a593Smuzhiyun /* Header */ 93*4882a593Smuzhiyun __u16 ApplId; 94*4882a593Smuzhiyun __u8 Command; 95*4882a593Smuzhiyun __u8 Subcommand; 96*4882a593Smuzhiyun __u16 Messagenumber; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /* Parameter */ 99*4882a593Smuzhiyun union { 100*4882a593Smuzhiyun __u32 adrController; 101*4882a593Smuzhiyun __u32 adrPLCI; 102*4882a593Smuzhiyun __u32 adrNCCI; 103*4882a593Smuzhiyun } adr; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun _cmstruct AdditionalInfo; 106*4882a593Smuzhiyun _cstruct B1configuration; 107*4882a593Smuzhiyun __u16 B1protocol; 108*4882a593Smuzhiyun _cstruct B2configuration; 109*4882a593Smuzhiyun __u16 B2protocol; 110*4882a593Smuzhiyun _cstruct B3configuration; 111*4882a593Smuzhiyun __u16 B3protocol; 112*4882a593Smuzhiyun _cstruct BC; 113*4882a593Smuzhiyun _cstruct BChannelinformation; 114*4882a593Smuzhiyun _cmstruct BProtocol; 115*4882a593Smuzhiyun _cstruct CalledPartyNumber; 116*4882a593Smuzhiyun _cstruct CalledPartySubaddress; 117*4882a593Smuzhiyun _cstruct CallingPartyNumber; 118*4882a593Smuzhiyun _cstruct CallingPartySubaddress; 119*4882a593Smuzhiyun __u32 CIPmask; 120*4882a593Smuzhiyun __u32 CIPmask2; 121*4882a593Smuzhiyun __u16 CIPValue; 122*4882a593Smuzhiyun __u32 Class; 123*4882a593Smuzhiyun _cstruct ConnectedNumber; 124*4882a593Smuzhiyun _cstruct ConnectedSubaddress; 125*4882a593Smuzhiyun __u32 Data; 126*4882a593Smuzhiyun __u16 DataHandle; 127*4882a593Smuzhiyun __u16 DataLength; 128*4882a593Smuzhiyun _cstruct FacilityConfirmationParameter; 129*4882a593Smuzhiyun _cstruct Facilitydataarray; 130*4882a593Smuzhiyun _cstruct FacilityIndicationParameter; 131*4882a593Smuzhiyun _cstruct FacilityRequestParameter; 132*4882a593Smuzhiyun __u16 FacilitySelector; 133*4882a593Smuzhiyun __u16 Flags; 134*4882a593Smuzhiyun __u32 Function; 135*4882a593Smuzhiyun _cstruct HLC; 136*4882a593Smuzhiyun __u16 Info; 137*4882a593Smuzhiyun _cstruct InfoElement; 138*4882a593Smuzhiyun __u32 InfoMask; 139*4882a593Smuzhiyun __u16 InfoNumber; 140*4882a593Smuzhiyun _cstruct Keypadfacility; 141*4882a593Smuzhiyun _cstruct LLC; 142*4882a593Smuzhiyun _cstruct ManuData; 143*4882a593Smuzhiyun __u32 ManuID; 144*4882a593Smuzhiyun _cstruct NCPI; 145*4882a593Smuzhiyun __u16 Reason; 146*4882a593Smuzhiyun __u16 Reason_B3; 147*4882a593Smuzhiyun __u16 Reject; 148*4882a593Smuzhiyun _cstruct Useruserdata; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* intern */ 151*4882a593Smuzhiyun unsigned l, p; 152*4882a593Smuzhiyun unsigned char *par; 153*4882a593Smuzhiyun __u8 *m; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /* buffer to construct message */ 156*4882a593Smuzhiyun __u8 buf[180]; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun } _cmsg; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /*-----------------------------------------------------------------------*/ 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun /* 163*4882a593Smuzhiyun * Debugging / Tracing functions 164*4882a593Smuzhiyun */ 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun char *capi_cmd2str(__u8 cmd, __u8 subcmd); 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun typedef struct { 169*4882a593Smuzhiyun u_char *buf; 170*4882a593Smuzhiyun u_char *p; 171*4882a593Smuzhiyun size_t size; 172*4882a593Smuzhiyun size_t pos; 173*4882a593Smuzhiyun } _cdebbuf; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun #define CDEBUG_SIZE 1024 176*4882a593Smuzhiyun #define CDEBUG_GSIZE 4096 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun void cdebbuf_free(_cdebbuf *cdb); 179*4882a593Smuzhiyun int cdebug_init(void); 180*4882a593Smuzhiyun void cdebug_exit(void); 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun _cdebbuf *capi_message2str(__u8 *msg); 183