[svn-commits] tzafrir: trunk r1407 - /trunk/xpp/xpp_usb.c
svn-commits at lists.digium.com
svn-commits at lists.digium.com
Tue Sep 5 22:03:16 MST 2006
Author: tzafrir
Date: Wed Sep 6 00:03:15 2006
New Revision: 1407
URL: http://svn.digium.com/view/zaptel?rev=1407&view=rev
Log:
Better USB error handling: move "pending_writes" check earlier.
Modified:
trunk/xpp/xpp_usb.c
Modified: trunk/xpp/xpp_usb.c
URL: http://svn.digium.com/view/zaptel/trunk/xpp/xpp_usb.c?rev=1407&r1=1406&r2=1407&view=diff
==============================================================================
--- trunk/xpp/xpp_usb.c (original)
+++ trunk/xpp/xpp_usb.c Wed Sep 6 00:03:15 2006
@@ -292,7 +292,18 @@
if(!xusb->present) {
NOTICE("tried to send packets to non-exitant USB device. Ignored\n");
ret = -ENODEV;
- goto out;
+ goto freepack;
+ }
+ /*
+ * If something really bad happend, do not overflow the USB stack
+ */
+ if(atomic_read(&xusb->pending_writes) > MAX_PENDING_WRITES) {
+ static int rate_limit;
+
+ if((rate_limit++ % 1000) < 10)
+ ERR("%s: %s: more than %d pending writes. Dropping.\n", __FUNCTION__, xbus->busname, MAX_PENDING_WRITES);
+ ret = -ENODEV;
+ goto freepack;
}
size = PACKET_LEN(pack);
xusb_ep = &xusb->endpoints[XUSB_SEND];
@@ -300,7 +311,7 @@
if (!urb) {
ERR("No free urbs available\n");
ret = -ENOMEM;
- goto out;
+ goto freepack;
}
packet_debug("USB_PACKET_SEND", xusb, pack);
@@ -315,22 +326,15 @@
ERR("%s: failed submit_urb: %d\n", __FUNCTION__, ret);
xpp_urb_delete(urb);
ret = -EBADF;
- goto out;
+ goto freepack;
}
atomic_inc(&xusb->pending_writes);
- if(atomic_read(&xusb->pending_writes) > MAX_PENDING_WRITES) {
- static int rate_limit;
-
- if((rate_limit++ % 1000) < 10)
- ERR("%s: %s: more than %d pending writes. Dropping.\n", __FUNCTION__, xbus->busname, MAX_PENDING_WRITES);
- ret = -ENODEV;
- }
if(pack->content.opcode == XPROTO_NAME(GLOBAL,PCM_WRITE))
XUSB_COUNTER(xusb, PCM_WRITES)++;
-out:
+freepack:
+ xbus->ops->packet_free(xbus, pack); // FIXME: eventually will be done in the urb callback
if(ret < 0)
XUSB_COUNTER(xusb, TX_ERRORS)++;
- xbus->ops->packet_free(xbus, pack); // FIXME: eventually will be done in the urb callback
return ret;
}
More information about the svn-commits
mailing list