diff options
Diffstat (limited to 'drivers/net/usb/r8152.c')
| -rw-r--r-- | drivers/net/usb/r8152.c | 17 | 
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index e3d84c322e4e..c6554c7a8147 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -1162,6 +1162,9 @@ static void intr_callback(struct urb *urb)  	case -ESHUTDOWN:  		netif_device_detach(tp->netdev);  	case -ENOENT: +	case -EPROTO: +		netif_info(tp, intr, tp->netdev, +			   "Stop submitting intr, status %d\n", status);  		return;  	case -EOVERFLOW:  		netif_info(tp, intr, tp->netdev, "intr status -EOVERFLOW\n"); @@ -2891,6 +2894,9 @@ static int rtl8152_open(struct net_device *netdev)  	if (res)  		goto out; +	/* set speed to 0 to avoid autoresume try to submit rx */ +	tp->speed = 0; +  	res = usb_autopm_get_interface(tp->intf);  	if (res < 0) {  		free_all_mem(tp); @@ -2904,6 +2910,8 @@ static int rtl8152_open(struct net_device *netdev)  		clear_bit(WORK_ENABLE, &tp->flags);  		usb_kill_urb(tp->intr_urb);  		cancel_delayed_work_sync(&tp->schedule); + +		/* disable the tx/rx, if the workqueue has enabled them. */  		if (tp->speed & LINK_STATUS)  			tp->rtl_ops.disable(tp);  	} @@ -2955,10 +2963,7 @@ static int rtl8152_close(struct net_device *netdev)  		 * be disable when autoresume occurs, because the  		 * netif_running() would be false.  		 */ -		if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) { -			rtl_runtime_suspend_enable(tp, false); -			clear_bit(SELECTIVE_SUSPEND, &tp->flags); -		} +		rtl_runtime_suspend_enable(tp, false);  		tasklet_disable(&tp->tl);  		tp->rtl_ops.down(tp); @@ -3205,7 +3210,7 @@ static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message)  		netif_device_detach(netdev);  	} -	if (netif_running(netdev)) { +	if (netif_running(netdev) && test_bit(WORK_ENABLE, &tp->flags)) {  		clear_bit(WORK_ENABLE, &tp->flags);  		usb_kill_urb(tp->intr_urb);  		tasklet_disable(&tp->tl); @@ -3253,6 +3258,8 @@ static int rtl8152_resume(struct usb_interface *intf)  			set_bit(WORK_ENABLE, &tp->flags);  		}  		usb_submit_urb(tp->intr_urb, GFP_KERNEL); +	} else if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) { +		clear_bit(SELECTIVE_SUSPEND, &tp->flags);  	}  	mutex_unlock(&tp->control);  | 
