Changeset 1db5669 in mainline for uspace/srv/devman
- Timestamp:
- 2013-09-11T12:35:55Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 48bd6f4, 4c9b28a
- Parents:
- cd3b380
- Location:
- uspace/srv/devman
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/client_conn.c
rcd3b380 r1db5669 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2013 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 269 270 } 270 271 272 /** Get handle for parent function of a device. */ 273 static void devman_dev_get_parent(ipc_callid_t iid, ipc_call_t *icall) 274 { 275 dev_node_t *dev; 276 277 fibril_rwlock_read_lock(&device_tree.rwlock); 278 279 dev = find_dev_node_no_lock(&device_tree, IPC_GET_ARG1(*icall)); 280 if (dev == NULL || dev->state == DEVICE_REMOVED) { 281 fibril_rwlock_read_unlock(&device_tree.rwlock); 282 async_answer_0(iid, ENOENT); 283 return; 284 } 285 286 if (dev->pfun == NULL) { 287 fibril_rwlock_read_unlock(&device_tree.rwlock); 288 async_answer_0(iid, ENOENT); 289 return; 290 } 291 292 async_answer_1(iid, EOK, dev->pfun->handle); 293 294 fibril_rwlock_read_unlock(&device_tree.rwlock); 295 } 296 271 297 static void devman_dev_get_functions(ipc_callid_t iid, ipc_call_t *icall) 272 298 { … … 425 451 426 452 if (!async_data_read_receive(&callid, &size)) { 427 async_answer_0(callid, EREFUSED);428 453 async_answer_0(iid, EREFUSED); 429 454 return; … … 449 474 async_answer_1(iid, retval, act_size); 450 475 } 476 477 static void devman_driver_get_devices(ipc_callid_t iid, ipc_call_t *icall) 478 { 479 ipc_callid_t callid; 480 size_t size; 481 size_t act_size; 482 int rc; 483 484 if (!async_data_read_receive(&callid, &size)) { 485 async_answer_0(iid, EREFUSED); 486 return; 487 } 488 489 driver_t *drv = driver_find(&drivers_list, IPC_GET_ARG1(*icall)); 490 if (drv == NULL) { 491 async_answer_0(callid, ENOENT); 492 async_answer_0(iid, ENOENT); 493 return; 494 } 495 496 devman_handle_t *hdl_buf = (devman_handle_t *) malloc(size); 497 if (hdl_buf == NULL) { 498 async_answer_0(callid, ENOMEM); 499 async_answer_0(iid, ENOMEM); 500 return; 501 } 502 503 rc = driver_get_devices(drv, hdl_buf, size, &act_size); 504 if (rc != EOK) { 505 fibril_rwlock_read_unlock(&device_tree.rwlock); 506 async_answer_0(callid, rc); 507 async_answer_0(iid, rc); 508 return; 509 } 510 511 sysarg_t retval = async_data_read_finalize(callid, hdl_buf, size); 512 free(hdl_buf); 513 514 async_answer_1(iid, retval, act_size); 515 } 516 451 517 452 518 /** Find driver by name. */ … … 563 629 devman_function_get_handle(callid, &call); 564 630 break; 631 case DEVMAN_DEV_GET_PARENT: 632 devman_dev_get_parent(callid, &call); 633 break; 565 634 case DEVMAN_DEV_GET_FUNCTIONS: 566 635 devman_dev_get_functions(callid, &call); … … 589 658 case DEVMAN_GET_DRIVERS: 590 659 devman_get_drivers(callid, &call); 660 break; 661 case DEVMAN_DRIVER_GET_DEVICES: 662 devman_driver_get_devices(callid, &call); 591 663 break; 592 664 case DEVMAN_DRIVER_GET_HANDLE: -
uspace/srv/devman/driver.c
rcd3b380 r1db5669 729 729 } 730 730 731 /** Get list of device functions. */ 732 int driver_get_devices(driver_t *driver, devman_handle_t *hdl_buf, 733 size_t buf_size, size_t *act_size) 734 { 735 size_t act_cnt; 736 size_t buf_cnt; 737 738 fibril_mutex_lock(&driver->driver_mutex); 739 740 buf_cnt = buf_size / sizeof(devman_handle_t); 741 742 act_cnt = list_count(&driver->devices); 743 *act_size = act_cnt * sizeof(devman_handle_t); 744 745 if (buf_size % sizeof(devman_handle_t) != 0) { 746 fibril_mutex_unlock(&driver->driver_mutex); 747 return EINVAL; 748 } 749 750 size_t pos = 0; 751 list_foreach(driver->devices, driver_devices, dev_node_t, dev) { 752 if (pos < buf_cnt) { 753 hdl_buf[pos] = dev->handle; 754 } 755 756 pos++; 757 } 758 759 fibril_mutex_unlock(&driver->driver_mutex); 760 return EOK; 761 } 762 731 763 /** @} 732 764 */ -
uspace/srv/devman/driver.h
rcd3b380 r1db5669 64 64 extern void delete_driver(driver_t *); 65 65 extern int driver_get_list(driver_list_t *, devman_handle_t *, size_t, size_t *); 66 extern int driver_get_devices(driver_t *, devman_handle_t *, size_t, size_t *); 66 67 67 68 #endif
Note:
See TracChangeset
for help on using the changeset viewer.