linux-usb.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Johan Hovold <johan@kernel.org>
To: "Ji-Ze Hong \(Peter Hong\)" <hpeter@gmail.com>
Cc: peter_hong@fintek.com.tw, johan@kernel.org,
	gregkh@linuxfoundation.org, linux-usb@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	"Ji-Ze Hong \(Peter Hong\)" <hpeter+linux_kernel@gmail.com>
Subject: [V9,4/4] USB: serial: f81232: implement break control
Date: Fri, 3 May 2019 08:59:17 +0200	[thread overview]
Message-ID: <20190503065917.GA26546@localhost> (raw)

On Tue, Apr 30, 2019 at 09:22:32AM +0800, Ji-Ze Hong (Peter Hong) wrote:
> Implement Fintek F81232 break on/off with LCR register.
> It's the same with 16550A LCR register layout.
> 
> Signed-off-by: Ji-Ze Hong (Peter Hong) <hpeter+linux_kernel@gmail.com>
> ---

>  static void f81232_break_ctl(struct tty_struct *tty, int break_state)
>  {
> -	/* FIXME - Stubbed out for now */
> +	struct usb_serial_port *port = tty->driver_data;
> +	struct f81232_private *priv = usb_get_serial_port_data(port);
> +	int status;
>  
> -	/*
> -	 * break_state = -1 to turn on break, and 0 to turn off break
> -	 * see drivers/char/tty_io.c to see it used.
> -	 * last_set_data_urb_value NEVER has the break bit set in it.
> -	 */
> +	mutex_lock(&priv->lock);
> +
> +	if (break_state)
> +		priv->shadow_lcr |= UART_LCR_SBC;
> +	else
> +		priv->shadow_lcr &= ~UART_LCR_SBC;
> +
> +	status = f81232_set_register(port, LINE_CONTROL_REGISTER,
> +					priv->shadow_lcr);
> +	if (status)
> +		dev_err(&port->dev, "set break failed: %d\n", status);
> +
> +	mutex_unlock(&priv->lock);
>  }

> @@ -519,6 +530,7 @@ static int f81232_port_disable(struct usb_serial_port *port)
>  static void f81232_set_termios(struct tty_struct *tty,
>  		struct usb_serial_port *port, struct ktermios *old_termios)
>  {
> +	struct f81232_private *priv = usb_get_serial_port_data(port);
>  	u8 new_lcr = 0;
>  	int status = 0;
>  	speed_t baudrate;
> @@ -572,11 +584,16 @@ static void f81232_set_termios(struct tty_struct *tty,
>  		break;
>  	}
>  
> +	mutex_lock(&priv->lock);
> +
> +	new_lcr |= (priv->shadow_lcr & UART_LCR_SBC);
>  	status = f81232_set_register(port, LINE_CONTROL_REGISTER, new_lcr);
>  	if (status) {
>  		dev_err(&port->dev, "%s failed to set LCR: %d\n",
>  			__func__, status);
>  	}
> +
> +	mutex_unlock(&priv->lock);

You forgot to update shadow_lcr here so the line settings would be
corrupted (e.g set to 5 bit words) whenever a break is signalled.

Did you not test this version of the patch?

I added the missing update, but please test the code that's in my
usb-next branch in a minute and confirm everything works as expected.

All four patches now applied.

Thanks,
Johan

WARNING: multiple messages have this Message-ID (diff)
From: Johan Hovold <johan@kernel.org>
To: "Ji-Ze Hong (Peter Hong)" <hpeter@gmail.com>
Cc: peter_hong@fintek.com.tw, johan@kernel.org,
	gregkh@linuxfoundation.org, linux-usb@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	"Ji-Ze Hong (Peter Hong)" <hpeter+linux_kernel@gmail.com>
Subject: Re: [PATCH V9 4/4] USB: serial: f81232: implement break control
Date: Fri, 3 May 2019 08:59:17 +0200	[thread overview]
Message-ID: <20190503065917.GA26546@localhost> (raw)
Message-ID: <20190503065917.BBhdcuiSx4NwfL7e8Tq4ap0HvDEhgkjEc-fhW-Jtxb0@z> (raw)
In-Reply-To: <1556587352-19500-4-git-send-email-hpeter+linux_kernel@gmail.com>

On Tue, Apr 30, 2019 at 09:22:32AM +0800, Ji-Ze Hong (Peter Hong) wrote:
> Implement Fintek F81232 break on/off with LCR register.
> It's the same with 16550A LCR register layout.
> 
> Signed-off-by: Ji-Ze Hong (Peter Hong) <hpeter+linux_kernel@gmail.com>
> ---

>  static void f81232_break_ctl(struct tty_struct *tty, int break_state)
>  {
> -	/* FIXME - Stubbed out for now */
> +	struct usb_serial_port *port = tty->driver_data;
> +	struct f81232_private *priv = usb_get_serial_port_data(port);
> +	int status;
>  
> -	/*
> -	 * break_state = -1 to turn on break, and 0 to turn off break
> -	 * see drivers/char/tty_io.c to see it used.
> -	 * last_set_data_urb_value NEVER has the break bit set in it.
> -	 */
> +	mutex_lock(&priv->lock);
> +
> +	if (break_state)
> +		priv->shadow_lcr |= UART_LCR_SBC;
> +	else
> +		priv->shadow_lcr &= ~UART_LCR_SBC;
> +
> +	status = f81232_set_register(port, LINE_CONTROL_REGISTER,
> +					priv->shadow_lcr);
> +	if (status)
> +		dev_err(&port->dev, "set break failed: %d\n", status);
> +
> +	mutex_unlock(&priv->lock);
>  }

> @@ -519,6 +530,7 @@ static int f81232_port_disable(struct usb_serial_port *port)
>  static void f81232_set_termios(struct tty_struct *tty,
>  		struct usb_serial_port *port, struct ktermios *old_termios)
>  {
> +	struct f81232_private *priv = usb_get_serial_port_data(port);
>  	u8 new_lcr = 0;
>  	int status = 0;
>  	speed_t baudrate;
> @@ -572,11 +584,16 @@ static void f81232_set_termios(struct tty_struct *tty,
>  		break;
>  	}
>  
> +	mutex_lock(&priv->lock);
> +
> +	new_lcr |= (priv->shadow_lcr & UART_LCR_SBC);
>  	status = f81232_set_register(port, LINE_CONTROL_REGISTER, new_lcr);
>  	if (status) {
>  		dev_err(&port->dev, "%s failed to set LCR: %d\n",
>  			__func__, status);
>  	}
> +
> +	mutex_unlock(&priv->lock);

You forgot to update shadow_lcr here so the line settings would be
corrupted (e.g set to 5 bit words) whenever a break is signalled.

Did you not test this version of the patch?

I added the missing update, but please test the code that's in my
usb-next branch in a minute and confirm everything works as expected.

All four patches now applied.

Thanks,
Johan

         reply	other threads:[~2019-05-03  6:59 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-30  1:22 [V9,1/4] USB: serial: f81232: fix interrupt worker not stop Ji-Ze Hong (Peter Hong)
2019-04-30  1:22 ` [PATCH V9 1/4] " Ji-Ze Hong (Peter Hong)
2019-04-30  1:22 ` [V9,2/4] USB: serial: f81232: clear overrun flag Ji-Ze Hong (Peter Hong)
2019-04-30  1:22   ` [PATCH V9 2/4] " Ji-Ze Hong (Peter Hong)
2019-04-30  1:22 ` [V9,3/4] USB: serial: f81232: add high baud rate support Ji-Ze Hong (Peter Hong)
2019-04-30  1:22   ` [PATCH V9 3/4] " Ji-Ze Hong (Peter Hong)
2019-04-30  1:22 ` [V9,4/4] USB: serial: f81232: implement break control Ji-Ze Hong (Peter Hong)
2019-04-30  1:22   ` [PATCH V9 4/4] " Ji-Ze Hong (Peter Hong)
2019-05-03  6:59   ` Johan Hovold [this message]
2019-05-03  6:59     ` Johan Hovold
2019-05-06  2:52     ` [V9,4/4] " Ji-Ze Hong (Peter Hong)
2019-05-06  2:52       ` [PATCH V9 4/4] " Ji-Ze Hong (Peter Hong)
2019-05-07  9:16       ` Johan Hovold
2019-05-03  6:53 ` [V9,1/4] USB: serial: f81232: fix interrupt worker not stop Johan Hovold
2019-05-03  6:53   ` [PATCH V9 1/4] " Johan Hovold

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190503065917.GA26546@localhost \
    --to=johan@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=hpeter+linux_kernel@gmail.com \
    --cc=hpeter@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=peter_hong@fintek.com.tw \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).