On Sun, Dec 14, 2008 at 08:03:47PM +0000, Poul-Henning Kamp wrote:
> Author: phk
> Date: Sun Dec 14 20:03:46 2008
> New Revision: 186091
> URL: http://svn.freebsd.org/changeset/base/186091
> 
> Log:
>   Move the code that injects received characters into the tty system into
>   a separate public function ucomrxchars(), to avoid requirement of
>   simple metadata prefixing on the USB data stream.
> 
> Modified:
>   head/sys/dev/usb/ucom.c
>   head/sys/dev/usb/ucomvar.h
> 
> Modified: head/sys/dev/usb/ucom.c
> ==============================================================================
> --- head/sys/dev/usb/ucom.c   Sun Dec 14 19:39:53 2008        (r186090)
> +++ head/sys/dev/usb/ucom.c   Sun Dec 14 20:03:46 2008        (r186091)
> @@ -700,11 +700,30 @@ ucomstartread(struct ucom_softc *sc)
>       return (USBD_NORMAL_COMPLETION);
>  }
>  
> +void
> +ucomrxchars(struct ucom_softc *sc, u_char *cp, u_int32_t cc)
> +{
> +     struct tty *tp = sc->sc_tty;
> +
> +     /* Give characters to tty layer. */
> +     while (cc > 0) {
> +             DPRINTFN(7, ("ucomreadcb: char = 0x%02x\n", *cp));
> +             if (ttydisc_rint(tp, *cp, 0) == -1) {
> +                     /* XXX what should we do? */
> +                     printf("%s: lost %d chars\n",
> +                            device_get_nameunit(sc->sc_dev), cc);
> +                     break;
> +             }
> +             cc--;
> +             cp++;
> +     }
> +     ttydisc_rint_done(tp);
> +}

How about passing the whole buffer before doing a per-char handoff.

Andrew


Index: ucom.c
===================================================================
--- ucom.c      (revision 186092)
+++ ucom.c      (working copy)
@@ -704,8 +704,15 @@ void
 ucomrxchars(struct ucom_softc *sc, u_char *cp, u_int32_t cc)
 {
        struct tty *tp = sc->sc_tty;
+       size_t len;
 
        /* Give characters to tty layer. */
+       if (ttydisc_can_bypass(tp)) {
+               DPRINTFN(7, ("ucomreadcb: buf=%*D\n", cc, cp, ""));
+               len = ttydisc_rint_bypass(tp, cp, cc);
+               cp += len;
+               cc -= len;
+       }
        while (cc > 0) {
                DPRINTFN(7, ("ucomreadcb: char = 0x%02x\n", *cp));
                if (ttydisc_rint(tp, *cp, 0) == -1) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to