Received: by 10.192.165.148 with SMTP id m20csp4188027imm; Mon, 30 Apr 2018 13:29:02 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpOzQvYbmqVnIshj2PHaYoFK/2weqmMDhLHZCkJHwlestfeOHBHZbjCSK6zCxDvLN5ARfTQ X-Received: by 10.98.25.15 with SMTP id 15mr11996146pfz.42.1525120142504; Mon, 30 Apr 2018 13:29:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525120142; cv=none; d=google.com; s=arc-20160816; b=eSEN2tIngzvaAUE1A03e5vLY6WEGVTKkYeUCmXlZrJ86XZXEQ0Bj/51+HHXJaLz4lt UZEkfVRZ6VSO/7Ba8+FpNwvlsGtAvBt/c8Bw1B14Aau5wE0/BszjC02RMLCd19HDCADD t0yW/2Gpm0qmFjGqGLFWsCX02OEVNI3YyIA5q6P4Lmj5lxO3D0P2NYpjNTy7Oa3rdqw4 dWPRtpIcHQC6po4nLNkTiPbowJngaw85izwDUgAYqG15qAvJaZf4rW7421Re2WW6a5m8 wuayv1nup9eFVYIIlr7ZLVUI7zuTWyyQVRh/gw8R3aFc5hKYzi7W7dSS8tDoNy/5j2C2 l5uA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from:dmarc-filter :arc-authentication-results; bh=TortM0bnCW88BCZdhcSOdvTHuZAkzL28nqZ+6ae1ZWQ=; b=KHnHxlwOAEFjk3IH6OycPbyRape6V8jaH40yAyREEJcP1MpRsUW1iGUfI6t2a4Iayk OyQ5NFqaCySqJYnpRAMhmMf1dS50TZL7RmZ7jHPqiWQJd+tS5LJr8P8ce1B/lh8FFzIU 0y1zHDwlFKmIn7//NRb+40lUmHmnIC7kKSi4xKUxiDQ3YxZ6tn0kxN2AI43u+n7l/aCh 0Sa+cyaQ8b2cu8zNf4WKMFN/mhg1GermwG5qSoqRlcCjzmqW1LEQZO2Ue6swuloeotoY HiA2gJcxrSrYtSbwM6j670x3O6viDZ0ZRHuvZUKgpRbg0c/AHnDOtT8YvPEehHLkLp3y h3hQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g3-v6si7687517pld.309.2018.04.30.13.28.48; Mon, 30 Apr 2018 13:29:02 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756138AbeD3U1b (ORCPT + 99 others); Mon, 30 Apr 2018 16:27:31 -0400 Received: from mail.kernel.org ([198.145.29.99]:59880 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755605AbeD3T0X (ORCPT ); Mon, 30 Apr 2018 15:26:23 -0400 Received: from localhost (unknown [104.132.1.102]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6971C22DC0; Mon, 30 Apr 2018 19:26:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6971C22DC0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=linuxfoundation.org Authentication-Results: mail.kernel.org; spf=fail smtp.mailfrom=gregkh@linuxfoundation.org From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, linux-serial@vger.kernel.org, Alan Cox , Dan Williams , Jiri Prchal , Jiri Slaby , Marcel Partap , Merlijn Wajer , Michael Nazzareno Trimarchi , Michael Scott , Pavel Machek , Peter Hurley , Russ Gorby , Sascha Hauer , Sebastian Reichel , Tony Lindgren Subject: [PATCH 4.9 21/61] tty: n_gsm: Fix long delays with control frame timeouts in ADM mode Date: Mon, 30 Apr 2018 12:24:24 -0700 Message-Id: <20180430183953.115809246@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180430183951.312721450@linuxfoundation.org> References: <20180430183951.312721450@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Tony Lindgren commit e9ec22547986dd32c5c70da78107ce35dbff1344 upstream. 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 Cc: Dan Williams Cc: Jiri Prchal Cc: Jiri Slaby Cc: Marcel Partap Cc: Merlijn Wajer Cc: Michael Nazzareno Trimarchi Cc: Michael Scott Cc: Pavel Machek Cc: Peter Hurley Cc: Russ Gorby Cc: Sascha Hauer Cc: Sebastian Reichel Signed-off-by: Tony Lindgren Cc: stable Signed-off-by: Greg Kroah-Hartman --- drivers/tty/n_gsm.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -137,6 +137,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; @@ -1380,7 +1383,13 @@ retry: 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); @@ -1488,6 +1497,7 @@ static void gsm_dlci_t1(unsigned long da 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);