xref: /linux/drivers/isdn/hardware/mISDN/isdnhdlc.h (revision 99c2aa151a7182c58f9477a376304c538d9cc5ab)
1*99c2aa15SArnd Bergmann /*
2*99c2aa15SArnd Bergmann  * hdlc.h  --  General purpose ISDN HDLC decoder.
3*99c2aa15SArnd Bergmann  *
4*99c2aa15SArnd Bergmann  * Implementation of a HDLC decoder/encoder in software.
5*99c2aa15SArnd Bergmann  * Necessary because some ISDN devices don't have HDLC
6*99c2aa15SArnd Bergmann  * controllers.
7*99c2aa15SArnd Bergmann  *
8*99c2aa15SArnd Bergmann  * Copyright (C)
9*99c2aa15SArnd Bergmann  *	2009	Karsten Keil		<keil@b1-systems.de>
10*99c2aa15SArnd Bergmann  *	2002	Wolfgang Mües		<wolfgang@iksw-muees.de>
11*99c2aa15SArnd Bergmann  *	2001	Frode Isaksen		<fisaksen@bewan.com>
12*99c2aa15SArnd Bergmann  *	2001	Kai Germaschewski	<kai.germaschewski@gmx.de>
13*99c2aa15SArnd Bergmann  *
14*99c2aa15SArnd Bergmann  * This program is free software; you can redistribute it and/or modify
15*99c2aa15SArnd Bergmann  * it under the terms of the GNU General Public License as published by
16*99c2aa15SArnd Bergmann  * the Free Software Foundation; either version 2 of the License, or
17*99c2aa15SArnd Bergmann  * (at your option) any later version.
18*99c2aa15SArnd Bergmann  *
19*99c2aa15SArnd Bergmann  * This program is distributed in the hope that it will be useful,
20*99c2aa15SArnd Bergmann  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21*99c2aa15SArnd Bergmann  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22*99c2aa15SArnd Bergmann  * GNU General Public License for more details.
23*99c2aa15SArnd Bergmann  *
24*99c2aa15SArnd Bergmann  * You should have received a copy of the GNU General Public License
25*99c2aa15SArnd Bergmann  * along with this program; if not, write to the Free Software
26*99c2aa15SArnd Bergmann  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27*99c2aa15SArnd Bergmann  */
28*99c2aa15SArnd Bergmann 
29*99c2aa15SArnd Bergmann #ifndef __ISDNHDLC_H__
30*99c2aa15SArnd Bergmann #define __ISDNHDLC_H__
31*99c2aa15SArnd Bergmann 
32*99c2aa15SArnd Bergmann struct isdnhdlc_vars {
33*99c2aa15SArnd Bergmann 	int bit_shift;
34*99c2aa15SArnd Bergmann 	int hdlc_bits1;
35*99c2aa15SArnd Bergmann 	int data_bits;
36*99c2aa15SArnd Bergmann 	int ffbit_shift;	/* encoding only */
37*99c2aa15SArnd Bergmann 	int state;
38*99c2aa15SArnd Bergmann 	int dstpos;
39*99c2aa15SArnd Bergmann 
40*99c2aa15SArnd Bergmann 	u16 crc;
41*99c2aa15SArnd Bergmann 
42*99c2aa15SArnd Bergmann 	u8 cbin;
43*99c2aa15SArnd Bergmann 	u8 shift_reg;
44*99c2aa15SArnd Bergmann 	u8 ffvalue;
45*99c2aa15SArnd Bergmann 
46*99c2aa15SArnd Bergmann 	/* set if transferring data */
47*99c2aa15SArnd Bergmann 	u32 data_received:1;
48*99c2aa15SArnd Bergmann 	/* set if D channel (send idle instead of flags) */
49*99c2aa15SArnd Bergmann 	u32 dchannel:1;
50*99c2aa15SArnd Bergmann 	/* set if 56K adaptation */
51*99c2aa15SArnd Bergmann 	u32 do_adapt56:1;
52*99c2aa15SArnd Bergmann 	/* set if in closing phase (need to send CRC + flag) */
53*99c2aa15SArnd Bergmann 	u32 do_closing:1;
54*99c2aa15SArnd Bergmann 	/* set if data is bitreverse */
55*99c2aa15SArnd Bergmann 	u32 do_bitreverse:1;
56*99c2aa15SArnd Bergmann };
57*99c2aa15SArnd Bergmann 
58*99c2aa15SArnd Bergmann /* Feature Flags */
59*99c2aa15SArnd Bergmann #define HDLC_56KBIT	0x01
60*99c2aa15SArnd Bergmann #define HDLC_DCHANNEL	0x02
61*99c2aa15SArnd Bergmann #define HDLC_BITREVERSE	0x04
62*99c2aa15SArnd Bergmann 
63*99c2aa15SArnd Bergmann /*
64*99c2aa15SArnd Bergmann   The return value from isdnhdlc_decode is
65*99c2aa15SArnd Bergmann   the frame length, 0 if no complete frame was decoded,
66*99c2aa15SArnd Bergmann   or a negative error number
67*99c2aa15SArnd Bergmann */
68*99c2aa15SArnd Bergmann #define HDLC_FRAMING_ERROR     1
69*99c2aa15SArnd Bergmann #define HDLC_CRC_ERROR         2
70*99c2aa15SArnd Bergmann #define HDLC_LENGTH_ERROR      3
71*99c2aa15SArnd Bergmann 
72*99c2aa15SArnd Bergmann extern void	isdnhdlc_rcv_init(struct isdnhdlc_vars *hdlc, u32 features);
73*99c2aa15SArnd Bergmann 
74*99c2aa15SArnd Bergmann extern int	isdnhdlc_decode(struct isdnhdlc_vars *hdlc, const u8 *src,
75*99c2aa15SArnd Bergmann 			int slen, int *count, u8 *dst, int dsize);
76*99c2aa15SArnd Bergmann 
77*99c2aa15SArnd Bergmann extern void	isdnhdlc_out_init(struct isdnhdlc_vars *hdlc, u32 features);
78*99c2aa15SArnd Bergmann 
79*99c2aa15SArnd Bergmann extern int	isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src,
80*99c2aa15SArnd Bergmann 			u16 slen, int *count, u8 *dst, int dsize);
81*99c2aa15SArnd Bergmann 
82*99c2aa15SArnd Bergmann #endif /* __ISDNHDLC_H__ */
83