From patchwork Fri May 18 13:25:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johan Hovold X-Patchwork-Id: 10410757 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id F3B586037D for ; Fri, 18 May 2018 13:26:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E46D028982 for ; Fri, 18 May 2018 13:26:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D92BC28988; Fri, 18 May 2018 13:26:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6DDE128982 for ; Fri, 18 May 2018 13:26:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751672AbeERN0J (ORCPT ); Fri, 18 May 2018 09:26:09 -0400 Received: from mail-lf0-f68.google.com ([209.85.215.68]:32906 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751298AbeERN0F (ORCPT ); Fri, 18 May 2018 09:26:05 -0400 Received: by mail-lf0-f68.google.com with SMTP id h9-v6so13985071lfi.0 for ; Fri, 18 May 2018 06:26:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=CrHNaqZMqbFTSqXuANMWVnKD8gIoxxIMUEq6HzA+zVA=; b=fUo1sjlzlBDDXe2Lf5kgRWfPUzUNufEBb+Lkpb70QzaehAxdwqC+ikfK7H0VNi0ya4 XhHWs5GivlEu9u4KuzgH1lg3OVIbujO7ZDDHDXjuN4EbO7+yQNXWkxeim7cPQ9UcLPRu SKFr2hmYXWWZT12M/ikreTCu96A8uR5a+AnOobdDOpaQfl+LyQisD6ORkiccKv5JZWb9 vzSxswh1wC2vddkA0THjobXtTYXlvys2/LLJOhqISMoOmA4CYuOk0znhMcFFBD6vj17W /vqmjEom8kNN2u8960gL0ZnWF564wWYCKnpcCj2xC6g1+eWR66M2CE1kccQX/10XrAcy 0yyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=CrHNaqZMqbFTSqXuANMWVnKD8gIoxxIMUEq6HzA+zVA=; b=VqQMbxhj/TBuUlAxJjMR6L9He9aRlqcKN9MXbEZkEjP0DnH9/m1OuDfk4a8efEWyFM 9fi4pssxzdtmP9Ee4vC2HxT7ujImkC/1TSFWj78UFFJFVpm3PhNvERotMthGjPnBxNkd v0laQLZKqEJQzxlthxjJMskzBYckMXsgXZZDQ9ez8qjWvRQEyOhx1UOW8FdnDyadeUCp eW2aK+H595owVY9S6+Vw7PL8kvi9KsmHyy9SyYvtoSB9rh3zsox7MVJhPldmRLgrSnD+ TIe7UhMC5I0a4SL6wB2ucDyplEDh58D9yYHMtUy88SI6IqKN37bN4EIL2dXXjZo+8UBC UE8Q== X-Gm-Message-State: ALKqPwfKQPJoKWu+PA943Fg2wRVywh0eqt2/koGGNxngF0W4fscHyFHq bpSv2170sk16aqooMUXF1+k= X-Google-Smtp-Source: AB8JxZroT8cH+7fXyqR2JAB+h7ffKoA3yJZmQKhyYmgQ5ki08txLl5OFlWMuJMBYjHNe1NpY3NJlww== X-Received: by 2002:a19:51c9:: with SMTP id g70-v6mr13458329lfl.50.1526649963765; Fri, 18 May 2018 06:26:03 -0700 (PDT) Received: from xi.terra (c-8bb2e655.07-184-6d6c6d4.bbcust.telenor.se. [85.230.178.139]) by smtp.gmail.com with ESMTPSA id c1-v6sm1272188ljk.80.2018.05.18.06.26.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 18 May 2018 06:26:02 -0700 (PDT) Received: from johan by xi.terra with local (Exim 4.90_1) (envelope-from ) id 1fJfOT-0005fr-0E; Fri, 18 May 2018 15:26:01 +0200 From: Johan Hovold To: Johan Hovold Cc: Greg Kroah-Hartman , linux-usb@vger.kernel.org Subject: [PATCH 4/4] USB: serial: ftdi_sio: clean up flow control management Date: Fri, 18 May 2018 15:25:50 +0200 Message-Id: <20180518132550.21749-5-johan@kernel.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180518132550.21749-1-johan@kernel.org> References: <20180518132550.21749-1-johan@kernel.org> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Clean up the somewhat convoluted hardware-assisted flow control handling. Signed-off-by: Johan Hovold Reviewed-by: Greg Kroah-Hartman --- drivers/usb/serial/ftdi_sio.c | 81 ++++++++++------------------------- 1 file changed, 23 insertions(+), 58 deletions(-) diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 3d7f181e7e2a..b5cef322826f 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -2191,12 +2191,8 @@ static void ftdi_set_termios(struct tty_struct *tty, struct ftdi_private *priv = usb_get_serial_port_data(port); struct ktermios *termios = &tty->termios; unsigned int cflag = termios->c_cflag; - u16 value; - - /* Added for xon/xoff support */ - unsigned int iflag = termios->c_iflag; - unsigned char vstop; - unsigned char vstart; + u16 value, index; + int ret; /* Force baud rate if this device requires it, unless it is set to B0. */ @@ -2325,61 +2321,30 @@ static void ftdi_set_termios(struct tty_struct *tty, set_mctrl(port, TIOCM_DTR | TIOCM_RTS); } - /* Set flow control */ - /* Note device also supports DTR/CD (ugh) and Xon/Xoff in hardware */ no_c_cflag_changes: - if (cflag & CRTSCTS) { - dev_dbg(ddev, "%s Setting to CRTSCTS flow control\n", __func__); - if (usb_control_msg(dev, - usb_sndctrlpipe(dev, 0), - FTDI_SIO_SET_FLOW_CTRL_REQUEST, - FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE, - 0 , (FTDI_SIO_RTS_CTS_HS | priv->interface), - NULL, 0, WDR_TIMEOUT) < 0) { - dev_err(ddev, "urb failed to set to rts/cts flow control\n"); - } + /* Set hardware-assisted flow control */ + value = 0; + + if (C_CRTSCTS(tty)) { + dev_dbg(&port->dev, "enabling rts/cts flow control\n"); + index = FTDI_SIO_RTS_CTS_HS; + } else if (I_IXON(tty)) { + dev_dbg(&port->dev, "enabling xon/xoff flow control\n"); + index = FTDI_SIO_XON_XOFF_HS; + value = STOP_CHAR(tty) << 8 | START_CHAR(tty); } else { - /* - * Xon/Xoff code - */ - if (iflag & IXON) { - dev_dbg(ddev, "%s request to enable xonxoff iflag=%04x\n", - __func__, iflag); - /* Try to enable the XON/XOFF on the ftdi_sio - * Set the vstart and vstop -- could have been done up - * above where a lot of other dereferencing is done but - * that would be very inefficient as vstart and vstop - * are not always needed. - */ - vstart = termios->c_cc[VSTART]; - vstop = termios->c_cc[VSTOP]; - value = (vstop << 8) | (vstart); - - if (usb_control_msg(dev, - usb_sndctrlpipe(dev, 0), - FTDI_SIO_SET_FLOW_CTRL_REQUEST, - FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE, - value , (FTDI_SIO_XON_XOFF_HS - | priv->interface), - NULL, 0, WDR_TIMEOUT) < 0) { - dev_err(&port->dev, "urb failed to set to " - "xon/xoff flow control\n"); - } - } else { - /* else clause to only run if cflag ! CRTSCTS and iflag - * ! XON. CHECKME Assuming XON/XOFF handled by tty - * stack - not by device */ - dev_dbg(ddev, "%s Turning off hardware flow control\n", __func__); - if (usb_control_msg(dev, - usb_sndctrlpipe(dev, 0), - FTDI_SIO_SET_FLOW_CTRL_REQUEST, - FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE, - 0, priv->interface, - NULL, 0, WDR_TIMEOUT) < 0) { - dev_err(ddev, "urb failed to clear flow control\n"); - } - } + dev_dbg(&port->dev, "disabling flow control\n"); + index = FTDI_SIO_DISABLE_FLOW_CTRL; } + + index |= priv->interface; + + ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), + FTDI_SIO_SET_FLOW_CTRL_REQUEST, + FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE, + value, index, NULL, 0, WDR_TIMEOUT); + if (ret < 0) + dev_err(&port->dev, "failed to set flow control: %d\n", ret); } /*