diff options
author | Michael Hsu <mhsu@nvidia.com> | 2012-01-11 19:09:10 -0800 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2012-01-30 12:31:32 -0800 |
commit | a8d72677486e22a4405d51ba28f3f87210d64eeb (patch) | |
tree | 8d3bffc79309cb61a83486245d49c3be36ca7b4e /drivers/net | |
parent | fdc702e90e374d4f054ee082476de43b00600b04 (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.c | 25 |
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); } |