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

Commit eb6e2924 authored by Petr Mladek's avatar Petr Mladek Committed by Greg Kroah-Hartman
Browse files

usb: hub: rename hub_events() to hub_event() and handle only one event there



We would like to convert khubd kthread to a workqueue. As a result hub_events()
will handle only one event per call.

In fact, we could do this already now because there is another cycle in
hub_thread(). It calls hub_events() until hub_event_list is empty.

This patch renames the function to hub_event(), removes the while cycle, and
renames the goto targets from loop* to out*.

When touching the code, it fixes also formatting of dev_err() and dev_dbg()
calls to make checkpatch.pl happy :-)

Signed-off-by: default avatarPetr Mladek <pmladek@suse.cz>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5d14f323
Loading
Loading
Loading
Loading
+111 −125
Original line number Diff line number Diff line
@@ -4996,8 +4996,7 @@ static void port_event(struct usb_hub *hub, int port1)
		hub_port_connect_change(hub, port1, portstatus, portchange);
}


static void hub_events(void)
static void hub_event(void)
{
	struct list_head *tmp;
	struct usb_device *hdev;
@@ -5008,19 +5007,11 @@ static void hub_events(void)
	u16 hubchange;
	int i, ret;

	/*
	 *  We restart the list every time to avoid a deadlock with
	 * deleting hubs downstream from this one. This should be
	 * safe since we delete the hub from the event list.
	 * Not the most efficient, but avoids deadlocks.
	 */
	while (1) {

	/* Grab the first entry at the beginning of the list */
	spin_lock_irq(&hub_event_lock);
	if (list_empty(&hub_event_list)) {
		spin_unlock_irq(&hub_event_lock);
			break;
		return;
	}

	tmp = hub_event_list.next;
@@ -5043,35 +5034,33 @@ static void hub_events(void)
	 * disconnected while waiting for the lock to succeed. */
	usb_lock_device(hdev);
	if (unlikely(hub->disconnected))
			goto loop_disconnected;
		goto out_disconnected;

	/* If the hub has died, clean up after it */
	if (hdev->state == USB_STATE_NOTATTACHED) {
		hub->error = -ENODEV;
		hub_quiesce(hub, HUB_DISCONNECT);
			goto loop;
		goto out;
	}

	/* Autoresume */
	ret = usb_autopm_get_interface(intf);
	if (ret) {
		dev_dbg(hub_dev, "Can't autoresume: %d\n", ret);
			goto loop;
		goto out;
	}

	/* If this is an inactive hub, do nothing */
	if (hub->quiescing)
			goto loop_autopm;
		goto out_autopm;

	if (hub->error) {
			dev_dbg (hub_dev, "resetting for error %d\n",
				hub->error);
		dev_dbg(hub_dev, "resetting for error %d\n", hub->error);

		ret = usb_reset_device(hdev);
		if (ret) {
				dev_dbg (hub_dev,
					"error resetting hub: %d\n", ret);
				goto loop_autopm;
			dev_dbg(hub_dev, "error resetting hub: %d\n", ret);
			goto out_autopm;
		}

		hub->nerrors = 0;
@@ -5128,24 +5117,21 @@ static void hub_events(void)
			hub_power_on(hub, true);
			hub_hub_status(hub, &status, &unused);
			if (status & HUB_STATUS_OVERCURRENT)
					dev_err(hub_dev, "over-current "
						"condition\n");
				dev_err(hub_dev, "over-current condition\n");
		}
	}

 loop_autopm:
out_autopm:
	/* Balance the usb_autopm_get_interface() above */
	usb_autopm_put_interface_no_suspend(intf);
 loop:
out:
	/* Balance the usb_autopm_get_interface_no_resume() in
	 * kick_khubd() and allow autosuspend.
	 */
	usb_autopm_put_interface(intf);
 loop_disconnected:
out_disconnected:
	usb_unlock_device(hdev);
	kref_put(&hub->kref, hub_release);

	} /* end while (1) */
}

static int hub_thread(void *__unused)
@@ -5158,7 +5144,7 @@ static int hub_thread(void *__unused)
	set_freezable();

	do {
		hub_events();
		hub_event();
		wait_event_freezable(khubd_wait,
				!list_empty(&hub_event_list) ||
				kthread_should_stop());