Index: uspace/lib/drv/generic/driver.c
===================================================================
--- uspace/lib/drv/generic/driver.c	(revision 832cbe7f6539badd99e8e5715f4a59e044c65c44)
+++ uspace/lib/drv/generic/driver.c	(revision 94ea2e3771e36d7eaa5eef3ba668b8f14e4c2291)
@@ -237,4 +237,46 @@
 }
 
+static void driver_dev_quiesce(ipc_call_t *icall)
+{
+	devman_handle_t devh = ipc_get_arg1(icall);
+	ddf_fun_t *fun;
+	link_t *link;
+
+	fibril_mutex_lock(&devices_mutex);
+	ddf_dev_t *dev = driver_get_device(devh);
+	if (dev != NULL)
+		dev_add_ref(dev);
+	fibril_mutex_unlock(&devices_mutex);
+
+	if (dev == NULL) {
+		async_answer_0(icall, ENOENT);
+		return;
+	}
+
+	errno_t rc;
+
+	if (driver->driver_ops->dev_quiesce != NULL) {
+		rc = driver->driver_ops->dev_quiesce(dev);
+	} else {
+		/*
+		 * If the driver does not implement quiesce, we will
+		 * simply request all subordinate functions to quiesce.
+		 */
+		fibril_mutex_lock(&functions_mutex);
+		link = list_first(&functions);
+		while (link != NULL) {
+			fun = list_get_instance(link, ddf_fun_t, link);
+			if (fun->dev == dev)
+				ddf_fun_quiesce(fun);
+			link = list_next(link, &functions);
+		}
+		fibril_mutex_unlock(&functions_mutex);
+		rc = EOK;
+	}
+
+	dev_del_ref(dev);
+	async_answer_0(icall, rc);
+}
+
 static void driver_fun_online(ipc_call_t *icall)
 {
@@ -357,4 +399,7 @@
 		case DRIVER_DEV_GONE:
 			driver_dev_gone(&call);
+			break;
+		case DRIVER_DEV_QUIESCE:
+			driver_dev_quiesce(&call);
 			break;
 		case DRIVER_FUN_ONLINE:
@@ -903,4 +948,22 @@
 }
 
+/** Quiesce function.
+ *
+ * @param fun Function to quiesce
+ *
+ * @return EOK on success or an error code
+ *
+ */
+errno_t ddf_fun_quiesce(ddf_fun_t *fun)
+{
+	assert(fun->bound == true);
+
+	errno_t res = devman_drv_fun_quiesce(fun->handle);
+	if (res != EOK)
+		return res;
+
+	return EOK;
+}
+
 /** Add single match ID to inner function.
  *
Index: uspace/lib/drv/include/ddf/driver.h
===================================================================
--- uspace/lib/drv/include/ddf/driver.h	(revision 832cbe7f6539badd99e8e5715f4a59e044c65c44)
+++ uspace/lib/drv/include/ddf/driver.h	(revision 94ea2e3771e36d7eaa5eef3ba668b8f14e4c2291)
@@ -86,5 +86,5 @@
 /** Generic device driver operations */
 typedef struct driver_ops {
-	/** Callback method for passing a new device to the device driver */
+	/** Ask driver to add a new device */
 	errno_t (*dev_add)(ddf_dev_t *);
 
@@ -94,4 +94,7 @@
 	/** Inform driver a device disappeared */
 	errno_t (*dev_gone)(ddf_dev_t *);
+
+	/** Ask driver to quiesce device (disable interrupts and DMA) */
+	errno_t (*dev_quiesce)(ddf_dev_t *);
 
 	/** Ask driver to online a specific function */
@@ -129,4 +132,5 @@
 extern errno_t ddf_fun_online(ddf_fun_t *);
 extern errno_t ddf_fun_offline(ddf_fun_t *);
+extern errno_t ddf_fun_quiesce(ddf_fun_t *);
 extern errno_t ddf_fun_add_match_id(ddf_fun_t *, const char *, int);
 extern void ddf_fun_set_ops(ddf_fun_t *, const ddf_dev_ops_t *);
