diff options
author | hayeswang <hayeswang@realtek.com> | 2015-02-06 11:30:45 +0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-02-07 22:46:24 -0800 |
commit | e1a2ca92727500ea8d25326216d700bed6176117 (patch) | |
tree | 833f5aa698ed5e18a986d1d4e8de9d76ccc762a2 /drivers/net/usb | |
parent | d0a47d32724bf0765b8768086ef1a7a6d074a7a0 (diff) | |
download | linux-stable-e1a2ca92727500ea8d25326216d700bed6176117.tar.gz linux-stable-e1a2ca92727500ea8d25326216d700bed6176117.tar.bz2 linux-stable-e1a2ca92727500ea8d25326216d700bed6176117.zip |
r8152: adjust rx_bottom
If a error occurs when submitting rx, skip the remaining submissions
and try to submit them again next time.
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb')
-rw-r--r-- | drivers/net/usb/r8152.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index b74a272243ae..41a1cbc6cc7f 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -1643,7 +1643,7 @@ static int rx_bottom(struct r8152 *tp, int budget) { unsigned long flags; struct list_head *cursor, *next, rx_queue; - int work_done = 0; + int ret = 0, work_done = 0; if (!skb_queue_empty(&tp->rx_queue)) { while (work_done < budget) { @@ -1734,7 +1734,18 @@ find_next_rx: } submit: - r8152_submit_rx(tp, agg, GFP_ATOMIC); + if (!ret) { + ret = r8152_submit_rx(tp, agg, GFP_ATOMIC); + } else { + urb->actual_length = 0; + list_add_tail(&agg->list, next); + } + } + + if (!list_empty(&rx_queue)) { + spin_lock_irqsave(&tp->rx_lock, flags); + list_splice_tail(&rx_queue, &tp->rx_done); + spin_unlock_irqrestore(&tp->rx_lock, flags); } out1: |