ISDN: Fix isdnhdlc for one byte hdlc packets
authorKarsten Keil <keil@b1-systems.de>
Wed, 8 Jul 2009 18:58:33 +0000 (20:58 +0200)
committerKarsten Keil <keil@b1-systems.de>
Sat, 25 Jul 2009 18:16:17 +0000 (20:16 +0200)
Normally HDLC packets contain more as one byte (e.g a X25/X75 header).
But if you use plain HDLC framing, the current code do not encode
1 byte payloads, this patch fix that.

Signed-off-by: Karsten Keil <keil@b1-systems.de>
drivers/isdn/i4l/isdnhdlc.c

index df345ce73f48db80a24ec0f4002b88190187f4c0..c989aa35dc2fc56ede0c29eafb8e34cd378bf1ae 100644 (file)
@@ -47,7 +47,7 @@ enum {
        HDLC_SEND_DATA, HDLC_SEND_CRC1, HDLC_SEND_FAST_FLAG,
        HDLC_SEND_FIRST_FLAG, HDLC_SEND_CRC2, HDLC_SEND_CLOSING_FLAG,
        HDLC_SEND_IDLE1, HDLC_SEND_FAST_IDLE, HDLC_SENDFLAG_B0,
-       HDLC_SENDFLAG_B1A6, HDLC_SENDFLAG_B7, STOPPED
+       HDLC_SENDFLAG_B1A6, HDLC_SENDFLAG_B7, STOPPED, HDLC_SENDFLAG_ONE
 };
 
 void isdnhdlc_rcv_init(struct isdnhdlc_vars *hdlc, u32 features)
@@ -362,6 +362,9 @@ int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, u16 slen,
 
        *count = slen;
 
+       /* special handling for one byte frames */
+       if ((slen == 1) && (hdlc->state == HDLC_SEND_FAST_FLAG))
+               hdlc->state = HDLC_SENDFLAG_ONE;
        while (dsize > 0) {
                if (hdlc->bit_shift == 0) {
                        if (slen && !hdlc->do_closing) {
@@ -407,6 +410,8 @@ int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, u16 slen,
                                dsize--;
                                break;
                        }
+                       /* fall through */
+               case HDLC_SENDFLAG_ONE:
                        if (hdlc->bit_shift == 8) {
                                hdlc->cbin = hdlc->ffvalue >>
                                        (8 - hdlc->data_bits);