From: Tony Lindgren <tony@atomide.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org,
Alan Cox <alan@llwyncelyn.cymru>, Dan Williams <dcbw@redhat.com>,
Jiri Prchal <jiri.prchal@aksignal.cz>,
Jiri Slaby <jslaby@suse.cz>, Marcel Partap <mpartap@gmx.net>,
Merlijn Wajer <merlijn@wizzup.org>,
Michael Nazzareno Trimarchi <michael@amarulasolutions.com>,
Michael Scott <michael.scott@linaro.org>,
Pavel Machek <pavel@ucw.cz>,
Peter Hurley <peter@hurleysoftware.com>,
Russ Gorby <russ.gorby@intel.com>,
Sascha Hauer <s.hauer@pengutronix.de>,
Sebastian Reichel <sre@kernel.org>
Subject: [PATCH 1/2] tty: n_gsm: Fix long delays with control frame timeouts in ADM mode
Date: Sat, 7 Apr 2018 10:19:50 -0700 [thread overview]
Message-ID: <20180407171951.122759-1-tony@atomide.com> (raw)
Commit ea3d8465ab9b ("tty: n_gsm: Allow ADM response in addition to UA for
control dlci") added support for DLCI to stay in Asynchronous Disconnected
Mode (ADM). But we still get long delays waiting for commands to other
DLCI to complete:
--> 5) C: SABM(P)
Q> 0) C: UIH(F)
Q> 0) C: UIH(F)
Q> 0) C: UIH(F)
...
This happens because gsm_control_send() sets cretries timer to T2 that is
by default set to 34. This will cause resend for T2 times for the control
frame. In ADM mode, we will never get a response so the control frame, so
retries are just delaying all the commands.
Let's fix the issue by setting DLCI_MODE_ADM flag after detecting the ADM
mode for the control DLCI. Then we can use that in gsm_control_send() to
set retries to 1. This means the control frame will be sent once allowing
the other end at an opportunity to switch from ADM to ABM mode.
Note that retries will be decremented in gsm_control_retransmit() so
we don't want to set it to 0 here.
Fixes: ea3d8465ab9b ("tty: n_gsm: Allow ADM response in addition to UA for
control dlci")
Cc: linux-serial@vger.kernel.org
Cc: Alan Cox <alan@llwyncelyn.cymru>
Cc: Dan Williams <dcbw@redhat.com>
Cc: Jiri Prchal <jiri.prchal@aksignal.cz>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: Marcel Partap <mpartap@gmx.net>
Cc: Merlijn Wajer <merlijn@wizzup.org>
Cc: Michael Nazzareno Trimarchi <michael@amarulasolutions.com>
Cc: Michael Scott <michael.scott@linaro.org>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Peter Hurley <peter@hurleysoftware.com>
Cc: Russ Gorby <russ.gorby@intel.com>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Tony Lindgren <tony@atomide.com>
---
drivers/tty/n_gsm.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
--- a/drivers/tty/n_gsm.c
+++ b/drivers/tty/n_gsm.c
@@ -121,6 +121,9 @@ struct gsm_dlci {
struct mutex mutex;
/* Link layer */
+ int mode;
+#define DLCI_MODE_ABM 0 /* Normal Asynchronous Balanced Mode */
+#define DLCI_MODE_ADM 1 /* Asynchronous Disconnected Mode */
spinlock_t lock; /* Protects the internal state */
struct timer_list t1; /* Retransmit timer for SABM and UA */
int retries;
@@ -1364,7 +1367,13 @@ static struct gsm_control *gsm_control_send(struct gsm_mux *gsm,
ctrl->data = data;
ctrl->len = clen;
gsm->pending_cmd = ctrl;
- gsm->cretries = gsm->n2;
+
+ /* If DLCI0 is in ADM mode skip retries, it won't respond */
+ if (gsm->dlci[0]->mode == DLCI_MODE_ADM)
+ gsm->cretries = 1;
+ else
+ gsm->cretries = gsm->n2;
+
mod_timer(&gsm->t2_timer, jiffies + gsm->t2 * HZ / 100);
gsm_control_transmit(gsm, ctrl);
spin_unlock_irqrestore(&gsm->control_lock, flags);
@@ -1472,6 +1481,7 @@ static void gsm_dlci_t1(struct timer_list *t)
if (debug & 8)
pr_info("DLCI %d opening in ADM mode.\n",
dlci->addr);
+ dlci->mode = DLCI_MODE_ADM;
gsm_dlci_open(dlci);
} else {
gsm_dlci_close(dlci);
--
2.17.0
next reply other threads:[~2018-04-07 17:19 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-07 17:19 Tony Lindgren [this message]
2018-04-07 17:19 ` [PATCH 2/2] tty: n_gsm: Fix DLCI handling for ADM mode if debug & 2 is not set Tony Lindgren
2018-04-08 9:02 ` [PATCH 1/2] tty: n_gsm: Fix long delays with control frame timeouts in ADM mode Pavel Machek
2018-04-08 16:50 ` Tony Lindgren
2018-04-08 19:06 ` Pavel Machek
2018-04-08 23:57 ` Tony Lindgren
2018-04-09 10:54 ` Pavel Machek
2018-04-09 13:42 ` Tony Lindgren
2018-04-10 11:09 ` Pavel Machek
2018-04-10 13:43 ` Tony Lindgren
2018-04-12 21:24 ` Pavel Machek
2018-04-13 0:24 ` Tony Lindgren
2018-04-16 8:44 ` Pavel Machek
2018-04-16 14:47 ` Tony Lindgren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180407171951.122759-1-tony@atomide.com \
--to=tony@atomide.com \
--cc=alan@llwyncelyn.cymru \
--cc=dcbw@redhat.com \
--cc=gregkh@linuxfoundation.org \
--cc=jiri.prchal@aksignal.cz \
--cc=jslaby@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=merlijn@wizzup.org \
--cc=michael.scott@linaro.org \
--cc=michael@amarulasolutions.com \
--cc=mpartap@gmx.net \
--cc=pavel@ucw.cz \
--cc=peter@hurleysoftware.com \
--cc=russ.gorby@intel.com \
--cc=s.hauer@pengutronix.de \
--cc=sre@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox