From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756230AbcBVWyA (ORCPT ); Mon, 22 Feb 2016 17:54:00 -0500 Received: from [46.54.226.45] ([46.54.226.45]:48868 "EHLO mail.tnode.com" rhost-flags-FAIL-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1755866AbcBVWx6 (ORCPT ); Mon, 22 Feb 2016 17:53:58 -0500 From: Andrej Krpic To: xinhuix.pan@intel.com Cc: linux-kernel@vger.kernel.org, jslaby@suse.com, gregkh@linuxfoundation.org, Andrej Krpic Subject: [PATCH 3/8] tty: n_gsm: make mux work as a responder station Date: Mon, 22 Feb 2016 23:53:11 +0100 Message-Id: <1456181596-11736-4-git-send-email-ak77@tnode.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1456181596-11736-1-git-send-email-ak77@tnode.com> References: <1456181596-11736-1-git-send-email-ak77@tnode.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Comment suggests that cr == 1 represents a received command and cr == 0 a received response. Received frames are then filtered: - correctly by rejection of SABM and DISC responses, they are command only frame types and - incorrectly by rejection of UA (a response only frame type) responses. Mux as a initiator successfully establishes DLC by receiving UA response frame to a previously sent open channel command (SABM). Incorrect equation (eqA) makes UA "reject cr == 0 commands" case correct, but filters out all received SABM and DISC command frames. Change eqA to eqB to match the intent and fix filtering of UA frames. This enables reception of SABM and DISC frames and consequently makes mux work as a responder station. received receiving as eqA eqB 3GPP TS 27.010 CR bit initiator (ir) cr=CR^(1-ir) cr=CR^ir 5.2.1.2 0 0 1 0 0 (response) 1 0 _\ 0 1 1 (command) 0 1 / 0 1 1 (command) 1 1 1 0 0 (response) Signed-off-by: Andrej Krpic --- drivers/tty/n_gsm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index a0fb92c..05b562d 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -1798,7 +1798,7 @@ static void gsm_queue(struct gsm_mux *gsm) gsm_print_packet("<--", address, cr, gsm->control, gsm->buf, gsm->len); - cr ^= 1 - gsm->initiator; /* Flip so 1 always means command */ + cr ^= gsm->initiator; /* Flip so 1 always means command */ dlci = gsm->dlci[address]; switch (gsm->control) { @@ -1829,7 +1829,7 @@ static void gsm_queue(struct gsm_mux *gsm) break; case UA: case UA|PF: - if (cr == 0 || dlci == NULL) + if (cr || dlci == NULL) break; switch (dlci->state) { case DLCI_CLOSING: -- 2.7.0