1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * hdlc.h -- General purpose ISDN HDLC decoder. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Implementation of a HDLC decoder/encoder in software. 6*4882a593Smuzhiyun * Necessary because some ISDN devices don't have HDLC 7*4882a593Smuzhiyun * controllers. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Copyright (C) 10*4882a593Smuzhiyun * 2009 Karsten Keil <keil@b1-systems.de> 11*4882a593Smuzhiyun * 2002 Wolfgang Mües <wolfgang@iksw-muees.de> 12*4882a593Smuzhiyun * 2001 Frode Isaksen <fisaksen@bewan.com> 13*4882a593Smuzhiyun * 2001 Kai Germaschewski <kai.germaschewski@gmx.de> 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #ifndef __ISDNHDLC_H__ 17*4882a593Smuzhiyun #define __ISDNHDLC_H__ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun struct isdnhdlc_vars { 20*4882a593Smuzhiyun int bit_shift; 21*4882a593Smuzhiyun int hdlc_bits1; 22*4882a593Smuzhiyun int data_bits; 23*4882a593Smuzhiyun int ffbit_shift; /* encoding only */ 24*4882a593Smuzhiyun int state; 25*4882a593Smuzhiyun int dstpos; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun u16 crc; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun u8 cbin; 30*4882a593Smuzhiyun u8 shift_reg; 31*4882a593Smuzhiyun u8 ffvalue; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* set if transferring data */ 34*4882a593Smuzhiyun u32 data_received:1; 35*4882a593Smuzhiyun /* set if D channel (send idle instead of flags) */ 36*4882a593Smuzhiyun u32 dchannel:1; 37*4882a593Smuzhiyun /* set if 56K adaptation */ 38*4882a593Smuzhiyun u32 do_adapt56:1; 39*4882a593Smuzhiyun /* set if in closing phase (need to send CRC + flag) */ 40*4882a593Smuzhiyun u32 do_closing:1; 41*4882a593Smuzhiyun /* set if data is bitreverse */ 42*4882a593Smuzhiyun u32 do_bitreverse:1; 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* Feature Flags */ 46*4882a593Smuzhiyun #define HDLC_56KBIT 0x01 47*4882a593Smuzhiyun #define HDLC_DCHANNEL 0x02 48*4882a593Smuzhiyun #define HDLC_BITREVERSE 0x04 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* 51*4882a593Smuzhiyun The return value from isdnhdlc_decode is 52*4882a593Smuzhiyun the frame length, 0 if no complete frame was decoded, 53*4882a593Smuzhiyun or a negative error number 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun #define HDLC_FRAMING_ERROR 1 56*4882a593Smuzhiyun #define HDLC_CRC_ERROR 2 57*4882a593Smuzhiyun #define HDLC_LENGTH_ERROR 3 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun extern void isdnhdlc_rcv_init(struct isdnhdlc_vars *hdlc, u32 features); 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun extern int isdnhdlc_decode(struct isdnhdlc_vars *hdlc, const u8 *src, 62*4882a593Smuzhiyun int slen, int *count, u8 *dst, int dsize); 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun extern void isdnhdlc_out_init(struct isdnhdlc_vars *hdlc, u32 features); 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun extern int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, 67*4882a593Smuzhiyun u16 slen, int *count, u8 *dst, int dsize); 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #endif /* __ISDNHDLC_H__ */ 70