Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9e5282b3 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "usb: gadget: Fix mismatched function wake notification"

parents 7f219e2c 8bea9499
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2089,7 +2089,7 @@ static int dwc_gadget_func_wakeup(struct usb_gadget *g, int interface_id)
	if (dwc3_gadget_is_suspended(dwc)) {
		dev_dbg(dwc->dev, "USB bus is suspended, scheduling wakeup\n");
		dwc3_gadget_wakeup(&dwc->gadget);
		return -EAGAIN;
		return -EACCES;
	}

	ret = dwc3_send_gadget_generic_command(dwc, DWC3_DGCMD_XMIT_DEV,
+28 −15
Original line number Diff line number Diff line
@@ -482,11 +482,17 @@ int usb_func_wakeup(struct usb_function *func)

	spin_lock_irqsave(&func->config->cdev->lock, flags);
	ret = usb_func_wakeup_int(func);
	if (ret == -EAGAIN) {
	if (ret == -EACCES) {
		DBG(func->config->cdev,
			"Function wakeup for %s could not complete due to suspend state. Delayed until after bus resume.\n",
			func->name ? func->name : "");
		ret = 0;
		func->func_wakeup_pending = 1;
	} else if (ret == -EAGAIN) {
		DBG(func->config->cdev,
			"Function wakeup for %s sent.\n",
			func->name ? func->name : "");
		ret = 0;
	} else if (ret < 0 && ret != -ENOTSUPP) {
		ERROR(func->config->cdev,
			"Failed to wake function %s from suspend state. ret=%d. Canceling USB request.\n",
@@ -516,7 +522,12 @@ int usb_func_ep_queue(struct usb_function *func, struct usb_ep *ep,
	gadget = func->config->cdev->gadget;
	if (func->func_is_suspended && func->func_wakeup_allowed) {
		ret = usb_gadget_func_wakeup(gadget, func->intf_id);
		if (ret == -EAGAIN) {
		if (ret == -EACCES) {
			pr_debug("bus suspended func wakeup for %s delayed until bus resume.\n",
				func->name ? func->name : "");
			func->func_wakeup_pending = 1;
			ret = -EAGAIN;
		} else if (ret == -EAGAIN) {
			pr_debug("bus suspended func wakeup for %s delayed until bus resume.\n",
				func->name ? func->name : "");
		} else if (ret < 0 && ret != -ENOTSUPP) {
@@ -2429,13 +2440,13 @@ void composite_resume(struct usb_gadget *gadget)
	spin_lock_irqsave(&cdev->lock, flags);
	if (cdev->config) {
		list_for_each_entry(f, &cdev->config->functions, list) {
			if (f->func_wakeup_pending) {
				ret = usb_func_wakeup_int(f);
				if (ret) {
					if (ret == -EAGAIN) {
						ERROR(f->config->cdev,
							"Function wakeup for %s could not complete due to suspend state.\n",
							f->name ? f->name : "");
					break;
					} else if (ret != -ENOTSUPP) {
						ERROR(f->config->cdev,
							"Failed to wake function %s from suspend state. ret=%d. Canceling USB request.\n",
@@ -2443,8 +2454,10 @@ void composite_resume(struct usb_gadget *gadget)
							ret);
					}
				}
				f->func_wakeup_pending = 0;
			}

			if (f->resume)
			if (gadget->speed != USB_SPEED_SUPER && f->resume)
				f->resume(f);
		}