Revert "USB: gadget: u_ether: Fix data stall issue in RNDIS tethering mode"
authorAmit Pundir <amit.pundir@linaro.org>
Mon, 24 Apr 2017 10:20:31 +0000 (15:50 +0530)
committerAmit Pundir <amit.pundir@linaro.org>
Mon, 1 May 2017 09:54:07 +0000 (15:24 +0530)
This reverts commit 78281f6ed79413e5a16eac6edc4a72c6836ae5a9.

This data stall fix is no longer required in AOSP. It is already
skipped in android-4.9 patchset. Also core change from this
data stall fix is already undone by android-4.4 merge commit
324e88de4aba ("Merge tag 'v4.4.32' into android-4.4.y").

This revert patch just clean up the left overs. It also reverts the
compile fix from Change-Id: I38c4f4a850b0329fb4a06b2c7e45558e16d66151
40ceb2c69964 ("usb: gadget: Fix compilation problem with tx_qlen field").

Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
drivers/usb/gadget/function/u_ether.c

index e4920e5e1d647ff92c5118545309f1eb99396c36..21bf0a8423d5b3f92ef02cee7b0a842650e8bd3a 100644 (file)
@@ -66,7 +66,7 @@ struct eth_dev {
 
        spinlock_t              req_lock;       /* guard {rx,tx}_reqs */
        struct list_head        tx_reqs, rx_reqs;
-       unsigned                tx_qlen;
+       atomic_t                tx_qlen;
 /* Minimum number of TX USB request queued to UDC */
 #define TX_REQ_THRESHOLD       5
        int                     no_tx_req_used;
@@ -568,6 +568,7 @@ static void tx_complete(struct usb_ep *ep, struct usb_request *req)
                dev_kfree_skb_any(skb);
        }
 
+       atomic_dec(&dev->tx_qlen);
        if (netif_carrier_ok(dev->net))
                netif_wake_queue(dev->net);
 }
@@ -741,20 +742,13 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb,
 
        req->length = length;
 
-       /* throttle highspeed IRQ rate back slightly */
-       if (gadget_is_dualspeed(dev->gadget) &&
-                        (dev->gadget->speed == USB_SPEED_HIGH) &&
-                        !list_empty(&dev->tx_reqs)) {
-               dev->tx_qlen++;
-               if (dev->tx_qlen == (dev->qmult/2)) {
-                       req->no_interrupt = 0;
-                       dev->tx_qlen = 0;
-               } else {
-                       req->no_interrupt = 1;
-               }
-       } else {
-               req->no_interrupt = 0;
-       }
+       /* throttle high/super speed IRQ rate back slightly */
+       if (gadget_is_dualspeed(dev->gadget))
+               req->no_interrupt = (((dev->gadget->speed == USB_SPEED_HIGH ||
+                                      dev->gadget->speed == USB_SPEED_SUPER)) &&
+                                       !list_empty(&dev->tx_reqs))
+                       ? ((atomic_read(&dev->tx_qlen) % dev->qmult) != 0)
+                       : 0;
 
        retval = usb_ep_queue(in, req, GFP_ATOMIC);
        switch (retval) {
@@ -763,6 +757,7 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb,
                break;
        case 0:
                net->trans_start = jiffies;
+               atomic_inc(&dev->tx_qlen);
        }
 
        if (retval) {
@@ -791,7 +786,7 @@ static void eth_start(struct eth_dev *dev, gfp_t gfp_flags)
        rx_fill(dev, gfp_flags);
 
        /* and open the tx floodgates */
-       dev->tx_qlen = 0;
+       atomic_set(&dev->tx_qlen, 0);
        netif_wake_queue(dev->net);
 }