From 63222a138f730af14565fa60e8a0b6c1bced30e6 Mon Sep 17 00:00:00 2001 From: tzafrir Date: Thu, 16 Aug 2007 20:08:58 +0000 Subject: xpp rev. 4515: * BRI improvement: an 'nt_keepalive' parameter to xpd_bri forces a BRI_NT to retry a connection indefinitely (this is our default). When false it revert to the behaviour in changeset:4415 ("Bezeq like") * Improvement in DBG macros. The print_dbg parameter is now set of flags to debug. They are defined in zap_debug.h * Don't use Astribanks connected to USB1 interfaces Unless the user set the option usb1=1 for xpp_usb (r4504). * And some more documentation... * Include some of our variables in the default zaptel sample file. git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@2860 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- xpp/card_global.c | 115 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 63 insertions(+), 52 deletions(-) (limited to 'xpp/card_global.c') diff --git a/xpp/card_global.c b/xpp/card_global.c index 24d716d..3aece9c 100644 --- a/xpp/card_global.c +++ b/xpp/card_global.c @@ -50,11 +50,11 @@ static void global_packet_dump(const char *msg, xpacket_t *pack); xpacket_t *pack; if(!xbus) { - DBG("NO XBUS\n"); + DBG(GENERAL, "NO XBUS\n"); return -EINVAL; } XFRAME_NEW(xframe, pack, xbus, GLOBAL, DESC_REQ, xpd_num); - DBG("%s to %1d%1d\n", xbus->busname, XBUS_UNIT(xpd_num), XBUS_SUBUNIT(xpd_num)); + XBUS_DBG(GENERAL, xbus, "to %1d%1d\n", XBUS_UNIT(xpd_num), XBUS_SUBUNIT(xpd_num)); ret = send_cmd_frame(xbus, xframe); XBUS_COUNTER(xbus, DESC_REQ)++; return ret; @@ -69,7 +69,7 @@ static void global_packet_dump(const char *msg, xpacket_t *pack); xpacket_t *pack; BUG_ON(!xbus); - DBG("%s: mode=0x%X drift=%d\n", xbus->busname, mode, drift); + XBUS_DBG(SYNC, xbus, "mode=0x%X drift=%d\n", mode, drift); 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; @@ -83,7 +83,7 @@ static void global_packet_dump(const char *msg, xpacket_t *pack); xpacket_t *pack; BUG_ON(!xbus); - DBG("%s\n", xbus->busname); + XBUS_DBG(SYNC, xbus, "\n"); XFRAME_NEW(xframe, pack, xbus, GLOBAL, RESET_SYNC_COUNTERS, 0); RPACKET_FIELD(pack, GLOBAL, RESET_SYNC_COUNTERS, mask) = 0x10; send_cmd_frame(xbus, xframe); @@ -94,33 +94,35 @@ static void global_packet_dump(const char *msg, xpacket_t *pack); HANDLER_DEF(GLOBAL, NULL_REPLY) { - DBG("got len=%d\n", pack->datalen); + XBUS_DBG(GENERAL, xbus, "got len=%d\n", pack->datalen); return 0; } HANDLER_DEF(GLOBAL, DEV_DESC) { - byte rev = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, rev); - byte type = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, type); - xpp_line_t line_status = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, line_status); - xpd_addr_t xpd_addr = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, addr); struct card_desc_struct *card_desc; BUG_ON(!xbus); if((card_desc = kmalloc(sizeof(struct card_desc_struct), GFP_ATOMIC)) == NULL) { - ERR("%s: Card description allocation failed.\n", __FUNCTION__); + XBUS_ERR(xbus, "Card description allocation failed.\n"); return -ENOMEM; } memset(card_desc, 0, sizeof(struct card_desc_struct)); card_desc->magic = CARD_DESC_MAGIC; INIT_LIST_HEAD(&card_desc->card_list); card_desc->xbus = xbus; - card_desc->type = type; - 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", - xbus->busname, xpd_addr.unit, xpd_addr.subunit, type, rev, line_status); + card_desc->type = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, type); + card_desc->subtype = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, subtype); + card_desc->rev = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, rev); + card_desc->xpd_addr = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, addr); + card_desc->line_status = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, line_status); + XBUS_DBG(GENERAL, xbus, "XPD=%d%d type=%d.%d rev=%d line_status=0x%04X\n", + card_desc->xpd_addr.unit, + card_desc->xpd_addr.subunit, + card_desc->type, + card_desc->subtype, + card_desc->rev, + card_desc->line_status); xbus_poller_notify(xbus, card_desc); return 0; } @@ -133,24 +135,39 @@ HANDLER_DEF(GLOBAL, PCM_READ) unsigned long usec_diff; BUG_ON(!xbus); - do_gettimeofday(&now); - sec_diff = now.tv_sec - xbus->last_rx_sync.tv_sec; - usec_diff = sec_diff * 1000000 + (now.tv_usec - xbus->last_rx_sync.tv_usec); - if(unlikely(abs(sec_diff) > 2)) { - DBG("%s: PCM RX timing restart (sec_diff=%ld)\n", - xbus->busname, sec_diff); - } else { - if(abs(usec_diff - 1000) > TICK_TOLERANCE) { - if(print_dbg && printk_ratelimit()) - DBG("%s: Bad PCM RX timing: usec_diff=%ld.\n", - xbus->busname, usec_diff); + /* + * FIXME: + * Only calculate PCM statistics for unit==0, otherwise the data + * of the PCM packets in the same xframe would clobber each other. + * + * This is just a workaround, since the true solution is to handle + * each PCM frame separately (once the firmware guarantee that PCM + * frames contain only PCM packets). + * + * On PRI we must fix this since the PCM is transmitted in two frames + * and the following workaround only accounts for the first one. + */ + if(addr.unit == 0) { + do_gettimeofday(&now); + sec_diff = now.tv_sec - xbus->last_rx_sync.tv_sec; + usec_diff = sec_diff * 1000000 + (now.tv_usec - xbus->last_rx_sync.tv_usec); + if(unlikely(abs(sec_diff) > 2)) { + XBUS_DBG(SYNC, xbus, "PCM RX timing restart (sec_diff=%ld)\n", sec_diff); + } else { + if(abs(usec_diff - 1000) > TICK_TOLERANCE) { + static int rate_limit; + + if((rate_limit++ % 5003) == 0) + XBUS_DBG(SYNC, xbus, "Bad PCM RX timing(%d): usec_diff=%ld.\n", + rate_limit, usec_diff); + } + if(usec_diff > xbus->max_rx_sync) + xbus->max_rx_sync = usec_diff; + if(usec_diff < xbus->min_rx_sync) + xbus->min_rx_sync = usec_diff; } - if(usec_diff > xbus->max_rx_sync) - xbus->max_rx_sync = usec_diff; - if(usec_diff < xbus->min_rx_sync) - xbus->min_rx_sync = usec_diff; + xbus->last_rx_sync = now; } - xbus->last_rx_sync = now; if(!xpd) { #if 0 notify_bad_xpd(__FUNCTION__, xbus, pack->addr, cmd->name); @@ -182,8 +199,7 @@ HANDLER_DEF(GLOBAL, SYNC_REPLY) 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); + XPD_DBG(GENERAL, xpd, "mode=0x%X drift=%d\n", mode, drift); dump_packet("SYNC_REPLY", pack, print_dbg); xbus->sync_adjustment = (signed char)drift; return 0; @@ -246,14 +262,14 @@ static bool global_packet_is_valid(xpacket_t *pack) { const xproto_entry_t *xe; - //DBG("\n"); + //DBG(GENERAL, "\n"); xe = xproto_global_entry(pack->opcode); return xe != NULL; } static void global_packet_dump(const char *msg, xpacket_t *pack) { - DBG("%s\n", msg); + DBG(GENERAL, "%s\n", msg); } static bool pcm_valid(xpd_t *xpd, xpacket_t *pack) @@ -279,8 +295,7 @@ static bool pcm_valid(xpd_t *xpd, xpacket_t *pack) XPD_COUNTER(xpd, RECV_ERRORS)++; if((rate_limit++ % 1000) <= 10) { - ERR("%s/%s: BAD PCM REPLY: pack->datalen=%d (should be %d), count=%d\n", - xpd->xbus->busname, xpd->xpdname, + XPD_ERR(xpd, "BAD PCM REPLY: pack->datalen=%d (should be %d), count=%d\n", pack->datalen, good_len, count); dump_packet("BAD PCM REPLY", pack, 1); } @@ -289,7 +304,7 @@ static bool pcm_valid(xpd_t *xpd, xpacket_t *pack) return 1; } -#define MAX_ENV_STR 20 +#define MAX_ENV_STR 40 #define MAX_PATH_STR 60 int run_initialize_registers(xpd_t *xpd) @@ -322,7 +337,7 @@ int run_initialize_registers(xpd_t *xpd) BUG_ON(!xpd); xbus = xpd->xbus; if(!initdir || !initdir[0]) { - NOTICE("%s/%s: Missing initdir parameter\n", xbus->busname, xpd->xpdname); + XPD_NOTICE(xpd, "Missing initdir parameter\n"); return -EINVAL; } snprintf(busstr, MAX_ENV_STR, "XPD_BUS=%s", xbus->busname); @@ -334,35 +349,31 @@ int run_initialize_registers(xpd_t *xpd) 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", - xbus->busname, xpd->xpdname, MAX_PATH_STR); + XPD_NOTICE(xpd, "Cannot initialize. pathname is longer than %d characters.\n", MAX_PATH_STR); return -E2BIG; } if(!down_read_trylock(&xbus->in_use)) { - ERR("Skipped register initialization. %s is going down\n", xbus->busname); + XBUS_ERR(xbus, "Skipped register initialization. XBUS is going down\n"); return -ENODEV; } - DBG("%s/%s: running '%s' for type=%d revision=%d\n", - xbus->busname, xpd->xpdname, init_card, xpd->type, xpd->revision); + XPD_DBG(GENERAL, xpd, "running '%s' for type=%d revision=%d\n", + init_card, xpd->type, xpd->revision); ret = call_usermodehelper(init_card, argv, envp, 1); /* * Carefully report results */ if(ret == 0) - DBG("%s/%s: '%s' finished OK\n", xbus->busname, xpd->xpdname, init_card); + XPD_DBG(GENERAL, xpd, "'%s' finished OK\n", init_card); else if(ret < 0) { - ERR("%s/%s: Failed running '%s' (errno %d)\n", - xbus->busname, xpd->xpdname, init_card, ret); + XPD_ERR(xpd, "Failed running '%s' (errno %d)\n", init_card, ret); } else { byte exitval = ((unsigned)ret >> 8) & 0xFF; byte sigval = ret & 0xFF; if(!exitval) { - ERR("%s/%s: '%s' killed by signal %d\n", - xbus->busname, xpd->xpdname, init_card, sigval); + XPD_ERR(xpd, "'%s' killed by signal %d\n", init_card, sigval); } else { - ERR("%s/%s: '%s' aborted with exitval %d\n", - xbus->busname, xpd->xpdname, init_card, exitval); + XPD_ERR(xpd, "'%s' aborted with exitval %d\n", init_card, exitval); } ret = -EINVAL; } -- cgit v1.2.3