According to 3GPP 27.010 chapter 5.2.7.3 DC1 and DC3 (SW flow control) are to be treated according to ISO/IEC 646. That means the MSB shall be ignored. This patch applies the needed changes to handle this correctly. Signed-off-by: Daniel Starke <daniel.starke@xxxxxxxxxxx> --- drivers/tty/n_gsm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index 0b96b14bbfe1..9ee0643fc9e2 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -322,6 +322,7 @@ static int addr_cnt; #define GSM1_ESCAPE_BITS 0x20 #define XON 0x11 #define XOFF 0x13 +#define ASCII_MASK 0x7F static const struct tty_port_operations gsm_port_ops; @@ -521,7 +522,7 @@ static void gsm_print_packet(const char *hdr, int addr, int cr, * @output: output buffer * @len: length of input * - * Expand a buffer by bytestuffing it. The worst case size change + * Expand a buffer by byte stuffing it. The worst case size change * is doubling and the caller is responsible for handing out * suitable sized buffers. */ @@ -531,7 +532,8 @@ static int gsm_stuff_frame(const u8 *input, u8 *output, int len) int olen = 0; while (len--) { if (*input == GSM1_SOF || *input == GSM1_ESCAPE - || *input == XON || *input == XOFF) { + || (*input & ASCII_MASK) == XON + || (*input & ASCII_MASK) == XOFF) { *output++ = GSM1_ESCAPE; *output++ = *input++ ^ GSM1_ESCAPE_BITS; olen++; -- 2.25.1