Changes in uspace/srv/devman/drv_conn.c [8300c72:4c6fd56] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/drv_conn.c
r8300c72 r4c6fd56 1 1 /* 2 * Copyright (c) 202 5Jiri Svoboda2 * Copyright (c) 2023 Jiri Svoboda 3 3 * Copyright (c) 2010 Lenka Trochtova 4 4 * All rights reserved. … … 453 453 fun_busy_unlock(fun); 454 454 fun_del_ref(fun); 455 async_answer_0(icall, EOK);456 }457 458 /** Quiesce function by driver request.459 *460 */461 static void devman_drv_fun_quiesce(ipc_call_t *icall, driver_t *drv)462 {463 fun_node_t *fun;464 errno_t rc;465 466 fun = find_fun_node(&device_tree, ipc_get_arg1(icall));467 if (fun == NULL) {468 async_answer_0(icall, ENOENT);469 return;470 }471 472 fun_busy_lock(fun);473 474 fibril_rwlock_write_lock(&device_tree.rwlock);475 if (fun->dev == NULL || fun->dev->drv != drv) {476 fun_busy_unlock(fun);477 fun_del_ref(fun);478 async_answer_0(icall, ENOENT);479 return;480 }481 fibril_rwlock_write_unlock(&device_tree.rwlock);482 483 rc = fun_quiesce(fun);484 if (rc != EOK) {485 fun_busy_unlock(fun);486 fun_del_ref(fun);487 async_answer_0(icall, rc);488 return;489 }490 491 fun_busy_unlock(fun);492 fun_del_ref(fun);493 async_answer_0(icall, EOK);494 }495 496 /** Wait for function to become stable.497 *498 */499 static void devman_drv_fun_wait_stable(ipc_call_t *icall, driver_t *drv)500 {501 fun_node_t *fun;502 dev_node_t *dev;503 504 fibril_rwlock_read_lock(&device_tree.rwlock);505 506 fun = find_fun_node(&device_tree, ipc_get_arg1(icall));507 if (fun == NULL) {508 fibril_rwlock_read_unlock(&device_tree.rwlock);509 async_answer_0(icall, ENOENT);510 return;511 }512 513 if (fun->child == NULL) {514 fibril_rwlock_read_unlock(&device_tree.rwlock);515 fun_del_ref(fun);516 async_answer_0(icall, EOK);517 return;518 }519 520 dev = fun->child;521 dev_add_ref(dev);522 523 fibril_rwlock_read_unlock(&device_tree.rwlock);524 525 dev_wait_stable(dev);526 dev_del_ref(dev);527 528 455 async_answer_0(icall, EOK); 529 456 } … … 715 642 devman_drv_fun_offline(&call, driver); 716 643 break; 717 case DEVMAN_DRV_FUN_QUIESCE:718 devman_drv_fun_quiesce(&call, driver);719 break;720 case DEVMAN_DRV_FUN_WAIT_STABLE:721 devman_drv_fun_wait_stable(&call, driver);722 break;723 644 case DEVMAN_REMOVE_FUNCTION: 724 645 devman_remove_function(&call);
Note:
See TracChangeset
for help on using the changeset viewer.