| From b2d89ad9c9682e795ed6eeb9ed455789ad6cedf1 Mon Sep 17 00:00:00 2001 |
| From: Tony Lindgren <tony@atomide.com> |
| Date: Sat, 7 Apr 2018 10:19:51 -0700 |
| Subject: tty: n_gsm: Fix DLCI handling for ADM mode if debug & 2 is not set |
| |
| From: Tony Lindgren <tony@atomide.com> |
| |
| commit b2d89ad9c9682e795ed6eeb9ed455789ad6cedf1 upstream. |
| |
| At least on droid 4 with control channel in ADM mode, there is no response |
| to Modem Status Command (MSC). Currently gsmtty_modem_update() expects to |
| have data in dlci->modem_rx unless debug & 2 is set. This means that on |
| droid 4, things only work if debug & 2 is set. |
| |
| Let's fix the issue by ignoring empty dlci->modem_rx for ADM mode. In |
| the AMD mode, CMD_MSC will never respond and gsm_process_modem() won't |
| get called to set dlci->modem_rx. |
| |
| And according to ts_127010v140000p.pdf, MSC is only relevant if basic |
| option is chosen, so let's test for that too. |
| |
| 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> |
| Cc: stable <stable@vger.kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/tty/n_gsm.c | 11 +++++++++++ |
| 1 file changed, 11 insertions(+) |
| |
| --- a/drivers/tty/n_gsm.c |
| +++ b/drivers/tty/n_gsm.c |
| @@ -2891,11 +2891,22 @@ static int gsmtty_modem_update(struct gs |
| static int gsm_carrier_raised(struct tty_port *port) |
| { |
| struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port); |
| + struct gsm_mux *gsm = dlci->gsm; |
| + |
| /* Not yet open so no carrier info */ |
| if (dlci->state != DLCI_OPEN) |
| return 0; |
| if (debug & 2) |
| return 1; |
| + |
| + /* |
| + * Basic mode with control channel in ADM mode may not respond |
| + * to CMD_MSC at all and modem_rx is empty. |
| + */ |
| + if (gsm->encoding == 0 && gsm->dlci[0]->mode == DLCI_MODE_ADM && |
| + !dlci->modem_rx) |
| + return 1; |
| + |
| return dlci->modem_rx & TIOCM_CD; |
| } |
| |