Add ttydisc_rint_simple().

I noticed several drivers in our tree don't actually care about parity
and framing, such as pts(4), snp(4) (and my partially finished console
driver). Instead of duplicating a lot of code, I think we'd better add a
utility function for those drivers to quickly process a buffer of input.

Also change pts(4) and snp(4) to use this function.
This commit is contained in:
Ed Schouten 2009-08-23 08:04:40 +00:00
parent 8f26c03fe6
commit 5c67885a26
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=196452
4 changed files with 26 additions and 27 deletions

View File

@ -192,7 +192,7 @@ snp_write(struct cdev *dev, struct uio *uio, int flag)
{
struct snp_softc *ss;
struct tty *tp;
int error, len, i;
int error, len;
char in[SNP_INPUT_BUFSIZE];
error = devfs_get_cdevpriv((void **)&ss);
@ -223,14 +223,9 @@ snp_write(struct cdev *dev, struct uio *uio, int flag)
* because we shouldn't bail out when we're running
* close to the watermarks.
*/
if (ttydisc_can_bypass(tp)) {
ttydisc_rint_bypass(tp, in, len);
} else {
for (i = 0; i < len; i++)
ttydisc_rint(tp, in[i], 0);
}
ttydisc_rint_simple(tp, in, len);
ttydisc_rint_done(tp);
tty_unlock(tp);
}

View File

@ -215,25 +215,12 @@ ptsdev_write(struct file *fp, struct uio *uio, struct ucred *active_cred,
*/
MPASS(iblen > 0);
do {
if (ttydisc_can_bypass(tp)) {
/* Store data at once. */
rintlen = ttydisc_rint_bypass(tp,
ibstart, iblen);
ibstart += rintlen;
iblen -= rintlen;
if (iblen == 0) {
/* All data written. */
break;
}
} else {
error = ttydisc_rint(tp, *ibstart, 0);
if (error == 0) {
/* Character stored successfully. */
ibstart++;
iblen--;
continue;
}
rintlen = ttydisc_rint_simple(tp, ibstart, iblen);
ibstart += rintlen;
iblen -= rintlen;
if (iblen == 0) {
/* All data written. */
break;
}
/* Maybe the device isn't used anyway. */

View File

@ -1044,6 +1044,22 @@ ttydisc_rint(struct tty *tp, char c, int flags)
return (0);
}
size_t
ttydisc_rint_simple(struct tty *tp, const void *buf, size_t len)
{
const char *cbuf;
if (ttydisc_can_bypass(tp))
return (ttydisc_rint_bypass(tp, buf, len));
for (cbuf = buf; len-- > 0; cbuf++) {
if (ttydisc_rint(tp, *cbuf, 0) != 0)
break;
}
return (cbuf - (const char *)buf);
}
size_t
ttydisc_rint_bypass(struct tty *tp, const void *buf, size_t len)
{

View File

@ -52,6 +52,7 @@ void ttydisc_optimize(struct tty *tp);
void ttydisc_modem(struct tty *tp, int open);
#define ttydisc_can_bypass(tp) ((tp)->t_flags & TF_BYPASS)
int ttydisc_rint(struct tty *tp, char c, int flags);
size_t ttydisc_rint_simple(struct tty *tp, const void *buf, size_t len);
size_t ttydisc_rint_bypass(struct tty *tp, const void *buf, size_t len);
void ttydisc_rint_done(struct tty *tp);
size_t ttydisc_rint_poll(struct tty *tp);