summaryrefslogtreecommitdiffstats
path: root/sys/i4b/layer4/i4b_i4bdrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/i4b/layer4/i4b_i4bdrv.c')
-rw-r--r--sys/i4b/layer4/i4b_i4bdrv.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/sys/i4b/layer4/i4b_i4bdrv.c b/sys/i4b/layer4/i4b_i4bdrv.c
index d02a159..118926d 100644
--- a/sys/i4b/layer4/i4b_i4bdrv.c
+++ b/sys/i4b/layer4/i4b_i4bdrv.c
@@ -262,6 +262,7 @@ i4battach()
printf("i4b: ISDN call control device attached\n");
#endif
i4b_rdqueue.ifq_maxlen = IFQ_MAXLEN;
+ mtx_init(&i4b_rdqueue.ifq_mtx, "i4b_rdqueue", MTX_DEF);
#if defined(__FreeBSD__)
#if __FreeBSD__ == 3
@@ -328,17 +329,21 @@ i4bread(dev_t dev, struct uio *uio, int ioflag)
return(ENODEV);
x = splimp();
+ IF_LOCK(&i4b_rdqueue);
while(IF_QEMPTY(&i4b_rdqueue))
{
readflag = 1;
- error = tsleep((caddr_t) &i4b_rdqueue, (PZERO + 1) | PCATCH, "bird", 0);
+ error = msleep((caddr_t) &i4b_rdqueue, &i4b_rdqueue.ifq_mtx,
+ (PZERO + 1) | PCATCH, "bird", 0);
if (error != 0) {
- splx(x);
+ IF_UNLOCK(&i4b_rdqueue);
+ splx(x);
return error;
}
}
- IF_DEQUEUE(&i4b_rdqueue, m);
+ _IF_DEQUEUE(&i4b_rdqueue, m);
+ IF_UNLOCK(&i4b_rdqueue);
splx(x);
@@ -978,15 +983,17 @@ i4bputqueue(struct mbuf *m)
x = splimp();
- if(IF_QFULL(&i4b_rdqueue))
+ IF_LOCK(&i4b_rdqueue);
+ if(_IF_QFULL(&i4b_rdqueue))
{
struct mbuf *m1;
- IF_DEQUEUE(&i4b_rdqueue, m1);
+ _IF_DEQUEUE(&i4b_rdqueue, m1);
i4b_Dfreembuf(m1);
NDBGL4(L4_ERR, "ERROR, queue full, removing entry!");
}
- IF_ENQUEUE(&i4b_rdqueue, m);
+ _IF_ENQUEUE(&i4b_rdqueue, m);
+ IF_UNLOCK(&i4b_rdqueue);
splx(x);
@@ -1019,15 +1026,17 @@ i4bputqueue_hipri(struct mbuf *m)
x = splimp();
- if(IF_QFULL(&i4b_rdqueue))
+ IF_LOCK(&i4b_rdqueue);
+ if(_IF_QFULL(&i4b_rdqueue))
{
struct mbuf *m1;
- IF_DEQUEUE(&i4b_rdqueue, m1);
+ _IF_DEQUEUE(&i4b_rdqueue, m1);
i4b_Dfreembuf(m1);
NDBGL4(L4_ERR, "ERROR, queue full, removing entry!");
}
- IF_PREPEND(&i4b_rdqueue, m);
+ _IF_PREPEND(&i4b_rdqueue, m);
+ IF_UNLOCK(&i4b_rdqueue);
splx(x);
OpenPOWER on IntegriCloud