Messages in this thread Patch in this message | | | From | Andrej Krpic <> | Subject | [PATCH 8/8] tty: n_gsm: Enable reception of frames separated with a single SOF marker | Date | Mon, 22 Feb 2016 23:53:16 +0100 |
| |
Frames may be separated with a single SOF (5.2.6.1 of 27.010 mux spec). While transmission of a single SOF between frames is implemented in gsm_data_kick, the reception isn't.
As a side effect, it is now possible to receive and ignore a stream of consecutive SOFs (5.2.5 of 27.010 mux spec).
Signed-off-by: Andrej Krpic <ak77@tnode.com> --- drivers/tty/n_gsm.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index b0d9edd..12b149d 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -1895,9 +1895,14 @@ static void gsm0_receive(struct gsm_mux *gsm, unsigned char c) } break; case GSM_ADDRESS: /* Address EA */ - gsm->fcs = gsm_fcs_add(gsm->fcs, c); + /* Ignore (not first) GSM0_SOF as it decodes into + * reserved DLCI 62 (5.6 of the 27.010 mux spec). + */ + if (c == GSM0_SOF) + break; if (gsm_read_ea(&gsm->address, c)) gsm->state = GSM_CONTROL; + gsm->fcs = gsm_fcs_add(gsm->fcs, c); break; case GSM_CONTROL: /* Control Byte */ gsm->fcs = gsm_fcs_add(gsm->fcs, c); @@ -1944,13 +1949,10 @@ static void gsm0_receive(struct gsm_mux *gsm, unsigned char c) case GSM_FCS: /* FCS follows the packet */ gsm->received_fcs = c; gsm_queue(gsm); - gsm->state = GSM_SSOF; - break; - case GSM_SSOF: - if (c == GSM0_SOF) { - gsm->state = GSM_SEARCH; - break; - } + /* Frames can be separated with a single GSM0_SOF. + * Deal with consecutive GSM0_SOFs in GSM_ADDRESS. + */ + gsm->state = GSM_SEARCH; break; } } -- 2.7.0
| |