summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorpyu <pyu@nvidia.com>2011-09-16 16:32:58 +0800
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:49:54 -0800
commit60ea8d30a03457de4a1ecca5483eed3c35256182 (patch)
tree979784b97e1c5391952594726169e45488e4091e /drivers/net
parent0e26b85e30d84b65ea5893e74deecb2d76f19391 (diff)
arm: tegra: comms: Fix RAW-IP rx after resume.
Cancel pending rx urbs during suspend, and resubmit rx urbs after resume. BUG 853232 Reviewed-on: http://git-master/r/52855 (cherry picked from commit 6af7fd6d2d43455f2ca54dcacd2f46197410c578) Change-Id: I33d4cb5180e2e9590a8f58103c83e0d5d5f182fc Reviewed-on: http://git-master/r/62735 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com> Rebase-Id: R1ad5e21ee2513aa977d96d7e3ae89d80c69fbb28
Diffstat (limited to 'drivers/net')
-rwxr-xr-x[-rw-r--r--]drivers/net/usb/raw_ip_net.c62
1 files changed, 58 insertions, 4 deletions
diff --git a/drivers/net/usb/raw_ip_net.c b/drivers/net/usb/raw_ip_net.c
index abb060b9762f..08785e020076 100644..100755
--- a/drivers/net/usb/raw_ip_net.c
+++ b/drivers/net/usb/raw_ip_net.c
@@ -89,6 +89,10 @@ static struct net_device *usb_net_raw_ip_dev[MAX_INTFS] = { 0, 0, 0};
static unsigned int g_usb_interface_index[MAX_INTFS];
static struct usb_interface *g_usb_interface[MAX_INTFS];
+static int usb_net_raw_ip_rx_urb_submit(struct baseband_usb *usb);
+static void usb_net_raw_ip_rx_urb_comp(struct urb *urb);
+static void usb_net_raw_ip_tx_urb_comp(struct urb *urb);
+
static int baseband_usb_driver_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
@@ -134,12 +138,58 @@ static void baseband_usb_driver_disconnect(struct usb_interface *intf)
static int baseband_usb_driver_suspend(struct usb_interface *intf,
pm_message_t message)
{
+ 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;
+ }
+ if (!baseband_usb_net[i]->usb.rx_urb) {
+ pr_debug("rx_usb already killed\n");
+ continue;
+ }
+ /* kill usb rx */
+ usb_kill_urb(baseband_usb_net[i]->usb.rx_urb);
+ baseband_usb_net[i]->usb.rx_urb = (struct urb *) 0;
+ }
+
return 0;
}
+
static int baseband_usb_driver_resume(struct usb_interface *intf)
{
+ int i, err;
+
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;
+ }
+ if (baseband_usb_net[i]->usb.rx_urb) {
+ pr_debug("rx_usb already exists\n");
+ continue;
+ }
+ /* start usb rx */
+ err = usb_net_raw_ip_rx_urb_submit(baseband_usb_net[i]);
+ if (err < 0) {
+ pr_err("submit rx failed - err %d\n", err);
+ continue;
+ }
+ }
+
return 0;
}
static int baseband_usb_driver_reset_resume(struct usb_interface *intf)
@@ -318,10 +368,6 @@ void baseband_usb_close(struct baseband_usb *usb)
pr_debug("baseband_usb_close }\n");
}
-static int usb_net_raw_ip_rx_urb_submit(struct baseband_usb *usb);
-static void usb_net_raw_ip_rx_urb_comp(struct urb *urb);
-static void usb_net_raw_ip_tx_urb_comp(struct urb *urb);
-
static int baseband_usb_netdev_init(struct net_device *dev)
{
pr_debug("baseband_usb_netdev_init\n");
@@ -448,6 +494,7 @@ static int usb_net_raw_ip_rx_urb_submit(struct baseband_usb *usb)
urb->transfer_flags = 0;
/* submit rx urb */
+ usb_mark_last_busy(usb->usb.device);
usb->usb.rx_urb = urb;
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err < 0) {
@@ -488,6 +535,13 @@ static void usb_net_raw_ip_rx_urb_comp(struct urb *urb)
pr_err("no urb\n");
return;
}
+ if (urb->status == -ENOENT) {
+ pr_info("rx urb killed\n");
+ return;
+ }
+ if (urb->status) {
+ pr_info("rx urb status %d\n", urb->status);
+ }
/* put rx urb data in rx buffer */
if (urb->actual_length) {