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

Commit 97057b5e authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

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

parents 83c0d5cc 82b4a626
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1883,7 +1883,7 @@ static int dwc_gadget_func_wakeup(struct usb_gadget *g, int interface_id)
	if (dwc3_gadget_is_suspended(dwc)) {
		pr_debug("USB bus is suspended. Scheduling wakeup and returning -EAGAIN.\n");
		dwc3_gadget_wakeup(&dwc->gadget);
		return -EAGAIN;
		return -EACCES;
	}

	/*
+28 −15
Original line number Diff line number Diff line
@@ -413,11 +413,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",
@@ -448,7 +454,12 @@ int usb_func_ep_queue(struct usb_function *func, struct usb_ep *ep,

	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) {
@@ -2332,13 +2343,13 @@ 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",
@@ -2346,8 +2357,10 @@ 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);
		}