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