Force a netdevice poll in net_tx() before attempting to transmit
authorMichael Brown <mcb30@etherboot.org>
Thu, 4 Oct 2007 13:46:56 +0000 (14:46 +0100)
committerMichael Brown <mcb30@etherboot.org>
Thu, 4 Oct 2007 13:57:33 +0000 (14:57 +0100)
packet, to work around the problem whereby small TX rings get backed
up because we haven't yet poll()ed for TX completions.

src/net/netdevice.c

index 59a5020..f2778e8 100644 (file)
@@ -424,6 +424,14 @@ struct net_device * find_netdev_by_location ( unsigned int bus_type,
  */
 int net_tx ( struct io_buffer *iobuf, struct net_device *netdev,
             struct net_protocol *net_protocol, const void *ll_dest ) {
+
+       /* Force a poll on the netdevice to (potentially) clear any
+        * backed-up TX completions.  This is needed on some network
+        * devices to avoid excessive losses due to small TX ring
+        * sizes.
+        */
+       netdev_poll ( netdev );
+
        return netdev->ll_protocol->tx ( iobuf, netdev, net_protocol, ll_dest );
 }