summaryrefslogtreecommitdiff
path: root/xpp/xbus-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/xbus-core.c')
-rw-r--r--xpp/xbus-core.c74
1 files changed, 30 insertions, 44 deletions
diff --git a/xpp/xbus-core.c b/xpp/xbus-core.c
index 790c12a..385f542 100644
--- a/xpp/xbus-core.c
+++ b/xpp/xbus-core.c
@@ -389,7 +389,7 @@ static void do_hexdump(const char msg[], byte *data, uint16_t len)
DBG(ANY, "%s: %3d> %02X\n", msg, i, data[i]);
}
-void dump_xframe(const char msg[], const xbus_t *xbus, const xframe_t *xframe)
+void dump_xframe(const char msg[], const xbus_t *xbus, const xframe_t *xframe, int print_dbg)
{
const uint16_t frm_len = XFRAME_LEN(xframe);
xpacket_t *pack;
@@ -441,7 +441,9 @@ void dump_xframe(const char msg[], const xbus_t *xbus, const xframe_t *xframe)
break;
}
do_print = 0;
- if(XPACKET_OP(pack) != XPROTO_NAME(GLOBAL,PCM_READ) &&
+ if(print_dbg == DBG_ANY)
+ do_print = 1;
+ else if(XPACKET_OP(pack) != XPROTO_NAME(GLOBAL,PCM_READ) &&
XPACKET_OP(pack) != XPROTO_NAME(GLOBAL,PCM_WRITE))
do_print = 1;
else if(print_dbg & DBG_PCM) {
@@ -590,7 +592,6 @@ static int xbus_command_queue_waitempty(xbus_t *xbus)
int send_cmd_frame(xbus_t *xbus, xframe_t *xframe)
{
static int rate_limit;
- const char *msg = "";
int ret = 0;
@@ -600,22 +601,23 @@ int send_cmd_frame(xbus_t *xbus, xframe_t *xframe)
goto err;
}
if(!XBUS_GET(xbus)) {
- msg = "Dropped command xframe. Is shutting down.";
+ /* shutting down */
ret = -ENODEV;
goto err;
}
if(!xframe_enqueue(&xbus->command_queue, xframe)) {
+ if((rate_limit++ % 1003) == 0) {
+ XBUS_ERR(xbus,
+ "Dropped command xframe. Cannot enqueue (%d)\n",
+ rate_limit);
+ dump_xframe("send_cmd_frame", xbus, xframe, DBG_ANY);
+ }
XBUS_PUT(xbus);
- msg = "Dropped command xframe. Cannot enqueue.";
ret = -E2BIG;
goto err;
}
return 0;
err:
- if((rate_limit++ % 1003) == 0) {
- XBUS_ERR(xbus, "%s\n", msg);
- dump_xframe("send_cmd_frame", xbus, xframe);
- }
FREE_SEND_XFRAME(xbus, xframe);
return ret;
}
@@ -787,7 +789,7 @@ static void xbus_poll(void *data)
poller->is_polling = 1;
if(!XBUS_GET(xbus)) {
XBUS_ERR(xbus, "Aborting poll. Is shutting down.\n");
- goto out;
+ goto out; /* FIXME: should not XBUS_PUT() in that case */
}
/*
* Send out the polls
@@ -1073,7 +1075,7 @@ int xbus_activate(xbus_t *xbus)
BUG_ON(!ops->xframe_send_cmd);
BUG_ON(!ops->alloc_xframe);
BUG_ON(!ops->free_xframe);
- xpp_timing_init(&xbus->timing, xbus->busname);
+ xpp_drift_init(xbus);
/*
* We start with timer based ticking
*/
@@ -1096,7 +1098,7 @@ void xbus_disconnect(xbus_t *xbus)
BUG_ON(!xbus);
XBUS_INFO(xbus, "[%s] Disconnecting\n", xbus->label);
xbus_set_command_timer(xbus, 1);
- xbus_request_sync(xbus, SYNC_MODE_PLL); /* no more ticks */
+ xbus_request_sync(xbus, SYNC_MODE_NONE); /* no more ticks */
for(i = 0; i < MAX_XPDS; i++) {
xpd_t *xpd = xpd_of(xbus, i);
if(!xpd)
@@ -1115,8 +1117,7 @@ void xbus_disconnect(xbus_t *xbus)
del_timer_sync(&xbus->command_timer);
xframe_queue_clear(&xbus->send_pool);
xframe_queue_clear(&xbus->receive_pool);
- xframe_queue_clear(&xbus->pcm_tospan[0]);
- xframe_queue_clear(&xbus->pcm_tospan[1]);
+ xframe_queue_clear(&xbus->pcm_tospan);
transportops_put(xbus);
transport_destroy(xbus);
elect_syncer("disconnect");
@@ -1250,8 +1251,10 @@ xbus_t *xbus_new(struct xbus_ops *ops, ushort max_send_size, void *priv)
err = -EIO;
goto nobus;
}
- xbus->proc_xbus_summary = create_proc_read_entry(PROC_XBUS_SUMMARY, 0444, xbus->proc_xbus_dir,
- xbus_read_proc, (void *)(xbus->num));
+ xbus->proc_xbus_summary = create_proc_read_entry(PROC_XBUS_SUMMARY,
+ 0444, xbus->proc_xbus_dir,
+ xbus_read_proc,
+ (void *)((unsigned long)(xbus->num)));
if (!xbus->proc_xbus_summary) {
XBUS_ERR(xbus, "Failed to create proc file '%s'\n", PROC_XBUS_SUMMARY);
err = -EIO;
@@ -1286,8 +1289,7 @@ xbus_t *xbus_new(struct xbus_ops *ops, ushort max_send_size, void *priv)
xframe_queue_init(&xbus->receive_queue, 10, 50, "receive_queue", xbus);
xframe_queue_init(&xbus->send_pool, 10, 200, "send_pool", xbus);
xframe_queue_init(&xbus->receive_pool, 10, 50, "receive_pool", xbus);
- xframe_queue_init(&xbus->pcm_tospan[0], 5, 10, "pcm_tospan[0]", xbus);
- xframe_queue_init(&xbus->pcm_tospan[1], 5, 10, "pcm_tospan[1]", xbus);
+ xframe_queue_init(&xbus->pcm_tospan, 5, 10, "pcm_tospan", xbus);
tasklet_init(&xbus->receive_tasklet, receive_tasklet_func, (unsigned long)xbus);
/*
* Create poller after /proc/XBUS-?? so the directory exists
@@ -1368,20 +1370,17 @@ static int xbus_read_proc(char *page, char **start, off_t off, int count, int *e
struct xbus_poller *poller;
unsigned long flags;
int len = 0;
- int i = (int)data;
- struct timeval now;
-
+ int i = (int)((unsigned long)data);
xbus = get_xbus(i);
if(!xbus)
goto out;
spin_lock_irqsave(&xbus->lock, flags);
- do_gettimeofday(&now);
poller = xbus->poller;
len += sprintf(page + len, "%s: CONNECTOR=%s LABEL=[%s] STATUS=%s\n",
xbus->busname,
- xbus->busdesc,
+ xbus->location,
xbus->label,
(TRANSPORT_RUNNING(xbus)) ? "connected" : "missing"
);
@@ -1397,8 +1396,7 @@ static int xbus_read_proc(char *page, char **start, off_t off, int count, int *e
len += xbus_fill_proc_queue(page + len, &xbus->receive_pool);
len += xbus_fill_proc_queue(page + len, &xbus->command_queue);
len += xbus_fill_proc_queue(page + len, &xbus->receive_queue);
- len += xbus_fill_proc_queue(page + len, &xbus->pcm_tospan[0]);
- len += xbus_fill_proc_queue(page + len, &xbus->pcm_tospan[1]);
+ len += xbus_fill_proc_queue(page + len, &xbus->pcm_tospan);
if(rx_tasklet) {
len += sprintf(page + len, "\ncpu_rcv_intr: ");
for_each_online_cpu(i)
@@ -1408,7 +1406,8 @@ static int xbus_read_proc(char *page, char **start, off_t off, int count, int *e
len += sprintf(page + len, "%5d ", xbus->cpu_rcv_tasklet[i]);
len += sprintf(page + len, "\n");
}
- len += sprintf(page + len, "self_ticking: %d\n", xbus->self_ticking);
+ len += sprintf(page + len, "self_ticking: %d (last_tick at %ld)\n",
+ xbus->self_ticking, xbus->ticker.last_sample.tv.tv_sec);
len += sprintf(page + len, "xbus: pcm_rx_counter = %d, frag = %d\n",
atomic_read(&xbus->pcm_rx_counter), xbus->xbus_frag_count);
len += sprintf(page + len, "max_rx_process = %2ld.%ld ms\n",
@@ -1419,14 +1418,6 @@ static int xbus_read_proc(char *page, char **start, off_t off, int count, int *e
MAX_SEND_SIZE(xbus),
atomic_read(&xbus->transport.transport_refcount)
);
- len += sprintf(page + len, "\nSYNC: [%d] %-14s: DRIFT=%d %3ld sec ago\n",
- xbus->sync_mode, sync_mode_name(xbus->sync_mode), xbus->sync_adjustment,
- (xbus->pll_updated_at == 0) ? 0 : now.tv_sec - xbus->pll_updated_at);
- len += sprintf(page + len,
- "tick timing: avg = %3d usec stddev = %4d usec (count=%ld)\n",
- xbus->timing.tick_avg, xbus->timing.tick_stddev, xbus->timing.timing_count);
- len += sprintf(page + len,
- "sync_offset_usec=%ld\n", xbus->sync_offset_usec);
len += sprintf(page + len, "PCM Metrices:\n");
len += sprintf(page + len, "\tPCM TX: min=%ld max=%ld\n",
xbus->min_tx_sync, xbus->max_tx_sync);
@@ -1438,11 +1429,6 @@ static int xbus_read_proc(char *page, char **start, off_t off, int count, int *e
xbus_counters[i].name, xbus->counters[i]);
}
len += sprintf(page + len, "<-- len=%d\n", len);
- /* reset statistics */
- xbus->min_tx_sync = INT_MAX;
- xbus->max_tx_sync = 0;
- xbus->min_rx_sync = INT_MAX;
- xbus->max_rx_sync = 0;
spin_unlock_irqrestore(&xbus->lock, flags);
put_xbus(xbus);
out:
@@ -1541,7 +1527,7 @@ static int proc_xbus_command_write(struct file *file, const char __user *buffer,
const size_t max_text = max_len * 3 + 10;
if(count > max_text) {
- XBUS_ERR(xbus, "%s: line too long (%ld > %d)\n", __FUNCTION__, count, max_len);
+ XBUS_ERR(xbus, "%s: line too long (%ld > %zd)\n", __FUNCTION__, count, max_len);
return -EFBIG;
}
/* 3 bytes per hex-digit and space */
@@ -1586,7 +1572,7 @@ static int proc_xbus_command_write(struct file *file, const char __user *buffer,
goto out;
}
*q++ = val;
- XBUS_DBG(GENERAL, xbus, "%3d> '%s' val=%d\n", q - pack_start, hexdigit, val);
+ XBUS_DBG(GENERAL, xbus, "%3zd> '%s' val=%d\n", q - pack_start, hexdigit, val);
}
len = q - pack_start;
xframe = ALLOC_SEND_XFRAME(xbus);
@@ -1598,7 +1584,7 @@ static int proc_xbus_command_write(struct file *file, const char __user *buffer,
len = max_len;
atomic_set(&xframe->frame_len, len);
memcpy(xframe->packets, pack_start, len); /* FIXME: checksum? */
- dump_xframe("COMMAND", xbus, xframe);
+ dump_xframe("COMMAND", xbus, xframe, print_dbg);
send_cmd_frame(xbus, xframe);
out:
kfree(buf);
@@ -1620,7 +1606,7 @@ static int read_proc_xbuses(char *page, char **start, off_t off, int count, int
if(xbus) {
len += sprintf(page + len, "%s: CONNECTOR=%s LABEL=[%s] STATUS=%s REFCOUNT=%d\n",
xbus->busname,
- xbus->busdesc,
+ xbus->location,
xbus->label,
(TRANSPORT_RUNNING(xbus)) ? "connected" : "missing",
refcount_xbus(i) - 1
@@ -1667,7 +1653,7 @@ void transport_destroy(xbus_t *xbus)
BUG_ON(!xbus);
xbus->transport.transport_running = 0;
- XBUS_INFO(xbus, "Waiting... (transport_refcount=%d)\n",
+ XBUS_DBG(DEVICES, xbus, "Waiting... (transport_refcount=%d)\n",
atomic_read(&xbus->transport.transport_refcount));
ret = wait_event_interruptible(xbus->transport.transport_unused,
atomic_read(&xbus->transport.transport_refcount) == 0);