From 4ae735549ead84b2d0fc83dddf17e8e33ee13e36 Mon Sep 17 00:00:00 2001 From: Oliver Neukum Date: Tue, 13 Nov 2012 08:23:38 +0100 Subject: [PATCH] usbnet: BQL support THis implements support for BQL for drivers that don't do frame aggregation. The limit is necessary as there is no common infrastructure for accurate statistics. Signed-off-by: Oliver Neukum --- drivers/net/usb/usbnet.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 5bf7717..cd916a2 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -776,6 +776,8 @@ int usbnet_open (struct net_device *net) } set_bit(EVENT_DEV_OPEN, &dev->flags); + if (!(dev->driver_info->flags & FLAG_MULTI_PACKET)) + netdev_reset_queue(net); netif_start_queue (net); netif_info(dev, ifup, dev->net, "open: enable queueing (rx %d, tx %d) mtu %d %s framing\n", @@ -1025,11 +1027,15 @@ static void tx_complete (struct urb *urb) struct usbnet *dev = entry->dev; if (urb->status == 0) { - if (!(dev->driver_info->flags & FLAG_MULTI_PACKET)) + if (!(dev->driver_info->flags & FLAG_MULTI_PACKET)) { dev->net->stats.tx_packets++; + netdev_completed_queue(dev->net, 1, skb->len); + } dev->net->stats.tx_bytes += entry->length; } else { dev->net->stats.tx_errors++; + if (!(dev->driver_info->flags & FLAG_MULTI_PACKET)) + netdev_completed_queue(dev->net, 1, skb->len); switch (urb->status) { case -EPIPE: @@ -1178,6 +1184,8 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb, case 0: net->trans_start = jiffies; __usbnet_queue_skb(&dev->txq, skb, tx_start); + if (!(info->flags & FLAG_MULTI_PACKET)) + netdev_sent_queue(net, skb->len); if (dev->txq.qlen >= TX_QLEN (dev)) netif_stop_queue (net); } -- 1.7.7