All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johan Hovold <johan@kernel.org>
To: Peter Hung <hpeter@gmail.com>
Cc: johan@kernel.org, gregkh@linuxfoundation.org,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	tom_tsai@fintek.com.tw, peter_hong@fintek.com.tw,
	Peter Hung <hpeter+linux_kernel@gmail.com>
Subject: Re: [PATCH v4 3/7] usb: serial: implement read IIR/MSR ep for F81232
Date: Wed, 4 Feb 2015 13:41:28 +0100	[thread overview]
Message-ID: <20150204124128.GC13757@localhost> (raw)
In-Reply-To: <1422598421-6236-3-git-send-email-hpeter+linux_kernel@gmail.com>

On Fri, Jan 30, 2015 at 02:13:37PM +0800, Peter Hung wrote:
> The F81232 interrupt ep will continuously report IIR register value.
> We had implement the interrupt callback to read IIR, If noticed with
> MSR change, we will call worker to read MSR later.
> 
> Signed-off-by: Peter Hung <hpeter+linux_kernel@gmail.com>
> ---
>  drivers/usb/serial/f81232.c | 114 +++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 107 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c
> index 9ef9775..274120d 100644
> --- a/drivers/usb/serial/f81232.c
> +++ b/drivers/usb/serial/f81232.c
> @@ -23,6 +23,7 @@
>  #include <linux/uaccess.h>
>  #include <linux/usb.h>
>  #include <linux/usb/serial.h>
> +#include <linux/serial_reg.h>
>  
>  static const struct usb_device_id id_table[] = {
>  	{ USB_DEVICE(0x1934, 0x0706) },
> @@ -44,23 +45,112 @@ MODULE_DEVICE_TABLE(usb, id_table);
>  #define UART_OVERRUN_ERROR		0x40
>  #define UART_CTS			0x80

Now that your including serial_req and using the standard register
masks, you should remove the old (incorrect ones) at some point. Most
are left unused after the whole series has been applied (except UART_DCD
and that looks like a bug).

>  
> +#define REGISTER_REQUEST 0xA0
> +#define GET_REGISTER 0xc0
> +#define SET_REGISTER 0x40

Add a F81232-prefix to these (and other driver specific defines), and a
new line before the time out.

> +#define F81232_USB_TIMEOUT 3000
> +
> +#define SERIAL_BASE_ADDRESS	   (0x0120)

No parentheses.

> +#define MODEM_STATUS_REGISTER      (0x06 + SERIAL_BASE_ADDRESS)

Missing newline.

>  struct f81232_private {
>  	spinlock_t lock;
>  	u8 line_control;
>  	u8 line_status;

How about renaming this one modem_status?

> +
> +	struct work_struct int_worker;

Call this one interrupt_work instead.

> +	struct usb_serial_port *port;
>  };
>  
> +static inline int f81232_get_register(struct usb_device *dev,
> +							  u16 reg, u8 *data)

Let the compiler decide whether this should be inlined.

Should should probably also pass the usb-serial port rather than
usb_device and use &port->dev for the error message.

> +{
> +	int status;
> +
> +	status = usb_control_msg(dev,
> +			 usb_rcvctrlpipe(dev, 0),
> +			 REGISTER_REQUEST,
> +			 GET_REGISTER,
> +			 reg,
> +			 0,
> +			 data,
> +			 sizeof(*data),
> +			 F81232_USB_TIMEOUT);
> +
> +	if (status < 0) {
> +		dev_dbg(&dev->dev,
> +			"%s status: %d\n", __func__, status);

dev_err.

Is the line break needed still?

> +	}
> +
> +	return status;
> +}
> +
> +static void f81232_read_msr(struct f81232_private *priv)
> +{
> +	int status;
> +	unsigned long flags;
> +	u8 current_msr, old_msr;
> +	struct usb_device *dev = priv->port->serial->dev;
> +	struct tty_struct *tty;
> +
> +	status = f81232_get_register(dev, MODEM_STATUS_REGISTER, &current_msr);
> +

No newline before checking the return value. Comment applies to whole series.

> +	if (status < 0) {
> +		dev_dbg(&dev->dev, "%s fail, status: %d\n", __func__, status);
> +		return;
> +	}

You already logged the error in get_register, but use dev_err (and
&port->dev) if you want this here.

> +
> +	spin_lock_irqsave(&priv->lock, flags);
> +	old_msr = priv->line_status;
> +	spin_unlock_irqrestore(&priv->lock, flags);

You never use old_msr so just drop this bit.

> +
> +	if (current_msr & UART_MSR_ANY_DELTA) {

Just return unless there has been a change and reduce the indentation
below.

> +		tty = tty_port_tty_get(&priv->port->port);
> +
> +		if (tty) {
> +			if (current_msr & UART_MSR_DDCD) {
> +				usb_serial_handle_dcd_change(priv->port,
> +					tty, current_msr & UART_MSR_DCD);
> +			}
> +
> +			tty_kref_put(tty);
> +		}
> +
> +		spin_lock_irqsave(&priv->lock, flags);
> +		priv->line_status = current_msr;
> +		spin_unlock_irqrestore(&priv->lock, flags);
> +
> +		wake_up_interruptible(&priv->port->port.delta_msr_wait);
> +	}
> +
> +	dev_dbg(&dev->dev, "%s: %x\n", __func__, priv->line_status);
> +}

Missing newline.

>  static void f81232_update_line_status(struct usb_serial_port *port,
>  				      unsigned char *data,
>  				      unsigned int actual_length)
>  {
> -	/*
> -	 * FIXME: Update port->icount, and call
> -	 *
> -	 *		wake_up_interruptible(&port->port.delta_msr_wait);
> -	 *
> -	 *	  on MSR changes.
> -	 */
> +	struct f81232_private *priv = usb_get_serial_port_data(port);
> +	struct usb_device *dev = port->serial->dev;

Use &port->dev for debugging and drop this one.

> +
> +	if (!actual_length)
> +		return;
> +
> +	switch (data[0] & 0x07) {
> +	case 0x00: /* msr change */
> +		dev_dbg(&dev->dev, "IIR: MSR Change: %x\n", data[0]);
> +		schedule_work(&priv->int_worker);
> +		break;
> +

I'd drop the newlines after break.

> +	case 0x02: /* tx-empty */
> +		break;
> +
> +	case 0x04: /* rx data available */
> +		break;
> +
> +	case 0x06: /* lsr change */
> +		/* we can forget it. the LSR will read from bulk-in */
> +		dev_dbg(&dev->dev, "IIR: LSR Change: %x\n", data[0]);
> +		break;
> +	}
>  }
>  
>  static void f81232_read_int_callback(struct urb *urb)
> @@ -270,6 +360,14 @@ static int f81232_ioctl(struct tty_struct *tty,
>  	return -ENOIOCTLCMD;
>  }
>  
> +static void f81232_int_work_wq(struct work_struct *work)

Rename this f81232_interrupt_work.

> +{
> +	struct f81232_private *priv =
> +		container_of(work, struct f81232_private, int_worker);
> +
> +	f81232_read_msr(priv);
> +}
> +
>  static int f81232_port_probe(struct usb_serial_port *port)
>  {
>  	struct f81232_private *priv;
> @@ -279,10 +377,12 @@ static int f81232_port_probe(struct usb_serial_port *port)
>  		return -ENOMEM;
>  
>  	spin_lock_init(&priv->lock);
> +	INIT_WORK(&priv->int_worker, f81232_int_work_wq);
>  
>  	usb_set_serial_port_data(port, priv);
>  
>  	port->port.drain_delay = 256;
> +	priv->port = port;
>  
>  	return 0;
>  }

This already looks much better, thanks for resending.

Johan

  reply	other threads:[~2015-02-04 12:41 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-30  6:13 [PATCH v4 1/7] usb: serial: modify bulk-in/out size for F81232 Peter Hung
2015-01-30  6:13 ` [PATCH v4 2/7] usb: serial: modify author " Peter Hung
2015-02-04 11:31   ` Johan Hovold
2015-01-30  6:13 ` [PATCH v4 3/7] usb: serial: implement read IIR/MSR ep " Peter Hung
2015-02-04 12:41   ` Johan Hovold [this message]
2015-01-30  6:13 ` [PATCH v4 4/7] usb: serial: reimplement RX bulk-in " Peter Hung
2015-02-04 12:51   ` Johan Hovold
2015-01-30  6:13 ` [PATCH v4 5/7] usb: serial: implement set_termios " Peter Hung
2015-02-04 15:29   ` Johan Hovold
2015-01-30  6:13 ` [PATCH v4 6/7] usb: serial: implement MCR/MSR function " Peter Hung
2015-02-04 15:55   ` Johan Hovold
2015-01-30  6:13 ` [PATCH v4 7/7] usb: serial: modify ioctl TIOCGSERIAL " Peter Hung
2015-02-04 16:27   ` Johan Hovold
2015-02-04 11:23 ` [PATCH v4 1/7] usb: serial: modify bulk-in/out size " 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=20150204124128.GC13757@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 \
    --cc=tom_tsai@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.