summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorMichael Hsu <mhsu@nvidia.com>2012-01-11 19:09:10 -0800
committerVarun Colbert <vcolbert@nvidia.com>2012-01-30 12:31:32 -0800
commita8d72677486e22a4405d51ba28f3f87210d64eeb (patch)
tree8d3bffc79309cb61a83486245d49c3be36ca7b4e /drivers/net
parentfdc702e90e374d4f054ee082476de43b00600b04 (diff)
net: usb: raw-ip: Avoid urb submit if usb interface disconnected.
Do not submit rx urb if usb interface is disconnected. BUG 922418 Reviewed-on: http://git-master/r/74880 Change-Id: I42fa715307275b9d1175ef624acef6c098732261 Signed-off-by: Michael Hsu <mhsu@nvidia.com> Signed-off-by: Varun Wadekar <vwadekar@nvidia.com> Reviewed-on: http://git-master/r/77746 Reviewed-by: Automatic_Commit_Validation_User
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/usb/raw_ip_net.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/net/usb/raw_ip_net.c b/drivers/net/usb/raw_ip_net.c
index d480a1ff2ff8..cd0013b0e50a 100644
--- a/drivers/net/usb/raw_ip_net.c
+++ b/drivers/net/usb/raw_ip_net.c
@@ -134,7 +134,24 @@ static int baseband_usb_driver_probe(struct usb_interface *intf,
static void baseband_usb_driver_disconnect(struct usb_interface *intf)
{
+ int i;
+
pr_debug("%s intf %p\n", __func__, intf);
+
+ for (i = 0; i < max_intfs; i++) {
+ pr_debug("[%d]\n", i);
+ if (!baseband_usb_net[i])
+ continue;
+ if (baseband_usb_net[i]->usb.interface != intf) {
+ pr_debug("%p != %p\n",
+ baseband_usb_net[i]->usb.interface, intf);
+ continue;
+ }
+ /* mark interface as disconnected */
+ baseband_usb_net[i]->usb.interface
+ = (struct usb_interface *) 0;
+ }
+
}
#ifdef CONFIG_PM
@@ -493,6 +510,10 @@ static int usb_net_raw_ip_rx_urb_submit(struct baseband_usb *usb)
pr_err("previous urb still active\n");
return -1;
}
+ if (!usb->usb.interface) {
+ pr_err("usb interface disconnected - not submitting rx urb\n");
+ return -1;
+ }
/* allocate rx urb */
urb = usb_alloc_urb(0, GFP_ATOMIC);
@@ -558,6 +579,10 @@ static void usb_net_raw_ip_rx_urb_comp(struct urb *urb)
pr_info("rx urb killed\n");
return;
}
+ if (urb->status == -EPROTO) {
+ pr_info("rx urb %p -EPROTO \n", urb);
+ return;
+ }
if (urb->status) {
pr_info("rx urb status %d\n", urb->status);
}