162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * hdlc.h -- General purpose ISDN HDLC decoder. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Implementation of a HDLC decoder/encoder in software. 662306a36Sopenharmony_ci * Necessary because some ISDN devices don't have HDLC 762306a36Sopenharmony_ci * controllers. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * Copyright (C) 1062306a36Sopenharmony_ci * 2009 Karsten Keil <keil@b1-systems.de> 1162306a36Sopenharmony_ci * 2002 Wolfgang Mües <wolfgang@iksw-muees.de> 1262306a36Sopenharmony_ci * 2001 Frode Isaksen <fisaksen@bewan.com> 1362306a36Sopenharmony_ci * 2001 Kai Germaschewski <kai.germaschewski@gmx.de> 1462306a36Sopenharmony_ci */ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#ifndef __ISDNHDLC_H__ 1762306a36Sopenharmony_ci#define __ISDNHDLC_H__ 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistruct isdnhdlc_vars { 2062306a36Sopenharmony_ci int bit_shift; 2162306a36Sopenharmony_ci int hdlc_bits1; 2262306a36Sopenharmony_ci int data_bits; 2362306a36Sopenharmony_ci int ffbit_shift; /* encoding only */ 2462306a36Sopenharmony_ci int state; 2562306a36Sopenharmony_ci int dstpos; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci u16 crc; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci u8 cbin; 3062306a36Sopenharmony_ci u8 shift_reg; 3162306a36Sopenharmony_ci u8 ffvalue; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci /* set if transferring data */ 3462306a36Sopenharmony_ci u32 data_received:1; 3562306a36Sopenharmony_ci /* set if D channel (send idle instead of flags) */ 3662306a36Sopenharmony_ci u32 dchannel:1; 3762306a36Sopenharmony_ci /* set if 56K adaptation */ 3862306a36Sopenharmony_ci u32 do_adapt56:1; 3962306a36Sopenharmony_ci /* set if in closing phase (need to send CRC + flag) */ 4062306a36Sopenharmony_ci u32 do_closing:1; 4162306a36Sopenharmony_ci /* set if data is bitreverse */ 4262306a36Sopenharmony_ci u32 do_bitreverse:1; 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* Feature Flags */ 4662306a36Sopenharmony_ci#define HDLC_56KBIT 0x01 4762306a36Sopenharmony_ci#define HDLC_DCHANNEL 0x02 4862306a36Sopenharmony_ci#define HDLC_BITREVERSE 0x04 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* 5162306a36Sopenharmony_ci The return value from isdnhdlc_decode is 5262306a36Sopenharmony_ci the frame length, 0 if no complete frame was decoded, 5362306a36Sopenharmony_ci or a negative error number 5462306a36Sopenharmony_ci*/ 5562306a36Sopenharmony_ci#define HDLC_FRAMING_ERROR 1 5662306a36Sopenharmony_ci#define HDLC_CRC_ERROR 2 5762306a36Sopenharmony_ci#define HDLC_LENGTH_ERROR 3 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciextern void isdnhdlc_rcv_init(struct isdnhdlc_vars *hdlc, u32 features); 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ciextern int isdnhdlc_decode(struct isdnhdlc_vars *hdlc, const u8 *src, 6262306a36Sopenharmony_ci int slen, int *count, u8 *dst, int dsize); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ciextern void isdnhdlc_out_init(struct isdnhdlc_vars *hdlc, u32 features); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ciextern int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, 6762306a36Sopenharmony_ci u16 slen, int *count, u8 *dst, int dsize); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#endif /* __ISDNHDLC_H__ */ 70