153925Shibler /*-
253925Shibler * Copyright (c) 1988 University of Utah.
363148Sbostic * Copyright (c) 1982, 1986, 1991, 1993
463148Sbostic * The Regents of the University of California. All rights reserved.
553925Shibler *
653925Shibler * %sccs.include.proprietary.c%
753925Shibler *
853925Shibler * from: Utah $Hdr: hil_subr.c 1.1 91/11/19$
953925Shibler *
10*65644Sbostic * @(#)hil_subr.c 8.2 (Berkeley) 01/12/94
1153925Shibler */
1253925Shibler
1356504Sbostic #include <sys/param.h>
1456504Sbostic #include <sys/systm.h>
1556504Sbostic #include <sys/ioctl.h>
1656504Sbostic #include <sys/tty.h>
1756504Sbostic #include <sys/clist.h>
1853925Shibler
1956504Sbostic #include <hp/dev/hilreg.h>
2053925Shibler
2153925Shibler /*
2253925Shibler * XXX this file only exists to separate out the AT&T tainted code.
2353925Shibler */
2453925Shibler
2553925Shibler /*
2653925Shibler * This is just a copy of the virgin q_to_b routine with minor
2753925Shibler * optimizations for HIL use. It is used because we don't have
2853925Shibler * to raise the priority to spltty() for most of the clist manipulations.
2953925Shibler */
hilq_to_b(q,cp,cc)3053925Shibler hilq_to_b(q, cp, cc)
3153925Shibler register struct clist *q;
3253925Shibler register char *cp;
33*65644Sbostic int cc;
3453925Shibler {
3553925Shibler register struct cblock *bp;
3653925Shibler register int nc;
3753925Shibler char *acp;
3853925Shibler int s;
3953925Shibler extern char cwaiting;
4053925Shibler
4153925Shibler if (cc <= 0)
4253925Shibler return (0);
4353925Shibler s = splhil();
4453925Shibler if (q->c_cc <= 0) {
4553925Shibler q->c_cc = 0;
4653925Shibler q->c_cf = q->c_cl = NULL;
4753925Shibler splx(s);
4853925Shibler return (0);
4953925Shibler }
5053925Shibler acp = cp;
5153925Shibler
5253925Shibler while (cc) {
5353925Shibler nc = sizeof (struct cblock) - ((int)q->c_cf & CROUND);
5455069Spendry nc = min(nc, cc);
5555069Spendry nc = min(nc, q->c_cc);
5653925Shibler (void) bcopy(q->c_cf, cp, (unsigned)nc);
5753925Shibler q->c_cf += nc;
5853925Shibler q->c_cc -= nc;
5953925Shibler cc -= nc;
6053925Shibler cp += nc;
6153925Shibler if (q->c_cc <= 0) {
6253925Shibler bp = (struct cblock *)(q->c_cf - 1);
6353925Shibler bp = (struct cblock *)((int)bp & ~CROUND);
6453925Shibler q->c_cf = q->c_cl = NULL;
6553925Shibler spltty();
6653925Shibler bp->c_next = cfreelist;
6753925Shibler cfreelist = bp;
6853925Shibler cfreecount += CBSIZE;
6953925Shibler if (cwaiting) {
7053925Shibler wakeup(&cwaiting);
7153925Shibler cwaiting = 0;
7253925Shibler }
7353925Shibler break;
7453925Shibler }
7553925Shibler if (((int)q->c_cf & CROUND) == 0) {
7653925Shibler bp = (struct cblock *)(q->c_cf);
7753925Shibler bp--;
7853925Shibler q->c_cf = bp->c_next->c_info;
7953925Shibler spltty();
8053925Shibler bp->c_next = cfreelist;
8153925Shibler cfreelist = bp;
8253925Shibler cfreecount += CBSIZE;
8353925Shibler if (cwaiting) {
8453925Shibler wakeup(&cwaiting);
8553925Shibler cwaiting = 0;
8653925Shibler }
8753925Shibler splhil();
8853925Shibler }
8953925Shibler }
9053925Shibler splx(s);
9153925Shibler return (cp-acp);
9253925Shibler }
9353925Shibler
94