diff options
-rw-r--r-- | sbin/sconfig/sconfig.c | 22 | ||||
-rw-r--r-- | sys/dev/ce/ceddk.h | 1 | ||||
-rw-r--r-- | sys/dev/ce/if_ce.c | 19 | ||||
-rw-r--r-- | sys/dev/cp/cpddk.h | 1 | ||||
-rw-r--r-- | sys/dev/cp/if_cp.c | 19 | ||||
-rw-r--r-- | sys/dev/ctau/ctddk.h | 1 | ||||
-rw-r--r-- | sys/dev/ctau/if_ct.c | 19 | ||||
-rw-r--r-- | sys/dev/cx/cxddk.h | 1 | ||||
-rw-r--r-- | sys/dev/cx/if_cx.c | 31 |
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; } |