SCCS-vsn: sys/hp/dev/grf.c 7.4
SCCS-vsn: sys/hp/dev/hil.c 7.4
*
* from: Utah $Hdr: grf.c 1.28 89/08/14$
*
*
* from: Utah $Hdr: grf.c 1.28 89/08/14$
*
- * @(#)grf.c 7.3 (Berkeley) %G%
+ * @(#)grf.c 7.4 (Berkeley) %G%
return(EAGAIN);
do {
gp->g_flags |= GF_WANTED;
return(EAGAIN);
do {
gp->g_flags |= GF_WANTED;
- sleep((caddr_t)&gp->g_flags, PZERO+1);
-
if (error = tsleep((caddr_t)&gp->g_flags,
(PZERO+1) | PCATCH, devioc, 0))
return (error);
if (error = tsleep((caddr_t)&gp->g_flags,
(PZERO+1) | PCATCH, devioc, 0))
return (error);
} while (gp->g_lockp);
}
gp->g_lockp = p;
} while (gp->g_lockp);
}
gp->g_lockp = p;
*/
case IOMAPMAP:
error = iommap(dev, (caddr_t *)data);
*/
case IOMAPMAP:
error = iommap(dev, (caddr_t *)data);
+#if 0
+ /*
+ * It may not be worth kludging this (using p_devtmp) to
+ * make this work. It was an undocumented side-effect
+ * in HP-UX that the mapped address was the return value
+ * of the ioctl. The only thing I remember that counted
+ * on this behavior was the rbox X10 server.
+ */
if (!error)
u.u_r.r_val1 = *(int *)data; /* XXX: this sux */
if (!error)
u.u_r.r_val1 = *(int *)data; /* XXX: this sux */
struct proc *p = u.u_procp; /* XXX */
struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
struct mapmem *mp;
struct proc *p = u.u_procp; /* XXX */
struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
struct mapmem *mp;
+ int len, error, grfmapin();
#ifdef DEBUG
if (grfdebug & GDB_MMAP)
printf("grfmmap(%d): addr %x\n", p->p_pid, *addrp);
#endif
len = gp->g_display.gd_regsize + gp->g_display.gd_fbsize;
#ifdef DEBUG
if (grfdebug & GDB_MMAP)
printf("grfmmap(%d): addr %x\n", p->p_pid, *addrp);
#endif
len = gp->g_display.gd_regsize + gp->g_display.gd_fbsize;
- if (u.u_error = mmalloc(p, minor(dev), addrp, len, MM_RW|MM_CI|MM_NOCORE, &grfops, &mp))
- return(u.u_error);
- if (!mmmapin(p, mp, grfmapin)) {
- mmfree(p, mp);
- return(u.u_error);
- }
- return(0);
+ error = mmalloc(p, minor(dev), addrp, len, MM_RW|MM_CI|MM_NOCORE,
+ &grfops, &mp);
+ if (error == 0)
+ if (error = mmmapin(p, mp, grfmapin))
+ (void) mmfree(p, mp);
+ return(error);
mpp = &mp->mm_next;
continue;
}
mpp = &mp->mm_next;
continue;
}
found++;
}
return(found ? 0 : EINVAL);
found++;
}
return(found ? 0 : EINVAL);
grfrmpid(gp);
#endif
mmmapout(p, mp);
grfrmpid(gp);
#endif
mmmapout(p, mp);
struct proc *p = u.u_procp; /* XXX */
struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
struct mapmem *mp;
struct proc *p = u.u_procp; /* XXX */
struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
struct mapmem *mp;
+ int len, error, grfmapin();
#ifdef DEBUG
if (grfdebug & (GDB_MMAP|GDB_IOMAP))
printf("iommap(%d): addr %x\n", p->p_pid, *addrp);
#endif
len = gp->g_display.gd_regsize;
#ifdef DEBUG
if (grfdebug & (GDB_MMAP|GDB_IOMAP))
printf("iommap(%d): addr %x\n", p->p_pid, *addrp);
#endif
len = gp->g_display.gd_regsize;
- if (u.u_error = mmalloc(p, minor(dev), addrp, len, MM_RW|MM_CI|MM_NOCORE, &grfiomops, &mp))
- return(u.u_error);
- if (!mmmapin(p, mp, grfmapin)) {
- mmfree(p, mp);
- return(u.u_error);
- }
- return(0);
+ error = mmalloc(p, minor(dev), addrp, len, MM_RW|MM_CI|MM_NOCORE,
+ &grfiomops, &mp);
+ if (error == 0)
+ if (error = mmmapin(p, mp, grfmapin))
+ (void) mmfree(p, mp);
+ return(error);
mpp = &mp->mm_next;
continue;
}
mpp = &mp->mm_next;
continue;
}
found++;
}
return(found ? 0 : EINVAL);
found++;
}
return(found ? 0 : EINVAL);
struct proc *p = u.u_procp; /* XXX */
struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
struct mapmem *mp;
struct proc *p = u.u_procp; /* XXX */
struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
struct mapmem *mp;
+ int error, grflckmapin();
#ifdef DEBUG
if (grfdebug & (GDB_MMAP|GDB_LOCK))
#ifdef DEBUG
if (grfdebug & (GDB_MMAP|GDB_LOCK))
if (gp->g_locks == NULL)
return(ENOMEM);
}
if (gp->g_locks == NULL)
return(ENOMEM);
}
- if (u.u_error = mmalloc(p, minor(dev), addrp, NBPG, MM_RW|MM_CI, &grflckops, &mp))
- return(u.u_error);
- if (!mmmapin(p, mp, grflckmapin)) {
- mmfree(p, mp);
- return(u.u_error);
- }
- return(0);
+ error = mmalloc(p, minor(dev), addrp, NBPG, MM_RW|MM_CI,
+ &grflckops, &mp);
+ if (error == 0)
+ if (error = mmmapin(p, mp, grflckmapin))
+ (void) mmfree(p, mp);
+ return(error);
}
grflckunmmap(dev, addr)
}
grflckunmmap(dev, addr)
for (mp = u.u_mmap; mp; mp = mp->mm_next)
if (mp->mm_ops == &grflckops && mp->mm_id == unit &&
mp->mm_uva == addr) {
for (mp = u.u_mmap; mp; mp = mp->mm_next)
if (mp->mm_ops == &grflckops && mp->mm_id == unit &&
mp->mm_uva == addr) {
return(0);
}
return(EINVAL);
return(0);
}
return(EINVAL);
*
* from: Utah $Hdr: hil.c 1.33 89/12/22$
*
*
* from: Utah $Hdr: hil.c 1.33 89/12/22$
*
- * @(#)hil.c 7.3 (Berkeley) %G%
+ * @(#)hil.c 7.4 (Berkeley) %G%
dev_t dev;
register int off;
{
dev_t dev;
register int off;
{
- struct proc *p = u.u_procp; /* XXX */
+ struct proc *p = u.u_procp; /* XXX */
register struct hilloop *hilp = &hil0; /* XXX */
register struct hiliqueue *qp;
register int qnum;
register struct hilloop *hilp = &hil0; /* XXX */
register struct hiliqueue *qp;
register int qnum;
hilqalloc(qip)
struct hilqinfo *qip;
{
hilqalloc(qip)
struct hilqinfo *qip;
{
- struct proc *p = u.u_procp; /* XXX */
+ struct proc *p = u.u_procp; /* XXX */
register struct hilloop *hilp = &hil0; /* XXX */
register HILQ *hq;
register int qnum;
struct mapmem *mp;
register struct hilloop *hilp = &hil0; /* XXX */
register HILQ *hq;
register int qnum;
struct mapmem *mp;
+ int error, hilqmapin();
#ifdef DEBUG
if (hildebug & HDB_FOLLOW)
#ifdef DEBUG
if (hildebug & HDB_FOLLOW)
/*
* Map queue into user address space as instructed
*/
/*
* Map queue into user address space as instructed
*/
- if (u.u_error = mmalloc(p, qnum, &qip->addr, sizeof(HILQ), MM_RW|MM_CI, &hilqops, &mp)) {
+ error = mmalloc(p, qnum, &qip->addr, sizeof(HILQ), MM_RW|MM_CI,
+ &hilqops, &mp);
+ if (error) {
cifree((caddr_t)hq, sizeof(HILQ));
hilp->hl_queue[qnum].hq_eventqueue = NULL;
cifree((caddr_t)hq, sizeof(HILQ));
hilp->hl_queue[qnum].hq_eventqueue = NULL;
- if (!mmmapin(p, mp, hilqmapin)) {
- mmfree(p, mp);
+ if (error = mmmapin(p, mp, hilqmapin)) {
+ (void) mmfree(p, mp);
cifree((caddr_t)hq, sizeof(HILQ));
hilp->hl_queue[qnum].hq_eventqueue = NULL;
cifree((caddr_t)hq, sizeof(HILQ));
hilp->hl_queue[qnum].hq_eventqueue = NULL;
}
hilp->hl_queue[qnum].hq_procp = p;
hilp->hl_queue[qnum].hq_devmask = 0;
}
hilp->hl_queue[qnum].hq_procp = p;
hilp->hl_queue[qnum].hq_devmask = 0;
hilqfree(qnum)
register int qnum;
{
hilqfree(qnum)
register int qnum;
{
- struct proc *p = u.u_procp; /* XXX */
+ struct proc *p = u.u_procp; /* XXX */
register struct hilloop *hilp = &hil0; /* XXX */
register struct mapmem *mp;
register struct hilloop *hilp = &hil0; /* XXX */
register struct mapmem *mp;
return(EINVAL);
for (mp = u.u_mmap; mp; mp = mp->mm_next)
if (qnum == mp->mm_id && mp->mm_ops == &hilqops) {
return(EINVAL);
for (mp = u.u_mmap; mp; mp = mp->mm_next)
if (qnum == mp->mm_id && mp->mm_ops == &hilqops) {
return(0);
}
panic("hilqfree");
return(0);
}
panic("hilqfree");
#endif
if (ischild) {
mmmapout(p, mp);
#endif
if (ischild) {
mmmapout(p, mp);
cifree((caddr_t)hilp->hl_queue[i].hq_eventqueue, sizeof(HILQ));
hilp->hl_queue[i].hq_eventqueue = NULL;
hilp->hl_queue[i].hq_procp = NULL;
cifree((caddr_t)hilp->hl_queue[i].hq_eventqueue, sizeof(HILQ));
hilp->hl_queue[i].hq_eventqueue = NULL;
hilp->hl_queue[i].hq_procp = NULL;
/*
* At this point, the loop should have reconfigured.
* The reconfiguration interrupt has already called hilconfig()
/*
* At this point, the loop should have reconfigured.
* The reconfiguration interrupt has already called hilconfig()
- * so the keyboard has been determined. All that is left is
- *
+ * so the keyboard has been determined.
-#if 0
- hilconfig(hilp);
-#endif
send_hil_cmd(hildevice, HIL_INTON, NULL, 0, NULL);
}
send_hil_cmd(hildevice, HIL_INTON, NULL, 0, NULL);
}