aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmit Pundir <amit.pundir@linaro.org>2017-04-24 15:50:31 +0530
committerAmit Pundir <amit.pundir@linaro.org>2017-05-01 15:24:07 +0530
commit758b6055e2c1ddf0557f84dd2eb07c6bb4c63752 (patch)
tree4888396c1d11a9727e38d8e115b853c67765e4e8
parentda83daedc80f9923f22ce9a87bea8e5d240d3e15 (diff)
Revert "USB: gadget: u_ether: Fix data stall issue in RNDIS tethering mode"
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>
-rw-r--r--drivers/usb/gadget/function/u_ether.c27
1 files changed, 11 insertions, 16 deletions
diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
index e4920e5e1d64..21bf0a8423d5 100644
--- a/drivers/usb/gadget/function/u_ether.c
+++ b/drivers/usb/gadget/function/u_ether.c
@@ -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);
}