summaryrefslogtreecommitdiff
path: root/xpp/card_global.c
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/card_global.c')
-rw-r--r--xpp/card_global.c115
1 files changed, 63 insertions, 52 deletions
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;
}