Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2018 Ondrej Hlavaty
@@ -212,4 +213,43 @@
 }
 
+/** Quiesce host controller
+ *
+ * @param hcd Host controller device
+ */
+int hc_quiesce(hc_device_t *hcd)
+{
+	hc_t *instance = hcd_to_hc(hcd);
+
+	/*
+	 * Turn off the HC if it's running, Reseting a running device is
+	 * undefined
+	 */
+	if (!(EHCI_RD(instance->registers->usbsts) & USB_STS_HC_HALTED_FLAG)) {
+		/* disable all interrupts */
+		EHCI_WR(instance->registers->usbintr, 0);
+		/* ack all interrupts */
+		EHCI_WR(instance->registers->usbsts, 0x3f);
+		/* Stop HC hw */
+		EHCI_WR(instance->registers->usbcmd, 0);
+		/* Wait until hc is halted */
+		while ((EHCI_RD(instance->registers->usbsts) & USB_STS_HC_HALTED_FLAG) == 0) {
+			fibril_usleep(1);
+		}
+		usb_log_info("HC(%p): EHCI turned off.", instance);
+	} else {
+		usb_log_info("HC(%p): EHCI was not running.", instance);
+	}
+
+	/* Hw initialization sequence, see page 53 (pdf 63) */
+	EHCI_SET(instance->registers->usbcmd, USB_CMD_HC_RESET_FLAG);
+	usb_log_info("HC(%p): Waiting for HW reset.", instance);
+	while (EHCI_RD(instance->registers->usbcmd) & USB_CMD_HC_RESET_FLAG) {
+		fibril_usleep(1);
+	}
+	usb_log_debug("HC(%p): HW reset OK.", instance);
+
+	return EOK;
+}
+
 void hc_enqueue_endpoint(hc_t *instance, const endpoint_t *ep)
 {
Index: uspace/drv/bus/usb/ehci/hc.h
===================================================================
--- uspace/drv/bus/usb/ehci/hc.h	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
+++ uspace/drv/bus/usb/ehci/hc.h	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2018 Ondrej Hlavaty
@@ -107,4 +108,5 @@
     const hw_res_list_parsed_t *, int *);
 extern errno_t hc_gone(hc_device_t *);
+extern errno_t hc_quiesce(hc_device_t *);
 
 /** Runtime operations */
Index: uspace/drv/bus/usb/ehci/main.c
===================================================================
--- uspace/drv/bus/usb/ehci/main.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
+++ uspace/drv/bus/usb/ehci/main.c	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2011 Vojtech Horky
@@ -54,4 +55,5 @@
 	.setup_root_hub = hc_setup_roothub,
 	.hc_gone = hc_gone,
+	.hc_quiesce = hc_quiesce
 };
 
Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2018 Ondrej Hlavaty
@@ -196,4 +197,28 @@
 }
 
+/** Quiesce host controller
+ *
+ * @param hcd Host controller device
+ */
+int hc_quiesce(hc_device_t *hcd)
+{
+	hc_t *instance = hcd_to_hc(hcd);
+
+	/* OHCI guide page 42 */
+	usb_log_debug2("Started hc initialization routine.");
+
+	/* Reset hc */
+	usb_log_debug2("HC reset.");
+	size_t time = 0;
+	OHCI_WR(instance->registers->command_status, CS_HCR);
+	while (OHCI_RD(instance->registers->command_status) & CS_HCR) {
+		fibril_usleep(10);
+		time += 10;
+	}
+	usb_log_debug2("HC reset complete in %zu us.", time);
+
+	return EOK;
+}
+
 void hc_enqueue_endpoint(hc_t *instance, const endpoint_t *ep)
 {
Index: uspace/drv/bus/usb/ohci/hc.h
===================================================================
--- uspace/drv/bus/usb/ohci/hc.h	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
+++ uspace/drv/bus/usb/ohci/hc.h	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2018 Ondrej Hlavaty
@@ -97,4 +98,5 @@
 extern errno_t hc_setup_roothub(hc_device_t *);
 extern errno_t hc_gone(hc_device_t *);
+extern errno_t hc_quiesce(hc_device_t *);
 
 extern void hc_enqueue_endpoint(hc_t *, const endpoint_t *);
Index: uspace/drv/bus/usb/ohci/main.c
===================================================================
--- uspace/drv/bus/usb/ohci/main.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
+++ uspace/drv/bus/usb/ohci/main.c	(revision 9dfb034217589be7992cb9cfcfb4fd044520541d)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2011 Vojtech Horky
@@ -60,4 +61,5 @@
 	.setup_root_hub = hc_setup_roothub,
 	.hc_gone = hc_gone,
+	.hc_quiesce = hc_quiesce
 };
 
