summaryrefslogtreecommitdiffstats
path: root/sys/dev/cx
diff options
context:
space:
mode:
authorrik <rik@FreeBSD.org>2008-06-30 21:18:27 +0000
committerrik <rik@FreeBSD.org>2008-06-30 21:18:27 +0000
commitb49a85befd88be2728fef2765dde3ad4793511cc (patch)
treefc0d5f8df2864c985a23cc83800e237fc998a308 /sys/dev/cx
parent8805d22e343f9c4b23897204b50dcd29aed7ca3f (diff)
downloadFreeBSD-src-b49a85befd88be2728fef2765dde3ad4793511cc.zip
FreeBSD-src-b49a85befd88be2728fef2765dde3ad4793511cc.tar.gz
Do not set IFF_DEBUG directly from the driver.
MFC after: 1 month.
Diffstat (limited to 'sys/dev/cx')
-rw-r--r--sys/dev/cx/cxddk.h1
-rw-r--r--sys/dev/cx/if_cx.c31
2 files changed, 24 insertions, 8 deletions
diff --git a/sys/dev/cx/cxddk.h b/sys/dev/cx/cxddk.h
index bd95aa6..69f0693 100644
--- a/sys/dev/cx/cxddk.h
+++ b/sys/dev/cx/cxddk.h
@@ -337,6 +337,7 @@ typedef struct _cx_chan_t {
void *sys;
int debug;
+ int debug_shadow;
void *attach [2];
char *received_data;
int received_len;
diff --git a/sys/dev/cx/if_cx.c b/sys/dev/cx/if_cx.c
index 34ccd5a..be164bd 100644
--- a/sys/dev/cx/if_cx.c
+++ b/sys/dev/cx/if_cx.c
@@ -1102,10 +1102,14 @@ static int cx_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data)
if (error)
return error;
+ s = splhigh ();
+ CX_LOCK (bd);
if (! (ifp->if_flags & IFF_DEBUG))
d->chan->debug = 0;
- else if (! d->chan->debug)
- d->chan->debug = 1;
+ else
+ d->chan->debug = d->chan->debug_shadow;
+ CX_UNLOCK (bd);
+ splx (s);
switch (cmd) {
default: CX_DEBUG2 (d, ("ioctl 0x%lx\n", cmd)); return 0;
@@ -1745,6 +1749,8 @@ static int cx_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
cx_enable_receive (c, 0);
cx_enable_transmit (c, 0);
} else if (c->mode == M_ASYNC && *(int*)data == SERIAL_HDLC) {
+ if (d->ifp->if_flags & IFF_DEBUG)
+ c->debug = c->debug_shadow;
cx_set_mode (c, M_HDLC);
cx_enable_receive (c, 1);
cx_enable_transmit (c, 1);
@@ -1913,15 +1919,24 @@ static int cx_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
return error;
s = splhigh ();
CX_LOCK (bd);
+#ifndef NETGRAPH
+ if (c->mode == M_ASYNC) {
+ c->debug = *(int*)data;
+ } else {
+ /*
+ * The debug_shadow is always greater than zero for
+ * logic simplicity. For switching debug off the
+ * IFF_DEBUG is responsible (for !M_ASYNC mode).
+ */
+ c->debug_shadow = (*(int*)data) ? (*(int*)data) : 1;
+ if (d->ifp->if_flags & IFF_DEBUG)
+ c->debug = c->debug_shadow;
+ }
+#else
c->debug = *(int*)data;
+#endif
CX_UNLOCK (bd);
splx (s);
-#ifndef NETGRAPH
- if (d->chan->debug)
- d->ifp->if_flags |= IFF_DEBUG;
- else
- d->ifp->if_flags &= (~IFF_DEBUG);
-#endif
return 0;
}
OpenPOWER on IntegriCloud