Commit c05ebd0e authored by Kuen-Han Tsai's avatar Kuen-Han Tsai Committed by Greg Kroah-Hartman
Browse files

usb: core: Centralize device state update logic



Introduce a new static function, update_usb_device_state(), to
centralize the process of changing a device's state, including the
management of active_duration during suspend/resume transitions.

This change prepares for adding tracepoints, allowing tracing logic to
be added in a single, central location within the new helper function.

Signed-off-by: default avatarKuen-Han Tsai <khtsai@google.com>
Reviewed-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Link: https://patch.msgid.link/20251015-usbcore-tracing-v2-1-5a14b5b9d4e0@google.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 877c80df
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -2142,6 +2142,20 @@ static void update_port_device_state(struct usb_device *udev)
	}
}

static void update_usb_device_state(struct usb_device *udev,
				    enum usb_device_state new_state)
{
	if (udev->state == USB_STATE_SUSPENDED &&
	    new_state != USB_STATE_SUSPENDED)
		udev->active_duration -= jiffies;
	else if (new_state == USB_STATE_SUSPENDED &&
		 udev->state != USB_STATE_SUSPENDED)
		udev->active_duration += jiffies;

	udev->state = new_state;
	update_port_device_state(udev);
}

static void recursively_mark_NOTATTACHED(struct usb_device *udev)
{
	struct usb_hub *hub = usb_hub_to_struct_hub(udev);
@@ -2151,10 +2165,7 @@ static void recursively_mark_NOTATTACHED(struct usb_device *udev)
		if (hub->ports[i]->child)
			recursively_mark_NOTATTACHED(hub->ports[i]->child);
	}
	if (udev->state == USB_STATE_SUSPENDED)
		udev->active_duration -= jiffies;
	udev->state = USB_STATE_NOTATTACHED;
	update_port_device_state(udev);
	update_usb_device_state(udev, USB_STATE_NOTATTACHED);
}

/**
@@ -2204,14 +2215,7 @@ void usb_set_device_state(struct usb_device *udev,
			else
				wakeup = 0;
		}
		if (udev->state == USB_STATE_SUSPENDED &&
			new_state != USB_STATE_SUSPENDED)
			udev->active_duration -= jiffies;
		else if (new_state == USB_STATE_SUSPENDED &&
				udev->state != USB_STATE_SUSPENDED)
			udev->active_duration += jiffies;
		udev->state = new_state;
		update_port_device_state(udev);
		update_usb_device_state(udev, new_state);
	} else
		recursively_mark_NOTATTACHED(udev);
	spin_unlock_irqrestore(&device_state_lock, flags);