xref: /csrg-svn/sys/hp/dev/hil_subr.c (revision 63148)
153925Shibler /*-
253925Shibler  * Copyright (c) 1988 University of Utah.
3*63148Sbostic  * Copyright (c) 1982, 1986, 1991, 1993
4*63148Sbostic  *	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*63148Sbostic  *	@(#)hil_subr.c	8.1 (Berkeley) 06/10/93
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  */
3053925Shibler hilq_to_b(q, cp, cc)
3153925Shibler 	register struct clist *q;
3253925Shibler 	register char *cp;
3353925Shibler {
3453925Shibler 	register struct cblock *bp;
3553925Shibler 	register int nc;
3653925Shibler 	char *acp;
3753925Shibler 	int s;
3853925Shibler 	extern char cwaiting;
3953925Shibler 
4053925Shibler 	if (cc <= 0)
4153925Shibler 		return (0);
4253925Shibler 	s = splhil();
4353925Shibler 	if (q->c_cc <= 0) {
4453925Shibler 		q->c_cc = 0;
4553925Shibler 		q->c_cf = q->c_cl = NULL;
4653925Shibler 		splx(s);
4753925Shibler 		return (0);
4853925Shibler 	}
4953925Shibler 	acp = cp;
5053925Shibler 
5153925Shibler 	while (cc) {
5253925Shibler 		nc = sizeof (struct cblock) - ((int)q->c_cf & CROUND);
5355069Spendry 		nc = min(nc, cc);
5455069Spendry 		nc = min(nc, q->c_cc);
5553925Shibler 		(void) bcopy(q->c_cf, cp, (unsigned)nc);
5653925Shibler 		q->c_cf += nc;
5753925Shibler 		q->c_cc -= nc;
5853925Shibler 		cc -= nc;
5953925Shibler 		cp += nc;
6053925Shibler 		if (q->c_cc <= 0) {
6153925Shibler 			bp = (struct cblock *)(q->c_cf - 1);
6253925Shibler 			bp = (struct cblock *)((int)bp & ~CROUND);
6353925Shibler 			q->c_cf = q->c_cl = NULL;
6453925Shibler 			spltty();
6553925Shibler 			bp->c_next = cfreelist;
6653925Shibler 			cfreelist = bp;
6753925Shibler 			cfreecount += CBSIZE;
6853925Shibler 			if (cwaiting) {
6953925Shibler 				wakeup(&cwaiting);
7053925Shibler 				cwaiting = 0;
7153925Shibler 			}
7253925Shibler 			break;
7353925Shibler 		}
7453925Shibler 		if (((int)q->c_cf & CROUND) == 0) {
7553925Shibler 			bp = (struct cblock *)(q->c_cf);
7653925Shibler 			bp--;
7753925Shibler 			q->c_cf = bp->c_next->c_info;
7853925Shibler 			spltty();
7953925Shibler 			bp->c_next = cfreelist;
8053925Shibler 			cfreelist = bp;
8153925Shibler 			cfreecount += CBSIZE;
8253925Shibler 			if (cwaiting) {
8353925Shibler 				wakeup(&cwaiting);
8453925Shibler 				cwaiting = 0;
8553925Shibler 			}
8653925Shibler 			splhil();
8753925Shibler 		}
8853925Shibler 	}
8953925Shibler 	splx(s);
9053925Shibler 	return (cp-acp);
9153925Shibler }
9253925Shibler 
93