From 3af7a8b44f265a482c8297b420085cfb53725136 Mon Sep 17 00:00:00 2001 From: Bhushan Shah Date: Wed, 14 Apr 2021 10:29:57 +0530 Subject: [PATCH 4/5] cdc-wdm: provide wrapper for reset_resume --- drivers/usb/class/cdc-wdm.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 508b1c3f8b731..2b9355ed4a2ad 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -1119,6 +1119,39 @@ static int wdm_resume(struct usb_interface *intf) return rv; } + +static int wdm_reset_resume(struct usb_interface *intf) +{ + struct wdm_device *desc = wdm_find_device(intf); + int rv; + + dev_dbg(&desc->intf->dev, "wdm%d_reset_resume\n", intf->minor); + + spin_lock_irq(&desc->iuspin); + set_bit(WDM_RESETTING, &desc->flags); + set_bit(WDM_READ, &desc->flags); + clear_bit(WDM_IN_USE, &desc->flags); + + desc->rerr = -EINTR; + + spin_unlock_irq(&desc->iuspin); + wake_up_all(&desc->wait); + mutex_lock(&desc->rlock); + mutex_lock(&desc->wlock); + poison_urbs(desc); + cancel_work_sync(&desc->rxwork); + cancel_work_sync(&desc->service_outs_intr); + + clear_bit(WDM_SUSPENDING, &desc->flags); + clear_bit(WDM_OVERFLOW, &desc->flags); + clear_bit(WDM_RESETTING, &desc->flags); + + rv = recover_from_urb_loss(desc); + mutex_unlock(&desc->wlock); + mutex_unlock(&desc->rlock); + + return rv; +} #endif static int wdm_pre_reset(struct usb_interface *intf) @@ -1166,7 +1199,7 @@ static struct usb_driver wdm_driver = { #ifdef CONFIG_PM .suspend = wdm_suspend, .resume = wdm_resume, - .reset_resume = wdm_resume, + .reset_resume = wdm_reset_resume, #endif .pre_reset = wdm_pre_reset, .post_reset = wdm_post_reset, -- 2.31.1