mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: David Woodhouse <dwmw2@infradead.org>
To: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: akpm@osdl.org, linux-kernel@vger.kernel.org, paulus@samba.org
Subject: Re: [PATCH] $ARCH: Enable arbitary speed tty ioctls and split input/output speed
Date: Thu, 24 May 2007 09:08:55 -0400	[thread overview]
Message-ID: <1180012135.8303.89.camel@shinybook.infradead.org> (raw)
In-Reply-To: <20070523172739.1d3a918c@the-village.bc.nu>

Is my mailbox (or brain) failing me, or did you just send out these
patches for every architecture _except_ PowerPC? :)

Presumably this is because of the mess in tty_termios_encode_baud_rate
when we fix its bogus assumptions about IBSHIFT always being defined?
There has to be a cleaner way to do that than this, but it shows the
problem...

diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c
index fd471cb..f5f4568 100644
--- a/drivers/char/tty_ioctl.c
+++ b/drivers/char/tty_ioctl.c
@@ -215,6 +215,11 @@ speed_t tty_termios_input_baud_rate(struct ktermios *termios)
 	}
 	return baud_table[cbaud];
 #else
+#ifdef BOTHER
+	/* Magic token for arbitary speed via c_ispeed/c_ospeed */
+	if ((termios->c_cflag & CBAUD) == BOTHER)
+		return termios->c_ispeed;
+#endif
 	return tty_termios_baud_rate(termios);
 #endif
 }
@@ -252,16 +257,27 @@ void tty_termios_encode_baud_rate(struct ktermios *termios, speed_t ibaud, speed
 	termios->c_ispeed = ibaud;
 	termios->c_ospeed = obaud;
 
+#ifndef IBSHIFT
+	/* If the only way to express differing input and output baud rates
+	   is to use BOTHER, then that's what we have to do... */
+	if (ibaud != obaud) {
+		termios->c_cflag |= BOTHER;
+		return;
+	}
+#endif
+
 	/* If the user asked for a precise weird speed give a precise weird
 	   answer. If they asked for a Bfoo speed they many have problems
 	   digesting non-exact replies so fuzz a bit */
 
 	if ((termios->c_cflag & CBAUD) == BOTHER)
 		oclose = 0;
+#ifdef IBSHIFT
 	if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER)
 		iclose = 0;
 	if ((termios->c_cflag >> IBSHIFT) & CBAUD)
 		ibinput = 1;	/* An input speed was specified */
+#endif
 
 	termios->c_cflag &= ~CBAUD;
 
@@ -270,20 +286,24 @@ void tty_termios_encode_baud_rate(struct ktermios *termios, speed_t ibaud, speed
 			termios->c_cflag |= baud_bits[i];
 			ofound = i;
 		}
+#ifdef IBSHIFT
 		if (ibaud - iclose >= baud_table[i] && ibaud + iclose <= baud_table[i]) {
 			/* For the case input == output don't set IBAUD bits if the user didn't do so */
 			if (ofound != i || ibinput)
 				termios->c_cflag |= (baud_bits[i] << IBSHIFT);
 			ifound = i;
 		}
-	}
-	while(++i < n_baud_table);
+#endif
+	} while(++i < n_baud_table);
+
 	if (ofound == -1)
 		termios->c_cflag |= BOTHER;
+#ifdef IBSHIFT
 	/* Set exact input bits only if the input and output differ or the
 	   user already did */
 	if (ifound == -1 && (ibaud != obaud  || ibinput))
 		termios->c_cflag |= (BOTHER << IBSHIFT);
+#endif
 }
 
 EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate);
diff --git a/include/asm-powerpc/ioctls.h b/include/asm-powerpc/ioctls.h
index 279a622..b6dfe7f 100644
--- a/include/asm-powerpc/ioctls.h
+++ b/include/asm-powerpc/ioctls.h
@@ -31,6 +31,11 @@
 #define TCXONC		_IO('t', 30)
 #define TCFLSH		_IO('t', 31)
 
+#define TCGETS2		_IOR('t', 32, struct termios2)
+#define TCSETS2		_IOW('t', 33, struct termios2)
+#define TCSETSW2	_IOW('t', 34, struct termios2)
+#define TCSETSF2	_IOW('t', 35, struct termios2)
+
 #define TIOCSWINSZ	_IOW('t', 103, struct winsize)
 #define TIOCGWINSZ	_IOR('t', 104, struct winsize)
 #define	TIOCSTART	_IO('t', 110)		/* start output, like ^Q */
diff --git a/include/asm-powerpc/termbits.h b/include/asm-powerpc/termbits.h
index 5e79198..c39877f 100644
--- a/include/asm-powerpc/termbits.h
+++ b/include/asm-powerpc/termbits.h
@@ -43,6 +43,19 @@ struct ktermios {
 	speed_t c_ospeed;		/* output speed */
 };
 
+/* Yay. A third identical definition of the same structure. */
+
+struct termios2 {
+	tcflag_t c_iflag;		/* input mode flags */
+	tcflag_t c_oflag;		/* output mode flags */
+	tcflag_t c_cflag;		/* control mode flags */
+	tcflag_t c_lflag;		/* local mode flags */
+	cc_t c_cc[NCCS];		/* control characters */
+	cc_t c_line;			/* line discipline (== c_cc[19]) */
+	speed_t c_ispeed;		/* input speed */
+	speed_t c_ospeed;		/* output speed */
+};
+
 /* c_cc characters */
 #define VINTR 	         0
 #define VQUIT 	         1
@@ -152,6 +165,7 @@ struct ktermios {
 #define B3000000  00034
 #define B3500000  00035
 #define B4000000  00036
+#define   BOTHER  00037
 
 #define CSIZE	00001400
 #define   CS5	00000000
diff --git a/include/asm-powerpc/termios.h b/include/asm-powerpc/termios.h
index 2c14fea..2841fb1 100644
--- a/include/asm-powerpc/termios.h
+++ b/include/asm-powerpc/termios.h
@@ -80,6 +80,9 @@ struct termio {
 
 #include <asm-generic/termios.h>
 
+#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
+#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
+
 #endif	/* __KERNEL__ */
 
 #endif	/* _ASM_POWERPC_TERMIOS_H */

-- 
dwmw2


  parent reply	other threads:[~2007-05-24 13:08 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-23 16:27 [PATCH] ARM/ARM26: " Alan Cox
2007-05-23 16:27 ` Russell King
2007-05-24 13:08 ` David Woodhouse [this message]
2007-05-24 13:41   ` [PATCH] $ARCH: " Alan Cox
2007-05-24 13:45     ` David Woodhouse
2007-05-24 15:05       ` Alan Cox
2007-05-24 15:18         ` David Woodhouse
2007-05-28  4:47         ` Paul Mackerras
2007-06-06 12:33           ` David Woodhouse
2007-06-08 11:18             ` [PATCH] PowerPC: " David Woodhouse
2007-06-06 12:30         ` [SERIAL] Don't optimise away baud rate changes when BOTHER is used David Woodhouse
2007-06-06 15:03           ` Alan Cox
2007-06-06 17:29             ` David Woodhouse
2007-06-07 15:38               ` Alan Cox
2007-06-07 15:50                 ` David Woodhouse
2007-06-07 21:55                   ` Alan Cox
2007-06-07 22:04                     ` David Woodhouse
2007-06-07 22:15                     ` David Woodhouse
2007-06-07 22:54                       ` Alan Cox
2007-06-08 11:01                         ` David Woodhouse
2007-06-08 11:48                           ` Alan Cox
2007-06-08 11:48                             ` David Woodhouse
2007-06-08 11:13           ` David Woodhouse
2007-06-08 11:14           ` [SERIAL] Don't optimise away baud rate changes when BOTHER is used (v2) David Woodhouse
2007-06-08 11:42             ` Alan Cox
2007-06-06 12:34         ` [PATCH] Minor cleanups in tty_ioctl.c David Woodhouse
2007-06-06 13:09           ` Jiri Slaby
2007-05-28 19:36 ` [PATCH] ARM/ARM26: Enable arbitary speed tty ioctls and split input/output speed Russell King
2007-05-28 21:56   ` Andrew Morton
2007-05-28 22:00     ` Russell King
2007-05-29  8:31     ` Alan Cox

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=1180012135.8303.89.camel@shinybook.infradead.org \
    --to=dwmw2@infradead.org \
    --cc=akpm@osdl.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=paulus@samba.org \
    /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

all inboxes | Powered by JetHome®