Lines Matching refs:hdlc
53 void isdnhdlc_rcv_init(struct isdnhdlc_vars *hdlc, u32 features) in isdnhdlc_rcv_init() argument
55 memset(hdlc, 0, sizeof(struct isdnhdlc_vars)); in isdnhdlc_rcv_init()
56 hdlc->state = HDLC_GET_DATA; in isdnhdlc_rcv_init()
58 hdlc->do_adapt56 = 1; in isdnhdlc_rcv_init()
60 hdlc->do_bitreverse = 1; in isdnhdlc_rcv_init()
64 void isdnhdlc_out_init(struct isdnhdlc_vars *hdlc, u32 features) in isdnhdlc_out_init() argument
66 memset(hdlc, 0, sizeof(struct isdnhdlc_vars)); in isdnhdlc_out_init()
68 hdlc->dchannel = 1; in isdnhdlc_out_init()
69 hdlc->state = HDLC_SEND_FIRST_FLAG; in isdnhdlc_out_init()
71 hdlc->dchannel = 0; in isdnhdlc_out_init()
72 hdlc->state = HDLC_SEND_FAST_FLAG; in isdnhdlc_out_init()
73 hdlc->ffvalue = 0x7e; in isdnhdlc_out_init()
75 hdlc->cbin = 0x7e; in isdnhdlc_out_init()
77 hdlc->do_adapt56 = 1; in isdnhdlc_out_init()
78 hdlc->state = HDLC_SENDFLAG_B0; in isdnhdlc_out_init()
80 hdlc->data_bits = 8; in isdnhdlc_out_init()
82 hdlc->do_bitreverse = 1; in isdnhdlc_out_init()
87 check_frame(struct isdnhdlc_vars *hdlc) in check_frame() argument
91 if (hdlc->dstpos < 2) /* too small - framing error */ in check_frame()
93 else if (hdlc->crc != 0xf0b8) /* crc error */ in check_frame()
97 hdlc->dstpos -= 2; in check_frame()
99 status = hdlc->dstpos; in check_frame()
131 int isdnhdlc_decode(struct isdnhdlc_vars *hdlc, const u8 *src, int slen, in isdnhdlc_decode() argument
175 if (hdlc->bit_shift == 0) { in isdnhdlc_decode()
177 if (hdlc->do_bitreverse == 0) in isdnhdlc_decode()
178 hdlc->cbin = bitrev8(*src++); in isdnhdlc_decode()
180 hdlc->cbin = *src++; in isdnhdlc_decode()
182 hdlc->bit_shift = 8; in isdnhdlc_decode()
183 if (hdlc->do_adapt56) in isdnhdlc_decode()
184 hdlc->bit_shift--; in isdnhdlc_decode()
187 switch (hdlc->state) { in isdnhdlc_decode()
191 if (hdlc->cbin == 0xff) { in isdnhdlc_decode()
192 hdlc->bit_shift = 0; in isdnhdlc_decode()
195 hdlc->state = HDLC_GET_FLAG_B0; in isdnhdlc_decode()
196 hdlc->hdlc_bits1 = 0; in isdnhdlc_decode()
197 hdlc->bit_shift = 8; in isdnhdlc_decode()
200 if (!(hdlc->cbin & 0x80)) { in isdnhdlc_decode()
201 hdlc->state = HDLC_GETFLAG_B1A6; in isdnhdlc_decode()
202 hdlc->hdlc_bits1 = 0; in isdnhdlc_decode()
204 if ((!hdlc->do_adapt56) && in isdnhdlc_decode()
205 (++hdlc->hdlc_bits1 >= 8) && in isdnhdlc_decode()
206 (hdlc->bit_shift == 1)) in isdnhdlc_decode()
207 hdlc->state = HDLC_FAST_IDLE; in isdnhdlc_decode()
209 hdlc->cbin <<= 1; in isdnhdlc_decode()
210 hdlc->bit_shift--; in isdnhdlc_decode()
213 if (hdlc->cbin & 0x80) { in isdnhdlc_decode()
214 hdlc->hdlc_bits1++; in isdnhdlc_decode()
215 if (hdlc->hdlc_bits1 == 6) in isdnhdlc_decode()
216 hdlc->state = HDLC_GETFLAG_B7; in isdnhdlc_decode()
218 hdlc->hdlc_bits1 = 0; in isdnhdlc_decode()
219 hdlc->cbin <<= 1; in isdnhdlc_decode()
220 hdlc->bit_shift--; in isdnhdlc_decode()
223 if (hdlc->cbin & 0x80) { in isdnhdlc_decode()
224 hdlc->state = HDLC_GET_FLAG_B0; in isdnhdlc_decode()
226 hdlc->state = HDLC_GET_DATA; in isdnhdlc_decode()
227 hdlc->crc = 0xffff; in isdnhdlc_decode()
228 hdlc->shift_reg = 0; in isdnhdlc_decode()
229 hdlc->hdlc_bits1 = 0; in isdnhdlc_decode()
230 hdlc->data_bits = 0; in isdnhdlc_decode()
231 hdlc->data_received = 0; in isdnhdlc_decode()
233 hdlc->cbin <<= 1; in isdnhdlc_decode()
234 hdlc->bit_shift--; in isdnhdlc_decode()
237 if (hdlc->cbin & 0x80) { in isdnhdlc_decode()
238 hdlc->hdlc_bits1++; in isdnhdlc_decode()
239 switch (hdlc->hdlc_bits1) { in isdnhdlc_decode()
243 if (hdlc->data_received) in isdnhdlc_decode()
246 if (!hdlc->do_adapt56) { in isdnhdlc_decode()
247 if (hdlc->cbin == fast_abort in isdnhdlc_decode()
248 [hdlc->bit_shift + 1]) { in isdnhdlc_decode()
249 hdlc->state = in isdnhdlc_decode()
251 hdlc->bit_shift = 1; in isdnhdlc_decode()
255 hdlc->state = HDLC_GET_FLAG_B0; in isdnhdlc_decode()
258 hdlc->shift_reg >>= 1; in isdnhdlc_decode()
259 hdlc->shift_reg |= 0x80; in isdnhdlc_decode()
260 hdlc->data_bits++; in isdnhdlc_decode()
264 switch (hdlc->hdlc_bits1) { in isdnhdlc_decode()
268 if (hdlc->data_received) in isdnhdlc_decode()
269 status = check_frame(hdlc); in isdnhdlc_decode()
270 hdlc->crc = 0xffff; in isdnhdlc_decode()
271 hdlc->shift_reg = 0; in isdnhdlc_decode()
272 hdlc->data_bits = 0; in isdnhdlc_decode()
273 if (!hdlc->do_adapt56) in isdnhdlc_decode()
274 handle_fast_flag(hdlc); in isdnhdlc_decode()
276 hdlc->state = HDLC_GET_DATA; in isdnhdlc_decode()
277 hdlc->data_received = 0; in isdnhdlc_decode()
281 hdlc->shift_reg >>= 1; in isdnhdlc_decode()
282 hdlc->data_bits++; in isdnhdlc_decode()
285 hdlc->hdlc_bits1 = 0; in isdnhdlc_decode()
288 hdlc->dstpos = 0; in isdnhdlc_decode()
290 hdlc->cbin <<= 1; in isdnhdlc_decode()
291 hdlc->bit_shift--; in isdnhdlc_decode()
294 if (hdlc->data_bits == 8) { in isdnhdlc_decode()
295 hdlc->data_bits = 0; in isdnhdlc_decode()
296 hdlc->data_received = 1; in isdnhdlc_decode()
297 hdlc->crc = crc_ccitt_byte(hdlc->crc, in isdnhdlc_decode()
298 hdlc->shift_reg); in isdnhdlc_decode()
301 if (hdlc->dstpos < dsize) in isdnhdlc_decode()
302 dst[hdlc->dstpos++] = hdlc->shift_reg; in isdnhdlc_decode()
306 hdlc->dstpos = 0; in isdnhdlc_decode()
309 hdlc->cbin <<= 1; in isdnhdlc_decode()
310 hdlc->bit_shift--; in isdnhdlc_decode()
313 if (hdlc->cbin == hdlc->ffvalue) { in isdnhdlc_decode()
314 hdlc->bit_shift = 0; in isdnhdlc_decode()
317 if (hdlc->cbin == 0xff) { in isdnhdlc_decode()
318 hdlc->state = HDLC_FAST_IDLE; in isdnhdlc_decode()
319 hdlc->bit_shift = 0; in isdnhdlc_decode()
320 } else if (hdlc->ffbit_shift == 8) { in isdnhdlc_decode()
321 hdlc->state = HDLC_GETFLAG_B7; in isdnhdlc_decode()
324 handle_abort(hdlc); in isdnhdlc_decode()
354 int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, u16 slen, in isdnhdlc_encode() argument
366 if ((slen == 1) && (hdlc->state == HDLC_SEND_FAST_FLAG)) in isdnhdlc_encode()
367 hdlc->state = HDLC_SENDFLAG_ONE; in isdnhdlc_encode()
369 if (hdlc->bit_shift == 0) { in isdnhdlc_encode()
370 if (slen && !hdlc->do_closing) { in isdnhdlc_encode()
371 hdlc->shift_reg = *src++; in isdnhdlc_encode()
375 hdlc->do_closing = 1; in isdnhdlc_encode()
376 hdlc->bit_shift = 8; in isdnhdlc_encode()
378 if (hdlc->state == HDLC_SEND_DATA) { in isdnhdlc_encode()
379 if (hdlc->data_received) { in isdnhdlc_encode()
380 hdlc->state = HDLC_SEND_CRC1; in isdnhdlc_encode()
381 hdlc->crc ^= 0xffff; in isdnhdlc_encode()
382 hdlc->bit_shift = 8; in isdnhdlc_encode()
383 hdlc->shift_reg = in isdnhdlc_encode()
384 hdlc->crc & 0xff; in isdnhdlc_encode()
385 } else if (!hdlc->do_adapt56) in isdnhdlc_encode()
386 hdlc->state = in isdnhdlc_encode()
389 hdlc->state = in isdnhdlc_encode()
396 switch (hdlc->state) { in isdnhdlc_encode()
402 hdlc->do_closing = 0; in isdnhdlc_encode()
405 if (hdlc->do_bitreverse == 0) in isdnhdlc_encode()
406 *dst++ = bitrev8(hdlc->ffvalue); in isdnhdlc_encode()
408 *dst++ = hdlc->ffvalue; in isdnhdlc_encode()
415 if (hdlc->bit_shift == 8) { in isdnhdlc_encode()
416 hdlc->cbin = hdlc->ffvalue >> in isdnhdlc_encode()
417 (8 - hdlc->data_bits); in isdnhdlc_encode()
418 hdlc->state = HDLC_SEND_DATA; in isdnhdlc_encode()
419 hdlc->crc = 0xffff; in isdnhdlc_encode()
420 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
421 hdlc->data_received = 1; in isdnhdlc_encode()
425 hdlc->do_closing = 0; in isdnhdlc_encode()
426 hdlc->cbin <<= 1; in isdnhdlc_encode()
427 hdlc->data_bits++; in isdnhdlc_encode()
428 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
429 hdlc->state = HDLC_SENDFLAG_B1A6; in isdnhdlc_encode()
432 hdlc->cbin <<= 1; in isdnhdlc_encode()
433 hdlc->data_bits++; in isdnhdlc_encode()
434 hdlc->cbin++; in isdnhdlc_encode()
435 if (++hdlc->hdlc_bits1 == 6) in isdnhdlc_encode()
436 hdlc->state = HDLC_SENDFLAG_B7; in isdnhdlc_encode()
439 hdlc->cbin <<= 1; in isdnhdlc_encode()
440 hdlc->data_bits++; in isdnhdlc_encode()
442 hdlc->state = HDLC_SENDFLAG_B0; in isdnhdlc_encode()
445 if (hdlc->bit_shift == 8) { in isdnhdlc_encode()
446 hdlc->state = HDLC_SEND_DATA; in isdnhdlc_encode()
447 hdlc->crc = 0xffff; in isdnhdlc_encode()
448 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
449 hdlc->data_received = 1; in isdnhdlc_encode()
453 hdlc->data_received = 1; in isdnhdlc_encode()
454 if (hdlc->data_bits == 8) { in isdnhdlc_encode()
455 hdlc->state = HDLC_SEND_DATA; in isdnhdlc_encode()
456 hdlc->crc = 0xffff; in isdnhdlc_encode()
457 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
460 hdlc->cbin <<= 1; in isdnhdlc_encode()
461 hdlc->data_bits++; in isdnhdlc_encode()
462 if (hdlc->shift_reg & 0x01) in isdnhdlc_encode()
463 hdlc->cbin++; in isdnhdlc_encode()
464 hdlc->shift_reg >>= 1; in isdnhdlc_encode()
465 hdlc->bit_shift--; in isdnhdlc_encode()
466 if (hdlc->bit_shift == 0) { in isdnhdlc_encode()
467 hdlc->state = HDLC_SEND_DATA; in isdnhdlc_encode()
468 hdlc->crc = 0xffff; in isdnhdlc_encode()
469 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
473 hdlc->cbin <<= 1; in isdnhdlc_encode()
474 hdlc->data_bits++; in isdnhdlc_encode()
475 if (hdlc->hdlc_bits1 == 5) { in isdnhdlc_encode()
476 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
479 if (hdlc->bit_shift == 8) in isdnhdlc_encode()
480 hdlc->crc = crc_ccitt_byte(hdlc->crc, in isdnhdlc_encode()
481 hdlc->shift_reg); in isdnhdlc_encode()
482 if (hdlc->shift_reg & 0x01) { in isdnhdlc_encode()
483 hdlc->hdlc_bits1++; in isdnhdlc_encode()
484 hdlc->cbin++; in isdnhdlc_encode()
485 hdlc->shift_reg >>= 1; in isdnhdlc_encode()
486 hdlc->bit_shift--; in isdnhdlc_encode()
488 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
489 hdlc->shift_reg >>= 1; in isdnhdlc_encode()
490 hdlc->bit_shift--; in isdnhdlc_encode()
494 hdlc->cbin <<= 1; in isdnhdlc_encode()
495 hdlc->data_bits++; in isdnhdlc_encode()
496 if (hdlc->hdlc_bits1 == 5) { in isdnhdlc_encode()
497 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
500 if (hdlc->shift_reg & 0x01) { in isdnhdlc_encode()
501 hdlc->hdlc_bits1++; in isdnhdlc_encode()
502 hdlc->cbin++; in isdnhdlc_encode()
503 hdlc->shift_reg >>= 1; in isdnhdlc_encode()
504 hdlc->bit_shift--; in isdnhdlc_encode()
506 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
507 hdlc->shift_reg >>= 1; in isdnhdlc_encode()
508 hdlc->bit_shift--; in isdnhdlc_encode()
510 if (hdlc->bit_shift == 0) { in isdnhdlc_encode()
511 hdlc->shift_reg = (hdlc->crc >> 8); in isdnhdlc_encode()
512 hdlc->state = HDLC_SEND_CRC2; in isdnhdlc_encode()
513 hdlc->bit_shift = 8; in isdnhdlc_encode()
517 hdlc->cbin <<= 1; in isdnhdlc_encode()
518 hdlc->data_bits++; in isdnhdlc_encode()
519 if (hdlc->hdlc_bits1 == 5) { in isdnhdlc_encode()
520 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
523 if (hdlc->shift_reg & 0x01) { in isdnhdlc_encode()
524 hdlc->hdlc_bits1++; in isdnhdlc_encode()
525 hdlc->cbin++; in isdnhdlc_encode()
526 hdlc->shift_reg >>= 1; in isdnhdlc_encode()
527 hdlc->bit_shift--; in isdnhdlc_encode()
529 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
530 hdlc->shift_reg >>= 1; in isdnhdlc_encode()
531 hdlc->bit_shift--; in isdnhdlc_encode()
533 if (hdlc->bit_shift == 0) { in isdnhdlc_encode()
534 hdlc->shift_reg = 0x7e; in isdnhdlc_encode()
535 hdlc->state = HDLC_SEND_CLOSING_FLAG; in isdnhdlc_encode()
536 hdlc->bit_shift = 8; in isdnhdlc_encode()
540 hdlc->cbin <<= 1; in isdnhdlc_encode()
541 hdlc->data_bits++; in isdnhdlc_encode()
542 if (hdlc->hdlc_bits1 == 5) { in isdnhdlc_encode()
543 hdlc->hdlc_bits1 = 0; in isdnhdlc_encode()
546 if (hdlc->shift_reg & 0x01) in isdnhdlc_encode()
547 hdlc->cbin++; in isdnhdlc_encode()
548 hdlc->shift_reg >>= 1; in isdnhdlc_encode()
549 hdlc->bit_shift--; in isdnhdlc_encode()
550 if (hdlc->bit_shift == 0) { in isdnhdlc_encode()
551 hdlc->ffvalue = in isdnhdlc_encode()
552 xfast_flag_value[hdlc->data_bits]; in isdnhdlc_encode()
553 if (hdlc->dchannel) { in isdnhdlc_encode()
554 hdlc->ffvalue = 0x7e; in isdnhdlc_encode()
555 hdlc->state = HDLC_SEND_IDLE1; in isdnhdlc_encode()
556 hdlc->bit_shift = 8-hdlc->data_bits; in isdnhdlc_encode()
557 if (hdlc->bit_shift == 0) in isdnhdlc_encode()
558 hdlc->state = in isdnhdlc_encode()
561 if (!hdlc->do_adapt56) { in isdnhdlc_encode()
562 hdlc->state = in isdnhdlc_encode()
564 hdlc->data_received = 0; in isdnhdlc_encode()
566 hdlc->state = HDLC_SENDFLAG_B0; in isdnhdlc_encode()
567 hdlc->data_received = 0; in isdnhdlc_encode()
576 hdlc->do_closing = 0; in isdnhdlc_encode()
577 hdlc->cbin <<= 1; in isdnhdlc_encode()
578 hdlc->cbin++; in isdnhdlc_encode()
579 hdlc->data_bits++; in isdnhdlc_encode()
580 hdlc->bit_shift--; in isdnhdlc_encode()
581 if (hdlc->bit_shift == 0) { in isdnhdlc_encode()
582 hdlc->state = HDLC_SEND_FAST_IDLE; in isdnhdlc_encode()
583 hdlc->bit_shift = 0; in isdnhdlc_encode()
587 hdlc->do_closing = 0; in isdnhdlc_encode()
588 hdlc->cbin = 0xff; in isdnhdlc_encode()
589 hdlc->data_bits = 8; in isdnhdlc_encode()
590 if (hdlc->bit_shift == 8) { in isdnhdlc_encode()
591 hdlc->cbin = 0x7e; in isdnhdlc_encode()
592 hdlc->state = HDLC_SEND_FIRST_FLAG; in isdnhdlc_encode()
595 if (hdlc->do_bitreverse == 0) in isdnhdlc_encode()
596 *dst++ = bitrev8(hdlc->cbin); in isdnhdlc_encode()
598 *dst++ = hdlc->cbin; in isdnhdlc_encode()
599 hdlc->bit_shift = 0; in isdnhdlc_encode()
600 hdlc->data_bits = 0; in isdnhdlc_encode()
608 if (hdlc->do_adapt56) { in isdnhdlc_encode()
609 if (hdlc->data_bits == 7) { in isdnhdlc_encode()
610 hdlc->cbin <<= 1; in isdnhdlc_encode()
611 hdlc->cbin++; in isdnhdlc_encode()
612 hdlc->data_bits++; in isdnhdlc_encode()
615 if (hdlc->data_bits == 8) { in isdnhdlc_encode()
617 if (hdlc->do_bitreverse == 0) in isdnhdlc_encode()
618 *dst++ = bitrev8(hdlc->cbin); in isdnhdlc_encode()
620 *dst++ = hdlc->cbin; in isdnhdlc_encode()
621 hdlc->data_bits = 0; in isdnhdlc_encode()