xref: /csrg-svn/sys/hp/dev/hil_subr.c (revision 65644)
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