From 5e3f82cf4b7a4788fc9e0a78782ad05988c4502c Mon Sep 17 00:00:00 2001 From: tzafrir Date: Thu, 12 Jul 2007 22:49:13 +0000 Subject: xpp driver r4371: * Update to zaptel-1.2.18 and zaptel-1.4.3 (r4308 onward) * Fix a critical race with zaptel synchronization (r4362) * Added a /proc/xpp/cmds for statistics about command timing (r4360) * Fix a digit mapping bug with hardware dtmf detection (r4357) * In xpp/utils/Makefile add perl syntax checks to our scripts (r4337) * Better USB data error checking (r4336) * udev rules (xpp.rules) avoid false calls from wrong nodes (r4331) * Improve hardware detection and reporting in lszaptel, zaptel_hardware. zapconf is basically functional. * Leds are blinked synchronously on all Astribanks now (r4262) * Fix a BRI bug if OPTIMIZE_CHANMUTE was compiled into zaptel (r4258) (This feature was not yet accepted into official zaptel) * Removed compile warning about HZ != 1000 (r4218) * Firmware updates. * fpga_load now supports USB pathes without zeros (r4211) * XPD numbers have changed to '' (r4196) * Proper support for ZT_VMWI ioctl, if used in zaptel (r4092) * Fix FXO power denial detection (r4054) * FXO could accidentally go off-hook with some compilers (r4048) git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@2732 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- xpp/card_global.c | 102 +++++++++++++++++++----------------------------------- 1 file changed, 35 insertions(+), 67 deletions(-) (limited to 'xpp/card_global.c') diff --git a/xpp/card_global.c b/xpp/card_global.c index 70886a8..24d716d 100644 --- a/xpp/card_global.c +++ b/xpp/card_global.c @@ -54,8 +54,8 @@ static void global_packet_dump(const char *msg, xpacket_t *pack); return -EINVAL; } XFRAME_NEW(xframe, pack, xbus, GLOBAL, DESC_REQ, xpd_num); - DBG("on %s #%d\n", xbus->busname, xpd_num); - ret = xframe_send(xbus, xframe); + DBG("%s to %1d%1d\n", xbus->busname, XBUS_UNIT(xpd_num), XBUS_SUBUNIT(xpd_num)); + ret = send_cmd_frame(xbus, xframe); XBUS_COUNTER(xbus, DESC_REQ)++; return ret; } @@ -73,7 +73,20 @@ static void global_packet_dump(const char *msg, xpacket_t *pack); XFRAME_NEW(xframe, pack, xbus, GLOBAL, SYNC_SOURCE, 0); RPACKET_FIELD(pack, GLOBAL, SYNC_SOURCE, sync_mode) = mode; RPACKET_FIELD(pack, GLOBAL, SYNC_SOURCE, drift) = drift; - xframe_send(xbus, xframe); + send_cmd_frame(xbus, xframe); + return 0; +} + +/* 0x23 */ HOSTCMD(GLOBAL, RESET_SYNC_COUNTERS) +{ + xframe_t *xframe; + xpacket_t *pack; + + BUG_ON(!xbus); + DBG("%s\n", xbus->busname); + XFRAME_NEW(xframe, pack, xbus, GLOBAL, RESET_SYNC_COUNTERS, 0); + RPACKET_FIELD(pack, GLOBAL, RESET_SYNC_COUNTERS, mask) = 0x10; + send_cmd_frame(xbus, xframe); return 0; } @@ -106,7 +119,7 @@ HANDLER_DEF(GLOBAL, DEV_DESC) card_desc->rev = rev; card_desc->xpd_addr = xpd_addr; card_desc->line_status = line_status; - DBG("%s: xpd=%d-%d type=%d rev=%d line_status=0x%04X\n", + DBG("%s: XPD=%d%d type=%d rev=%d line_status=0x%04X\n", xbus->busname, xpd_addr.unit, xpd_addr.subunit, type, rev, line_status); xbus_poller_notify(xbus, card_desc); return 0; @@ -114,17 +127,7 @@ HANDLER_DEF(GLOBAL, DEV_DESC) HANDLER_DEF(GLOBAL, PCM_READ) { - /* FIXME: work around temporary hardware bug */ - xpp_line_t lines = RPACKET_FIELD(pack, GLOBAL, PCM_READ, lines); - const byte *pcm = RPACKET_FIELD(pack, GLOBAL, PCM_READ, pcm); xpd_addr_t addr = RPACKET_FIELD(pack, GLOBAL, PCM_READ, addr); - volatile u_char *readchunk; - volatile u_char *r; - unsigned long flags; - int i; - xpp_line_t old_lines = lines; - int unit; - int subunit; struct timeval now; unsigned long sec_diff; unsigned long usec_diff; @@ -150,53 +153,14 @@ HANDLER_DEF(GLOBAL, PCM_READ) xbus->last_rx_sync = now; if(!xpd) { #if 0 - int xpd_num = XPD_NUM(pack->addr); - NOTICE("%s: received %s for non-existing xpd: %d\n", - __FUNCTION__, cmd->name, xpd_num); + notify_bad_xpd(__FUNCTION__, xbus, pack->addr, cmd->name); #endif return -EPROTO; } - // DBG("lines=0x%04X\n", lines); - - if(!pcm_valid(xpd, pack)) { - static int rate_limit; - - if((rate_limit++ % 5001) == 0) - ERR("%s/%s: old_lines=0x%04X lines=0x%04X subunit=%d\n", - xbus->busname, xpd->xpdname, old_lines, lines, xpd->addr.subunit); + if(!pcm_valid(xpd, pack)) return -EPROTO; - } - unit = xpd->addr.unit; - for(subunit = 0; subunit < MAX_SUBUNIT; subunit++, lines >>= SUBUNIT_PCM_SHIFT) { - xpd_t *tmp_xpd; - - tmp_xpd = xpd_by_addr(xbus, unit, subunit); - if(!tmp_xpd || !tmp_xpd->card_present) - continue; - if(lines == 0) - break; /* Optimize */ - spin_lock_irqsave(&tmp_xpd->lock, flags); - if (tmp_xpd->timer_count & 1) { - /* First part */ - r = readchunk = tmp_xpd->readchunk; - } else { - r = readchunk = tmp_xpd->readchunk + ZT_CHUNKSIZE * CHANNELS_PERXPD; - } - /* Copy PCM and put each channel in its index */ - for_each_line(tmp_xpd, i) { - if(IS_SET(lines, i)) { - memcpy((u_char *)r, pcm, ZT_CHUNKSIZE); - //memset((u_char *)r, 0x5A, ZT_CHUNKSIZE); // DEBUG - pcm += ZT_CHUNKSIZE; - } - r += ZT_CHUNKSIZE; - } - XPD_COUNTER(tmp_xpd, PCM_READ)++; - XBUS_COUNTER(xbus, PCM_READ)++; - spin_unlock_irqrestore(&tmp_xpd->lock, flags); - if (!IS_BRI(tmp_xpd)) /* only BRI has subunits */ - break; - } + XBUS_COUNTER(xbus, RX_PACK_PCM)++; + CALL_XMETHOD(card_pcm_tospan, xbus, xpd, pack); flip_parport_bit(2); /* * Firmware marks the sync packets. @@ -215,35 +179,36 @@ HANDLER_DEF(GLOBAL, SYNC_REPLY) BUG_ON(!xbus); if(!xpd) { - int xpd_num = XPD_NUM(pack->addr); - NOTICE("%s: received %s for non-existing xpd: addr=0x%02X\n", __FUNCTION__, cmd->name, xpd_num); + notify_bad_xpd(__FUNCTION__, xbus, pack->addr, cmd->name); return -EPROTO; } DBG("%s/%s: mode=0x%X drift=%d\n", xpd->xbus->busname, xpd->xpdname, mode, drift); - dump_packet("SYNC_REPLY", pack, 1); + dump_packet("SYNC_REPLY", pack, print_dbg); xbus->sync_adjustment = (signed char)drift; return 0; } +#define TMP_NAME_LEN (XBUS_NAMELEN + XPD_NAMELEN + 5) + HANDLER_DEF(GLOBAL, ERROR_CODE) { byte errorcode = RPACKET_FIELD(pack, GLOBAL, ERROR_CODE, errorcode); reg_cmd_t *bad_cmd; - char tmp_xpdname[XPD_NAMELEN]; + char tmp_name[TMP_NAME_LEN]; static long rate_limit; BUG_ON(!xbus); if((rate_limit++ % 5003) > 200) return 0; if(!xpd) { - int xpd_num = XPD_NUM(pack->addr); - snprintf(tmp_xpdname, XPD_NAMELEN, "#%d", xpd_num); + snprintf(tmp_name, TMP_NAME_LEN, "%s(%1d%1d)", xbus->busname, + pack->addr.unit, pack->addr.subunit); } else { - snprintf(tmp_xpdname, XPD_NAMELEN, "%s", xpd->xpdname); + snprintf(tmp_name, TMP_NAME_LEN, "%s/%s", xbus->busname, xpd->xpdname); } - NOTICE("%s/%s: FIRMWARE: %s CODE = 0x%X (rate_limit=%ld)\n", - xbus->busname, tmp_xpdname, cmd->name, errorcode, rate_limit); + NOTICE("%s: FIRMWARE: %s CODE = 0x%X (rate_limit=%ld)\n", + tmp_name, cmd->name, errorcode, rate_limit); switch(errorcode) { case 1: bad_cmd = &RPACKET_FIELD(pack, GLOBAL, ERROR_CODE, info.bad_spi_cmd); @@ -253,7 +218,7 @@ HANDLER_DEF(GLOBAL, ERROR_CODE) dump_packet("FIRMWARE: BAD_PACKET_LEN", pack, 1); break; default: - NOTICE("%s/%s: FIRMWARE: %s UNKNOWN CODE = 0x%X\n", xbus->busname, tmp_xpdname, cmd->name, errorcode); + NOTICE("%s: FIRMWARE: %s UNKNOWN CODE = 0x%X\n", tmp_name, cmd->name, errorcode); dump_packet("PACKET", pack, 1); } /* @@ -337,6 +302,7 @@ int run_initialize_registers(xpd_t *xpd) char subunitstr[MAX_ENV_STR]; char typestr[MAX_ENV_STR]; char revstr[MAX_ENV_STR]; + char connectorstr[MAX_ENV_STR]; char init_card[MAX_PATH_STR]; char *argv[] = { init_card, @@ -349,6 +315,7 @@ int run_initialize_registers(xpd_t *xpd) subunitstr, typestr, revstr, + connectorstr, NULL }; @@ -364,6 +331,7 @@ int run_initialize_registers(xpd_t *xpd) snprintf(subunitstr, MAX_ENV_STR, "XPD_SUBUNIT=%d", xpd->addr.subunit); snprintf(typestr, MAX_ENV_STR, "XPD_TYPE=%d", xpd->type); snprintf(revstr, MAX_ENV_STR, "XPD_REVISION=%d", xpd->revision); + snprintf(connectorstr, MAX_ENV_STR, "XBUS_CONNECTOR=%s", xbus->busdesc); if(snprintf(init_card, MAX_PATH_STR, "%s/init_card_%d_%d", initdir, xpd->type, xpd->revision) > MAX_PATH_STR) { NOTICE("%s/%s: Cannot initialize. pathname is longer than %d characters.\n", -- cgit v1.2.3