public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Russell King <rmk+lkml@arm.linux.org.uk>
To: Pat Gefre <pfg@sgi.com>
Cc: linux-kernel@vger.kernel.org, linux-ia64@vger.kernel.org
Subject: Re: [PATCH 2.6] Altix - ioc3 serial support
Date: Fri, 16 Dec 2005 23:42:20 +0000	[thread overview]
Message-ID: <20051216234219.GL1222@flint.arm.linux.org.uk> (raw)
In-Reply-To: <200512162233.jBGMXRUQ139857@fsgi900.americas.sgi.com>

On Fri, Dec 16, 2005 at 04:33:26PM -0600, Pat Gefre wrote:
> The following patch adds driver support for a 2 port PCI IOC3-based
> serial card on Altix boxes:
> 
> ftp://oss.sgi.com/projects/sn2/sn2-update/044-ioc3-support

Here's some comments on ioc3_serial.c.  Could you look at them and
either resolve them or discuss further.  Thanks.

+#include <linux/serialP.h>

I don't think you need this include.

+	the_port->timeout = ((the_port->fifosize * HZ * bits) / (baud / 10));
+	the_port->timeout += HZ / 50;	/* Add .02 seconds of slop */

Please use uart_update_timeout() instead.

+	info = the_port->info;
+	if (info->tty) {
+		set_bit(TTY_IO_ERROR, &info->tty->flags);
+		clear_bit(TTY_IO_ERROR, &info->tty->flags);
+		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
+			info->tty->alt_speed = 57600;
+		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
+			info->tty->alt_speed = 115200;
+		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
+			info->tty->alt_speed = 230400;
+		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
+			info->tty->alt_speed = 460800;
+	}

None of this is required.  info->tty->alt_speed is not used by the
serial layer - it knows how to deal with this itself.  Secondly,
setting and clearing TTY_IO_ERROR is pointless.  Note that the serial
layer takes care of TTY_IO_ERROR handling for you.

+	/* set the speed of the serial port */
+	ioc3_change_speed(the_port, info->tty->termios, (struct termios *)0);

serial_core will call this for you at the appropriate time.  Note that
you decided above to check whether info->tty was NULL.  If it was this
will oops.  Better just get rid of it anyway - it's not necessary.

+					/* Notify upper layer of carrier drop */
+					if ((port->ip_notify & N_DDCD)
+					    && port->ip_port) {
+						the_port->icount.dcd = 0;
+						wake_up_interruptible
+						    (&the_port->info->
+						     delta_msr_wait);
+					}

Use uart_handle_dcd_change().  Setting port->icount.dcd to zero in
this case is wrong.  It also makes no attempt at informing the upper
layers that a hangup occurred.  Note that uart_handle_dcd_change()
exists so that you don't have to think about these semantics.  You
will need to keep the wake_up_interruptible though.

+			if ((port->ip_notify & N_DDCD)
+			    && (shadow & SHADOW_DCD)
+			    && (port->ip_port)) {
+				the_port = port->ip_port;
+				the_port->icount.dcd = 1;
+				wake_up_interruptible
+				    (&the_port->info->delta_msr_wait);

Ditto.  icount.dcd is not the state of DCD.  It is a counter for the
number of times DCD changes state.

+			if ((port->ip_notify & N_DCTS) && (port->ip_port)) {
+				the_port = port->ip_port;
+				the_port->icount.cts =
+				    (shadow & SHADOW_CTS) ? 1 : 0;
+				wake_up_interruptible
+				    (&the_port->info->delta_msr_wait);
+			}

Ditto, except uart_handle_cts_change().

+		the_port->lock = SPIN_LOCK_UNLOCKED;
+		spin_lock_init(&the_port->lock);

Not necessary - uart_add_one_port() does this for you for non-console
ports, and for console ports, it is assumed that the console code has
already initialised the spinlock.

+	if (request_count > TTY_FLIPBUF_SIZE - tty->flip.count)
+		request_count = TTY_FLIPBUF_SIZE - tty->flip.count;
+
+	if (request_count > 0) {
+		read_count = do_read(the_port, ch, request_count);
+		if (read_count > 0) {
+			flip = 1;
+			memcpy(tty->flip.char_buf_ptr, ch, read_count);
+			memset(tty->flip.flag_buf_ptr, TTY_NORMAL, read_count);
+			tty->flip.char_buf_ptr += read_count;
+			tty->flip.flag_buf_ptr += read_count;
+			tty->flip.count += read_count;
+			the_port->icount.rx += read_count;
+		}
+	}

Please talk to Alan Cox about the best way to handle this.  flip
buffers are going away.

+/**
+ * ic3_tx_empty - Is the transmitter empty?  We pretend we're always empty
+ * @port: Port to operate on (we ignore since we always return 1)
+ *
+ */
+static unsigned int ic3_tx_empty(struct uart_port *the_port)
+{
+	return TIOCSER_TEMT;
+}

Not really a good idea if you care about the last bytes of data
in various buffers.  Eg, cat file > /dev/yourport could well chop
off the last few characters for transmission.

Finally, you register the uart driver in ioc3uart_init(), and
unregister it in ioc3uart_remove() rather than ioc3uart_exit().
What if you have multiple boards?  You remove one of them and
the uart driver gets unregistered?  It doesn't look sane.

Haven't looked at the rest of the code tho.

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 Serial core

  reply	other threads:[~2005-12-16 23:42 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-16 22:33 [PATCH 2.6] Altix - ioc3 serial support Pat Gefre
2005-12-16 23:42 ` Russell King [this message]
2005-12-20 21:27   ` Pat Gefre
2006-01-04 21:00 ` Patrick Gefre
2006-01-04 22:50   ` Russell King
2006-01-04 23:52     ` Patrick Gefre
2006-01-07 16:41       ` Russell King
2006-01-05  0:13   ` Andrew Morton

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=20051216234219.GL1222@flint.arm.linux.org.uk \
    --to=rmk+lkml@arm.linux.org.uk \
    --cc=linux-ia64@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pfg@sgi.com \
    /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