diff options
Diffstat (limited to 'xpp/xbus-core.c')
-rw-r--r-- | xpp/xbus-core.c | 74 |
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); |