From owner-p4-projects@FreeBSD.ORG Sat Jun 17 21:07:21 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 30BDA16A47B; Sat, 17 Jun 2006 21:07:21 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E960016A47A for ; Sat, 17 Jun 2006 21:07:20 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id B4F6D43D45 for ; Sat, 17 Jun 2006 21:07:20 +0000 (GMT) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k5HL7KEH016294 for ; Sat, 17 Jun 2006 21:07:20 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k5HL7K0c016288 for perforce@freebsd.org; Sat, 17 Jun 2006 21:07:20 GMT (envelope-from kmacy@freebsd.org) Date: Sat, 17 Jun 2006 21:07:20 GMT Message-Id: <200606172107.k5HL7K0c016288@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 99465 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 17 Jun 2006 21:07:21 -0000 http://perforce.freebsd.org/chv.cgi?CH=99465 Change 99465 by kmacy@kmacy_storage:sun4v_work on 2006/06/17 21:06:54 correctly handle character buffering Affected files ... .. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/hvcons.c#6 edit Differences ... ==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/hvcons.c#6 (text+ko) ==== @@ -60,11 +60,14 @@ .d_flags = D_TTY | D_NEEDGIANT, }; +#define PCBURST 16 static struct tty *hvcn_tp = NULL; static struct resource *hvcn_irq; static void *hvcn_intrhand; -static int prevchar = 0; +static int bufindex; +static int buflen; +static u_char buf[PCBURST]; static int polltime; static struct callout_handle hvcn_timeouthandle = CALLOUT_HANDLE_INITIALIZER(&hvcn_timeouthandle); @@ -266,20 +269,23 @@ static void hvcn_tty_start(struct tty *tp) { - int c; - + if (!(tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP))) { tp->t_state |= TS_BUSY; - - if (prevchar && (hv_cnputchar(prevchar) != H_EWOULDBLOCK)) - prevchar = 0; - while (tp->t_outq.c_cc != 0) { - c = prevchar = getc(&tp->t_outq); - if (hv_cnputchar(prevchar) == H_EWOULDBLOCK) - break; - prevchar = 0; - } + do { + if (buflen == 0) { + buflen = q_to_b(&tp->t_outq, buf, PCBURST); + bufindex = 0; + } + while (buflen) { + if (hv_cnputchar(buf[bufindex]) == H_EWOULDBLOCK) + goto done; + bufindex++; + buflen--; + } + } while (tp->t_outq.c_cc != 0); + done: tp->t_state &= ~TS_BUSY; ttwwakeup(tp); } @@ -306,7 +312,7 @@ if (tp->t_state & TS_ISOPEN) ttyld_rint(tp, c); - if (tp->t_outq.c_cc != 0 || prevchar != 0) + if (tp->t_outq.c_cc != 0 || buflen != 0) hvcn_tty_start(tp); }