• Daniel Starke's avatar
    tty: n_gsm: fix restart handling via CLD command · aa371e96
    Daniel Starke authored
    n_gsm is based on the 3GPP 07.010 and its newer version is the 3GPP 27.010.
    See https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=1516
    The changes from 07.010 to 27.010 are non-functional. Therefore, I refer to
    the newer 27.010 here. Chapter 5.8.2 states that both sides will revert to
    the non-multiplexed mode via a close-down message (CLD). The usual program
    flow is as following:
    - start multiplex mode by sending AT+CMUX to the mobile
    - establish the control channel (DLCI 0)
    - establish user channels (DLCI >0)
    - terminate user channels
    - send close-down message (CLD)
    - revert to AT protocol (i.e. leave multiplexed mode)
    
    The AT protocol is out of scope of the n_gsm driver. However,
    gsm_disconnect() sends CLD if gsm_config() detects that the requested
    parameters require the mux protocol to restart. The next immediate action
    is to start the mux protocol by opening DLCI 0 again. Any responder side
    which handles CLD commands correctly forces us to fail at this point
    because AT+CMUX needs to be sent to the mobile to start the mux again.
    Therefore, remove the CLD command in this phase and keep both sides in
    multiplexed mode.
    Remove the gsm_disconnect() function as it become unnecessary and merge the
    remaining parts into gsm_cleanup_mux() to handle the termination order and
    locking correctly.
    
    Fixes: 71e07791 ("tty: n_gsm: do not send/receive in ldisc close path")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarDaniel Starke <daniel.starke@siemens.com>
    Link: https://lore.kernel.org/r/20220414094225.4527-2-daniel.starke@siemens.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    aa371e96
n_gsm.c 80.9 KB