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.c102
1 files changed, 35 insertions, 67 deletions
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",