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