linux/drivers/tty
Tony Lindgren 4ed8692bb2 tty: n_gsm: Allow ADM response in addition to UA for control dlci
[ Upstream commit ea3d8465ab ]

Some devices have the control dlci stay in ADM mode instead of the UA
mode. This can seen at least on droid 4 when trying to open the ts
27.010 mux port. Enabling n_gsm debug mode shows the control dlci
always respond with DM to SABM instead of UA:

# modprobe n_gsm debug=0xff
# ldattach -d GSM0710 /dev/ttyS0 &
gsmld_output: 00000000: f9 03 3f 01 1c f9
--> 0) C: SABM(P)
gsmld_receive: 00000000: f9 03 1f 01 36 f9
<-- 0) C: DM(P)
...
$ minicom -D /dev/gsmtty1
minicom: cannot open /dev/gsmtty1: No error information
$ strace minicom -D /dev/gsmtty1
...
open("/dev/gsmtty1", O_RDWR|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = -1 EL2HLT

Note that this is different issue from other n_gsm -EL2HLT issues such
as timeouts when the control dlci does not respond at all.

The ADM mode seems to be a quite common according to "RF Wireless World"
article "GSM Issue-UE sends SABM and gets a DM response instead of
UA response":

  This issue is most commonly observed in GSM networks where in UE sends
  SABM and expects network to send UA response but it ends up receiving
  DM response from the network. SABM stands for Set asynchronous balanced
  mode, UA stands for Unnumbered Acknowledge and DA stands for
  Disconnected Mode.

  An RLP entity can be in one of two modes:
  - Asynchronous Balanced Mode (ABM)
  - Asynchronous Disconnected Mode (ADM)

Currently Linux kernel closes the control dlci after several retries
in gsm_dlci_t1() on DM. This causes n_gsm /dev/gsmtty ports to produce
error code -EL2HLT when trying to open them as the closing of control
dlci has already set gsm->dead.

Let's fix the issue by allowing control dlci stay in ADM mode after the
retries so the /dev/gsmtty ports can be opened and used. It seems that
it might take several attempts to get any response from the control
dlci, so it's best to allow ADM mode only after the SABM retries are
done.

Note that for droid 4 additional patches are needed to mux the ttyS0
pins and to toggle RTS gpio_149 to wake up the mdm6600 modem are also
needed to use n_gsm. And the mdm6600 modem needs to be powered on.

Cc: linux-serial@vger.kernel.org
Cc: Alan Cox <alan@llwyncelyn.cymru>
Cc: Jiri Prchal <jiri.prchal@aksignal.cz>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: Marcel Partap <mpartap@gmx.net>
Cc: Michael Scott <michael.scott@linaro.org>
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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2018-04-12 12:32:19 +02:00
..
hvc License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ipwireless License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
serdev serdev: ttyport: enforce tty-driver open() requirement 2017-12-20 10:10:33 +01:00
serial serial: 8250: Add Nuvoton NPCM UART 2018-04-08 14:26:30 +02:00
vt vt: change SGR 21 to follow the standards 2018-04-08 14:26:33 +02:00
amiserial.c tty: amiserial: drop broken alt-speed support 2017-06-13 11:49:58 +02:00
bfin_jtag_comm.c TTY: bfin_jtag_comm: remove incorrect wait_until_sent operation 2015-03-07 03:44:14 +01:00
cyclades.c tty: cyclades: drop broken alt-speed support 2017-06-13 11:49:58 +02:00
ehv_bytechan.c tty: Convert to using %pOF instead of full_name 2017-07-30 07:35:28 -07:00
goldfish.c tty: goldfish: Enable 'earlycon' only if built-in 2018-03-24 11:01:23 +01:00
isicom.c tty: isicom: constify pci_device_id. 2017-07-30 07:35:27 -07:00
Kconfig tty: goldfish: Enable 'earlycon' only if built-in 2018-03-24 11:01:23 +01:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
metag_da.c timers, drivers/tty/metag_da: Initialize the poll timer as pinned 2016-07-07 10:25:14 +02:00
mips_ejtag_fdc.c tty: mips_ejtag_fdc: constify mips_cdmm_device_id 2017-08-28 20:51:22 +02:00
moxa.c tty: moxa: constify pci_device_id. 2017-07-30 07:35:28 -07:00
moxa.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mxser.c mxser: fix timeout calculation for low rates 2017-09-18 18:19:20 +02:00
mxser.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
n_gsm.c tty: n_gsm: Allow ADM response in addition to UA for control dlci 2018-04-12 12:32:19 +02:00
n_hdlc.c format-security: move static strings to const 2017-05-08 17:15:14 -07:00
n_null.c tty: handle the case where we cannot restore a line discipline 2017-06-03 18:43:46 +09:00
n_r3964.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
n_tracerouter.c n_tracerouter: stop including <asm-generic/bug> 2015-10-15 00:21:10 +02:00
n_tracesink.c n_tracesink: stop including <asm-generic/bug> 2015-10-15 00:21:11 +02:00
n_tracesink.h n_tracerouter and n_tracesink ldisc additions. 2011-05-13 16:31:00 -07:00
n_tty.c n_tty: fix EXTPROC vs ICANON interaction with TIOCINQ (aka FIONREAD) 2018-01-02 20:31:17 +01:00
nozomi.c tty: nozomi: avoid sprintf buffer overflow 2016-11-29 20:20:07 +01:00
pty.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
rocket.c tty: rocket: drop broken alt-speed support 2017-06-13 11:49:58 +02:00
rocket.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
rocket_int.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
synclink.c tty: synclink: constify pci_device_id. 2017-07-30 07:35:27 -07:00
synclink_gt.c tty: synclink_gt: constify pci_device_id. 2017-07-30 07:35:28 -07:00
synclinkmp.c tty: synclinkmp: constify pci_device_id. 2017-07-30 07:35:27 -07:00
sysrq.c sysrq : fix Show Regs call trace on ARM 2017-12-10 13:40:42 +01:00
tty_audit.c tty: audit: remove unused variable 2016-03-07 16:11:14 -08:00
tty_baudrate.c tty: move baudrate handling code to a file of its own 2017-04-18 18:01:52 +02:00
tty_buffer.c tty: fix tty_ldisc_receive_buf() documentation 2018-01-02 20:31:17 +01:00
tty_io.c pty: cancel pty slave port buf's work in tty_release 2018-03-24 11:01:26 +01:00
tty_ioctl.c tty: move baudrate handling code to a file of its own 2017-04-18 18:01:52 +02:00
tty_jobctrl.c tty: split job control support into a file of its own 2017-04-18 18:01:52 +02:00
tty_ldisc.c tty: fix data race between tty_init_dev and flush of buf 2018-02-03 17:39:19 +01:00
tty_ldsem.c sched/headers: Prepare to move the get_task_struct()/put_task_struct() and related APIs from <linux/sched.h> to <linux/sched/task.h> 2017-03-02 08:42:40 +01:00
tty_mutex.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
tty_port.c Revert "tty: fix port buffer locking" 2017-06-04 10:23:25 +02:00
vcc.c sparc64: vcc: make ktermios const 2017-08-29 15:10:44 -07:00