diff options
Diffstat (limited to 'xpp/xpp_usb.c')
-rw-r--r-- | xpp/xpp_usb.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/xpp/xpp_usb.c b/xpp/xpp_usb.c index 30aa62b..3f0bfaa 100644 --- a/xpp/xpp_usb.c +++ b/xpp/xpp_usb.c @@ -48,7 +48,7 @@ static const char rcsid[] = "$Id$"; -DEF_PARM(int, print_dbg, 0, 0600, "Print DBG statements"); /* must be before zap_debug.h */ +DEF_PARM(int, print_dbg, 0, 0644, "Print DBG statements"); /* must be before zap_debug.h */ #include "zap_debug.h" @@ -137,6 +137,10 @@ typedef struct xpp_usb_bus { atomic_t pending_writes; /* submited but not out yet */ struct semaphore sem; /* locks this structure */ int counters[XUSB_COUNTER_MAX]; + + /* metrics */ + struct timeval last_tx; + unsigned int max_tx_delay; } xusb_t; static spinlock_t xusb_lock = SPIN_LOCK_UNLOCKED; @@ -256,7 +260,11 @@ static int xusb_xframe_send(xbus_t *xbus, xframe_t *xframe) xusb = xbus->priv; BUG_ON(!xusb); if(!xusb->present) { - NOTICE("tried to send packets to non-exitant USB device. Ignored\n"); + static int rate_limit; + + if((rate_limit++ % 5000) == 0) + ERR("%s: USB device not present. Dropping packets (#%d).\n", + xbus->busname, rate_limit); ret = -ENODEV; goto freepack; } @@ -267,8 +275,8 @@ static int xusb_xframe_send(xbus_t *xbus, xframe_t *xframe) static int rate_limit; if((rate_limit++ % 5000) == 0) - ERR("%s: %s: more than %d pending writes (%d). Dropping.\n", - __FUNCTION__, xbus->busname, MAX_PENDING_WRITES, rate_limit); + ERR("%s: USB device is totaly stuck. Dropping packets (#%d).\n", + xbus->busname, rate_limit); ret = -ENODEV; goto freepack; } @@ -297,6 +305,7 @@ static int xusb_xframe_send(xbus_t *xbus, xframe_t *xframe) ret = -EBADF; goto freepack; } + do_gettimeofday(&xusb->last_tx); atomic_inc(&xusb->pending_writes); freepack: xbus->ops->xframe_free(xbus, xframe); // FIXME: eventually will be done in the urb callback @@ -720,9 +729,24 @@ static void xpp_send_callback(USB_PASS_CB(urb)) { xusb_t *xusb = (xusb_t *)urb->context; xbus_t *xbus = xusb->xbus; + struct timeval now; + long usec_diff; BUG_ON(!xbus); atomic_dec(&xusb->pending_writes); + do_gettimeofday(&now); + usec_diff = + (now.tv_sec - xusb->last_tx.tv_sec)*1000*1000 + + (now.tv_usec - xusb->last_tx.tv_usec); + if(usec_diff > xusb->max_tx_delay) + xusb->max_tx_delay = usec_diff; + if(unlikely(usec_diff > 200)) { + static int rate_limit; + + if((rate_limit++ % 5003) == 0) + NOTICE("%s: Slagish USB. %ld usec to transmit a frame\n", + xbus->busname, usec_diff); + } /* sync/async unlink faults aren't errors */ if (urb->status && !(urb->status == -ENOENT || urb->status == -ECONNRESET)) { static int rate_limit; @@ -865,6 +889,8 @@ static int xusb_read_proc(char *page, char **start, off_t off, int count, int *e xusb->endpoints[XUSB_SEND].max_size ); len += sprintf(page + len, "\npending_writes=%d\n", atomic_read(&xusb->pending_writes)); + len += sprintf(page + len, "max_tx_delay=%d\n", xusb->max_tx_delay); + xusb->max_tx_delay = 0; #ifdef DEBUG_PCM_TIMING len += sprintf(page + len, "\nstamp_last_pcm_read=%lld accumulate_diff=%lld\n", stamp_last_pcm_read, accumulate_diff); #endif |