Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753994AbcD2NDV (ORCPT ); Fri, 29 Apr 2016 09:03:21 -0400 Received: from mail-lf0-f67.google.com ([209.85.215.67]:36132 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753392AbcD2NDS (ORCPT ); Fri, 29 Apr 2016 09:03:18 -0400 Date: Fri, 29 Apr 2016 15:03:18 +0200 From: Johan Hovold To: Grigori Goronzy Cc: Johan Hovold , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v4 05/13] USB: ch341: reinitialize chip on reconfiguration Message-ID: <20160429130318.GI22229@localhost> References: <1460754856-27908-1-git-send-email-greg@chown.ath.cx> <1460754856-27908-6-git-send-email-greg@chown.ath.cx> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460754856-27908-6-git-send-email-greg@chown.ath.cx> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3223 Lines: 102 On Fri, Apr 15, 2016 at 11:14:08PM +0200, Grigori Goronzy wrote: > Changing the LCR register after initialization does not seem to be > reliable on all chips (particularly not on CH341A). Restructure > initialization and configuration to always reinit the chip on > configuration changes instead and pass the LCR register value directly > to the initialization command. > > v2: get rid of unused variable, improve error handling. > > Tested-by: Ryan Barber > Signed-off-by: Grigori Goronzy > --- > drivers/usb/serial/ch341.c | 47 ++++++++++++++++++++++++---------------------- > 1 file changed, 25 insertions(+), 22 deletions(-) > > diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c > index 95c8a40..6181616 100644 > --- a/drivers/usb/serial/ch341.c > +++ b/drivers/usb/serial/ch341.c > @@ -61,6 +61,8 @@ > * the Net/FreeBSD uchcom.c driver by Takanori Watanabe. Domo arigato. > */ > > +#define CH341_SERIAL_INIT 0xA1 > +#define CH341_VERSION 0x5F Use the CH341_REQ prefix keep the entries sorted. > #define CH341_MODEM_CTRL 0xA4 > #define CH341_REQ_WRITE_REG 0x9A > #define CH341_REQ_READ_REG 0x95 > @@ -129,10 +131,10 @@ static int ch341_control_in(struct usb_device *dev, > return r; > } > > -static int ch341_set_baudrate(struct usb_device *dev, > - struct ch341_private *priv) > +static int ch341_init_set_baudrate(struct usb_device *dev, > + struct ch341_private *priv, unsigned ctrl) > { > - short a, b; > + short a; > int r; > unsigned long factor; > short divisor; > @@ -152,11 +154,8 @@ static int ch341_set_baudrate(struct usb_device *dev, > > factor = 0x10000 - factor; > a = (factor & 0xff00) | divisor; > - b = factor & 0xff; > > - r = ch341_control_out(dev, 0x9a, 0x1312, a); > - if (!r) > - r = ch341_control_out(dev, 0x9a, 0x0f2c, b); > + r = ch341_control_out(dev, CH341_SERIAL_INIT, 0x9c | (ctrl << 8), a | 0x80); > > return r; > } > @@ -177,7 +176,7 @@ static int ch341_get_status(struct usb_device *dev, struct ch341_private *priv) > if (!buffer) > return -ENOMEM; > > - r = ch341_control_in(dev, 0x95, 0x0706, 0, buffer, size); > + r = ch341_control_in(dev, CH341_REQ_READ_REG, 0x0706, 0, buffer, size); This looks like an unrelated change. > if (r < 0) > goto out; > > @@ -207,24 +206,20 @@ static int ch341_configure(struct usb_device *dev, struct ch341_private *priv) > return -ENOMEM; > > /* expect two bytes 0x27 0x00 */ > - r = ch341_control_in(dev, 0x5f, 0, 0, buffer, size); > + r = ch341_control_in(dev, CH341_VERSION, 0, 0, buffer, size); Ditto. > if (r < 0) > goto out; > > - r = ch341_control_out(dev, 0xa1, 0, 0); > - if (r < 0) > - goto out; > - > - r = ch341_set_baudrate(dev, priv); > + r = ch341_control_out(dev, CH341_SERIAL_INIT, 0, 0); > if (r < 0) > goto out; > > /* expect two bytes 0x56 0x00 */ > - r = ch341_control_in(dev, 0x95, 0x2518, 0, buffer, size); > + r = ch341_control_in(dev, CH341_REQ_READ_REG, 0x2518, 0, buffer, size); So does this. Please fix up all the magic constants in a preparatory patch, which should make it easier to see what's really going on here. Thanks, Johan