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
next prev 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®