aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sbin/sconfig/sconfig.c22
-rw-r--r--sys/dev/ce/ceddk.h1
-rw-r--r--sys/dev/ce/if_ce.c19
-rw-r--r--sys/dev/cp/cpddk.h1
-rw-r--r--sys/dev/cp/if_cp.c19
-rw-r--r--sys/dev/ctau/ctddk.h1
-rw-r--r--sys/dev/ctau/if_ct.c19
-rw-r--r--sys/dev/cx/cxddk.h1
-rw-r--r--sys/dev/cx/if_cx.c31
9 files changed, 84 insertions, 30 deletions
diff --git a/sbin/sconfig/sconfig.c b/sbin/sconfig/sconfig.c
index e34dd7b8c25e..09255a1cc7cf 100644
--- a/sbin/sconfig/sconfig.c
+++ b/sbin/sconfig/sconfig.c
@@ -276,6 +276,15 @@ print_ifconfig (int fd __unused)
system (buf);
}
+static void
+set_debug_ifconfig (int on)
+{
+ char buf [64];
+ sprintf (buf, "ifconfig %s %sdebug 2>/dev/null", chan_name,
+ on ? "" : "-");
+ system (buf);
+}
+
static char *
format_long (unsigned long val)
{
@@ -724,6 +733,7 @@ setup_chan (int fd, int argc, char **argv)
int i, mode, loop, nrzi, dpll, invclk, phony, use16, crc4, unfram, ami;
int higain, clk, keepalive, debug, port, dlci, invrclk, invtclk;
int monitor, dir, scrambler, rloop, cablen;
+ int mode_valid;
long baud, timeslots, mtu, rqlen;
for (i=0; i<argc; ++i) {
@@ -792,7 +802,17 @@ setup_chan (int fd, int argc, char **argv)
ioctl (fd, SERIAL_SETPROTO, "zaptel\0");
} else if (strncasecmp ("debug=", argv[i], 6) == 0) {
debug = strtol (argv[i]+6, 0, 10);
- ioctl (fd, SERIAL_SETDEBUG, &debug);
+ mode_valid = ioctl (fd, SERIAL_GETMODE, &mode) >= 0;
+ if (!mode_valid || mode != SERIAL_ASYNC) {
+ if (debug == 0) {
+ set_debug_ifconfig(0);
+ } else {
+ ioctl (fd, SERIAL_SETDEBUG, &debug);
+ set_debug_ifconfig(1);
+ }
+ } else {
+ ioctl (fd, SERIAL_SETDEBUG, &debug);
+ }
} else if (strncasecmp ("loop=", argv[i], 5) == 0) {
loop = (strcasecmp ("on", argv[i] + 5) == 0);
ioctl (fd, SERIAL_SETLOOP, &loop);
diff --git a/sys/dev/ce/ceddk.h b/sys/dev/ce/ceddk.h
index 8cd8c67774bb..f5844005d754 100644
--- a/sys/dev/ce/ceddk.h
+++ b/sys/dev/ce/ceddk.h
@@ -72,6 +72,7 @@ typedef struct _ce_chan_t {
TAU32_UserRequest *rx_queue;
TAU32_UserRequest *tx_queue;
unsigned char debug;
+ unsigned char debug_shadow;
void (*transmit) (struct _ce_chan_t*, void*, int);
void (*receive) (struct _ce_chan_t*, unsigned char*, int);
void (*error) (struct _ce_chan_t*, int);
diff --git a/sys/dev/ce/if_ce.c b/sys/dev/ce/if_ce.c
index 8f93667cdc5c..396d670355e1 100644
--- a/sys/dev/ce/if_ce.c
+++ b/sys/dev/ce/if_ce.c
@@ -962,8 +962,8 @@ static int ce_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data)
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;
switch (cmd) {
default: CE_DEBUG2 (d, ("ioctl 0x%lx\n", cmd)); return 0;
@@ -1621,12 +1621,17 @@ static int ce_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
#endif
if (error)
return error;
- d->chan->debug = *(int*)data;
#ifndef NETGRAPH
- if (d->chan->debug)
- d->ifp->if_flags |= IFF_DEBUG;
- else
- d->ifp->if_flags &= ~IFF_DEBUG;
+ /*
+ * The debug_shadow is always greater than zero for logic
+ * simplicity. For switching debug off the IFF_DEBUG is
+ * responsible.
+ */
+ d->chan->debug_shadow = (*(int*)data) ? (*(int*)data) : 1;
+ if (d->ifp->if_flags & IFF_DEBUG)
+ d->chan->debug = d->chan->debug_shadow;
+#else
+ d->chan->debug = *(int*)data;
#endif
return 0;
diff --git a/sys/dev/cp/cpddk.h b/sys/dev/cp/cpddk.h
index 3ff40bbd68d1..fcdb0d021f3a 100644
--- a/sys/dev/cp/cpddk.h
+++ b/sys/dev/cp/cpddk.h
@@ -205,6 +205,7 @@ typedef struct _cp_chan_t {
void *tag [NTBUF]; /* system dependent data per buffer */
void *sys; /* system dependent data per channel */
unsigned char debug; /* debug level, 0..2 */
+ unsigned char debug_shadow; /* debug shadow */
void (*transmit) (struct _cp_chan_t *c, void *tag, int len);
void (*receive) (struct _cp_chan_t *c, unsigned char *data, int len);
diff --git a/sys/dev/cp/if_cp.c b/sys/dev/cp/if_cp.c
index dbe40bc5bac0..36b12abbf704 100644
--- a/sys/dev/cp/if_cp.c
+++ b/sys/dev/cp/if_cp.c
@@ -733,8 +733,8 @@ static int cp_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data)
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;
switch (cmd) {
default: CP_DEBUG2 (d, ("ioctl 0x%lx\n", cmd)); return 0;
@@ -1349,12 +1349,17 @@ static int cp_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
error = priv_check (td, PRIV_DRIVER);
if (error)
return error;
- d->chan->debug = *(int*)data;
#ifndef NETGRAPH
- if (d->chan->debug)
- d->ifp->if_flags |= IFF_DEBUG;
- else
- d->ifp->if_flags &= ~IFF_DEBUG;
+ /*
+ * The debug_shadow is always greater than zero for logic
+ * simplicity. For switching debug off the IFF_DEBUG is
+ * responsible.
+ */
+ d->chan->debug_shadow = (*(int*)data) ? (*(int*)data) : 1;
+ if (d->ifp->if_flags & IFF_DEBUG)
+ d->chan->debug = d->chan->debug_shadow;
+#else
+ d->chan->debug = *(int*)data;
#endif
return 0;
diff --git a/sys/dev/ctau/ctddk.h b/sys/dev/ctau/ctddk.h
index 99620902fc96..be0a092b1d56 100644
--- a/sys/dev/ctau/ctddk.h
+++ b/sys/dev/ctau/ctddk.h
@@ -412,6 +412,7 @@ typedef struct _ct_chan_t {
void *attach [NBUF]; /* system dependent data per buffer */
void *sys; /* system dependent data per channel */
int debug;
+ int debug_shadow;
int e1_first_int;
unsigned char *sccrx, *scctx; /* pointers to SCC rx and tx buffers */
diff --git a/sys/dev/ctau/if_ct.c b/sys/dev/ctau/if_ct.c
index 25e927a94c88..f2d876d399ef 100644
--- a/sys/dev/ctau/if_ct.c
+++ b/sys/dev/ctau/if_ct.c
@@ -949,8 +949,8 @@ static int ct_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data)
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;
switch (cmd) {
default: CT_DEBUG2 (d, ("ioctl 0x%lx\n", cmd)); return 0;
@@ -1529,12 +1529,17 @@ static int ct_ioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struc
error = priv_check (td, PRIV_DRIVER);
if (error)
return error;
- c->debug = *(int*)data;
#ifndef NETGRAPH
- if (d->chan->debug)
- d->ifp->if_flags |= IFF_DEBUG;
- else
- d->ifp->if_flags &= (~IFF_DEBUG);
+ /*
+ * The debug_shadow is always greater than zero for logic
+ * simplicity. For switching debug off the IFF_DEBUG is
+ * responsible.
+ */
+ 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
return 0;
diff --git a/sys/dev/cx/cxddk.h b/sys/dev/cx/cxddk.h
index bd95aa6e254c..69f069364af3 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 34ccd5acd251..be164bd425cd 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;
}