usb: mdm_bridge: Add rx URBs back to idle rx list if submit_rx_urb() fails
mdm_data bridge driver maintains a list of idle rx URBs. Instead of
immediately freeing the URB upon failure in submit_rx_urb(), which
would decrease the number of available requests, put it back in the idle
rx list to allow for later attempts.
Change-Id: I14c42d25e224a40ebd733c94fe3579156d9e5ab8
Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
diff --git a/drivers/usb/misc/mdm_data_bridge.c b/drivers/usb/misc/mdm_data_bridge.c
index 90c32cb..c3d5bb0 100644
--- a/drivers/usb/misc/mdm_data_bridge.c
+++ b/drivers/usb/misc/mdm_data_bridge.c
@@ -166,8 +166,10 @@
spin_unlock_irqrestore(&dev->rx_done.lock, flags);
retval = submit_rx_urb(dev, rx_idle, GFP_KERNEL);
spin_lock_irqsave(&dev->rx_done.lock, flags);
- if (retval)
+ if (retval) {
+ list_add_tail(&rx_idle->urb_list, &dev->rx_idle);
break;
+ }
}
spin_unlock_irqrestore(&dev->rx_done.lock, flags);
}
@@ -229,10 +231,8 @@
int retval = -EINVAL;
skb = alloc_skb(RMNET_RX_BUFSIZE, flags);
- if (!skb) {
- usb_free_urb(rx_urb);
+ if (!skb)
return -ENOMEM;
- }
*((struct data_bridge **)skb->cb) = dev;
@@ -253,7 +253,7 @@
usb_unanchor_urb(rx_urb);
suspended:
dev_kfree_skb_any(skb);
- usb_free_urb(rx_urb);
+
return retval;
}