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

Commit 714b07be authored by Sarah Sharp's avatar Sarah Sharp
Browse files

USB: Refactor hub remote wake handling.



Refactor the code to check for a remote wakeup on a port into its own
function.  Keep the behavior the same, and set connect_change in
hub_events if the device disconnected on resume.  Cleanup references to
hdev->children[i-1] to use a common variable.

Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
parent 4296c70a
Loading
Loading
Loading
Loading
+35 −24
Original line number Original line Diff line number Diff line
@@ -3488,6 +3488,39 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
		hcd->driver->relinquish_port(hcd, port1);
		hcd->driver->relinquish_port(hcd, port1);
}
}


/* Returns 1 if there was a remote wakeup and a connect status change. */
static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port,
		u16 portchange)
{
	struct usb_device *hdev;
	struct usb_device *udev;
	int connect_change = 0;
	int ret;

	hdev = hub->hdev;
	if (!(portchange & USB_PORT_STAT_C_SUSPEND))
		return 0;
	clear_port_feature(hdev, port, USB_PORT_FEAT_C_SUSPEND);

	udev = hdev->children[port-1];
	if (udev) {
		/* TRSMRCY = 10 msec */
		msleep(10);

		usb_lock_device(udev);
		ret = usb_remote_wakeup(udev);
		usb_unlock_device(udev);
		if (ret < 0)
			connect_change = 1;
	} else {
		ret = -ENODEV;
		hub_port_disable(hub, port, 1);
	}
	dev_dbg(hub->intfdev, "resume on port %d, status %d\n",
			port, ret);
	return connect_change;
}

static void hub_events(void)
static void hub_events(void)
{
{
	struct list_head *tmp;
	struct list_head *tmp;
@@ -3621,30 +3654,8 @@ static void hub_events(void)
				}
				}
			}
			}


			if (portchange & USB_PORT_STAT_C_SUSPEND) {
			if (hub_handle_remote_wakeup(hub, i, portchange))
				struct usb_device *udev;

				clear_port_feature(hdev, i,
					USB_PORT_FEAT_C_SUSPEND);
				udev = hdev->children[i-1];
				if (udev) {
					/* TRSMRCY = 10 msec */
					msleep(10);

					usb_lock_device(udev);
					ret = usb_remote_wakeup(hdev->
							children[i-1]);
					usb_unlock_device(udev);
					if (ret < 0)
				connect_change = 1;
				connect_change = 1;
				} else {
					ret = -ENODEV;
					hub_port_disable(hub, i, 1);
				}
				dev_dbg (hub_dev,
					"resume on port %d, status %d\n",
					i, ret);
			}


			if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
			if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
				u16 status = 0;
				u16 status = 0;