From owner-p4-projects@FreeBSD.ORG Sun Jul 29 08:39:13 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 34BC216A419; Sun, 29 Jul 2007 08:39:13 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BBC4116A417 for ; Sun, 29 Jul 2007 08:39:12 +0000 (UTC) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id AEE3F13C465 for ; Sun, 29 Jul 2007 08:39:12 +0000 (UTC) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l6T8dC71074489 for ; Sun, 29 Jul 2007 08:39:12 GMT (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l6T8dC2L074486 for perforce@freebsd.org; Sun, 29 Jul 2007 08:39:12 GMT (envelope-from peter@freebsd.org) Date: Sun, 29 Jul 2007 08:39:12 GMT Message-Id: <200707290839.l6T8dC2L074486@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Cc: Subject: PERFORCE change 124300 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 29 Jul 2007 08:39:13 -0000 http://perforce.freebsd.org/chv.cgi?CH=124300 Change 124300 by peter@peter_overcee on 2007/07/29 08:38:16 Add a whole bunch of magic field decoding. Add a dumper/decoder for the si_port structure. Turn on minimal WARNS. Not pretty, but functional. Affected files ... .. //depot/projects/hammer/usr.sbin/sicontrol/Makefile#2 edit .. //depot/projects/hammer/usr.sbin/sicontrol/sicontrol.c#5 edit Differences ... ==== //depot/projects/hammer/usr.sbin/sicontrol/Makefile#2 (text+ko) ==== @@ -4,5 +4,6 @@ MAN= sicontrol.8 CFLAGS+= -I${.CURDIR}/../../sys +WARNS?= 2 .include ==== //depot/projects/hammer/usr.sbin/sicontrol/sicontrol.c#5 (text+ko) ==== @@ -76,6 +76,7 @@ static int alldev = 0; void ccb_stat(int, char **); +void port_stat(int, char **); void debug(int, char **); void dostat(void); int getnum(char *); @@ -101,6 +102,7 @@ {"nport", nport}, {"mstate", mstate}, {"ccbstat", ccb_stat}, + {"portstat", port_stat}, {"ttystat", tty_stat}, {0, 0} }; @@ -118,9 +120,10 @@ #define U_NPORT 3 #define U_MSTATE 4 #define U_STAT_CCB 5 -#define U_STAT_TTY 6 +#define U_STAT_PORT 6 +#define U_STAT_TTY 7 -#define U_MAX 7 +#define U_MAX 8 #define U_ALL -1 char *usage[] = { "debug [[add|del|set debug_levels] | [off]]\n", @@ -129,6 +132,7 @@ "nport\n", "mstate\n", "ccbstat\n", + "portstat\n", "ttystat\n", 0 }; @@ -401,6 +405,169 @@ printf("SLXOS: total of %d ports\n", ports); } +const char *s_stat(int stat) +{ + switch (stat) { + case IDLE_OPEN: return "IDLE_OPEN"; + case LOPEN: return "LOPEN"; + case MOPEN: return "MOPEN"; + case MPEND: return "MPEND"; + case CONFIG: return "CONFIG"; + case CLOSE: return "CLOSE"; + case SBREAK: return "SBREAK"; + case EBREAK: return "EBREAK"; + case IDLE_CLOSE:return "IDLE_CLOSE"; + case IDLE_BREAK:return "IDLE_BREAK"; + case FCLOSE: return "FCLOSE"; + case RESUME: return "RESUME"; + case WFLUSH: return "WFLUSH"; + case RFLUSH: return "RFLUSH"; + default: return "??"; + } +} +const char *s_mr1(int mr1) +{ + static char msg[200]; + + sprintf(msg, "%dbit, %s, parity:[", 5 + (mr1 & MR1_8_BITS), mr1 & MR1_ODD ? "odd" : "even"); + if (mr1 & MR1_WITH) + strcat(msg, "with;"); + if (mr1 & MR1_FORCE) + strcat(msg, "force;"); + if (mr1 & MR1_NONE) + strcat(msg, "none;"); + if (mr1 & MR1_SPECIAL) + strcat(msg, "special;"); + strcpy(msg + strlen(msg) - 1, "]"); + sprintf(msg + strlen(msg), ", err: %s", mr1 & MR1_BLOCK ? "block" : "none"); + sprintf(msg + strlen(msg), ", cts: %s", mr1 & MR1_CTSCONT ? "auto" : "none"); + return (msg); +} +const char *s_mr2(int mr2) +{ + static char msg[200]; + + switch (mr2 & 0xf) { + case MR2_1_STOP: strcpy(msg, "1stop"); break; + case MR2_2_STOP: strcpy(msg, "2stop"); break; + default: sprintf(msg, "??stop (0x%x)", mr2 & 0xf); break; + } + if (mr2 & MR2_RTSCONT) strcat(msg, ", rtscont"); + if (mr2 & MR2_CTSCONT) strcat(msg, ", ctscont"); + switch (mr2 & 0xc0) { + case MR2_NORMAL: strcat(msg, ", mode:normal"); break; + case MR2_AUTO: strcat(msg, ", mode:auto"); break; + case MR2_LOCAL: strcat(msg, ", mode:local"); break; + case MR2_REMOTE: strcat(msg, ", mode:remote"); break; + } + return (msg); +} +const char *s_clk(int clk) +{ + switch (clk & 0xf) { + case 0x0: return "75"; + case 0x1: return "110/115200"; + case 0x2: return "38400"; + case 0x3: return "150"; + case 0x4: return "300"; + case 0x5: return "600"; + case 0x6: return "1200"; + case 0x7: return "2000"; + case 0x8: return "2400"; + case 0x9: return "4800"; + case 0xa: return "7200"; + case 0xb: return "9600"; + case 0xc: return "19200"; + case 0xd: return "57600"; + case 0xe: return "?0xe"; + case 0xf: return "?0xf"; + } + return ("gcc sucks"); +} +const char *s_op(int op) +{ + static char msg[200]; + + sprintf(msg, "cts:%s", (op & OP_CTS) ? "on" : "off"); + sprintf(msg + strlen(msg), ", dsr:%s", (op & OP_DSR) ? "on" : "off"); + return (msg); +} + +const char *s_ip(int ip) +{ + static char msg[200]; + + sprintf(msg, "rts:%s", (ip & IP_RTS) ? "on" : "off"); + sprintf(msg + strlen(msg), ", dcd:%s", (ip & IP_DCD) ? "on" : "off"); + sprintf(msg + strlen(msg), ", dtr:%s", (ip & IP_DTR) ? "on" : "off"); + sprintf(msg + strlen(msg), ", ri:%s", (ip & IP_RI) ? "on" : "off"); + return (msg); +} + +const char *s_state(int state) +{ + return (state & ST_BREAK ? "break:on" : "break:off"); +} + +const char *s_prtcl(int pr) +{ + static char msg[200]; + + sprintf(msg, "tx xon any:%s", (pr & SP_TANY) ? "on" : "off"); + sprintf(msg + strlen(msg), ", tx xon/xoff:%s", (pr & SP_TXEN) ? "on" : "off"); + sprintf(msg + strlen(msg), ", cooking:%s", (pr & SP_CEN) ? "on" : "off"); + sprintf(msg + strlen(msg), ", rx xon/xoff:%s", (pr & SP_RXEN) ? "on" : "off"); + sprintf(msg + strlen(msg), ", dcd/dsr check:%s", (pr & SP_DCEN) ? "on" : "off"); + sprintf(msg + strlen(msg), ", parity check:%s", (pr & SP_PAEN) ? "on" : "off"); + return (msg); +} +const char *s_break(int br) +{ + static char msg[200]; + + sprintf(msg, "ignore rx brk:%s", (br & BR_IGN) ? "on" : "off"); + sprintf(msg + strlen(msg), ", brk interrupt:%s", (br & BR_INT) ? "on" : "off"); + sprintf(msg + strlen(msg), ", parmrking:%s", (br & BR_PARMRK) ? "on" : "off"); + sprintf(msg + strlen(msg), ", parign:%s", (br & BR_PARIGN) ? "on" : "off"); + return (msg); +} + +const char * +s_xstat(int xs) +{ + static char msg[200]; + + msg[0] = 0; + /* MTA definitions, not TA */ + if (xs & 0x01) strcat(msg, "TION "); /* Tx interrupts on (MTA only) */ + if (xs & 0x02) strcat(msg, "RTSEN "); /* RTS FLOW enabled (MTA only) */ + if (xs & 0x04) strcat(msg, "RTSLOW "); /* XOFF received (TA only) */ + if (xs & 0x08) strcat(msg, "RXEN "); /* Rx XON/XOFF enabled */ + if (xs & 0x10) strcat(msg, "ANYXO "); /* XOFF pending/sent or RTS dropped */ + if (xs & 0x20) strcat(msg, "RXSE "); /* Rx XOFF sent */ + if (xs & 0x40) strcat(msg, "NPEND "); /* Rx XON pending or XOFF pending */ + if (xs & 0x40) strcat(msg, "FPEND "); /* Rx XOFF pending */ + return (msg); +} + +const char * +s_cstat(int cs) +{ + static char msg[200]; + + msg[0] = 0; + /* MTA definitions, not TA */ + if (cs & 0x01) strcat(msg, "TEMR "); /* Tx empty requested (MTA only) */ + if (cs & 0x02) strcat(msg, "TEMA "); /* Tx empty acked (MTA only) */ + if (cs & 0x04) strcat(msg, "EN "); /* Cooking enabled (on MTA means port is also || */ + if (cs & 0x08) strcat(msg, "HIGH "); /* Buffer previously hit high water */ + if (cs & 0x10) strcat(msg, "CTSEN "); /* CTS automatic flow-control enabled */ + if (cs & 0x20) strcat(msg, "DCDEN "); /* DCD/DTR checking enabled */ + if (cs & 0x40) strcat(msg, "BREAK "); /* Break detected */ + if (cs & 0x80) strcat(msg, "RTSEN "); /* RTS automatic flow control enabled (MTA only) */ + return (msg); +} + void ccb_stat(int ac, char **av) { @@ -419,31 +586,31 @@ /* WORD module - address of module struct */ printf("\tuart_type 0x%x\n", CCB.type); /* BYTE type - Uart type */ /* BYTE fill - */ - printf("\tx_status 0x%x\n", CCB.x_status); /* BYTE x_status - XON / XOFF status */ - printf("\tc_status 0x%x\n", CCB.c_status); /* BYTE c_status - cooking status */ + printf("\tx_status 0x%x %s\n", CCB.x_status, s_xstat(CCB.x_status)); /* BYTE x_status - XON / XOFF status */ + printf("\tc_status 0x%x %s\n", CCB.c_status, s_cstat(CCB.c_status)); /* BYTE c_status - cooking status */ printf("\thi_rxipos 0x%x\n", CCB.hi_rxipos); /* BYTE hi_rxipos - stuff into rx buff */ printf("\thi_rxopos 0x%x\n", CCB.hi_rxopos); /* BYTE hi_rxopos - stuff out of rx buffer */ printf("\thi_txopos 0x%x\n", CCB.hi_txopos); /* BYTE hi_txopos - Stuff into tx ptr */ printf("\thi_txipos 0x%x\n", CCB.hi_txipos); /* BYTE hi_txipos - ditto out */ - printf("\thi_stat 0x%x\n", CCB.hi_stat); /* BYTE hi_stat - Command register */ + printf("\thi_stat 0x%x %s\n", CCB.hi_stat, s_stat(CCB.hi_stat));/* BYTE hi_stat - Command register */ printf("\tdsr_bit 0x%x\n", CCB.dsr_bit); /* BYTE dsr_bit - Magic bit for DSR */ printf("\ttxon 0x%x\n", CCB.txon); /* BYTE txon - TX XON char */ printf("\ttxoff 0x%x\n", CCB.txoff); /* BYTE txoff - ditto XOFF */ printf("\trxon 0x%x\n", CCB.rxon); /* BYTE rxon - RX XON char */ printf("\trxoff 0x%x\n", CCB.rxoff); /* BYTE rxoff - ditto XOFF */ - printf("\thi_mr1 0x%x\n", CCB.hi_mr1); /* BYTE hi_mr1 - mode 1 image */ - printf("\thi_mr2 0x%x\n", CCB.hi_mr2); /* BYTE hi_mr2 - mode 2 image */ - printf("\thi_csr 0x%x\n", CCB.hi_csr); /* BYTE hi_csr - clock register */ - printf("\thi_op 0x%x\n", CCB.hi_op); /* BYTE hi_op - Op control */ - printf("\thi_ip 0x%x\n", CCB.hi_ip); /* BYTE hi_ip - Input pins */ - printf("\thi_state 0x%x\n", CCB.hi_state); /* BYTE hi_state - status */ - printf("\thi_prtcl 0x%x\n", CCB.hi_prtcl); /* BYTE hi_prtcl - Protocol */ + printf("\thi_mr1 0x%x %s\n", CCB.hi_mr1, s_mr1(CCB.hi_mr1)); /* BYTE hi_mr1 - mode 1 image */ + printf("\thi_mr2 0x%x %s\n", CCB.hi_mr2, s_mr2(CCB.hi_mr2)); /* BYTE hi_mr2 - mode 2 image */ + printf("\thi_csr 0x%x in:%s out:%s\n", CCB.hi_csr, s_clk(CCB.hi_csr >> 4), s_clk(CCB.hi_csr)); /* BYTE hi_csr - clock register */ + printf("\thi_op 0x%x %s\n", CCB.hi_op, s_op(CCB.hi_op)); /* BYTE hi_op - Op control */ + printf("\thi_ip 0x%x %s\n", CCB.hi_ip, s_ip(CCB.hi_ip)); /* BYTE hi_ip - Input pins */ + printf("\thi_state 0x%x %s\n", CCB.hi_state, s_state(CCB.hi_state)); /* BYTE hi_state - status */ + printf("\thi_prtcl 0x%x %s\n", CCB.hi_prtcl, s_prtcl(CCB.hi_prtcl)); /* BYTE hi_prtcl - Protocol */ printf("\thi_txon 0x%x\n", CCB.hi_txon); /* BYTE hi_txon - host copy tx xon stuff */ printf("\thi_txoff 0x%x\n", CCB.hi_txoff); /* BYTE hi_txoff - */ printf("\thi_rxon 0x%x\n", CCB.hi_rxon); /* BYTE hi_rxon - */ printf("\thi_rxoff 0x%x\n", CCB.hi_rxoff); /* BYTE hi_rxoff - */ printf("\tclose_prev 0x%x\n", CCB.close_prev); /* BYTE close_prev - Was channel previously closed */ - printf("\thi_break 0x%x\n", CCB.hi_break); /* BYTE hi_break - host copy break process */ + printf("\thi_break 0x%x %s\n", CCB.hi_break, s_break(CCB.hi_break)); /* BYTE hi_break - host copy break process */ printf("\tbreak_state 0x%x\n", CCB.break_state); /* BYTE break_state - local copy ditto */ printf("\thi_mask 0x%x\n", CCB.hi_mask); /* BYTE hi_mask - Mask for CS7 etc. */ printf("\tmask_z280 0x%x\n", CCB.mask_z280); /* BYTE mask_z280 - Z280's copy */ @@ -453,7 +620,65 @@ /* BYTE res1[0xA0] - */ } +const char *sp_state(int st) +{ + + if (st & SS_LSTART) + return("lstart "); + else + return(""); +} + void +port_stat(int ac, char **av) +{ + struct si_pstat sip; +#define PRT sip.tc_siport + + if (ac != 0) + prusage(U_STAT_PORT, 1); + sip.tc_dev = tc.tc_dev; + if (ioctl(ctlfd, TCSI_PORT, &sip) < 0) + err(1, "TCSI_PORT on %s", Devname); + printf("%s: ", Devname); + + printf("\tsp_pend 0x%x %s\n", PRT.sp_pend, s_stat(PRT.sp_pend)); + printf("\tsp_last_hi_ip 0x%x %s\n", PRT.sp_last_hi_ip, s_ip(PRT.sp_last_hi_ip)); + printf("\tsp_state 0x%x %s\n", PRT.sp_state, sp_state(PRT.sp_state)); + printf("\tsp_delta_overflows 0x%d\n", PRT.sp_delta_overflows); +} + +const char *pt_state(int ts) +{ + static char buf[200]; + + buf[0] = 0; + if (ts & TS_SO_OLOWAT) strcat(buf, "TS_SO_OLOWAT "); + if (ts & TS_ASYNC) strcat(buf, "TS_ASYNC "); + if (ts & TS_BUSY) strcat(buf, "TS_BUSY "); + if (ts & TS_CARR_ON) strcat(buf, "TS_CARR_ON "); + if (ts & TS_FLUSH) strcat(buf, "TS_FLUSH "); + if (ts & TS_ISOPEN) strcat(buf, "TS_ISOPEN "); + if (ts & TS_TBLOCK) strcat(buf, "TS_TBLOCK "); + if (ts & TS_TIMEOUT) strcat(buf, "TS_TIMEOUT "); + if (ts & TS_TTSTOP) strcat(buf, "TS_TTSTOP "); + if (ts & TS_XCLUDE) strcat(buf, "TS_XCLUDE "); + if (ts & TS_BKSL) strcat(buf, "TS_BKSL "); + if (ts & TS_CNTTB) strcat(buf, "TS_CNTTB "); + if (ts & TS_ERASE) strcat(buf, "TS_ERASE "); + if (ts & TS_TYPEN) strcat(buf, "TS_TYPEN "); + if (ts & TS_CAN_BYPASS_L_RINT) strcat(buf, "TS_CAN_BYPASS_L_RINT "); + if (ts & TS_CONNECTED) strcat(buf, "TS_CONNECTED "); + if (ts & TS_SNOOP) strcat(buf, "TS_SNOOP "); + if (ts & TS_SO_OCOMPLETE) strcat(buf, "TS_OCOMPLETE "); + if (ts & TS_ZOMBIE) strcat(buf, "TS_ZOMBIE "); + if (ts & TS_CAR_OFLOW) strcat(buf, "TS_CAR_OFLOW "); + if (ts & TS_DTR_WAIT) strcat(buf, "TS_DTR_WAIT "); + if (ts & TS_GONE) strcat(buf, "TS_GONE "); + if (ts & TS_CALLOUT) strcat(buf, "TS_CALLOUT "); + return (buf); +} +void tty_stat(int ac, char **av) { struct si_pstat sip; @@ -466,21 +691,20 @@ err(1, "TCSI_TTY on %s", Devname); printf("%s: ", Devname); - printf("\tt_outq.c_cc %d.\n", TTY.t_outq.c_cc); /* struct clist t_outq */ - printf("\tt_dev 0x%x\n", TTY.t_dev); /* dev_t t_dev */ + printf("\tt_outq.c_cc %d\n", TTY.t_outq.c_cc); /* struct clist t_outq */ printf("\tt_flags 0x%x\n", TTY.t_flags); /* int t_flags */ - printf("\tt_state 0x%x\n", TTY.t_state); /* int t_state */ - printf("\tt_ihiwat %d.\n", TTY.t_ihiwat); /* int t_ihiwat */ - printf("\tt_ilowat %d.\n", TTY.t_ilowat); /* int t_ilowat */ - printf("\tt_ohiwat %d.\n", TTY.t_ohiwat); /* int t_ohiwat */ - printf("\tt_olowat %d.\n", TTY.t_olowat); /* int t_olowat */ + printf("\tt_state 0x%x %s\n", TTY.t_state, pt_state(TTY.t_state)); /* int t_state */ + printf("\tt_ihiwat %d\n", TTY.t_ihiwat); /* int t_ihiwat */ + printf("\tt_ilowat %d\n", TTY.t_ilowat); /* int t_ilowat */ + printf("\tt_ohiwat %d\n", TTY.t_ohiwat); /* int t_ohiwat */ + printf("\tt_olowat %d\n", TTY.t_olowat); /* int t_olowat */ printf("\tt_iflag 0x%x\n", TTY.t_iflag); /* t_iflag */ printf("\tt_oflag 0x%x\n", TTY.t_oflag); /* t_oflag */ printf("\tt_cflag 0x%x\n", TTY.t_cflag); /* t_cflag */ printf("\tt_lflag 0x%x\n", TTY.t_lflag); /* t_lflag */ printf("\tt_cc %p\n", (void *)TTY.t_cc); /* t_cc */ - printf("\tt_termios.c_ispeed 0x%x\n", TTY.t_termios.c_ispeed); /* t_termios.c_ispeed */ - printf("\tt_termios.c_ospeed 0x%x\n", TTY.t_termios.c_ospeed); /* t_termios.c_ospeed */ + printf("\tt_termios.c_ispeed %d\n", TTY.t_termios.c_ispeed); /* t_termios.c_ispeed */ + printf("\tt_termios.c_ospeed %d\n", TTY.t_termios.c_ospeed); /* t_termios.c_ospeed */ } int