From d7e54a785544ac40abc4a88383df3a913ca466e8 Mon Sep 17 00:00:00 2001 From: tzafrir Date: Tue, 13 May 2008 21:08:09 +0000 Subject: xpp r5723: Includes, among others: * New firmware protocol version: 3.0 . * New numbers for the device types: (e.g. in card_init* scripts) - FXS: 1 (was: 3) - FXO: 2 (was: 4) - BRI: 3 (was: 6 for TE, 7 for NT) - PRI: 4 (was: 9) * Init scripts of FXS and FXO modules are now written in Perl as well (be sure to have File::Basename, e.g: perl-modules in Debian). * calibrate_slics merged into init_card_1_30 . * Module parameter print_dbg replaced with debug . Same meaning. * init_fxo_modes removed: content moved into init_card_2_30, verified at build time. * Code tested with sparse. Most warnings were fixed. * Set ZT_SIG_DACS for the bchans in the PRI and BRI modules to not get ignored by ztscan. * Handle null config_desc we get from some crazy USB controllers. * genzaptelconf: Fix reporting of empty slots in list mode. * xpp_blink can now blink a single analog port. * "slics" has been renamed "chipregs". * Fixed a small typo in fpga_load(8). * Fixed bashism in xpp_fxloader. Merged revisions 4264 via svnmerge from http://svn.digium.com/svn/zaptel/branches/1.2 git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.4@4266 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- kernel/xpp/xproto.c | 102 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 36 deletions(-) (limited to 'kernel/xpp/xproto.c') diff --git a/kernel/xpp/xproto.c b/kernel/xpp/xproto.c index 010f0de..c3aa34e 100644 --- a/kernel/xpp/xproto.c +++ b/kernel/xpp/xproto.c @@ -30,7 +30,7 @@ static const char rcsid[] = "$Id$"; -extern int print_dbg; +extern int debug; static const xproto_table_t *xprotocol_tables[XPD_TYPE_NOMODULE]; @@ -68,7 +68,7 @@ xproto_handler_t xproto_global_handler(byte opcode) return xproto_card_handler(&PROTO_TABLE(GLOBAL), opcode); } -const xproto_table_t *xproto_table(xpd_type_t cardtype) +static const xproto_table_t *xproto_table(xpd_type_t cardtype) { if(cardtype >= XPD_TYPE_NOMODULE) return NULL; @@ -125,7 +125,7 @@ void notify_bad_xpd(const char *funcname, xbus_t *xbus, const struct xpd_addr ad funcname, addr.unit, addr.subunit, msg); } -int packet_process(xbus_t *xbus, xpacket_t *pack) +static int packet_process(xbus_t *xbus, xpacket_t *pack) { byte op; const xproto_entry_t *xe; @@ -140,7 +140,7 @@ int packet_process(xbus_t *xbus, xpacket_t *pack) XBUS_NOTICE(xbus, "%s: from %d%d: bad address.\n", __FUNCTION__, XPACKET_ADDR_UNIT(pack), XPACKET_ADDR_SUBUNIT(pack)); - dump_packet("packet_process -- bad address", pack, print_dbg); + dump_packet("packet_process -- bad address", pack, debug); } goto out; } @@ -186,7 +186,7 @@ int packet_process(xbus_t *xbus, xpacket_t *pack) if(printk_ratelimit()) { ERR("xpp: %s: wrong size %d for opcode=0x%02X\n", __FUNCTION__, XPACKET_LEN(pack), op); - dump_packet("packet_process -- wrong size", pack, print_dbg); + dump_packet("packet_process -- wrong size", pack, debug); } goto out; } @@ -207,6 +207,8 @@ static int xframe_receive_cmd(xbus_t *xbus, xframe_t *xframe) int len; int ret; + if(debug & DBG_COMMANDS) + dump_xframe("RX-CMD", xbus, xframe, DBG_ANY); p = xframe->packets; xframe_end = p + XFRAME_LEN(xframe); do { @@ -218,7 +220,7 @@ static int xframe_receive_cmd(xbus_t *xbus, xframe_t *xframe) if((rate_limit++ % 1003) == 0) { XBUS_DBG(GENERAL, xbus, "A PCM packet within a Non-PCM xframe\n"); - dump_xframe("In Non-PCM xframe", xbus, xframe, print_dbg); + dump_xframe("In Non-PCM xframe", xbus, xframe, debug); } ret = -EPROTO; goto out; @@ -229,7 +231,7 @@ static int xframe_receive_cmd(xbus_t *xbus, xframe_t *xframe) if((rate_limit++ % 1003) == 0) { XBUS_NOTICE(xbus, "Invalid packet length %d\n", len); - dump_xframe("BAD LENGTH", xbus, xframe, print_dbg); + dump_xframe("BAD LENGTH", xbus, xframe, debug); } ret = -EPROTO; goto out; @@ -255,7 +257,7 @@ int xframe_receive(xbus_t *xbus, xframe_t *xframe) if((rate_limit++ % 1003) == 0) { XBUS_NOTICE(xbus, "short xframe\n"); - dump_xframe("short xframe", xbus, xframe, print_dbg); + dump_xframe("short xframe", xbus, xframe, debug); } FREE_RECV_XFRAME(xbus, xframe); return -EPROTO; @@ -287,12 +289,12 @@ int xframe_receive(xbus_t *xbus, xframe_t *xframe) #define VERBOSE_DEBUG 1 #define ERR_REPORT_LIMIT 20 -void dump_packet(const char *msg, const xpacket_t *packet, bool print_dbg) +void dump_packet(const char *msg, const xpacket_t *packet, bool debug) { byte op = XPACKET_OP(packet); byte *addr = (byte *)&XPACKET_ADDR(packet); - if(!print_dbg) + if(!debug) return; printk(KERN_DEBUG "%s: XPD=%1X-%1X%c (0x%X) OP=0x%02X LEN=%d", msg, @@ -322,7 +324,7 @@ void dump_packet(const char *msg, const xpacket_t *packet, bool print_dbg) limiter++; break; } - if (print_dbg) + if (debug) printk("%02X ", p[i]); } } @@ -330,39 +332,69 @@ void dump_packet(const char *msg, const xpacket_t *packet, bool print_dbg) printk("\n"); } -void dump_reg_cmd(const char msg[], const reg_cmd_t *regcmd, bool writing) +void dump_reg_cmd(const char msg[], bool writing, xbus_t *xbus, + byte unit, xportno_t port, const reg_cmd_t *regcmd) { char action; - byte chipsel; - + char modifier; + char port_buf[MAX_PROC_WRITE]; + char reg_buf[MAX_PROC_WRITE]; + char data_buf[MAX_PROC_WRITE]; + + if(regcmd->bytes > sizeof(*regcmd) - 1) { /* The size byte is not included */ + PORT_NOTICE(xbus, unit, port, "%s: %s: Too long: regcmd->bytes = %d\n", + __FUNCTION__, msg, regcmd->bytes); + return; + } + if(regcmd->is_multibyte) { + char buf[MAX_PROC_WRITE + 1]; + int i; + int n = 0; + size_t len = regcmd->bytes; + const byte *p = REG_XDATA(regcmd); + + buf[0] = '\0'; + for(i = 0; i < len && n < MAX_PROC_WRITE; i++) + n += snprintf(&buf[n], MAX_PROC_WRITE - n, "%02X ", p[i]); + PORT_DBG(REGS, xbus, unit, port, + "UNIT-%d PORT-%d: Multibyte(eoframe=%d) %s[0..%zd]: %s%s\n", + unit, port, regcmd->eoframe, + msg, len-1, buf, (n >= MAX_PROC_WRITE)?"...":""); + return; + } if(regcmd->bytes != sizeof(*regcmd) - 1) { /* The size byte is not included */ - NOTICE("%s: Wrong size: regcmd->bytes = %d\n", __FUNCTION__, regcmd->bytes); + PORT_NOTICE(xbus, unit, port, "%s: %s: Wrong size: regcmd->bytes = %d\n", + __FUNCTION__, msg, regcmd->bytes); return; } - if(writing && (REG_FIELD(regcmd, chipsel) & 0x80)) - ERR("Sending register command with reading bit ON\n"); - action = (writing) ? 'W' : 'R'; - chipsel = REG_FIELD(regcmd, chipsel) & ~0x80; + snprintf(port_buf, MAX_PROC_WRITE, "%d%s", + regcmd->portnum, + (REG_FIELD(regcmd, all_ports_broadcast)) ? "*" : ""); + action = (REG_FIELD(regcmd, read_request)) ? 'R' : 'W'; + modifier = 'D'; if(REG_FIELD(regcmd, do_subreg)) { - DBG(GENERAL, "%s: %d %cS %02X %02X [%02X] # data_high=%X m=%d eof=%d\n", msg, chipsel, action, + snprintf(reg_buf, MAX_PROC_WRITE, "%02X %02X", REG_FIELD(regcmd, regnum), - REG_FIELD(regcmd, subreg), - REG_FIELD(regcmd, data_low), - REG_FIELD(regcmd, data_high), - regcmd->multibyte, regcmd->eoframe); - } else if(REG_FIELD(regcmd, regnum) == 0x1E) { - DBG(GENERAL, "%s: %d %cI %02X [%02X %02X] # m=%d eof=%d\n", msg, chipsel, action, - REG_FIELD(regcmd, subreg), - REG_FIELD(regcmd, data_low), - REG_FIELD(regcmd, data_high), - regcmd->multibyte, regcmd->eoframe); + REG_FIELD(regcmd, subreg)); + modifier = 'S'; } else { - DBG(GENERAL, "%s: %d %cD %02X [%02X] # data_high=%X m=%d eof=%d\n", msg, chipsel, action, - REG_FIELD(regcmd, regnum), + snprintf(reg_buf, MAX_PROC_WRITE, "%02X", + REG_FIELD(regcmd, regnum)); + } + if(REG_FIELD(regcmd, read_request)) { + data_buf[0] = '\0'; + } else if(REG_FIELD(regcmd, do_datah)) { + snprintf(data_buf, MAX_PROC_WRITE, "%02X %02X", REG_FIELD(regcmd, data_low), - REG_FIELD(regcmd, data_high), - regcmd->multibyte, regcmd->eoframe); + REG_FIELD(regcmd, data_high)); + modifier = 'I'; + } else { + snprintf(data_buf, MAX_PROC_WRITE, "%02X", + REG_FIELD(regcmd, data_low)); } + PORT_DBG(REGS, xbus, unit, port, "%s: %s %c%c %s %s\n", + msg, port_buf, action, modifier, + reg_buf, data_buf); } const char *xproto_name(xpd_type_t xpd_type) @@ -411,8 +443,6 @@ int xproto_register(const xproto_table_t *proto_table) // CHECK_XOP(card_ioctl); // optional method -- call after testing CHECK_XOP(card_register_reply); CHECK_XOP(XPD_STATE); - CHECK_XOP(RING); - CHECK_XOP(RELAY_OUT); xprotocol_tables[type] = proto_table; return 0; -- cgit v1.2.3